{"version":3,"file":"spotlight-components.931fac2a746361fc586c.bundle.js","mappings":"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","sources":["webpack://spotlight.web/./Scripts/Spotlight/Components/AddDataSource/DataSourceTile.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/AddDataSource/AddDataSourceSelector.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/AddDataSource/AddDataSource.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/AddDataSource/ConfirmConnectToDataSourceModal.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/ConnectionSteps.ts","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/Constants.ts","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/DataSourceActions.ts","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/DataSourceAppActions.ts","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/DataSourceAppReducer.ts","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/DataSourceContainer.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/DataSourceContainerCollection.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/DataSourceFunctions.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/ConfirmDisconnectFromDataSourceModal.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/ExcelUpload.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/ExcelErrors.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/ImportProgressBar.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/Status.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/ImportControl.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/Excel.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/AuthCompanyFile.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/ChooseCompanyFile.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/CompanyFileViews.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/ConnectViews.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/NetworkError.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/NetworkErrorGoogleSheets.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/Settings.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/StandardCloud.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/StandardDesktop.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/DataSourcePanel.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/DataSourceUiReducer.ts","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/DeleteDataSourceModal.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/DesktopFunctions.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/MyobFunctions.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/DataSourcePanel/SignalRProvider.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Notifications/NotificationMessages.ts","webpack://spotlight.web/./Scripts/Spotlight/Components/Analytics.ts","webpack://spotlight.web/./Scripts/Spotlight/Components/Notifications/NotificationReportComplete.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Notifications/NotificationReportDelayed.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Notifications/NotificationReportFailed.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Notifications/NotificationsMenu.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Notifications/NotificationHeader.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Notifications/NotificationHeaderAction.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Header/Help/HelpButton.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Header/MyAccount/MyAccountMenu.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Header/RecentOrg/RecentOrgButton.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Header/WhatsNew/WhatsNewButton.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Header/HeaderMenu.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Header/Help/HelpMenu.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Header/RecentOrg/RecentOrgMenu.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Header/WhatsNew/WhatsNewMenu.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Header/Header.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Header/Navigation/CustomiseDataDropdown.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Header/Navigation/ForecastingNavigation.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Header/Navigation/ProductNavigation.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Helpers.ts","webpack://spotlight.web/./Scripts/Spotlight/Components/SpotlightLightbox.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/LatestReleaseNotes.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/SRMultiSelect.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/MeasuresTaskFilter.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/ModalButtonBar.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/Notifications/Notification.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/OverlayPane.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/PracticeSettings/Constants.ts","webpack://spotlight.web/./Scripts/Spotlight/Components/Spotlight.ts","webpack://spotlight.web/./Scripts/Spotlight/Components/SpotlightModal.tsx","webpack://spotlight.web/./Scripts/Spotlight/Components/render-with-store.tsx"],"sourcesContent":["import * as React from 'react';\r\n\r\nimport classNames from 'classnames';\r\n\r\nimport { DataSourceCodes, DataSourceTypes } from './Constants';\r\n\r\nexport interface DataSource {\r\n size: 'small' | 'wide' | 'big';\r\n code: DataSourceCodes;\r\n description?: string;\r\n recentlyUsed?: boolean;\r\n logo?: React.ReactNode;\r\n}\r\nexport interface DataSourceTileProps extends DataSource {\r\n size: 'small' | 'wide' | 'big';\r\n type: DataSourceTypes;\r\n typeDescription: string;\r\n onClick: () => any;\r\n disableButtons: boolean;\r\n}\r\n\r\nexport const DataSourceTile: React.FC> = ({\r\n type,\r\n typeDescription,\r\n onClick,\r\n disableButtons,\r\n size = 'big',\r\n code,\r\n description,\r\n logo,\r\n}) => {\r\n function clicked() {\r\n if (disableButtons) {\r\n return;\r\n }\r\n onClick();\r\n }\r\n\r\n return (\r\n \r\n {logo || (\r\n
\r\n )}\r\n\r\n {!!description && {description}}\r\n {size === 'big' && (\r\n \r\n {typeDescription}\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { Button, THEME } from '@ui';\r\nimport classNames from 'classnames';\r\n\r\nimport { AppRoutes } from '../../Helpers';\r\nimport { ReportModes } from '../../Models/Constants';\r\nimport { DataSourceCodes, DataSourceTypes } from './Constants';\r\nimport { DataSource, DataSourceTile } from './DataSourceTile';\r\n\r\nexport interface DataSourceCategory {\r\n code: DataSourceTypes;\r\n description: string;\r\n dataSources: DataSource[];\r\n}\r\n\r\nexport interface DataSourceSelectorProps {\r\n organisationId: string;\r\n dataSourceCategories: DataSourceCategory[];\r\n existingDataSources: string[];\r\n hideExistingDataSources: boolean;\r\n heading: string;\r\n onSelect: any;\r\n disableButtons: boolean;\r\n reportMode: ReportModes;\r\n}\r\n\r\ntype DataSourceList = {\r\n size: 'small' | 'wide' | 'big';\r\n type: DataSourceTypes;\r\n typeDescription: string;\r\n code: DataSourceCodes;\r\n description: string;\r\n recentlyUsed?: boolean;\r\n}[];\r\n\r\nconst getVisibleDataSources = ({\r\n dataSourceCategories,\r\n existingDataSources,\r\n hideExistingDataSources,\r\n}: {\r\n dataSourceCategories: DataSourceCategory[];\r\n existingDataSources: string[];\r\n hideExistingDataSources: boolean;\r\n}): DataSourceList => {\r\n const resultsMap = dataSourceCategories.map((dsc) => {\r\n return dsc.dataSources\r\n .filter((ds) => {\r\n if (!hideExistingDataSources) {\r\n return true;\r\n }\r\n return existingDataSources.indexOf(ds.code) === -1;\r\n })\r\n .map((ds) => {\r\n return {\r\n type: dsc.code,\r\n typeDescription: dsc.description,\r\n code: ds.code,\r\n description: ds.description,\r\n recentlyUsed: ds.recentlyUsed,\r\n size: ds.size,\r\n logo: ds.logo,\r\n };\r\n });\r\n });\r\n\r\n // Flatten the results into one array instead of an array of arrays;\r\n const allDataSources: DataSourceList = resultsMap.flat();\r\n\r\n return allDataSources;\r\n};\r\n\r\nexport const DataSourceSelector: React.FC> = ({\r\n organisationId,\r\n heading,\r\n dataSourceCategories,\r\n existingDataSources,\r\n hideExistingDataSources = true,\r\n onSelect,\r\n disableButtons,\r\n reportMode,\r\n}) => {\r\n const dataSources = getVisibleDataSources({ dataSourceCategories, existingDataSources, hideExistingDataSources }); // TODO: memoize\r\n\r\n const clickDataSourceHandler = (code: DataSourceCodes): void => {\r\n onSelect(code);\r\n };\r\n\r\n const navigateToTaskManager = () => {\r\n window.location.assign(AppRoutes.TaskManager({ organisationId }));\r\n };\r\n\r\n const empty = \"You can't add any more data sources.\";\r\n\r\n const cloudDataSources = dataSources.filter((ds) => ds.type === DataSourceTypes.Cloud);\r\n const desktopDataSources = dataSources.filter((ds) => ds.type === DataSourceTypes.Desktop);\r\n const manualDataSources = dataSources.filter((ds) => ds.type === DataSourceTypes.Manual);\r\n\r\n const isForecasting = reportMode === ReportModes.Forecast;\r\n\r\n return (\r\n \r\n
\r\n {heading && (\r\n \r\n {heading}\r\n \r\n )}\r\n {!isForecasting && existingDataSources.length > 0 && (\r\n Spotlight.Events.emit('Import.AddNewDatasource.Cancel')}\r\n >\r\n Cancel\r\n \r\n )}\r\n
\r\n {!!cloudDataSources.length && (\r\n
\r\n

Cloud Sources

\r\n
\r\n {cloudDataSources.map((ds) => (\r\n clickDataSourceHandler(ds.code)}\r\n disableButtons={disableButtons}\r\n />\r\n ))}\r\n
\r\n
\r\n )}\r\n {!!desktopDataSources.length && (\r\n
\r\n

Desktop Sources

\r\n
\r\n {desktopDataSources.map((ds) => (\r\n clickDataSourceHandler(ds.code)}\r\n disableButtons={disableButtons}\r\n />\r\n ))}\r\n
\r\n
\r\n )}\r\n {!!manualDataSources.length && (\r\n
\r\n

Manually Enter Your Data

\r\n
\r\n {manualDataSources.map((ds) => (\r\n clickDataSourceHandler(ds.code)}\r\n disableButtons={disableButtons}\r\n />\r\n ))}\r\n
\r\n
\r\n )}\r\n
\r\n {dataSources.length === 0 &&
{empty}
}\r\n {isForecasting && (\r\n
\r\n \r\n Or\r\n \r\n \r\n Manually Enter Your Data\r\n \r\n
\r\n )}\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useEffect, useState } from 'react';\r\n\r\nimport { LoadingSpinner } from '@ui';\r\nimport { ThemeProvider } from 'styled-components';\r\n\r\nimport { QuickBooks } from '../../../../ModernScripts/Spotlight/Common/Images/Logos/DataSource/quickbooks';\r\nimport { ProviderKey } from '../../../Codes';\r\nimport { dataSourceConnector } from '../../ConnectDataSource';\r\nimport { AppRoutes, getProductByReportMode } from '../../Helpers';\r\nimport { getThemeByProduct } from '../../Helpers/SpotlightUI';\r\nimport { ReportModes } from '../../Models/Constants';\r\nimport RestService from '../../Services/RestService';\r\nimport { DataSourceCategory, DataSourceSelector } from './AddDataSourceSelector';\r\nimport { ConfirmConnectToDataSourceModal } from './ConfirmConnectToDataSourceModal';\r\nimport { DataSourceCodes, DataSourceTypes } from './Constants';\r\nimport { DataSource } from './DataSourceTile';\r\n\r\ninterface AddDataSource {\r\n reportId: string;\r\n organisationId: string;\r\n reportMode: ReportModes;\r\n}\r\n\r\nexport const AddDataSource: React.FC> = ({\r\n reportId,\r\n organisationId,\r\n reportMode,\r\n}) => {\r\n const [disableDataSourceButtons, setDisableDataSourceButtons] = useState(false);\r\n const [selectedDataSource, setSelectedDataSource] = useState();\r\n const [existingDataSources, setExistingDataSources] = useState([]);\r\n const [isLoading, setLoading] = useState(true);\r\n\r\n const [signInType, setSignInType] = useState('');\r\n\r\n const isForecasting = reportMode === ReportModes.Forecast;\r\n const isReporting = reportMode === ReportModes.Spotlight;\r\n\r\n let cloudDataSources: DataSource[] = [\r\n {\r\n code: DataSourceCodes.Xero,\r\n description: 'Xero',\r\n recentlyUsed: false,\r\n size: 'small',\r\n },\r\n {\r\n code: DataSourceCodes.QuickBooks,\r\n recentlyUsed: false,\r\n size: 'small',\r\n logo: ,\r\n },\r\n {\r\n code: DataSourceCodes.MYOBAccountRight,\r\n description: 'AccountRight Plus',\r\n recentlyUsed: false,\r\n size: 'wide',\r\n },\r\n {\r\n code: DataSourceCodes.GoogleAnalytics4,\r\n description: 'Google Analytics',\r\n recentlyUsed: false,\r\n size: 'small',\r\n },\r\n {\r\n code: DataSourceCodes.XeroPracticeManager,\r\n description: 'Xero Practice Manager',\r\n recentlyUsed: false,\r\n size: 'small',\r\n },\r\n ];\r\n\r\n let desktopDataSources: DataSource[] = [\r\n {\r\n code: DataSourceCodes.QuickBooksDesktop,\r\n recentlyUsed: false,\r\n size: 'small',\r\n logo: ,\r\n },\r\n {\r\n code: DataSourceCodes.MYOBAccountRightDesktop,\r\n description: 'AccountRight Plus',\r\n recentlyUsed: false,\r\n size: 'wide',\r\n },\r\n {\r\n code: DataSourceCodes.Sage50Desktop,\r\n description: 'Sage 50',\r\n size: 'small',\r\n },\r\n {\r\n code: DataSourceCodes.Excel,\r\n description: 'Excel',\r\n size: 'small',\r\n },\r\n {\r\n code: DataSourceCodes.ExcelPersonalWealth,\r\n description: 'Excel - Personal Wealth',\r\n recentlyUsed: false,\r\n size: 'small',\r\n },\r\n ];\r\n\r\n if (isForecasting) {\r\n cloudDataSources = cloudDataSources.filter(\r\n (dataSource: DataSource) =>\r\n ![DataSourceCodes.GoogleAnalytics4, DataSourceCodes.XeroPracticeManager].includes(dataSource.code),\r\n );\r\n\r\n cloudDataSources.push({\r\n code: DataSourceCodes.GoogleSheets,\r\n description: 'Google Sheets',\r\n recentlyUsed: false,\r\n size: 'small',\r\n });\r\n }\r\n\r\n if (!isReporting) {\r\n desktopDataSources = desktopDataSources.filter(\r\n (dataSource: DataSource) => dataSource.code !== DataSourceCodes.ExcelPersonalWealth,\r\n );\r\n }\r\n\r\n const dataSourceCategories: DataSourceCategory[] = [\r\n {\r\n code: DataSourceTypes.Cloud,\r\n description: 'Cloud',\r\n dataSources: cloudDataSources,\r\n },\r\n {\r\n code: DataSourceTypes.Desktop,\r\n description: 'Desktop',\r\n dataSources: desktopDataSources,\r\n },\r\n {\r\n code: DataSourceTypes.Manual,\r\n description: 'Manual',\r\n dataSources: isReporting\r\n ? [\r\n {\r\n code: DataSourceCodes.PersonalWealth,\r\n description: 'Personal Wealth',\r\n recentlyUsed: false,\r\n size: 'small',\r\n },\r\n ]\r\n : [],\r\n },\r\n ];\r\n\r\n const getSignInType = async () => {\r\n return (await RestService.GetLoginOIDCType()).data;\r\n };\r\n\r\n const selectedDataSourceHandler = async (code: DataSourceCodes) => {\r\n setDisableDataSourceButtons(true);\r\n setSelectedDataSource(code);\r\n\r\n const dataSourceIsDesktop = [\r\n DataSourceCodes.QuickBooksDesktop,\r\n DataSourceCodes.MYOBAccountRightDesktop,\r\n DataSourceCodes.Sage50Desktop,\r\n DataSourceCodes.Excel,\r\n DataSourceCodes.ExcelPersonalWealth,\r\n ].includes(code);\r\n\r\n const dataSourceIsCloud = [\r\n DataSourceCodes.Xero,\r\n DataSourceCodes.QuickBooks,\r\n DataSourceCodes.MYOBAccountRight,\r\n DataSourceCodes.GoogleAnalytics4,\r\n DataSourceCodes.GoogleSheets,\r\n DataSourceCodes.XeroPracticeManager,\r\n ].includes(code);\r\n\r\n const dataSourceIsManual = [DataSourceCodes.PersonalWealth].includes(code);\r\n\r\n if (dataSourceIsCloud) {\r\n // exit early, cloud datasources display modals instead\r\n return;\r\n }\r\n\r\n if (dataSourceIsManual) {\r\n const addManualDataSourcePromise = dataSourceConnector.addManualDataSource({\r\n dataSourceCode: code,\r\n reportMode,\r\n });\r\n\r\n addManualDataSourcePromise\r\n .then(() => {\r\n window.location.reload();\r\n })\r\n .finally(() => {\r\n setDisableDataSourceButtons(false);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if (dataSourceIsDesktop) {\r\n const addDesktopDataSourcePromise = dataSourceConnector.addDesktopDataSource({\r\n dataSourceCode: code,\r\n reportMode,\r\n });\r\n addDesktopDataSourcePromise\r\n .then(() => {\r\n if (isForecasting) {\r\n // navigate to task manager\r\n window.location.assign(AppRoutes.TaskManager({ organisationId }));\r\n } else {\r\n window.location.reload();\r\n }\r\n })\r\n .finally(() => {\r\n setDisableDataSourceButtons(false);\r\n });\r\n return;\r\n }\r\n };\r\n\r\n const closeModalFn = () => {\r\n setSelectedDataSource(null);\r\n setDisableDataSourceButtons(false);\r\n };\r\n\r\n const fetchExistingDataSources = async () => {\r\n return await RestService.GetOrganisationDataSourceCollection(organisationId, reportMode)\r\n .then(({ data }) => {\r\n return data;\r\n })\r\n .catch((e) => {\r\n throw e;\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n setLoading(true);\r\n\r\n const fetchExistingDataSourcesPromise = fetchExistingDataSources();\r\n const getSignInTypePromise = getSignInType();\r\n\r\n Promise.all([fetchExistingDataSourcesPromise, getSignInTypePromise])\r\n .then((values) => {\r\n const [dataSources, signInType] = values;\r\n const hasExistingDataSources = dataSources.length > 0;\r\n\r\n // Only one external data source can be added to a SF organisation\r\n if (isForecasting && hasExistingDataSources) {\r\n window.location.assign(AppRoutes.TaskManager({ organisationId }));\r\n } else {\r\n setExistingDataSources(dataSources.map((dataSource) => dataSource.dataSourceTypeCode));\r\n setSignInType(signInType);\r\n }\r\n })\r\n .finally(() => setLoading(false));\r\n }, []);\r\n\r\n return (\r\n \r\n {isLoading ? (\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\nimport { Button, Modal, THEME } from '@ui';\r\n\r\nimport { DataSourceTypeCode, ProviderName } from '../../../Codes';\r\nimport { dataSourceConnector } from '../../ConnectDataSource';\r\nimport { ReportModes } from '../../Models/Constants';\r\nimport * as SRModal from '../SpotlightModal';\r\nimport { centerModalStyle } from '../SpotlightModal';\r\nimport { DataSourceCodes } from './Constants';\r\n\r\ntype ConfirmConnectToDataSourceModal = {\r\n dataSourceId?: string;\r\n dataSourceCode: DataSourceCodes | DataSourceTypeCode;\r\n reportMode: ReportModes;\r\n reportId: string;\r\n organisationId: string;\r\n closeFn: any;\r\n skipConfirmationModal: boolean;\r\n};\r\n\r\nconst ConnectModalDisplay = ({ title, modalContent, buttons, closeFn }) => {\r\n return (\r\n \r\n \r\n \r\n {modalContent}\r\n \r\n \r\n <>\r\n \r\n );\r\n};\r\n\r\nconst ButtonBar: React.FC> = (props) => {\r\n return (\r\n
\r\n
{props.children}
\r\n
\r\n );\r\n};\r\n\r\nconst GenericExplanationText = ({ providerName }) => {\r\n return (\r\n <>\r\n

You're about to be redirected to {providerName}.

\r\n

\r\n Log in, select the organisation you wish to import from, and you'll be redirected back here.\r\n

\r\n \r\n );\r\n};\r\n\r\nconst GoogleAnalyticsExplanationText = () => {\r\n return (\r\n <>\r\n

You're about to be redirected to Google Analytics.

\r\n

\r\n You'll be asked to give Spotlight access to your account if you haven't already.\r\n

\r\n

\r\n If you are already logged into a Google account, please ensure that it is the one from which you want to\r\n import Google Analytics data.\r\n

\r\n \r\n );\r\n};\r\n\r\nconst GenericConnectButton = ({ connectFn }: { connectFn: () => void }) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst GoogleSheetsExplanationText = () => {\r\n return (\r\n <>\r\n

\r\n You're about to be redirected to Google to authorise the creation of a template in your Google\r\n Sheets.\r\n

\r\n

\r\n Once authorised, a Spotlight template will be created for you to easily add your data and import it back\r\n into Spotlight.\r\n

\r\n \r\n );\r\n};\r\n\r\ninterface ConnectModalProps {\r\n title: string;\r\n connectButton: JSX.Element;\r\n explanationText: JSX.Element;\r\n closeFn: () => void;\r\n}\r\n\r\nconst ConnectModal: React.FC> = ({\r\n title,\r\n connectButton,\r\n explanationText,\r\n closeFn,\r\n}) => {\r\n const modalContent =
{explanationText}
;\r\n\r\n const buttons = (\r\n \r\n
\r\n {connectButton && connectButton}\r\n \r\n Cancel\r\n \r\n
\r\n
\r\n );\r\n\r\n return ;\r\n};\r\n\r\nexport const ConfirmConnectToDataSourceModal: React.FC> = ({\r\n dataSourceId,\r\n dataSourceCode,\r\n reportMode,\r\n reportId,\r\n organisationId,\r\n closeFn,\r\n skipConfirmationModal,\r\n}) => {\r\n if (!dataSourceCode) {\r\n return null;\r\n }\r\n\r\n const clickConnect = () => {\r\n dataSourceConnector.connectToCloudDataSource({\r\n dataSourceId,\r\n dataSourceCode,\r\n reportMode,\r\n reportId,\r\n organisationId,\r\n });\r\n };\r\n\r\n if (skipConfirmationModal) {\r\n clickConnect();\r\n return null;\r\n }\r\n\r\n switch (dataSourceCode) {\r\n case DataSourceCodes.Xero:\r\n return (\r\n }\r\n explanationText={}\r\n closeFn={closeFn}\r\n />\r\n );\r\n case DataSourceCodes.QuickBooks: {\r\n return (\r\n \r\n }\r\n explanationText={}\r\n closeFn={closeFn}\r\n />\r\n );\r\n }\r\n case DataSourceCodes.MYOBAccountRight:\r\n return (\r\n }\r\n explanationText={}\r\n closeFn={closeFn}\r\n />\r\n );\r\n case DataSourceCodes.GoogleAnalytics4:\r\n return (\r\n }\r\n explanationText={}\r\n closeFn={closeFn}\r\n />\r\n );\r\n case DataSourceCodes.GoogleSheets:\r\n return (\r\n }\r\n explanationText={}\r\n closeFn={closeFn}\r\n />\r\n );\r\n case DataSourceCodes.XeroPracticeManager:\r\n return (\r\n }\r\n explanationText={}\r\n closeFn={closeFn}\r\n />\r\n );\r\n default:\r\n break;\r\n }\r\n return null;\r\n};\r\n","import { GetAuthorisedXeroCompaniesResponse } from '../../Services/ApiResponseModels';\r\nimport RestService from '../../Services/RestService';\r\n\r\ninterface TrackingResponse {\r\n hasTrackingActuals?: boolean;\r\n hasTrackingBudget?: boolean;\r\n error?: string;\r\n}\r\n\r\nexport const getAuthorisedXeroCompanies = (dataSourceId: string): Promise => {\r\n return RestService.GetAuthorisedXeroCompanies(dataSourceId)\r\n .then((response) => {\r\n return response.data;\r\n })\r\n .catch(() => {\r\n return [];\r\n });\r\n};\r\n\r\nexport const setAuthoriseXeroCompany = ({\r\n externalId,\r\n dataSourceId,\r\n}: {\r\n externalId: string;\r\n dataSourceId: string;\r\n}): Promise => {\r\n return RestService.SetAuthoriseXeroCompany({ externalId, dataSourceId });\r\n};\r\n\r\nexport const retrieveTracking = (dataSourceId: string): Promise => {\r\n return RestService.GetDataSourceTrackingConfigured(dataSourceId)\r\n .then((response) => {\r\n if (response && response.data.error) {\r\n return { error: response.data.error };\r\n }\r\n\r\n const hasTrackingActuals = response && response.data.isTrackingActualsConfigured;\r\n const hasTrackingBudget = response && response.data.isTrackingBudgetsConfigured;\r\n return { hasTrackingActuals, hasTrackingBudget };\r\n })\r\n .catch((err) => {\r\n return { error: err };\r\n });\r\n};\r\n\r\nexport const beginDesktopPairing = async (\r\n spotlightHubsUrl: string,\r\n context: string,\r\n spotlightWebUrl: string,\r\n desktopConnectorId: string,\r\n callbackFn: () => void,\r\n): Promise => {\r\n fetch(`${spotlightHubsUrl}/api/desktopconnector/initiatepairing/${context}`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Access-Control-Allow-Origin': spotlightWebUrl,\r\n Authorization: `Bearer ${await RestService.getActiveApiToken()}`,\r\n },\r\n body: JSON.stringify({\r\n desktopConnectorId,\r\n }),\r\n }).catch(() => {\r\n callbackFn();\r\n });\r\n};\r\n","import { ImportStatusCode, DataSourceCodes, ProductTypes } from '../../Models/Constants';\r\n\r\nexport { ImportStatusCode, DataSourceCodes, ProductTypes };\r\n\r\nexport enum CompanyFileErrorTypes {\r\n /** The username or password provided was invalid */\r\n InvalidCredentials = 'INVALID_CREDENTIALS',\r\n /** The auth to the external datasource provider has expired */\r\n TokenExpired = 'TOKEN_EXPIRED',\r\n InvalidCompanyFile = 'INVALID_COMPANY_FILE',\r\n}\r\n\r\nexport enum SignalRDesktopFileStatus {\r\n Active = 'Active',\r\n NotFound = 'NotFound',\r\n AuthenticationMissing = 'AuthenticationMissing',\r\n AuthenticationFailed = 'AuthenticationFailed',\r\n}\r\n\r\nexport enum SignalRImportStatus {\r\n Completed = 'Completed',\r\n Faulted = 'Faulted',\r\n Running = 'Running',\r\n}\r\n\r\nexport enum ExternalDataSourceImportEventTypes {\r\n ProgressUpdated = 'PROGRESS_UPDATED',\r\n}\r\n\r\nexport enum SignalRImportEvents {\r\n ConnectionInvite = 'onConnectionInvite',\r\n DesktopConnected = 'onDesktopConnectorConnected',\r\n FileRetrieved = 'onFileRetrieved',\r\n FilesRetrieved = 'onFilesRetrieved',\r\n FileUpdate = 'onFileUpdate',\r\n Error = 'onError',\r\n}\r\n\r\nexport enum SignalRImportRequests {\r\n AcceptConnectionInvite = 'acceptConnectionInvite',\r\n GetFile = 'getFile',\r\n GetFiles = 'getFiles',\r\n UploadFile = 'uploadFile',\r\n}\r\n\r\nexport enum NetworkErrorCodes {\r\n SignalRUnresponsive = 'SIGNALR_UNRESPONSIVE',\r\n DisconnectFailure = 'DISCONNECT_FAILURE',\r\n GetCompanyFilesFailure = 'GET_COMPANY_FILES_FAILURE',\r\n MYOBIsCompanyFileLinkedFailed = 'MYOB.IS_COMPANY_FILE_LINKED_FAILED',\r\n StartImportFailure = 'START_IMPORT_FAILURE',\r\n DateRetrievalFailure = 'DATE_RETRIEVAL_FAILURE',\r\n GetDataSourceStatusFailure = 'GET_DATASOURCE_STATUS_FAILED',\r\n GoogleSpreadsheetUnauthorised = 'GOOGLE_SHEETS.UNAUTHORISED',\r\n GoogleSpreadsheetNotFound = 'GOOGLE_SHEETS.NOT_FOUND',\r\n GoogleSpreadsheetGetFailed = 'GOOGLE_SHEETS.GET_FAILED',\r\n GoogleSpreadsheetCreateFailed = 'GOOGLE_SHEETS.CREATE_FAILED',\r\n /** SignalR error codes - for when something on the hubs or DC goes wrong */\r\n MYOBFileCollectionFailed = 'DESKTOP_CONNECTOR.MYOB.FILE_COLLECTION_FAILED',\r\n QuickbooksFileCollectionFailed = 'DESKTOP_CONNECTOR.QUICKBOOKS.FILE_COLLECTION_FAILED',\r\n Sage50FileCollectionFailed = 'DESKTOP_CONNECTOR.SAGE.FILE_COLLECTION_FAILED',\r\n MYOBFileOpenFailed = 'DESKTOP_CONNECTOR.MYOB.FILE_OPEN_FAILED',\r\n QuickbooksFileOpenFailed = 'DESKTOP_CONNECTOR.QUICKBOOKS.FILE_OPEN_FAILED',\r\n Sage50FileOpenFailed = 'DESKTOP_CONNECTOR.SAGE.FILE_OPEN_FAILED',\r\n PairingFailed = 'DESKTOP_CONNECTOR.SYSTEM.PAIRING_FAILED',\r\n AccessRevoked = 'DESKTOP_CONNECTOR.SYSTEM.ACCESS_REVOKED',\r\n}\r\n\r\nexport const ErrorMap = new Map([\r\n [NetworkErrorCodes.SignalRUnresponsive, 'Unable to connect to the desktop connector.'],\r\n [NetworkErrorCodes.DisconnectFailure, 'Unable to disconnect datasource.'],\r\n [NetworkErrorCodes.GetCompanyFilesFailure, 'Unable to retrieve your files.'],\r\n [NetworkErrorCodes.StartImportFailure, 'Unable to start the import.'],\r\n [NetworkErrorCodes.DateRetrievalFailure, 'Unable to retrieve import information.'],\r\n [NetworkErrorCodes.GetDataSourceStatusFailure, 'Unable to retrieve import information.'],\r\n [NetworkErrorCodes.MYOBIsCompanyFileLinkedFailed, 'Unable to connect to the company file.'],\r\n /** SignalR error messages - for when something on the hubs or DC goes wrong */\r\n [NetworkErrorCodes.MYOBFileCollectionFailed, 'Unable to retrieve your files.'],\r\n [NetworkErrorCodes.QuickbooksFileCollectionFailed, 'Unable to retrieve your files.'],\r\n [NetworkErrorCodes.Sage50FileCollectionFailed, 'Unable to retrieve your files.'],\r\n [NetworkErrorCodes.MYOBFileOpenFailed, 'Unable to open your selected file.'],\r\n [NetworkErrorCodes.QuickbooksFileOpenFailed, 'Unable to open your selected file.'],\r\n [NetworkErrorCodes.Sage50FileOpenFailed, 'Unable to open your selected file.'],\r\n [NetworkErrorCodes.PairingFailed, 'Unable to pair with the requested desktop connector.'],\r\n [NetworkErrorCodes.AccessRevoked, 'Your access was revoked, please initiate a new pairing.'],\r\n]);\r\n","import { DataSourceCodes } from './Constants';\r\nimport { DataSourceViews } from './DataSourcePanel';\r\nimport { ClickImportPayload, ManuallyConnectDataSourcePayload } from './Interfaces';\r\nimport { SignalRProvider } from './SignalRProvider';\r\n\r\nexport enum DataSourceActionTypes {\r\n AutomaticallyConnectDataSource = 'AUTOMATICALLY_CONNECT_DATASOURCE',\r\n CancelImportDataSource = 'CANCEL_IMPORT_DATASOURCE',\r\n CheckForImportStatus = 'CHECK_IMPORT_STATUS',\r\n ClickedImport = 'CLICKED_IMPORT',\r\n DisconnectDataSource = 'DISCONNECT_DATASOURCE',\r\n ManuallyConnectDataSource = 'MANUALLY_CONNECT_DATASOURCE',\r\n OpenCompanyFile = 'OPEN_COMPANY_FILE',\r\n RemoveDataSource = 'REMOVE_DATASOURCE',\r\n RetrieveDataSourceSettings = 'RETRIEVE_DATASOURCE_SETTINGS',\r\n RetrieveDesktopDataSourceFiles = 'RETRIEVE_DESKTOP_DATASOURCE_FILES',\r\n SetCheckBox = 'SET_CHECKBOX',\r\n SetCompanyFile = 'SET_COMPANY_FILE',\r\n SetDate = 'SET_DATE',\r\n SetImportButton = 'SET_IMPORT_BUTTON',\r\n StartDesktopImport = 'START_DESKTOP_IMPORT',\r\n /** User initiated an import */\r\n StartImportDataSource = 'START_IMPORT_DATASOURCE',\r\n SubmitDesktopConnectorId = 'SUBMIT_DESKTOP_CONNECTOR_ID',\r\n UploadFileDataSource = 'UPLOAD_FILE_DATASOURCE',\r\n TransitionView = 'TRANSITION_VIEW',\r\n TransitionAwayFromErrorView = 'TRANSITION_AWAY_FROM_ERROR_VIEW',\r\n UpdateSafeView = 'UPDATE_SAFE_VIEW',\r\n ImportInProgressCheck = 'IMPORT_IN_PROGRESS_CHECK',\r\n ImportInProgress = 'IMPORT_IN_PROGRESS',\r\n}\r\n\r\n// Id is included should we change the reducer to be one per collection\r\nexport type DataSourceActions =\r\n /* panel user interactions */\r\n | { type: DataSourceActionTypes.ClickedImport; payload: ClickImportPayload }\r\n | { type: DataSourceActionTypes.CancelImportDataSource; payload: { dataSourceId: string } }\r\n | {\r\n type: DataSourceActionTypes.DisconnectDataSource;\r\n payload: { dataSourceId: string; dataSourceProviderName: string };\r\n }\r\n | { type: DataSourceActionTypes.RemoveDataSource; payload: { dataSourceId: string; code: DataSourceCodes } }\r\n | { type: DataSourceActionTypes.ManuallyConnectDataSource; payload: ManuallyConnectDataSourcePayload }\r\n | {\r\n type: DataSourceActionTypes.OpenCompanyFile;\r\n payload: {\r\n dataSourceId: string;\r\n selectedCompanyFileId: string;\r\n signalRProvider: SignalRProvider;\r\n user: string;\r\n password: string;\r\n code: DataSourceCodes;\r\n };\r\n }\r\n | { type: DataSourceActionTypes.SetCheckBox; payload: { dataSourceId: string; name: string; value: boolean } }\r\n | { type: DataSourceActionTypes.SetCompanyFile; payload: { dataSourceId: string; companyFileId: string } }\r\n | { type: DataSourceActionTypes.SubmitDesktopConnectorId; payload: ManuallyConnectDataSourcePayload }\r\n | {\r\n type: DataSourceActionTypes.SetDate;\r\n payload: { dataSourceId: string; name: string; value: { year: number; monthIndex: number } };\r\n }\r\n | {\r\n type: DataSourceActionTypes.SetImportButton;\r\n payload: { dataSourceId: string; value: boolean };\r\n }\r\n | {\r\n type: DataSourceActionTypes.UploadFileDataSource;\r\n payload: { dataSourceId: string; event: React.ChangeEvent };\r\n }\r\n /* panel functions */\r\n | {\r\n type: DataSourceActionTypes.TransitionView;\r\n payload: { dataSourceId: string; viewState: DataSourceViews };\r\n }\r\n | {\r\n type: DataSourceActionTypes.TransitionAwayFromErrorView;\r\n payload: { dataSourceId: string };\r\n }\r\n | {\r\n type: DataSourceActionTypes.UpdateSafeView;\r\n payload: { dataSourceId: string; viewState: DataSourceViews };\r\n }\r\n | {\r\n type: DataSourceActionTypes.AutomaticallyConnectDataSource;\r\n payload: { dataSourceId: string; code: DataSourceCodes; externalId: string; persistedCompanyId?: string };\r\n }\r\n | {\r\n type: DataSourceActionTypes.CheckForImportStatus;\r\n payload: { dataSourceId: string; code: DataSourceCodes };\r\n }\r\n | { type: DataSourceActionTypes.StartImportDataSource; payload: ClickImportPayload }\r\n | { type: DataSourceActionTypes.RetrieveDataSourceSettings; payload: { dataSourceId: string } }\r\n | {\r\n type: DataSourceActionTypes.RetrieveDesktopDataSourceFiles;\r\n payload: {\r\n dataSourceId: string;\r\n code: DataSourceCodes;\r\n signalRProvider: SignalRProvider;\r\n };\r\n }\r\n | { type: DataSourceActionTypes.StartDesktopImport; payload: ClickImportPayload }\r\n | { type: DataSourceActionTypes.ImportInProgressCheck; payload: { dataSourceId: string } }\r\n | { type: DataSourceActionTypes.ImportInProgress; payload: { dataSourceId: string } };\r\n","/*\r\n * DataSource actions that occur from app events/reponses rather than user interaction\r\n */\r\nimport { ImportStatusCode } from '../../Models/Constants';\r\nimport { ImportError } from '../../Services/ApiResponseModels';\r\nimport { CompanyFileErrorTypes, NetworkErrorCodes, SignalRImportStatus } from './Constants';\r\nimport { CompanyFileOptions } from './Interfaces';\r\n\r\nexport enum DataSourceAppActionTypes {\r\n DataSourceDisconnected = 'DATASOURCE_DISCONNECTED',\r\n DataSourceNetworkError = 'DATASOURCE_NETWORK_ERROR',\r\n DataSourceImportCancelled = 'DATASOURCE_IMPORT_CANCELLED',\r\n DataSourceImportFailed = 'DATASOURCE_IMPORT_FAILED',\r\n UploadFileSuccess = 'UPLOAD_FILE_SUCCESS',\r\n UploadFileError = 'UPLOAD_FILE_ERROR',\r\n UpdateProgress = 'UPDATE_PROGRESS',\r\n GetGoogleSheetsSuccess = 'GET_GOOGLE_SHEETS_SUCCESS',\r\n /** No company files were returned from the request */\r\n NoCompanyFilesAvailable = 'NO_COMPANY_FILES_AVAILABLE',\r\n GetCompanyFilesSuccess = 'GET_COMPANY_FILES_SUCCESS',\r\n CompanyFileAuthFailed = 'COMPANY_FILE_AUTH_FAILED',\r\n /** MYOB only */\r\n CompanyFileReady = 'COMPANY_FILE_READY',\r\n /** MYOB only */\r\n CompanyFileNotAttached = 'COMPANY_FILE_NOT_ATTACHED',\r\n GetImportDatesSuccess = 'GET_IMPORT_DATES_SUCCESS',\r\n /** An import job has started */\r\n ImportStarted = 'IMPORT_STARTED',\r\n GetTrackingInformationSuccess = 'GET_TRACKING_INFORMATION_SUCCESS',\r\n DataSourceDesktopImportStarted = 'DATASOURCE_DESKTOP_IMPORT_STARTED',\r\n}\r\n\r\nexport type DataSourceAppActions =\r\n | {\r\n type: DataSourceAppActionTypes.DataSourceDisconnected;\r\n payload: { dataSourceId: string };\r\n }\r\n | { type: DataSourceAppActionTypes.DataSourceImportCancelled; payload: { dataSourceId: string } }\r\n | { type: DataSourceAppActionTypes.DataSourceImportFailed; payload: { dataSourceId: string } }\r\n | {\r\n type: DataSourceAppActionTypes.DataSourceNetworkError;\r\n payload: { dataSourceId: string; errorCode: NetworkErrorCodes };\r\n }\r\n | {\r\n type: DataSourceAppActionTypes.UploadFileSuccess;\r\n payload: { dataSourceId: string; importFileId: string };\r\n }\r\n | {\r\n type: DataSourceAppActionTypes.UploadFileError;\r\n payload: { dataSourceId: string };\r\n }\r\n | {\r\n type: DataSourceAppActionTypes.ImportStarted;\r\n payload: {\r\n dataSourceId: string;\r\n };\r\n }\r\n | {\r\n type: DataSourceAppActionTypes.UpdateProgress;\r\n payload: {\r\n dataSourceId: string;\r\n status: ImportStatusCode | SignalRImportStatus;\r\n progress: number;\r\n excelErrors?: ImportError[];\r\n lastImportedDate?: string;\r\n importedToDate?: string;\r\n };\r\n }\r\n | {\r\n type: DataSourceAppActionTypes.NoCompanyFilesAvailable;\r\n payload: { dataSourceId: string };\r\n }\r\n | {\r\n type: DataSourceAppActionTypes.GetCompanyFilesSuccess;\r\n payload: { dataSourceId: string; files: CompanyFileOptions[]; selectedCompanyFileId?: string };\r\n }\r\n | {\r\n type: DataSourceAppActionTypes.CompanyFileReady;\r\n payload: { dataSourceId: string; selectedCompanyFileId: string };\r\n }\r\n | {\r\n type: DataSourceAppActionTypes.CompanyFileNotAttached;\r\n payload: { dataSourceId: string };\r\n }\r\n | {\r\n type: DataSourceAppActionTypes.CompanyFileAuthFailed;\r\n payload: { dataSourceId: string; errorCode: CompanyFileErrorTypes };\r\n }\r\n | {\r\n type: DataSourceAppActionTypes.GetImportDatesSuccess;\r\n payload: {\r\n dataSourceId: string;\r\n actualsFromDate: string;\r\n actualsToDate: string;\r\n budgetFromDate: string;\r\n budgetToDate: string;\r\n };\r\n }\r\n | {\r\n type: DataSourceAppActionTypes.GetTrackingInformationSuccess;\r\n payload: { dataSourceId: string; hasTrackingActuals: boolean; hasTrackingBudget: boolean };\r\n }\r\n | {\r\n type: DataSourceAppActionTypes.DataSourceDesktopImportStarted;\r\n payload: { dataSourceId: string };\r\n }\r\n | {\r\n type: DataSourceAppActionTypes.GetGoogleSheetsSuccess;\r\n payload: {\r\n dataSourceId: string;\r\n name: string;\r\n spreadsheetUrl: string;\r\n };\r\n };\r\n","/*\r\n * DataSource common app reducer\r\n */\r\nimport cloneDeep from 'lodash/cloneDeep';\r\n\r\nimport { ImportStatusCode } from '../../Models/Constants';\r\nimport { NetworkErrorCodes } from './Constants';\r\nimport { DataSourceAppActions, DataSourceAppActionTypes } from './DataSourceAppActions';\r\nimport { DataSourceViews } from './DataSourcePanel';\r\nimport { DataSourcePanelState } from './Interfaces';\r\n\r\nexport const dataSourceAppReducer = (\r\n state: DataSourcePanelState,\r\n action: DataSourceAppActions,\r\n): DataSourcePanelState => {\r\n const newState = cloneDeep(state);\r\n switch (action.type) {\r\n case DataSourceAppActionTypes.DataSourceImportCancelled:\r\n if (newState.viewState === DataSourceViews.NetworkError) return; // We don't want to allow viewState updates if the user is currently on an error screen\r\n newState.importProgress = 0;\r\n if (newState.code === 'EXCEL') {\r\n newState.viewState = DataSourceViews.UploadFile;\r\n } else {\r\n newState.viewState = DataSourceViews.Settings;\r\n }\r\n return newState;\r\n case DataSourceAppActionTypes.DataSourceDisconnected:\r\n newState.isConnected = false;\r\n newState.viewState = DataSourceViews.Connect;\r\n newState.safeViewState = DataSourceViews.Connect;\r\n return newState;\r\n case DataSourceAppActionTypes.DataSourceNetworkError:\r\n newState.importProgress = 0;\r\n newState.errorCode = action.payload.errorCode;\r\n newState.viewState = DataSourceViews.NetworkError;\r\n if (\r\n [\r\n NetworkErrorCodes.AccessRevoked,\r\n NetworkErrorCodes.GetCompanyFilesFailure,\r\n NetworkErrorCodes.GoogleSpreadsheetUnauthorised,\r\n ].includes(action.payload.errorCode)\r\n ) {\r\n // if their access was revoked, we want the button to redirect back to the start so they can request access\r\n newState.safeViewState = DataSourceViews.Connect;\r\n } else if (action.payload.errorCode === NetworkErrorCodes.GoogleSpreadsheetNotFound) {\r\n newState.safeViewState = DataSourceViews.Create;\r\n }\r\n return newState;\r\n case DataSourceAppActionTypes.UploadFileSuccess:\r\n newState.importFileId = action.payload.importFileId;\r\n newState.viewState = DataSourceViews.UploadFileSuccess;\r\n return newState;\r\n case DataSourceAppActionTypes.UploadFileError:\r\n newState.viewState = DataSourceViews.UploadFileFail;\r\n return newState;\r\n case DataSourceAppActionTypes.NoCompanyFilesAvailable:\r\n newState.viewState = DataSourceViews.NoCompanyFilesAvailable;\r\n newState.safeViewState = DataSourceViews.Connect;\r\n return newState;\r\n case DataSourceAppActionTypes.GetCompanyFilesSuccess: {\r\n // set the options\r\n newState.companyFileOptions = action.payload.files;\r\n // set selectedCompanyFileId and externalId\r\n if (state.isConnected && action.payload.selectedCompanyFileId) {\r\n newState.selectedCompanyFileId = action.payload.selectedCompanyFileId;\r\n newState.externalId = action.payload.selectedCompanyFileId;\r\n }\r\n return newState;\r\n }\r\n case DataSourceAppActionTypes.CompanyFileReady:\r\n newState.companyFileError = null;\r\n newState.selectedCompanyFileId = action.payload.selectedCompanyFileId;\r\n newState.viewState = DataSourceViews.ChooseCompanyFile;\r\n return newState;\r\n case DataSourceAppActionTypes.CompanyFileNotAttached:\r\n newState.companyFileError = null;\r\n newState.selectedCompanyFileId = '';\r\n if (\r\n ![DataSourceViews.ChooseCompanyFile, DataSourceViews.AuthenticateCompanyFile].includes(state.viewState)\r\n ) {\r\n // set view state to ChooseCompanyFile\r\n newState.viewState = DataSourceViews.ChooseCompanyFile;\r\n }\r\n return newState;\r\n case DataSourceAppActionTypes.CompanyFileAuthFailed:\r\n newState.companyFileError = action.payload.errorCode;\r\n newState.viewState = DataSourceViews.AuthenticatingCompanyFileFail;\r\n return newState;\r\n case DataSourceAppActionTypes.GetImportDatesSuccess:\r\n if (newState.viewState === DataSourceViews.NetworkError) return; // We don't want to allow viewState updates if the user is currently on an error screen\r\n newState.actualsFromDate = action.payload.actualsFromDate;\r\n newState.actualsToDate = action.payload.actualsToDate;\r\n newState.budgetFromDate = action.payload.budgetFromDate;\r\n newState.budgetToDate = action.payload.budgetToDate;\r\n newState.viewState = DataSourceViews.Settings;\r\n newState.safeViewState = DataSourceViews.Settings;\r\n return newState;\r\n case DataSourceAppActionTypes.ImportStarted:\r\n newState.importStatus = ImportStatusCode.Importing;\r\n newState.importProgress = 0;\r\n return newState;\r\n case DataSourceAppActionTypes.UpdateProgress:\r\n newState.importProgress = action.payload.progress;\r\n if (newState.viewState === DataSourceViews.NetworkError) return; // We don't want to allow viewState updates if the user is currently on an error screen\r\n if (action.payload.status === ImportStatusCode.ImportFailed) {\r\n newState.viewState = DataSourceViews.ImportFail;\r\n }\r\n if (action.payload.progress === 100 && action.payload.status === ImportStatusCode.Success) {\r\n newState.lastImportedDate = action.payload.lastImportedDate;\r\n newState.importedToDate = action.payload.importedToDate;\r\n newState.importProgress = 0;\r\n newState.viewState = DataSourceViews.ImportComplete;\r\n }\r\n if (action.payload.progress === 100 && action.payload.status === ImportStatusCode.SuccessWithErrors) {\r\n newState.excelErrors = action.payload.excelErrors;\r\n newState.lastImportedDate = action.payload.lastImportedDate;\r\n newState.importedToDate = action.payload.importedToDate;\r\n newState.importProgress = 0;\r\n newState.viewState = DataSourceViews.ImportCompleteWithErrors;\r\n }\r\n return newState;\r\n case DataSourceAppActionTypes.DataSourceImportFailed:\r\n newState.importProgress = 0;\r\n newState.viewState = DataSourceViews.ImportFail;\r\n return newState;\r\n case DataSourceAppActionTypes.GetGoogleSheetsSuccess:\r\n newState.name = action.payload.name;\r\n newState.spreadsheetUrl = action.payload.spreadsheetUrl;\r\n newState.viewState = DataSourceViews.LoadingImportSettings;\r\n return newState;\r\n }\r\n return;\r\n};\r\n","import React, { useEffect } from 'react';\r\n\r\nimport { TestContextProvider } from '../../Helpers/TestContextProvider';\r\nimport { camelToKebab } from '../CamelToKebab';\r\nimport { DataSourceCodes } from './Constants';\r\nimport { DataSourceActionTypes, DataSourceActions } from './DataSourceActions';\r\nimport { DataSourcePanel, DataSourcePanelProps, DataSourceViews } from './DataSourcePanel';\r\nimport { SignalRProvider, useSignalRProvider } from './SignalRProvider';\r\n\r\n/**\r\n * This interface exists so that there's flexibility to include or exclude DataSourcePanelProps\r\n * and so that the two components are not forced to be tightly coupled, even though they currently are\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\r\nexport interface DataSourceContainerProps extends DataSourcePanelProps {\r\n externalId: string;\r\n}\r\n\r\n/**\r\n * Automatically transition from one view state to another, when user interaction is not required to do so\r\n * @param viewState\r\n * @param code\r\n * @param dataSourceId\r\n * @param actionHandler\r\n * @param dispatch\r\n */\r\nconst defaultBehavior = async (\r\n viewState: DataSourceViews,\r\n code: DataSourceCodes,\r\n dataSourceId: string,\r\n externalId: string,\r\n actionHandler: (action: DataSourceActions, dispatch: React.Dispatch) => void,\r\n dispatch: React.Dispatch,\r\n signalRProvider: SignalRProvider,\r\n) => {\r\n switch (viewState) {\r\n case DataSourceViews.Connecting:\r\n actionHandler(\r\n {\r\n type: DataSourceActionTypes.AutomaticallyConnectDataSource,\r\n payload: { dataSourceId, code, externalId },\r\n },\r\n dispatch,\r\n );\r\n break;\r\n case DataSourceViews.LoadingImportSettings:\r\n actionHandler(\r\n {\r\n type: DataSourceActionTypes.RetrieveDataSourceSettings,\r\n payload: { dataSourceId },\r\n },\r\n dispatch,\r\n );\r\n break;\r\n case DataSourceViews.FetchingDesktopFiles:\r\n actionHandler(\r\n {\r\n type: DataSourceActionTypes.RetrieveDesktopDataSourceFiles,\r\n payload: { dataSourceId, code, signalRProvider },\r\n },\r\n dispatch,\r\n );\r\n break;\r\n case DataSourceViews.ImportComplete:\r\n // Existing app doesn't update state of things, so we have to refresh the page when switching tabs for grids etc to update\r\n Spotlight.RefreshPage = true;\r\n break;\r\n default:\r\n break;\r\n }\r\n};\r\n\r\nexport const DataSourceContainerComponent: React.FC> = ({\r\n dataSourceId,\r\n externalId,\r\n reportId,\r\n organisationId,\r\n code,\r\n dataSourceProviderName,\r\n name,\r\n lastImportedDate,\r\n importedToDate,\r\n actuals,\r\n budget,\r\n actualsTo,\r\n actualsFrom,\r\n budgetFrom,\r\n budgetTo,\r\n hasTrackingActuals,\r\n hasTrackingBudget,\r\n trackingActualsSelected,\r\n trackingBudgetSelected,\r\n productType,\r\n desktopConnectorId,\r\n viewState,\r\n importButtonDisabled,\r\n isConnected,\r\n companyFileOptions,\r\n importProgress,\r\n selectedCompanyFileId,\r\n companyFileError,\r\n dispatch,\r\n actionHandler,\r\n errorCode,\r\n safeViewState,\r\n spreadsheetUrl,\r\n}) => {\r\n const signalRContext = useSignalRProvider();\r\n useEffect(() => {\r\n defaultBehavior(viewState, code, dataSourceId, externalId, actionHandler, dispatch, signalRContext);\r\n }, [viewState, code, externalId, signalRContext, dataSourceId, actionHandler, dispatch]);\r\n\r\n useEffect(() => {\r\n let progressTimer: number;\r\n // Stop the clock if the import failed\r\n if (viewState === DataSourceViews.ImportFail) {\r\n window.clearTimeout(progressTimer);\r\n }\r\n\r\n if (viewState !== DataSourceViews.Importing) return;\r\n\r\n const checkForProgress = () => {\r\n actionHandler(\r\n {\r\n type: DataSourceActionTypes.CheckForImportStatus,\r\n payload: { dataSourceId, code },\r\n },\r\n dispatch,\r\n );\r\n progressTimer = window.setTimeout(checkForProgress, 2000);\r\n };\r\n\r\n // Poll for import status every 2 seconds\r\n progressTimer = window.setTimeout(checkForProgress, 2000);\r\n\r\n return () => {\r\n window.clearTimeout(progressTimer);\r\n };\r\n }, [viewState]);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n","import React, { useCallback, useEffect, useReducer } from 'react';\r\n\r\nimport cloneDeep from 'lodash/cloneDeep';\r\n\r\nimport { DataSourceTypeCode, ImportStatusCode } from '../../../Codes';\r\nimport { generateConnectUrl } from '../../ConnectDataSource';\r\nimport { getSmoothProgress, isDesktop, shouldUseNewImport } from '../../Helpers';\r\nimport { getProductByReportMode } from '../../Helpers/product-type';\r\nimport { ReportModes } from '../../Models/Constants';\r\nimport RestService from '../../Services/RestService';\r\nimport { getAuthorisedXeroCompanies, retrieveTracking } from './ConnectionSteps';\r\nimport {\r\n DataSourceCodes,\r\n ExternalDataSourceImportEventTypes,\r\n SignalRImportEvents,\r\n SignalRImportStatus,\r\n} from './Constants';\r\nimport { DataSourceActions, DataSourceActionTypes } from './DataSourceActions';\r\nimport { DataSourceAppActions, DataSourceAppActionTypes } from './DataSourceAppActions';\r\nimport { dataSourceAppReducer } from './DataSourceAppReducer';\r\nimport { DataSourceContainerComponent } from './DataSourceContainer';\r\nimport {\r\n cancelImport,\r\n disconnectDataSource,\r\n isDataSourceAppAction,\r\n isDataSourceUiAction,\r\n retrieveImportSettings,\r\n startImport,\r\n} from './DataSourceFunctions';\r\nimport { DataSourceViews } from './DataSourcePanel';\r\nimport { dataSourceUiReducer } from './DataSourceUiReducer';\r\nimport {\r\n connectDesktopDataSource,\r\n fetchFileInformation,\r\n fetchFiles,\r\n signalRBindEvents,\r\n signalRHubSetup,\r\n uploadDesktopFile,\r\n} from './DesktopFunctions';\r\nimport {\r\n DataSourceModel,\r\n DataSourcePanelState,\r\n ManuallyConnectDataSourcePayload,\r\n ProgressUpdateEvent,\r\n} from './Interfaces';\r\nimport { useSignalRDispatch, useSignalRProvider } from './SignalRProvider';\r\n\r\nexport interface DataSourceContainerCollectionProps {\r\n models: DataSourceModel[];\r\n organisationId: string;\r\n reportId: string;\r\n reportMode: ReportModes;\r\n}\r\n\r\ninterface DataSourceContainerCollectionState {\r\n reportId: string;\r\n organisationId: string;\r\n panels: Map;\r\n}\r\n\r\nconst dataSourceProviderNames: Map = new Map([\r\n [DataSourceCodes.Xero, 'Xero'],\r\n [DataSourceCodes.XeroPracticeManager, 'Xero'],\r\n [DataSourceCodes.QuickBooks, 'QuickBooks'],\r\n [DataSourceCodes.QuickBooksDesktop, 'QuickBooks'],\r\n [DataSourceCodes.MYOBAccountRight, 'MYOB'],\r\n [DataSourceCodes.MYOBAccountRightDesktop, 'MYOB'],\r\n [DataSourceCodes.Excel, 'Excel'],\r\n [DataSourceCodes.ExcelPersonalWealth, 'Excel'],\r\n [DataSourceCodes.GoogleAnalytics4, 'Google Analytics (GA4)'],\r\n [DataSourceCodes.GoogleSheets, 'Google Sheets'],\r\n [DataSourceCodes.Sage50Desktop, 'Sage'],\r\n]);\r\n\r\n/**\r\n * This method essentially gets polled and responds to events for the duration of the import process.\r\n * See DataSourceContainer.ts effect inside render method for the polling aspect.\r\n * Raises an event that has an event listener that dispatches to update state with the new progress and status.\r\n * @param dataSourceId\r\n * @param code\r\n */\r\nconst checkForImportProgressStatus = async (dataSourceId: string, code: DataSourceCodes) => {\r\n RestService.GetImportStatus({\r\n dataSourceId,\r\n successFn: function (data) {\r\n let nextProgress: number;\r\n if (shouldUseNewImport(code)) {\r\n if (data.completedWork > 1) {\r\n nextProgress = data.completedWork;\r\n }\r\n } else {\r\n if (data.totalReports > 1) {\r\n nextProgress = Math.floor(\r\n ((data.importedReports * data.startedOrganisations) /\r\n data.totalReports /\r\n data.totalOrganisations) *\r\n 100,\r\n );\r\n }\r\n }\r\n\r\n if (isDesktop(code)) {\r\n // Uploading the desktop file is worth 50% of the progress, we need to scale 100 into 50%\r\n nextProgress = 50 + nextProgress / 2;\r\n }\r\n\r\n if (nextProgress && !Number.isNaN(nextProgress)) {\r\n const event = new CustomEvent(ExternalDataSourceImportEventTypes.ProgressUpdated, {\r\n detail: { dataSourceId, status: data.importStatusCode, progress: nextProgress },\r\n });\r\n window.dispatchEvent(event);\r\n }\r\n },\r\n });\r\n};\r\n\r\n/**\r\n * This method is responsible for manually progressing an unauthenticated data source to a connected or connect failed state\r\n * TODO: [FI-23] Implement this properly\r\n * @param code\r\n * @param reportId\r\n * @param dataSourceId\r\n * @param organisationId\r\n * @param dataSourceProviderName\r\n */\r\nconst manuallyConnectDataSource = (\r\n code: string,\r\n reportId: string,\r\n dataSourceId: string,\r\n organisationId: string,\r\n dataSourceProviderName: string,\r\n) => {\r\n // TODO: steal dylan's st00f [FI-23]\r\n const modalTitle = `Connect to ${dataSourceProviderName}`;\r\n const modalText = `You're about to be redirected to ${dataSourceProviderName}. Log in, select the organisation you wish to import from, and you'll be redirected back here.`;\r\n\r\n console.log('manually connecting: ', modalText);\r\n\r\n const settings = {\r\n dataSourceId: dataSourceId,\r\n organisationId: organisationId,\r\n reportMode: Spotlight.ReportMode,\r\n };\r\n const url = generateConnectUrl({ connectType: code as DataSourceTypeCode, reportId, settings });\r\n window.location.href = url;\r\n};\r\n\r\n/**\r\n * This method retrieves additional import information, such as tracking, and transitions the user to the next relevant view state.\r\n * The next view state is usually connect success or connect failed, but can also transition to file select for when more than one company file is authenticated.\r\n * @param dataSourceId\r\n * @param code\r\n * @param dispatch\r\n */\r\nconst connectDataSource = (dataSourceId: string, code: string, dispatch: React.Dispatch) => {\r\n switch (code) {\r\n case DataSourceCodes.Xero:\r\n getAuthorisedXeroCompanies(dataSourceId)\r\n .then((response) => {\r\n const xeroCompanies = response;\r\n if (xeroCompanies.length > 1) {\r\n // more than one file authed, so let the user choose which to use\r\n dispatch({\r\n type: DataSourceActionTypes.TransitionView,\r\n payload: { dataSourceId, viewState: DataSourceViews.ChooseCompanyFile },\r\n });\r\n } else {\r\n retrieveTracking(dataSourceId)\r\n .then((response) => {\r\n if (response && response.error) {\r\n let viewState = DataSourceViews.ConnectFail;\r\n if (response.error === 'INSUFFICIENT_ACCESS') {\r\n viewState = DataSourceViews.ConnectInsufficientAccess;\r\n }\r\n dispatch({\r\n type: DataSourceActionTypes.TransitionView,\r\n payload: { dataSourceId, viewState },\r\n });\r\n } else {\r\n dispatch({\r\n type: DataSourceAppActionTypes.GetTrackingInformationSuccess,\r\n payload: {\r\n dataSourceId: dataSourceId,\r\n hasTrackingActuals: response.hasTrackingActuals ?? false,\r\n hasTrackingBudget: response.hasTrackingBudget ?? false,\r\n },\r\n });\r\n }\r\n })\r\n .catch(() => {\r\n dispatch({\r\n type: DataSourceAppActionTypes.DataSourceDisconnected,\r\n payload: { dataSourceId: dataSourceId },\r\n });\r\n });\r\n }\r\n })\r\n .catch(() => {\r\n dispatch({\r\n type: DataSourceAppActionTypes.DataSourceDisconnected,\r\n payload: { dataSourceId: dataSourceId },\r\n });\r\n });\r\n break;\r\n case DataSourceCodes.QuickBooks:\r\n retrieveTracking(dataSourceId).then((response) => {\r\n if (response && response.error) {\r\n let viewState = DataSourceViews.ConnectFail;\r\n if (response.error === 'INSUFFICIENT_ACCESS') {\r\n viewState = DataSourceViews.ConnectInsufficientAccess;\r\n }\r\n dispatch({\r\n type: DataSourceActionTypes.TransitionView,\r\n payload: { dataSourceId, viewState },\r\n });\r\n } else {\r\n dispatch({\r\n type: DataSourceAppActionTypes.GetTrackingInformationSuccess,\r\n payload: {\r\n dataSourceId: dataSourceId,\r\n hasTrackingActuals: response.hasTrackingActuals ?? false,\r\n hasTrackingBudget: response.hasTrackingBudget ?? false,\r\n },\r\n });\r\n }\r\n });\r\n break;\r\n default:\r\n break;\r\n }\r\n};\r\n\r\nconst reducer = (\r\n state: DataSourceContainerCollectionState,\r\n action: DataSourceActions | DataSourceAppActions,\r\n): DataSourceContainerCollectionState => {\r\n const newState: DataSourceContainerCollectionState = cloneDeep(state);\r\n const activePanel = newState.panels.get(action.payload.dataSourceId);\r\n switch (action.type) {\r\n case DataSourceAppActionTypes.UpdateProgress:\r\n {\r\n const smoothProgress = Math.round(\r\n getSmoothProgress(action.payload.progress, activePanel.importProgress),\r\n );\r\n activePanel.importProgress = smoothProgress;\r\n if (smoothProgress === 100) {\r\n activePanel.viewState = DataSourceViews.ImportComplete;\r\n }\r\n }\r\n return newState;\r\n case DataSourceAppActionTypes.GetTrackingInformationSuccess:\r\n activePanel.hasTrackingActuals = action.payload.hasTrackingActuals;\r\n activePanel.hasTrackingBudget = action.payload.hasTrackingBudget;\r\n activePanel.isConnected = true;\r\n activePanel.viewState = DataSourceViews.LoadingImportSettings;\r\n return newState;\r\n default: {\r\n if (isDataSourceUiAction(action)) {\r\n const result = dataSourceUiReducer(activePanel, action);\r\n if (result) {\r\n newState.panels.set(result.dataSourceId, result);\r\n return newState;\r\n }\r\n }\r\n if (isDataSourceAppAction(action)) {\r\n const result = dataSourceAppReducer(activePanel, action);\r\n if (result) {\r\n newState.panels.set(result.dataSourceId, result);\r\n return newState;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return state;\r\n};\r\n\r\nconst manuallyConnectDataSourceHandler = (\r\n payload: ManuallyConnectDataSourcePayload,\r\n dispatch: React.Dispatch,\r\n) => {\r\n if (isDesktop(payload.code)) {\r\n connectDesktopDataSource(\r\n payload.dataSourceId,\r\n payload.desktopConnectorId,\r\n payload.signalRProvider,\r\n payload.signalRDispatch,\r\n dispatch,\r\n );\r\n } else {\r\n manuallyConnectDataSource(\r\n payload.code,\r\n payload.reportId,\r\n payload.dataSourceId,\r\n payload.organisationId,\r\n payload.dataSourceProviderName,\r\n );\r\n }\r\n};\r\n\r\nconst actionHandler = (\r\n action: DataSourceActions | DataSourceAppActions,\r\n dispatch: React.Dispatch,\r\n state?: DataSourceContainerCollectionState,\r\n) => {\r\n switch (action.type) {\r\n case DataSourceActionTypes.AutomaticallyConnectDataSource:\r\n connectDataSource(action.payload.dataSourceId, action.payload.code, dispatch);\r\n break;\r\n case DataSourceActionTypes.CancelImportDataSource:\r\n cancelImport(action.payload.dataSourceId, dispatch);\r\n break;\r\n case DataSourceActionTypes.CheckForImportStatus:\r\n checkForImportProgressStatus(action.payload.dataSourceId, action.payload.code);\r\n break;\r\n case DataSourceActionTypes.DisconnectDataSource:\r\n disconnectDataSource(action.payload.dataSourceId, action.payload.dataSourceProviderName, dispatch);\r\n break;\r\n case DataSourceActionTypes.ManuallyConnectDataSource:\r\n manuallyConnectDataSourceHandler(action.payload, dispatch);\r\n break;\r\n case DataSourceActionTypes.OpenCompanyFile:\r\n if (isDesktop(action.payload.code)) {\r\n // Move the user to a loading state\r\n dispatch({\r\n type: DataSourceActionTypes.TransitionView,\r\n payload: {\r\n dataSourceId: action.payload.dataSourceId,\r\n viewState: DataSourceViews.LoadingCompanyFile,\r\n },\r\n });\r\n fetchFileInformation(\r\n action.payload.dataSourceId,\r\n action.payload.code,\r\n action.payload.selectedCompanyFileId,\r\n action.payload.signalRProvider,\r\n dispatch,\r\n );\r\n }\r\n break;\r\n case DataSourceActionTypes.RemoveDataSource:\r\n // TODO: FI-51 remove data source API\r\n Spotlight.DeleteDataSourceById(action.payload.dataSourceId, false); // NOTE: assumes org is not linked with the false value\r\n break;\r\n case DataSourceActionTypes.RetrieveDataSourceSettings: {\r\n retrieveImportSettings(action.payload.dataSourceId, Spotlight.ReportMode, dispatch);\r\n break;\r\n }\r\n case DataSourceActionTypes.RetrieveDesktopDataSourceFiles:\r\n fetchFiles(action.payload.dataSourceId, action.payload.code, action.payload.signalRProvider, dispatch);\r\n break;\r\n case DataSourceActionTypes.ClickedImport: {\r\n if (isDesktop(action.payload.code)) {\r\n dispatch({\r\n type: DataSourceActionTypes.TransitionView,\r\n payload: {\r\n dataSourceId: action.payload.dataSourceId,\r\n viewState: DataSourceViews.UploadingDesktopFile,\r\n },\r\n });\r\n uploadDesktopFile(action.payload, dispatch);\r\n } else {\r\n const startImportPayload = {\r\n ...action.payload,\r\n importFileId: '',\r\n };\r\n startImport(startImportPayload, Spotlight.ReportMode, dispatch);\r\n dispatch({\r\n type: DataSourceActionTypes.TransitionView,\r\n payload: { dataSourceId: action.payload.dataSourceId, viewState: DataSourceViews.Importing },\r\n });\r\n }\r\n break;\r\n }\r\n case DataSourceActionTypes.StartDesktopImport: {\r\n const startImportPayload = {\r\n ...action.payload,\r\n importFileId: '',\r\n };\r\n startImport(startImportPayload, Spotlight.ReportMode, dispatch);\r\n break;\r\n }\r\n case DataSourceActionTypes.SubmitDesktopConnectorId: {\r\n manuallyConnectDataSourceHandler(action.payload, dispatch);\r\n dispatch(action);\r\n break;\r\n }\r\n case DataSourceAppActionTypes.UpdateProgress:\r\n if (\r\n (\r\n [ImportStatusCode.ImportFailed, ImportStatusCode.ConnectFailed, ImportStatusCode.UnknownError] as (\r\n | ImportStatusCode\r\n | SignalRImportStatus\r\n )[]\r\n ).includes(action.payload.status)\r\n ) {\r\n dispatch({\r\n type: DataSourceAppActionTypes.DataSourceImportFailed,\r\n payload: { dataSourceId: action.payload.dataSourceId },\r\n });\r\n } else {\r\n dispatch({ type: DataSourceAppActionTypes.UpdateProgress, payload: action.payload });\r\n }\r\n break;\r\n case DataSourceActionTypes.UploadFileDataSource:\r\n dispatch({\r\n type: DataSourceActionTypes.TransitionView,\r\n payload: { dataSourceId: action.payload.dataSourceId, viewState: DataSourceViews.UploadingFile },\r\n });\r\n break;\r\n case DataSourceAppActionTypes.DataSourceDesktopImportStarted:\r\n {\r\n const activePanel = state.panels.get(action.payload.dataSourceId);\r\n actionHandler(\r\n {\r\n type: DataSourceActionTypes.StartDesktopImport,\r\n payload: {\r\n dataSourceId: activePanel.dataSourceId,\r\n actualsFrom: activePanel.actualsFromDate,\r\n actualsTo: activePanel.actualsToDate,\r\n budgetFrom: activePanel.budgetFromDate,\r\n budgetTo: activePanel.budgetToDate,\r\n actuals: activePanel.actualsSelected,\r\n budget: activePanel.budgetSelected,\r\n trackingActualsSelected: activePanel.trackingActualsSelected,\r\n trackingBudgetSelected: activePanel.trackingBudgetSelected,\r\n selectedCompanyFileId: activePanel.selectedCompanyFileId,\r\n dataSourceType: activePanel.companyFileOptions.find(\r\n (a) => a.value === activePanel.selectedCompanyFileId,\r\n ).type,\r\n code: activePanel.code,\r\n },\r\n },\r\n dispatch,\r\n );\r\n }\r\n break;\r\n default:\r\n dispatch(action);\r\n break;\r\n }\r\n};\r\n\r\nconst initialiser = (models: DataSourceModel[], organisationId: string, reportId: string, reportMode: ReportModes) => {\r\n const panels = new Map();\r\n models.map((m) => {\r\n const model = m;\r\n const defaultViewState = isDesktop(model.dataSourceTypeCode)\r\n ? DataSourceViews.Connect\r\n : DataSourceViews.Connecting;\r\n panels.set(model.dataSourceId, {\r\n actuals: model.importActuals ?? false,\r\n budget: model.importBudget ?? false,\r\n actualsFrom: model.importFromDate,\r\n actualsTo: model.importToDate,\r\n budgetFrom: model.importBudgetFromDate,\r\n budgetTo: model.importBudgetToDate,\r\n hasTrackingActuals: false,\r\n hasTrackingBudget: false,\r\n trackingActualsSelected: false,\r\n trackingBudgetSelected: false,\r\n isConnected: false,\r\n viewState: defaultViewState,\r\n importButtonDisabled: !(model.importActuals || model.importBudget),\r\n dataSourceId: model.dataSourceId,\r\n code: model.dataSourceTypeCode,\r\n name: model.fileName,\r\n dataSourceProviderName: dataSourceProviderNames.get(model.dataSourceTypeCode),\r\n lastImportedDate: model.lastImportedUtc,\r\n importedToDate: model.importedToDate,\r\n productType: getProductByReportMode(reportMode),\r\n desktopConnectorId: '',\r\n companyFileOptions: [],\r\n importProgress: 0,\r\n selectedCompanyFile: model.externalId,\r\n externalId: model.externalId,\r\n safeViewState: defaultViewState,\r\n });\r\n });\r\n return { reportId, organisationId, panels };\r\n};\r\n\r\nexport const DataSourceContainerCollectionComponent: React.FC<\r\n React.PropsWithChildren\r\n> = ({ models, reportId, organisationId, reportMode }) => {\r\n const initial = initialiser(models, organisationId, reportId, reportMode);\r\n const [state, dispatch] = useReducer(reducer, initial);\r\n const signalRContext = useSignalRProvider();\r\n const signalRDispatchContext = useSignalRDispatch();\r\n\r\n /** Calls our action handler while providing state */\r\n const actionHandlerWithState = useCallback(\r\n (action: any, dispatch: any) => actionHandler(action, dispatch, state),\r\n [state],\r\n );\r\n\r\n useEffect(() => {\r\n // setup event handlers\r\n const progressUpdateHandler = (event: CustomEvent) => {\r\n actionHandler(\r\n {\r\n type: DataSourceAppActionTypes.UpdateProgress,\r\n payload: {\r\n dataSourceId: event.detail.dataSourceId,\r\n status: event.detail.status,\r\n progress: event.detail.progress,\r\n },\r\n },\r\n dispatch,\r\n );\r\n };\r\n\r\n // on mount, bind to events\r\n window.addEventListener(ExternalDataSourceImportEventTypes.ProgressUpdated, progressUpdateHandler);\r\n return () => {\r\n // remove the event listeners\r\n window.removeEventListener(ExternalDataSourceImportEventTypes.ProgressUpdated, progressUpdateHandler);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n const asyncFn = async () => {\r\n if (signalRContext.hubsConnection === null) {\r\n // setup signalr Hub\r\n await signalRHubSetup(signalRContext, signalRDispatchContext);\r\n }\r\n };\r\n asyncFn();\r\n return () => {\r\n // disconnect\r\n signalRContext.hubsConnection && signalRContext.hubsConnection.stop();\r\n };\r\n }, [signalRContext, signalRDispatchContext]);\r\n\r\n useEffect(() => {\r\n const asyncFn = async () => {\r\n if (signalRContext.hubsConnection !== null) {\r\n // add the event listeners\r\n signalRBindEvents({\r\n signalRProvider: signalRContext,\r\n signalRDispatch: signalRDispatchContext,\r\n dispatch,\r\n actionHandler: actionHandlerWithState,\r\n });\r\n }\r\n };\r\n asyncFn();\r\n return () => {\r\n // clean up events\r\n const hubConnection = signalRContext.hubsConnection;\r\n if (!hubConnection) {\r\n return;\r\n }\r\n hubConnection.off(SignalRImportEvents.ConnectionInvite);\r\n hubConnection.off(SignalRImportEvents.DesktopConnected);\r\n hubConnection.off(SignalRImportEvents.FilesRetrieved);\r\n hubConnection.off(SignalRImportEvents.FileUpdate);\r\n hubConnection.off(SignalRImportEvents.FileRetrieved);\r\n hubConnection.off(SignalRImportEvents.Error);\r\n };\r\n }, [actionHandlerWithState, signalRContext, signalRDispatchContext]);\r\n\r\n return (\r\n
\r\n {Array.from(state.panels.values()).map((panel) => {\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n );\r\n};\r\n","/*\r\n * Functions commonly used for datasource panels\r\n */\r\nimport * as React from 'react';\r\n\r\nimport { EventCode } from '../../../Codes';\r\nimport { ReportModes, ImportStatusCode } from '../../Models/Constants';\r\nimport { ImportDataSource } from '../../Services/ApiRequestModels';\r\nimport RestService from '../../Services/RestService';\r\nimport { NetworkErrorCodes } from './Constants';\r\nimport { DataSourceActions, DataSourceActionTypes } from './DataSourceActions';\r\nimport { DataSourceAppActions, DataSourceAppActionTypes } from './DataSourceAppActions';\r\nimport { ClickImportPayload } from './Interfaces';\r\n\r\n/** Type guard for DataSource UI actions */\r\nexport const isDataSourceUiAction = (action: { type: string }): action is DataSourceActions => {\r\n return Object.values(DataSourceActionTypes).includes(action.type);\r\n};\r\n\r\n/** Type guard for DataSource App actions */\r\nexport const isDataSourceAppAction = (action: { type: string }): action is DataSourceAppActions => {\r\n return Object.values(DataSourceAppActionTypes).includes(action.type);\r\n};\r\n\r\n/**\r\n * This method sends a request to the API to disconnect a datasource. On success it redirects back to the connect view state.\r\n */\r\nexport const disconnectDataSource = (\r\n dataSourceId: string,\r\n dataSourceProviderName: string,\r\n dispatch: React.Dispatch,\r\n): void => {\r\n RestService.DataSourceDisconnect(dataSourceId)\r\n .then(() => {\r\n dispatch({ type: DataSourceAppActionTypes.DataSourceDisconnected, payload: { dataSourceId } });\r\n })\r\n .catch((error) => {\r\n dispatch({\r\n type: DataSourceAppActionTypes.DataSourceNetworkError,\r\n payload: {\r\n dataSourceId,\r\n errorCode: NetworkErrorCodes.DisconnectFailure,\r\n },\r\n });\r\n });\r\n};\r\n\r\ninterface StartImportPayload extends ClickImportPayload {\r\n importFileId: string;\r\n}\r\n\r\n/**\r\n * Pass all the relevant import information to the API and queue up an import\r\n */\r\nexport const startImport = async (\r\n payload: StartImportPayload,\r\n reportMode: ReportModes,\r\n dispatch: React.Dispatch,\r\n): Promise => {\r\n dispatch({\r\n type: DataSourceActionTypes.StartImportDataSource,\r\n payload: { dataSourceId: payload.dataSourceId },\r\n });\r\n\r\n const request: ImportDataSource = {\r\n actualsFrom: payload.actuals ? payload.actualsFrom : undefined,\r\n actualsTo: payload.actuals ? payload.actualsTo : undefined,\r\n budgetFrom: payload.budget ? payload.budgetFrom : undefined,\r\n budgetTo: payload.budget ? payload.budgetTo : undefined,\r\n actuals: payload.actuals,\r\n budget: payload.budget,\r\n trackingActualsSelected: payload.trackingActualsSelected,\r\n trackingBudgetSelected: payload.trackingBudgetSelected,\r\n companyFileId: payload.selectedCompanyFileId,\r\n importFileId: payload.importFileId,\r\n };\r\n\r\n RestService.ImportDataSource(payload.dataSourceId, reportMode, request)\r\n .then(() => {\r\n dispatch({\r\n type: DataSourceAppActionTypes.ImportStarted,\r\n payload: { dataSourceId: payload.dataSourceId },\r\n });\r\n })\r\n .catch(() => {\r\n dispatch({\r\n type: DataSourceAppActionTypes.DataSourceNetworkError,\r\n payload: {\r\n dataSourceId: payload.dataSourceId,\r\n errorCode: NetworkErrorCodes.StartImportFailure,\r\n },\r\n });\r\n });\r\n};\r\n\r\n/**\r\n * Cancel the current import. This is currently using a legacy implementation and should be moved to using API and improved at\r\n * that point in time.\r\n * TODO: move to API and improve implementation\r\n * @param dataSourceId\r\n * @param dispatch\r\n */\r\nexport const cancelImport = async (dataSourceId: string, dispatch: React.Dispatch): Promise => {\r\n dispatch({\r\n type: DataSourceActionTypes.CancelImportDataSource,\r\n payload: { dataSourceId },\r\n });\r\n\r\n Spotlight.DoEvent(EventCode.CancelImportDataSource, { eId: dataSourceId }, (response) => {\r\n const eventJson = RestService.GetEventJson(response);\r\n if (eventJson.ImportStatusCode === 'CANCELLED') {\r\n dispatch({\r\n type: DataSourceAppActionTypes.DataSourceImportCancelled,\r\n payload: { dataSourceId },\r\n });\r\n }\r\n });\r\n};\r\n\r\nexport const uploadFile = async (\r\n payload: {\r\n dataSourceId: string;\r\n event: React.ChangeEvent;\r\n },\r\n dispatch: React.Dispatch,\r\n): Promise => {\r\n dispatch({\r\n type: DataSourceActionTypes.UploadFileDataSource,\r\n payload,\r\n });\r\n\r\n const files = payload.event.target.files;\r\n const formData = new FormData();\r\n formData.append(files[0].name, files[0]);\r\n\r\n $.ajax({\r\n url: '/UploadImportFile/' + (window as any).WINDOW_CODE,\r\n type: 'POST',\r\n data: formData,\r\n success: function (data) {\r\n dispatch({\r\n type: DataSourceAppActionTypes.UploadFileSuccess,\r\n payload: { dataSourceId: payload.dataSourceId, importFileId: data.Filename },\r\n });\r\n },\r\n error: function (jqXHR, textStatus, error) {\r\n dispatch({\r\n type: DataSourceAppActionTypes.UploadFileError,\r\n payload: { dataSourceId: payload.dataSourceId },\r\n });\r\n },\r\n cache: false,\r\n contentType: false,\r\n processData: false,\r\n });\r\n};\r\n\r\n/**\r\n * This method is responsible for retrieving the default dates from the API. This transitions the user to either\r\n * the settings view or a generic error if it fails, which will redirect them back to the start\r\n * @param dataSourceId\r\n * @param dispatch\r\n */\r\nexport const retrieveImportSettings = (\r\n dataSourceId: string,\r\n reportMode: ReportModes,\r\n dispatch: React.Dispatch,\r\n): void => {\r\n RestService.GetDataSourceDefaultImportDates(dataSourceId, reportMode)\r\n .then((response) => {\r\n const importDates = {\r\n dataSourceId,\r\n actualsFromDate: response.data.actualsFrom,\r\n actualsToDate: response.data.actualsTo,\r\n budgetFromDate: response.data.budgetFrom,\r\n budgetToDate: response.data.budgetTo,\r\n };\r\n dispatch({ type: DataSourceAppActionTypes.GetImportDatesSuccess, payload: importDates });\r\n })\r\n .catch((err) => {\r\n dispatch({\r\n type: DataSourceAppActionTypes.DataSourceNetworkError,\r\n payload: {\r\n dataSourceId,\r\n errorCode: NetworkErrorCodes.DateRetrievalFailure,\r\n },\r\n });\r\n });\r\n};\r\n\r\n/**\r\n * This method checks if there are any current imports in progress.\r\n * If an import is in progress (importing state) then the view becomes importing and import progress bar is displayed.\r\n * @param dataSourceId\r\n */\r\nexport const importInProgress = async (dataSourceId: string, dispatch: React.Dispatch): Promise => {\r\n RestService.GetImportStatus({\r\n dataSourceId,\r\n successFn: function (data) {\r\n if (data.importStatusCode === ImportStatusCode.Importing) {\r\n dispatch({\r\n type: DataSourceActionTypes.ImportInProgress,\r\n payload: { dataSourceId: dataSourceId },\r\n });\r\n }\r\n },\r\n });\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { Button, Modal, THEME } from '@ui';\r\n\r\nimport { centerModalStyle } from '../SpotlightModal';\r\nimport * as SRModal from '../SpotlightModal';\r\n\r\ntype ConfirmDisconnectFromDataSourceModal = {\r\n dataSourceProviderName: string;\r\n confirmedDisconnectHandler: React.MouseEventHandler;\r\n closeFn: () => void;\r\n};\r\n\r\nconst DisconnectModalDisplay = ({ title, modalContent, buttons, closeFn }) => {\r\n return (\r\n \r\n \r\n \r\n {modalContent}\r\n \r\n \r\n <>\r\n \r\n );\r\n};\r\n\r\nconst ButtonBar: React.FC> = (props) => {\r\n return (\r\n
\r\n
{props.children}
\r\n
\r\n );\r\n};\r\n\r\nconst DisconnectionModalSpiel = ({ providerName }) => {\r\n return (\r\n <>\r\n

The connection to {providerName} will be removed.

\r\n

\r\n Next time you import data from {providerName} you will have to give Spotlight permission again.\r\n

\r\n \r\n );\r\n};\r\n\r\nconst ConfirmationModal: React.FC> = ({\r\n dataSourceProviderName,\r\n confirmedDisconnectHandler,\r\n closeFn,\r\n}) => {\r\n const modalContent = (\r\n
\r\n \r\n
\r\n );\r\n\r\n const buttons = (\r\n \r\n
\r\n \r\n \r\n Cancel\r\n \r\n
\r\n
\r\n );\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport const ConfirmDisconnectFromDataSourceModal: React.FC<\r\n React.PropsWithChildren\r\n> = ({ dataSourceProviderName, confirmedDisconnectHandler, closeFn }) => {\r\n return (\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { ProductTypes } from './Constants';\r\nimport { UploadStates } from './Excel';\r\n\r\ninterface ExcelUploadProps {\r\n uploadHandler: React.ChangeEventHandler;\r\n productType: ProductTypes;\r\n fileName: string;\r\n uploadState: UploadStates;\r\n}\r\n\r\nexport const ExcelUpload = React.forwardRef(\r\n ({ uploadHandler, productType, fileName, uploadState }, ref) => {\r\n const excelTemplatePath = ((productType) => {\r\n if (productType === ProductTypes.Forecasting) {\r\n return '/content/samples/Spotlight Forecasting Import Template.xlsx';\r\n }\r\n return '/content/samples/spotlight import template.xlsx';\r\n })(productType);\r\n\r\n return (\r\n
\r\n
\r\n {fileName && uploadState === UploadStates.UploadingFile && (\r\n

Uploading ‘{fileName}’.

\r\n )}\r\n {fileName && uploadState === UploadStates.UploadFileSuccess && (\r\n

\r\n ‘{fileName}’{' '}\r\n uploaded. Click ‘Import Data’ to continue, or upload a different file to use.\r\n

\r\n )}\r\n

\r\n Select File (.xlsx) or{' '}\r\n \r\n download Excel template\r\n \r\n

\r\n
\r\n \r\n \r\n
\r\n
\r\n );\r\n },\r\n);\r\nExcelUpload.displayName = 'ExcelUpload';\r\n","import * as React from 'react';\r\n\r\nimport { ImportError } from '../../Services/ApiResponseModels';\r\n\r\nexport interface ExcelErrorsProps {\r\n errors: ImportError[];\r\n}\r\n\r\nexport const ExcelErrors: React.FC> = ({ errors }) => {\r\n return (\r\n
\r\n
    \r\n {errors.map((error, index) => {\r\n return (\r\n
  • \r\n {error.context} \r\n {error.message}\r\n
  • \r\n );\r\n })}\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\n\r\ninterface ImportProgressBar {\r\n progress?: number;\r\n}\r\n\r\nexport const ImportProgressBar: React.FC> = ({ progress = 0 }) => {\r\n if (typeof progress !== 'number' || isNaN(progress)) {\r\n progress = 0;\r\n } else {\r\n progress = Math.min(Math.max(progress, 0), 100);\r\n }\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { CircledTick, CircledX, THEME } from '@ui';\r\n\r\nimport { useDti } from '../../../../ModernScripts/Spotlight/Hooks/use-data-test-id';\r\nimport { ImportStatuses } from './DataSourcePanel';\r\n\r\nexport const Status: React.FC> = ({ status, progress = 0, excelErrors }) => {\r\n const dti = {\r\n importStatus: useDti('div-import-status'),\r\n importStatusSuccess: useDti('p-import-status-success'),\r\n importStatusError: useDti('p-import-status-error'),\r\n };\r\n\r\n if (status === ImportStatuses.ImportComplete) {\r\n return (\r\n \r\n

\r\n \r\n \r\n \r\n Data successfully imported\r\n

\r\n \r\n );\r\n } else if (status === ImportStatuses.ImportCompleteWithErrors) {\r\n return (\r\n \r\n

\r\n \r\n \r\n \r\n {excelErrors\r\n ? `Data imported, with ${excelErrors.length} ${excelErrors.length === 1 ? 'error' : 'errors'}`\r\n : 'Data imported with errors'}\r\n

\r\n \r\n );\r\n } else if (status === ImportStatuses.Importing) {\r\n return (\r\n \r\n

Importing {progress}%

\r\n \r\n );\r\n } else if (status === ImportStatuses.ImportCancelled) {\r\n return (\r\n \r\n

\r\n {/* TODO: FI-127 cancelled icon */}\r\n Import cancelled\r\n

\r\n \r\n );\r\n } else if (status === ImportStatuses.ImportFail) {\r\n return (\r\n \r\n

\r\n \r\n \r\n \r\n Import failed, please try again\r\n

\r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { Button } from '@ui';\r\nimport classNames from 'classnames';\r\n\r\nimport { ImportError } from '../../Services/ApiResponseModels';\r\nimport { ImportStatuses } from './DataSourcePanel';\r\nimport { ExcelErrors } from './ExcelErrors';\r\nimport { ImportProgressBar } from './ImportProgressBar';\r\nimport { Status } from './Status';\r\n\r\ninterface ImportControl {\r\n importStatus: ImportStatuses;\r\n importHandler: React.MouseEventHandler;\r\n cancelImportHandler: React.MouseEventHandler;\r\n importButtonDisabled: boolean;\r\n /** progress as a percentage */\r\n importProgress: number;\r\n excelErrors?: ImportError[];\r\n}\r\n\r\nexport const ImportControl: React.FC> = ({\r\n importStatus,\r\n importHandler,\r\n cancelImportHandler,\r\n importButtonDisabled,\r\n importProgress,\r\n excelErrors,\r\n}) => {\r\n const displayImportButton = [\r\n ImportStatuses.Ready,\r\n ImportStatuses.ImportFail,\r\n ImportStatuses.ImportCancelled,\r\n ImportStatuses.ImportComplete,\r\n ImportStatuses.ImportCompleteWithErrors,\r\n ].includes(importStatus);\r\n const displayImportStatus = [\r\n ImportStatuses.Importing,\r\n ImportStatuses.ImportComplete,\r\n ImportStatuses.ImportCompleteWithErrors,\r\n ImportStatuses.ImportCancelled,\r\n ImportStatuses.ImportFail,\r\n ].includes(importStatus);\r\n const displayExcelErrors = importStatus === ImportStatuses.ImportCompleteWithErrors && excelErrors;\r\n const isImporting = importStatus === ImportStatuses.Importing;\r\n const isComplete =\r\n importStatus === ImportStatuses.ImportComplete || importStatus === ImportStatuses.ImportCompleteWithErrors;\r\n return (\r\n \r\n {isImporting && }\r\n
\r\n {displayImportStatus && (\r\n
\r\n \r\n {isImporting && (\r\n \r\n Cancel Import\r\n \r\n )}\r\n
\r\n )}\r\n {displayImportButton && (\r\n
\r\n \r\n Import Data\r\n \r\n
\r\n )}\r\n
\r\n {displayExcelErrors && }\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useRef, useState } from 'react';\r\n\r\nimport { ImportError } from '../../Services/ApiResponseModels';\r\nimport { ProductTypes } from './Constants';\r\nimport { DataSourceViews, ImportStatuses } from './DataSourcePanel';\r\nimport { ExcelUpload } from './ExcelUpload';\r\nimport { ImportControl } from './ImportControl';\r\n\r\ninterface ExcelProps {\r\n productType: ProductTypes;\r\n viewState: DataSourceViews;\r\n importStatus: ImportStatuses;\r\n uploadHandler: React.ChangeEventHandler;\r\n importHandler: React.MouseEventHandler;\r\n cancelImportHandler: React.MouseEventHandler;\r\n importProgress: number;\r\n errors?: ImportError[];\r\n}\r\n\r\nexport enum UploadStates {\r\n SelectFile = 'SELECT_FILE',\r\n UploadingFile = 'UPLOADING_FILE',\r\n UploadFileSuccess = 'UPLOAD_FILE_SUCCESS',\r\n}\r\n\r\nexport const Excel: React.FC> = ({\r\n productType,\r\n viewState,\r\n importStatus,\r\n uploadHandler,\r\n importHandler,\r\n cancelImportHandler,\r\n importProgress,\r\n errors,\r\n}) => {\r\n const [fileName, setFileName] = useState();\r\n const fileInputRef = useRef();\r\n\r\n const innerUploadHandler = (e) => {\r\n uploadHandler(e);\r\n setFileName((fileInputRef as any).current.files[0].name);\r\n };\r\n\r\n return (\r\n <>\r\n
\r\n {[DataSourceViews.UploadFile, DataSourceViews.UploadingFile].includes(viewState) && (\r\n <>\r\n \r\n \r\n \r\n )}\r\n {viewState === DataSourceViews.UploadFileSuccess && (\r\n <>\r\n \r\n \r\n \r\n )}\r\n {viewState === DataSourceViews.Importing && (\r\n <>\r\n
\r\n

\r\n Importing{' '}\r\n \r\n ‘{fileName}’\r\n \r\n

\r\n
\r\n \r\n \r\n )}\r\n {(viewState === DataSourceViews.ImportComplete ||\r\n viewState === DataSourceViews.ImportCompleteWithErrors) && (\r\n <>\r\n
\r\n

\r\n Imported{' '}\r\n \r\n ‘{fileName}’\r\n \r\n

\r\n \r\n
\r\n \r\n \r\n )}\r\n {viewState === DataSourceViews.ImportFail && (\r\n <>\r\n
\r\n

\r\n Failed to import{' '}\r\n \r\n ‘{fileName}’\r\n \r\n

\r\n \r\n
\r\n \r\n \r\n )}\r\n {viewState === DataSourceViews.ImportCancelled && (\r\n <>\r\n
\r\n

\r\n Import{' '}\r\n \r\n ‘{fileName}’\r\n {' '}\r\n cancelled\r\n

\r\n
\r\n \r\n \r\n )}\r\n
\r\n
\r\n
\r\n

\r\n Check out the documentation on importing from Excel for more information.\r\n

\r\n

\r\n \r\n Excel import guide\r\n \r\n

\r\n

\r\n \r\n Troubleshooting excel import issues\r\n \r\n

\r\n
\r\n
\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useState } from 'react';\r\n\r\nimport { Button, TextInput, PasswordField } from '@ui';\r\n\r\ninterface AuthCompanyFileProps {\r\n dataSourceId: string;\r\n openCompanyFile: any;\r\n selectedCompanyFileId: string;\r\n Error?: React.FC>;\r\n}\r\n\r\nexport const AuthCompanyFile: React.FC> = ({\r\n dataSourceId,\r\n openCompanyFile,\r\n selectedCompanyFileId,\r\n Error,\r\n}) => {\r\n const [user, setUser] = useState('');\r\n const [password, setPassword] = useState('');\r\n\r\n const userChanged = (e) => {\r\n const val = e.target.value;\r\n setUser(val);\r\n };\r\n\r\n const passChanged = (e) => {\r\n const val = e.target.value;\r\n setPassword(val);\r\n };\r\n\r\n const handleOpenFile = (e) => {\r\n openCompanyFile({ e, user, password, selectedCompanyFileId });\r\n };\r\n\r\n return (\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n Open file\r\n \r\n
\r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { Button } from '@ui';\r\n\r\nimport SRSelect2 from '../SRSelect2';\r\nimport { AuthCompanyFile } from './AuthCompanyFile';\r\nimport { CompanyFileErrorTypes } from './Constants';\r\nimport { CompanyFileOptions } from './Interfaces';\r\n\r\ninterface ChooseCompanyFile {\r\n onChangeCompanyFile: React.ChangeEventHandler;\r\n openCompanyFile: ({ selectedCompanyFileId }: { selectedCompanyFileId: string }) => void;\r\n companyFileOptions: CompanyFileOptions[];\r\n selectedCompanyFileId: string;\r\n dataSourceId: string;\r\n requiresAuth: boolean;\r\n companyFileError?: CompanyFileErrorTypes.InvalidCredentials;\r\n}\r\n\r\nexport const ChooseCompanyFile: React.FC> = ({\r\n onChangeCompanyFile,\r\n openCompanyFile,\r\n companyFileOptions,\r\n selectedCompanyFileId = '',\r\n dataSourceId,\r\n requiresAuth,\r\n companyFileError,\r\n}) => {\r\n const handleOpenFile = () => {\r\n openCompanyFile({ selectedCompanyFileId });\r\n };\r\n\r\n const showFileOptions = companyFileOptions.map((files) => {\r\n return {\r\n text: files.name,\r\n value: files.value,\r\n };\r\n });\r\n\r\n const InvalidAuthError: React.FC> = () => {\r\n return companyFileError === CompanyFileErrorTypes.InvalidCredentials ? (\r\n
\r\n

The username and/or password used was incorrect.

\r\n
\r\n ) : null;\r\n };\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n \r\n \r\n
\r\n {!requiresAuth && (\r\n \r\n Open file\r\n \r\n )}\r\n
\r\n {requiresAuth && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { Button, LoadingSpinner } from '@ui';\r\n\r\nimport { ChooseCompanyFile } from './ChooseCompanyFile';\r\nimport { CompanyFileErrorTypes } from './Constants';\r\nimport { DataSourceViews } from './DataSourcePanel';\r\nimport { CompanyFileOptions } from './Interfaces';\r\n\r\nconst ChooseCompanyFileView = ({\r\n onChangeCompanyFile,\r\n openCompanyFile,\r\n companyFileOptions,\r\n selectedCompanyFileId,\r\n dataSourceId,\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\nconst AuthenticateCompanyFileView = ({\r\n onChangeCompanyFile,\r\n openCompanyFile,\r\n companyFileOptions,\r\n selectedCompanyFileId,\r\n dataSourceId,\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\nconst AuthenticatingCompanyFileView = () => {\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n \r\n

Authenticating company file

\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nconst AuthenticatingCompanyFileFailView: React.FC<\r\n React.PropsWithChildren<{\r\n onChangeCompanyFile: any;\r\n openCompanyFile: any;\r\n companyFileOptions: CompanyFileOptions[];\r\n selectedCompanyFileId: string;\r\n dataSourceId: string;\r\n companyFileError: CompanyFileErrorTypes;\r\n connectHandler: any;\r\n }>\r\n> = ({\r\n onChangeCompanyFile,\r\n openCompanyFile,\r\n companyFileOptions,\r\n selectedCompanyFileId,\r\n dataSourceId,\r\n companyFileError,\r\n connectHandler,\r\n}) => {\r\n const InnerView = () => {\r\n switch (companyFileError) {\r\n case CompanyFileErrorTypes.InvalidCredentials:\r\n return (\r\n \r\n );\r\n case CompanyFileErrorTypes.TokenExpired:\r\n // the authentication token has expired and the user will need to reauthenticate\r\n return (\r\n
\r\n

Authentication expired. Please reconnect.

\r\n \r\n Connect\r\n \r\n
\r\n );\r\n case CompanyFileErrorTypes.InvalidCompanyFile:\r\n return (\r\n <>\r\n
\r\n

Invalid company file.

\r\n
\r\n \r\n \r\n );\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport const CompanyFileViews: React.FC<\r\n React.PropsWithChildren<{\r\n viewState: DataSourceViews;\r\n onChangeCompanyFile: any;\r\n openCompanyFile: any;\r\n companyFileOptions: CompanyFileOptions[];\r\n selectedCompanyFileId: string;\r\n dataSourceId: string;\r\n companyFileError?: CompanyFileErrorTypes;\r\n connectHandler: any;\r\n }>\r\n> = ({\r\n viewState,\r\n onChangeCompanyFile,\r\n openCompanyFile,\r\n companyFileOptions,\r\n selectedCompanyFileId,\r\n dataSourceId,\r\n companyFileError,\r\n connectHandler,\r\n}) => {\r\n switch (viewState) {\r\n case DataSourceViews.ChooseCompanyFile:\r\n return (\r\n \r\n );\r\n case DataSourceViews.NoCompanyFilesAvailable:\r\n return (\r\n
\r\n

\r\n No company files were available. Please reconnect and try again.\r\n

\r\n \r\n Connect\r\n \r\n
\r\n );\r\n case DataSourceViews.AuthenticateCompanyFile:\r\n return (\r\n \r\n );\r\n case DataSourceViews.AuthenticatingCompanyFile:\r\n return ;\r\n case DataSourceViews.AuthenticatingCompanyFileFail:\r\n return (\r\n \r\n );\r\n default:\r\n return null;\r\n }\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { AutoCompleteTextField, Button, LoadingSpinner, THEME } from '@ui';\r\nimport classNames from 'classnames';\r\n\r\nimport { DataSourceCodes } from './Constants';\r\nimport { DataSourceViews } from './DataSourcePanel';\r\n\r\ninterface ConnectViews {\r\n viewState: DataSourceViews;\r\n /** Slot for the connect view */\r\n connectView: React.ReactElement;\r\n /** Slot for the insufficient access view */\r\n insufficientAccessView?: React.ReactElement;\r\n /** Slot for linked file not authenticated view */\r\n linkedFileNotAuthenticatedView?: React.ReactElement;\r\n desktopConnectorId?: string;\r\n /** A way for the user to leave the loading state, and go back to their previous view */\r\n returnToLastViewFn: () => void;\r\n}\r\n\r\ninterface ConnectView {\r\n connectHandler: React.MouseEventHandler;\r\n}\r\n\r\ninterface LinkedFileNotAuthenticatedView {\r\n connectHandler: React.MouseEventHandler;\r\n}\r\ninterface DesktopConnectView {\r\n desktopConnectorIdHandler: (value: string) => void;\r\n code: DataSourceCodes;\r\n}\r\n\r\nconst helpCentreUrlsMap: Map = new Map([\r\n [\r\n DataSourceCodes.MYOBAccountRightDesktop,\r\n 'https://help.spotlightreporting.com/reporting/myob-accountright-desktop',\r\n ],\r\n [DataSourceCodes.QuickBooksDesktop, 'https://help.spotlightreporting.com/reporting/quickbooks-desktop'],\r\n [DataSourceCodes.Sage50Desktop, 'https://help.spotlightreporting.com/reporting/sage-50-accounts'],\r\n]);\r\n\r\nexport const DesktopConnectView: React.FC> = ({\r\n desktopConnectorIdHandler,\r\n code,\r\n}) => {\r\n const [desktopConnectorIds, setDesktopConnectorIds] = React.useState([]);\r\n const localStorageKey = 'desktopConnectorIds';\r\n\r\n React.useEffect(() => {\r\n const items = JSON.parse(localStorage.getItem(localStorageKey));\r\n if (items) {\r\n setDesktopConnectorIds(items);\r\n }\r\n }, []);\r\n\r\n const insertItem = (value: string): void => {\r\n if (!value || value === '') return;\r\n const itemIndex = desktopConnectorIds.indexOf(value);\r\n if (itemIndex !== -1) {\r\n desktopConnectorIdHandler(value);\r\n return; // If it already exists, don't add it again\r\n }\r\n const newArrayOfIds = [value, ...desktopConnectorIds];\r\n setDesktopConnectorIds(newArrayOfIds);\r\n localStorage.setItem(localStorageKey, JSON.stringify(newArrayOfIds));\r\n desktopConnectorIdHandler(value);\r\n };\r\n\r\n const removeItem = (value: string): void => {\r\n const itemIndex = desktopConnectorIds.indexOf(value);\r\n if (itemIndex !== -1) {\r\n desktopConnectorIds.splice(itemIndex, 1);\r\n setDesktopConnectorIds([...desktopConnectorIds]);\r\n localStorage.setItem(localStorageKey, JSON.stringify([...desktopConnectorIds]));\r\n }\r\n };\r\n\r\n const dropdownOnChange = (value: string, command: unknown) => {\r\n const trimmedValue = value?.trim();\r\n if (command === 'INSERT') {\r\n insertItem(trimmedValue);\r\n } else {\r\n removeItem(value);\r\n }\r\n };\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n Connect the desktop connector to Spotlight\r\n

\r\n \r\n \r\n Don't have it installed? Go to Help Centre to\r\n find out how.\r\n

\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport const ConnectView: React.FC> = ({ connectHandler }) => {\r\n return (\r\n
\r\n
\r\n
\r\n

To import, first connect to the datasource.

\r\n \r\n Connect\r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport const LinkedFileNotAuthenticatedView: React.FC> = ({\r\n connectHandler,\r\n}) => {\r\n return (\r\n
\r\n
\r\n
\r\n

\r\n The linked organisation is no longer authenticated. Please reconnect and allow access to the\r\n organisation.\r\n

\r\n \r\n Connect\r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport const XeroConnectInsufficientAccessView: React.FC>> = () => {\r\n return (\r\n
\r\n
\r\n
\r\n

Insufficient Xero access

\r\n

You do not currently have the required Xero user role for this organisation.

\r\n

\r\n To import data to Spotlight, you will need at least "Adviser" or "Standard (with\r\n Reports)" access to the Xero organisation.\r\n

\r\n

\r\n To continue, please contact your Xero administrator for access.\r\n

\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport const ConnectViews: React.FC> = ({\r\n viewState,\r\n connectView,\r\n insufficientAccessView = null,\r\n linkedFileNotAuthenticatedView = null,\r\n desktopConnectorId = null,\r\n returnToLastViewFn,\r\n}) => {\r\n switch (viewState) {\r\n case DataSourceViews.ConnectInsufficientAccess:\r\n return insufficientAccessView;\r\n case DataSourceViews.LinkedFileNotAuthenticated:\r\n return linkedFileNotAuthenticatedView;\r\n case DataSourceViews.Connect:\r\n return connectView;\r\n case DataSourceViews.Connecting:\r\n return (\r\n
\r\n
\r\n
\r\n Connecting\r\n
\r\n
\r\n
\r\n );\r\n case DataSourceViews.ConnectSuccess:\r\n return (\r\n
\r\n
\r\n
Connected!
\r\n
\r\n
\r\n );\r\n case DataSourceViews.ConnectFail:\r\n return (\r\n
\r\n
\r\n
Failed to connect.
\r\n
\r\n
\r\n );\r\n case DataSourceViews.Authenticating:\r\n return (\r\n
\r\n
\r\n
\r\n {' '}\r\n Authenticating\r\n
\r\n
\r\n
\r\n );\r\n case DataSourceViews.FetchingDesktopFiles:\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n

Fetching company files

\r\n \r\n Cancel\r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n case DataSourceViews.Pairing:\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n

Attempting to connect to {desktopConnectorId}

\r\n

Please confirm the pairing in the desktop connector.

\r\n \r\n Cancel\r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n default:\r\n return null;\r\n }\r\n};\r\n","import React from 'react';\r\n\r\nimport { Button } from '@ui';\r\n\r\nimport { ErrorMap, NetworkErrorCodes } from './Constants';\r\n\r\ninterface NetworkError {\r\n errorCode: NetworkErrorCodes;\r\n stateTransitionFn: () => void;\r\n}\r\n\r\nexport const NetworkError: React.FC> = ({ errorCode, stateTransitionFn }) => {\r\n return (\r\n
\r\n
\r\n
{ErrorMap.get(errorCode)}
\r\n {stateTransitionFn && (\r\n \r\n )}\r\n
\r\n
\r\n );\r\n};\r\n","import React from 'react';\r\n\r\nimport { Button } from '@ui';\r\nimport { InfoCircleSolid, XmarkCircleSolid } from 'iconoir-react';\r\n\r\nimport { COLOR } from '../../../../ModernScripts/Spotlight/Common/themes';\r\nimport { NetworkErrorCodes } from './Constants';\r\n\r\ninterface NetworkErrorGoogleSheets {\r\n errorCode: NetworkErrorCodes;\r\n createFn: React.MouseEventHandler;\r\n connectFn: React.MouseEventHandler;\r\n isCreating: boolean;\r\n}\r\n\r\nexport const NetworkErrorGoogleSheets: React.FC> = ({\r\n errorCode,\r\n createFn,\r\n connectFn,\r\n isCreating,\r\n}) => {\r\n const Connect = (\r\n <>\r\n \r\n

Your Google Sheets account is currently disconnected. To import additional data please reconnect:

\r\n \r\n Reconnect\r\n \r\n \r\n );\r\n\r\n const Create = (\r\n <>\r\n \r\n

Unable to locate the Spotlight Template in your Google Sheets account.

\r\n \r\n Create new template\r\n \r\n \r\n );\r\n\r\n const GetFailed = (\r\n <>\r\n \r\n

\r\n Sorry we were unable to connect to Google Sheets. Please refresh the page to try again. If this\r\n continues to happen, please email our support desk at{' '}\r\n support@spotlightreporting.com\r\n

\r\n \r\n );\r\n\r\n const CreateFailed = (\r\n <>\r\n \r\n

\r\n Sorry we were unable to create the Spotlight Template in your Google Sheets account. If this continues\r\n to happen, please email our support desk at{' '}\r\n support@spotlightreporting.com\r\n

\r\n \r\n Create new template\r\n \r\n \r\n );\r\n\r\n return (\r\n
\r\n
\r\n
\r\n {errorCode === NetworkErrorCodes.GoogleSpreadsheetUnauthorised && Connect}\r\n {errorCode === NetworkErrorCodes.GoogleSpreadsheetNotFound && Create}\r\n {errorCode === NetworkErrorCodes.GoogleSpreadsheetGetFailed && GetFailed}\r\n {errorCode === NetworkErrorCodes.GoogleSpreadsheetCreateFailed && CreateFailed}\r\n
\r\n {errorCode === NetworkErrorCodes.GoogleSpreadsheetUnauthorised && (\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\nimport { ErrorMessage } from '@hookform/error-message';\r\nimport { CheckboxInput, MonthDatePicker } from '@ui';\r\nimport classNames from 'classnames';\r\nimport dayjs from 'dayjs';\r\nimport { Controller, useForm } from 'react-hook-form';\r\n\r\nimport { GoogleSheetsLinkButton } from '../../../../ModernScripts/Spotlight/Common/Report/Wizard/ImportData/DataSources/Steps/ImportSettings/import-settings-google-sheets';\r\nimport { useDti } from '../../../../ModernScripts/Spotlight/Hooks/use-data-test-id';\r\nimport { DataSourceActionTypes, DataSourceActions } from './DataSourceActions';\r\n\r\ninterface SettingsProps {\r\n disabled: boolean;\r\n actionHandler: (action: DataSourceActions, dispatch: React.Dispatch) => void;\r\n dispatch: React.Dispatch;\r\n dataSourceId: string;\r\n name: string;\r\n actuals: boolean;\r\n budget: boolean;\r\n actualsTo: string;\r\n budgetFrom: string;\r\n budgetTo: string;\r\n hasTrackingActuals: boolean;\r\n hasTrackingBudget: boolean;\r\n trackingActualsSelected: boolean;\r\n trackingBudgetSelected: boolean;\r\n actualsFrom: string;\r\n importButtonDisabled: boolean;\r\n spreadsheetUrl?: string;\r\n}\r\n\r\n// interface for our form - formatted for the UI\r\ninterface FormData {\r\n actuals_import_from_date: string;\r\n actuals_import_to_date: string;\r\n budget_import_from_date: string;\r\n budget_import_to_date: string;\r\n}\r\n\r\nexport const Settings: React.FC> = ({\r\n disabled,\r\n actuals,\r\n budget,\r\n actualsTo,\r\n actualsFrom,\r\n budgetTo,\r\n budgetFrom,\r\n hasTrackingActuals,\r\n hasTrackingBudget,\r\n trackingActualsSelected,\r\n trackingBudgetSelected,\r\n dataSourceId,\r\n name,\r\n importButtonDisabled,\r\n dispatch,\r\n actionHandler,\r\n spreadsheetUrl,\r\n}) => {\r\n const mapDatesToForm = (actualsFrom: string, actualsTo: string, budgetFrom: string, budgetTo: string): FormData => {\r\n return {\r\n actuals_import_from_date: actualsFrom,\r\n actuals_import_to_date: actualsTo,\r\n budget_import_from_date: budgetFrom,\r\n budget_import_to_date: budgetTo,\r\n };\r\n };\r\n\r\n const renderErrorMessages = (messages: Record) => {\r\n const errorMessages = Object.entries(messages).map(([type, message]) => (\r\n

\r\n {message}\r\n

\r\n ));\r\n return
{errorMessages}
;\r\n };\r\n\r\n const {\r\n control,\r\n formState: { errors },\r\n getValues,\r\n trigger,\r\n } = useForm({\r\n criteriaMode: 'all',\r\n reValidateMode: 'onBlur',\r\n defaultValues: mapDatesToForm(actualsFrom, actualsTo, budgetFrom, budgetTo),\r\n });\r\n\r\n React.useEffect(() => {\r\n const userHasSelectedAnOption = actuals || budget;\r\n const anErrorExists = Object.values(errors).length !== 0;\r\n if (anErrorExists && userHasSelectedAnOption && !importButtonDisabled) {\r\n /**\r\n * We only ever disable the button here, the reducer takes care of re-enabling it when dates or checkboxes change.\r\n * The reason for this is because of how often re-renders are triggered here, which makes it difficult to know the most up-to-date state.\r\n * Also MonthDatePicker and react-state-form controllers don't seem to play particularly nice with each other.\r\n */\r\n actionHandler(\r\n { type: DataSourceActionTypes.SetImportButton, payload: { dataSourceId, value: true } },\r\n dispatch,\r\n );\r\n }\r\n }, [importButtonDisabled, errors]);\r\n\r\n const checkboxChangeHandler = (e, name) => {\r\n actionHandler(\r\n { type: DataSourceActionTypes.SetCheckBox, payload: { dataSourceId, name, value: e.target.checked } },\r\n dispatch,\r\n );\r\n };\r\n\r\n const changeDateHandler = ({ name, year, monthIndex, fieldChangeHandler, triggers }) => {\r\n if (typeof year === 'undefined' || typeof monthIndex === 'undefined') {\r\n return;\r\n }\r\n if (typeof monthIndex === 'number' && typeof year === 'number') {\r\n // TODO: maybe we can fix this so we don't have to always check - it's always calling the change function on render which is a problem\r\n let d = dayjs();\r\n d = d.month(monthIndex);\r\n d = d.year(year);\r\n d = d.date(1);\r\n const dString = d.format('YYYY-MM');\r\n trigger(triggers);\r\n if (name === 'actuals_import_from_date' && dString === actualsFrom) return;\r\n else if (name === 'actuals_import_to_date' && dString === actualsTo) return;\r\n else if (name === 'budget_import_from_date' && dString === budgetFrom) return;\r\n else if (name === 'budget_import_to_date' && dString === budgetTo) return;\r\n if (fieldChangeHandler) {\r\n fieldChangeHandler(dString);\r\n trigger(triggers);\r\n actionHandler(\r\n {\r\n type: DataSourceActionTypes.SetDate,\r\n payload: { dataSourceId, name, value: { year, monthIndex } },\r\n },\r\n dispatch,\r\n );\r\n }\r\n }\r\n };\r\n\r\n const dti = {\r\n actualsImportFromDate: useDti('input-actuals-import-from-date'),\r\n actualsImportToDate: useDti('input-actuals-import-to-date'),\r\n budgetImportFromDate: useDti('input-budget-import-from-date'),\r\n budgetImportToDate: useDti('input-budget-import-to-date'),\r\n importTrackingActuals: useDti('checkbox-import-tracking-actuals'),\r\n importTrackingBudget: useDti('checkbox-import-tracking-budget'),\r\n };\r\n\r\n return (\r\n
\r\n {spreadsheetUrl && (\r\n <>\r\n
\r\n

Your linked file

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

What would you like to import?

\r\n \r\n )}\r\n
\r\n
\r\n
\r\n
\r\n checkboxChangeHandler(e, 'actuals')}\r\n disabled={disabled}\r\n />\r\n
\r\n \r\n \r\n (\r\n
\r\n \r\n changeDateHandler({\r\n name,\r\n year,\r\n monthIndex,\r\n fieldChangeHandler: onChange,\r\n triggers: ['actuals_import_from_date', 'actuals_import_to_date'],\r\n })\r\n }\r\n />\r\n {/* @ts-ignore */}\r\n {Object.values(errors).filter((x) => x.ref?.name === 'actuals_import_from_date')\r\n .length > 0 && (\r\n messages && renderErrorMessages(messages)}\r\n />\r\n )}\r\n
\r\n )}\r\n rules={{\r\n validate: {\r\n actualsInThePast: (value) =>\r\n !actuals ||\r\n dayjs(value).isSame(dayjs().startOf('month')) ||\r\n dayjs(value).isBefore(dayjs().startOf('month')) ||\r\n 'Date must be in the past.',\r\n },\r\n }}\r\n />\r\n \r\n (\r\n
\r\n \r\n changeDateHandler({\r\n name,\r\n year,\r\n monthIndex,\r\n fieldChangeHandler: onChange,\r\n triggers: ['actuals_import_from_date', 'actuals_import_to_date'],\r\n })\r\n }\r\n />\r\n {/* @ts-ignore */}\r\n {Object.values(errors).filter((x) => x.ref?.name === 'actuals_import_to_date')\r\n .length > 0 && (\r\n messages && renderErrorMessages(messages)}\r\n />\r\n )}\r\n
\r\n )}\r\n rules={{\r\n validate: {\r\n afterActualsFrom: (value) =>\r\n !actuals ||\r\n dayjs(value).isSame(dayjs(getValues('actuals_import_from_date'))) ||\r\n dayjs(value).isAfter(dayjs(getValues('actuals_import_from_date'))) ||\r\n 'Date must be after from date.',\r\n actualsInThePast: (value) =>\r\n !actuals ||\r\n dayjs(value).isSame(dayjs().startOf('month')) ||\r\n dayjs(value).isBefore(dayjs().startOf('month')) ||\r\n 'Date must be in the past.',\r\n },\r\n }}\r\n />\r\n {hasTrackingActuals && (\r\n checkboxChangeHandler(e, 'tracking_actuals')}\r\n thinLabel={true}\r\n disabled={!actuals || disabled}\r\n />\r\n )}\r\n
\r\n
\r\n
\r\n
\r\n checkboxChangeHandler(e, 'budget')}\r\n disabled={disabled}\r\n />\r\n
\r\n \r\n \r\n (\r\n
\r\n \r\n changeDateHandler({\r\n name,\r\n year,\r\n monthIndex,\r\n fieldChangeHandler: onChange,\r\n triggers: ['budget_import_from_date', 'budget_import_to_date'],\r\n })\r\n }\r\n />\r\n
\r\n )}\r\n />\r\n \r\n (\r\n
\r\n \r\n changeDateHandler({\r\n name,\r\n year,\r\n monthIndex,\r\n fieldChangeHandler: onChange,\r\n triggers: ['budget_import_from_date', 'budget_import_to_date'],\r\n })\r\n }\r\n />\r\n {/* @ts-ignore */}\r\n {Object.values(errors).filter((x) => x.ref?.name === 'budget_import_to_date')\r\n .length > 0 && (\r\n messages && renderErrorMessages(messages)}\r\n />\r\n )}\r\n
\r\n )}\r\n rules={{\r\n validate: {\r\n afterBudgetFrom: (value) =>\r\n !budget ||\r\n dayjs(value).isSame(dayjs(getValues('budget_import_from_date'))) ||\r\n dayjs(value).isAfter(dayjs(getValues('budget_import_from_date'))) ||\r\n 'Date must be after from date.',\r\n },\r\n }}\r\n />\r\n {hasTrackingBudget && (\r\n checkboxChangeHandler(e, 'tracking_budget')}\r\n thinLabel={true}\r\n disabled={!budget || disabled}\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 { useState } from 'react';\r\n\r\nimport { LoadingSpinner } from '@ui';\r\n\r\nimport { ImportError } from '../../Services/ApiResponseModels';\r\nimport RestService from '../../Services/RestService';\r\nimport { CompanyFileViews } from './CompanyFileViews';\r\nimport {\r\n ConnectView,\r\n ConnectViews,\r\n LinkedFileNotAuthenticatedView,\r\n XeroConnectInsufficientAccessView,\r\n} from './ConnectViews';\r\nimport { DataSourceCodes, NetworkErrorCodes } from './Constants';\r\nimport { DataSourceActionTypes } from './DataSourceActions';\r\nimport { DataSourceAppActionTypes } from './DataSourceAppActions';\r\nimport { DataSourcePanelProps, DataSourceViews, OpenCompanyFile } from './DataSourcePanel';\r\nimport { ImportControl } from './ImportControl';\r\nimport { CompanyFileOptions } from './Interfaces';\r\nimport { NetworkError } from './NetworkError';\r\nimport { NetworkErrorGoogleSheets } from './NetworkErrorGoogleSheets';\r\nimport { Settings } from './Settings';\r\n\r\ninterface StandardCloudProps\r\n extends Omit<\r\n DataSourcePanelProps,\r\n 'dataSourceProviderName' | 'lastImportedDate' | 'importedToDate' | 'productType'\r\n > {\r\n importHandler: React.MouseEventHandler;\r\n cancelImportHandler: React.MouseEventHandler;\r\n connectHandler: React.MouseEventHandler;\r\n openCompanyFile: OpenCompanyFile;\r\n onChangeCompanyFile: React.ChangeEventHandler;\r\n importStatus: any;\r\n selectedCompanyFileId: string;\r\n companyFileOptions: CompanyFileOptions[];\r\n errors?: ImportError[];\r\n spreadsheetUrl?: string;\r\n}\r\n\r\ninterface InsufficientAccessViewProps {\r\n code: DataSourceCodes;\r\n}\r\n\r\ninterface CloudLinkedFileNotAuthenticatedView {\r\n connectHandler: React.MouseEventHandler;\r\n}\r\n\r\nconst SettingsView = ({\r\n dataSourceId,\r\n name,\r\n isSettingsDisabled,\r\n dispatch,\r\n actionHandler,\r\n actuals,\r\n budget,\r\n hasTrackingActuals,\r\n hasTrackingBudget,\r\n trackingActualsSelected,\r\n trackingBudgetSelected,\r\n actualsFrom,\r\n actualsTo,\r\n budgetFrom,\r\n budgetTo,\r\n importStatus,\r\n importHandler,\r\n importProgress,\r\n cancelImportHandler,\r\n isImportButtonDisabled,\r\n errors,\r\n spreadsheetUrl,\r\n}) => {\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport const StandardCloud: React.FC> = ({\r\n actuals,\r\n budget,\r\n hasTrackingActuals,\r\n hasTrackingBudget,\r\n trackingActualsSelected,\r\n trackingBudgetSelected,\r\n actualsFrom,\r\n actualsTo,\r\n budgetFrom,\r\n budgetTo,\r\n dataSourceId,\r\n code,\r\n name,\r\n actionHandler,\r\n dispatch,\r\n viewState,\r\n importButtonDisabled,\r\n importProgress,\r\n importStatus,\r\n importHandler,\r\n cancelImportHandler,\r\n connectHandler,\r\n companyFileOptions,\r\n selectedCompanyFileId = '',\r\n openCompanyFile,\r\n onChangeCompanyFile,\r\n companyFileError,\r\n errorCode,\r\n safeViewState,\r\n errors,\r\n spreadsheetUrl,\r\n}) => {\r\n const isGoogleSheets = code === DataSourceCodes.GoogleSheets;\r\n const [isCreating, setIsCreating] = useState(false);\r\n\r\n let isSettingsDisabled = false;\r\n if (viewState === DataSourceViews.Importing) {\r\n isSettingsDisabled = true;\r\n }\r\n\r\n const transitionAwayFromError = () => {\r\n actionHandler(\r\n {\r\n type: DataSourceActionTypes.TransitionAwayFromErrorView,\r\n payload: { dataSourceId },\r\n },\r\n dispatch,\r\n );\r\n };\r\n\r\n const createHandler = () => {\r\n setIsCreating(true);\r\n\r\n RestService.CreateGoogleSpreadsheet(dataSourceId)\r\n .then((response) => {\r\n dispatch({\r\n type: DataSourceAppActionTypes.GetGoogleSheetsSuccess,\r\n payload: {\r\n dataSourceId,\r\n name: response.data.properties.title,\r\n spreadsheetUrl: response.data.spreadsheetUrl,\r\n },\r\n });\r\n })\r\n .catch((error) => {\r\n if ([401, 403].includes(error.status)) {\r\n dispatch({\r\n type: DataSourceAppActionTypes.DataSourceNetworkError,\r\n payload: {\r\n dataSourceId: dataSourceId,\r\n errorCode: NetworkErrorCodes.GoogleSpreadsheetUnauthorised,\r\n },\r\n });\r\n } else {\r\n dispatch({\r\n type: DataSourceAppActionTypes.DataSourceNetworkError,\r\n payload: {\r\n dataSourceId: dataSourceId,\r\n errorCode: NetworkErrorCodes.GoogleSpreadsheetCreateFailed,\r\n },\r\n });\r\n }\r\n });\r\n };\r\n\r\n const returnToLastView = () => {\r\n actionHandler(\r\n {\r\n type: DataSourceActionTypes.TransitionView,\r\n payload: { dataSourceId, viewState: safeViewState },\r\n },\r\n dispatch,\r\n );\r\n };\r\n\r\n const Settings = () => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n const InsufficientAccessView: React.FC> = ({ code }) => {\r\n if (code === DataSourceCodes.Xero) {\r\n return ;\r\n }\r\n return null;\r\n };\r\n\r\n const CloudLinkedFileNotAuthenticatedView: React.FC<\r\n React.PropsWithChildren\r\n > = ({ connectHandler }) => {\r\n return ;\r\n };\r\n\r\n return (\r\n <>\r\n }\r\n linkedFileNotAuthenticatedView={}\r\n connectView={}\r\n returnToLastViewFn={returnToLastView}\r\n />\r\n \r\n {viewState === DataSourceViews.LoadingImportSettings && (\r\n
\r\n
\r\n
\r\n {' '}\r\n Loading import settings\r\n
\r\n
\r\n
\r\n )}\r\n {viewState === DataSourceViews.Settings && }\r\n {viewState === DataSourceViews.Importing && }\r\n {viewState === DataSourceViews.ImportComplete && }\r\n {viewState === DataSourceViews.ImportCompleteWithErrors && }\r\n {viewState === DataSourceViews.ImportCancelled && }\r\n {viewState === DataSourceViews.ImportFail && }\r\n {viewState === DataSourceViews.NetworkError && !isGoogleSheets && (\r\n \r\n )}\r\n {viewState === DataSourceViews.NetworkError && isGoogleSheets && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { Button, LoadingSpinner, THEME } from '@ui';\r\n\r\nimport { CompanyFileViews } from './CompanyFileViews';\r\nimport { ConnectViews, DesktopConnectView } from './ConnectViews';\r\nimport { DataSourceActionTypes } from './DataSourceActions';\r\nimport { DataSourcePanelProps, DataSourceViews, OpenCompanyFile } from './DataSourcePanel';\r\nimport { ImportControl } from './ImportControl';\r\nimport { CompanyFileOptions } from './Interfaces';\r\nimport { NetworkError } from './NetworkError';\r\nimport { Settings } from './Settings';\r\n\r\ninterface StandardDesktopProps\r\n extends Omit<\r\n DataSourcePanelProps,\r\n 'dataSourceProviderName' | 'lastImportedDate' | 'importedToDate' | 'productType'\r\n > {\r\n importHandler: React.MouseEventHandler;\r\n cancelImportHandler: React.MouseEventHandler;\r\n desktopConnectorIdHandler: (value: string) => void;\r\n connectHandler: React.MouseEventHandler;\r\n openCompanyFile: OpenCompanyFile;\r\n onChangeCompanyFile: React.ChangeEventHandler;\r\n importStatus: any;\r\n selectedCompanyFileId: string;\r\n companyFileOptions: CompanyFileOptions[];\r\n}\r\n\r\nconst SettingsView = ({\r\n dataSourceId,\r\n name,\r\n isSettingsDisabled,\r\n dispatch,\r\n actionHandler,\r\n actuals,\r\n budget,\r\n hasTrackingActuals,\r\n hasTrackingBudget,\r\n trackingActualsSelected,\r\n trackingBudgetSelected,\r\n actualsFrom,\r\n actualsTo,\r\n budgetFrom,\r\n budgetTo,\r\n importStatus,\r\n importHandler,\r\n importProgress,\r\n cancelImportHandler,\r\n isImportButtonDisabled,\r\n}) => {\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport const StandardDesktop: React.FC> = ({\r\n actuals,\r\n budget,\r\n hasTrackingActuals,\r\n hasTrackingBudget,\r\n trackingActualsSelected,\r\n trackingBudgetSelected,\r\n actualsFrom,\r\n actualsTo,\r\n budgetFrom,\r\n budgetTo,\r\n dataSourceId,\r\n code,\r\n name,\r\n dispatch,\r\n actionHandler,\r\n viewState,\r\n importButtonDisabled,\r\n importProgress,\r\n importStatus,\r\n importHandler,\r\n cancelImportHandler,\r\n desktopConnectorIdHandler,\r\n connectHandler,\r\n desktopConnectorId,\r\n companyFileOptions,\r\n selectedCompanyFileId = '',\r\n openCompanyFile,\r\n onChangeCompanyFile,\r\n companyFileError,\r\n errorCode,\r\n safeViewState,\r\n}) => {\r\n let isSettingsDisabled = false;\r\n if ([DataSourceViews.Importing, DataSourceViews.UploadingDesktopFile].includes(viewState)) {\r\n isSettingsDisabled = true;\r\n }\r\n\r\n const transitionAwayFromError = () => {\r\n actionHandler(\r\n {\r\n type: DataSourceActionTypes.TransitionAwayFromErrorView,\r\n payload: { dataSourceId },\r\n },\r\n dispatch,\r\n );\r\n };\r\n\r\n const returnToLastView = () => {\r\n actionHandler(\r\n {\r\n type: DataSourceActionTypes.TransitionView,\r\n payload: { dataSourceId, viewState: safeViewState },\r\n },\r\n dispatch,\r\n );\r\n };\r\n\r\n const Settings = () => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n return (\r\n <>\r\n }\r\n desktopConnectorId={desktopConnectorId}\r\n returnToLastViewFn={returnToLastView}\r\n />\r\n \r\n {viewState === DataSourceViews.LoadingCompanyFile && (\r\n
\r\n
\r\n
\r\n \r\n
\r\n

Loading your company file information

\r\n \r\n Cancel\r\n \r\n
\r\n
\r\n
\r\n
\r\n )}\r\n {viewState === DataSourceViews.LoadingImportSettings && (\r\n
\r\n
\r\n
\r\n {' '}\r\n Loading import settings\r\n
\r\n
\r\n
\r\n )}\r\n {viewState === DataSourceViews.Settings && }\r\n {viewState === DataSourceViews.UploadingDesktopFile && }\r\n {viewState === DataSourceViews.Importing && }\r\n {viewState === DataSourceViews.ImportComplete && }\r\n {viewState === DataSourceViews.ImportCancelled && }\r\n {viewState === DataSourceViews.ImportFail && }\r\n {viewState === DataSourceViews.NetworkError && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useState } from 'react';\r\n\r\nimport dayjs from 'dayjs';\r\nimport utc from 'dayjs/plugin/utc';\r\n\r\nimport excelLogo30 from '../../../../Content/Images/DataSources/excel-30.png';\r\nimport excelPersonalWealthLogo30 from '../../../../Content/Images/DataSources/excelpersonalwealth-30.png';\r\nimport googleAnalyticsLogo30 from '../../../../Content/Images/DataSources/googleanalytics-30.png';\r\nimport googleSheetsLogo30 from '../../../../Content/Images/DataSources/googlesheets-30.svg';\r\nimport myobLogo30 from '../../../../Content/Images/DataSources/myob-30.png';\r\nimport myobAccountRightLogo30 from '../../../../Content/Images/DataSources/myob-circle-30.svg';\r\nimport personalWealthLogo30 from '../../../../Content/Images/DataSources/personalwealth-30.png';\r\nimport quickbooksLogo from '../../../../Content/Images/DataSources/quickbooks.svg';\r\nimport sageLogo30 from '../../../../Content/Images/DataSources/sage-30.png';\r\nimport xeroLogo30 from '../../../../Content/Images/DataSources/xero-30.png';\r\nimport xeroPracticeManagerLogo30 from '../../../../Content/Images/DataSources/xeropracticemanager-30.png';\r\nimport { useDti } from '../../../../ModernScripts/Spotlight/Hooks/use-data-test-id';\r\nimport { isDesktop } from '../../Helpers';\r\nimport { ImportError } from '../../Services/ApiResponseModels';\r\nimport { ConfirmDisconnectFromDataSourceModal } from './ConfirmDisconnectFromDataSourceModal';\r\nimport { CompanyFileErrorTypes, DataSourceCodes, NetworkErrorCodes, ProductTypes } from './Constants';\r\nimport { DataSourceActionTypes, DataSourceActions } from './DataSourceActions';\r\nimport { DataSourceAppActions } from './DataSourceAppActions';\r\nimport { Excel } from './Excel';\r\nimport { CompanyFileOptions } from './Interfaces';\r\nimport { useSignalRDispatch, useSignalRProvider } from './SignalRProvider';\r\nimport { StandardCloud } from './StandardCloud';\r\nimport { StandardDesktop } from './StandardDesktop';\r\n\r\ndayjs.extend(utc);\r\n\r\nexport interface DataSourcePanelProps {\r\n dataSourceId: string;\r\n reportId?: string;\r\n organisationId?: string;\r\n code: DataSourceCodes;\r\n dataSourceProviderName: string;\r\n name: string;\r\n isConnected?: boolean;\r\n lastImportedDate: string;\r\n importedToDate: string;\r\n actuals: boolean;\r\n budget: boolean;\r\n actualsTo: string;\r\n budgetFrom: string;\r\n budgetTo: string;\r\n hasTrackingActuals: boolean;\r\n hasTrackingBudget: boolean;\r\n trackingActualsSelected: boolean;\r\n trackingBudgetSelected: boolean;\r\n actualsFrom: string;\r\n productType: ProductTypes;\r\n importButtonDisabled: boolean;\r\n desktopConnectorId?: string;\r\n selectedCompanyFileId?: string;\r\n companyFileOptions?: CompanyFileOptions[];\r\n companyFileError?: CompanyFileErrorTypes;\r\n /**\r\n * The view to display, e.g. connect to datasource, configure data to import, etc.\r\n * Note: Different datasource types move through different views.\r\n */\r\n viewState: DataSourceViews;\r\n // 'Save point' for when an error occurs, this value is used for the try again button to redirect the user back to their last valid state\r\n safeViewState: DataSourceViews;\r\n /** import progress percent */\r\n importProgress: number;\r\n actionHandler: (action: DataSourceActions | DataSourceAppActions, dispatch: React.Dispatch) => void;\r\n dispatch: React.Dispatch;\r\n errorCode?: NetworkErrorCodes;\r\n excelErrors?: ImportError[];\r\n spreadsheetUrl?: string;\r\n}\r\n\r\nexport enum DataSourceViews {\r\n /** Allow the user to connect to the datasource (it was probably disconnected) */\r\n Connect = 'CONNECT',\r\n /** Allow the user to create a datasource (it was probably deleted) */\r\n Create = 'CREATE',\r\n /** The datasource needs to connect but the user has insufficient access */\r\n ConnectInsufficientAccess = 'CONNECT_INSUFFICIENT_ACCESS',\r\n /**\r\n * Connection to the datasource in process\r\n * Note: This state only happens for desktop, cloud happens in another window\r\n */\r\n Connecting = 'CONNECTING',\r\n /** Generic connection fail */\r\n ConnectFail = 'CONNECT_FAIL',\r\n /** The file linked to the datasource is no longer authenticated, will need to reconnect */\r\n LinkedFileNotAuthenticated = 'LINKED_FILE_NOT_AUTHENTICATED',\r\n /**\r\n * The connection completed successfully\r\n * Note: This state only happens for desktop, cloud happens in another window\r\n */\r\n ConnectSuccess = 'CONNECT_SUCCESS',\r\n /** The datasource has already been connected, just verifying auth */\r\n Authenticating = 'AUTHENTICATING',\r\n /** Determining settings to display */\r\n LoadingImportSettings = 'LOADING_IMPORT_SETTINGS',\r\n /** No company files were returned from the request */\r\n NoCompanyFilesAvailable = 'NO_COMPANY_FILES_AVAILABLE',\r\n /** User needs to choose the company file to use */\r\n ChooseCompanyFile = 'CHOOSE_COMPANY_FILE',\r\n /** User needs to enter credentials */\r\n AuthenticateCompanyFile = 'AUTHENTICATE_COMPANY_FILE',\r\n /** Verifying the company file auth / opening company file */\r\n AuthenticatingCompanyFile = 'AUTHENTICATING_COMPANY_FILE',\r\n /** There was an error with the company file auth */\r\n AuthenticatingCompanyFileFail = 'AUTHENTICATE_COMPANY_FILE_FAIL',\r\n /** For an Excel datasource the file is uploaded */\r\n UploadFile = 'UPLOAD_FILE',\r\n /** The file is being uploaded */\r\n UploadingFile = 'UPLOADING_FILE',\r\n /** There was an error with the file upload */\r\n UploadFileFail = 'UPLOAD_FILE_FAIL',\r\n /** The file upload completed successfully */\r\n UploadFileSuccess = 'UPLOAD_FILE_SUCCESS',\r\n /** Specify the data to import and date range etc */\r\n Settings = 'SETTINGS',\r\n /** The import is in process */\r\n Importing = 'IMPORTING',\r\n /** The import completed */\r\n ImportComplete = 'IMPORT_COMPLETE',\r\n /** The import completed with errors */\r\n ImportCompleteWithErrors = 'IMPORT_COMPLETE_WITH_ERRORS',\r\n /** The import was cancelled */\r\n ImportCancelled = 'IMPORT_CANCELLED',\r\n /** There was an error importing */\r\n ImportFail = 'IMPORT_FAIL',\r\n /** Getting the list of files to show in company file select view */\r\n FetchingDesktopFiles = 'FETCHING_DESKTOP_FILES',\r\n /** Desktop connector is opening the selected file and returning information */\r\n LoadingCompanyFile = 'LOADING_COMPANY_FILE',\r\n /** Desktop connector is currently uploading the selected file */\r\n UploadingDesktopFile = 'UPLOADING_DESKTOP_FILE',\r\n /** Waiting for user to confirm desktop connector connection */\r\n Pairing = 'PAIRING',\r\n /** Something went wrong outside of the import process */\r\n NetworkError = 'NETWORK_ERROR',\r\n}\r\n\r\nexport enum ImportStatuses {\r\n Ready = 'READY',\r\n Importing = 'IMPORTING',\r\n ImportComplete = 'IMPORT_COMPLETE',\r\n ImportCompleteWithErrors = 'IMPORT_COMPLETE_WITH_ERRORS',\r\n ImportCancelled = 'IMPORT_CANCELLED',\r\n ImportFail = 'IMPORT_FAIL',\r\n}\r\n\r\nexport type OpenCompanyFile = (args: {\r\n e: React.MouseEvent;\r\n selectedCompanyFileId: string;\r\n user?: string;\r\n password?: string;\r\n}) => void;\r\n\r\nexport const DataSourcePanel = ({\r\n dataSourceId,\r\n reportId,\r\n organisationId,\r\n isConnected = false,\r\n code,\r\n dataSourceProviderName = '',\r\n name,\r\n lastImportedDate,\r\n importedToDate,\r\n actuals,\r\n budget,\r\n actualsTo,\r\n budgetFrom,\r\n budgetTo,\r\n hasTrackingActuals,\r\n hasTrackingBudget,\r\n trackingActualsSelected,\r\n trackingBudgetSelected,\r\n productType,\r\n actualsFrom,\r\n viewState,\r\n importButtonDisabled,\r\n companyFileOptions,\r\n importProgress = 0,\r\n selectedCompanyFileId,\r\n companyFileError,\r\n desktopConnectorId,\r\n actionHandler,\r\n dispatch, // TODO: probably can just use action handler and this component doesn't need dispatch, parent can pass an actionHandler with dispatch provided\r\n errorCode,\r\n safeViewState,\r\n excelErrors,\r\n spreadsheetUrl,\r\n}: DataSourcePanelProps): React.ReactElement => {\r\n const isExcel = [DataSourceCodes.Excel, DataSourceCodes.ExcelDesktop, DataSourceCodes.ExcelPersonalWealth].includes(\r\n code,\r\n );\r\n const isGoogleSheets = code === DataSourceCodes.GoogleSheets;\r\n const isManual = [DataSourceCodes.PersonalWealth].includes(code);\r\n const isDesktopDataSource = isDesktop(code);\r\n /** Does the datasource connect? or is it a manual entry or upload type of datasource */\r\n const isConnectable = !isExcel && !isManual && !isDesktopDataSource;\r\n\r\n const [showDisconnectConfirmationModal, setShowDisconnectConfirmationModal] = useState(false);\r\n const signalRProvider = useSignalRProvider();\r\n const signalRDispatch = useSignalRDispatch();\r\n\r\n const removeAccountHandler: React.MouseEventHandler = (e) => {\r\n actionHandler(\r\n {\r\n type: DataSourceActionTypes.RemoveDataSource,\r\n payload: {\r\n dataSourceId,\r\n code,\r\n },\r\n },\r\n dispatch,\r\n );\r\n };\r\n\r\n const importHandler: React.MouseEventHandler = (e) => {\r\n const dataSourceType = isDesktopDataSource\r\n ? companyFileOptions.find((a) => a.value === selectedCompanyFileId).type\r\n : undefined;\r\n actionHandler(\r\n {\r\n type: DataSourceActionTypes.ClickedImport,\r\n payload: {\r\n dataSourceId,\r\n actualsFrom,\r\n actualsTo,\r\n budgetFrom,\r\n budgetTo,\r\n actuals,\r\n budget,\r\n trackingActualsSelected,\r\n trackingBudgetSelected,\r\n selectedCompanyFileId,\r\n dataSourceType,\r\n code,\r\n signalRProvider,\r\n },\r\n },\r\n dispatch,\r\n );\r\n };\r\n\r\n const cancelImportHandler: React.MouseEventHandler = () => {\r\n actionHandler({ type: DataSourceActionTypes.CancelImportDataSource, payload: { dataSourceId } }, dispatch);\r\n };\r\n\r\n const uploadHandler: React.ChangeEventHandler = (event) => {\r\n actionHandler({ type: DataSourceActionTypes.UploadFileDataSource, payload: { dataSourceId, event } }, dispatch);\r\n };\r\n\r\n const connectHandler: React.MouseEventHandler = () => {\r\n actionHandler(\r\n {\r\n type: DataSourceActionTypes.ManuallyConnectDataSource,\r\n payload: {\r\n dataSourceId,\r\n reportId,\r\n organisationId,\r\n code,\r\n dataSourceProviderName,\r\n desktopConnectorId,\r\n signalRProvider,\r\n signalRDispatch,\r\n },\r\n },\r\n dispatch,\r\n );\r\n };\r\n\r\n const disconnectHandler: React.MouseEventHandler = (e) => {\r\n setShowDisconnectConfirmationModal(true);\r\n };\r\n\r\n const confirmedDisconnectHandler: React.MouseEventHandler = (e) => {\r\n actionHandler(\r\n {\r\n type: DataSourceActionTypes.DisconnectDataSource,\r\n payload: { dataSourceId, dataSourceProviderName },\r\n },\r\n dispatch,\r\n );\r\n };\r\n\r\n const closeDisconnectDataSourceFn = () => {\r\n setShowDisconnectConfirmationModal(false);\r\n };\r\n\r\n const desktopConnectorIdHandler = (value: string) => {\r\n actionHandler(\r\n {\r\n type: DataSourceActionTypes.SubmitDesktopConnectorId,\r\n payload: {\r\n dataSourceId,\r\n reportId,\r\n organisationId,\r\n code,\r\n dataSourceProviderName,\r\n desktopConnectorId: value,\r\n signalRProvider,\r\n signalRDispatch,\r\n },\r\n },\r\n dispatch,\r\n );\r\n };\r\n\r\n const openCompanyFile: OpenCompanyFile = ({ e, selectedCompanyFileId, user, password }) => {\r\n actionHandler(\r\n {\r\n type: DataSourceActionTypes.OpenCompanyFile,\r\n payload: {\r\n dataSourceId,\r\n selectedCompanyFileId,\r\n signalRProvider,\r\n user,\r\n password,\r\n code,\r\n },\r\n },\r\n dispatch,\r\n );\r\n };\r\n\r\n const onChangeCompanyFile: React.ChangeEventHandler = (e) => {\r\n const val = e.target.value;\r\n actionHandler(\r\n { type: DataSourceActionTypes.SetCompanyFile, payload: { dataSourceId, companyFileId: val } },\r\n dispatch,\r\n );\r\n };\r\n\r\n /** map the DataSourceCode to the logo */\r\n const logo = (code) => {\r\n switch (code) {\r\n case 'XERO':\r\n return xeroLogo30;\r\n case 'QUICKBOOKS':\r\n case 'QUICKBOOKSDESKTOP':\r\n return quickbooksLogo;\r\n case 'MYOBACCOUNTRIGHT':\r\n return myobAccountRightLogo30;\r\n case 'MYOBACCOUNTRIGHTDESKTOP':\r\n return myobLogo30;\r\n case 'SAGE50DESKTOP':\r\n return sageLogo30;\r\n case 'EXCEL':\r\n return excelLogo30;\r\n case 'EXCELDESKTOP':\r\n return excelLogo30;\r\n case 'GOOGLEANALYTICS4':\r\n return googleAnalyticsLogo30;\r\n case 'GOOGLESHEETS':\r\n return googleSheetsLogo30;\r\n case 'XEROPRACTICEMANAGER':\r\n return xeroPracticeManagerLogo30;\r\n case 'PERSONALWEALTH':\r\n return personalWealthLogo30;\r\n case 'EXCELPERSONALWEALTH':\r\n return excelPersonalWealthLogo30;\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n const localDateTime = (dateTime: string) => {\r\n const local = dayjs(dateTime).utc(true).local();\r\n\r\n return `${local.format('D MMMM YYYY')} at ${local.format('hh:mm A')}`;\r\n };\r\n\r\n const formattedLastImportedDate = lastImportedDate ? localDateTime(lastImportedDate) : 'Never';\r\n\r\n const formattedImportedToDate = importedToDate ? `${dayjs(importedToDate).format('D MMMM YYYY')}` : 'Never';\r\n\r\n const importStatus = (() => {\r\n switch (viewState) {\r\n case DataSourceViews.Importing:\r\n case DataSourceViews.UploadingDesktopFile:\r\n return ImportStatuses.Importing;\r\n case DataSourceViews.ImportComplete:\r\n return ImportStatuses.ImportComplete;\r\n case DataSourceViews.ImportCompleteWithErrors:\r\n return ImportStatuses.ImportCompleteWithErrors;\r\n case DataSourceViews.ImportFail:\r\n return ImportStatuses.ImportFail;\r\n default:\r\n return ImportStatuses.Ready;\r\n }\r\n })();\r\n\r\n const dti = {\r\n importedTo: useDti('div-imported-to'),\r\n importedToDate: useDti('span-imported-to-date'),\r\n };\r\n\r\n return (\r\n
\r\n
\r\n
\r\n

\r\n \r\n \r\n {isGoogleSheets ? 'Import from Google Sheets' : name}\r\n \r\n

\r\n {isConnectable && isConnected && !isGoogleSheets && (\r\n <>\r\n \r\n Disconnect from {dataSourceProviderName}\r\n \r\n {showDisconnectConfirmationModal && (\r\n \r\n )}\r\n \r\n )}\r\n
\r\n
\r\n
\r\n Last Imported on: \r\n {formattedLastImportedDate}\r\n
\r\n {lastImportedDate && isConnectable && importedToDate &&  | }\r\n {isConnectable && importedToDate && (\r\n
\r\n Imported to: \r\n {formattedImportedToDate}\r\n
\r\n )}\r\n
\r\n
\r\n
\r\n
\r\n {isExcel && (\r\n \r\n )}\r\n {!isExcel && !isDesktopDataSource && (\r\n \r\n )}\r\n {isDesktopDataSource && (\r\n \r\n )}\r\n
\r\n
\r\n \r\n Remove Data Source\r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","/*\r\n * DataSource common UI reducer\r\n */\r\nimport dayjs from 'dayjs';\r\nimport cloneDeep from 'lodash/cloneDeep';\r\n\r\nimport { ImportStatusCode } from './Constants';\r\nimport { DataSourceActions, DataSourceActionTypes } from './DataSourceActions';\r\nimport { DataSourceViews } from './DataSourcePanel';\r\nimport { DataSourcePanelState } from './Interfaces';\r\n\r\n/* used to map action payload values to the correct property */\r\nconst dateFieldNameToKeyMap = new Map([\r\n ['actuals_import_from_date', 'actualsFromDate'],\r\n ['actuals_import_to_date', 'actualsToDate'],\r\n ['budget_import_from_date', 'budgetFromDate'],\r\n ['budget_import_to_date', 'budgetToDate'],\r\n]);\r\n\r\n/* used to map action payload values to the correct property */\r\nconst checkboxFieldNameToKeyMap = new Map([\r\n ['actuals', 'actualsSelected'],\r\n ['budget', 'budgetSelected'],\r\n ['tracking_actuals', 'trackingActualsSelected'],\r\n ['tracking_budget', 'trackingBudgetSelected'],\r\n]);\r\n\r\nconst updateStateDate = (state, key, year, monthIndex) => {\r\n const d = dayjs().year(year).month(monthIndex);\r\n state[key] = d.format('YYYY-MM');\r\n return state;\r\n};\r\n\r\nconst updateStateCheckbox = (state, key, value) => {\r\n state[key] = value;\r\n return state;\r\n};\r\n\r\nexport const dataSourceUiReducer = (state: DataSourcePanelState, action: DataSourceActions): DataSourcePanelState => {\r\n const newState = cloneDeep(state);\r\n switch (action.type) {\r\n case DataSourceActionTypes.TransitionView:\r\n if (newState.viewState === DataSourceViews.NetworkError) return; // We don't want to allow viewState updates if the user is currently on an error screen\r\n // note: could have rules here for valid view transitions\r\n newState.viewState = action.payload.viewState;\r\n return newState;\r\n case DataSourceActionTypes.TransitionAwayFromErrorView:\r\n // note: could have rules here for valid view transitions\r\n newState.viewState = newState.safeViewState;\r\n return newState;\r\n case DataSourceActionTypes.UpdateSafeView:\r\n if (newState.viewState === DataSourceViews.NetworkError) return; // We don't want to allow safeViewState updates if the user is currently on an error screen\r\n newState.safeViewState = action.payload.viewState;\r\n return newState;\r\n case DataSourceActionTypes.StartImportDataSource:\r\n if (newState.viewState === DataSourceViews.NetworkError) return; // We don't want to allow viewState updates if the user is currently on an error screen\r\n newState.viewState = DataSourceViews.Importing;\r\n newState.importStatus = ImportStatusCode.Pending;\r\n return newState;\r\n case DataSourceActionTypes.CancelImportDataSource:\r\n if (newState.viewState === DataSourceViews.NetworkError) return; // We don't want to allow viewState updates if the user is currently on an error screen\r\n newState.viewState = DataSourceViews.ImportCancelled;\r\n newState.importProgress = 0;\r\n return newState;\r\n case DataSourceActionTypes.UploadFileDataSource:\r\n if (newState.viewState === DataSourceViews.NetworkError) return; // We don't want to allow viewState updates if the user is currently on an error screen\r\n newState.viewState = DataSourceViews.UploadingFile;\r\n return newState;\r\n case DataSourceActionTypes.SetCompanyFile:\r\n newState.selectedCompanyFileId = action.payload.companyFileId;\r\n return newState;\r\n /* settings actions */\r\n case DataSourceActionTypes.SetCheckBox: {\r\n if (newState.viewState === DataSourceViews.NetworkError) return; // We don't want to allow viewState updates if the user is currently on an error screen\r\n /* ensure we set the view to settings, so the import button is available */\r\n newState.viewState = DataSourceViews.Settings;\r\n const key = checkboxFieldNameToKeyMap.get(action.payload.name);\r\n if (key) {\r\n updateStateCheckbox(newState, key, action.payload.value);\r\n newState.importButtonDisabled = !(newState.actualsSelected || newState.budgetSelected); // Update the state of the import button\r\n }\r\n return newState;\r\n }\r\n case DataSourceActionTypes.SetDate: {\r\n if (newState.viewState === DataSourceViews.NetworkError) return; // We don't want to allow viewState updates if the user is currently on an error screen\r\n /* ensure we set the view to settings, so the import button is available */\r\n newState.viewState = DataSourceViews.Settings;\r\n const key = dateFieldNameToKeyMap.get(action.payload.name);\r\n if (key) {\r\n updateStateDate(newState, key, action.payload.value.year, action.payload.value.monthIndex);\r\n // We always set this to the default value, as the controller takes care of applying validation and disabling the button if it needs to\r\n newState.importButtonDisabled = !(newState.actualsSelected || newState.budgetSelected);\r\n }\r\n return newState;\r\n }\r\n case DataSourceActionTypes.SetImportButton: {\r\n /* ensure we set the view to settings, so the import button is available */\r\n newState.viewState = DataSourceViews.Settings;\r\n newState.importButtonDisabled = action.payload.value;\r\n return newState;\r\n }\r\n case DataSourceActionTypes.SubmitDesktopConnectorId:\r\n if (newState.viewState === DataSourceViews.NetworkError) return; // We don't want to allow viewState updates if the user is currently on an error screen\r\n newState.desktopConnectorId = action.payload.desktopConnectorId;\r\n return newState;\r\n case DataSourceActionTypes.ImportInProgress:\r\n if (newState.viewState === DataSourceViews.NetworkError) return; // We don't want to allow viewState updates if the user is currently on an error screen\r\n newState.viewState = DataSourceViews.Importing;\r\n newState.importStatus = ImportStatusCode.Importing;\r\n return newState;\r\n }\r\n return;\r\n};\r\n","import * as React from 'react';\r\nimport { useState } from 'react';\r\n\r\nimport { Button, Modal, THEME } from '@ui';\r\n\r\nimport RestService from '../../../../Scripts/Spotlight/Services/RestService';\r\nimport { DataSourceCodes } from '../../Models/Constants';\r\nimport { centerModalStyle } from '../SpotlightModal';\r\nimport * as SRModal from '../SpotlightModal';\r\n\r\ntype DeleteDataSourceModal = {\r\n dataSourceId: string;\r\n code: DataSourceCodes;\r\n onDelete: () => void;\r\n onClose: any;\r\n};\r\n\r\nexport const DeleteDataSourceModal: React.FC> = ({\r\n dataSourceId,\r\n code,\r\n onDelete,\r\n onClose,\r\n}) => {\r\n const [deleting, setDeleting] = useState(false);\r\n const [unexpectedError, setShowUnexpectedError] = useState(false);\r\n\r\n const isGoogleSheets = code === DataSourceCodes.GoogleSheets;\r\n\r\n const deleteDataSource = async () => {\r\n setDeleting(true);\r\n\r\n try {\r\n await RestService.DeleteDataSource(dataSourceId);\r\n onDelete();\r\n } catch (e) {\r\n setShowUnexpectedError(true);\r\n }\r\n };\r\n\r\n const modalContent = (\r\n
\r\n

\r\n Are you sure you want to delete this imported data source?\r\n

\r\n
\r\n );\r\n\r\n const modalContentGoogleSheets = (\r\n
\r\n

\r\n You're about to permanently delete the Google Sheets data source for this organisation.\r\n

\r\n

\r\n Once deleted, existing tasks linked to this data will no longer sync.\r\n

\r\n

\r\n This action is irreversible. Are you sure you want to proceed?\r\n

\r\n
\r\n );\r\n\r\n const errorModalContent = (\r\n
\r\n

Unable to delete data source.

\r\n
\r\n );\r\n\r\n const Buttons = ({ deleting }: { deleting: boolean }) => {\r\n return (\r\n
\r\n
\r\n \r\n Delete\r\n \r\n \r\n Cancel\r\n \r\n
\r\n
\r\n );\r\n };\r\n\r\n const ErrorModalButtons = () => {\r\n return (\r\n
\r\n
\r\n
\r\n \r\n Close\r\n \r\n
\r\n
\r\n
\r\n );\r\n };\r\n\r\n return (\r\n \r\n \r\n {unexpectedError ? (\r\n }\r\n >\r\n {errorModalContent}\r\n \r\n ) : (\r\n }\r\n >\r\n {isGoogleSheets ? modalContentGoogleSheets : modalContent}\r\n \r\n )}\r\n \r\n <>\r\n \r\n );\r\n};\r\n","import * as signalR from '@microsoft/signalr';\r\n\r\nimport { FeatureFlagItem } from '../../../../ModernScripts/Spotlight/Common/FeatureFlag/feature-flag-menu';\r\nimport { WebApiEndpoints } from '../../Services/Endpoints';\r\nimport RestService from '../../Services/RestService';\r\nimport { beginDesktopPairing } from './ConnectionSteps';\r\nimport {\r\n DataSourceCodes,\r\n NetworkErrorCodes,\r\n SignalRImportEvents,\r\n SignalRImportRequests,\r\n SignalRImportStatus,\r\n} from './Constants';\r\nimport { DataSourceActions, DataSourceActionTypes } from './DataSourceActions';\r\nimport { DataSourceAppActions, DataSourceAppActionTypes } from './DataSourceAppActions';\r\nimport { DataSourceViews } from './DataSourcePanel';\r\nimport { ClickImportPayload, UploadFileSignalRRequest } from './Interfaces';\r\nimport { SignalRProvider } from './SignalRProvider';\r\n\r\n/**\r\n * This method is responsible for the creation and configuration of the SignalR connection, as well as responding to each of\r\n * the SignalR messages.\r\n * Exectution flow:\r\n * 1. Gets configuration URLs from the API\r\n * 2. Sends an API request to pair up the connections\r\n * @param dataSourceId\r\n * @param desktopConnectorId\r\n * @param signalRProvider\r\n * @param signalRDispatch\r\n * @param dispatch\r\n */\r\nexport const connectDesktopDataSource = async (\r\n dataSourceId: string,\r\n desktopConnectorId: string,\r\n signalRProvider: SignalRProvider,\r\n signalRDispatch: React.Dispatch>,\r\n dispatch: React.Dispatch,\r\n): Promise => {\r\n dispatch({\r\n type: DataSourceActionTypes.TransitionView,\r\n payload: { dataSourceId, viewState: DataSourceViews.Pairing },\r\n });\r\n\r\n const errorHandler = () =>\r\n dispatch({\r\n type: DataSourceAppActionTypes.DataSourceNetworkError,\r\n payload: {\r\n dataSourceId,\r\n errorCode: NetworkErrorCodes.SignalRUnresponsive,\r\n },\r\n });\r\n\r\n RestService.GetConfig()\r\n .then(async (response) => {\r\n fetch(`${response.data.spotlightHubsUrl}/api/desktopconnector/generatecontext`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Access-Control-Allow-Origin': response.data.spotlightWebUrl,\r\n Authorization: `Bearer ${await RestService.getActiveApiToken()}`,\r\n },\r\n body: JSON.stringify({\r\n desktopConnectorId,\r\n }),\r\n })\r\n .then((res) => {\r\n const reader = res.body.getReader();\r\n let contextFromApi = '';\r\n reader.read().then(function processText({ done, value }) {\r\n if (done) {\r\n signalRProvider.approvedConnections.set(contextFromApi, dataSourceId);\r\n signalRDispatch(signalRProvider);\r\n beginDesktopPairing(\r\n response.data.spotlightHubsUrl,\r\n contextFromApi,\r\n response.data.spotlightWebUrl,\r\n desktopConnectorId,\r\n errorHandler,\r\n );\r\n return;\r\n }\r\n\r\n contextFromApi += new TextDecoder().decode(value);\r\n // Read some more, and call this function again\r\n return reader.read().then(processText);\r\n });\r\n })\r\n .catch(() => {\r\n errorHandler();\r\n });\r\n })\r\n .catch(() => {\r\n errorHandler();\r\n });\r\n};\r\n\r\n/**\r\n * SignalR method to retrieve company files from the desktop connector.\r\n * Response is handled by listening for the 'onFilesRetrieved' signalR message.\r\n * @param dataSourceId\r\n * @param dataSourceTypeCode\r\n * @param signalRProvider\r\n * @param dispatch\r\n */\r\nexport const fetchFiles = async (\r\n dataSourceId: string,\r\n dataSourceTypeCode: DataSourceCodes,\r\n signalRProvider: SignalRProvider,\r\n dispatch: React.Dispatch,\r\n): Promise => {\r\n let context: string;\r\n signalRProvider.approvedConnections.forEach((value, key) => {\r\n if (value === dataSourceId) context = key;\r\n });\r\n signalRProvider.hubsConnection\r\n .send(SignalRImportRequests.GetFiles, context, { dataSourceType: dataSourceTypeCode })\r\n .catch((err) => {\r\n dispatch({\r\n type: DataSourceAppActionTypes.DataSourceNetworkError,\r\n payload: {\r\n dataSourceId,\r\n errorCode: NetworkErrorCodes.SignalRUnresponsive,\r\n },\r\n });\r\n });\r\n};\r\n\r\n/**\r\n * SignalR method to retrieve the selected company file information from the desktop connector.\r\n * Response is handled by listening for the 'onFileRetrieved' signalR message.\r\n * @param dataSourceId\r\n * @param dataSourceTypeCode\r\n * @param selectedCompanyId\r\n * @param signalRProvider\r\n * @param dispatch\r\n */\r\nexport const fetchFileInformation = async (\r\n dataSourceId: string,\r\n dataSourceTypeCode: DataSourceCodes,\r\n selectedCompanyId: string,\r\n signalRProvider: SignalRProvider,\r\n dispatch: React.Dispatch,\r\n): Promise => {\r\n let context: string;\r\n signalRProvider.approvedConnections.forEach((value, key) => {\r\n if (value === dataSourceId) context = key;\r\n });\r\n signalRProvider.hubsConnection\r\n .send(SignalRImportRequests.GetFile, context, { dataSourceType: dataSourceTypeCode, fileId: selectedCompanyId })\r\n .catch((err) => {\r\n dispatch({\r\n type: DataSourceAppActionTypes.DataSourceNetworkError,\r\n payload: {\r\n dataSourceId,\r\n errorCode: NetworkErrorCodes.SignalRUnresponsive,\r\n },\r\n });\r\n });\r\n};\r\n\r\n/**\r\n * SignalR method to request the selected file be uploaded and includes the relevant information for importing\r\n * Response is handled by listening for the 'onFileUpdate' signalR message.\r\n * @param payload\r\n * @param dispatch\r\n */\r\nexport const uploadDesktopFile = async (\r\n payload: ClickImportPayload,\r\n dispatch: React.Dispatch,\r\n): Promise => {\r\n let practiceFeatureFlags = null;\r\n const practiceFeatureFlagsString = window.Spotlight.PracticeFeatureFlags as string;\r\n if (practiceFeatureFlagsString && practiceFeatureFlagsString.length > 0) {\r\n practiceFeatureFlags = practiceFeatureFlagsString.split('|').map((f) => {\r\n return {\r\n value: '0',\r\n name: f,\r\n isEnabled: true,\r\n };\r\n });\r\n } else {\r\n const practiceFeatureFlagsData = await RestService.performWebApiCallAsync({\r\n url: WebApiEndpoints.PracticeFeatureFlags(),\r\n method: 'GET',\r\n });\r\n practiceFeatureFlags = practiceFeatureFlagsData.data;\r\n }\r\n\r\n const request: UploadFileSignalRRequest = {\r\n fileId: payload.selectedCompanyFileId,\r\n dataSourceType: payload.dataSourceType,\r\n uploadUrl: '',\r\n practiceFeatureFlags: practiceFeatureFlags as Array,\r\n importOptions: {\r\n importActuals: payload.actuals,\r\n actualsFrom: payload.actualsFrom,\r\n actualsTo: payload.actualsTo,\r\n importBudget: payload.budget,\r\n budgetFrom: payload.budgetFrom,\r\n budgetTo: payload.budgetTo,\r\n importTrackingActuals: payload.trackingActualsSelected,\r\n importTrackingBudget: payload.trackingBudgetSelected,\r\n },\r\n };\r\n\r\n const postData = { dsId: payload.dataSourceId, type: 'data' };\r\n\r\n RestService.GetUploadUrl(postData, function (result) {\r\n request.uploadUrl = result.Url;\r\n let context: string;\r\n payload.signalRProvider.approvedConnections.forEach((value, key) => {\r\n if (value === payload.dataSourceId) context = key;\r\n });\r\n payload.signalRProvider.hubsConnection.send(SignalRImportRequests.UploadFile, context, request).catch((err) => {\r\n dispatch({\r\n type: DataSourceAppActionTypes.DataSourceNetworkError,\r\n payload: {\r\n dataSourceId: payload.dataSourceId,\r\n errorCode: NetworkErrorCodes.SignalRUnresponsive,\r\n },\r\n });\r\n });\r\n });\r\n};\r\n\r\n/**\r\n * Initialise signalR hub connection, and configure callbacks.\r\n * @param signalRProvider\r\n * @param signalRDispatch\r\n * @param dispatch\r\n */\r\nexport const signalRHubSetup = async (\r\n signalRProvider: SignalRProvider,\r\n signalRDispatch: React.Dispatch>,\r\n): Promise => {\r\n let hubConnection = signalRProvider.hubsConnection;\r\n const approvedConnections = signalRProvider.approvedConnections;\r\n const response = await RestService.GetConfig();\r\n const builder = new signalR.HubConnectionBuilder();\r\n hubConnection = await builder\r\n .withUrl(`${response.data.spotlightHubsUrl}/desktop/web-client-hub`, {\r\n skipNegotiation: true,\r\n transport: signalR.HttpTransportType.WebSockets,\r\n accessTokenFactory: () => RestService.getActiveApiToken(),\r\n })\r\n .withAutomaticReconnect()\r\n .build();\r\n await hubConnection.start().catch((err) => {\r\n console.warn('SignalR connection error: ', err);\r\n });\r\n\r\n signalRDispatch({ hubsConnection: hubConnection, approvedConnections });\r\n};\r\n\r\nexport const signalRBindEvents = ({\r\n signalRProvider,\r\n signalRDispatch,\r\n dispatch,\r\n actionHandler,\r\n}: {\r\n signalRProvider: SignalRProvider;\r\n signalRDispatch: React.Dispatch>;\r\n dispatch: React.Dispatch;\r\n actionHandler: (action: DataSourceActions | DataSourceAppActions, dispatch: React.Dispatch) => void;\r\n}): void => {\r\n const hubConnection = signalRProvider.hubsConnection;\r\n const approvedConnections = signalRProvider.approvedConnections;\r\n hubConnection.on(SignalRImportEvents.ConnectionInvite, (context, response) => {\r\n {\r\n hubConnection.send(SignalRImportRequests.AcceptConnectionInvite, context).catch(() => {\r\n const dataSourceId = approvedConnections.get(context);\r\n approvedConnections.delete(context); // Remove connection from 'approved' map if this fails\r\n signalRDispatch({ hubsConnection: hubConnection, approvedConnections });\r\n dispatch({\r\n type: DataSourceAppActionTypes.DataSourceNetworkError,\r\n payload: {\r\n dataSourceId,\r\n errorCode: NetworkErrorCodes.SignalRUnresponsive,\r\n },\r\n });\r\n });\r\n }\r\n });\r\n\r\n hubConnection.on(SignalRImportEvents.DesktopConnected, (context, response) => {\r\n {\r\n const dataSourceId = approvedConnections.get(context);\r\n if (!dataSourceId) return;\r\n dispatch({\r\n type: DataSourceActionTypes.TransitionView,\r\n payload: { dataSourceId, viewState: DataSourceViews.FetchingDesktopFiles },\r\n });\r\n }\r\n });\r\n\r\n hubConnection.on(SignalRImportEvents.FilesRetrieved, (context, response) => {\r\n {\r\n const dataSourceId = approvedConnections.get(context);\r\n if (!dataSourceId) return;\r\n\r\n const files: [{ name: string; value: string; type: string }] = response.files\r\n .sort((a, b) => (a.fileName || '').localeCompare(b.fileName || ''))\r\n .map((file: { fileName: string; fileId: string; dataSourceType: string }) => {\r\n return {\r\n name: file.fileName,\r\n value: file.fileId,\r\n type: file.dataSourceType,\r\n };\r\n });\r\n\r\n dispatch({ type: DataSourceAppActionTypes.GetCompanyFilesSuccess, payload: { dataSourceId, files } });\r\n dispatch({\r\n type: DataSourceActionTypes.TransitionView,\r\n payload: { dataSourceId, viewState: DataSourceViews.ChooseCompanyFile },\r\n });\r\n dispatch({\r\n type: DataSourceActionTypes.UpdateSafeView,\r\n payload: { dataSourceId, viewState: DataSourceViews.ChooseCompanyFile },\r\n });\r\n }\r\n });\r\n\r\n hubConnection.on(SignalRImportEvents.FileUpdate, (context, response) => {\r\n {\r\n const dataSourceId = approvedConnections.get(context);\r\n if (!dataSourceId) return;\r\n\r\n if (response.status === SignalRImportStatus.Running) {\r\n const progress = response.progress / 2; // Uploading file is only responsible for 50% of the work\r\n dispatch({\r\n type: DataSourceAppActionTypes.UpdateProgress,\r\n payload: { dataSourceId, progress, status: response.status },\r\n });\r\n } else if (response.status === SignalRImportStatus.Completed) {\r\n // It's done uploading the file, trigger the actual import\r\n actionHandler(\r\n {\r\n type: DataSourceAppActionTypes.DataSourceDesktopImportStarted,\r\n payload: { dataSourceId },\r\n },\r\n dispatch,\r\n );\r\n } else {\r\n dispatch({\r\n type: DataSourceAppActionTypes.DataSourceImportFailed,\r\n payload: { dataSourceId },\r\n });\r\n }\r\n }\r\n });\r\n\r\n hubConnection.on(SignalRImportEvents.FileRetrieved, (context, response) => {\r\n {\r\n const dataSourceId = approvedConnections.get(context);\r\n if (!dataSourceId || !response) return;\r\n\r\n dispatch({\r\n type: DataSourceAppActionTypes.GetTrackingInformationSuccess,\r\n payload: {\r\n dataSourceId,\r\n hasTrackingActuals: response.file.hasTrackedActuals ?? false,\r\n hasTrackingBudget: response.file.hasTrackedBudget ?? false,\r\n },\r\n });\r\n }\r\n });\r\n\r\n hubConnection.on(SignalRImportEvents.Error, (context, response) => {\r\n {\r\n const dataSourceId = approvedConnections.get(context);\r\n if (!dataSourceId || !response) return;\r\n\r\n dispatch({\r\n type: DataSourceAppActionTypes.DataSourceNetworkError,\r\n payload: {\r\n dataSourceId,\r\n errorCode: response,\r\n },\r\n });\r\n }\r\n });\r\n};\r\n","import RestService from '../../Services/RestService';\r\nimport { CompanyFileErrorTypes } from './Constants';\r\nimport { DataSourceActionTypes } from './DataSourceActions';\r\nimport { DataSourceAppActionTypes } from './DataSourceAppActions';\r\nimport { DataSourceViews } from './DataSourcePanel';\r\n\r\ninterface MyobIsLinkedHandlerArgs {\r\n dataSourceId: string;\r\n companyFileId: string;\r\n data: any;\r\n dispatch: any;\r\n}\r\n\r\ntype MyobIsLinkedHandler = ({ ...args }: MyobIsLinkedHandlerArgs) => void;\r\n\r\ninterface MyobIsLinkedNetworkErrorHandlerArgs {\r\n dataSourceId: string;\r\n companyFileId?: string;\r\n dispatch: any;\r\n error: any;\r\n}\r\n\r\ntype MyobIsLinkedNetworkErrorHandler = ({ ...args }: MyobIsLinkedNetworkErrorHandlerArgs) => void;\r\n\r\ninterface CheckMyobCompanyFileIsLinkedArgs {\r\n dataSourceId: string;\r\n companyFileId: string;\r\n dispatch: any;\r\n responseHandler?: MyobIsLinkedHandler;\r\n isLinkedHandler?: MyobIsLinkedHandler;\r\n errorHandler?: MyobIsLinkedHandler;\r\n networkErrorHandler?: MyobIsLinkedNetworkErrorHandler;\r\n}\r\n\r\ntype CheckMyobCompanyFileIsLinked = ({ ...args }: CheckMyobCompanyFileIsLinkedArgs) => void;\r\n\r\ntype MyobOpenCompanyFile = ({\r\n dataSourceId,\r\n companyFileId,\r\n auth,\r\n dispatch,\r\n}: {\r\n dataSourceId: string;\r\n companyFileId: string;\r\n auth: { username: string; password: string };\r\n dispatch: any;\r\n}) => void;\r\n\r\nconst defaultMyobCompanyFileIsLinkedHandler: MyobIsLinkedHandler = ({ dataSourceId, companyFileId, dispatch }) => {\r\n dispatch({\r\n type: DataSourceAppActionTypes.CompanyFileReady,\r\n payload: { dataSourceId, selectedCompanyFileId: companyFileId },\r\n });\r\n};\r\n\r\nexport const defaultMyobCompanyFileIsLinkedErrorHandler: MyobIsLinkedHandler = ({ dataSourceId, data, dispatch }) => {\r\n if (data.FailureType === 'ApiTokenInvalid') {\r\n // auth failed, show error saying could not access MYOB with a connect button\r\n dispatch({\r\n type: DataSourceAppActionTypes.CompanyFileAuthFailed,\r\n payload: {\r\n dataSourceId: dataSourceId,\r\n errorCode: CompanyFileErrorTypes.TokenExpired,\r\n },\r\n });\r\n } else if (data.FailureType === 'InvalidCompanyFile') {\r\n // auth failed, show error\r\n dispatch({\r\n type: DataSourceAppActionTypes.CompanyFileAuthFailed,\r\n payload: {\r\n dataSourceId: dataSourceId,\r\n errorCode: CompanyFileErrorTypes.InvalidCompanyFile,\r\n },\r\n });\r\n } else {\r\n // user needs to enter credentials to auth the file\r\n dispatch({\r\n type: DataSourceActionTypes.TransitionView,\r\n payload: {\r\n dataSourceId: dataSourceId,\r\n viewState: DataSourceViews.AuthenticateCompanyFile,\r\n },\r\n });\r\n }\r\n};\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-empty-function\r\nconst noOp = () => {};\r\n\r\nexport const checkMyobCompanyFileIsLinked: CheckMyobCompanyFileIsLinked = ({\r\n dataSourceId,\r\n companyFileId,\r\n dispatch,\r\n responseHandler,\r\n isLinkedHandler = defaultMyobCompanyFileIsLinkedHandler,\r\n errorHandler = defaultMyobCompanyFileIsLinkedErrorHandler,\r\n networkErrorHandler = noOp,\r\n}) => {\r\n const fileLinkedResponseHandler = (data) => {\r\n if (responseHandler) {\r\n responseHandler(data);\r\n } else {\r\n if (data.Result === true) {\r\n isLinkedHandler({ dataSourceId, companyFileId, data, dispatch });\r\n } else {\r\n errorHandler({ data, dataSourceId, companyFileId, dispatch });\r\n }\r\n }\r\n };\r\n\r\n RestService.IsCompanyFileLinked('MYOB', dataSourceId, companyFileId, fileLinkedResponseHandler, (error) => {\r\n networkErrorHandler({ error, dataSourceId, companyFileId, dispatch });\r\n });\r\n};\r\n\r\nexport const MyobOpenCompanyFile: MyobOpenCompanyFile = ({ dataSourceId, companyFileId, auth, dispatch }) => {\r\n dispatch({\r\n type: DataSourceActionTypes.TransitionView,\r\n payload: {\r\n dataSourceId: dataSourceId,\r\n viewState: DataSourceViews.AuthenticatingCompanyFile,\r\n },\r\n });\r\n\r\n RestService.OpenCompanyFile(\r\n 'MYOB',\r\n dataSourceId,\r\n companyFileId,\r\n auth,\r\n function (data) {\r\n if (data.Result && data.Result === true) {\r\n // transition to loading import settings\r\n dispatch({\r\n type: DataSourceActionTypes.TransitionView,\r\n payload: {\r\n dataSourceId: dataSourceId,\r\n viewState: DataSourceViews.LoadingImportSettings,\r\n },\r\n });\r\n } else {\r\n // auth failed, show error\r\n dispatch({\r\n type: DataSourceAppActionTypes.CompanyFileAuthFailed,\r\n payload: {\r\n dataSourceId: dataSourceId,\r\n errorCode: CompanyFileErrorTypes.InvalidCredentials,\r\n },\r\n });\r\n }\r\n },\r\n function () {\r\n // auth failed, show error\r\n dispatch({\r\n type: DataSourceAppActionTypes.CompanyFileAuthFailed,\r\n payload: {\r\n dataSourceId: dataSourceId,\r\n errorCode: CompanyFileErrorTypes.InvalidCredentials,\r\n },\r\n });\r\n },\r\n );\r\n};\r\n","import React, { createContext, useState } from 'react';\r\n\r\nexport interface SignalRProvider {\r\n hubsConnection: signalR.HubConnection;\r\n approvedConnections: Map;\r\n}\r\n\r\nconst SignalRContext = createContext(undefined);\r\nconst SignalRDispatchContext = createContext>>(undefined);\r\n\r\nexport const SignalRProvider: React.FC> = ({ children }) => {\r\n const [signalRContext, setSignalRContext] = useState({\r\n hubsConnection: null,\r\n approvedConnections: new Map(),\r\n });\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport const useSignalRProvider = (): SignalRProvider => {\r\n const context = React.useContext(SignalRContext);\r\n if (typeof context === 'undefined') {\r\n throw new Error('useSignalRProvider must be used within an SignalRProvider');\r\n }\r\n return context;\r\n};\r\n\r\nexport const useSignalRDispatch = (): React.Dispatch> => {\r\n const context = React.useContext(SignalRDispatchContext);\r\n if (typeof context === 'undefined') {\r\n throw new Error('useSignalRDispatchContext must be used within an SignalRProvider');\r\n }\r\n return context;\r\n};\r\n","import dayjs from 'dayjs';\r\nimport advancedFormat from 'dayjs/plugin/advancedFormat';\r\nimport calendar from 'dayjs/plugin/calendar';\r\nimport isYesterday from 'dayjs/plugin/isYesterday';\r\nimport relativeTime from 'dayjs/plugin/relativeTime';\r\nimport utc from 'dayjs/plugin/utc';\r\n\r\nimport { ReportMode } from '../../../Codes';\r\n\r\ndayjs.extend(relativeTime);\r\ndayjs.extend(calendar);\r\ndayjs.extend(isYesterday);\r\ndayjs.extend(advancedFormat);\r\ndayjs.extend(utc);\r\n\r\nexport enum NotificationType {\r\n ReportBuildDelayed = 'REPORT_BUILD_DELAYED',\r\n ReportBuildFailed = 'REPORT_BUILD_FAILED',\r\n ReportBuildCompleted = 'REPORT_BUILD_COMPLETED',\r\n}\r\n\r\nexport enum NotificationMessage {\r\n ReportBuildDelayedMessage = 'Your report is being generated.',\r\n ReportBuildFailedMessage = 'We were not able to generate your report. Please try again.',\r\n ReportBuildCompletedMessage = 'Your report is ready to download.',\r\n}\r\n\r\nexport const getMessageForNotificationType = (type: NotificationType): string => {\r\n let message = '';\r\n Object.keys(NotificationType).forEach((key) => {\r\n if (NotificationType[key] === type) {\r\n message = NotificationMessage[`${key}Message`];\r\n }\r\n });\r\n return message;\r\n};\r\n\r\nexport const parseReportTypeMessage = (message: string, reportMode: string, reportTitle: string) => {\r\n const product = 'report';\r\n return message.replace('${product}', product).replace('${reportTitle}', reportTitle);\r\n};\r\n\r\nexport const getReportModeTag = (reportMode: ReportMode) => {\r\n switch (reportMode) {\r\n case ReportMode.Forecast:\r\n return 'FORECAST';\r\n case ReportMode.Dashboard:\r\n return 'DASHBOARD';\r\n case ReportMode.Franchise:\r\n return 'MULTI';\r\n case ReportMode.Spotlight:\r\n return 'REPORT';\r\n case ReportMode.Sustain:\r\n return 'SUSTAIN';\r\n default:\r\n return '';\r\n }\r\n};\r\n\r\nexport const getNotificationDisplayDate = (date: string) => {\r\n if (dayjs.utc(date).local().isSame(new Date(), 'day')) {\r\n //was today - show relative\r\n return dayjs.utc(date).local().fromNow();\r\n } else if (dayjs.utc(date).local().isYesterday()) {\r\n //was yesterday - show calendar time\r\n return dayjs.utc(date).local().calendar();\r\n } else {\r\n //older than yesterday - show date and time\r\n return dayjs.utc(date).local().format('Do MMMM, h:mm A');\r\n }\r\n};\r\n","declare const dataLayer: any;\r\n\r\nexport enum EventType {\r\n OpenedHelp = 'opened_help',\r\n OpenedTrainingCenter = 'opened_training_center',\r\n OpenedHelpTransformationInAction = 'opened_help_transformationinaction',\r\n OpenedHelpSpotlightCertification = 'opened_help_spotlightcertification',\r\n OpenedHelpOtherResources = 'opened_help_otherresources',\r\n OpenedWhatsNew = 'opened_whatsnew',\r\n OpenedNotifications = 'opened_notifications',\r\n DownloadedPDFFromNotifications = 'downloaded_pdf_from_notifications',\r\n DownloadedExcelFromNotifications = 'downloaded_excel_from_notifications',\r\n SelectReportCoverTemplate = 'select_report_cover_template',\r\n}\r\n\r\nexport const track = (event: EventType, params?: { [key: string]: any }) => {\r\n if (typeof dataLayer !== 'undefined') {\r\n dataLayer.push({ event, gtm: params });\r\n }\r\n};\r\n","import * as React from 'react';\r\n\r\nimport moment from 'moment';\r\nimport { connect } from 'react-redux';\r\n\r\nimport { ReportMode } from '../../../Codes';\r\nimport RestService from '../../Services/RestService';\r\nimport { IOrganisation } from '../../Store/Actions/OrganisationsActions';\r\nimport * as analytics from '../Analytics';\r\nimport { Notification, INotification } from './Notification';\r\nimport {\r\n getMessageForNotificationType,\r\n parseReportTypeMessage,\r\n getReportModeTag,\r\n getNotificationDisplayDate,\r\n} from './NotificationMessages';\r\n\r\nexport interface INotificationReportBuildCompleted extends INotification {\r\n reportType: string;\r\n reportTitle: string;\r\n reportMode: ReportMode;\r\n reportDate: string;\r\n reportBuildStartDateTime: string;\r\n allowedActions: Array;\r\n actions: any;\r\n}\r\n\r\nexport enum enumAllowedActions {\r\n downloadPdf = 'downloadPdf',\r\n downloadExcel = 'downloadExcel',\r\n}\r\n\r\nexport class NotificationReportBuildCompletedClass extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.onClickDownloadPDF = this.onClickDownloadPDF.bind(this);\r\n this.onClickDownloadExcel = this.onClickDownloadExcel.bind(this);\r\n this.onClickDismiss = this.onClickDismiss.bind(this);\r\n }\r\n\r\n onClickDismiss(e) {\r\n if (e.currentTarget.nodeName === 'BUTTON') {\r\n //only handle the click of the button once\r\n e.preventDefault();\r\n this.props.onClickDismiss(this.props.id);\r\n }\r\n }\r\n\r\n onClickDownloadPDF(e) {\r\n e.preventDefault();\r\n analytics.track(analytics.EventType.DownloadedPDFFromNotifications);\r\n if (this.props.actions.downloadPdf) {\r\n RestService.DownloadUrl(\r\n `/reportexport/DownloadReport/${this.props.actions.downloadPdf.windowCode}?reportId=${this.props.actions.downloadPdf.reportId}&buildId=${this.props.actions.downloadPdf.reportExportId}&exportType=PDF`,\r\n );\r\n }\r\n }\r\n\r\n onClickDownloadExcel(e) {\r\n e.preventDefault();\r\n analytics.track(analytics.EventType.DownloadedExcelFromNotifications);\r\n if (this.props.actions.downloadExcel) {\r\n RestService.DownloadUrl(\r\n `/reportexport/DownloadReport/${this.props.actions.downloadExcel.windowCode}?reportId=${this.props.actions.downloadExcel.reportId}&buildId=${this.props.actions.downloadExcel.reportExportId}&exportType=EXCEL`,\r\n );\r\n }\r\n }\r\n\r\n render() {\r\n const notificationItem = this;\r\n const reportMode = this.props.reportMode;\r\n const notificationDate = this.props.createdOnUtc;\r\n const notificationDateDisplay = getNotificationDisplayDate(notificationDate);\r\n const notificationDateDetailed = moment.utc(notificationDate).local().format('Do MMMM, hh:mm a');\r\n const organisationName = this.props.organisationName;\r\n const message = getMessageForNotificationType(this.props.type);\r\n const reportMessage = parseReportTypeMessage(message, reportMode, this.props.reportTitle);\r\n const reportTitle = this.props.reportTitle;\r\n const reportMessageDetail = '';\r\n const reportModeTag = getReportModeTag(this.props.reportMode);\r\n const reportBuildStartDateTimeDisplay = moment\r\n .utc(this.props.reportBuildStartDateTime)\r\n .local()\r\n .format('hh:mm:ss a, Do MMMM');\r\n const reportDateDisplay = ' - ' + moment(this.props.reportDate).format('DD MMMM YYYY');\r\n\r\n const downloadBtn = (() => {\r\n const buttons = [];\r\n if (\r\n notificationItem.props.allowedActions.indexOf(enumAllowedActions.downloadExcel) >= 0 &&\r\n notificationItem.props.allowedActions.indexOf(enumAllowedActions.downloadPdf) >= 0\r\n ) {\r\n return null;\r\n }\r\n if (notificationItem.props.allowedActions.indexOf(enumAllowedActions.downloadExcel) >= 0) {\r\n buttons.push(\r\n \r\n \r\n  Excel\r\n ,\r\n );\r\n } else if (notificationItem.props.allowedActions.indexOf(enumAllowedActions.downloadPdf) >= 0) {\r\n buttons.push(\r\n \r\n \r\n  PDF\r\n ,\r\n );\r\n }\r\n return buttons;\r\n })();\r\n\r\n return (\r\n \r\n
\r\n \r\n {notificationDateDisplay}\r\n

\r\n

{organisationName}

\r\n

\r\n {reportModeTag} \r\n {reportTitle}\r\n {reportDateDisplay}\r\n

\r\n

\r\n Started at {reportBuildStartDateTimeDisplay}\r\n

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

{reportMessage}

\r\n

{reportMessageDetail}

\r\n
{downloadBtn}
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state) => {\r\n return {\r\n organisations: state.organisations.organisations,\r\n };\r\n};\r\n\r\nexport const NotificationReportBuildCompleted = connect(mapStateToProps)(NotificationReportBuildCompletedClass);\r\n","import * as React from 'react';\r\n\r\nimport moment from 'moment';\r\nimport { connect } from 'react-redux';\r\n\r\nimport { ReportMode } from '../../../Codes';\r\nimport { IOrganisation } from '../../Store/Actions/OrganisationsActions';\r\nimport { Notification, INotification } from './Notification';\r\nimport {\r\n getMessageForNotificationType,\r\n parseReportTypeMessage,\r\n getReportModeTag,\r\n getNotificationDisplayDate,\r\n} from './NotificationMessages';\r\n\r\nexport interface INotificationReportBuildDelayed extends INotification {\r\n reportType: string;\r\n reportTitle: string;\r\n reportMode: ReportMode;\r\n reportDate: string;\r\n}\r\n\r\nexport class NotificationReportBuildDelayedClass extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.onClickDismiss = this.onClickDismiss.bind(this);\r\n }\r\n\r\n onClickDismiss(e) {\r\n if (e.currentTarget.nodeName === 'BUTTON') {\r\n //only handle the click of the button once\r\n e.preventDefault();\r\n this.props.onClickDismiss(this.props.id);\r\n }\r\n }\r\n\r\n render() {\r\n const notificationItem = this;\r\n const reportMode = this.props.reportMode;\r\n const notificationDate = this.props.createdOnUtc;\r\n const notificationDateDisplay = getNotificationDisplayDate(notificationDate);\r\n const notificationDateDetailed = moment.utc(notificationDate).local().format('Do MMMM, hh:mm a');\r\n const organisationName = this.props.organisationName;\r\n const message = getMessageForNotificationType(this.props.type);\r\n const reportMessage = parseReportTypeMessage(message, reportMode, this.props.reportTitle);\r\n const reportTitle = this.props.reportTitle;\r\n const reportModeTag = getReportModeTag(this.props.reportMode);\r\n const reportDateDisplay = ' - ' + moment(this.props.reportDate).format('DD MMMM YYYY');\r\n\r\n return (\r\n \r\n
\r\n \r\n {notificationDateDisplay}\r\n

\r\n

{organisationName}

\r\n

\r\n {reportModeTag} \r\n {reportTitle}\r\n {reportDateDisplay}\r\n

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

{reportMessage}

\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state) => {\r\n return {\r\n organisations: state.organisations.organisations,\r\n };\r\n};\r\n\r\nexport const NotificationReportBuildDelayed = connect(mapStateToProps)(NotificationReportBuildDelayedClass);\r\n","import * as React from 'react';\r\n\r\nimport moment from 'moment';\r\nimport { connect } from 'react-redux';\r\n\r\nimport { ReportMode } from '../../../Codes';\r\nimport { Notification, INotification } from './Notification';\r\nimport {\r\n getMessageForNotificationType,\r\n parseReportTypeMessage,\r\n getReportModeTag,\r\n getNotificationDisplayDate,\r\n} from './NotificationMessages';\r\n\r\nexport interface INotificationReportBuildFailed extends INotification {\r\n reportType: string;\r\n reportTitle: string;\r\n reportMode: ReportMode;\r\n reportDate: string;\r\n reportBuildStartDateTime: string;\r\n allowedActions: Array;\r\n actions: any;\r\n}\r\n\r\nexport enum enumAllowedActions {\r\n restartDownload = 'restartDownload',\r\n}\r\n\r\nexport class NotificationReportBuildFailedClass extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.onClickDismiss = this.onClickDismiss.bind(this);\r\n }\r\n\r\n onClickDismiss(e) {\r\n if (e.currentTarget.nodeName === 'BUTTON') {\r\n //only handle the click of the button once\r\n e.preventDefault();\r\n this.props.onClickDismiss(this.props.id);\r\n }\r\n }\r\n\r\n render() {\r\n const notificationItem = this;\r\n const reportMode = this.props.reportMode;\r\n const notificationDate = this.props.createdOnUtc;\r\n const notificationDateDisplay = getNotificationDisplayDate(notificationDate);\r\n const notificationDateDetailed = moment.utc(notificationDate).local().format('Do MMMM, hh:mm a');\r\n const organisationName = this.props.organisationName;\r\n const message = getMessageForNotificationType(this.props.type);\r\n const reportMessage = parseReportTypeMessage(message, reportMode, this.props.reportTitle);\r\n const reportTitle = this.props.reportTitle;\r\n const reportModeTag = getReportModeTag(this.props.reportMode);\r\n const reportBuildStartDateTimeDisplay = moment\r\n .utc(this.props.reportBuildStartDateTime)\r\n .local()\r\n .format('hh:mm:ss a, Do MMMM');\r\n const reportDateDisplay = ' - ' + moment(this.props.reportDate).format('DD MMMM YYYY');\r\n\r\n return (\r\n \r\n
\r\n \r\n {notificationDateDisplay}\r\n

\r\n

{organisationName}

\r\n

\r\n {reportModeTag} \r\n {reportTitle}\r\n {reportDateDisplay}\r\n

\r\n

\r\n Started at {reportBuildStartDateTimeDisplay}\r\n

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

{reportMessage}

\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state) => {\r\n return {\r\n organisations: state.organisations.organisations,\r\n };\r\n};\r\n\r\nexport const NotificationReportBuildFailed = connect(mapStateToProps)(NotificationReportBuildFailedClass);\r\n","import * as React from 'react';\r\n\r\nimport { connect } from 'react-redux';\r\nimport { CSSTransition } from 'react-transition-group';\r\n\r\nimport { ExportType } from '../../../Codes';\r\nimport LazyLoadingComponent from '../../Hoc/LazyLoadingComponent';\r\nimport {\r\n getNotifications,\r\n setNotificationRead,\r\n setNotificationsRead,\r\n setNotificationDismissed,\r\n setAllNotificationsDismissed,\r\n IGetNotificationsFilter,\r\n} from '../../Store/Actions/NotificationsActions';\r\nimport { addToDisplayedNotificationIds, setDisplayCount } from '../../Store/Actions/NotificationsMenuActions';\r\nimport * as SidebarActions from '../../Store/Actions/SidebarActions';\r\nimport {\r\n initialState,\r\n INotificationsMenuState,\r\n NOTIFICATION_COUNT,\r\n} from '../../Store/Reducers/NotificationsMenuReducer';\r\nimport { SidebarMenu } from '../../Store/Reducers/SidebarReducer';\r\nimport { OverlayPane } from '../OverlayPane';\r\nimport { INotification, NotificationStatus } from './Notification';\r\nimport { NotificationType } from './NotificationMessages';\r\nimport { enumAllowedActions, NotificationReportBuildCompleted } from './NotificationReportComplete';\r\nimport { NotificationReportBuildDelayed } from './NotificationReportDelayed';\r\nimport { NotificationReportBuildFailed } from './NotificationReportFailed';\r\n\r\nexport interface INotificationsMenuProps {\r\n organisationId?: string;\r\n isOpen: boolean;\r\n menu: SidebarMenu;\r\n notificationsCount: number;\r\n notifications: Map; //TODO: this should be only notification interfaces\r\n nextCursor: string;\r\n setOpen: (open: boolean, menu?: SidebarMenu) => void;\r\n getNotifications: (windowCode: string, filter: IGetNotificationsFilter, count: number, cursor?: string) => void;\r\n setNotificationRead: (windowCode: string, notificationId: string) => void;\r\n setNotificationsRead: (windowCode: string, notifications: Array) => void;\r\n setNotificationDismissed: (windowCode: string, notificationId: string) => void;\r\n addToDisplayedNotificationIds: (notificationIds: Array, organisationId?: string) => void;\r\n setDisplayCount: (count: number) => void;\r\n setAllNotificationsDismissed: (windowCode: string, latestNotificationId: string, organisationId?: string) => void;\r\n notificationsArr: Array;\r\n isNotificationsFetching: boolean;\r\n}\r\n\r\nexport enum tabs {\r\n ALL = 'all',\r\n ORG = 'org',\r\n}\r\n\r\nexport class NotificationsMenu extends React.Component {\r\n constructor(props: INotificationsMenuProps) {\r\n super(props);\r\n\r\n this.state = initialState;\r\n\r\n this.closeOverlay = this.closeOverlay.bind(this);\r\n this.onClickDismiss = this.onClickDismiss.bind(this);\r\n }\r\n\r\n componentDidUpdate(prevProps: INotificationsMenuProps, prevState: INotificationsMenuState) {\r\n if (this.props.menu === SidebarMenu.Notifications) {\r\n if (!prevProps.isOpen && this.props.isOpen) {\r\n // when we open the menu\r\n this.getNotifications(NOTIFICATION_COUNT);\r\n this.markDisplayNotificationsRead();\r\n }\r\n\r\n if (prevState.tab != this.state.tab) {\r\n // changed tab\r\n this.getNotifications(NOTIFICATION_COUNT);\r\n this.markDisplayNotificationsRead();\r\n }\r\n }\r\n }\r\n\r\n getNotifications(nextCount: number) {\r\n const windowCode = (window as any).WINDOW_CODE;\r\n\r\n const filter: IGetNotificationsFilter = this.getFilters();\r\n let nextCursor: string;\r\n if (this.props.nextCursor) nextCursor = this.props.nextCursor;\r\n\r\n this.props.getNotifications(windowCode, filter, NOTIFICATION_COUNT, nextCursor);\r\n this.props.setDisplayCount(nextCount);\r\n }\r\n\r\n getMoreNotifications() {\r\n if (this.props.nextCursor) {\r\n const nextCount = this.props.notificationsCount + NOTIFICATION_COUNT;\r\n this.getNotifications(nextCount);\r\n }\r\n }\r\n\r\n getFilters() {\r\n const filter: IGetNotificationsFilter = {};\r\n if (this.state.tab === tabs.ORG) filter.OrganisationId = this.props.organisationId;\r\n return filter;\r\n }\r\n\r\n closeOverlay() {\r\n this.props.setOpen(false, this.props.menu);\r\n }\r\n\r\n onClickDismiss(notificationId: string) {\r\n const windowCode = (window as any).WINDOW_CODE;\r\n this.props.setNotificationDismissed(windowCode, notificationId);\r\n }\r\n\r\n dismissAll = () => {\r\n const windowCode = (window as any).WINDOW_CODE;\r\n const topNotificationId = this.props.notificationsArr.length > 0 ? this.props.notificationsArr[0].id : null;\r\n this.props.setAllNotificationsDismissed(windowCode, topNotificationId);\r\n };\r\n\r\n dismissAllForOrg = () => {\r\n const windowCode = (window as any).WINDOW_CODE;\r\n const topNotificationId = this.props.notificationsArr.length > 0 ? this.props.notificationsArr[0].id : null;\r\n this.props.setAllNotificationsDismissed(windowCode, topNotificationId, this.props.organisationId);\r\n };\r\n\r\n markDisplayNotificationsRead = (organisationId?: string) => {\r\n const notificationsToShow = this.displayNotifications();\r\n\r\n //add to our list of displayed notifications, so we can mark them read for the UI at a later point\r\n const notificationsToShowIds = notificationsToShow.map((x) => x.id);\r\n this.props.addToDisplayedNotificationIds(notificationsToShowIds, organisationId);\r\n };\r\n\r\n displayNotifications = (organisationId?: string) => {\r\n let { notificationsArr } = this.props;\r\n\r\n //if org only, filter to org\r\n if (organisationId) {\r\n notificationsArr = notificationsArr.filter((x) => x.organisationId && x.organisationId === organisationId);\r\n }\r\n\r\n //limit number of displayed notifications\r\n const limit = this.props.notificationsCount;\r\n const notificationsToShow = notificationsArr.slice(0, limit);\r\n return notificationsToShow;\r\n };\r\n\r\n setTab(e: any, tab: string) {\r\n this.setState({ tab: tab });\r\n }\r\n\r\n render() {\r\n const notificationsMenu = this;\r\n const isOpen = this.props.isOpen && this.props.menu === SidebarMenu.Notifications;\r\n\r\n const filterByOrg = this.state.tab === tabs.ORG;\r\n let notificationsToShow = [];\r\n if (filterByOrg && this.props.organisationId) {\r\n notificationsToShow = this.displayNotifications(this.props.organisationId);\r\n } else {\r\n notificationsToShow = this.displayNotifications();\r\n }\r\n\r\n //parse our notifications array in to components\r\n const notificationsItems = (function () {\r\n return notificationsToShow.map(function (item, i) {\r\n if (item.type === NotificationType.ReportBuildCompleted) {\r\n return (\r\n notificationsMenu.onClickDismiss(item.id)}\r\n />\r\n );\r\n } else if (item.type === NotificationType.ReportBuildDelayed) {\r\n return (\r\n notificationsMenu.onClickDismiss(item.id)}\r\n />\r\n );\r\n } else if (item.type === NotificationType.ReportBuildFailed) {\r\n return (\r\n notificationsMenu.onClickDismiss(item.id)}\r\n />\r\n );\r\n }\r\n });\r\n })();\r\n\r\n //create our renderable list of notifications\r\n const notificationsList = (() => {\r\n if (filterByOrg || (notificationsItems.length <= 0 && this.props.isNotificationsFetching)) {\r\n return null;\r\n }\r\n if (notificationsItems.length <= 0) {\r\n return (\r\n
\r\n

You're all up to date.

\r\n

\r\n When you have notifications we'll show them here.\r\n

\r\n
\r\n );\r\n }\r\n return
    {notificationsItems}
;\r\n })();\r\n\r\n const organisationNotificationsList = (() => {\r\n if (!filterByOrg || (notificationsItems.length <= 0 && this.props.isNotificationsFetching)) {\r\n return null;\r\n }\r\n if (notificationsItems.length <= 0) {\r\n return (\r\n
\r\n

\r\n You're all up to date for this organisation.\r\n

\r\n

\r\n When you have notifications we'll show them here.\r\n

\r\n
\r\n );\r\n }\r\n return
    {notificationsItems}
;\r\n })();\r\n\r\n const spinner = (\r\n
\r\n {' '}\r\n
{' '}\r\n
\r\n );\r\n\r\n return (\r\n \r\n this.getMoreNotifications()}\r\n data-test-id=\"notificationsmenu\"\r\n >\r\n
\r\n

Notifications

\r\n
\r\n notificationsMenu.setTab(e, tabs.ALL)}\r\n data-test-id=\"notificationsmenu-tab-all-btn\"\r\n >\r\n All\r\n \r\n {this.props.organisationId ? (\r\n notificationsMenu.setTab(e, tabs.ORG)}\r\n data-test-id=\"notificationsmenu-tab-org-btn\"\r\n >\r\n Current Organisation\r\n \r\n ) : null}\r\n
\r\n \r\n \"Close\"\r\n \r\n
\r\n \r\n
\r\n LATEST\r\n
\r\n {notificationsToShow.length > 0 && (\r\n \r\n Dismiss all\r\n \r\n )}\r\n
\r\n
\r\n {notificationsList}\r\n {this.props.isNotificationsFetching && spinner}\r\n
\r\n\r\n {this.props.organisationId ? (\r\n \r\n
\r\n LATEST\r\n
\r\n {notificationsToShow.length > 0 && (\r\n \r\n Dismiss all\r\n \r\n )}\r\n
\r\n
\r\n {organisationNotificationsList}\r\n {this.props.isNotificationsFetching && spinner}\r\n \r\n ) : null}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport const getArrFromNotificationsMap = (notificationsMap: any): Array => {\r\n let notificationsArr: Array = Object.keys(notificationsMap).map((key) => {\r\n return { ...notificationsMap[key] };\r\n });\r\n //filter dismissed notifications out\r\n notificationsArr = notificationsArr.filter((x) => x.status !== NotificationStatus.Dismissed);\r\n notificationsArr.sort((a, b) => new Date(b.createdOnUtc).getTime() - new Date(a.createdOnUtc).getTime());\r\n return notificationsArr;\r\n};\r\n\r\nconst mapStateToProps = (state) => {\r\n return {\r\n isOpen: state.sidebar.isOpen,\r\n menu: state.sidebar.menu,\r\n notificationsCount: state.notificationsMenu.notificationsCount,\r\n notifications: state.notifications.notifications,\r\n nextCursor: state.notifications.nextCursor,\r\n notificationsArr: getArrFromNotificationsMap(state.notifications.notifications),\r\n isNotificationsFetching: state.notifications.fetchingNotifications,\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n setOpen: (isOpen, menu) => dispatch(SidebarActions.setOpen(isOpen, menu)),\r\n getNotifications: (windowCode, filter, count, cursor) =>\r\n dispatch(getNotifications(windowCode, filter, count, cursor)),\r\n setNotificationRead: (windowCode, notificationId) => dispatch(setNotificationRead(windowCode, notificationId)),\r\n setNotificationsRead: (windowCode, notifications) => dispatch(setNotificationsRead(windowCode, notifications)),\r\n setNotificationDismissed: (windowCode, notificationId) =>\r\n dispatch(setNotificationDismissed(windowCode, notificationId)),\r\n addToDisplayedNotificationIds: (notificationIds, organisationId) =>\r\n dispatch(addToDisplayedNotificationIds(notificationIds, organisationId)),\r\n setDisplayCount: (count) => dispatch(setDisplayCount(count)),\r\n setAllNotificationsDismissed: (windowCode: string, latestNotificationId: string, organisationId?: string) =>\r\n dispatch(setAllNotificationsDismissed(windowCode, latestNotificationId, organisationId)),\r\n };\r\n};\r\n\r\nexport const NotificationsMenuComponent = connect(mapStateToProps, mapDispatchToProps)(NotificationsMenu);\r\n","import * as React from 'react';\r\n\r\nimport { connect } from 'react-redux';\r\n\r\nimport * as SidebarActions from '../../Store/Actions/SidebarActions';\r\nimport { SidebarMenu } from '../../Store/Reducers/SidebarReducer';\r\nimport * as analytics from '../Analytics';\r\nimport { actionWithHooksHOC } from './NotificationHeaderAction';\r\n\r\ninterface NotificationHeaderProps {\r\n newNotificationsCount?: number;\r\n setNotificationMenuOpen?: (open: boolean, menu: SidebarMenu) => void;\r\n}\r\nexport class NotificationHeaderClass extends React.Component {\r\n constructor(props: NotificationHeaderProps) {\r\n super(props);\r\n }\r\n\r\n handleNotificationClick = (event: React.SyntheticEvent) => {\r\n event.preventDefault();\r\n analytics.track(analytics.EventType.OpenedNotifications);\r\n this.props.setNotificationMenuOpen(true, SidebarMenu.Notifications);\r\n };\r\n\r\n render() {\r\n const count = this.props.newNotificationsCount < 100 ? this.props.newNotificationsCount : '99+';\r\n return (\r\n
\r\n
\r\n \r\n\r\n {this.props.newNotificationsCount ? (\r\n
\r\n
\r\n {count}\r\n
\r\n
\r\n ) : null}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n setNotificationMenuOpen: (isOpen, menu) => dispatch(SidebarActions.setOpen(isOpen, menu)),\r\n };\r\n};\r\n\r\nconst ConnectedNotificationHeader = connect(null, mapDispatchToProps)(NotificationHeaderClass);\r\nexport const NotificationHeader = actionWithHooksHOC(ConnectedNotificationHeader);\r\n","import * as React from 'react';\r\nimport { useEffect, useRef, useState } from 'react';\r\n\r\nimport RestService from '../../Services/RestService';\r\n\r\nexport function useUnreadNotificationsCountReceived(): number {\r\n const [unreadCount, setUnreadCount] = useState(0);\r\n const isMounted = useRef(false);\r\n const [lastPollTime, setLastPollTime] = useState(new Date());\r\n\r\n useEffect(() => {\r\n isMounted.current = true;\r\n\r\n const getUnreadNotificationsCount = async () => {\r\n try {\r\n const response = await RestService.GetNotificationUnreadCount();\r\n return response?.data;\r\n } catch (error) {\r\n console.error('Spotlight.RestService.GetNotificationUnreadCount', error);\r\n }\r\n };\r\n\r\n setTimeout(async () => {\r\n if (!isMounted.current) {\r\n return;\r\n }\r\n\r\n const data = await getUnreadNotificationsCount();\r\n\r\n if (!isMounted.current) {\r\n return;\r\n }\r\n\r\n setUnreadCount(data?.count ?? 0);\r\n setLastPollTime(new Date()); // trigger next poll\r\n }, 3000);\r\n\r\n return () => {\r\n isMounted.current = false;\r\n };\r\n }, [lastPollTime]);\r\n\r\n return unreadCount;\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\r\nexport const actionWithHooksHOC = (Component: any) => {\r\n // eslint-disable-next-line react/display-name, @typescript-eslint/explicit-module-boundary-types\r\n return (props: any): any => {\r\n const newNotificationsCount = useUnreadNotificationsCountReceived();\r\n\r\n return ;\r\n };\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { connect } from 'react-redux';\r\n\r\nimport * as SidebarActions from '../../../Store/Actions/SidebarActions';\r\nimport { SidebarMenu } from '../../../Store/Reducers/SidebarReducer';\r\n\r\nexport interface IHelpButtonProps {\r\n setHelpMenuOpen?: (open: boolean, menu: SidebarMenu) => void;\r\n}\r\n\r\nexport class HelpButtonClass extends React.Component {\r\n constructor(props: IHelpButtonProps) {\r\n super(props);\r\n }\r\n\r\n openMenu() {\r\n this.props.setHelpMenuOpen(true, SidebarMenu.Help);\r\n }\r\n\r\n render() {\r\n return (\r\n
this.openMenu()}>\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state) => {\r\n return {\r\n isOpen: state.notificationsMenu.isOpen,\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n setHelpMenuOpen: (isOpen, menu) => dispatch(SidebarActions.setOpen(isOpen, menu)),\r\n };\r\n};\r\n\r\nexport const HelpButton = connect(mapStateToProps, mapDispatchToProps)(HelpButtonClass);\r\n","import * as React from 'react';\r\nimport { useMemo } from 'react';\r\n\r\nimport { DropdownMenu } from '@ui';\r\n\r\nimport { AppRoutes } from '../../../Helpers/app-routes';\r\nimport RestService from '../../../Services/RestService';\r\n\r\nexport interface MyAccountMenuProps {\r\n authMode: string;\r\n}\r\n\r\nenum dropdownValueTypes {\r\n ChangePassword = 'CHANGE_PASSWORD',\r\n MFA = 'MFA',\r\n Signout = 'SIGNOUT',\r\n}\r\n\r\ninterface MyAccountButtonProps {\r\n onClick: React.MouseEventHandler;\r\n}\r\n\r\nconst MyAccountButton = React.forwardRef(({ onClick }, ref) => {\r\n return (\r\n \r\n \r\n
My account
\r\n \r\n );\r\n});\r\n\r\nMyAccountButton.displayName = 'MyAccountButton';\r\n\r\nexport const MyAccountMenu: React.FC> = ({ authMode }) => {\r\n const options = useMemo(\r\n () =>\r\n authMode === 'Idp'\r\n ? [{ text: 'Sign out', value: dropdownValueTypes.Signout }]\r\n : [\r\n {\r\n text: 'Change password',\r\n value: dropdownValueTypes.ChangePassword,\r\n },\r\n {\r\n text: 'Two-Step Authentication',\r\n value: dropdownValueTypes.MFA,\r\n },\r\n {\r\n text: 'Sign out',\r\n value: dropdownValueTypes.Signout,\r\n },\r\n ],\r\n [authMode],\r\n );\r\n\r\n const actionHandler = ({ type, payload }) => {\r\n if (type === 'UPDATE_VALUE') {\r\n const value = payload.value;\r\n switch (value) {\r\n case dropdownValueTypes.ChangePassword: {\r\n return window.location.assign(AppRoutes.ChangePassword);\r\n break;\r\n }\r\n case dropdownValueTypes.MFA: {\r\n return window.location.assign(AppRoutes.MFASettings);\r\n break;\r\n }\r\n case dropdownValueTypes.Signout: {\r\n RestService.clearSessionTimeoutCookie();\r\n window.location.assign(AppRoutes.SignOut);\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n }\r\n };\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { connect } from 'react-redux';\r\n\r\nimport * as SidebarActions from '../../../Store/Actions/SidebarActions';\r\nimport { SidebarMenu } from '../../../Store/Reducers/SidebarReducer';\r\n\r\ndeclare const underscore: any;\r\n\r\nexport interface IRecentOrgButtonProps {\r\n organisationName?: string;\r\n setOrganisationMenuOpen?: (open: boolean, menu: SidebarMenu) => void;\r\n}\r\n\r\nexport class RecentOrgButtonClass extends React.Component {\r\n constructor(props: IRecentOrgButtonProps) {\r\n super(props);\r\n }\r\n\r\n openMenu() {\r\n this.props.setOrganisationMenuOpen(true, SidebarMenu.Organisations);\r\n }\r\n\r\n render() {\r\n return (\r\n
this.openMenu()}>\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n setOrganisationMenuOpen: (isOpen, menu) => dispatch(SidebarActions.setOpen(isOpen, menu)),\r\n };\r\n};\r\n\r\nexport const RecentOrgButton = connect(null, mapDispatchToProps)(RecentOrgButtonClass);\r\n","import * as React from 'react';\r\n\r\nimport { connect } from 'react-redux';\r\n\r\nimport * as SidebarActions from '../../../Store/Actions/SidebarActions';\r\nimport * as WhatsNewActions from '../../../Store/Actions/WhatsNewActions';\r\nimport { SidebarMenu } from '../../../Store/Reducers/SidebarReducer';\r\nimport * as analytics from '../../Analytics';\r\n\r\nexport interface IWhatsNewButtonProps {\r\n setWhatsNewMenuOpen?: (open: boolean, menu: SidebarMenu) => void;\r\n displayAlert?: boolean;\r\n}\r\n\r\nexport class WhatsNewButtonClass extends React.Component {\r\n constructor(props: IWhatsNewButtonProps) {\r\n super(props);\r\n }\r\n\r\n handleWhatsNewClick() {\r\n analytics.track(analytics.EventType.OpenedWhatsNew);\r\n this.props.setWhatsNewMenuOpen(true, SidebarMenu.WhatsNew);\r\n }\r\n\r\n render() {\r\n return (\r\n
this.handleWhatsNewClick()}>\r\n \r\n\r\n {this.props.displayAlert && (\r\n
\r\n
\r\n
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state) => {\r\n return {\r\n displayAlert: state.whatsNew.displayAlert,\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n setWhatsNewMenuOpen: (isOpen, menu) => dispatch(SidebarActions.setOpen(isOpen, menu)),\r\n };\r\n};\r\n\r\nexport const WhatsNewButton = connect(mapStateToProps, mapDispatchToProps)(WhatsNewButtonClass);\r\n","import * as React from 'react';\r\nimport { useEffect, useState } from 'react';\r\n\r\nimport RestService from '../../Services/RestService';\r\nimport { NotificationHeader } from '../Notifications/NotificationHeader';\r\nimport { HelpButton } from './Help/HelpButton';\r\nimport { MyAccountMenu } from './MyAccount/MyAccountMenu';\r\nimport { RecentOrgButton } from './RecentOrg/RecentOrgButton';\r\nimport { WhatsNewButton } from './WhatsNew/WhatsNewButton';\r\n\r\nexport interface HeaderMenuProps {\r\n organisationName?: string;\r\n}\r\n\r\nexport const HeaderMenu: React.FC> = ({ organisationName }) => {\r\n const [authMode, setAuthMode] = useState();\r\n\r\n useEffect(() => {\r\n let ignore = false;\r\n\r\n const fetchAuthMode = async () => {\r\n // It doesn't feel right getting the entire MFA setting for this component.\r\n // We should instead be just passing the auth mode from BE down to this component.\r\n // If we really have to, use the new RestService.GetMFASettingsForMember, instead\r\n // and remove RestService.GetMFASettings and related codes in FE and BE\r\n const mfaSettings = (await RestService.GetMFASettings()).data;\r\n\r\n if (!ignore) {\r\n setAuthMode(mfaSettings.authMode);\r\n }\r\n };\r\n\r\n fetchAuthMode();\r\n\r\n return () => {\r\n ignore = true;\r\n };\r\n }, []);\r\n\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { connect } from 'react-redux';\r\n\r\nimport { ReportMode } from '../../../../Codes';\r\nimport { AppRoutes } from '../../../Helpers';\r\nimport * as SidebarActions from '../../../Store/Actions/SidebarActions';\r\nimport { SidebarMenu } from '../../../Store/Reducers/SidebarReducer';\r\nimport * as analytics from '../../Analytics';\r\nimport { OverlayPane } from '../../OverlayPane';\r\n\r\ndeclare const Spotlight: any;\r\n\r\nexport interface IHelpMenuProps {\r\n isOpen: boolean;\r\n menu: SidebarMenu;\r\n setOpen: (open: boolean, menu?: SidebarMenu) => void;\r\n canAccessTransformInAction: boolean;\r\n canAccessCertification: boolean;\r\n transformInActionFFOn?: boolean;\r\n}\r\n\r\nexport class HelpMenuClass extends React.Component {\r\n constructor(props: IHelpMenuProps) {\r\n super(props);\r\n }\r\n\r\n closeOverlay() {\r\n this.props.setOpen(false, this.props.menu);\r\n }\r\n\r\n showHelpCenter() {\r\n analytics.track(analytics.EventType.OpenedHelp);\r\n this.closeOverlay();\r\n window.open(`/help/${(window as any).WINDOW_CODE}?mode=${Spotlight.ReportMode}`);\r\n }\r\n\r\n showSupportModal() {\r\n this.closeOverlay();\r\n Spotlight.ToggleModal('Support');\r\n }\r\n\r\n showTransformInAction() {\r\n analytics.track(analytics.EventType.OpenedHelpTransformationInAction);\r\n this.closeOverlay();\r\n\r\n this.props.transformInActionFFOn\r\n ? location.assign(AppRoutes.TransformInAction)\r\n : window.open('https://learning.spotlightreporting.com/');\r\n }\r\n\r\n showSpotlightCertification() {\r\n analytics.track(analytics.EventType.OpenedHelpSpotlightCertification);\r\n this.closeOverlay();\r\n window.open('https://www.spotlightreporting.com/resources/course/');\r\n }\r\n\r\n showOtherResources() {\r\n analytics.track(analytics.EventType.OpenedHelpOtherResources);\r\n this.closeOverlay();\r\n\r\n if (window.Spotlight.ReportMode === ReportMode.Sustain) {\r\n window.open('https://www.spotlightsustain.com');\r\n } else {\r\n window.open('https://www.spotlightreporting.com/resources/webinars/');\r\n }\r\n }\r\n\r\n render() {\r\n const isOpen = this.props.isOpen && this.props.menu === SidebarMenu.Help;\r\n\r\n return (\r\n this.closeOverlay()}\r\n isOpen={isOpen}\r\n >\r\n
\r\n
\r\n

Help

\r\n this.closeOverlay()}\r\n data-test-id=\"help-menu-close-button\"\r\n >\r\n \"Close\"\r\n \r\n
\r\n
\r\n
\r\n
    \r\n
  • this.showHelpCenter()} data-test-id=\"help-centre-btn\">\r\n \r\n

    Help Centre

    \r\n
  • \r\n
  • this.showSupportModal()} data-test-id=\"support-query-btn\">\r\n \r\n

    Raise Support Query

    \r\n
  • \r\n {(this.props.transformInActionFFOn || this.props.canAccessTransformInAction) && (\r\n
  • this.showTransformInAction()} data-test-id=\"transform-in-action-btn\">\r\n \r\n

    Transform in Action

    \r\n
  • \r\n )}\r\n {this.props.canAccessCertification && (\r\n this.showSpotlightCertification()}\r\n data-test-id=\"spotlight-certification-btn\"\r\n >\r\n \r\n

    Spotlight Certification

    \r\n \r\n )}\r\n
  • this.showOtherResources()} data-test-id=\"other-resources-btn\">\r\n \r\n

    Other Resources

    \r\n
  • \r\n
\r\n
\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state) => {\r\n return {\r\n isOpen: state.sidebar.isOpen,\r\n menu: state.sidebar.menu,\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n setOpen: (isOpen, menu) => dispatch(SidebarActions.setOpen(isOpen, menu)),\r\n };\r\n};\r\n\r\nexport const HelpMenu = connect(mapStateToProps, mapDispatchToProps)(HelpMenuClass);\r\n","import * as React from 'react';\r\n\r\nimport { connect } from 'react-redux';\r\nimport { CSSTransition } from 'react-transition-group';\r\n\r\nimport { Endpoints } from '../../../Services/Endpoints';\r\nimport * as ReportActions from '../../../Store/Actions/ReportHistoryActions';\r\nimport * as SidebarActions from '../../../Store/Actions/SidebarActions';\r\nimport { IRecentReport } from '../../../Store/Reducers/ReportHistoryReducer';\r\nimport { SidebarMenu } from '../../../Store/Reducers/SidebarReducer';\r\nimport { OverlayPane } from '../../OverlayPane';\r\n\r\nexport interface IRecentOrgMenuProps {\r\n isOpen: boolean;\r\n menu: SidebarMenu;\r\n recentReports: Array;\r\n loadingRecentReports: boolean;\r\n getRecentReports: () => void;\r\n setOpen: (open: boolean, menu?: SidebarMenu) => void;\r\n}\r\n\r\nexport class RecentOrgMenuClass extends React.Component {\r\n constructor(props: IRecentOrgMenuProps) {\r\n super(props);\r\n }\r\n\r\n componentDidUpdate(prevProps: IRecentOrgMenuProps) {\r\n if (!prevProps.isOpen && this.props.isOpen && this.props.menu === SidebarMenu.Organisations) {\r\n // when we open the menu\r\n this.props.getRecentReports();\r\n }\r\n }\r\n\r\n closeOverlay() {\r\n this.props.setOpen(false, this.props.menu);\r\n }\r\n\r\n render() {\r\n const isOpen = this.props.isOpen && this.props.menu === SidebarMenu.Organisations;\r\n\r\n return (\r\n this.closeOverlay()}\r\n isOpen={isOpen}\r\n >\r\n
\r\n
\r\n

Recent Reports

\r\n this.closeOverlay()}\r\n data-test-id=\"recent-org-menu-close-button\"\r\n >\r\n \"Close\"\r\n \r\n
\r\n
\r\n
\r\n {this.props.loadingRecentReports ? (\r\n
\r\n ) : (\r\n
    \r\n {this.props.recentReports.map((recentReport: IRecentReport, index: number) => {\r\n const orgLink = `${Endpoints.Connect}?show=DASHBOARD&organisationId=${recentReport.organisationId}&mode=${recentReport.reportMode}`;\r\n const reportLink = `${Endpoints.Connect}?show=REPORT&organisationId=${recentReport.organisationId}&reportId=${recentReport.reportId}`;\r\n return (\r\n
  • \r\n \r\n {recentReport.reportTitle}\r\n \r\n \r\n {recentReport.organisationName}\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\nconst mapStateToProps = (state) => {\r\n return {\r\n isOpen: state.sidebar.isOpen,\r\n menu: state.sidebar.menu,\r\n recentReports: state.reportHistory.recentReports,\r\n loadingRecentReports: state.reportHistory.loadingRecentReports,\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n setOpen: (isOpen, menu) => dispatch(SidebarActions.setOpen(isOpen, menu)),\r\n getRecentReports: () => dispatch(ReportActions.getRecentReports()),\r\n };\r\n};\r\n\r\nexport const RecentOrgMenu = connect(mapStateToProps, mapDispatchToProps)(RecentOrgMenuClass);\r\n","import * as React from 'react';\r\n\r\nimport { ArticleData } from '@ui';\r\nimport { connect } from 'react-redux';\r\n\r\nimport * as SidebarActions from '../../../Store/Actions/SidebarActions';\r\nimport * as WhatsNewActions from '../../../Store/Actions/WhatsNewActions';\r\nimport { SidebarMenu } from '../../../Store/Reducers/SidebarReducer';\r\nimport { LatestReleaseNotes } from '../../LatestReleaseNotes';\r\nimport { OverlayPane } from '../../OverlayPane';\r\n\r\nexport interface IWhatsNewMenuProps {\r\n isOpen: boolean;\r\n menu: SidebarMenu;\r\n releaseNotes: Array;\r\n loadingReleaseNotes: boolean;\r\n getReleaseNotes: () => void;\r\n setOpen: (open: boolean, menu?: SidebarMenu) => void;\r\n}\r\n\r\nexport class WhatsNewMenuClass extends React.Component {\r\n constructor(props: IWhatsNewMenuProps) {\r\n super(props);\r\n }\r\n\r\n componentDidMount() {\r\n this.props.getReleaseNotes();\r\n }\r\n\r\n closeOverlay() {\r\n this.props.setOpen(false, this.props.menu);\r\n }\r\n\r\n render() {\r\n const isOpen = this.props.isOpen && this.props.menu === SidebarMenu.WhatsNew;\r\n\r\n return (\r\n this.closeOverlay()}\r\n isOpen={isOpen}\r\n >\r\n
\r\n
\r\n

What's New

\r\n this.closeOverlay()}\r\n data-test-id=\"whats-new-menu-close-button\"\r\n >\r\n \"Close\"\r\n \r\n
\r\n
\r\n

LATEST

\r\n \r\n
\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state) => {\r\n return {\r\n isOpen: state.sidebar.isOpen,\r\n menu: state.sidebar.menu,\r\n releaseNotes: state.whatsNew.releaseNotes,\r\n loadingReleaseNotes: state.whatsNew.loadingReleaseNotes,\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n setOpen: (isOpen, menu) => dispatch(SidebarActions.setOpen(isOpen, menu)),\r\n getReleaseNotes: () => dispatch(WhatsNewActions.getReleaseNotes()),\r\n };\r\n};\r\n\r\nexport const WhatsNewMenu = connect(mapStateToProps, mapDispatchToProps)(WhatsNewMenuClass);\r\n","import * as React from 'react';\r\nimport { useEffect, useMemo, useState } from 'react';\r\n\r\nimport { ReportMode } from '../../../Codes';\r\nimport { AppRoutes } from '../../Helpers';\r\nimport { FeatureFlags } from '../../Helpers/feature-flags';\r\nimport RestService from '../../Services/RestService';\r\nimport { NotificationsMenuComponent } from '../Notifications/NotificationsMenu';\r\nimport { HeaderMenu } from './HeaderMenu';\r\nimport { HelpMenu } from './Help/HelpMenu';\r\nimport { RecentOrgMenu } from './RecentOrg/RecentOrgMenu';\r\nimport { WhatsNewMenu } from './WhatsNew/WhatsNewMenu';\r\n\r\nexport interface HeaderProps {\r\n reportMode: string;\r\n windowCode?: string;\r\n organisationId?: string;\r\n organisationName?: string;\r\n canAccessTransformInAction: boolean;\r\n canAccessCertification: boolean;\r\n}\r\n\r\nconst Header: React.FC> = ({\r\n reportMode,\r\n windowCode = '',\r\n organisationId,\r\n organisationName,\r\n canAccessTransformInAction,\r\n canAccessCertification,\r\n children,\r\n}) => {\r\n const [transformInActionFFOn, setTransformInActionFFOn] = useState();\r\n const logoUrl = useMemo(() => {\r\n switch (reportMode) {\r\n case ReportMode.Spotlight:\r\n return AppRoutes.ReportingLandingPage;\r\n case ReportMode.Dashboard:\r\n return AppRoutes.DashboardsLandingPage;\r\n case ReportMode.Sustain:\r\n return AppRoutes.SustainLandingPage;\r\n default:\r\n return `/${windowCode}?reportMode=${reportMode.replace('FRANCHISE', 'MULTI')}`;\r\n }\r\n }, [reportMode, windowCode]);\r\n\r\n useEffect(() => {\r\n const getFeatureFlag = async () => {\r\n try {\r\n const transformInActionFFOn = (await RestService.GetFeatureFlagValue(FeatureFlags.TiaWebflow)).data;\r\n setTransformInActionFFOn(transformInActionFFOn);\r\n } catch {\r\n setTransformInActionFFOn(false);\r\n }\r\n };\r\n\r\n getFeatureFlag();\r\n }, []);\r\n\r\n return (\r\n <>\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport { Header };\r\n","import * as React from 'react';\r\nimport { useEffect, useState, useCallback } from 'react';\r\n\r\nimport { DropdownMenu } from '@ui';\r\nimport dayjs from 'dayjs';\r\n\r\nimport { ForecastEventTypes } from '../../../../../ModernScripts/Spotlight/Forecasting/Spotlight.Forecasting';\r\nimport { Task, TaskTypes } from '../../../../../ModernScripts/Spotlight/Forecasting/interfaces';\r\nimport { EventCode, ReportMode } from '../../../../Codes';\r\nimport RestService from '../../../Services/RestService';\r\n\r\nexport interface TaskManagerItem {\r\n id: string;\r\n description: string;\r\n}\r\n\r\nexport interface CustomiseDataOption {\r\n type: CustomiseDataOptionType;\r\n value: string;\r\n text: string;\r\n flagColour: string;\r\n}\r\n\r\nexport enum CustomiseDataOptionType {\r\n Budgets = 'budgets',\r\n Forecasts = 'forecasts',\r\n Scenarios = 'scenarios',\r\n Drivers = 'drivers',\r\n Measures = 'measures',\r\n}\r\n\r\nexport interface CustomiseDataDropdownProps {\r\n reportId: string;\r\n organisationId: string;\r\n dataOptionSelectedCallback: (dataOptionType: CustomiseDataOptionType, dataSourceId: string) => void;\r\n tasks: Task[];\r\n selectedItem?: string;\r\n}\r\n\r\ninterface CustomiseDataDropdownState {\r\n drivers: TaskManagerItem[];\r\n measures: TaskManagerItem[];\r\n options: CustomiseDataOption[];\r\n}\r\n\r\nconst mapDataSources = (tasks, drivers, measures) => {\r\n const budgetOptions: CustomiseDataOption[] =\r\n tasks\r\n ?.filter((task) => task.type === TaskTypes.Budget)\r\n .map((task) => {\r\n return {\r\n type: CustomiseDataOptionType.Budgets,\r\n flagColour: '#42618a',\r\n value: task.id,\r\n text: task.description,\r\n };\r\n }) || [];\r\n\r\n const forecastOptions: CustomiseDataOption[] =\r\n tasks\r\n ?.filter((task) => task.type === TaskTypes.Forecast)\r\n .map((task) => {\r\n return {\r\n type: CustomiseDataOptionType.Forecasts,\r\n flagColour: '#68458c',\r\n value: task.id,\r\n text: task.description,\r\n };\r\n }) || [];\r\n\r\n const scenarioOptions: CustomiseDataOption[] =\r\n tasks\r\n ?.filter((task) => task.type === TaskTypes.Scenario)\r\n .map((task) => {\r\n return {\r\n type: CustomiseDataOptionType.Scenarios,\r\n flagColour: '#f15b3a',\r\n value: task.id,\r\n text: task.description,\r\n };\r\n }) || [];\r\n\r\n const driversOptions: CustomiseDataOption[] =\r\n drivers?.map((item) => {\r\n return {\r\n type: CustomiseDataOptionType.Drivers,\r\n flagColour: '#16c0ba',\r\n value: item.id,\r\n text: item.description,\r\n };\r\n }) || [];\r\n\r\n const measuresOptions: CustomiseDataOption[] =\r\n measures?.map((item) => {\r\n return {\r\n type: CustomiseDataOptionType.Measures,\r\n flagColour: '#bf79cf',\r\n value: item.id,\r\n text: item.description,\r\n };\r\n }) || [];\r\n\r\n const allOptions = [\r\n ...budgetOptions,\r\n ...forecastOptions,\r\n ...scenarioOptions,\r\n ...driversOptions,\r\n ...measuresOptions,\r\n ];\r\n\r\n return allOptions;\r\n};\r\n\r\nconst fetchTasks = async (organisationId) => {\r\n const response = await RestService.GetForecastTasks(organisationId);\r\n const tasks = response.data.map((task) => {\r\n return {\r\n id: task.id,\r\n description: task.description,\r\n type: task.type,\r\n importFromDate: task.importFromDate ? dayjs(task.importFromDate) : undefined,\r\n importToDate: task.importToDate ? dayjs(task.importToDate) : undefined,\r\n importBudgetFromDate: task.importBudgetFromDate ? dayjs(task.importBudgetFromDate) : undefined,\r\n lastUpdated: dayjs.utc(task.lastUpdatedUtc).local(),\r\n lastUpdatedBy: task.lastUpdatedBy,\r\n };\r\n });\r\n return tasks;\r\n};\r\n\r\nconst updateTasks = (newTasks, setState) => {\r\n setState((prevState) => {\r\n const options = mapDataSources(newTasks, prevState.drivers, prevState.measures);\r\n return {\r\n ...prevState,\r\n options,\r\n };\r\n });\r\n};\r\n\r\nexport const CustomiseDataDropdown: React.FC> = ({\r\n reportId,\r\n organisationId,\r\n dataOptionSelectedCallback,\r\n tasks,\r\n selectedItem,\r\n}) => {\r\n const [state, setState] = useState({\r\n drivers: null,\r\n measures: null,\r\n options: mapDataSources(tasks, null, null),\r\n });\r\n\r\n const fetchDriversAndMeasures = React.useCallback(() => {\r\n RestService.GetForecastTaskManager(reportId, (data) => {\r\n const drivers: TaskManagerItem[] =\r\n data['Drivers'].map((item) => {\r\n return { id: item.Id, description: 'Drivers' };\r\n }) || [];\r\n const measures: TaskManagerItem[] =\r\n data['Measures'].map((item) => {\r\n return { id: item.Id, description: 'KPIs & Covenants' };\r\n }) || [];\r\n\r\n if (drivers.length === 0) {\r\n drivers.push({\r\n id: 'drivers',\r\n description: 'Drivers',\r\n });\r\n }\r\n\r\n if (measures.length === 0) {\r\n measures.push({\r\n id: 'measures',\r\n description: 'KPIs & Covenants',\r\n });\r\n }\r\n\r\n setState((prevState) => ({\r\n ...prevState,\r\n drivers,\r\n measures,\r\n }));\r\n });\r\n }, [reportId]);\r\n\r\n const createDataSource = useCallback(\r\n (dataSourceType: CustomiseDataOptionType) => {\r\n if (dataSourceType === CustomiseDataOptionType.Drivers) {\r\n const dataSourceData = {\r\n basisType: 'MANUALLYENTER',\r\n dataSourceTypeCode: 'DRIVERS',\r\n description: 'New Drivers',\r\n importFromDate: new Date(),\r\n optionsJson: JSON.stringify({\r\n cloneSource: null,\r\n cloneActuals: false,\r\n }),\r\n reportMode: ReportMode.Forecast,\r\n includeInReport: true,\r\n };\r\n\r\n const postData = {\r\n eventCode: EventCode.NewDataSource,\r\n eventJson: JSON.stringify(dataSourceData),\r\n };\r\n\r\n const successFn = (data) => {\r\n if (!data.Events) {\r\n RestService.showGenericModal('');\r\n return;\r\n }\r\n\r\n fetchDriversAndMeasures();\r\n dataOptionSelectedCallback(CustomiseDataOptionType.Drivers, data.DataSources[0].eId);\r\n };\r\n\r\n RestService.DoEvent(postData, successFn, null, null, null, null);\r\n }\r\n\r\n if (dataSourceType === CustomiseDataOptionType.Measures) {\r\n RestService.NewDataSource('MEASURES', ReportMode.Forecast, (dataSource) => {\r\n fetchDriversAndMeasures();\r\n dataOptionSelectedCallback(dataSourceType, dataSource.Id);\r\n });\r\n }\r\n },\r\n [dataOptionSelectedCallback, fetchDriversAndMeasures],\r\n );\r\n\r\n useEffect(() => {\r\n fetchDriversAndMeasures();\r\n }, [fetchDriversAndMeasures]);\r\n\r\n useEffect(() => {\r\n const allOptions = mapDataSources(tasks, state.drivers, state.measures);\r\n\r\n setState((prevState) => ({\r\n ...prevState,\r\n options: allOptions,\r\n }));\r\n }, [tasks, state.drivers, state.measures]);\r\n\r\n useEffect(() => {\r\n let ignore = false;\r\n const fetchAndUpdateTasks = async () => {\r\n const newTasks = await fetchTasks(organisationId);\r\n if (ignore) {\r\n return;\r\n }\r\n updateTasks(newTasks, setState);\r\n };\r\n\r\n window.addEventListener(ForecastEventTypes.UpdateTaskSettings, fetchAndUpdateTasks);\r\n\r\n return () => {\r\n ignore = true;\r\n window.removeEventListener(ForecastEventTypes.UpdateTaskSettings, fetchAndUpdateTasks);\r\n };\r\n }, [organisationId]);\r\n\r\n const getDataSourceTypeByValue = (value): CustomiseDataOptionType => {\r\n const match = state.options.find((item) => {\r\n return item.value === value;\r\n });\r\n return match.type;\r\n };\r\n\r\n const handleSelect = (dataSourceType, value) => {\r\n // Create a default data source if one does not exist\r\n if (\r\n [CustomiseDataOptionType.Drivers, CustomiseDataOptionType.Measures].includes(dataSourceType) &&\r\n value === dataSourceType\r\n ) {\r\n createDataSource(dataSourceType);\r\n } else {\r\n dataOptionSelectedCallback(dataSourceType, value);\r\n }\r\n };\r\n\r\n const MenuButton = React.forwardRef(({ onClick }, ref) => {\r\n return (\r\n \r\n
\r\n Customise Data\r\n
\r\n \r\n
\r\n
\r\n \r\n );\r\n });\r\n\r\n MenuButton.displayName = 'MenuButton';\r\n\r\n const actionHandler = ({ type, payload }) => {\r\n switch (type) {\r\n case 'UPDATE_VALUE': {\r\n const type = getDataSourceTypeByValue(payload.value);\r\n handleSelect(type, payload.value);\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { Task } from '../../../../../ModernScripts/Spotlight/Forecasting/interfaces';\r\nimport { camelToKebab } from '../../CamelToKebab';\r\nimport { CustomiseDataDropdown, CustomiseDataOptionType } from './CustomiseDataDropdown';\r\n\r\nexport interface ForecastingNavigationProps {\r\n reportId: string;\r\n stage: Stages;\r\n organisationId: string;\r\n windowCode: string;\r\n tasks: Array;\r\n}\r\n\r\n/** Stage views, note: not all stages appear in the nav items */\r\nexport enum Stages {\r\n AddDataSource = 'AddDataSource',\r\n TaskManager = 'TaskManager',\r\n CustomiseData = 'CustomiseData',\r\n CustomiseLayout = 'CustomiseLayout',\r\n Preview = 'Preview',\r\n Complete = 'Complete',\r\n}\r\n\r\n/** The label for the stage to appear in the nav items */\r\nconst stageDescriptions = {\r\n [Stages.TaskManager]: 'Task Manager',\r\n [Stages.CustomiseData]: 'Customise Data',\r\n [Stages.CustomiseLayout]: 'Customise Layout',\r\n [Stages.Preview]: 'Preview',\r\n [Stages.Complete]: 'Complete',\r\n};\r\n\r\nexport const ForecastingNavigation: React.FC> = ({\r\n reportId,\r\n stage,\r\n organisationId,\r\n windowCode,\r\n tasks,\r\n}) => {\r\n const baseUrl = `/Report/Build2/${windowCode}?reportId=${reportId}`;\r\n\r\n const getUrl = (stage: Stages): string =>\r\n stage === Stages.TaskManager\r\n ? `/Forecasting/${organisationId}/TaskManager`\r\n : `${baseUrl}#${stage.toUpperCase()}`;\r\n\r\n const navigateToDataSource = (type: CustomiseDataOptionType, dataSourceId: string) => {\r\n let hash = '';\r\n\r\n switch (type) {\r\n case CustomiseDataOptionType.Budgets:\r\n hash = `#BUDGETCUSTOMISE/${dataSourceId}`;\r\n break;\r\n case CustomiseDataOptionType.Forecasts:\r\n hash = `#FORECASTCUSTOMISE/${dataSourceId}`;\r\n break;\r\n case CustomiseDataOptionType.Scenarios:\r\n hash = `#SCENARIOCUSTOMISE/${dataSourceId}`;\r\n break;\r\n case CustomiseDataOptionType.Drivers:\r\n hash = `#DRIVERSCUSTOMISE/${dataSourceId}`;\r\n break;\r\n case CustomiseDataOptionType.Measures:\r\n hash = `#MEASURESCUSTOMISE/${dataSourceId}`;\r\n break;\r\n }\r\n\r\n window.location.href = baseUrl + hash;\r\n };\r\n\r\n const navItem = (itemStage: Stages) => {\r\n return (\r\n
  • \r\n \r\n {stageDescriptions[itemStage]}\r\n \r\n \r\n
  • \r\n );\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { ReportMode } from '../../../../Codes';\r\nimport { AppRoutes } from '../../../Helpers';\r\n\r\nexport interface ProductNavigationProps {\r\n canAccessReports: boolean;\r\n canAccessForecasts: boolean;\r\n canAccessDashboards: boolean;\r\n canAccessMulti: boolean;\r\n canAccessSustain: boolean;\r\n reportMode: ReportMode;\r\n}\r\n\r\nconst ProductNavigation: React.FC> = ({\r\n canAccessReports,\r\n canAccessForecasts,\r\n canAccessDashboards,\r\n canAccessMulti,\r\n canAccessSustain,\r\n reportMode,\r\n}) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport { ProductNavigation };\r\n","// TODO: move these in to Spotlight/Helpers\r\nimport RestService from '../Services/RestService';\r\nimport * as camelToKebabModule from './CamelToKebab';\r\n\r\ndeclare const $: any;\r\ndeclare const ga: any;\r\n\r\nexport function generateGuid() {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0,\r\n v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n}\r\n\r\nexport function logEvent(category: string, action: string, label: string) {\r\n RestService.LogEvent({\r\n category: category,\r\n action: action,\r\n label: label,\r\n });\r\n}\r\n\r\n// strip script and style tags from html\r\nexport const secureHtml = (template) => {\r\n const styleRegexp = /)<[^<]*)*<\\/style>/gi;\r\n template = template.replace(styleRegexp, '');\r\n const scriptRegexp = /)<[^<]*)*<\\/script>/gi;\r\n template = template.replace(scriptRegexp, '');\r\n return template;\r\n};\r\n\r\nexport const updateObject = (oldObject, updatedProperties) => {\r\n return {\r\n ...oldObject,\r\n ...updatedProperties,\r\n };\r\n};\r\n\r\n//make sure that the function is async or returns a promise\r\nexport const pollFunction = (func: Function, timeout: number) => {\r\n let timer = null;\r\n const recursivePoll = () => {\r\n timer = setTimeout(async () => {\r\n await func();\r\n recursivePoll();\r\n }, timeout);\r\n };\r\n recursivePoll();\r\n return () => {\r\n clearInterval(timer);\r\n timer = null;\r\n };\r\n};\r\n\r\nexport const getElementTagName = (event) => {\r\n if (event.toElement) {\r\n return event.toElement.tagName.toLowerCase();\r\n } else if (event.srcElement) {\r\n return event.srcElement.tagName.toLowerCase();\r\n }\r\n\r\n return event.target && event.target.tagName ? event.target.tagName.toLowerCase() : '';\r\n};\r\n\r\nexport const toCamel = (o) => {\r\n var newO, origKey, newKey, value;\r\n if (o instanceof Array) {\r\n return o.map((value) => {\r\n if (typeof value === 'object') {\r\n value = toCamel(value);\r\n }\r\n return value;\r\n });\r\n } else {\r\n newO = {};\r\n for (origKey in o) {\r\n if (o.hasOwnProperty(origKey)) {\r\n newKey = (origKey.charAt(0).toLowerCase() + origKey.slice(1) || origKey).toString();\r\n value = o[origKey];\r\n if (value instanceof Array || (value !== null && value.constructor === Object)) {\r\n value = toCamel(value);\r\n }\r\n newO[newKey] = value;\r\n }\r\n }\r\n }\r\n return newO;\r\n};\r\n\r\n/**\r\n * @deprecated use CamelToKebab module instead\r\n *\r\n */\r\nexport const camelToKebab = camelToKebabModule.camelToKebab;\r\n","import * as React from 'react';\r\nimport { useEffect, useState } from 'react';\r\n\r\nimport ReactModal from 'react-modal';\r\n\r\ninterface SpotlightLightboxProps {\r\n closeFn: () => void;\r\n contentLabel: string;\r\n videoId: string;\r\n}\r\n\r\n/**\r\n * Lightbox modal for videos\r\n * Currently only supports Vimeo videos; could be modifiec for other platforms if necessary\r\n * Pass in the Video Id, the video label and any function to be called when the lighbox is closed\r\n */\r\nexport const SpotlightLightbox: React.FC> = (\r\n props: SpotlightLightboxProps,\r\n) => {\r\n const [isLoading, setIsLoading] = useState(true);\r\n\r\n useEffect(() => {\r\n document.documentElement.style.setProperty('overflow', 'hidden');\r\n\r\n return () => {\r\n document.documentElement.style.removeProperty('overflow');\r\n };\r\n }, []);\r\n\r\n return (\r\n \r\n setIsLoading(false)}\r\n >\r\n {isLoading &&
    }\r\n
    \r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useState } from 'react';\r\n\r\nimport { ReleaseNotes, ReleaseNotesExternalActions } from '@ui';\r\n\r\nimport { SpotlightLightbox } from '../../../Scripts/Spotlight/Components/SpotlightLightbox';\r\n\r\nexport interface ILatestReleaseNotesProps {\r\n articles: [];\r\n displaySize?: number;\r\n showMedia?: boolean;\r\n}\r\n\r\nexport interface ILatestReleaseNotesState {}\r\n\r\nexport const LatestReleaseNotes: React.FC> = (\r\n props: ILatestReleaseNotesProps,\r\n) => {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [videoId, setVideoId] = useState('');\r\n\r\n const handleAction = async (action: any) => {\r\n switch (action.type) {\r\n case ReleaseNotesExternalActions.OPEN_VIDEO: {\r\n setVideoId(action.payload.id);\r\n setIsOpen(true);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n {isOpen && setIsOpen(false)} contentLabel=\"\" videoId={videoId} />}\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { camelToKebab } from './CamelToKebab';\r\n\r\nexport interface ISRMultiSelectProps {\r\n checkedItems?: string[];\r\n items: IItem[];\r\n hasSelectAllBtn?: boolean;\r\n hasClearBtn?: boolean;\r\n hasApplyBtn?: boolean;\r\n checkedItemsUpdated?: (checkedItems: string[]) => void;\r\n submitHandler?: (checkedItems: string[]) => void;\r\n dataId?: string;\r\n}\r\n\r\nexport interface ISRMultiSelectState {\r\n isOpen: boolean;\r\n checkedItems: string[];\r\n}\r\n\r\nexport interface IItem {\r\n id: string;\r\n title: string;\r\n name: string;\r\n}\r\n\r\nexport class SRMultiSelect extends React.Component {\r\n constructor(props: ISRMultiSelectProps) {\r\n super(props);\r\n\r\n this.state = {\r\n isOpen: false,\r\n checkedItems: props.checkedItems || [],\r\n };\r\n\r\n this.handleClickOutside = this.handleClickOutside.bind(this);\r\n this.toggleOpen = this.toggleOpen.bind(this);\r\n this.close = this.close.bind(this);\r\n this.open = this.open.bind(this);\r\n this.changeItem = this.changeItem.bind(this);\r\n this.selectAll = this.selectAll.bind(this);\r\n this.clear = this.clear.bind(this);\r\n this.apply = this.apply.bind(this);\r\n this.formSubmit = this.formSubmit.bind(this);\r\n }\r\n\r\n triggerBtnRef: HTMLElement;\r\n menuContainerRef: HTMLElement;\r\n\r\n componentDidMount() {\r\n document.addEventListener('mousedown', this.handleClickOutside);\r\n }\r\n\r\n componentWillUnmount() {\r\n document.removeEventListener('mousedown', this.handleClickOutside);\r\n }\r\n\r\n handleClickOutside(e: MouseEvent) {\r\n if (!this.menuContainerRef.contains(e.target as Node) && !this.triggerBtnRef.contains(e.target as Node)) {\r\n this.close();\r\n }\r\n }\r\n\r\n close() {\r\n this.setState({\r\n isOpen: false,\r\n });\r\n }\r\n\r\n open() {\r\n this.setState({\r\n isOpen: true,\r\n });\r\n }\r\n\r\n toggleOpen() {\r\n //toggle open/close\r\n this.state.isOpen ? this.close() : this.open();\r\n }\r\n\r\n selectAll() {\r\n const allItemIds = this.props.items.map((item) => item.id);\r\n this.setState({\r\n checkedItems: allItemIds,\r\n });\r\n }\r\n\r\n clear() {\r\n this.setState({\r\n checkedItems: [],\r\n });\r\n }\r\n\r\n apply(e) {\r\n e.preventDefault(); //prevent form submit\r\n if (typeof this.props.submitHandler === 'function') {\r\n this.props.submitHandler(this.state.checkedItems);\r\n }\r\n this.close();\r\n }\r\n\r\n formSubmit(e) {\r\n e.preventDefault(); //prevent form submit\r\n }\r\n\r\n changeItem(e) {\r\n const { name, checked } = e.target;\r\n\r\n if (checked) {\r\n //add to checked list\r\n if (this.state.checkedItems.indexOf(name) < 0) {\r\n this.setState((prevState) => ({\r\n checkedItems: [...prevState.checkedItems, name],\r\n }));\r\n }\r\n } else {\r\n //remove from checked list\r\n this.setState((prevState) => ({\r\n checkedItems: [...prevState.checkedItems.filter((item) => item !== name)],\r\n }));\r\n }\r\n }\r\n\r\n componentDidUpdate() {\r\n if (typeof this.props.checkedItemsUpdated === 'function') {\r\n this.props.checkedItemsUpdated(this.state.checkedItems);\r\n }\r\n }\r\n\r\n render() {\r\n const itemEls = (function (items, checkedItems, changeItem, dataId) {\r\n return items.map((item) => {\r\n return (\r\n
  • \r\n = 0}\r\n {...(dataId && {\r\n 'data-test-id': `${dataId}-multiselect__input-${camelToKebab(item.title)}`,\r\n })}\r\n />\r\n \r\n
  • \r\n );\r\n });\r\n })(this.props.items, this.state.checkedItems, this.changeItem, this.props.dataId);\r\n\r\n const selectAllBtn = (\r\n \r\n Select All\r\n \r\n );\r\n\r\n const clearBtn = (\r\n \r\n );\r\n\r\n const applyBtn = (\r\n
    \r\n \r\n Apply Filter\r\n \r\n
    \r\n );\r\n\r\n return (\r\n
    \r\n (this.triggerBtnRef = el)}\r\n type={'button'}\r\n className=\"multiselect__triggerbtn button button--generic\"\r\n onClick={this.toggleOpen}\r\n {...(this.props.dataId && { 'data-test-id': `${this.props.dataId}-multiselect__button-filter-by` })}\r\n >\r\n Filter by \r\n \r\n
    (this.menuContainerRef = el)} className=\"multiselect__menu-container\">\r\n {this.state.isOpen && (\r\n
    \r\n
    \r\n {this.props.hasClearBtn && clearBtn}\r\n {this.props.hasSelectAllBtn && selectAllBtn}\r\n
      {itemEls}
    \r\n {this.props.hasApplyBtn && applyBtn}\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\nimport { SRMultiSelect, IItem } from './SRMultiSelect';\r\n\r\nexport interface IMeasuresTaskFilterProps {\r\n tasks: TaskItem[];\r\n checkedItems: string[];\r\n}\r\nexport interface IMeasuresTaskFilterState {\r\n items: IItem[];\r\n}\r\n\r\ninterface TaskItem {\r\n dataSourceTypeCode: string;\r\n description: string;\r\n id: string;\r\n}\r\n\r\nexport class MeasuresTaskFilter extends React.Component {\r\n constructor(props: IMeasuresTaskFilterProps) {\r\n super(props);\r\n\r\n const items = this.props.tasks.map((item) => {\r\n return {\r\n id: item.id,\r\n title: item.description,\r\n name: item.id,\r\n };\r\n });\r\n\r\n this.state = {\r\n items: items,\r\n };\r\n\r\n this.submitHandler = this.submitHandler.bind(this);\r\n }\r\n\r\n submitHandler(checkedItems) {\r\n //map checked item ids to their categories\r\n const checkedCategories = this.state.items\r\n .filter((item) => {\r\n return checkedItems.indexOf(item.id) >= 0;\r\n })\r\n .map((checkedItem) => {\r\n //map to task, return desc\r\n const matchingTask = this.props.tasks.find((taskItem) => taskItem.id === checkedItem.id);\r\n return matchingTask.description;\r\n });\r\n\r\n const taskRowEls = document.getElementsByClassName('js-datagrid-measure-taskrow');\r\n const rowsToHide = Array.prototype.filter.call(\r\n taskRowEls,\r\n (el) => checkedCategories.indexOf(el.getAttribute('data-category')) < 0,\r\n );\r\n const rowsToShow = Array.prototype.filter.call(\r\n taskRowEls,\r\n (el) => checkedCategories.indexOf(el.getAttribute('data-category')) >= 0,\r\n );\r\n\r\n for (let i = 0; i < rowsToHide.length; i++) {\r\n const el = rowsToHide[i];\r\n el.classList.remove('is-filtered-in');\r\n el.classList.add('is-filtered-out');\r\n }\r\n\r\n for (let i = 0; i < rowsToShow.length; i++) {\r\n const el = rowsToShow[i];\r\n el.classList.remove('is-filtered-out');\r\n el.classList.add('is-filtered-in');\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n}\r\n","import * as React from 'react';\r\n\r\nexport const ModalButtonBar: React.FC> = (props) => {\r\n return (\r\n
    \r\n
    {props.children}
    \r\n
    \r\n );\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { ReportMode } from '../../../Codes';\r\nimport { IOrganisation } from '../../Store/Actions/OrganisationsActions';\r\nimport { NotificationType } from './NotificationMessages';\r\nimport { enumAllowedActions } from './NotificationReportComplete';\r\n\r\nexport enum NotificationStatus {\r\n Read = 'READ',\r\n Unread = 'UNREAD',\r\n Dismissed = 'DISMISSED',\r\n}\r\n\r\nexport interface INotification {\r\n id: string;\r\n notificationType: string;\r\n reportMode: string;\r\n title: string;\r\n type: NotificationType;\r\n createdOnUtc: string;\r\n modifiedOn: string;\r\n status: NotificationStatus;\r\n organisationId?: string;\r\n organisationName: string;\r\n onClickDismiss: (notificationId: string) => void;\r\n allowedActions: Array;\r\n actions: any;\r\n}\r\n\r\nexport class Notification extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n getReportModeClass = (reportMode: string): string => {\r\n switch (reportMode) {\r\n case ReportMode.Forecast:\r\n return 'notificationitem--reportmode-forecast';\r\n case ReportMode.Dashboard:\r\n return 'notificationitem--reportmode-dashboard';\r\n case ReportMode.Franchise:\r\n return 'notificationitem--reportmode-franchise';\r\n case ReportMode.Spotlight:\r\n return 'notificationitem--reportmode-spotlight';\r\n case ReportMode.Sustain:\r\n return 'notificationitem--reportmode-sustain';\r\n default:\r\n return '';\r\n }\r\n };\r\n\r\n render() {\r\n const reportModeClass = this.getReportModeClass(this.props.reportMode);\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\n\r\nimport { CSSTransition } from 'react-transition-group';\r\n\r\nexport interface IOverlayPaneProps {\r\n className: string;\r\n clickDim: (something: MouseEvent) => void;\r\n children: React.ReactNode;\r\n isOpen: boolean;\r\n}\r\nexport interface IOverlayPaneState {}\r\n\r\nexport class OverlayPane extends React.Component {\r\n private ref: React.RefObject;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.ref = React.createRef();\r\n }\r\n\r\n componentDidMount() {\r\n document.addEventListener('mousedown', (e: MouseEvent) => this.handleClickDim(e));\r\n }\r\n\r\n componentWillUnmount() {\r\n document.removeEventListener('mousedown', (e: MouseEvent) => this.handleClickDim(e));\r\n }\r\n\r\n handleClickDim(event: MouseEvent) {\r\n if (event.target === this.ref.current) {\r\n this.props.clickDim(event);\r\n }\r\n }\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","// TODO create enum when using Typescript 2.4\r\n\r\nexport const DEBOUNCE_DELAY = 700;\r\nexport const SPINNER_DELAY = 700;\r\n\r\nexport class ReportCoverTemplateCode {\r\n static Default = 'DEFAULT';\r\n static Standard = 'STANDARD';\r\n static Custom = 'CUSTOM';\r\n}\r\n\r\nexport class LogoSettingsCode {\r\n static None = 'NONE';\r\n static OrganisationLogo = 'ORGANISATION_LOGO';\r\n static PracticeLogo = 'PRACTICE_LOGO';\r\n static Auto = 'AUTO';\r\n}\r\n\r\nexport class BackgroundPositionCode {\r\n static FitWidth = 'fit-width';\r\n static FitHeight = 'fit-height';\r\n static Centre = 'centre';\r\n}\r\n\r\nexport class PreviewType {\r\n static Html = 'HTML';\r\n static Image = 'IMAGE';\r\n}\r\n\r\nexport class ThumbnailType {\r\n static Url = 'URL';\r\n static File = 'FILE';\r\n}\r\n","const Spotlight = window.Spotlight;\r\n\r\nexport default Spotlight;\r\n","import * as React from 'react';\r\n\r\nimport classNames from 'classnames';\r\nimport ReactModal from 'react-modal';\r\n\r\ninterface SpotlightModalPropsBase extends React.PropsWithChildren {\r\n title?: string;\r\n onRequestClose?: () => void;\r\n shouldCloseOnOverlayClick: boolean;\r\n top?: string;\r\n width?: string;\r\n useCustomStyles?: boolean;\r\n overrideCustomStyles?: any;\r\n style?: React.CSSProperties;\r\n className?: string;\r\n children: React.ReactElement[];\r\n}\r\n\r\nexport interface SpotlightModalProps extends SpotlightModalPropsBase {\r\n shouldCloseOnOverlayClick: false;\r\n}\r\n\r\nexport interface SpotlightModalPropsOverlayCloses extends SpotlightModalPropsBase {\r\n onRequestClose: () => void;\r\n shouldCloseOnOverlayClick: true;\r\n}\r\n\r\nexport interface SpotlightModalContentProps {\r\n class?: string;\r\n style?: React.CSSProperties;\r\n children: React.ReactElement | React.ReactElement[];\r\n dataId?: string;\r\n}\r\n\r\nexport interface SpotlightModalInputProps {\r\n id: string;\r\n isHidden?: boolean; // useful for hiding inputs without necessarily losing their values\r\n width: '0' | '100' | '200'; // indentation of input elements. Use 0 if the inputs are to be on a new line after the label.\r\n marginTop: boolean;\r\n marginBottom?: boolean;\r\n dataTestId?: string;\r\n}\r\n\r\nexport interface SpotlightModalFieldGroupProps {\r\n class?: string;\r\n children: React.ReactElement | React.ReactElement[];\r\n}\r\n\r\nexport interface SpotlightModalTextProps extends React.PropsWithChildren {\r\n marginLeft?: string;\r\n marginTop: boolean;\r\n}\r\n\r\nexport interface SpotlightModalInputTextProps extends SpotlightModalInputProps {\r\n title: string;\r\n placeholder: string;\r\n value: string;\r\n onChange: (event: string) => void;\r\n warningMessage?: string;\r\n inputError?: boolean;\r\n autoFocus?: boolean;\r\n}\r\n\r\nexport interface SpotlightModalTextAreaProps extends SpotlightModalInputProps {\r\n title?: string;\r\n rows: number;\r\n onChange: (event: string) => void;\r\n value: string;\r\n inputError?: boolean;\r\n placeholder: string;\r\n autoFocus?: boolean;\r\n}\r\n\r\nexport interface SpotlightModalInputSelectProps extends SpotlightModalInputProps {\r\n title: string;\r\n defaultValue?: string;\r\n children: React.ReactElement[];\r\n onChange: (event: string) => void;\r\n}\r\n\r\nexport interface SpotlightModalInputHelpProps extends SpotlightModalInputProps {\r\n value: string;\r\n class: 'input-help' | 'input-error';\r\n}\r\n\r\nexport interface SpotlightModalButtonGroupProps {\r\n includeCancelButton: boolean;\r\n cancelButtonText?: string;\r\n onRequestClose?: (event: any) => void;\r\n children: React.ReactElement | React.ReactElement[];\r\n}\r\n\r\nexport interface SpotlightModalButtonSubgroupProps {\r\n children: React.ReactElement | React.ReactElement[];\r\n style: React.CSSProperties;\r\n}\r\n\r\nexport interface SpotlightModalButtonProps {\r\n title: string;\r\n className: string;\r\n action: (event: any) => void;\r\n dataTestId?: string;\r\n disabled?: boolean; // modal-buttons--state is the class that goes with this to enable buttons to appear in a disabled state\r\n}\r\n\r\nexport interface SpotlightModalCheckboxProps extends SpotlightModalInputProps {\r\n title: string;\r\n checked: boolean;\r\n onChange: (event: any) => void;\r\n}\r\n\r\nexport interface SpotlightModalLabelProps {\r\n title: string;\r\n id: string;\r\n width: '0' | '100' | '200';\r\n}\r\n\r\nexport const centerModalStyle = Object.freeze({\r\n content: Object.freeze({\r\n position: 'relative',\r\n top: 'auto',\r\n left: 'auto',\r\n right: 'auto',\r\n bottom: 'auto',\r\n transform: 'none',\r\n width: 'auto',\r\n padding: '0',\r\n border: 'none',\r\n margin: 'auto 0',\r\n background: 'none',\r\n }),\r\n});\r\n\r\nconst customStylesDefault = Object.freeze({\r\n content: Object.freeze({\r\n top: '20%',\r\n left: '50%',\r\n right: 'auto',\r\n bottom: 'auto',\r\n marginRight: '-50%',\r\n transform: 'translate(-50%, 0%)',\r\n width: '800px',\r\n padding: '0px',\r\n border: 'none',\r\n margin: '0 0 100px 0',\r\n }),\r\n});\r\n\r\nconst constructCustomStyles = (props) => {\r\n if (typeof props.useCustomStyles === 'undefined' || props.useCustomStyles === true) {\r\n // copy default styles\r\n const styles = JSON.parse(JSON.stringify(customStylesDefault));\r\n // merge in top and width props to apply to content\r\n if (props.top) {\r\n styles.content.top = props.top;\r\n }\r\n if (props.width) {\r\n styles.content.width = props.width;\r\n }\r\n return styles;\r\n } else if (props.overrideCustomStyles) {\r\n // use _only_ the overrideCustomStyles object to provide styling, ignores the modals props for top and width\r\n return props.overrideCustomStyles;\r\n } else {\r\n return {};\r\n }\r\n};\r\n\r\nexport class SpotlightModal extends React.Component {\r\n modalStyles: { content: any };\r\n constructor(\r\n props:\r\n | SpotlightModalProps\r\n | SpotlightModalPropsOverlayCloses\r\n | Readonly,\r\n ) {\r\n super(props);\r\n\r\n this.modalStyles = constructCustomStyles(props);\r\n\r\n this.onRequestClose = this.onRequestClose.bind(this);\r\n document.querySelector('html').classList.add('has-modal');\r\n }\r\n\r\n onRequestClose() {\r\n this.props.onRequestClose();\r\n }\r\n\r\n componentWillUnmount() {\r\n document.querySelector('html').classList.remove('has-modal');\r\n }\r\n\r\n componentDidUpdate() {\r\n this.modalStyles = constructCustomStyles(this.props);\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n {this.props.title &&
    {this.props.title}
    }\r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport class SpotlightModalContent extends React.Component {\r\n render() {\r\n return (\r\n \r\n {this.props.children}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport class SpotlightModalFieldGroup extends React.Component {\r\n render() {\r\n return
    {this.props.children}
    ;\r\n }\r\n}\r\n\r\nexport class SpotlightModalText extends React.Component {\r\n render() {\r\n return (\r\n \r\n {this.props.children}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport class SpotlightModalInputText extends React.Component {\r\n render() {\r\n return (\r\n \r\n \r\n {\r\n this.props.onChange(event.target.value);\r\n }}\r\n autoFocus={this.props.autoFocus}\r\n data-test-id={this.props.dataTestId}\r\n />\r\n {this.props.warningMessage && this.props.warningMessage.length > 0 ? (\r\n \r\n {this.props.warningMessage}\r\n \r\n ) : null}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport class SpotlightModalInputSelect extends React.Component {\r\n render() {\r\n return (\r\n \r\n \r\n {\r\n this.props.onChange(event.target.value);\r\n }}\r\n data-test-id={this.props.dataTestId}\r\n >\r\n {this.props.children}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport class SpotlightModalInputHelp extends React.Component {\r\n render() {\r\n return (\r\n
    \r\n \r\n {this.props.value}\r\n
    \r\n \r\n );\r\n }\r\n}\r\n\r\nexport class SpotlightModalButtonGroup extends React.Component {\r\n render() {\r\n return (\r\n
    \r\n
    \r\n {this.props.children}\r\n {this.props.includeCancelButton ? (\r\n \r\n ) : null}\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport class SpotlightModalButtonSubgroup extends React.Component {\r\n render() {\r\n return (\r\n
    \r\n {this.props.children}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport class SpotlightModalButton extends React.Component {\r\n render() {\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport class SpotlightModalTextArea extends React.Component {\r\n render() {\r\n return (\r\n \r\n {this.props.title ? (\r\n \r\n ) : null}\r\n\r\n {\r\n this.props.onChange(event.target.value);\r\n }}\r\n value={this.props.value}\r\n placeholder={this.props.placeholder}\r\n autoFocus={this.props.autoFocus}\r\n >\r\n \r\n );\r\n }\r\n}\r\n\r\nexport class SpotlightModalInputCheckbox extends React.Component {\r\n render() {\r\n return (\r\n \r\n \r\n {\r\n this.props.onChange(event.target.value);\r\n }}\r\n checked={this.props.checked}\r\n data-test-id={this.props.dataTestId}\r\n />\r\n \r\n );\r\n }\r\n}\r\n\r\nexport class SpotlightModalUpdatingForecast extends React.Component {\r\n render() {\r\n return (\r\n \r\n
    \r\n
    \r\n
    \r\n Updating forecast - your data may be out of date, please wait for the data refresh to complete\r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport class SpotlightModalLabel extends React.Component {\r\n render() {\r\n return (\r\n \r\n {this.props.title}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport interface SpotlightModalWarningProps {\r\n message: string;\r\n className?: string;\r\n}\r\n\r\nexport class SpotlightModalWarning extends React.Component {\r\n render() {\r\n return (\r\n
    \r\n

    {this.props.message}

    \r\n
    \r\n );\r\n }\r\n}\r\n","import * as React from 'react';\r\n\r\nimport { createRoot } from 'react-dom/client';\r\nimport { Provider, TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\r\nimport { createStore, applyMiddleware, compose, combineReducers, AnyAction } from 'redux';\r\nimport thunk, { ThunkDispatch } from 'redux-thunk';\r\n\r\nimport dataImportReducer from '../Store/Reducers/DataImportReducer';\r\nimport exportReducer from '../Store/Reducers/ExportReducer';\r\nimport notificationsMenuReducer from '../Store/Reducers/NotificationsMenuReducer';\r\nimport notificationsReducer from '../Store/Reducers/NotificationsReducer';\r\nimport organisationSettingsReducer from '../Store/Reducers/OrganisationSettingsReducer';\r\nimport organisationsReducer from '../Store/Reducers/OrganisationsReducer';\r\nimport practiceSettingsReducer from '../Store/Reducers/PracticeSettingsReducer';\r\nimport reportExportReducer from '../Store/Reducers/ReportExportReducer';\r\nimport reportHistoryReducer from '../Store/Reducers/ReportHistoryReducer';\r\nimport sectionOptionsReducer from '../Store/Reducers/SectionOptionsReducer';\r\nimport sidebarReducer from '../Store/Reducers/SidebarReducer';\r\nimport whatsNewReducer from '../Store/Reducers/WhatsNewReducer';\r\nimport { popRoot, pushRoot } from '../render';\r\n\r\nconst rootReducer = combineReducers({\r\n reportHistory: reportHistoryReducer,\r\n organisationSettings: organisationSettingsReducer,\r\n practiceSettings: practiceSettingsReducer,\r\n sectionOptions: sectionOptionsReducer,\r\n exportState: exportReducer,\r\n notificationsMenu: notificationsMenuReducer,\r\n notifications: notificationsReducer,\r\n organisations: organisationsReducer,\r\n sidebar: sidebarReducer,\r\n whatsNew: whatsNewReducer,\r\n reportExport: reportExportReducer,\r\n dataImport: dataImportReducer,\r\n});\r\n\r\nexport const store = createStore(rootReducer, compose(applyMiddleware(thunk)));\r\n\r\nexport const StoreProvider = ({ children }) => {\r\n return {children};\r\n};\r\n\r\nexport function unmountComponentAtNode(id: string): void {\r\n const root = popRoot(id);\r\n\r\n if (root) {\r\n root.unmount();\r\n }\r\n}\r\n\r\n/**\r\n * Just a wrapper over ReactDOM.render to render a component with a store, passing the component by reference.\r\n * This allows components to be rendered from outside of jsx|tsx files.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\r\nexport function render(id: string, Component: any, element: Element, props?: any): void {\r\n const component = (\r\n \r\n \r\n \r\n );\r\n\r\n if (element) {\r\n const root = createRoot(element);\r\n root.render(component);\r\n pushRoot(id, root);\r\n }\r\n}\r\n\r\nexport type RootState = ReturnType;\r\nexport type AppDispatch = ThunkDispatch;\r\n\r\nexport const useAppDispatch: () => AppDispatch = useDispatch;\r\nexport const useAppSelector: TypedUseSelectorHook = useSelector;\r\n"],"names":["DataSourceTile","type","typeDescription","onClick","disableButtons","size","code","description","logo","button","className","data-test-id","toLowerCase","div","classNames","span","DataSourceSelector","organisationId","heading","dataSourceCategories","existingDataSources","hideExistingDataSources","onSelect","reportMode","dataSources","map","dsc","filter","ds","indexOf","recentlyUsed","flat","getVisibleDataSources","clickDataSourceHandler","cloudDataSources","DataSourceTypes","Cloud","desktopDataSources","Desktop","manualDataSources","Manual","isForecasting","ReportModes","Forecast","length","h3","Button","dataId","theme","THEME","GENERIC","Spotlight","Events","emit","h4","key","window","location","assign","AppRoutes","TaskManager","AddDataSource","reportId","useState","disableDataSourceButtons","setDisableDataSourceButtons","selectedDataSource","setSelectedDataSource","setExistingDataSources","isLoading","setLoading","signInType","setSignInType","isReporting","DataSourceCodes","Xero","QuickBooks","height","width","undefined","MYOBAccountRight","GoogleAnalytics4","XeroPracticeManager","QuickBooksDesktop","title","MYOBAccountRightDesktop","Sage50Desktop","Excel","ExcelPersonalWealth","dataSource","includes","push","GoogleSheets","PersonalWealth","getSignInType","RestService","GetLoginOIDCType","data","selectedDataSourceHandler","dataSourceIsDesktop","dataSourceIsCloud","dataSourceIsManual","dataSourceConnector","addManualDataSource","dataSourceCode","then","reload","finally","addDesktopDataSource","fetchExistingDataSources","GetOrganisationDataSourceCollection","catch","e","useEffect","fetchExistingDataSourcesPromise","getSignInTypePromise","Promise","all","values","hasExistingDataSources","dataSourceTypeCode","ThemeProvider","getThemeByProduct","getProductByReportMode","LoadingSpinner","color","ConfirmConnectToDataSourceModal","closeFn","skipConfirmationModal","ProviderKey","Intuit","ConnectModalDisplay","modalContent","buttons","SRModal","overrideCustomStyles","content","centerModalStyle","shouldCloseOnOverlayClick","top","useCustomStyles","onRequestClose","style","padding","minHeight","maxHeight","background","margin","Modal","ButtonBar","props","children","GenericExplanationText","providerName","p","GoogleAnalyticsExplanationText","GenericConnectButton","connectFn","GoogleSheetsExplanationText","ConnectModal","connectButton","explanationText","dataSourceId","clickConnect","connectToCloudDataSource","aria-label","ProviderName","getAuthorisedXeroCompanies","GetAuthorisedXeroCompanies","response","setAuthoriseXeroCompany","externalId","SetAuthoriseXeroCompany","retrieveTracking","GetDataSourceTrackingConfigured","error","hasTrackingActuals","isTrackingActualsConfigured","hasTrackingBudget","isTrackingBudgetsConfigured","err","beginDesktopPairing","spotlightHubsUrl","context","spotlightWebUrl","desktopConnectorId","callbackFn","method","getActiveApiToken","fetch","headers","Authorization","body","JSON","stringify","CompanyFileErrorTypes","SignalRDesktopFileStatus","SignalRImportStatus","ExternalDataSourceImportEventTypes","SignalRImportEvents","SignalRImportRequests","NetworkErrorCodes","ErrorMap","Map","DataSourceActionTypes","DataSourceAppActionTypes","dataSourceAppReducer","state","action","newState","cloneDeep","DataSourceImportCancelled","viewState","DataSourceViews","NetworkError","importProgress","UploadFile","Settings","DataSourceDisconnected","isConnected","Connect","safeViewState","DataSourceNetworkError","errorCode","payload","AccessRevoked","GetCompanyFilesFailure","GoogleSpreadsheetUnauthorised","GoogleSpreadsheetNotFound","Create","UploadFileSuccess","importFileId","UploadFileError","UploadFileFail","NoCompanyFilesAvailable","GetCompanyFilesSuccess","companyFileOptions","files","selectedCompanyFileId","CompanyFileReady","companyFileError","ChooseCompanyFile","CompanyFileNotAttached","AuthenticateCompanyFile","CompanyFileAuthFailed","AuthenticatingCompanyFileFail","GetImportDatesSuccess","actualsFromDate","actualsToDate","budgetFromDate","budgetToDate","ImportStarted","importStatus","ImportStatusCode","Importing","UpdateProgress","progress","status","ImportFailed","ImportFail","Success","lastImportedDate","importedToDate","ImportComplete","SuccessWithErrors","excelErrors","ImportCompleteWithErrors","DataSourceImportFailed","GetGoogleSheetsSuccess","name","spreadsheetUrl","LoadingImportSettings","defaultBehavior","actionHandler","dispatch","signalRProvider","Connecting","AutomaticallyConnectDataSource","RetrieveDataSourceSettings","FetchingDesktopFiles","RetrieveDesktopDataSourceFiles","RefreshPage","DataSourceContainerComponent","dataSourceProviderName","actuals","budget","actualsTo","actualsFrom","budgetFrom","budgetTo","trackingActualsSelected","trackingBudgetSelected","productType","importButtonDisabled","signalRContext","useSignalRProvider","progressTimer","clearTimeout","checkForProgress","CheckForImportStatus","setTimeout","TestContextProvider","dataTestIdContext","dataTestIdBlockIdentifier","camelToKebab","DataSourcePanel","dataSourceProviderNames","checkForImportProgressStatus","GetImportStatus","successFn","nextProgress","shouldUseNewImport","completedWork","totalReports","Math","floor","importedReports","startedOrganisations","totalOrganisations","isDesktop","Number","isNaN","event","CustomEvent","ProgressUpdated","detail","importStatusCode","dispatchEvent","reducer","activePanel","panels","get","smoothProgress","round","getSmoothProgress","GetTrackingInformationSuccess","isDataSourceUiAction","result","dataSourceUiReducer","set","isDataSourceAppAction","manuallyConnectDataSourceHandler","connectDesktopDataSource","signalRDispatch","modalText","console","log","settings","ReportMode","url","generateConnectUrl","connectType","href","manuallyConnectDataSource","TransitionView","ConnectFail","ConnectInsufficientAccess","connectDataSource","CancelImportDataSource","cancelImport","DisconnectDataSource","disconnectDataSource","ManuallyConnectDataSource","OpenCompanyFile","LoadingCompanyFile","fetchFileInformation","RemoveDataSource","DeleteDataSourceById","retrieveImportSettings","fetchFiles","ClickedImport","UploadingDesktopFile","uploadDesktopFile","startImportPayload","startImport","StartDesktopImport","SubmitDesktopConnectorId","ConnectFailed","UnknownError","UploadFileDataSource","UploadingFile","DataSourceDesktopImportStarted","actualsSelected","budgetSelected","dataSourceType","find","a","value","DataSourceContainerCollectionComponent","models","initial","m","model","defaultViewState","importActuals","importBudget","importFromDate","importToDate","importBudgetFromDate","importBudgetToDate","fileName","lastImportedUtc","selectedCompanyFile","initialiser","useReducer","signalRDispatchContext","useSignalRDispatch","actionHandlerWithState","useCallback","progressUpdateHandler","addEventListener","removeEventListener","asyncFn","hubsConnection","signalRHubSetup","stop","signalRBindEvents","hubConnection","off","ConnectionInvite","DesktopConnected","FilesRetrieved","FileUpdate","FileRetrieved","Error","Array","from","panel","Object","DataSourceDisconnect","DisconnectFailure","request","StartImportDataSource","companyFileId","ImportDataSource","StartImportFailure","DoEvent","EventCode","eId","GetEventJson","uploadFile","formData","target","FormData","append","$","ajax","WINDOW_CODE","success","Filename","jqXHR","textStatus","cache","contentType","processData","GetDataSourceDefaultImportDates","importDates","DateRetrievalFailure","importInProgress","ImportInProgress","DisconnectModalDisplay","DisconnectionModalSpiel","ConfirmationModal","confirmedDisconnectHandler","ConfirmDisconnectFromDataSourceModal","ExcelUpload","React","ref","uploadHandler","uploadState","excelTemplatePath","ProductTypes","Forecasting","UploadStates","form","encType","input","id","accept","onChange","displayName","ExcelErrors","errors","ul","index","li","b","message","ImportProgressBar","min","max","Status","dti","useDti","importStatusSuccess","importStatusError","ImportStatuses","CircledTick","fill","FORECASTING","main","ImportCancelled","CircledX","ImportControl","importHandler","cancelImportHandler","displayImportButton","Ready","displayImportStatus","displayExcelErrors","isImporting","isComplete","disabled","setFileName","fileInputRef","useRef","innerUploadHandler","current","rel","AuthCompanyFile","openCompanyFile","user","setUser","password","setPassword","TextInput","val","label","PasswordField","onChangeCompanyFile","requiresAuth","showFileOptions","text","SRSelect2","minWidth","showFilter","placeholder","InvalidCredentials","ChooseCompanyFileView","AuthenticateCompanyFileView","AuthenticatingCompanyFileView","AuthenticatingCompanyFileFailView","connectHandler","InnerView","TokenExpired","InvalidCompanyFile","CompanyFileViews","AuthenticatingCompanyFile","helpCentreUrlsMap","DesktopConnectView","desktopConnectorIdHandler","desktopConnectorIds","setDesktopConnectorIds","localStorageKey","items","parse","localStorage","getItem","AutoCompleteTextField","defaultPlaceholder","dropdownOnChange","command","trimmedValue","trim","newArrayOfIds","setItem","insertItem","itemIndex","splice","removeItem","thinLabel","lineHeight","fontSize","defaultItems","buttonName","ConnectView","LinkedFileNotAuthenticatedView","XeroConnectInsufficientAccessView","strong","ConnectViews","connectView","insufficientAccessView","linkedFileNotAuthenticatedView","returnToLastViewFn","LinkedFileNotAuthenticated","ConnectSuccess","Authenticating","Pairing","stateTransitionFn","NetworkErrorGoogleSheets","createFn","isCreating","InfoCircleSolid","COLOR","WARNING","BASE","marginRight","inline","loading","GetFailed","XmarkCircleSolid","NOTIFICATIONS","ERROR","CreateFailed","GoogleSpreadsheetGetFailed","GoogleSpreadsheetCreateFailed","data-pendo-id","renderErrorMessages","messages","errorMessages","entries","useForm","criteriaMode","reValidateMode","defaultValues","actuals_import_from_date","actuals_import_to_date","budget_import_from_date","budget_import_to_date","mapDatesToForm","control","formState","getValues","trigger","userHasSelectedAnOption","SetImportButton","checkboxChangeHandler","SetCheckBox","checked","changeDateHandler","year","monthIndex","fieldChangeHandler","triggers","d","dayjs","dString","month","date","format","SetDate","actualsImportFromDate","actualsImportToDate","budgetImportFromDate","budgetImportToDate","importTrackingActuals","importTrackingBudget","h2","GoogleSheetsLinkButton","CheckboxInput","Controller","render","field","MonthDatePicker","x","ErrorMessage","rules","validate","actualsInThePast","isSame","startOf","isBefore","afterActualsFrom","isAfter","afterBudgetFrom","SettingsView","isSettingsDisabled","isImportButtonDisabled","StandardCloud","isGoogleSheets","setIsCreating","InsufficientAccessView","CloudLinkedFileNotAuthenticatedView","TransitionAwayFromErrorView","CreateGoogleSpreadsheet","properties","StandardDesktop","returnToLastView","utc","dateTime","local","isExcel","ExcelDesktop","isManual","isDesktopDataSource","isConnectable","showDisconnectConfirmationModal","setShowDisconnectConfirmationModal","SetCompanyFile","formattedLastImportedDate","formattedImportedToDate","importedTo","img","src","xeroLogo30","quickbooksLogo","myobAccountRightLogo30","myobLogo30","sageLogo30","excelLogo30","googleAnalyticsLogo30","googleSheetsLogo30","xeroPracticeManagerLogo30","personalWealthLogo30","excelPersonalWealthLogo30","alt","dateFieldNameToKeyMap","checkboxFieldNameToKeyMap","UpdateSafeView","Pending","updateStateCheckbox","updateStateDate","DeleteDataSourceModal","onDelete","onClose","deleting","setDeleting","unexpectedError","setShowUnexpectedError","deleteDataSource","DeleteDataSource","modalContentGoogleSheets","errorModalContent","Buttons","ErrorModalButtons","errorHandler","SignalRUnresponsive","GetConfig","res","reader","getReader","contextFromApi","read","processText","done","approvedConnections","TextDecoder","decode","forEach","send","GetFiles","selectedCompanyId","GetFile","fileId","practiceFeatureFlags","practiceFeatureFlagsString","practiceFeatureFlagsData","postData","PracticeFeatureFlags","split","f","isEnabled","performWebApiCallAsync","WebApiEndpoints","uploadUrl","importOptions","dsId","GetUploadUrl","Url","signalR","withUrl","skipNegotiation","transport","WebSockets","accessTokenFactory","withAutomaticReconnect","build","start","warn","on","AcceptConnectionInvite","delete","sort","localeCompare","file","Running","Completed","hasTrackedActuals","hasTrackedBudget","defaultMyobCompanyFileIsLinkedHandler","defaultMyobCompanyFileIsLinkedErrorHandler","FailureType","noOp","checkMyobCompanyFileIsLinked","responseHandler","isLinkedHandler","networkErrorHandler","IsCompanyFileLinked","Result","MyobOpenCompanyFile","auth","SignalRContext","createContext","SignalRDispatchContext","SignalRProvider","setSignalRContext","Provider","relativeTime","calendar","isYesterday","advancedFormat","NotificationType","NotificationMessage","getMessageForNotificationType","keys","parseReportTypeMessage","reportTitle","replace","getReportModeTag","Dashboard","Franchise","Sustain","getNotificationDisplayDate","Date","fromNow","EventType","track","params","dataLayer","gtm","enumAllowedActions","NotificationReportBuildCompletedClass","onClickDownloadPDF","bind","onClickDownloadExcel","onClickDismiss","currentTarget","nodeName","preventDefault","this","analytics","DownloadedPDFFromNotifications","actions","downloadPdf","DownloadUrl","windowCode","reportExportId","DownloadedExcelFromNotifications","downloadExcel","notificationItem","notificationDate","createdOnUtc","notificationDateDisplay","notificationDateDetailed","moment","organisationName","reportMessage","reportModeTag","reportBuildStartDateTimeDisplay","reportBuildStartDateTime","reportDateDisplay","reportDate","downloadBtn","allowedActions","data-test-class","Notification","NotificationReportBuildCompleted","connect","organisations","NotificationReportBuildDelayedClass","NotificationReportBuildDelayed","NotificationReportBuildFailedClass","NotificationReportBuildFailed","tabs","NotificationsMenu","dismissAll","topNotificationId","notificationsArr","setAllNotificationsDismissed","dismissAllForOrg","markDisplayNotificationsRead","notificationsToShowIds","displayNotifications","addToDisplayedNotificationIds","limit","notificationsCount","slice","initialState","closeOverlay","componentDidUpdate","prevProps","prevState","menu","SidebarMenu","Notifications","isOpen","getNotifications","NOTIFICATION_COUNT","tab","nextCount","nextCursor","getFilters","setDisplayCount","getMoreNotifications","OrganisationId","setOpen","notificationId","setNotificationDismissed","setTab","setState","notificationsMenu","filterByOrg","notificationsToShow","notificationsItems","item","i","ReportBuildCompleted","ReportBuildDelayed","ReportBuildFailed","notificationsList","isNotificationsFetching","ol","organisationNotificationsList","spinner","OverlayPane","clickDim","LazyLoadingComponent","handle","h1","draggable","NotificationsMenuComponent","sidebar","notifications","notificationsMap","NotificationStatus","Dismissed","getTime","fetchingNotifications","SidebarActions","count","cursor","setNotificationRead","setNotificationsRead","notificationIds","latestNotificationId","Component","NotificationHeaderClass","handleNotificationClick","OpenedNotifications","setNotificationMenuOpen","newNotificationsCount","ConnectedNotificationHeader","NotificationHeader","unreadCount","setUnreadCount","isMounted","lastPollTime","setLastPollTime","getUnreadNotificationsCount","GetNotificationUnreadCount","HelpButtonClass","openMenu","setHelpMenuOpen","Help","HelpButton","dropdownValueTypes","MyAccountButton","MyAccountMenu","authMode","options","useMemo","DropdownMenu","Trigger","ChangePassword","MFASettings","clearSessionTimeoutCookie","SignOut","placement","RecentOrgButtonClass","setOrganisationMenuOpen","Organisations","underscore","unescape","RecentOrgButton","WhatsNewButtonClass","handleWhatsNewClick","OpenedWhatsNew","setWhatsNewMenuOpen","WhatsNew","displayAlert","WhatsNewButton","whatsNew","HeaderMenu","setAuthMode","ignore","fetchAuthMode","mfaSettings","GetMFASettings","HelpMenuClass","showHelpCenter","OpenedHelp","open","showSupportModal","ToggleModal","showTransformInAction","OpenedHelpTransformationInAction","transformInActionFFOn","TransformInAction","showSpotlightCertification","OpenedHelpSpotlightCertification","showOtherResources","OpenedHelpOtherResources","hr","canAccessTransformInAction","canAccessCertification","HelpMenu","RecentOrgMenuClass","getRecentReports","loadingRecentReports","recentReports","recentReport","orgLink","Endpoints","reportLink","RecentOrgMenu","reportHistory","ReportActions","WhatsNewMenuClass","componentDidMount","getReleaseNotes","LatestReleaseNotes","articles","loadingReleaseNotes","releaseNotes","displaySize","showMedia","WhatsNewMenu","WhatsNewActions","Header","setTransformInActionFFOn","logoUrl","ReportingLandingPage","DashboardsLandingPage","SustainLandingPage","getFeatureFlag","GetFeatureFlagValue","FeatureFlags","TiaWebflow","header","CustomiseDataOptionType","mapDataSources","tasks","drivers","measures","budgetOptions","task","TaskTypes","Budget","flagColour","forecastOptions","scenarioOptions","Scenario","driversOptions","measuresOptions","fetchTasks","GetForecastTasks","lastUpdated","lastUpdatedUtc","lastUpdatedBy","CustomiseDataDropdown","dataOptionSelectedCallback","selectedItem","fetchDriversAndMeasures","GetForecastTaskManager","Id","createDataSource","dataSourceData","basisType","optionsJson","cloneSource","cloneActuals","includeInReport","eventCode","NewDataSource","eventJson","DataSources","showGenericModal","allOptions","fetchAndUpdateTasks","newTasks","updateTasks","ForecastEventTypes","UpdateTaskSettings","MenuButton","handleSelect","node","document","Stages","stageDescriptions","ForecastingNavigation","stage","baseUrl","getUrl","toUpperCase","navItem","itemStage","nav","hash","Budgets","Forecasts","Scenarios","Drivers","Measures","ProductNavigation","canAccessReports","canAccessForecasts","canAccessDashboards","canAccessMulti","canAccessSustain","ForecastingLandingPage","MultiLandingPage","updateObject","oldObject","updatedProperties","camelToKebabModule","SpotlightLightbox","setIsLoading","documentElement","setProperty","removeProperty","ReactModal","contentLabel","overlayClassName","ariaHideApp","border","borderRadius","overflow","maxWidth","inset","iframe","videoId","frameBorder","allow","allowFullScreen","onLoad","setIsOpen","setVideoId","handleAction","ReleaseNotesExternalActions","OPEN_VIDEO","ReleaseNotes","urlDisplayText","SRMultiSelect","triggerBtnRef","menuContainerRef","checkedItems","handleClickOutside","toggleOpen","close","changeItem","selectAll","clear","apply","formSubmit","componentWillUnmount","contains","allItemIds","submitHandler","checkedItemsUpdated","itemEls","htmlFor","selectAllBtn","clearBtn","applyBtn","el","onSubmit","hasClearBtn","hasSelectAllBtn","hasApplyBtn","MeasuresTaskFilter","checkedCategories","checkedItem","taskItem","taskRowEls","getElementsByClassName","rowsToHide","prototype","call","getAttribute","rowsToShow","classList","remove","add","ModalButtonBar","getReportModeClass","reportModeClass","handleClickDim","CSSTransition","nodeRef","timeout","in","section","ReportCoverTemplateCode","Default","Standard","Custom","LogoSettingsCode","None","OrganisationLogo","PracticeLogo","Auto","BackgroundPositionCode","FitWidth","FitHeight","Centre","PreviewType","Html","Image","ThumbnailType","File","freeze","position","left","right","bottom","transform","customStylesDefault","constructCustomStyles","styles","SpotlightModal","modalStyles","querySelector","SpotlightModalContent","class","SpotlightModalFieldGroup","SpotlightModalLabel","rootReducer","combineReducers","reportHistoryReducer","organisationSettings","organisationSettingsReducer","practiceSettings","practiceSettingsReducer","sectionOptions","sectionOptionsReducer","exportState","exportReducer","notificationsMenuReducer","notificationsReducer","organisationsReducer","sidebarReducer","whatsNewReducer","reportExport","reportExportReducer","dataImport","dataImportReducer","store","createStore","compose","applyMiddleware","thunk","element","component","root","createRoot","pushRoot","useAppDispatch","useDispatch","useAppSelector","useSelector"],"sourceRoot":""}