{"version":3,"sources":["app/components/Form/FormItem/FormItem.base.tsx","app/components/Form/FormItem/FormItem.ts","app/components/Form/FormItem/FormItem.styles.ts","app/components/Form/FormSection/FormSection.styles.ts","app/components/Form/FormSection/FormSection.base.tsx","app/components/Form/FormSection/FormSection.ts","app/components/Form/FormTitle/FormTitle.base.tsx","app/components/Form/FormTitle/FormTitle.styles.ts","app/components/Form/FormTitle/FormTitle.ts","app/App.messages.ts","app/utils/CSVHelper.ts","app/utils/NumberUtils.ts","app/utils/notificationUtils.ts","app/@data/store/schema/userrolemodels/Model.ts","app/@data/store/schema/userrolemodels/Account.ts","app/@data/store/schema/userrolemodels/AdBlock.ts","app/@data/store/schema/userrolemodels/AdUnit.ts","app/@data/store/schema/userrolemodels/Channel.ts","app/@data/store/schema/userrolemodels/DropdownMenu.ts","app/@data/store/schema/userrolemodels/Filter.ts","app/@data/store/schema/userrolemodels/NavigationMenu.ts","app/@data/store/schema/userrolemodels/Property.ts","app/@data/store/schema/userrolemodels/Publisher.ts","app/@data/store/schema/userrolemodels/PublisherProfileTabs.ts","app/@data/store/schema/userrolemodels/PublisherSettings.ts","app/@data/store/schema/userrolemodels/User.ts","app/@data/store/schema/userrolemodels/UserSettings.ts","app/@data/services/UserRoleService.ts","app/constants/AppConstants.ts","app/layout/GridPageV2/index.ts","app/pages/report/@data/store/schema/ColumnsEnum.ts","app/pages/ad-management/AdQuality/@data/store/store.ts","app/Routes.ts","app/pages/report/DashboardCards/ReportCard/ReportCard.types.ts","app/pages/partner-management/User/@data/actions/onAcceptInvitePageChanged.ts","app/pages/partner-management/User/@data/actions/onDevTokenChanged.ts","app/pages/partner-management/User/@data/actions/onUserChanged.ts","app/pages/partner-management/User/@data/actions/onUserFormsChanged.ts","app/pages/partner-management/User/@data/actions/sendWelcomeToPubcenterEmail.ts","app/pages/ad-management/Adunit/@data/actions/fetchAdUnitsDataAction.ts","app/pages/ad-management/Adunit/@data/actions/onAdunitChanged.ts","app/pages/ad-management/Adunit/@data/actions/onAdunitFormsChanged.ts","app/pages/ad-management/Adunit/@data/actions/onCodePanelActions.ts","app/hooks/useCanvasTextWidth.ts","app/hooks/useDebounce.ts","app/hooks/useIntersectionObserverWithRefCallback.ts","app/hooks/useNativeAdSdk.ts","app/hooks/usePUID.ts","app/hooks/usePreloadSVGImages.ts","app/hooks/useSortableGridColumns.ts","app/hooks/useStateWithLatestCallback/index.ts","app/hooks/useWindowSize/index.tsx","app/pages/ad-management/AdQuality/@data/store/schema/IAdCreativeViewModel.ts","app/@data/store/store.ts","app/utils/GlobalStyleUtils.ts","app/@data/actions/onAccountActions.ts","app/@data/actions/onAuthenticationAction.ts","app/@data/actions/onEntityGridColumnsActions.ts","app/@data/actions/onHelpInfoActions.ts","app/@data/actions/onLayoutChanged.ts","app/@data/actions/onMenuCollapsedChanged.ts","app/@data/actions/onNavigationActions.ts","app/@data/actions/onNotificationActions.ts","app/@data/actions/onNotificationPanelActions.ts","app/@data/actions/onPublisherActions.ts","app/@data/actions/onUserActions.ts","app/NotificationsPanel.Types.messages.ts","app/pages/ad-management/Profile/@data/actions/actions.ts","app/pages/ad-management/Profile/@data/actions/appealActions.ts","app/layout/GridPageV2/@data/store/store.ts","app/pages/ad-management/Account/Settings/@data/store/store.ts","app/@data/store/schema/models/Model.ts","theme.ts","app/pages/partner-management/User/UserPage.messages.ts","app/@data/store/schema/validations/zipcodes.ts","app/@data/store/schema/validations/addressValidationModel.ts","app/@data/store/schema/viewmodels/IdNamePairErrorModel.ts","app/pages/ad-management/AdQuality/@data/services/utility/utility.ts","app/pages/ad-management/Property/Manage/__data__/store/store.ts","app/components/GridFilter/GridFilter.types.ts","app/@data/store/schema/enums/FilterCondition.ts","app/utils/routeUtils.ts","app/constants/DomainConstants.ts","app/pages/ad-management/Adunit/@data/store/store.ts","app/@data/utils/checkUserType.ts","app/layout/GridPageV2/@data/mutatorActions/onGridChanged.ts","app/layout/GridPageV2/@data/mutatorActions/onGridColumnsModified.ts","app/layout/GridPageV2/@data/selectors/gridSelectors.ts","app/constants/DataTestIdConstants.ts","app/pages/ad-management/@data/actions/index.ts","app/pages/report/Report.messages.ts","app/@data/mutatorActions/localeMutatorAction.ts","app/@data/mutatorActions/onFirstPartyBoost.ts","app/@data/mutatorActions/onPanelTypeChanged.ts","app/@data/mutatorActions/onPopupOpenChanged.ts","app/@data/mutatorActions/toastNotificationMutatorActions.ts","app/config/ui.config.ts","app/layout/GridPageV2/GridV2.types.ts","app/utils/AccessibilityUtils.ts","app/pages/report/ReportMetadata.messages.ts","app/pages/report/utils/intlHelper.ts","app/hooks/useWindowSize/store/store.ts","app/pages/ad-management/Adunit/@data/store/partnerCodeChecker.ts","app/@data/utils/requestUtils.ts","app/pages/partner-management/User/@data/store/store.ts","app/pages/ad-management/Property/Manage/__data__/mutatorActions/setSites.ts","app/pages/ad-management/UserManagement/UserManagement.messages.ts","app/pages/ad-management/@data/store/store.ts","app/@data/utils/handleApiErrors.ts","logging/src/Log.ts","app/components/AzureMaps/BubbleMap.tsx","app/components/HighCharts/HighChartsLibrary.ts","app/components/HighCharts/CustomChart/CustomChart.tsx","app/utils/AuthenticationUtils.ts","app/pages/report/components/common/ZeroTotalChart/ZeroTotalChart.tsx","app/pages/report/constants/metricsColors.ts","app/pages/report/DashboardCards/ReportCard/ReportCard.helpers.tsx","app/pages/ad-management/Adunit/@data/mutatorActions/adSenseMediationChanged.ts","app/pages/ad-management/Adunit/@data/mutatorActions/privateMarketplaceChanged.ts","app/pages/ad-management/Adunit/@data/mutatorActions/setAdUnits.ts","i18n/useI18n.ts","app/components/InfoToggle/InfoToggle.base.tsx","app/components/InfoToggle/InfoToggle.styles.ts","app/components/InfoToggle/InfoToggle.ts","app/components/DataGrid/DataGrid.messages.ts","app/components/DataGrid/DataGrid.base.tsx","app/utils/DataGridUtils/CommandBarUtils.ts","app/components/DataGrid/DataGrid.styles.ts","app/components/DataGrid/DataGrid.ts","app/pages/ad-management/Property/Property.messages.ts","app/@data/store/schema/models/PublisherAccountUserCreate.ts","app/@data/services/ApiService.ts","app/pages/report/utils/metricsFormatter.ts","app/utils/ReactUtils.ts","app/@data/store/schema/enums/AdSenseOAuthStatus.ts","app/components/Form/FormLabel/FormLabel.base.tsx","app/components/Form/FormLabel/FormLabel.styles.ts","app/components/Form/FormLabel/FormLabel.ts","app/@data/store/schema/enums/PopupType.ts","app/pages/login/@data/store/LoginPageStore.ts","app/pages/ad-management/Profile/@data/store/store.ts","app/layout/GridPageV2/GridV2.messages.ts","app/pages/report/components/CustomCalender/CustomCalender.types.ts","app/pages/ad-management/Profile/ProfilePage.messages.ts","app/layout/DetailPage/DetailPage.messages.ts","app/layout/DetailPage/DetailPage.styles.ts","app/layout/DetailPage/DetailPage.tsx","app/config/pubCenterAAD.config.ts","app/pages/ad-management/Home/@data/store/schema/IHomeViewState.ts","app/@data/store/schema/models/ServingConfigs.ts","app/config/locale.ts","app/pages/ad-management/Home/@data/store/store.ts","app/components/ZeroResults/ZeroResults.styles.ts","app/components/ZeroResults/ZeroResults.tsx","app/@data/store/selectors/userContextSelectors.ts","app/pages/report/@data/store/store.ts","app/@data/services/MediationReportingService.ts","app/pages/report/hooks/useReportQuery.ts","app/pages/report/DashboardCards/@data/utils/mapAdUnitName.ts","app/pages/ad-management/Account/@data/actions/mutatorActions.ts","app/globalization/countries.ts","app/globalization/currencies.ts","app/globalization/languages.ts","app/globalization/locales.ts","app/globalization/timezone.ts","app/globalization/weekDays.ts","app/pages/partner-management/@data/service/PartnerManagementService.ts","app/pages/report/@data/actions/onCurrentRouteChanged.ts","app/pages/report/@data/actions/onReportLinkClicked.ts","app/pages/report/@data/actions/onSetPublisherReporting.ts","app/utils/validation/ArrayObservableSchemaYupType.ts","app/utils/validation/StringListSchemaYupType.ts","app/utils/validation/StringListTransformerYupType.ts","app/utils/validation/YupUtils.ts","app/pages/ad-management/Account/Payments/EstimatedEarnings/EstimatedEarnings.types.ts","app/pages/partner-management/User/@data/index.ts","app/layout/GridPageV2/@data/actions/commandBarActions.ts","app/@data/store/schema/models/AdSenseMediation.ts","app/pages/ad-management/Profile/@data/store/selectors.ts","app/pages/report/@data/store/UrlQueryStore.tsx","app/pages/login/@data/actions/loginActions.ts","app/pages/login/@data/actions/loginFormActions.ts","app/pages/login/@data/actions/onUserAuthentication.ts","app/pages/report/@data/store/schema/ReportsQueryStoreKeys.ts","app/@data/store/schema/models/AdSenseAdUnitStatus.ts","app/pages/report/components/CustomCalender/utils/CalenderUtils.ts","app/pages/ad-management/Account/Settings/components/GoogleConnector/@data/actions/actions.ts","app/layout/GridPageLayout/GridPageLayout.styles.ts","app/layout/GridPageLayout/GridPageLayout.tsx","app/pages/ad-management/Account/@data/store/selectors.ts","app/pages/ad-management/Account/Settings/SettingsPage.messages.ts","app/@data/services/MetadataService.ts","app/utils/UrlUtils.ts","logging/src/Environment.ts","app/pages/ad-management/AdQuality/@data/services/utility/constants.ts","app/pages/ad-management/Home/components/ResourcesSection/ResourcesSection.messages.ts","app/components/TnCModal/TnCModal.messages.ts","app/pages/ad-management/Account/Settings/components/GoogleConnector/@data/mutatorActions/onGoogleSettingsChanged.ts","app/layout/GlobalSearchHeader/GlobalSearchHeader.messages.ts","app/components/Card/Card.styles.ts","app/components/Card/Card.tsx","app/components/Main/Main.tsx","app/pages/ad-management/Account/Settings/@data/mutatorActions/systemPreferencesChanged.ts","app/pages/ad-management/Home/@data/actions/onDialogActions.ts","app/@data/store/schema/enums/PublisherType.ts","app/pages/partner-management/Account/@data/services/AccountService.ts","app/pages/ad-management/Account/Settings/components/GoogleConnector/GoogleConnector.messages.ts","app/@data/utils/supportedLanguages.ts","app/pages/ad-management/Account/Payments/Onboarding/usePaymentsOnboarding.tsx","app/components/DateTimePicker/DateTimePicker.messages.ts","app/PubCenterAuthContext.ts","app/utils/cookiesUtils.ts","app/@data/services/PubCenterAADAuthService.ts","app/pages/ad-management/Account/Settings/@data/actions/index.ts","app/pages/ad-management/UserManagement/utils/userRoleUtils.ts","app/pages/report/DashboardCards/@data/orchestrators/fetchReportDimensionColumnMembers.ts","app/pages/report/DashboardCards/@data/store/store.ts","app/pages/ad-management/Account/Settings/@data/actions/onNotificationPreferencesChanged.ts","logging/src/LogType.ts","app/pages/ad-management/Profile/@data/index.ts","app/pages/ad-management/Account/@data/actions/actions.ts","app/pages/ad-management/Profile/@data/actions/mutatorActions.ts","app/pages/partner-management/@data/store/store.ts","app/components/IconTooltip/IconTooltip.tsx","app/components/Header/Header.types.ts","app/Toasts.messages.ts","app/layout/PageLayout/header-panels/FeedbackPanel/@data/actions/formChanges.ts","app/layout/PageLayout/header-panels/FeedbackPanel/@data/store/schema/enums/FeedbackType.ts","app/layout/PageLayout/header-panels/FeedbackPanel/@data/store/store.ts","app/layout/PageLayout/header-panels/FeedbackPanel/@data/mutatorActions/feedbackFormChanged.ts","app/layout/PageLayout/header-panels/FeedbackPanel/@data/orchestrators/feedbackFormSubmitted.ts","app/layout/PageLayout/header-panels/FeedbackPanel/@data/store/schema/FeedbackPanelErrorModel.ts","app/layout/PageLayout/header-panels/FeedbackPanel/FeedbackPanel.messages.ts","app/layout/PageLayout/header-panels/FeedbackPanel/FeedbackPanel.styles.ts","app/layout/PageLayout/header-panels/FeedbackPanel/FeedbackPanel.tsx","app/layout/PageLayout/header-panels/HelpPanel/HelpPanel.messages.ts","app/layout/PageLayout/header-panels/HelpPanel/HelpPanel.tsx","app/components/NotificationCard/NotificationCard.base.tsx","app/components/NotificationCard/NotificationCard.styles.ts","app/components/NotificationCard/NotificationCard.ts","app/layout/PageLayout/header-panels/NotificationsPanel/NotificationsPanel.messages.ts","app/layout/PageLayout/header-panels/NotificationsPanel/NotificationsPanel.styles.ts","app/layout/PageLayout/header-panels/NotificationsPanel/NotificationsPanel.tsx","app/layout/PageLayout/header-panels/ProfilePanel/ProfilePanel.styles.ts","app/layout/PageLayout/header-panels/ProfilePanel/ProfilePanel.tsx","app/layout/PageLayout/header-panels/SettingsPanel/SettingsPanel.messages.ts","app/layout/PageLayout/header-panels/SettingsPanel/SettingsPanel.tsx","app/@data/utils/getAccessPermission.ts","app/layout/GridPageV2/GridV2.styles.ts","app/pages/ad-management/Account/constants.ts","app/pages/ad-management/Home/@data/mutatorActions/setHomePageStatus.ts","app/@data/store/schema/models/EntityEvaluationStatus.ts","app/components/ToastNotification/ToastNotification.types.ts","app/pages/partner-management/User/Manage/ManagePage.types.ts","app/components/Popup/index.ts","app/@data/selectors/publisherSelectors.ts","app/utils/ObjectUtils.ts","app/@data/services/PaymentsService.ts","app/pages/ad-management/@data/actions/entityEvaluationMutatorActions.ts","app/pages/ad-management/Account/Settings/@data/mutatorActions/settingsPageChanged.ts","app/pages/ad-management/Profile/@data/services/generateCodeAsync.ts","app/pages/ad-management/Profile/@data/services/updatePublisherProfileDetails.ts","app/pages/ad-management/Profile/@data/services/validateAddressAsync.ts","app/@data/store/schema/models/AddressValidation.ts","app/constants/StyleConstants.ts","app/config/adProviders.ts","app/pages/ad-management/Account/@data/store/paymentsPageStore.ts","app/components/DateTimePicker/DateTimePicker.types.ts","app/components/GridWithCustomColumns/GridCommonStyles.ts","app/components/GridWithCustomColumns/GridCell.tsx","app/pages/ad-management/Account/Payments/Onboarding/paymentsOnboarding.messages.ts","app/pages/report/components/CustomCalender/CustomCalender.messages.ts","app/components/ExternalLink/ExternalLink.tsx","app/components/ConditionalTooltip/ConditionalTooltip.tsx","app/hooks/useWindowsAppFeatureFlag/store/store.ts","app/pages/ad-management/Home/components/ResourcesSection/ResourcesSection.styles.ts","app/pages/ad-management/Home/components/ResourcesSection/components/ResourceCard.styles.ts","app/pages/ad-management/Home/components/ResourcesSection/components/ResourceCard.tsx","app/pages/ad-management/Home/components/ResourcesSection/utils/utils.tsx","app/pages/ad-management/Home/components/ResourcesSection/ResourcesSection.tsx","app/pages/terms-and-conditions/@data/mutators/setNotificationPanelTriggered.ts","app/pages/ad-management/AdBlock/LazyAdBlockPage.tsx","app/pages/ad-management/AdFilter/@data/actions/onFilterChanged.ts","app/pages/ad-management/AdFilter/@data/actions/onFilterFormsChanged.ts","app/pages/ad-management/AdFilter/@data/actions/onManagePageInitialized.ts","app/pages/ad-management/AdFilter/@data/store/store.ts","app/pages/ad-management/AdFilter/@data/mutators/filterChanged.ts","app/pages/ad-management/AdFilter/@data/mutators/filterFormsChanged.ts","app/pages/ad-management/AdFilter/@data/orchestrators/formCancelled.ts","app/layout/DetailPageWithStepper/utils/getMultiStepperRoute.ts","app/pages/ad-management/AdFilter/@data/orchestrators/formDownloadClicked.ts","app/pages/ad-management/@data/services/AdManagementService.ts","app/pages/ad-management/AdFilter/@data/orchestrators/formInitialized.ts","app/pages/ad-management/AdFilter/@data/services/FilterService.ts","app/pages/ad-management/AdFilter/@data/orchestrators/formSubmitted.ts","app/pages/ad-management/AdFilter/@data/store/schema/FilterErrorModel.ts","app/pages/ad-management/AdFilter/@data/orchestrators/managePageInitialized.ts","app/components/bulkUpload/bulkUpload.base.tsx","app/components/bulkUpload/bulkUpload.styles.ts","app/components/bulkUpload/bulkUpload.ts","app/components/DateTimePicker/DateTimePicker.tsx","app/components/DateTimePicker/DateTimePicker.styles.ts","app/pages/ad-management/Channel/@data/store/store.ts","app/pages/ad-management/Channel/@data/actions/onChannelChanged.ts","app/pages/ad-management/Channel/@data/actions/onChannelFormsChanged.ts","app/pages/ad-management/Channel/@data/actions/onManagePageInitialized.ts","app/pages/ad-management/Channel/Create/CreateChannel.messages.ts","app/pages/ad-management/Channel/Create/CreateChannel.tsx","app/pages/ad-management/AdFilter/Create/CreateAdFilter.messages.ts","app/pages/ad-management/AdFilter/Create/CreateAdFilter.styles.ts","app/pages/ad-management/AdFilter/Create/CreateAdFilter.types.ts","app/pages/ad-management/AdFilter/Create/CreateAdFilter.tsx","app/pages/ad-management/AdFilter/Manage/ManagePage.messages.ts","app/pages/ad-management/AdFilter/Manage/utils/getFilterItems.tsx","app/pages/ad-management/AdFilter/Manage/utils/getCommandBarItems.tsx","app/pages/ad-management/AdFilter/Manage/ManagePage.tsx","app/pages/ad-management/AdFilter/Manage/utils/getGridColumns.tsx","app/pages/ad-management/AdFilter/AdFilterPage.tsx","app/pages/ad-management/AdQuality/@data/actions/onAdCreativeChanged.ts","app/pages/ad-management/AdQuality/@data/actions/onTeachingBubbleActions.ts","app/pages/ad-management/AdQuality/@data/mutators/AdCreativeChanged.ts","app/pages/ad-management/AdQuality/AdReview/AdCreativePage.messages.ts","app/config/blockReasons.ts","app/pages/ad-management/AdQuality/@data/actions/onAdCreativePageInitialized.ts","app/pages/ad-management/AdQuality/@data/actions/onBlockAdsFormChanged.ts","app/pages/ad-management/AdQuality/@data/actions/onBlockSummaryChanged.ts","app/pages/ad-management/AdQuality/@data/actions/onBlockedContextChanged.ts","app/pages/ad-management/AdQuality/@data/actions/onFilterPanelActions.ts","app/pages/ad-management/AdQuality/@data/mutators/BlockAdsFormChanged.ts","app/pages/ad-management/AdQuality/@data/mutators/BlockSummaryChanged.ts","app/pages/ad-management/AdQuality/@data/mutators/BlockedContextChanged.ts","app/pages/ad-management/AdQuality/@data/mutators/filterPanelChanged.ts","app/pages/ad-management/AdQuality/@data/services/AdCreativeService.ts","app/pages/ad-management/AdQuality/@data/services/AdBlockService.ts","app/pages/ad-management/AdQuality/@data/store/schema/models/AdPerformanceData.ts","app/pages/ad-management/AdQuality/@data/store/schema/models/BlockAdsData.ts","app/pages/ad-management/AdQuality/@data/store/schema/models/BlockImagesData.ts","app/pages/ad-management/AdQuality/@data/store/schema/models/BlockImageSummaryData.ts","app/pages/ad-management/AdQuality/@data/store/schema/models/BlockItemType.ts","app/pages/ad-management/AdQuality/@data/store/schema/models/SAMBlockAdData.ts","app/pages/ad-management/AdQuality/@data/store/schema/models/SAMBlockSummaryData.ts","app/pages/ad-management/AdQuality/@data/store/schema/BlockItemErrorModel.ts","app/pages/ad-management/AdQuality/@data/orchestrators/adCreativeDateChanged.ts","app/pages/ad-management/AdQuality/@data/orchestrators/MSANBlockAdsSubmitted.ts","app/pages/ad-management/AdQuality/@data/orchestrators/SAMBlockAdsItemStatusChanged.ts","app/pages/ad-management/AdQuality/@data/orchestrators/SAMBlockAdsSubmitted.ts","app/pages/ad-management/AdQuality/@data/store/schema/SAMBlockItemErrorModel.ts","app/pages/ad-management/AdQuality/@data/orchestrators/SAMBlockSummaryViewImagesClicked.ts","app/pages/ad-management/AdQuality/@data/orchestrators/adCreativeExportClicked.ts","app/pages/ad-management/AdQuality/@data/mutatorActions/AdQualityFilterChanged.ts","app/pages/ad-management/AdQuality/@data/mutatorActions/onAdCreativeChanged.ts","app/pages/ad-management/AdQuality/@data/store/adQualityConverter.ts","app/pages/ad-management/AdQuality/@data/orchestrators/adCreativePageInitialized.ts","app/pages/ad-management/AdQuality/@data/orchestrators/adCreativeRefreshDataChanged.ts","app/pages/ad-management/AdQuality/@data/store/schema/AdCreativeViewErrorModel.ts","app/pages/ad-management/AdQuality/@data/orchestrators/adProviderChanged.ts","app/pages/ad-management/AdQuality/@data/orchestrators/adQualityPanelApplyButtonClicked.ts","app/pages/ad-management/AdQuality/@data/orchestrators/adSourceChanged.ts","app/pages/ad-management/AdQuality/@data/orchestrators/blockAdInitialized.ts","app/pages/ad-management/AdQuality/@data/orchestrators/blockAdsChannelListandRevenue.ts","app/pages/ad-management/AdQuality/@data/orchestrators/blockAdsItemStatusChanged.ts","app/pages/ad-management/AdQuality/@data/orchestrators/blockAdsSubmitted.ts","app/pages/ad-management/AdQuality/@data/orchestrators/blockImagesSubmitted.ts","app/pages/ad-management/AdQuality/@data/orchestrators/blockedAdsExportClicked.ts","app/pages/ad-management/AdQuality/@data/orchestrators/blockedContextChanged.ts","app/pages/ad-management/AdQuality/@data/orchestrators/blockedImagesExportClicked.ts","app/pages/ad-management/AdQuality/@data/orchestrators/refreshBlockSummary.ts","app/pages/ad-management/AdQuality/@data/store/adQualitySelectors.ts","app/components/Filters/ListFilter/ListFilter.messages.ts","app/components/Filters/ListFilter/ListFilter.styles.ts","app/components/Filters/ListFilter/ListFilter.tsx","app/pages/ad-management/AdQuality/AdQualityFilters/@data/mutatorActions/onAdQualityFiltersChanged.ts","app/components/Filters/TextFilter/TextFilter.messages.ts","app/components/Filters/TextFilter/TextFilter.tsx","app/pages/ad-management/AdQuality/AdQualityFilters/MultiTextFilters/MultiTextFilters.messages.ts","app/pages/ad-management/AdQuality/AdQualityFilters/MultiTextFilters/MultiTextFilters.styles.ts","app/pages/ad-management/AdQuality/AdQualityFilters/MultiTextFilters/MultiTextFilters.tsx","app/pages/ad-management/AdQuality/AdQualityFilters/AdQualityFilters.tsx","app/pages/ad-management/AdQuality/AdQualityFilters/AdQualityFilters.styles.ts","app/pages/ad-management/AdQuality/AdReview/AdCreativePage.styles.ts","app/pages/ad-management/AdQuality/AdReview/AdCreativePage.tsx","app/pages/ad-management/AdQuality/AdQualityPage.tsx","app/hooks/useEntityTypeManage.ts","app/components/EntityTypeSwitch/messages.ts","app/components/EntityTypeSwitch/index.tsx","app/pages/ad-management/Adunit/Manage/ManagePage.messages.ts","app/pages/ad-management/Adunit/Manage/components/AdUnitNameCallout/AdUnitNameCallout.messages.ts","app/pages/ad-management/Adunit/Manage/components/AdUnitNameCallout/AdUnitNameCallout.styles.ts","app/pages/ad-management/Adunit/Manage/components/AdUnitNameCallout/AdUnitNameCallout.tsx","app/pages/ad-management/Adunit/TythonAdunit/components/ScriptPage/@data/actions/onScriptPageActions.ts","app/components/Form/FormState/formUtils.ts","app/pages/ad-management/Adunit/TythonAdunit/components/NoScriptPage/NoScriptPage.messages.ts","app/pages/ad-management/Adunit/TythonAdunit/components/NoScriptPage/NoScriptPage.styles.ts","app/pages/ad-management/Adunit/TythonAdunit/components/NoScriptPage/NoScriptPage.tsx","app/pages/ad-management/Adunit/TythonAdunit/components/ScriptPage/@data/store/store.ts","app/pages/ad-management/Adunit/TythonAdunit/components/ScriptPage/@data/mutators/scriptChanged.ts","app/@data/store/schema/models/AdunitServingScript.ts","app/pages/ad-management/Adunit/TythonAdunit/components/ScriptPage/ScriptPage.messages.ts","app/pages/ad-management/Adunit/TythonAdunit/components/ScriptPage/@data/orchestrators/scriptPageInitialized.ts","app/pages/ad-management/Adunit/TythonAdunit/components/ScriptPage/@data/orchestrators/scriptPageSubmitted.ts","app/pages/ad-management/Adunit/TythonAdunit/components/ScriptPage/ScriptPage.styles.ts","app/pages/ad-management/Adunit/TythonAdunit/components/ScriptPage/ScriptPage.tsx","app/pages/ad-management/Adunit/Manage/components/CodePanel/CodePanel.tsx","app/pages/ad-management/Adunit/TythonAdunit/CreateAdunit/messages.ts","app/pages/ad-management/Adunit/@data/services/AdunitService.ts","app/pages/ad-management/Adunit/Manage/utils/getFilterItems.tsx","app/pages/ad-management/Adunit/Manage/utils/getCommandBarItems.tsx","app/layout/GridPageV2/components/HeaderInfoCallout.tsx","app/pages/ad-management/Adunit/Manage/ManagePage.styles.ts","app/pages/ad-management/Adunit/Manage/utils/getGridColumns.tsx","app/pages/ad-management/Adunit/Manage/ManagePage.tsx","app/pages/ad-management/Ads/Manage/messages.ts","app/pages/ad-management/Ads/Manage/styles.ts","app/pages/ad-management/Ads/Manage/hooks/useAppAdUnitCodePanel.tsx","app/pages/ad-management/Ads/Manage/hooks/useAppAdsGrid.tsx","app/pages/ad-management/Ads/Manage/AppAdsManagePage.tsx","app/pages/ad-management/Ads/Manage/index.tsx","app/pages/ad-management/Adunit/@data/mutators/adunitChanged.ts","app/pages/ad-management/Adunit/@data/mutators/adunitFormsChanged.ts","app/pages/ad-management/Adunit/@data/mutators/panelOpenChanged.ts","app/pages/ad-management/Adunit/@data/orchestrators/fetchAdUnitMediationStatus.ts","app/pages/ad-management/Adunit/@data/orchestrators/fetchAdUnitName.ts","app/pages/ad-management/Adunit/@data/mutatorActions/setAdUnitTemplate.ts","app/pages/ad-management/Adunit/@data/orchestrators/fetchAdUnitTemplate.ts","app/pages/ad-management/Property/@data/orchestrators/loadPropertyServingConfigs.ts","app/pages/ad-management/Property/@data/orchestrators/fetchPropertiesData.ts","app/pages/ad-management/Adunit/@data/orchestrators/fetchAdUnitsData.ts","app/pages/ad-management/Adunit/@data/orchestrators/formCancelled.ts","app/pages/ad-management/Adunit/@data/orchestrators/formInitialized.ts","app/layout/DetailPageWithStepper/DetailPageWithStepper.types.ts","app/pages/ad-management/Adunit/Create/CreateAdunit.messages.ts","app/@data/store/schema/viewmodels/PartnerCodesValidationModel.ts","app/pages/ad-management/Adunit/@data/orchestrators/formSubmitted.ts","app/pages/ad-management/Adunit/@data/store/schema/AdunitErrorModel.ts","app/pages/ad-management/Adunit/@data/orchestrators/managePageInitialized.ts","app/pages/ad-management/Adunit/@data/orchestrators/updateAdUnitMediationStatus.ts","app/pages/ad-management/Adunit/@data/orchestrators/updateAdUnitName.ts","app/layout/PropertyPicker/PropertyPicker.styles.ts","app/layout/PropertyPicker/PropertyPicker.tsx","app/layout/PropertySitePicker/PropertySitePicker.messages.ts","app/layout/PropertySitePicker/PropertySitePicker.styles.ts","app/layout/PropertySitePicker/PropertySitePicker.tsx","app/pages/ad-management/Property/Create/__data__/store/store.ts","app/pages/ad-management/Property/Create/components/PropertyIdField/messages.ts","app/pages/ad-management/Property/Create/components/PropertyIdField/index.tsx","app/pages/ad-management/Property/Create/__data__/mutatorActions/setPropertyForm.ts","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/utils/GetPropertyAccessPermissions.ts","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/utils/IsFieldDisabled.ts","app/pages/ad-management/Property/Create/components/PropertyNameInputField/messages.ts","app/pages/ad-management/Property/Create/components/PropertyNameInputField/index.tsx","app/pages/ad-management/Property/Create/components/PropertyUrlInputField/messages.ts","app/pages/ad-management/Property/Create/components/PropertyUrlInputField/index.tsx","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/messages.ts","app/pages/ad-management/Property/Create/utils/useDetailsPageButtonsStatus.ts","app/pages/ad-management/Property/@data/services/PropertyService.ts","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/__data__/orchestrators/formInitialized.ts","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/__data__/orchestrators/formSubmitted.ts","app/pages/ad-management/Property/Create/__data__/store/schema/PropertyErrorModel.ts","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/__data__/orchestrators/loadAttachedAdunits.ts","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/__data__/mutatorActions/setPropertyForm.ts","app/pages/ad-management/Property/Manage/__data__/orchestrators/managePageInitialized.ts","app/pages/ad-management/Property/Manage/components/ClarityPanel/types.ts","app/pages/ad-management/Property/Manage/__data__/orchestrators/updateClarity.ts","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/components/ClarityFormSection/components/ClarityInputField/messages.ts","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/components/ClarityFormSection/components/ClarityInputField/styles.ts","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/components/ClarityFormSection/components/ClarityInputField/index.tsx","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/components/ClarityFormSection/components/ConnectedClarityField/index.tsx","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/components/ClarityFormSection/messages.ts","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/components/ClarityFormSection/index.tsx","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/components/PropertyApprovalStateField/messages.ts","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/components/PropertyApprovalStateField/utils/GetApprovalStatusOptions.ts","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/components/PropertyApprovalStateField/index.tsx","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/components/PropertyApprovalStatusInputField/messages.ts","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/components/PropertyApprovalStatusInputField/index.tsx","app/components/HierarchicalMultiSelectPicker/HierarchicalMultiSelectPicker.messages.ts","app/components/HierarchicalMultiSelectPicker/HierarchicalMultiSelectPicker.base.tsx","app/components/HierarchicalMultiSelectPicker/HierarchicalMultiSelectPicker.styles.ts","app/components/HierarchicalMultiSelectPicker/HierarchicalMultiSelectPicker.ts","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/components/PropertyAttachedAdUnitsField/messages.ts","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/components/PropertyAttachedAdUnitsField/index.tsx","app/pages/ad-management/Property/Create/variations/CreateNonTythonProperty/index.tsx","app/@data/store/schema/models/NativeAdTemplateBoost.ts","app/utils/UnitsUtils.ts","app/pages/ad-management/Adunit/Create/components/BoostTemplateUploader/BoostJsonFileUpload.messages.ts","app/pages/ad-management/Adunit/Create/components/BoostTemplateUploader/BoostJsonFileUpload.styles.ts","app/pages/ad-management/Adunit/Create/components/BoostTemplateUploader/BoostJsonFileUpload.tsx","app/pages/ad-management/Adunit/Create/components/DisablingMediationPopup/DisablingMediationPopup.messages.ts","app/pages/ad-management/Adunit/Create/components/DisablingMediationPopup/DisablingMediationPopup.tsx","app/pages/ad-management/Adunit/TythonAdunit/CreateAdunit/constants.ts","app/pages/ad-management/Adunit/TythonAdunit/components/AdUnitTypeSelector/useAdUnitTypeSelector.ts","app/pages/ad-management/Adunit/Create/CreateAdunit.styles.ts","app/pages/ad-management/Adunit/Create/CreateAdunit.tsx","app/pages/ad-management/Adunit/TythonAdunit/CreateAdunit/styles.ts","app/pages/ad-management/Adunit/TythonAdunit/components/AdUnitMediationSelector/DisablingMediationPopup/DisablingMediationPopup.messages.ts","app/pages/ad-management/Adunit/TythonAdunit/components/AdUnitMediationSelector/DisablingMediationPopup/DisablingMediationPopup.tsx","app/pages/ad-management/Adunit/TythonAdunit/components/AdUnitMediationSelector/index.tsx","app/pages/ad-management/Adunit/TythonAdunit/components/AdUnitNameInput/index.tsx","app/components/Stepper/Stepper.types.ts","app/components/Stepper/Step.style.ts","app/components/Stepper/Step.tsx","app/components/Stepper/Stepper.style.ts","app/components/Stepper/Stepper.tsx","app/layout/DetailPageWithStepper/DetailPageWithStepper.messages.ts","app/layout/DetailPageWithStepper/DetailPageWithStepper.styles.ts","app/layout/DetailPageWithStepper/LeavePagePopup/LeavePagePopup.messages.ts","app/layout/DetailPageWithStepper/LeavePagePopup/LeavePagePopup.tsx","app/layout/DetailPageWithStepper/utils/useStepperLogic.ts","app/layout/DetailPageWithStepper/DetailPageWithStepper.tsx","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/utils/validateForm.ts","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/__data__/orchestrators/formSubmitted.ts","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/components/AdsTextPage/messages.ts","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/components/AdsTextPage/styles.ts","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/components/AdsTextPage/index.tsx","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/__data__/orchestrators/formInitialized.ts","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/__data__/mutatorActions/setPropertyForm.ts","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/components/CreateProperty/components/ClarityOptions/messages.ts","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/components/CreateProperty/components/ClarityOptions/styles.ts","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/components/CreateProperty/components/ClarityOptions/index.tsx","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/components/CreateProperty/index.tsx","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/components/ScriptPage/@data/actions/onScriptPageActions.ts","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/components/ScriptPage/@data/store/store.ts","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/components/ScriptPage/@data/mutators/scriptChanged.ts","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/components/ScriptPage/messages.ts","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/components/ScriptPage/@data/orchestrators/scriptPageInitialized.ts","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/components/ScriptPage/@data/orchestrators/scriptPageSubmitted.ts","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/components/ScriptPage/styles.ts","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/components/ScriptPage/index.tsx","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/messages.ts","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/index.tsx","app/pages/ad-management/Adunit/TythonAdunit/components/AdUnitSiteSelector/index.tsx","app/components/Accordion/Accordion.styles.ts","app/components/Accordion/messages.ts","app/components/Accordion/index.tsx","app/components/ColorPicker/ColorPicker.messages.ts","app/components/ColorPicker/ColorPicker.styles.ts","app/components/ColorPicker/swatchColors.ts","app/components/ColorPicker/ColorPicker.tsx","app/pages/ad-management/Adunit/TythonAdunit/services/fontOptions.ts","app/pages/ad-management/Adunit/TythonAdunit/components/AdUnitTypeSelector/PreviewComponent.tsx","app/pages/ad-management/Adunit/TythonAdunit/components/AdUnitTypeSelector/index.tsx","app/pages/ad-management/Adunit/TythonAdunit/services/loadProperties.ts","app/pages/ad-management/Adunit/TythonAdunit/services/utils.ts","app/pages/ad-management/Adunit/TythonAdunit/services/loadTythonAdUnitById.ts","app/pages/ad-management/Adunit/TythonAdunit/CreateAdunit/useAdUnitData.ts","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/__data__/services/createProperty.ts","app/pages/ad-management/Adunit/TythonAdunit/services/createTythonAdUnit.ts","app/pages/ad-management/Adunit/TythonAdunit/services/enableTythonAdUnitMediation.ts","app/pages/ad-management/Adunit/TythonAdunit/services/updateTythonAdUnit.ts","app/pages/ad-management/Adunit/TythonAdunit/CreateAdunit/useAdUnitEventHandlers.ts","app/pages/ad-management/Adunit/TythonAdunit/services/disableTythonAdUnitMediation.ts","app/pages/ad-management/Adunit/TythonAdunit/CreateAdunit/useCreateTythonAdunit.ts","app/pages/ad-management/Adunit/TythonAdunit/CreateAdunit/index.tsx","app/pages/ad-management/Adunit/TythonAppAdUnit/components/types.ts","app/pages/ad-management/Adunit/TythonAppAdUnit/messages.ts","app/pages/ad-management/Adunit/TythonAppAdUnit/CreateAdUnit/types.ts","app/pages/ad-management/Adunit/TythonAppAdUnit/components/V2HelpInfoBubble.tsx","app/pages/ad-management/Adunit/TythonAppAdUnit/components/styles.ts","app/pages/ad-management/Adunit/TythonAppAdUnit/components/NativeAdDynamicAdPreview.tsx","app/pages/ad-management/Adunit/TythonAppAdUnit/components/AdPreviewDynamicRenderer.tsx","app/pages/ad-management/Adunit/TythonAppAdUnit/components/StaticAdPreview.tsx","app/pages/ad-management/Adunit/TythonAppAdUnit/components/V2SectionalAccordion.tsx","app/pages/ad-management/Adunit/TythonAppAdUnit/components/AppAdUnitPrimaryForm.tsx","app/pages/ad-management/Adunit/TythonAppAdUnit/components/AppAdUnitResultSummary.tsx","app/pages/ad-management/Adunit/TythonAppAdUnit/CreateAdUnit/useCreateTythonAppAdUnit.ts","app/pages/ad-management/Adunit/TythonAppAdUnit/CreateAdUnit/index.tsx","app/pages/ad-management/Adunit/AdunitPage.tsx","app/pages/ad-management/Channel/@data/mutators/channelChanged.ts","app/pages/ad-management/Channel/@data/mutators/channelFormsChanged.ts","app/pages/ad-management/Channel/@data/orchestrators/formCancelled.ts","app/pages/ad-management/Channel/@data/services/ChannelService.ts","app/pages/ad-management/Channel/@data/orchestrators/formInitialized.ts","app/pages/ad-management/Channel/@data/orchestrators/formSubmitted.ts","app/pages/ad-management/Channel/@data/store/schema/ChannelErrorModel.ts","app/pages/ad-management/Channel/@data/orchestrators/managePageInitialized.ts","app/pages/ad-management/Channel/Manage/ManagePage.messages.ts","app/pages/ad-management/Channel/Manage/utils/getCommandBarItems.tsx","app/pages/ad-management/Channel/Manage/ManagePage.tsx","app/pages/ad-management/Channel/Manage/utils/getGridColumns.tsx","app/pages/ad-management/Channel/ChannelPage.tsx","app/pages/ad-management/Home/components/AnnouncementCard/AnnouncementCard.styles.ts","app/pages/ad-management/Home/components/AnnouncementCard/AnnouncementCard.tsx","app/pages/ad-management/Home/components/AnnouncementCard/utils/utils.tsx","app/pages/ad-management/Home/components/Announcements/Announcements.message.ts","app/pages/ad-management/Home/components/Announcements/Announcements.styles.ts","app/pages/ad-management/Home/components/Announcements/utils/getAnnouncementCards.tsx","app/pages/ad-management/Home/components/Announcements/utils/utils.tsx","app/pages/ad-management/Home/components/Announcements/Announcements.tsx","app/pages/ad-management/Home/components/FAQSection/FAQSection.messages.ts","app/pages/ad-management/Home/components/FAQSection/FAQSection.styles.ts","app/pages/ad-management/Home/components/FAQSection/components/FAQCard.styles.ts","app/pages/ad-management/Home/components/FAQSection/components/FAQCard.tsx","app/pages/ad-management/Home/components/FAQSection/FAQSection.tsx","app/pages/ad-management/Home/components/FRECards/messages.ts","app/pages/ad-management/Home/components/FRECards/styles.ts","app/pages/ad-management/Home/components/FRECards/FRECard.tsx","app/pages/ad-management/Home/components/FRECards/FREContainer.tsx","app/pages/ad-management/Home/components/SetupCard/SetupCard.messages.ts","app/pages/ad-management/Home/components/SetupCard/SetupCardUtils.ts","app/pages/ad-management/Home/components/SetupCard/SetupCard.styles.ts","app/pages/ad-management/Home/components/SetupCard/utils/getShimmerSetupCard.tsx","app/pages/ad-management/Home/components/SetupCard/utils/renderProgressBar.tsx","app/pages/ad-management/Home/components/SetupCard/SetupCard.tsx","app/pages/ad-management/Home/components/GettingStarted/GettingStarted.messages.ts","app/pages/ad-management/Home/components/GettingStarted/GettingStarted.styles.ts","app/pages/ad-management/Home/components/GettingStarted/utils/getCards.tsx","app/pages/ad-management/Home/components/GettingStarted/utils/getStatusMessages.ts","app/pages/ad-management/Home/components/GettingStarted/GettingStarted.tsx","app/pages/ad-management/Home/components/PerformanceSection/PerformanceSection.styles.ts","app/pages/ad-management/Home/components/PerformanceSection/utils/balanceHelper.tsx","app/pages/ad-management/Home/components/PerformanceSection/components/BalanceCard.styles.ts","app/pages/ad-management/Home/components/PerformanceSection/components/messages.ts","app/pages/ad-management/Home/components/PerformanceSection/components/BalanceCard.tsx","app/pages/ad-management/Home/components/PerformanceSection/utils/getBalanceShimmers.tsx","app/pages/ad-management/Home/components/PerformanceSection/components/MetricItem.styles.ts","app/pages/ad-management/Home/components/PerformanceSection/components/MetricItem.tsx","app/pages/ad-management/Home/components/PerformanceSection/utils/getPerformanceShimmer.tsx","app/pages/ad-management/Home/components/PerformanceSection/components/PerformanceCard.styles.ts","app/pages/ad-management/Home/components/PerformanceSection/components/PerformanceCard.tsx","app/pages/ad-management/Home/components/PerformanceSection/PerformanceSection.tsx","app/pages/ad-management/Home/components/RecommendationsSection/RecommendationsSection.messages.ts","app/pages/ad-management/Home/components/RecommendationsSection/RecommendationsSection.styles.ts","app/pages/ad-management/Home/components/RecommendationsSection/utils/getCards.tsx","app/pages/ad-management/Home/components/RecommendationsSection/RecommendationsSection.tsx","app/pages/ad-management/Home/Manage/ManagePage.messages.ts","app/pages/ad-management/Home/Manage/ManagePage.styles.ts","app/pages/ad-management/Home/Manage/ManagePage.tsx","app/pages/ad-management/Home/HomePage.tsx","app/layout/TutorialCallout/styles.tsx","app/layout/TutorialCallout/index.tsx","app/pages/ad-management/Property/Manage/components/ClarityPanel/messages.ts","app/pages/ad-management/Property/Manage/components/ClarityPanel/index.tsx","app/pages/ad-management/Property/Manage/components/ClarityPanel/styles.ts","app/pages/ad-management/Property/Manage/components/CodePanel/CodePanel.tsx","app/pages/ad-management/Property/Manage/messages.ts","app/pages/ad-management/Property/Manage/styles.ts","app/pages/ad-management/Property/Manage/utils/getClarityTutorialSteps.tsx","app/pages/ad-management/Property/Manage/components/ClarityPanel/utils/getCommandBarItems.tsx","app/pages/ad-management/Property/Manage/utils/getFilterItems.tsx","app/pages/ad-management/Property/Manage/utils/getCommandBarItems.tsx","app/pages/ad-management/Property/Manage/utils/getServingStatusCalloutContent.tsx","app/pages/ad-management/Property/Manage/utils/getGridColumns.tsx","app/pages/ad-management/Property/Manage/index.tsx","app/pages/ad-management/Inventory/Manage/messages.ts","app/pages/ad-management/Inventory/Manage/useAppInventoryGrid.tsx","app/pages/ad-management/Inventory/Manage/AppInventoryManagePage.tsx","app/pages/ad-management/Inventory/Manage/index.tsx","app/components/HelpcenterInfoBubbleV2/index.tsx","app/pages/ad-management/Property/Create/variations/CreateTythonAppProperty/messages.ts","app/pages/ad-management/Property/Create/variations/CreateTythonAppProperty/components/styles.ts","app/pages/ad-management/Property/Create/variations/CreateTythonAppProperty/components/ConnectAppDropdown.tsx","app/pages/ad-management/Property/Create/variations/CreateTythonAppProperty/components/AppPropertyDetailForm.tsx","app/pages/ad-management/Property/Create/variations/CreateTythonAppProperty/components/FinishPage.tsx","app/pages/ad-management/Property/Create/variations/CreateTythonAppProperty/useCreateTythonAppProperty.ts","app/pages/ad-management/Property/Create/variations/CreateTythonAppProperty/index.tsx","app/pages/ad-management/Property/index.tsx","app/pages/ad-management/@data/services/getAdmanagementRoutes.ts","app/pages/ad-management/Profile/LazyProfilePage.tsx","app/pages/ad-management/UserManagement/UserInvitations/@data/actions/userInvitationActions.ts","app/pages/ad-management/UserManagement/UserInvitations/@data/store.ts","app/pages/ad-management/UserManagement/UserInvitations/@data/mutatorActions/onUserInvitationTabChanged.ts","app/pages/ad-management/UserManagement/UserInvitations/@data/mutatorActions/onUserInviteFormChanged.ts","app/pages/ad-management/UserManagement/UserInvitations/UserInvitations.messages.ts","app/pages/ad-management/UserManagement/UserInvitations/@data/orchestrators/deleteUserInvitation.ts","app/pages/ad-management/UserManagement/UserInvitations/@data/orchestrators/dismissUserInvitePanel.ts","app/pages/ad-management/UserManagement/Users/@data/actions/usersTabActions.ts","app/pages/ad-management/UserManagement/UserInvitations/@data/orchestrators/loadUserInvitations.ts","app/pages/ad-management/UserManagement/UserInvitations/@data/orchestrators/resendUserInvitation.ts","app/pages/ad-management/UserManagement/UserInvitations/@data/orchestrators/userInviteSubmitted.ts","app/pages/ad-management/UserManagement/UserInvitations/@data/schema/UserInviteErrorModel.ts","app/pages/ad-management/UserManagement/UserManagement.styles.ts","app/pages/ad-management/UserManagement/UserInvitations/UserInvitationColumns.tsx","app/styles/PanelStyles.ts","app/pages/ad-management/UserManagement/components/UserRoleChoiceGroupOptions.tsx","app/pages/ad-management/UserManagement/UserInvitations/UserInvitePanel.tsx","app/pages/ad-management/UserManagement/UserInvitations/ZeroInvitations.tsx","app/pages/ad-management/UserManagement/UserInvitations/UserInvitations.tsx","app/components/Popup/PopupCard.styles.ts","app/components/Popup/DeleteConfirmationPopup.tsx","app/pages/ad-management/UserManagement/Users/@data/store.ts","app/pages/ad-management/UserManagement/Users/@data/mutatorActions/onUsersTabChanged.ts","app/pages/ad-management/UserManagement/Users/@data/orchestrators/deleteUsers.ts","app/pages/ad-management/UserManagement/Users/@data/orchestrators/loadUsers.ts","app/pages/ad-management/UserManagement/Users/@data/orchestrators/userRoleChanged.ts","app/pages/ad-management/UserManagement/Users/UserRoleChangePanel.tsx","app/pages/ad-management/UserManagement/Users/UsersTabColumns.tsx","app/pages/ad-management/UserManagement/Users/UsersTab.tsx","app/pages/ad-management/UserManagement/UserManagement.tsx","app/pages/ad-management/Account/Payments/PaymentsPage.messages.ts","app/pages/ad-management/Account/Payments/PaymentsPage.styles.ts","app/pages/ad-management/Account/Payments/Balance/Balance.styles.ts","app/pages/ad-management/Account/Payments/Balance/Balance.helpers.tsx","app/pages/ad-management/Account/Payments/Balance/Balance.tsx","app/pages/ad-management/Account/Payments/EstimatedEarnings/EstimatedEarnings.styles.ts","app/pages/ad-management/Account/Payments/EstimatedEarnings/EstimatedEarnings.helpers.tsx","app/pages/ad-management/Account/Payments/EstimatedEarnings/EstimatedEarnings.tsx","app/pages/ad-management/Account/Payments/PaymentsPage.tsx","app/pages/ad-management/Account/Settings/LazySettingsPage.tsx","app/pages/ad-management/Account/Manage/ManagePage.messages.ts","app/pages/ad-management/Account/Manage/ManagePage.styles.ts","app/pages/ad-management/Account/Manage/ManagePage.tsx","app/pages/ad-management/Account/AccountPage.tsx","app/pages/report/DashboardCards/@data/actions/actions.ts","app/pages/report/DashboardCards/@data/actions/mutatorActions.ts","app/pages/ad-management/Home/components/ProfileCard/ProfileCard.messages.ts","app/pages/ad-management/Account/Settings/@data/actions/onSettingsPageChanged.ts","app/pages/terms-and-conditions/@data/actions/tncActions.ts","app/layout/EmptyLayout/EmptyLayout.styles.ts","app/layout/EmptyLayout/EmptyLayout.tsx","app/pages/terms-and-conditions/@data/store/store.ts","app/components/DetectAdBlock/DetectAdBlock.messages.ts","app/components/DetectAdBlock/DetectAdBlock.tsx","app/components/Nav/Nav.styles.ts","app/components/Nav/Nav.types.ts","app/components/Nav/NavBase.tsx","app/components/Nav/NavLink.tsx","app/components/Nav/Nav.tsx","app/components/Nav/NavToggler.messages.ts","app/components/Nav/SlimNav.tsx","app/components/Nav/NavToggler.tsx","app/layout/NotFound/NotFound.tsx","app/layout/TythonNav/styles.ts","app/layout/TythonNav/useTythonNav.ts","app/layout/TythonNav/index.tsx","app/layout/ContentLayout/ContentLayout.messages.tsx","app/layout/ContentLayout/ContentLayout.styles.ts","app/layout/ContentLayout/ContentLayout.tsx","app/components/Spinners/PageSpinner.styles.ts","app/components/Spinners/PageSpinner.tsx","app/layout/Footer/Footer.messages.ts","app/layout/Footer/Footer.styles.ts","app/layout/Footer/Footer.tsx","app/@data/utils/getLocalUpperCaseCountryCode.ts","app/@data/store/schema/enums/AccountProfileFeature.ts","app/layout/PageLayout/header-panels/ProfilePanel/ProfilePanel.messages.ts","app/pages/ad-management/Home/components/PerformanceSection/resources/Payment.svg","app/pages/report/utils/downloadFile.ts","app/pages/report/utils/exportHelper.ts","app/pages/report/utils/downloadCSV.ts","app/@data/store/schema/models/ReportingDataResponse.ts","app/pages/report/DashboardCards/@data/store/schema/IReportPageData.ts","app/pages/ad-management/Account/Payments/Onboarding/PaymentsOnboarding.tsx","app/pages/ad-management/Account/Payments/Onboarding/PaymentsOnboarding.styles.ts","app/pages/ad-management/AdQuality/AdReview/noImageAvailable.svg","app/@data/@metadata/store/selectors.ts","app/@data/store/schema/enums/ClarityStatus.ts","app/pages/ad-management/Profile/@data/store/appealStore.ts","app/config/xandrAdProviders.ts","app/utils/DateUtils.ts","app/utils/validation/DomainStringValidator.ts","app/pages/ad-management/Account/Settings/components/GoogleConnector/@data/store/store.ts","app/@data/services/ReportingService.ts","app/components/Tabs/Tabs.styles.ts","app/components/Tabs/Tabs.tsx","app/@data/actions/onTokenExpirationActions.ts","app/pages/ad-management/Adunit/@data/actions/onManagePageInitialized.ts","app/components/Form/FormState/FormState.ts","app/pages/partner-management/User/@data/actions/onManagePageInitialized.ts","app/pages/ad-management/Home/@data/actions/actions.ts","app/@data/store/schema/enums/AdPropertyType.ts","app/@data/store/schema/enums/AdSource.ts","app/@data/store/schema/enums/AdsTxtStatus.ts","app/@data/store/schema/enums/AdUnitMarketClassification.ts","app/@data/store/schema/enums/AdUnitRpsGuarantee.ts","app/@data/store/schema/enums/AdunitServeTier.ts","app/@data/store/schema/enums/AdUnitType.ts","app/@data/store/schema/enums/ApiErrorCodes.ts","app/@data/store/schema/enums/AuditType.ts","app/@data/store/schema/enums/ChannelType.ts","app/@data/store/schema/enums/ClarityType.ts","app/@data/store/schema/enums/CustomPanelType.ts","app/@data/store/schema/enums/EntityLimitTier.ts","app/@data/store/schema/enums/EntityType.ts","app/@data/store/schema/enums/FeatureOverideTier.ts","app/@data/store/schema/enums/FilterScope.ts","app/@data/store/schema/enums/LayoutMode.ts","app/@data/store/schema/enums/MediaType.ts","app/@data/store/schema/enums/NotificationLabel.ts","app/@data/store/schema/enums/NotificationSeverity.ts","app/@data/store/schema/enums/Partner.ts","app/@data/store/schema/enums/PaymentInstrumentationLifeCycleStatus.ts","app/@data/store/schema/enums/PaymentOption.ts","app/@data/store/schema/enums/PrivateMarketplace.ts","app/@data/store/schema/enums/PropertyApprovalStatus.ts","app/@data/store/schema/enums/PublisherGroupConfiguration.ts","app/@data/store/schema/enums/PublisherNetworkAffiliation.ts","app/@data/store/schema/enums/PublisherTier.ts","app/@data/store/schema/enums/ServiceLevel.ts","app/@data/store/schema/enums/UserRole.ts","app/@data/store/schema/enums/UserRoleEntityType.ts","app/pages/ad-management/Profile/@data/store/schema/IAppealState.ts","app/pages/signup/@data/store/schema/ISignUpErrorModel.ts","app/pages/signup/@data/store/store.ts","app/pages/ad-management/Profile/@data/store/schema/profileValidationModel.ts","app/components/InfoButton/InfoButton.base.tsx","app/components/InfoButton/InfoButton.styles.ts","app/components/InfoButton/InfoButton.ts","app/pages/ad-management/AdBlock/@data/services/fetchBrands.ts","app/@data/@metadata/orchestrators/fetchStatesOrProvince.ts","app/@data/@metadata/store/store.ts","app/utils/GuidUtils.ts","app/@data/services/OneVetIntegrationService.ts","app/components/Tag/styles.ts","app/components/Tag/index.tsx","logging/src/LoggingUtils.ts","app/@data/store/schema/enums/TokenType.ts","app/@data/actions/onLoadingChanged.ts","app/@data/store/schema/models/UpdateClarityProject.ts","app/pages/ad-management/Profile/@data/services/fetchUserDetails.ts","app/pages/ad-management/Profile/@data/store/schema/VerificationCodeGenerationErrorCodes.ts","app/layout/GridPageV2/components/Pagination/Pagination.types.ts","app/pages/ad-management/AdManagement.messages.ts","app/components/ListPicker/ListPicker.base.tsx","app/components/ListPicker/ListPicker.styles.ts","app/components/ListPicker/ListPicker.ts","app/layout/PublisherAccountPicker/PublisherAccountPicker.messages.ts","app/layout/PublisherAccountPicker/PublisherAccountPicker.styles.ts","app/layout/PublisherAccountPicker/PublisherAccountPicker.tsx","app/utils/DelayUtils.ts","app/layout/GridPageV2/components/Pagination/Themes/DottedPagination/DottedPagination.styles.ts","app/layout/GridPageV2/components/Pagination/Themes/DottedPagination/useDottedPagination.ts","app/layout/GridPageV2/components/Pagination/Themes/DottedPagination/DottedPagination.tsx","app/layout/GridPageV2/components/Pagination/Themes/NavigatedPagination/NavigatedPagination.messages.ts","app/layout/GridPageV2/components/Pagination/Themes/NavigatedPagination/NavigatedPagination.styles.ts","app/layout/GridPageV2/components/Pagination/Themes/NavigatedPagination/NavigatedPagination.tsx","app/layout/GridPageV2/components/Pagination/Pagination.tsx","app/pages/report/components/CustomCalender/CustomCalender.styles.ts","app/pages/report/components/CustomCalender/components/SingleDay.styles.ts","app/pages/report/components/CustomCalender/components/SingleDay.tsx","app/pages/report/components/CustomCalender/CustomCalender.tsx","app/layout/InternationalizationLayout/InternationalizationLayout.styles.ts","app/layout/InternationalizationLayout/InternationalizationLayout.tsx","app/pages/report/ReportHeader.tsx","app/pages/report/ReportRouter.tsx","app/components/LazyComponents/LazyComponent.tsx","app/pages/ad-management/Property/Create/__data__/orchestrators/resendClarityLink.ts","app/pages/ad-management/Account/@data/store/accountStatusStore.ts","app/pages/report/constants/ratioMetrics.ts","app/@data/orchestrators/PublisherAccountChanged.ts","app/@data/orchestrators/accountChanged.ts","app/@data/orchestrators/accountSelected.ts","app/@data/orchestrators/authLogout.ts","app/@data/services/NotificationService.ts","app/@data/orchestrators/dismissAllNotifications.ts","app/@data/orchestrators/dismissNotification.ts","app/@data/orchestrators/fetchBackendNotifications.ts","app/@data/orchestrators/handleDomainRedirection.ts","app/@data/orchestrators/helpInfoCalloutOpened.ts","app/@data/services/HelpService.ts","app/@data/orchestrators/navigateBack.ts","app/@data/orchestrators/notificationOrchestrators.ts","app/@data/orchestrators/publisherChanged.ts","app/@data/orchestrators/publisherSelected.ts","app/@data/orchestrators/redirectToReportingDashboard.ts","app/@data/orchestrators/tokenExpiredOrchestrators.ts","app/@data/orchestrators/userContextChanged.ts","app/@data/store/schema/enums/UserInvitationType.ts","app/@data/store/schema/enums/UserType.ts","app/pages/terms-and-conditions/@data/orchestrators/constants.ts","app/pages/terms-and-conditions/@data/orchestrators/onFetchTnC.ts","app/@data/store/schema/models/Feedback.ts","app/@data/store/schema/models/UserCreateFromInvitation.ts","app/pages/report/DashboardCards/@data/store/selectors.ts","app/layout/EntityCreationLayout/connectApp.svg","app/layout/EntityCreationLayout/connectSite.svg","app/@data/@metadata/actions/statesActions.ts","app/components/Popup/PopupCard.tsx","logging/src/ConsoleLoggerManager.ts","logging/src/DefaultLogUserContext.ts","app/@data/store/schema/enums/LifeCycleStatus.ts","app/@data/store/schema/models/AppealHistory.ts","app/@data/store/schema/models/welcomeToPubcenterEmail.ts","app/@data/actions/onAcceptInviteActions.ts","app/@data/actions/onSavingChanged.ts","app/utils/StringUtils.ts","app/@data/utils/AdTakeDownService.ts","app/pages/ad-management/Profile/@data/services/fetchPublisherProfileDetails.ts","app/pages/ad-management/@data/actions/onAdManagementStoreChanged.ts","app/hooks/useDetectAdBlock.ts","app/hooks/useOnClickOutside.ts","app/utils/DataGridUtils/SortingUtils.ts","app/pages/ad-management/Account/Settings/@data/actions/onPublisherDeleted.ts","app/pages/ad-management/Account/Settings/@data/actions/onUserSelfDeleted.ts","app/components/GridWithCustomColumns/GridWithCustomColumns.styles.ts","app/pages/ad-management/@data/actions/publisherEvaluationActions.ts","app/@data/store/schema/models/Account.ts","app/@data/store/schema/models/AccountSKU.ts","app/@data/store/schema/models/AdUnit.ts","app/@data/store/schema/models/AuditLog.ts","app/@data/store/schema/models/Channel.ts","app/@data/store/schema/models/EntityEvaluation.ts","app/@data/store/schema/models/EntityPreferences.ts","app/@data/store/schema/models/Filter.ts","app/@data/store/schema/models/FilterDownloader.ts","app/@data/store/schema/models/IPRange.ts","app/@data/store/schema/models/NativeAdTemplate.ts","app/@data/store/schema/models/NotificationPreferencesUpdate.ts","app/@data/store/schema/models/PhoneVerification.ts","app/@data/store/schema/models/Property.ts","app/@data/store/schema/models/Publisher.ts","app/@data/store/schema/models/PublisherCreate.ts","app/@data/store/schema/models/PublisherSearch.ts","app/@data/store/schema/models/SelfServePublisher.ts","app/@data/store/schema/models/TythonAdUnit.ts","app/@data/store/schema/models/TythonAdUnits.ts","app/@data/store/schema/models/UpdateStatus.ts","app/@data/store/schema/models/User.ts","app/@data/store/schema/models/UserContactDetails.ts","app/@data/store/schema/models/UserContext.ts","app/@data/store/schema/models/UserInvitation.ts","app/@data/store/schema/models/UserInvitationResend.ts","app/@data/store/schema/models/UserRoleUpdate.ts","app/@data/store/schema/models/UserUpdateLanguage.ts","app/@data/store/schema/models/XPayJwtTokenRequest.ts","app/layout/GridPageV2/@data/actions/gridActions.ts","app/layout/GridPageV2/@data/orchestrators/changeItemsStatus.ts","app/layout/GridPageV2/@data/orchestrators/deleteItem.ts","app/layout/GridPageV2/@data/orchestrators/duplicateItem.ts","app/layout/GridPageV2/@data/services/GridService.ts","app/layout/GridPageV2/@data/orchestrators/gridPageV2Initialized.ts","app/layout/GridPageV2/components/DeactivateConfirmationDialog.tsx","app/layout/GridPageV2/components/DeleteConfirmationDialog.tsx","app/layout/GridPageV2/components/ModifyColumnsPanel.tsx","app/layout/GridPageV2/components/CustomCommandBar/CustomCommandBar.styles.ts","app/layout/GridPageV2/components/SearchBoxCallOut/SearchBoxCallOut.tsx","app/layout/GridPageV2/components/CustomCommandBar/utils/getDefaultCommandBarItems.tsx","app/layout/GridPageV2/components/CustomCommandBar/utils/buildCommandBarProps.ts","app/layout/GridPageV2/components/CustomCommandBar/utils/getDefaultCommandBarFarItems.tsx","app/layout/GridPageV2/components/CustomCommandBar/utils/getSelectionMode.ts","app/layout/GridPageV2/components/CustomCommandBar/CustomCommandBar.tsx","app/layout/GridPageV2/hooks/useSearchableGrid.ts","app/layout/GridPageV2/utils/FilteringUtils.ts","app/layout/GridPageV2/utils/SortingUtils.ts","app/layout/GridPageV2/hooks/usePagination.ts","app/layout/GridPageV2/GridV2.tsx","app/layout/GridPageV2/hooks/useSortableGridColumns.ts","app/layout/GridPageV2/hooks/useSelectionGrid.ts","app/layout/GridPageV2/components/CustomCheckbox.tsx","app/pages/partner-management/User/@data/store/schema/UserAcceptInviteErrorModel.ts","logging/src/Aria.Config.ts","logging/src/UserConstants.ts","logging/src/AriaLoggerManager.ts","app/hooks/useWindowsAppFeatureFlag/actions/windowsFeatureFlagActions.ts","app/hooks/useWindowsAppFeatureFlag/mutators/windowsFeatureFlagMutators.ts","app/hooks/useWindowsAppFeatureFlag/index.ts","app/hooks/useCMUIHelpExperience/init-apex.ts","app/hooks/useCMUIHelpExperience/index.tsx","app/components/MultiSelectPicker/MultiSelectPicker.styles.ts","app/components/MultiSelectPicker/MultiSelectPicker.ts","app/components/MultiSelectPicker/MultiSelectPicker.messages.ts","app/components/MultiSelectPicker/MultiSelectPicker.base.tsx","app/pages/ad-management/Account/AccountPage.messages.ts","app/pages/report/@data/services/ReportService.ts","app/pages/ad-management/Adunit/TythonAdunit/resources/HorizontalBottomAdPreview.svg","app/pages/ad-management/Adunit/TythonAdunit/resources/HorizontalUpperAdPreview.svg","app/pages/ad-management/Adunit/TythonAdunit/resources/SquareBottomAdPreview.svg","app/pages/ad-management/Adunit/TythonAdunit/resources/SquareLeftAdPreview.svg","app/pages/ad-management/Adunit/TythonAdunit/resources/VerticalBottomAdPreview.svg","app/pages/ad-management/Adunit/TythonAdunit/resources/VerticalLeftAdPreview.svg","app/pages/ad-management/Adunit/TythonAdunit/resources/AutoFitHeight.svg","app/pages/ad-management/Adunit/TythonAdunit/resources/AutoFitWidth.svg","app/pages/ad-management/Home/components/SetupCard/resources/AdUnitStep1.svg","app/pages/ad-management/Home/components/SetupCard/resources/AdUnitStep2.svg","app/pages/ad-management/Home/components/SetupCard/resources/ProfileStep1.svg","app/pages/ad-management/Home/components/SetupCard/resources/ProfileStep2.svg","app/pages/ad-management/Home/components/SetupCard/resources/ProfileStep3.svg","app/pages/ad-management/Home/components/SetupCard/resources/SiteStep1.svg","app/pages/ad-management/Home/components/SetupCard/resources/SiteStep2.svg","app/pages/ad-management/Home/components/SetupCard/resources/SiteStep3.svg","app/pages/ad-management/Home/components/RecommendationsSection/resources/adBlock.svg","app/pages/ad-management/Home/components/RecommendationsSection/resources/adsTxt.svg","app/pages/ad-management/Home/components/RecommendationsSection/resources/mediation.svg","app/pages/ad-management/Home/components/RecommendationsSection/resources/mediationIcon.svg","app/pages/ad-management/Home/components/RecommendationsSection/resources/payment.svg","app/layout/GridPageV2/components/CellInfoCallout.tsx","app/pages/support/emailLogo.svg","app/pages/support/emailSentLogo.svg","app/pages/partner-management/@data/actions/index.ts","app/pages/partner-management/@data/mutators/currentRouteChanged.ts","app/pages/partner-management/Account/@data/actions/onAccountChanged.ts","app/pages/partner-management/Account/@data/actions/onAccountFormsChanged.ts","app/pages/partner-management/Account/@data/actions/onAccountSkuSidePanelChanged.ts","app/pages/partner-management/Account/@data/actions/onManagePageInitialized.ts","app/pages/partner-management/Account/@data/store/store.ts","app/pages/partner-management/Account/@data/mutators/accountChanged.ts","app/config/countryToCurrencyMapper.config.ts","app/pages/partner-management/Account/@data/mutators/accountFormsChanged.ts","app/pages/partner-management/Account/@data/orchestrators/accountSkuFormSubmitted.ts","app/pages/partner-management/Account/@data/orchestrators/accountSkuPanelInitialized.ts","app/pages/partner-management/Account/@data/orchestrators/formCancelled.ts","app/@data/store/schema/enums/AdExtensionType.ts","app/@data/store/schema/enums/FinancialStatus.ts","app/pages/partner-management/Account/@data/mutatorActions/accountFormsChanged.ts","app/pages/partner-management/Account/@data/orchestrators/formInitialized.ts","app/pages/partner-management/Account/@data/orchestrators/formSubmitted.ts","app/pages/partner-management/Account/@data/store/schema/AccountErrorModel.ts","app/pages/partner-management/Account/@data/orchestrators/managePageInitialized.ts","app/MediaType.messages.ts","app/pages/partner-management/Account/Create/CreateAccount.messages.ts","app/pages/partner-management/Account/Create/CreateAccount.styles.ts","app/pages/partner-management/Account/Create/CreateAccount.tsx","app/pages/partner-management/Account/Manage/ManagePage.messages.ts","app/pages/partner-management/Account/Manage/utils/getCommandBarItems.tsx","app/pages/partner-management/Account/Manage/ManagePage.tsx","app/pages/partner-management/Account/Manage/utils/getGridColumns.tsx","app/pages/partner-management/Account/AccountPage.tsx","app/pages/partner-management/Index/IndexPage.messages.ts","app/pages/partner-management/Index/IndexPage.tsx","app/pages/partner-management/PartnerManagementHeader.tsx","app/pages/partner-management/@data/orchestrators/currentRouteChanged.ts","app/pages/partner-management/Publisher/@data/actions/onPublisherChanged.ts","app/pages/partner-management/Publisher/@data/store/store.ts","app/pages/partner-management/Publisher/@data/mutators/PublisherChanged.ts","app/pages/partner-management/Publisher/@data/actions/onManagePageInitialized.ts","app/pages/partner-management/Publisher/@data/actions/onPublisherFormsChanged.ts","app/pages/partner-management/Publisher/@data/mutators/publisherFormsChanged.ts","app/pages/partner-management/Publisher/@data/orchestrators/FormPublisherAddressCountryCodeChanged.ts","app/pages/partner-management/Publisher/@data/orchestrators/formCancelled.ts","app/pages/partner-management/Publisher/@data/orchestrators/formCreated.ts","app/pages/partner-management/Publisher/@data/store/schema/PublisherCreateErrorModel.ts","app/pages/partner-management/Publisher/@data/orchestrators/formEditted.ts","app/pages/partner-management/Publisher/@data/store/schema/PublisherEditViewModel.ts","app/pages/partner-management/Publisher/@data/orchestrators/formInitialized.ts","app/pages/partner-management/Publisher/@data/orchestrators/formIpAddressChanged.ts","app/pages/partner-management/Publisher/@data/store/schema/PublisherIPAddressErrorModel.ts","app/pages/partner-management/Publisher/@data/orchestrators/managePageInitialized.ts","app/pages/partner-management/Publisher/Create/CreatePublisher.messages.ts","app/pages/partner-management/Publisher/Create/CreatePublisher.styles.ts","app/pages/partner-management/Publisher/Create/CreatePublisher.tsx","app/pages/partner-management/Publisher/Manage/ManagePage.messages.ts","app/pages/partner-management/Publisher/Manage/utils/getCommandBarItems.tsx","app/pages/partner-management/Publisher/Manage/ManagePage.tsx","app/pages/partner-management/Publisher/Manage/utils/getGridColumns.tsx","app/pages/partner-management/Publisher/PublisherPage.tsx","app/pages/partner-management/User/AccountRole/AccountRole.styles.ts","app/pages/partner-management/User/AccountRole/AccountRole.tsx","app/pages/partner-management/User/Invite/InviteUser.styles.ts","app/pages/partner-management/User/Invite/InviteUser.tsx","app/pages/partner-management/User/Manage/ManagePage.styles.ts","app/pages/partner-management/User/Manage/ManagePage.messages.ts","app/pages/partner-management/User/Manage/UserInvitations/utils/getCommandBarItems.tsx","app/pages/partner-management/User/Manage/UserInvitations/UserInvitationsGrid.tsx","app/pages/partner-management/User/Manage/UserInvitations/utils/getGridColumns.tsx","app/pages/partner-management/User/Manage/Users/components/DevTokenPanel.tsx","app/pages/partner-management/User/Manage/Users/utils/getCommandBarItems.tsx","app/pages/partner-management/User/Manage/Users/UsersGrid.tsx","app/pages/partner-management/User/Manage/Users/utils/getGridColumns.tsx","app/pages/partner-management/User/Manage/ManagePage.tsx","app/pages/partner-management/User/UserPage.tsx","app/pages/partner-management/PartnerManagementRouter.tsx","app/pages/report/@data/mutators/currentRouteChanged.ts","app/pages/report/@data/mutators/reportingEnabled.ts","app/pages/report/@data/orchestrators/currentRouteChanged.ts","app/pages/report/@data/orchestrators/reportLinkClicked.ts","app/pages/report/@data/orchestrators/setPublisherReporting.ts","app/pages/report/constants/allowedChartsType.ts","app/pages/report/constants/common.ts","app/pages/report/hooks/useMediationAvailable.ts","app/pages/report/utils/getInitialDateRange.ts","app/pages/report/utils/checkIfValidDateRange.ts","app/pages/report/DashboardCards/MetricMarker/MetricMarker.styles.ts","app/pages/report/DashboardCards/MetricMarker/MetricMarker.tsx","app/pages/report/DashboardCards/ChartMetricPicker/ChartMetricPicker.styles.ts","app/pages/report/DashboardCards/ChartMetricPicker/ChartMetricPicker.tsx","app/pages/report/DashboardCards/ChartMetricPicker/MetricsSidePanel.tsx","app/pages/report/DashboardCards/ReportCard/ReportCard.styles.ts","app/pages/report/DashboardCards/GrainSelector/GrainSelector.tsx","app/pages/report/DashboardCards/ReportDetailsPage/ReportDetailsPage.messages.ts","app/pages/report/DashboardCards/ReportDetailsPage/WarningIcon/MenuItemWarningIcon.styles.ts","app/pages/report/DashboardCards/ReportDetailsPage/WarningIcon/MenuItemWarningIcon.tsx","app/pages/report/DashboardCards/ReportDetailsPage/ReportDetailsGrid/ReportDetailsGrid.styles.ts","app/pages/report/DashboardCards/ReportDetailsPage/ReportDetailsGrid/ReportDetailsGrid.tsx","app/pages/report/DashboardCards/@data/schema/ShareSchedule.ts","app/pages/report/DashboardCards/ShareModal/ShareModal.styles.ts","app/pages/report/DashboardCards/ShareModal/ShareModal.tsx","app/pages/report/DashboardCards/@data/schema/ShareErrorModel.ts","app/pages/report/DashboardCards/ChartTypeSelector/ChartTypeSelector.tsx","app/pages/report/DashboardCards/ReportCard/TopBarActions.tsx","app/pages/report/DashboardCards/ReportCard/ReportCard.tsx","app/pages/report/DashboardCards/AdUnitsReportCard/AdUnitsReportCard.tsx","app/pages/report/DashboardCards/CountryReportCard/CountryReportCard.tsx","app/pages/report/DashboardCards/MediationReportCard/MediationReportCard.tsx","app/pages/report/DashboardCards/PerformanceReportCard/PerformanceReportCard.tsx","app/pages/report/DashboardCards/SitesReportCard/SitesReportCard.tsx","app/pages/report/DashboardCards/ReportDetailsPage/ActionBar/FilterListBar/FilterListBar.styles.ts","app/pages/report/DashboardCards/ReportDetailsPage/ActionBar/FilterListBar/FilterListItem.tsx","app/pages/report/DashboardCards/ReportDetailsPage/ActionBar/FilterListBar/FilterListBar.tsx","app/pages/report/DashboardCards/ReportDetailsPage/ActionBar/ManageFilter/ManageFilter.styles.ts","app/pages/report/DashboardCards/ReportDetailsPage/ActionBar/ManageFilter/ManageFilter.tsx","app/pages/report/DashboardCards/ReportDetailsPage/ActionBar/ActionBar.tsx","app/pages/report/DashboardCards/ReportDetailsPage/ReportDetailsPage.styles.ts","app/pages/report/DashboardCards/ReportDetailsPage/SubPageNavbar/SubPageNavbar.styles.ts","app/pages/report/DashboardCards/ReportDetailsPage/SubPageNavbar/SubPageNavbar.tsx","app/pages/report/DashboardCards/ReportDetailsPage/ReportDetailsPage.tsx","app/pages/report/DashboardCards/MetricsSummaryCards/MetricCard/MetricCard.styles.ts","app/pages/report/DashboardCards/MetricsSummaryCards/MetricCard/MetricCard.tsx","app/pages/report/DashboardCards/MetricsSummaryCards/MetricsSummaryCards.styles.ts","app/pages/report/DashboardCards/MetricsSummaryCards/MetricsSummaryCards.tsx","app/pages/report/DashboardCards/TythonReportCards.styles.ts","app/pages/report/DashboardCards/TythonReportCards.tsx","app/pages/report/ReportPage.styles.ts","app/pages/report/ReportPage.tsx","app/pages/report/BaseReportPage.tsx","app/pages/error-pages/SuspendedUser/SuspendedUser.messages.ts","app/pages/error-pages/SuspendedUser/SuspendedUser.styles.ts","app/pages/error-pages/SuspendedUser/SuspendedUser.tsx","app/pages/ad-management/Account/Settings/UserSettingsPage.tsx","app/pages/ad-management/AdManagementHeader.tsx","app/pages/ad-management/AuditHistory/@data/actions/actions.ts","app/pages/ad-management/AuditHistory/@data/store/store.ts","app/pages/ad-management/AuditHistory/@data/actions/mutatorActions.ts","app/pages/ad-management/AuditHistory/AuditHistory.messages.ts","app/pages/ad-management/AuditHistory/@data/services/fetchAuditLogs.ts","app/pages/ad-management/AuditHistory/@data/orchestrators/auditHistoryPageInitialized.ts","app/pages/ad-management/AuditHistory/utils/convertAttributeValues.ts","app/pages/ad-management/AuditHistory/ActionDetails.messages.ts","app/pages/ad-management/AuditHistory/utils/getPaymentActionDetails.ts","app/pages/ad-management/AuditHistory/utils/getActionDetails.ts","app/pages/ad-management/AuditHistory/utils/getAdUnitActionDetails.ts","app/pages/ad-management/AuditHistory/utils/getPropertyActionDetails.ts","app/pages/ad-management/AuditHistory/utils/getUserActionDetails.ts","app/pages/ad-management/AuditHistory/utils/getPublisherActionDetails.ts","app/pages/ad-management/AuditHistory/utils/getFilterItems.ts","app/pages/ad-management/AuditHistory/ActionDetails.tsx","app/pages/ad-management/AuditHistory/AuditHistory.styles.ts","app/pages/ad-management/AuditHistory/utils/getGridColumns.tsx","app/pages/ad-management/AuditHistory/@data/orchestrators/handleDownload.ts","app/pages/ad-management/AuditHistory/utils/getCommandBarItems.ts","app/pages/ad-management/AuditHistory/@data/orchestrators/updateFilterAndFetchLogs.ts","app/pages/ad-management/AuditHistory/AuditHistory.tsx","app/pages/ad-management/Index/IndexPage.messages.ts","app/pages/ad-management/Index/IndexPage.tsx","app/pages/ad-management/AdManagement.styles.ts","app/pages/ad-management/renderPartials.tsx","app/pages/ad-management/AdManagementRouter.tsx","app/components/TnCModal/TnCModal.styles.ts","app/components/TnCModal/index.tsx","app/components/ToastNotification/ToastNotification.styles.ts","app/components/ToastNotification/ToastNotification.tsx","app/layout/NotificationLayout/NotificationLayout.messages.ts","app/layout/NotificationLayout/NotificationLayout.styles.ts","app/layout/NotificationLayout/NotificationLayout.tsx","app/components/NotificationBar/NotificationBar.base.tsx","app/components/NotificationBar/NotificationBar.styles.ts","app/components/NotificationBar/NotificationBar.ts","app/components/GridFilter/GridFilter.messages.ts","app/components/GridFilter/GridFilter.styles.ts","app/components/GridFilter/GridFilter.base.tsx","app/components/GridFilter/GridFilter.ts","app/components/Logo/Logo.styles.ts","app/components/Logo/messages.ts","app/components/Logo/Logo.tsx","app/components/TnCModal/TnCNotification.tsx","app/pages/terms-and-conditions/useTnC.ts","app/components/EmptyChart/EmptyChart.styles.ts","app/components/EmptyChart/EmptyChart.tsx","app/components/SummaryCard/SummaryCard.styles.ts","app/components/SummaryCard/SummaryCard.tsx","app/@data/mutators/helpInfoChanged.ts","app/layout/GridPageV2/@data/orchestrators/downloadButtonClicked.ts","app/@data/mutators/accountChanged.ts","app/@data/mutators/collapseMenu.ts","app/@data/mutators/entityGridColumnsChanged.ts","app/@data/mutators/isAcceptInviteFlowChanged.ts","app/@data/mutators/layoutChanged.ts","app/@data/mutators/loadingChanged.ts","app/@data/mutators/notificationMutators.ts","app/@data/mutators/notificationPanelMutators.ts","app/@data/mutators/publisherChanged.ts","app/@data/mutators/savingChanged.ts","app/@data/mutators/userContextChanged.ts","app/pages/ad-management/Account/@data/orchestrators/fetchAccountStatus.ts","app/pages/ad-management/Account/@data/orchestrators/fetchPaymentsPageBalance.ts","app/pages/ad-management/Account/@data/orchestrators/fetchPaymentsPageEstimatedEarnings.ts","app/pages/ad-management/Account/@data/orchestrators/initializePaymentsPage.ts","app/pages/ad-management/Account/Settings/components/SystemConfiguration/SystemConfiguration.messages.ts","app/pages/ad-management/Adunit/TythonAppAdUnit/components/resources/adVector.svg","app/pages/ad-management/Adunit/TythonAppAdUnit/components/resources/codeIcon.svg","app/pages/ad-management/Home/components/ResourcesSection/resources/DocumentationCenterIcon.svg","app/pages/ad-management/Home/components/ResourcesSection/resources/FeedBackIcon.svg","app/pages/ad-management/Home/components/ResourcesSection/resources/SupportTeamIcon.svg","app/layout/PageLayout/header-panels/NotificationsPanel/resources/empty.svg","app/pages/ad-management/Home/components/FRECards/resources/fre-1.jpg","app/pages/ad-management/Home/components/FRECards/resources/fre-2.jpg","app/pages/ad-management/Home/components/FRECards/resources/fre-3.jpg","app/pages/ad-management/Profile/@data/actions/appealMutatorActions.ts","app/pages/ad-management/Account/Settings/components/GoogleConnector/@data/constants.ts","app/@data/store/schema/enums/ServingStatus.ts","app/components/GridWithCustomColumns/GridWithCustomColumns.tsx","app/pages/ad-management/AdBlock/@data/services/fetchPropertiesServingConfigs.ts","app/pages/ad-management/AdBlock/@data/services/fetchPropertyServingConfig.ts","app/pages/ad-management/AdBlock/@data/services/fetchPublisherServingConfig.ts","app/pages/ad-management/AdBlock/@data/services/updatePropertyServingConfig.ts","app/pages/ad-management/AdBlock/@data/services/updatePublisherServingConfig.ts","app/pages/ad-management/Profile/VerificationErrors.messages.ts","app/pages/ad-management/Account/Settings/SettingsPage.styles.ts","app/pages/ad-management/AdBlock/resources/Desert.svg","app/layout/TythonNav/resources/AccountNavIcon.svg","app/layout/TythonNav/resources/AccountNavIconActive.svg","app/layout/TythonNav/resources/AdBlockNavIcon.svg","app/layout/TythonNav/resources/AdBlockNavIconActive.svg","app/layout/TythonNav/resources/AdUnitNavIcon.svg","app/layout/TythonNav/resources/AdUnitNavIconActive.svg","app/layout/TythonNav/resources/AdsIcon.svg","app/layout/TythonNav/resources/AdsIconActive.svg","app/layout/TythonNav/resources/HomeNavIcon.svg","app/layout/TythonNav/resources/HomeNavIconActive.svg","app/layout/TythonNav/resources/InventoryIcon.svg","app/layout/TythonNav/resources/InventoryIconActive.svg","app/layout/TythonNav/resources/ReportNavIcon.svg","app/layout/TythonNav/resources/ReportNavIconActive.svg","app/layout/TythonNav/resources/SiteNavIcon.svg","app/layout/TythonNav/resources/SiteNavIconActive.svg","app/@data/store/schema/models/BrandSearchResponse.ts","app/pages/partner-management/User/@data/orchestrators/acceptInvitePageInitialized.ts","app/pages/partner-management/User/@data/orchestrators/acceptInvitePageSubmitted.ts","app/pages/partner-management/User/@data/orchestrators/fetchDevTokenStatus.ts","app/pages/partner-management/User/@data/orchestrators/formCancelled.ts","app/pages/partner-management/User/@data/services/UserService.ts","app/pages/partner-management/User/@data/orchestrators/formInitialized.ts","app/pages/partner-management/User/@data/orchestrators/formSubmitted.ts","app/pages/partner-management/User/@data/store/schema/UserErrorModel.ts","app/pages/partner-management/User/@data/store/schema/UserInvitationErrorModel.ts","app/pages/partner-management/User/@data/orchestrators/formUserInvitationChanged.ts","app/pages/partner-management/User/@data/orchestrators/generateDevTokenStatus.ts","app/pages/partner-management/User/@data/orchestrators/managePageInitialized.ts","app/pages/partner-management/User/@data/orchestrators/sendWelcomeToPubcenterEmail.ts","app/pages/partner-management/User/@data/orchestrators/userInvitationsGridInitialized.ts","app/pages/partner-management/User/@data/orchestrators/validateUserInvitationCode.ts","app/pages/ad-management/Profile/@data/orchestrators/editPublisherProfileDetails.ts","app/pages/ad-management/Profile/@data/orchestrators/fetchAppealHistory.ts","app/pages/ad-management/Profile/@data/orchestrators/fetchPrimaryUserDetails.ts","app/pages/ad-management/Profile/@data/orchestrators/fetchPublisherProfileDetails.ts","app/pages/ad-management/Profile/@data/orchestrators/generateVerificationCode.ts","app/pages/ad-management/Profile/@data/orchestrators/initializeProfilePage.ts","app/pages/ad-management/Profile/@data/orchestrators/submitEvidenceDocument.ts","app/pages/ad-management/Profile/@data/orchestrators/updatePublisherProfileDetails.ts","app/pages/ad-management/Profile/@data/services/updateUserContactDetails.ts","app/pages/ad-management/Profile/@data/orchestrators/validateAddress.ts","app/pages/ad-management/Profile/@data/orchestrators/validateAndPreviewChanges.ts","app/pages/ad-management/Profile/@data/orchestrators/validateOrgAddress.ts","app/pages/ad-management/Profile/@data/orchestrators/verifyGeneratedCode.ts","app/pages/ad-management/Profile/@data/services/verifyGeneratedCodeAsync.ts","app/components/CheckboxGroup/CheckboxGroup.styles.ts","app/components/CheckboxGroup/CheckboxGroup.tsx","app/components/CheckboxTreeWithSelectionBox/CheckboxTreeWithSelectionBox.styles.ts","app/components/CheckboxTree/CheckboxTree.styles.ts","app/components/CheckboxTree/CheckboxTree.tsx","app/components/CheckboxTreeWithSelectionBox/CheckboxTreeWithSelectionBox.tsx","app/pages/ad-management/Home/@data/orchestrators/dismissFRE.ts","app/@data/store/schema/models/EntitySummary.ts","app/@data/store/schema/models/Home.ts","app/pages/ad-management/Home/@data/orchestrators/fetchSetupCardsStatus.ts","app/pages/ad-management/Home/@data/orchestrators/initializeHomePage.ts","app/pages/ad-management/Home/@data/orchestrators/initializeSystemPreferences.ts","app/pages/ad-management/Home/@data/orchestrators/triggerOneVetAPIs.ts","app/pages/partner-management/User/@data/mutators/devTokenChanged.ts","app/pages/partner-management/User/@data/mutators/userChanged.ts","app/pages/partner-management/User/@data/mutators/userFormsChanged.ts","app/pages/ad-management/@data/orchestrators/currentRouteChanged.ts","app/pages/ad-management/@data/orchestrators/publisherEvaluationOrchestrator.ts","app/pages/ad-management/@data/services/publisherEvaluationService.ts","app/pages/ad-management/Account/Settings/components/NotificationConfiguration/NotificationConfiguration.messages.ts","app/pages/ad-management/Account/Settings/components/NotificationConfiguration/NotificationConfiguration.styles.ts","app/pages/ad-management/Account/Settings/components/NotificationConfiguration/NotificationConfiguration.tsx","app/pages/error-pages/SuspendedUser/resources/UserSuspended.svg","app/pages/ad-management/Account/Settings/resources/settings.svg","app/components/ZeroResults/resources/default.svg","app/hooks/useCMUIHelpExperience/supportButton.svg","app/components/Logo/resources/microsoft.svg","app/components/Logo/resources/microsoftDark.svg","app/components/Logo/resources/microsoftGrey.png","app/pages/ad-management/Home/resources/partyPopper.svg","app/pages/ad-management/Adunit/TythonAdunit/resources/scriptPlacement.png","app/pages/ad-management/Adunit/TythonAdunit/resources/NoCodeFound.svg","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/resources/fileIcon.svg","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/resources/fishpool.svg","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/components/CreateProperty/components/ClarityOptions/resources/codeFree.svg","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/components/CreateProperty/components/ClarityOptions/resources/existingClarity.svg","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/components/CreateProperty/components/ClarityOptions/resources/richBehavior.svg","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/resources/clarityLogo.svg","app/pages/ad-management/Property/Create/variations/CreateTythonProperty/resources/scriptPlacement.png","app/pages/ad-management/Adunit/TythonAppAdUnit/components/resources/adPreviewBackground.png","app/pages/ad-management/Home/components/SetupCard/resources/ProfileStep4.svg","app/pages/ad-management/Home/components/PerformanceSection/resources/BalanceImg.svg","app/pages/ad-management/Home/components/PerformanceSection/resources/Data_Usage.svg","app/pages/ad-management/Property/Create/variations/CreateTythonAppProperty/resources/SearchIcon.svg","app/pages/ad-management/Property/Create/variations/CreateTythonAppProperty/resources/CreateAppIcon.svg","app/pages/about-us/resources/About-us-background-image.jpg","app/pages/about-us/resources/ads.png","app/pages/about-us/resources/man.jpg","app/pages/about-us/resources/money.png","app/pages/about-us/resources/one.png","app/pages/about-us/resources/three.png","app/pages/about-us/resources/time.png","app/pages/about-us/resources/two.png","app/pages/about-us/resources/twoWomen.jpg","app/pages/about-us/resources/woman.jpg","app/pages/error-pages/resources/UserNotFound.svg","app/pages/login/resources/loginBackgroundImage.svg","app/pages/ad-management/Account/Settings/@data/orchestrators/fetchPublisherPreferences.ts","app/pages/ad-management/Account/Settings/@data/orchestrators/fetchUserPreferences.ts","app/pages/ad-management/Account/Settings/utils/roleDifferentiationUtils.ts","app/pages/ad-management/Account/Settings/@data/orchestrators/publisherDeleted.ts","app/pages/ad-management/Account/Settings/@data/orchestrators/toggleNotificationPreferences.ts","app/pages/ad-management/Account/Settings/@data/orchestrators/updateNotificationPreferences.ts","app/pages/ad-management/Account/Settings/@data/orchestrators/updateUserLanguage.ts","app/pages/ad-management/Account/Settings/@data/orchestrators/userSelfDeleted.ts","app/pages/ad-management/Account/Settings/components/GoogleConnector/@data/orchestrators/onConnectGoogleAccount.ts","app/pages/ad-management/Account/Settings/components/GoogleConnector/@data/orchestrators/onDisconnectGoogleAccount.ts","app/pages/ad-management/Account/Settings/components/GoogleConnector/@data/orchestrators/onInitializeGoogleAccount.ts","app/pages/ad-management/Account/Settings/components/GoogleConnector/@data/orchestrators/onMediateGoogleAccount.ts","app/App.styles.ts","app/@data/services/AuthorizationService.ts","app/AuthenticatedRoute.tsx","app/pages/login/LoginPage.messages.ts","app/pages/login/components/RedirectionSpinner.tsx","app/@data/store/schema/enums/ResourceType.ts","app/@data/store/schema/enums/ResourceTypeDistribution.ts","app/components/Search/Search.base.tsx","app/components/Search/Search.styles.ts","app/components/Search/Search.tsx","app/components/Header/Header.messages.ts","app/components/Header/Header.styles.ts","app/components/Header/Header.tsx","app/layout/GlobalSearchHeader/@data/actions/onSearchTriggered.ts","app/layout/GlobalSearchHeader/@data/store/store.ts","app/layout/GlobalSearchHeader/@data/mutators/searchTriggered.ts","app/@data/services/GlobalSearchApiService.ts","app/layout/GlobalSearchHeader/@data/orchestrators/searchTriggered.ts","app/layout/GlobalSearchHeader/GlobalSearchHeader.styles.ts","app/layout/GlobalSearchHeader/GlobalSearchHeader.tsx","app/layout/PageLayout/PageLayout.styles.ts","app/layout/PageLayout/PageLayout.tsx","app/pages/GlobalSearch/@data/actions/onSearchTriggered.ts","app/pages/GlobalSearch/@data/store/store.ts","app/pages/GlobalSearch/@data/mutators/searchChanged.ts","app/pages/GlobalSearch/@data/store/schema/models/SearchResult.ts","app/pages/GlobalSearch/@data/store/schema/models/Account.ts","app/pages/GlobalSearch/@data/store/schema/models/AdFilter.ts","app/pages/GlobalSearch/@data/store/schema/models/AdUnit.ts","app/pages/GlobalSearch/@data/store/schema/models/Channel.ts","app/pages/GlobalSearch/@data/store/schema/models/Publisher.ts","app/pages/GlobalSearch/@data/store/schema/models/User.ts","app/pages/GlobalSearch/@data/store/schema/models/WebProperty.ts","app/pages/GlobalSearch/@data/services/GlobalSearchHelperService.ts","app/pages/GlobalSearch/@data/orchestrators/searchTriggered.ts","app/pages/GlobalSearch/GlobalSearchResultList/GlobalSearchResultList.messages.ts","app/pages/GlobalSearch/GlobalSearchResultList/GlobalSearchResultList.styles.ts","app/pages/GlobalSearch/GlobalSearchResultList/GlobalSearchResultList.tsx","app/pages/GlobalSearch/GlobalSearchResultPage/GlobalSearchResultPage.messages.ts","app/pages/GlobalSearch/GlobalSearchResultPage/GlobalSearchResultPage.styles.ts","app/pages/GlobalSearch/GlobalSearchResultPage/GlobalSearchResultPage.tsx","app/pages/GlobalSearch/GlobalSearchResultRouter.tsx","app/pages/about-us/AboutUsPage.messages.ts","app/pages/about-us/AboutUsPage.styles.ts","app/pages/about-us/AboutUsPage.tsx","app/layout/EntityCreationLayout/messages.ts","app/layout/EntityCreationLayout/styles.ts","app/layout/EntityCreationLayout/index.tsx","app/pages/ad-management/Ads/AdTypePage/index.tsx","app/pages/ad-management/Inventory/InventoryTypePage/index.tsx","app/pages/error-pages/InvalidUser/InvalidUser.styles.ts","app/pages/error-pages/InvalidUser/InvalidUser.tsx","app/utils/JwtDecoderUtils.ts","app/pages/login/@data/orchestrators/authPageInitialized.ts","app/pages/login/@data/orchestrators/loginButtonClicked.ts","app/pages/login/@data/store/schema/LoginPageErrorModel.ts","app/pages/login/@data/orchestrators/onSwitchAccount.ts","app/pages/login/@data/orchestrators/pubCenterAADLogin.ts","app/pages/error-pages/InvalidUser/InvalidUser.messages.ts","app/pages/error-pages/InvalidUser/UnauthorizedInternalUser.tsx","app/pages/error-pages/InvalidUser/UserDoesNotExist.tsx","app/pages/error-pages/InvalidUser/NoAccessPage/NoAccessPage.messages.ts","app/pages/error-pages/InvalidUser/NoAccessPage/NoAccesPage.tsx","app/pages/landing-page/LandingPage.tsx","app/pages/login/@data/mutators/userAuthentication.ts","app/pages/login/LoginPage.tsx","app/pages/login/LoginPage.styles.ts","app/pages/login/components/LoginPageView.tsx","app/pages/signup/component/SignupDetails/SignUpDetails.messages.ts","app/pages/partner-management/User/AcceptInvite/AcceptInvite.styles.ts","app/pages/partner-management/User/AcceptInvite/AcceptInvite.tsx","app/pages/support/messages.ts","app/pages/support/styles.ts","app/pages/support/useSupportPage.ts","app/pages/support/index.tsx","app/pages/terms-and-conditions/TermsNConditionsPage.tsx","app/utils/DomUtils.ts","app/utils/validation/validation.messages.ts","app/ApplicationRoute.tsx","app/utils/validation/ValidatorFactory.ts","app/App.tsx","serviceWorker.ts","index.tsx","app/@data/utils/redirectionUtils.ts"],"names":["getFormClassNames","classNamesFunction","windowStoreSerializer","useWindowSize","FormItemBase","observer","props","isWindowSmallSize","getStore","id","formWidth","theme","styles","role","ariaLabel","ariaLabelledBy","ariaDescription","ariaDescribedBy","formClassNames","descId","concat","getId","React","className","root","undefined","children","style","getScreenReaderTextStyles","FormItem","styled","display","width","marginBottom","spacing","size16","scope","iconButtonStyles","paddingLeft","size8","paddingRight","size12","paddingTop","paddingBottom","color","palette","neutralSecondary","fontSize","fonts","small","getClassNames","FormSectionBase","title","rightChevron","hasBorderBottom","expanded","setExpanded","useState","classNames","sectionWidth","spaceBetween","formSectionDescription","ChevronIcon","Icon","iconName","TitleLabel","titleLabel","onToggle","_props$sectionStateCh","sectionStateChange","call","onClick","onKeyDown","ev","isButtonPressKey","key","tabIndex","content","hidden","FormSection","borderTopWidth","borderBottomWidth","borderTopStyle","borderBottomStyle","borderColor","neutralLight","selectors","$content","justifyContent","alignItems","backgroundColor","white","height","cursor","neutralLighter","size32","mediumPlus","FormTitleBase","BaseComponent","render","articleQuery","calloutContent","calloutOnDismiss","iconButtonOnClick","noHelpPopup","intl","titleHeadingLevel","this","formatMessage","InfoButton","AppMessages","infoLabel","label","infoDescription","iconTitle","calloutProps","calloutWidth","FormTitle","flexWithAlignCenter","size20","defineMessages","account","defaultMessage","activate","delete","deactivate","duplicate","edit","code","information","atleastSelectOneAccount","deactivateLowercase","activateLowercase","enabledUppercase","disabledUppercase","export","download","downloadSelected","downloadPage","downloadAll","downloadSelectedCmdBtnAriaDesc","downloadPageCmdBtnAriaDesc","downloadAllCmdBtnAriaDesc","downloadCmdBtnAriaDesc","addFilter","filters","filtersDescription","updateFilters","addMetrics","modifyColumns","modifyColumnsDescription","updateColumns","publisher","noPublisherSelected","noAccountSelected","customerInvalid","upload","previous","continue","cancel","apply","search","finish","required","optional","support","default","status","partnerCodes","removeAll","addAll","add","replace","append","name","domain","multiSelectPickerSelectedItemsLabel","timezoneLabel","timezoneEST","timezoneIDL","address","city","countryOrRegion","stateOrProvince","zipcode","language","country","currency","deactivateGenericTitle","deleteGenericTitle","neverMind","all","adUnits","adFilters","channels","publishers","reporting","properties","site","accounts","users","userInvitations","showMore","back","loadingLabel","loadingStatusLabel","loadingWaitingLabel","submit","save","saving","createChannel","close","on","off","here","learnMore","statusActive","statusInactive","skipToMainContent","next","yes","performanceCardTitle","sitesCardTitle","adUnitsCardTitle","mediationCardTitle","countryCardTitle","moreOptionsButtonAriaLabel","selectedCount","sortByColumnHeaderTooltipLabel","panelCloseButtonAriaDesc","userDeleteWarning","confirmActionMessage","permanentDelete","ariaLabelForSave","ariaLabelForGrid","ariaLabelForListHeader","ariaLabelForSelectionColumn","ariaLabelForSelectAllCheckBox","checkButtonAriaLabel","ariaLabelForShimmer","checkButtonGroupAriaLabel","checkBoxLabel","servingStatus","navAdFilters","navChannels","navAdUnits","navSites","navProperties","navAdQuality","navHome","navAdBlocks","navReports","navAccount","navPublisherManagement","navAccountManagement","navUserManagement","actions","fetchNotificationsError","dismissNotificationsError","detailPageFooterArialLabel","of","readMore","adUnit","adFilter","channel","property","user","deleteNotificationSingleItem","deleteNotificationSingleItemCont","deleteNotificationPlural","deleteNotificationPluralCont","duplicateNotificationSingleItem","duplicateNotificationSingleItemCont","duplicateNotificationPlural","duplicateNotificationPluralCont","listId","listIds","activatedUpperCase","deactivatedUpperCase","activatedLowerCase","deactivatedLowerCase","changingStatusItemName","changingStatusItemsSelection","changingStatusSingular","changingStatusPlural","failedToFetchUserScope","sessionExpiredLoginAgain","contactSupport","navInventory","navAds","organization","individual","CSVHelper","escapeStringForCSV","stringToEscape","extractDate","dateTimeStamp","substring","getBlockingStatus","isEnabled","getBlockRequestSource","val","_getStore$active$bloc","active","blockRequestSourceData","get","getRevenue","revenue","populateNull","getAdProvider","provider","adProvidersToNames","getXandrAdProvider","xandrAdProvidersToNames","getStatus","LifeCycleStatus","Inactive","getPlacement","dataRow","extractPlacement","getXandrPlacement","locale","downloadDataAsCSV","csvData","csvHeaders","csvFilename","csvFileData","encodedCSV","encodeURI","csvLink","document","createElement","setAttribute","body","appendChild","click","removeChild","getCSVStrings","rowData","columns","cells","forEach","col","cellData","columnName","exportFunction","friendlyName","isNaN","push","join","getCSVStringsV2","fieldName","_col$sortableValue","sortableValue","toString","roundNumber","num","decimalPlaces","modifier","Math","trunc","round","Number","EPSILON","getSuccessNotificationDeleteItem","selectedItems","entityInstance","ids","length","selectedItem","messages","entityInstanceMapping","singularize","IDs","getSuccessNotificationDuplicateItem","getSuccessNotificationChangingStatus","commandName","changingStatusMapping","toLocaleLowerCase","adunits","adunit","filter","Deactivate","Activate","Model","constructor","accessPermission","Account","params","super","_defineProperty","UserRoleEntity","Object","assign","or","publisherName","accountName","primaryContact","lanuage","timeZone","paymentOption","financialStatus","paymentLifecycle","operationCostRation","accountLevelAttribute","inHousePromotion","partnerCodesforDistributionReport","formCodesforDistributionReport","startDistributionReporting","SKUs","AdBlock","adBlock","enablePublisherBlocks","enableSiteBlocks","editDomainBlocks","editCategoryBlocks","AdUnit","businessModel","channelList","inhousePromotions","markeplaceClassification","distributionPartnerCodes","publisherGroupConfig","servingTier","Channel","adUnitList","DropdownMenu","menu","adManagement","partnerManagment","Filter","excludedAdKeywords","excludedQueryKeywords","excludedURLs","filterType","appendOnly","NavigationMenu","home","adblock","publisherProfile","adquality","dashboard","auditHistory","Property","approvalStatus","notes","websiteURL","attachedAdUnits","clarity","Publisher","partner","networkAffiliation","publisherTier","overrideFeatureTier","entityLimitTier","serviceLevel","allowDistributionReporting","allowDistributionV2Reporting","allowStartDistributionReporting","allowStartDistributionContentReporting","allowSelectTierReporting","allowMediationReporting","allowMobileSearchAdUnit","allowNativeReporting","allowSyndicationReporting","allowWebAdUnit","allowPaidSearchReportingApi","allowPaidSearchReportingDashboard","allowDynamicPropertyRegistration","enableDefaultTythonV2Reporting","publisherAllowedFeaturesPropertyAutoApproved","ipRanges","newAccount","PublisherProfileTabs","publisherProfileTabs","profile","userManagement","payments","settings","PublisherSettings","publisherSettings","mediation","publisherPreferences","publisherDelete","User","userFirstName","userLastName","userEmail","userLanguage","userAccountRole","userInviteFirstName","userInviteLastName","userInviteEmail","userInviteLanguage","userInviteAccountRole","UserSettings","userSettings","systemPreferences","billingAlerts","profileReview","invitedUsers","userDelete","userRoleKey","completeAccess","rolePermissions","Map","tythonUserRolePermissions","hasReadAccess","hasCreateAccess","hasUpdateAccess","hasDeleteAccess","async","setUserRoles","userContext","url","uiConfig","getApiBaseAddress","headers","buildRequestHeadersWithAuthToken","response","onLoadingChanged","onLoadingSetting","setTimeout","onLoadingWaiting","fetch","method","ok","isLocationPubCenter","handleApiErrors","responseJson","json","data","userType","Log","debug","parentCustomer","roleIds","userRoles","onUserContextChanged","parentCustomerId","accessiblePublisherList","accessiblePublishers","onDefaultPublisherSet","onAccessiblePublisherListChanged","localStorage","setItem","DEFAULT_PUBLISHER_CACHE_KEY","setUserContext","setUserRolesInCache","err","error","onNotificationChanged","textMessageDescriptor","messageBarType","MessageBarType","clearTimeout","roleId","entities","isTythonSelfServeUser","entity","userRoleEntity","set","userRolesJSON","value","JSON","stringify","APP_NAME_PUBCENTER","APP_NAME_NEW","APP_NAME_SHORT","APP_NAME_NEW_COMPACT","PUBCENTER_TITLE","MAIN_CONTENT_ID","COPY_BUTTON_TIMEOUT","NOTIFICATION_DISMISS_TIMEOUT","TOKEN_EXPIRED_SEARCH_PARAM_KEY","CLARITY_HOME_WEB_APP","CLARITY_WEB_APP","CLARITY_PRIVACY_STATEMENT","CLARITY_DEMO","CLARITY_PRIVACY_DISCLOSURE","WAITLIST_FORM","USER_SIGNUP_KEY","DEFAULT_COUNTRY_NAME","DEFAULT_COUNTRY_CODE","DEFAULT_CURRENCY_CODE","NO_VALUE_PLACEHOLDER","SESSION_NOTIFICATIONS_UI","SESSION_DISMISSED_NOTIFICATIONS_BACKEND","SUPPORT_EMAIL","TYTHON_SUPPORT_EMAIL","TNC_HREF_PATH","PRIVACY_STATEMENT","_process$env$REACT_AP","process","REACT_APP_DEFAULT_ADUNIT_IMAGE_ASPECT_RATIO","_process$env$REACT_AP2","_process$env$REACT_AP3","REACT_APP_ADUNIT_IMAGE_ASPECT_RATIOS","split","CUSTOM_WIDTH","CUSTOM_NOTIFICATIONS_WIDTH","PAGINATION_PAGE_SIZES","REDIRECT_URI_SESSION_STORAGE_KEY","TYTHON_DOMAIN_REDIRECTION_CACHE_KEY","DOMAIN_REDIRECTION_QUERY_PARAM","ENTERPRISE_USER_ACCESS_URL","ADS_DOT_TEXT_HELP_URL","CONNECT_SITE_HELP_URL","SITE_APPROVAL_HELP_URL","PUBLISHER_EVALUATION_HELP_URL","WELCOME_SEND_FLAG","LOCAL_STORAGE_LOCALE","UNAUTHORIZED_LOCAL_STORAGE_LOCALE","EN_LOCALE_KEY","FR_LOCALE_KEY","DE_LOCALE_KEY","IT_LOCALE_KEY","ES_LOCALE_KEY","EN_GB_LOCALE_KEY","ES_MX_LOCALE_KEY","FR_CA_LOCALE_KEY","TythonColumnsEnum","defaultInitialTextFilterState","condition","isApplied","createStore","loading","panelIsOpen","panelItemType","filterPanel","blockAdsPage","adPerfBlockAdsData","blockReasonsL2","pageType","errors","blockedAdsContext","blockedImagesContext","teachingBubbleStartDate","teachingBubbleEndDate","adDescription","AdQualityFilterNames","AccountName","values","AdProviders","Markets","CreativeAdId","conditions","Advertiser","AdvertiserId","AdvertiserAccountId","AdId","AdTitle","AdURL","LongHeadline","ShortHeadline","raw","RoutePrefix","getGlobalRoutes","report","text","icon","component","ReportRouter","AdManagementRouter","partnerManagement","PartnerManagementRouter","DefaultRoute","SignUpPageRoute","LandingPageRoute","LogInPageRoute","AccountPageRoute","AcceptInvitePageRoute","UserDoesNotExistErrorPageRoute","NoAccessErrorPageRoute","UnauthorizedInternalUserPageRoute","HomePageRoute","AuditHistoryRoute","UserLevelSettingRoute","SupportPageRoute","ChartTypes","ChartGrain","ReportCardType","onAcceptInvitePageInitialized","action","invitationCode","invitationLocale","onAcceptInvitePageSubmitted","validateUserInvitationCode","onDevTokenPanelShown","devTokenPanelParams","onDevTokenPanelHide","onFetchDevTokenStatus","onGenerateDevTokenStatus","onRawChanged","onUserChanged","onFetchUsersLoading","isLoading","onFetchingUsersData","isFetchingData","onUserInvitationsChanged","onFetchUserInvitationsLoading","onFetchingUserInvitationsData","onUsersChanged","onUserErrorChanged","onUserInvitationChanged","mode","onUserInvitationExpiryChanged","onFormIdChanged","onFormFirstNameChanged","onFormLastNameChanged","onFormPhoneNumberChanged","onFormEmailAddressChanged","onFormUsernameChanged","onFormLanguageChanged","onFormUserLocaleChanged","onFormContactByEmailChanged","onFormContactByPhoneChanged","onFormAccountRoleChanged","onFormRoleAccountListChanged","onFormInitialized","publisherId","entityId","onFormCancelled","onFormCleared","onFormSubmitted","routeHistory","sendWelcomeToPubcenterEmail","fetchAdUnitsDataAction","fetchAdUnitMediationStatus","adUnitId","showLoadingSpinner","showNotifications","updateAdUnitMediationStatus","state","onAdunitChanged","onAdunitErrorChanged","onAdunitMediationUpdateStart","onAdunitMediationUpdateEnd","accountId","onFetchAdUnitName","setIsLoading","onFetchAdUnitTemplate","onAdunitIdChanged","onAdunitNameChanged","onAdunitTypeChanged","onMarketplaceChanged","onBusinessModelChanged","onChannelsChanged","onAdunitChannelListChanged","onAssociatedPropertyChanged","onAdunitPropertyListChanged","onCreatePropertyPanelOpenChanged","isOpen","onServingTierChanged","onPubGroupConfigChanged","onStoreIdsChanged","onAdUnitFormSubmittable","isSubmittable","onSubmit","stepState","shouldHandleMediation","onAdUnitNameUpdate","setErrorMessage","setVisibleCallOut","onDistributionPartnerCodesChanged","onImpressionFeedbackSignalChanged","onPanelOpenChanged","isPanelOpen","activePropertyId","activeAdUnitId","defaultGridCellTextStyle","fontWeight","useCanvasTextWidth","arguments","boundary","setWidth","useEffect","context","getContext","fontParts","fontStyle","fontVariant","lineHeight","fontFamily","font","Boolean","metrics","measureText","useDebouncedValue","delay","debouncedValue","setDebouncedValue","timer","debounce","func","wait","timeout","_len","args","Array","_key","later","useIntersectionObserverWithRefCallback","_ref","threshold","rootMargin","unobserve","ref","useRef","entry","setEntry","updateEntry","_ref2","intersectionObserverEntry","updateEntryAndUnobserve","_ref3","isIntersecting","current","useCallback","node","IntersectionObserver","observe","useNativeAdSdk","isSdkLoaded","setSdkLoaded","script","src","crossOrigin","onload","head","usePUID","puid","setPUID","msalAccountKeys","getItem","keysArray","parse","isArray","_JSON$parse","idTokenClaims","console","usePreloadSVGImages","imageList","preloadContainer","imageSrc","img","Image","useSortableGridColumns","items","onSortItems","onCleanupSortItems","gridColumns","setGridColumns","handleColumnHeaderClick","column","suppressSorting","stopPropagation","newColumns","slice","currColumn","currCol","isSortedDescending","isSorted","sortedItems","sortItemsBasedOnColumn","useStateWithLatestCallback","initialState","setState","stateRef","getState","windowSizeFormatter","onWindowResize","mutatorAction","innerHeight","innerWidth","window","resizeTo","store","windowSize","windowSizeType","isWindowExtraSmallSize","isWindowMediumSize","isWindowRegularSize","StoragePublisherKey","StorageAccountKey","StorageUserContextKey","StorageIsUserInviteFlowKey","StorageUserInvitationCodeFlowKey","storedNotifications","sessionStorage","getAppStore","restoreTypeWithObject","waiting","openedPopup","PopupType","None","openedPanel","CustomPanelType","isFirstTimeUser","isUserSuspended","menuCollapsed","isInviteUserFlow","userInvitationCode","notifications","toastNotifications","notificationPanelCollapsed","panelNotifications","UserContext","helpInfo","entityGridColumns","defaultPublisher","deleteAdUnitTemplateOnSubmit","_localStorage$getItem","flexWithCenter","flexWithJustifyBetween","noPointerEvents","pointerEvents","zeroMarginPTag","margin","onAccountChanged","onAccountSelected","onAuthLogout","isTokenExpired","userDetails","onEntityGridColumnsChanged","entityColumnsData","onHelpInfoCalloutOpened","popupId","onHelpInfoChanged","onLayoutChanged","layout","onMenuCollapsedChanged","collapsed","onNavigateBack","returnUrl","redirectToReportingDashboard","handleDomainRedirection","username","pathname","notification","onNotificationRemoved","onNotificationCardAdded","onNotificationCardRemoved","onDismissAllNotifications","fetchBackendNotifications","onNotificationPanelItemsChanged","onDismissNotification","onNotificationPanelClosed","isClosed","onPublisherChanged","onPublisherSelected","onPublisherAccountChanged","onUserFirstTime","ProfileReviewTSTFailedTitle","ProfileReviewTSTFailedContent","MissingPaymentInformationTitle","MissingPaymentInformationContent","MissingPaymentInformationPrimaryActionLabel","PolicyUpdatePrimaryActionLabel","PaymentFailedTitle","PaymentFailedReason_account_closed","PaymentFailedTitle_bank_account_restricted","PaymentFailedReason_bank_account_restricted","PaymentFailedReasonStripe_could_not_process","PaymentFailedReason_could_not_process","PaymentFailedTitle_declined","PaymentFailedReason_declined","PaymentFailedTitle_expired_card","PaymentFailedReason_expired_card","PaymentFailedTitle_incorrect_account_holder_name","PaymentFailedReason_incorrect_account_holder_name","PaymentFailedTitle_invalid_account_number","PaymentFailedReason_invalid_account_number","PaymentFailedTitle_invalid_card","PaymentFailedReason_invalid_card","PaymentFailedTitle_invalid_currency","PaymentFailedReason_invalid_currency","PaymentFailedTitle_lost_or_stolen_card","PaymentFailedReason_lost_or_stolen_card","PaymentFailedTitle_no_account","PaymentFailedReason_no_account","PaymentFailedReasonLocate_no_account","ClarityLinkExpiredTitle","ClarityLinkExpiredContent","ClarityLinkDeclinedTitle","ClarityLinkDeclinedContent","ClarityLinkExpiredPrimaryActionLabel","ClarityLinkDeclinedPrimaryActionLabel","ClarityLinkExpiredSecondaryActionLabel","ClarityLinkDeclinedSecondaryActionLabel","ChooseGamNetworkFailureContent","ChooseGamNetworkFailureTitle","ChangingItemStatusFailureTitle","ChangingItemStatusFailureContent","DeletingItemFailureTitle","DeletingItemFailureContent","DuplicateGridItemFailureTitle","DuplicateGridItemFailureContent","GridDataDownloadFailureTitle","GridDataDownloadFailureContent","FeedbackErrorMessageContent","FeedbackErrorMessageTitle","FeedBackInvalidFormMessageContent","FeedBackInvalidFormMessageTitle","PropertyEditFailedNotificationContent","PropertyEditFailedNotificationTitle","LoadingSitesFailedTitle","LoadingSitesFailedContent","DuplicatedSiteCreationErrorNotificationTitle","DuplicatedSiteCreationErrorNotificationContent","AdblockUpdateFailedTitle","AdblockUpdateFailedContent","AdblockToggleFailedContent","AdblockToggleFailedTitle","ToggleUniversalBlockFailedContent","ToggleUniversalBlockFailedTitle","UniversalAdblockUpdateFailedContent","UniversalAdblockUpdateFailedTitle","PayoutInformationFailedContent","PayoutInformationFailedTitle","LoadingBalanceDataFailedContent","LoadingBalanceDataFailedTitle","LoadPayoutInfoFailedContent","LoadPayoutInfoFailedTitle","DeletingUserWentWrongContent","DeletingUserWentWrongTitle","PaymentFailedAccountClosedTitle","PaymentFailedAccountClosedContent","PaymentFailedBankAccountRestrictedTitle","PaymentFailedBankAccountRestrictedContent","PaymentFailedStripeCouldNotProcessTitle","PaymentFailedStripeCouldNotProcessContent","PaymentFailedCouldNotProcessTitle","PaymentFailedCouldNotProcessContent","PaymentFailedDeclinedTitle","PaymentFailedDeclinedContent","PaymentFailedExpiredCardTitle","PaymentFailedExpiredCardContent","PaymentFailedIncorrectAccountHolderNameTitle","PaymentFailedIncorrectAccountHolderNameContent","PaymentFailedInvalidAccountNumberTitle","PaymentFailedInvalidAccountNumberContent","PaymentFailedInvalidCardTitle","PaymentFailedInvalidCardContent","PaymentFailedInvalidCurrencyTitle","PaymentFailedInvalidCurrencyContent","PaymentFailedLostOrStolenCardTitle","PaymentFailedLostOrStolenCardContent","PaymentFailedNoAccountTitle","PaymentFailedNoAccountContent","PaymentFailedNoAccountLocatedTitle","PaymentFailedNoAccountLocatedContent","CreateTythonAdUnitFailedTitle","ProfileInformationUpdatedTitle","ProfileInformationUpdatedContent","onInitializeProfilePage","countryCode","fetchPublisherProfileDetailsAction","updatePublisherProfileAction","fetchUserDetailsAction","userId","editProfileAction","validateAndPreviewProfileChangesAction","isVerificationRequired","generateVerificationCode","verifyGeneratedCode","validateAddress","validateOrgAddress","submitEvidenceDocument","setDocumentUploadStatus","documentContent","fetchAppealHistory","dialogType","panelType","filterMenuCalloutOpen","isSearchCalloutVisible","searchWord","paginator","currentPageSize","currentPageNumber","numberOfPages","entityType","EntityType","notificationPreferences","eTag","initializeIcons","registerIcons","fontFace","icons","AdUnitChannel","AdUnitBlock","Notifications","ShowAll","PubcenterTheme","headerGlobal","themeLighterAlt","themeLighter","themeLight","themePrimary","themeTertiary","themeSecondary","themeDarkAlt","themeDark","themeDarker","neutralLighterAlt","neutralQuaternaryAlt","neutralQuaternary","neutralTertiaryAlt","neutralTertiary","neutralPrimaryAlt","neutralPrimary","neutralDark","black","redDark","blue","blueDark","messageBarError","severeError","warning","success","antiqueBronze","seaGreen","lowContrastBlue","disabledGray","eerieBlack","highContrastPrimary","highContrastLink","raisinBlack","grayX11","gray","neutralTertiaryWhiteContrast","neutralSecondaryAltWhiteContrast","taupeGray","darkSilver","frenchBlue","azureishWhite","paleChestnut","lavenderBlush","venetianRed","honeydew","grannySmithApple","deepGreen","neutralForeground1Rest","neutralForeground2Rest","neutralForeground3Rest","neutralBackground1Selected","neutralBackground4Rest","neutralStroke2Rest","brandForeground1Rest","statusSuccessBackground1Rest","statusSuccessForeground1Rest","statusSuccessStroke1Rest","size0","size1","size2","size3","size4","size5","size6","size7","size10","size14","size15","size18","size22","size24","size28","size30","size36","size40","size44","size46","size48","size50","size52","size54","size56","size60","size64","size72","size80","size92","size96","size100","size120","size126","size128","size142","size146","size150","size159","size160","size180","size192","size200","size220","size250","size256","size260","size300","size320","size350","size360","size480","size500","size600","size896","size960","size14Medium","size42","boxShadow","soft","aesthetic","creative","raised","FluentTheme","loadTheme","PubcenterCustomizations","BreakPoints","AccessibilityContrast","acceptInvite","createUser","firstName","lastName","emailAddress","preferredLanguage","accountRole","accountManager","accountManagerDescription","reportUser","reportUserDescription","listManager","listManagerDescription","adViewer","adViewerDescription","administrator","administratorDescription","superAdmin","superAdminDescription","createPageTitle","editPageTitle","pageDescription","telephoneNumber","faxNumber","userAccountInfo","userName","password","confirmPassword","secretQuestion","secretAnswer","marketingContactSetting","email","phone","postalMail","updateUser","accountMultiSelectPickerAriaDesc","useDifferentAccountMessage","switchNow","resendingUserInvitation","resendUserInvitationSuccess","deletedUserInvitationSuccess","COUNTRY_WISE_ZIP_CODES_REGEX","AF","format","regex","AX","AL","DZ","AS","AD","AO","AI","AG","AR","AM","AW","AC","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BQ","BA","BW","BR","IO","VG","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CW","CY","CZ","DK","DJ","DM","DO","TL","EC","SV","EG","GQ","ER","EE","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","XK","KW","KG","LV","LA","LB","LS","LR","LY","LI","LT","LU","MO","MK","MG","MW","MV","MY","ML","MT","MH","MR","MU","MQ","YT","FM","MX","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MP","NO","OM","PK","PW","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","BL","SH","KN","LC","MF","PM","VC","SM","ST","SA","SN","RS","SC","SX","SL","SG","SK","SI","SB","SO","ZA","GS","ES","LK","SD","SR","SZ","SE","CH","SJ","SY","TW","TJ","TZ","TH","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UY","VI","UZ","VU","VA","VE","VN","WF","YE","ZM","ZW","getAddressValidationModel","object","shape","line1","string","line2","postalCode","when","schema","test","message","regExp","RegExp","IdNamePairErrorModel","number","trim","handleError","Promise","reject","constructUrl","baseUrl","models","defaultParams","urlArray","model","str","encodeURIComponent","convertDateToString","date","toISOString","constructAdPerfRequest","accountIds","_body$Filters","StartDate","selectedAdSource","AdSource","XandrAuction","startDate","EndDate","endDate","PageNumber","PageSize","Filters","Keyword","searchBoxValue","Creativeagglevel","Microsoft","AGG_LEVEL_LISTING","Auction","AGG_LEVEL_CREATIVE","AdTypes","PAGE_ADS","TEXT_ADS","AdSources","AUDIENCE_INTENT_MARKETPLACE","PAID_SEARCH","Fields","Numerical","isImageBlockable","adtype","adsource","isNativeStockPhoto","indexOf","isPaCorpusImage","isImageBlocked","adId","blockedImages","isBlocked","imageReportDataTuple","imageUrl","includes","mapAdIdImages","has","compareImages","isAllImagesViewOnly","imgs","every","image","allImages","imageToCompare","strippedImages","processImagesLink","imageUrls","noImageUrl","isAuctionData","v","imgIndex","sanitizeBingImageUrl","imgUrl","item","regions","pagetypes","exportCSV","blockDataForCSV","fileName","stringDataForCSV","isExportColumn","headerCsvList","coldata","headerCSV","toHttpsLink","urlToUpdate","startsWith","samBlockSummaryToAdPerfMapper","mappedItems","adProvider","allAdImages","apiPath","adTitle","invert","advertiserName","advertiser","images","sevenDayRevenueImpact","uniqueCreativeAdId","creativeAdId","blockDatatoAdPerfMapper","pastRevenue","advertiserAccountId","getGridPropertyStore","isCodePanelOpen","isFetchingPropertyStatus","FilterType","FilterCondition","getAdUnitRoute","getCurrentPublisherId","RouteName","getSitesRoute","getTythonPublisherRoute","getTythonProfilePageRoute","PROFILE_TAB_KEY","getTythonPaymentPageRoute","PAYMENTS_TAB_KEY","getTythonAccountSettingPageRoute","SETTINGS_TAB_KEY","getTythonHomePageRoute","getTythonAdUnitCreatePageRoute","getTythonSiteCreatePageRoute","getTythonInventoryPage","renderAppView","inventory","getTythonInventoryCreationPageRoute","getTythonAdsCreationPageRoute","ads","getTythonAppAdunitCreationRoute","getTythonAppAdunitEditionRoute","getTythonAppInventoryCreationRoute","getTythonAppInventoryEditionRoute","getTythonReportDashboardPageRoute","REPORT_DASHBOARD_PAGE","getAdBlocksPageRoute","getTythonAdsManageRoute","PUBCENTER_TYTHON_DOMAIN_MAPPING","TYTHON_NEW_PROD","PUBCENTER_DOMAINS","getAdunitStore","enablePrivateMarketplace","adUnitsRaw","isFetchingAdUnitStatus","mediationUpdatePool","scriptProps","UserType","TythonSelfServe","isNotAuthorizedUser","isLocalRetrieved","isInternalUser","_store$defaultPublish","_store$publisher","defaultPublisherId","setSearchWord","word","setIsSearchCalloutVisible","isVisible","setData","setSelectedItems","setLoading","setQuery","query","setEntity","setFilterMenuCalloutStatus","setDialogType","setPanelType","onPageSizeChanged","ceil","onPageNumberChanged","onNumberOfPagesChanged","columnVisibilityMappings","getGridColumns","entityColumns","find","entityGridColumn","colVisMap","gridColumn","columnKey","LOADING_SPINNER","REPORTING_DATE_RANGE_PICKER","DATE_RANGE_PICKER_PRESET_CUSTOM","DATE_RANGE_PICKER_PRESET_TODAY","DATE_RANGE_PICKER_PRESET_YESTERDAY","DATE_RANGE_PICKER_PRESET_THIS_WEEK_SUN_TODAY","DATE_RANGE_PICKER_PRESET_THIS_WEEK_MON_TODAY","DATE_RANGE_PICKER_PRESET_LAST_7_DAYS","DATE_RANGE_PICKER_PRESET_LAST_WEEK_SUN_SAT","DATE_RANGE_PICKER_APPLY_BUTTON","GRAIN_SELECTOR_BUTTON","PERFORMANCE_CHART_TYPE_LINE_BUTTON","PERFORMANCE_CHART_TYPE_BAR_BUTTON","PERFORMANCE_CHART_TYPE_DONUT_BUTTON","ADUNIT_CHART_TYPE_GRID_BUTTON","ADUNIT_CHART_TYPE_BAR_BUTTON","ADUNIT_CHART_TYPE_DONUT_BUTTON","COUNTRY_CHART_TYPE_MAP_BUTTON","COUNTRY_CHART_TYPE_BAR_BUTTON","COUNTRY_CHART_TYPE_GRID_BUTTON","MEDIATION_CHART_TYPE_GRID_BUTTON","MEDIATION_CHART_TYPE_BAR_BUTTON","MEDIATION_CHART_TYPE_DONUT_BUTTON","SITE_CHART_TYPE_BAR_BUTTON","SITE_CHART_TYPE_GRID_BUTTON","SITE_CHART_TYPE_DONUT_BUTTON","CHART_WRAPPER","CLARITY_BEHAVIORAL_RADIO_BUTTON","CLARITY_BASIC_RADIO_BUTTON","CLARITY_EXISTING_RADIO_BUTTON","PROPERTY_NAME_INPUT","PROPERTY_DOMAIN_INPUT","reportTitle","reportDescriptionForPublisherSelected","reportDescriptionForPublisherNotSelected","reportDescriptionForReportsNotApplicable","reportLink","metricsDropdownLabel","shareScheduleDropdownLabel","viewReportLink","noData","breakDownBy","toggleChartIcon","chartSelectIcon","metricPickerEditButtonTitle","exportPNG","chartIncompatibleFieldsWithFilterWillNotBeShown","chartIncompatibleFieldsWithFilterCantBeShown","gridIncompatibleFieldsWhenAddingColumnWithFilter","gridIncompatibleFieldsWhenAddingColumnWithBreakdown","gridIncompatibleFieldsWhenAddingColumnWithFilterAndBreakdown","gridIncompatibleFieldsWithFilter","gridIncompatibleFieldsWithBreakdown","gridIncompatibleFieldsWithFilterAndBreakdown","gridIncompatibleFieldsWhenBreakingDown","topBarExportPNG","dimensionColumnMembersFailedMessage","loadingReportSummaryFailedMessage","loadingReportFailedMessage","loadingDetailedReportFailedMessage","loadingMediationReportFailedMessage","loadingReportMetadataFailedMessage","loadingPublisherDetailsFailedMessage","failedToExportReportAsPNG","reportInvalidState","failedToFetchPublisherReportDetails","reportsNotAvailableAtThisTime","onSetFirstPartyBoost","PublisherTier","SelfServe1stPartyBoost","onPopupOpenChanged","showSuccessToastNotification","appendNewNotification","ToastType","showInfoToastNotification","info","showErrorToastNotification","showLoadingToastNotification","onDismiss","Error","suppressAutoDismiss","noDismissButton","removeToastNotification","indexOfNotification","findIndex","type","crypto","randomUUID","isOfflineUI","some","location","hostname","uiConfigInternal","apiBaseAddress","metadataApiBaseAddess","customerMetadataApiBaseAddess","adUnitMetadataApiBaseAddress","adQualityApiBaseAddress","reportingDashboardAddress","reportingApiBaseAddress","mediationReportingApiBaseAddress","defaultApiVersion","apiVersion","replaceApiVersion","getMetadataApiBaseAddress","getCustomerMetadataApiBaseAddress","getAdUnitMetadataApiBaseAddress","getAdQualityApiBaseAddress","getReportingDashboardAddress","commonSessionId","getDefaultApiVersion","getReportingApiBaseAddress","getMediationReportingApiBaseAddress","endpointBaseAddress","String","getApexInitUrl","CommandBarActions","Direction","GridSelectionMode","DownloadOption","getReportColumnMetadataDisplayName","messageId","getReportMetadataColumnMessageId","formatReportMetadataMessageById","getReportGrainsMetadataDisplayName","getReportMetadataGrainMessageId","ReportMetadataMessages","_window","_window2","partnerCodesEnabledPublishers","isPartnerCodeEnabled","tokenHeaderMap","TokenType","SessionGuid","PubCenterAADToken","includeDefaultHeaders","defaultHeaders","tokenHeader","token","fetchPubCenterAADAccessTokenAsync","Headers","header","aadConfig","auth","devToken","setPropertyData","setFetchingData","isFetching","setPropertiesServingConfigs","configs","servingConfigs","setPropertiesFetching","setClarityPanelVisibility","setCodePanelVisibility","clarityStatus","selectedPropertyId","clarityPanel","setSelectedPropertyId","usersTab","userInvitationsTab","noEntityFound","gridNotReadyLabel","superAdminDesc","accountManagerDesc","reportUserDesc","changeUserRole","roleChangePanelDesc","deleteConfirmationDialogTitle","deleteConfirmationDialogDesc","deleteButtonText","searchByNamePlaceholder","loadUserDetailsFailed","userRoleChangeFailed","userManagementInvalidState","userManagementFailedToDeleteItem","editedUserRoleSuccessfully","PUBLISHER_BASED_ROUTES","defaultRoute","getAdManagementStore","doNotRenderDefaultPage","errorLogMessage","_responseJson$errors","errorObj","_userContext$userName","write","resolve","ApiError","tokenType","loginUserWithAdditionalClaims","errorCode","ApiErrorCodes","UserDoesNotExist","origin","host","signupPageRoute","UserDoesNotExistPageRoute","InvalidOAuthToken","InvalidCCAuthToken","InvalidUserCredentials","UserAlreadyMigrated","UserIdNotFound","showTokenExpirationNotification","errorMessage","DefaultLogUserContext","logUserContext","getInstance","logParams","Instance","logMessage","logtype","LogType","INFO","logManager","logManagers","log","DEBUG","warn","WARN","ERROR","environment","LoggingUtils","getEnvironment","Environment","TEST","AriaLoggerManager","ConsoleLoggerManager","option","center","zoom","authOptions","authType","AuthenticationType","subscriptionKey","BubbleLayer","popup","Popup","closeButton","useI18n","map","feature","minValue","min","maxValue","max","link","href","rel","mapInstance","atlas","events","controls","control","ZoomControl","position","ControlPosition","TopRight","datasource","source","DataSource","sources","bubbleLayer","layer","radius","strokeWidth","layers","symbolLayer","SymbolLayer","iconOptions","textOptions","textField","offset","e","shapes","getProperties","coordinates","getCoordinates","popupContent","dimension","formattedValue","setOptions","pixelOffset","open","dispose","highchartsAccessibility","HighCharts","HighChartsMap","CustomChart","options","dataMetric","chartComponentRef","finalOptions","credits","enabled","chart","scrollablePlotArea","minWidth","reflow","xAxis","tooltip","shared","HighChartsWrapper","highcharts","constructorType","AuthenticationUtils","createNewGuid","guidHolder","hex","r","guidResponse","i","random","getStyles","minHeight","userSelect","ZeroTotalChart","CHART_COLOR_TOKENS_GRADIENTS","DataVizPalette","color1","color2","color3","color4","color5","color6","color7","color8","color9","color10","color11","getColorFromToken","METRICS_COLORS","Revenue","main","gradients","ImpressionsServed","Impressions","ImpressionsViewed","ViewableImpressions","eCPM","AdECPM","Clicks","AdClicks","Viewability","ImpressionsRate","CTR","AdCTR","FillRate","MeasurableImpressionsRate","MeasurableImpressions","EligibleImpressions","ResponsesServed","MAX_TOP_ROWS","OTHERS_NAME","getShimmerCustomElements","chartType","BAR","ShimmerElementsGroup","flexWrap","shimmerElements","ShimmerElementType","line","verticalAlign","gap","DONUT","circle","LINE","MAP","GRID","mapToGridData","metric","mainDimension","index","roundMetric","mapToDonutChartData","chartTitle","chartData","colorIndex","getMetricColorIndex","legend","getGradientColor","metricKey","_getMetricColor","getMetricColor","_METRICS_COLORS$metri","metricColor","mapToBarChartData","total","point","barXData","horizontalBarChartdata","x","y","xAxisCalloutData","yAxisCalloutData","mapToLineChartData","activeMetrics","dateDimension","series","lineDataByDimension","row","keys","activeMetric","isActive","topDataByMetric","getTopData","dataByDimension","reduce","acc","curr","sum","topData","sort","a","b","localDate","Date","UTC","getFullYear","getMonth","getDate","getHours","getMinutes","yAxis","pointFormatter","numberFormat","useHTML","getTimeSeriesByDimension","metricName","getTimeSeriesByMetric","getMetricDropdownOptions","ratioMetrics","getChart","currentChartType","reportData","selectedMetric","mapChartComponentRef","countryCodeDimension","roundedTotal","EmptyChart","noDataText","noDataMessage","showGridLines","DonutChart","innerRadius","hideLegend","valueInsideDonut","formatMetric","enabledLegendsWrapLines","legendProps","textTransform","legendContainer","maxWidth","HorizontalBarChart","isResizable","buildGridColumns","ShimmeredDetailsList","shimmerLines","enableShimmer","selectionMode","SelectionMode","none","lineChartSeries","yAxes","enabledMetrics","hasLeftAxis","newAxis","opposite","labels","buildYAxes","lang","thousandsSep","bubbleData","codeDimensionKey","countryCoordinatesData","metricValue","formattedMetricValue","displayName","Country","geometry","longitude","latitude","mapToBubbleData","BubbleMap","topCount","others","DateTime","sortedData","count","buildGridV2Columns","dimensions","defaultSelected","sortByDefaultColumns","isSearchable","isExportable","columnOrder","sortFunction","isSortingDescending","convertDate","dateParts","match","month","parseInt","day","year","hours","ampm","aDate","bDate","getActiveMarkers","sortedMetrics","isSelectedMetricDisabled","_metric$incompatibleF","appliedFiltersSet","Set","incompatibleFilter","isIncompatible","incompatibleFields","incompatibleField","incompatibleDimension","isDisabled","inCompatibleMessage","getIncompatibleFilterMessage","_getMetricColor2","metricData","disabled","incompatibleTooltipCantText","cantMessage","incompatibleTooltipWontText","wontMessage","ReportMessages","getIncompatibleBreakdownMessage","getIncompatibleColumnWithBreakdownMessage","getIncompatibleColumnWithFilterMessage","getIncompatibleColumnWithBreakdownAndFilterMessage","constructRequestBody","dateRange","currentChartGrain","breakdown","callerGuid","reportType","getReportPageStore","reportName","dateTimeRanges","startDateTime","startOfDay","endDateTime","endOfDay","grain","Key","filterKey","requestOptions","constructMediationRequestBody","getStartingBreakdown","startingBreakdown","storedBreakdown","getDataFromURL","ReportsQueryStoreKeys","BREAKDOWN","getStartingChartGrain","defaultChartGrain","allowedChartGrains","chartGrainStoreKey","defaultBasedOnChartType","HOURLY","NONE","startingChartGrain","storedChartGrain","exportReport","dataToExport","columnsMetadata","filename","columnsToExport","exportToCsv","onAdSenseMediationToggleChanged","adSenseMediationToggle","onAdSenseMediationChanged","adSenseMediationStatus","onAdunitPrivateMarketplaceChanged","privateMarketplace","onAdunitEnablePrivateMarketplaceChanged","setAdUnitsData","setAdUnitsLoading","setAdUnitsDataFetching","setAdUnitsMediationFetching","sysLocale","sysCountryCode","addLocaleData","enLocaleData","frLocaleData","deLocaleData","itLocaleData","esLocaleData","formattedLocale","useMemo","appLocale","appCountryCode","formatLocale","upperCaseCountryCode","enGb","fr","de","it","frCa","es","esMx","InfoToggleBase","checked","onChange","Toggle","onText","offText","defaultChecked","subComponentStyles","toggle","InfoToggle","selectTextToggleLabel","selectTextToggleAriaDesc","ariaLabelForSelectAllCheckbox","columnAriaLabel","columnSortAscendingAriaLabel","columnSortDescendingAriaLabel","numberOfItemsAfterFilterLabel","commandBarNavigationHelpArialLabel","columnResizeDialogTitle","columnWidthFieldLabel","columnResizeDialogDescription","resizeButtonLabel","sortButtonLabel","DataGridSelectionMode","DataGridBase","isResizeDialogOpen","_columnToEdit","_showResizeDialog","columnHeaderMenuProps","_getContextualMenuProps","_handleResizeButtonClick","_handleSortButtonClick","target","currentTarget","gapSpace","isBeakVisible","DialogType","normal","closeButtonAriaLabel","appMessages","subText","_this$_detailsListRef","_this$_columnWidthFie","_detailsListRef","updateColumn","_columnWidthFieldRef","_hideResizeDialog","detailListProps","displayFunction","filterList","filteredItems","lastSortedColumn","filterCol","customFunction","_applyFilter","displayedItems","filterApplied","filterColumn","custom","filterCondition","dateVal","relational","numVal","filterText","filterNumVal","Equals","DoesNotEqual","GreaterThan","GreaterThanEqual","LessThan","LessThanEqual","filterVal","strVal","Contains","DoesNotContain","BeginsWith","EndsWith","lastIndexOf","isModalSelection","announcedMessage","defaultRender","notReadyPropsRenderer","notReadyProps","_classNames","notReadyLabel","Sticky","stickyPosition","StickyPositionType","Header","isScrollSynced","onRenderColumnHeaderTooltip","tooltipHostProps","TooltipHost","nullRender","_selection","Selection","onSelectionChanged","selectedCommandBarProps","_buildCommandPropsOnSelection","_buildDataGridColumns","selectedSortColumn","sortByColumn","element","columnKeyToSortBy","modifyDataUsingDisplayFunction","componentDidUpdate","prevProps","prevState","_gridFilter","resetGridFilter","_detailListWrapper$ha","detailListWrapper","querySelector","hasAttribute","getSelection","getDisplayedItems","filterProps","dataIsLoading","dataGridfilterProps","searchResultsVisible","commandBarProps","displayedItemCount","filterField","searchBoxPlaceholder","searchBoxVisible","onItemDisplayedLabel","searchBoxAriaLabel","onChangeText","SearchBox","filterItem","onSearch","newValue","onClear","event","placeholder","Label","CommandBar","_extends","commandBar","searchResults","GridFilter","componentRef","onFilterApplied","_onFilterApplied","_onChangeModalSelection","ScrollablePane","_scrollablePane","scrollbarVisibility","ScrollbarVisibility","auto","scrollablePane","Announced","displayItems","onColumnHeaderClick","_onColumnHeaderClick","layoutMode","DetailsListLayoutMode","justified","constrainMode","ConstrainMode","unconstrained","onRenderDetailsHeader","_onRenderDetailsHeader","selection","selectionPreservedOnEmptyClick","ContextualMenu","Dialog","dialogContentProps","_getResizeDialogContentProps","TextField","_resizeColumn","DialogFooter","PrimaryButton","DefaultButton","list","columnModel","buildColumns","c","isCollapsible","newColumn","isPadded","isMultiline","columnActionsMode","ColumnActionsMode","hasDropdown","sortAscendingAriaLabel","sortDescendingAriaLabel","overflowButtonProps","selectionCount","Single","Multiple","getSelectionMode","hasSelection","selectionModes","hasStatusSelection","selectionStatus","_hasStatusinSelection","farItems","selectedIndices","getSelectedIndices","getItems","selectedIndex","DataGrid","flexDirection","flex","marginLeft","top","right","overflowY","marginTop","medium","clarityRequestSuccess","propertyCreateSuccess","propertyCreateFailed","propertyEditSuccess","invalidForm","invalidState","clarityRelinkSuccess","clarityRelinkFailed","clarityLinkSuccess","clarityUnlinkSuccess","clarityLinkFailed","propertyLoadError","propertyFormError","adUnitsFetchFailed","sitesFetchFailed","propertiesFetchFailed","failedToLoadSites","PublisherAccountUserCreate","trackingId","getEntity","wrapSendRequest","listEntity","SINGULAR_RESOURCE_ENTITIES_FOR_POST","AccountSKU","UserInvitation","NativeAdTemplate","ServingConfig","UserCreateFromInvitation","AdSenseMediationOptIn","Feedback","AddressValidation","PhoneVerificationGenerateCode","PhoneVerificationVerifyCode","postEntity","SINGULAR_RESOURCE_ENTITIES_FOR_PUT","AdSenseMediationToggle","putEntity","sendRequest","AdSenseAdUnitStatus","patchEntity","UserRoleUpdate","UserUpdateLanguage","deleteEntity","AdSenseDisconnectAdUnit","wrapRequestBody","bodyWrapper","SINGULAR_RESOURCE_ENTITIES","UpdateUserContactDetails","UpdateClarityProject","AdSenseConnectAdUnit","NotificationPreferencesUpdate","magicValue1","FilterContent","FilterDownloader","downloadUrl","basicResponse","magicValue","path","requestUrl","AdSenseMediation","AdSenseMediationHealthCheck","AdSenseMediationChooseGamNetwork","AdSenseUpdateAdUnitStatus","AdSenseMediationOptOut","modelClassName","overrideApiPath","entityClassName","WinRate","convertToTwoDecimalPlaces","ImpressionRequests","ImpressionsReturned","WinningBids","digits","rx","symbol","reverse","toFixed","nFormatter","toLocaleString","minimumFractionDigits","injectRouterWithIntl","withRouter","injectIntl","injectIntlWithObserver","injectRouterAndIntlWithObserver","injectIntlAndObserver","AdSenseOAuthStatus","FormLabelBase","disableHeading","disableAriaLevel","labelContent","labelRequired","noInfoButton","FormLabel","getLoginPageStore","getProfileStore","phoneVerificationGenerateCode","phoneVerificationVerifyCode","verificationCodeGenerationLimitReached","itemDisplayed","itemSelectedCount","teachingBubbleHeadline","teachingBubbleContent","dialogDismissBtnAriaDesc","createCmdbtnAriaDesc","addFilterCmdBtnAriaDesc","editCmdBtnAriaDesc","codeCmdBtnAriaDesc","deleteCmdBtnAriaDesc","tokenStatusCmdBtnAriaLabel","clarityStatusCmdBtnAriaLabel","activateCmdBtnAriaDesc","deactivateCmdBtnAriaDesc","copyCmdBtnAriaDesc","modifyColumnsCmdBtnAriaDesc","modifyColumnsPanelApplyButtonAriaDesc","editAdunit","changeTemplate","gridDataDownloadSuccess","gridDataDeletingItem","gridDataDeletingItemFailed","gridDataSubmittingChangingStatus","gridDataSubmittingChangingStatusFailed","gridDataDuplicatingFailed","gridDataDuplicating","RangeType","RangeTypeMessage","Custom","Today","Yesterday","SundayToday","MondayToday","Last7ExcludingToday","Last7FromSunToSat","pageTitle","submitSuccessTitle","submitSuccessMessage","submitSuccessButtonLabel","readOnlyPageTooltip","addressLine1","addressLine2","zipCode","phoneNumber","phoneNumberCountryCode","selectStatePlaceholder","previewTitle","previewDescription","profileAddressBannerBold","profileAddressBanner","profileAddressBannerWaitlist","phoneVerificationMethodSms","phoneVerificationMethodCall","phoneVerificationDialogTitle","emailVerificationDialogTitle","phoneVerificationDialogChoiceGroupLabel","phoneVerificationDialogNextButton","phoneVerificationDialogCancelButton","phoneVerificationDialogVerifyButton","phoneVerificationDialogBody","phoneVerificationDialogTermsAndConditions","phoneVerificationDialogPrivacy","phoneVerificationDialogResendCode","phoneVerificationDialogCallAgain","emailVerificationDialogCodeSent","phoneVerificationDialogSmsText","phoneVerificationDialogCallText","verificationDialogPlaceholder","phoneVerificationDialogSuccess","emailVerificationDialogSuccess","phoneVerificationDialogSuccessAlt","profileInvalidFieldsErrorMessage","profileInvalidAddressErrorMessage","profileAddressValidationFailed","generateVerificationCodeFailed","generateEmailVerificationCodeLimitReached","generatePhoneVerificationCodeLimitReached","generateEmailVerificationCodeFailed","getVerificationStatusFailed","verifyingGeneratedCodeFailed","generatedCodeInvalid","generatedCodeExpired","generatedCodeFailed","publisherProfileDetailsFailed","updatePublisherProfileDetailsFailed","failedToLoadPublisherDetails","failedToLoadProfileDetails","profileNeedsAttentionTitle","profileNeedsAttentionDesc","help","uploadDocument","notStarted","inReview","verified","actionRequired","notStatedPopup","inReviewPopup","failedToSubmitEvidence","backButtonAriaDesc","breadcrumbAriaLabel","pageMode","hasFormTitle","additionalHeightBoundary","overlayHeight","renderedOnPanel","FormState","InPageCreate","InPageEdit","InPageView","titleMarginLeft","buttonMarginBottom","mergeStyleSets","navBackButton","scrollablePanel","maxHeight","buttons","zIndex","bottom","marginRight","background","formTitle","breadcrumb","chevron","overlayStyles","getTheme","DetailPage","componentDidMount","LayoutMode","ContentOnly","helpId","onCancel","submitLabel","cancelLabel","navMessageLabel","onNavClick","submitButtonDisabled","hideSubmitButton","breadcrumbItems","hideNavButton","formTitleId","showOverlay","AcceptInvite","Overlay","ActionButton","iconProps","Breadcrumb","Main","Spinner","labelPosition","devConfigOnline","authority","clientId","postLogoutRedirectUri","redirectUri","msaTenantId","msaAuthority","prodConfigOnline","envBasedConfig","cache","cacheLocation","system","tokenRenewalOffsetSeconds","silentTokenRequestRedirectUri","authTokenRequest","scopes","silentTokenRequest","corpTenantId","accountEnvironment","HomePageStatus","PublisherServingConfig","PropertyServingConfig","PropertyServingConfigs","userLocales","adQualityLocales","reverseLocales","showDialog","isStatusLoading","isSetupDone","isFRECardShown","rootStyle","imageStyle","imageContainerStyle","descriptionStyle","titleStyle","FontWeights","semibold","ZeroResults","showDefaultImage","description","buttonText","onButtonClick","styleProps","defaultImage","shouldFadeIn","Link","to","getCurrentUserContext","getPrimaryUserId","_getCurrentPublisher","_getCurrentUserContex","getCurrentPublisher","extendedProperties","primaryContactUserId","getPageStore","getDimensions","getMetrics","getGranularity","useReportQuery","reportRequestBody","isDetailedReport","isError","useQuery","queryKey","queryFn","getReportData","AbortController","Data","onError","messageDescriptor","SUMMARY","intlMessageValues","toLowerCase","staleTime","refetchOnWindowFocus","refetchOnMount","refetchOnReconnect","useMediationReportQuery","requestBody","abortController","signal","aborted","getMediationReportData","adUnitsData","transformedData","matchingAdUnit","PubCenterAdUnitId","AdUnitName","mapAdUnitName","useReportMetadata","getReportType","grains","useMediationReportMetadata","getMediationDimensions","getMediationMetrics","getMediationGranularity","setBalanceIsDataLoadedAction","isDataLoaded","getPaymentsPageBalance","setEstimatedEarningsIsDataLoadedAction","getPaymentsPageEstimatedEarnings","setBalanceDataAction","setEstimatedEarningsDataAction","setAccountStatusDataAction","getAccountStatusData","setAccountStatusIsLoading","setXpayJwtToken","xpayJwtToken","xpayJwtTokenRequest","getPaymentsPageData","setXpayJwtTokenExpirationTime","tokenExpirationTime","xpayTokenExpirationTimeStamp","setXpayJwtTokenStatusIsLoading","xpayJwtTokenStatusIsLoading","COUNTRIES_LANGUAGE_MAPPING","AQ","BV","AN","PS","RW","WS","CS","UM","SS","EH","CURRENCIES_LANGUAGE_MAPPING","AUD","ARS","AZN","BDT","BGN","BHD","BRL","BWP","CAD","CHF","CLP","COP","CRC","CZK","DKK","DOP","DZD","EGP","ETB","EUR","FJD","GBP","GHS","GTQ","HKD","HRK","HUF","IDR","ILS","INR","IQD","JMD","JOD","JPY","KES","KRW","KWD","KZT","LBP","LKR","LTL","LVL","MAD","MUR","MWK","MXN","MYR","NGN","NOK","NZD","OMR","PEN","PHP","PKR","PLN","QAR","RUB","RWF","SAR","SEK","SGD","THB","TND","TOP","TRY","TTD","TWD","TZS","UGX","USD","UYU","VEF","VND","XAF","XCD","XOF","ZAR","ZMW","LANGUAGES_LANGUAGE_MAPPING","EN","DA","ZH","KO","HI","JA","TA","TE","LOCALE_LANGUAGE_MAPPING","SUPPORTED_LOCALES_MAPPING","TIMEZONE_LANGUAGE_MAPPING","WEEK_DAYS_LANGUAGE_MAPPING","setPublisherContext","appStore","publisherAsync","changedPublisher","createReturnUrl","onCurrentRouteChanged","currentRoute","onReportLinkClicked","onSetPublisherReporting","onReportingEnabled","ArrayObservableSchemaYupType","array","withMutation","transform","originalvalue","isType","StringListSchemaYupType","StringListTransformerYupType","stringToList","normalizePath","validateSchema","validate","abortEarly","stripUnknown","inner","EstimatedEarningsChartTypes","onDownloadButtonClicked","csvFileName","downloadType","onChangeItemsStatus","onItemsStatusChanged","onDeleteItem","preDeleteAction","deleteAction","postDeleteAction","onDuplicateItem","onDuplicateAction","getPublisherProfileRawData","getPublisherProfileActiveData","getProfileErrors","getPrimaryUserRawData","primaryUser","getPrimaryUserFullName","getPrimaryUserActiveData","getPublisherActiveData","isPrimaryUserDataPresent","isProfileEditable","isPublisherUnderReview","isPublisherRejectionUnappealable","getProfileActiveData","isProfileInEditMode","isInEditMode","isProfileSubmitted","isSubmitted","isPreviewShown","isPhoneVerificationMethodsShown","isVerificationCodeDialogShown","isPhoneVerificationCodeShown","isVerificationSuccessShown","isVerificationSuccess","isCodeBeingVerified","isVerificationCodeGenerationLimitReached","setDataInURL","currentSearchQuery","searchQuery","_URLSearchParams","history","replaceState","onPubCenterAADLogin","requestParams","onEmailChanged","onErrorsChanged","onLoginButtonClicked","onAuthPageInitialized","loginHint","onLoadingSet","onSwitchAccount","getDatesInRange","dateArray","currentDate","isDayInFuture","getToday","getYesterday","setDate","getSundayToToday","today","sunday","getDay","getMondayToToday","mondayOffset","monday","get7DaysExcludingToday","sevenDaysLater","yesterday","getLastSundayToSaturday","lastSunday","lastSaturday","getSelectedPeriodLabel","getSelectedStartingDate","range","toLocaleDateString","getSelectedEndingDate","getTime","getMonthlyCalendar","calender","prevMonth","prevYear","prevMonthDays","currentMonthDays","firstDay","isInCurrentMonth","fullDay","dayInNextMonth","nextMonth","nextMonthYear","getPresetDataTestId","preset","onInitializeGoogleAccount","onFinished","onMediateGoogleAccount","mediate","onConnectGoogleAccount","onDisconnectGoogleAccount","withSubHeader","gridContainer","GridPageLayout","Default","balance","estimatedEarnings","getAccountStatus","accountSettings","publisherPreferencesFailed","userPreferencesFailed","notificationPreferencesFailed","deletingUserSuccess","updatedNotificationPreferencesSuccessfully","deletedPublisherSuccess","invalidStateLoginOrReport","baseAddress","languageKey","timezoneKey","countryKey","adUnitTaxonomyKey","fetchResources","responseDataProcessor","onResponse","fetchResourcesWithLocalStorageCache","resourceCacheKey","supportedResourcesFromCache","getSupportedLanguages","getLanguages","getSupportedCountries","countriesData","countriesJson","countries","countryCodes","serviceLevels","serviceLevelKey","serviceLevelValue","serviceLevelNameIdMap","getCountries","getCountriesWithServiceLevel","getSupportedSubGeographies","stateData","subGeographyList","getSupportedTimezones","getTimezones","getSupportedAccountSkus","skuData","accountSKUs","getAdUnitTaxonomyValues","getTaxonomyValues","timezoneJson","timezones","timezoneData","timeZoneData","timezoneCode","languageJson","languages","languageData","languageCode","taxonomyJson","adUnitTaxonomyValues","attributeValues","taxonomy","getCurrentHashValue","hash","getUrlSearchParameter","urlQuery","parameter","TARGET_CUSTOMER_ID","resourceTitle","learnTitle","learnDescription","assistanceTitle","assistanceDescription","improveTitle","improveDescription","feedbackTitle","headLineGreeting","summary","thanksMsg","thanksMsgSubLine","ackMsg","ackMsgSubline","acceptButton","skipButton","submitting","goToAccept","unknown","twoWeekBuffer","dayBuffer","tncNotificationContent","onChangeConnection","connection","getGoogleAdSenseStore","onChangeMediationToggle","isToggled","isMediationEnabled","feedback","searchPlaceHolder","searchResultListAriaLabel","viewCategoryResult","viewAllResult","viewNoResult","viewCategoryResultsAriaDescription","entityInfoButtonAriaDescription","footerAriaDescription","getImageStyle","borderRadius","tooltipTitle","dismissButtonStyle","bodyStyle","padding","titleBar","footerStyle","left","footerWrapper","closeIcon","Card","titleText","showDismissButton","cardActions","cardTopBarActions","footerComponents","shimmerCustomElement","imageAlt","titleIconTooltipProps","titleId","Stack","alt","IconButton","enableScopedSelectors","horizontal","wrap","horizontalAlign","IconTooltip","tooltipMessage","tooltipText","Shimmer","customElementsGroup","onLanguageChanged","localStorageKey","PublisherType","fetchAccountById","fetchCcmtAccountById","urlParams","fetchAllMediumAccountSkus","allMediaTypes","MediaTypeString","mediaTypeKey","nonMappedMediums","mediumMappedSkus","enparams","allMediaType","fetchAllAvailableUsers","u","currentUser","googleConnectorMessages","settingsTab","googleAccountNotConnectedTab","googleAccountConnectedTab","googleAccountDetails","googleAccountConnectionStatus","googleAccountConnectedStatus","googleAccountVerifyingStatus","googleAccountFailedStatus","googleAccountConnectionDate","googleAccountMediateHeader","googleAccountMediateDescription","googleAccountConnect","googleAccountDisconnect","googleAccountRetry","monetizationDetails","monetizationInstructionHeader","monetizationFirstInstruction","monetizationSecondInstruction","monetizationThirdInstruction","monetizationReviewTOSandPP","monetizationPP","monetizationReviewAnd","monetizationTOS","grantOAuthConnectingProcessTerminated","googleConnectorMediationOperationEnabling","googleConnectorMediationOperationDisabling","googleConnectorMediationFailed","googleConnectorFailedToFetchAdSenseConnectionDetails","disconnectingGoogleAccountFailed","disconnectingGoogleAccountSuccess","connectGoogleAccountFailed","disconnectGoogleAccountFailed","initializeGoogleAccountFailed","googleAccountConnectedSuccessfully","getSupportedLanguagesDropDownOptions","supportedLocales","getSupportedLocalesMapping","supportedLanguages","localeCode","firstValue","secondValue","_SUPPORTED_LOCALES_MA","NOTIFICATION_RENDER_BUFFER","TEACHING_BUBBLE_NOTIFICATION_FLAG","SETUP_PAYMENTS_NOTIFICATION_FLAG","SETUP_PAYMENTS_CHEER_DIALOG_FLAG","SETUP_PAYMENTS_NOTIFICATION_ACTION_BUTTON_ID","SETUP_PAYMENTS_NOTIFICATION_ID","removePaymentNotificationBuffers","removeItem","setPaymentNotificationBuffer","usePaymentsOnboarding","onboardingContainerId","useId","xPayContainerRef","isSDKLoaded","setSDKLoaded","getAccountSettingStore","useSetTimeout","isInitializingXPayContainer","setFalse","onXPayInitializeResolved","useBoolean","isTeachingBubbleHandledPerUserSession","handleInitXPayContainer","succeed","teachingBubbleResponsiveStylings","setupNotificationButton","getElementById","setupNotificationButtonOGStyle","shouldRenderTeachingBubble","onInitializePaymentsPage","datePlaceholder","goToToday","prevMonthAriaLabel","nextMonthAriaLabel","prevYearAriaLabel","nextYearAriaLabel","isRequiredErrorMessage","invalidDateErrorMessage","invalidMinuteErrorMessage","invalidSecondsErrorMessage","pubcenterApp","initializeAuthContext","PublicClientApplication","clearAllCookies","cookie","toUTCString","authResponse","logoutPubCenterAADUser","_pubcenterApp$getAcco","getAccountByUsername","tid","postLogoutUrl","getPostLogoutRedirectUri","clientIdQueryStr","msaLogoutRedirectionUrl","msaLogout","_pubcenterApp$getAcco2","logoutRequest","logoutHint","login_hint","logoutRedirect","aadLogout","localStorageUnAuthLocale","clear","authenticateHeader","exec","claims","atob","loginPubCenterAADUser","redirectStartPage","extraQueryParameters","prompt","interactionStatus","clientIdInteractionStatus","handleInvalidInteractionStatus","redirectRequest","msaoauth2","loginRedirect","acquireAuthResponseAsync","request","usernameHint","_pubcenterApp$getActi","getActiveAccount","accountInfo","tenantId","homeAccountId","localAccountId","acquireTokenSilent","accessToken","getIdToken","idToken","handleLoginRedirectAsync","handleRedirectPromise","then","catch","getUserRoleFromUser","userRole","roleDetails","userRoleDetails","roleDetail","UserRoleEntityType","Customer","getUserRoleString","getFormattedUserRole","UserManagementMessages","UserRole","SuperAdmin","AccountManager","ReportUser","getUserRoleMapping","userRoleToRoleIdMap","orchestrator","fetchReportDimensionColumnMembers","msg","reportCardType","MEDIATION","columnMembers","mediatedWithAdSense","mediationStatus","Id","Value","DisplayName","setColumnMembers","getColumnMembers","metadata","isMetadataLoaded","mediationMetadata","ReportDataSource","TythonV2","Day","Hour","Month","Week","Year","MonthAndYear","sites","performance","mediationSummary","onUpdateNotificationPreferences","np","toggleBillingAlerts","toggleServingStatus","toggleProfileReview","toggleInvitedUsers","shouldRenderOnboardingPopup","onResolvedCallback","fetchPaymentsPageBalance","fetchPaymentsPageEstimatedEarnings","fetchAccountStatus","setLoadingStateAction","setPublisherProfileDetailsAction","publisherProfileDetails","_publisher$address","isDefaultAddress","lastUpdatedTimestamp","profileComplete","setPrimaryUserDetailsAction","primaryUserDetails","setPrimaryUserDetailsETagAction","userETag","setProfileEditModeAction","initializeProfileActiveStateFromRawDataAction","_active$user","_active$user2","_active$publisher","_active$publisher2","deepClone","postalAddress","setIsAddressValid","isAddressValid","setIsOrgAddressValid","isOrgAddressValid","setPrimaryUserFieldAction","fieldValue","contactInfo","phone1","setPublisherFieldAction","setProfileErrorsAction","setIsSubmittedAction","setIsPreviewShownAction","setIsPhoneVerificationMethodsShown","setIsPhoneVerificationCodeShown","setIsVerificationSuccess","setIsCodeBeingVerified","setPhoneVerificationMediumType","mediumType","verificationMediumType","setPhoneVerificationCode","setPhoneVerificationRequestId","requestId","setPhoneVerificationResp","respData","phoneVerificationResp","setVerificationCodeGenerationLimitReached","limitReached","invalid","tooltipHostStyles","warningMessage","PanelTypes","feedBackSuccessMessage","hidePanel","FeedbackType","getFeedbackPanelStore","Appreciation","isContactMeChecked","onFeedbackTypeChanged","onFeedbackTitleChanged","onFeedbackDescriptionChanged","onFeedbackEmailChanged","onFeedbackPanelErrorChanged","onFeedbackCheckboxChanged","removeEmail","onSavingChanged","_msg$hidePanel","ToastMessages","notificationMessages","severity","NotificationSeverity","titleMessageDescriptor","contentMessageDescriptor","notificationLabel","NotificationLabel","FeedbackErrorMessage","FeedBackInvalidFormMessage","feedbackThank","feedbackSupport","feedbackType","feedbackRate","feedbackRequired","feedbackSend","feedbackTitlePlaceholder","feedbackTellUsMore","feedbackTellUsMorePlaceholder","feedbackAllowContact","feedbackAllowContactPlaceholder","feedbackContactSupport","feedbackPrivacyStatement","feedbackMPS","feedbackCharacterCounter","feedbackTypeAppreciation","feedbackTypeFeatureRequest","feedbackTypeBugReport","feedbackTypeOther","feedbackDataCollection","supportTeamPlaceholder","deleteFeedbackDataFormSubject","WIDTH","OPTION_WIDTH","checkboxStyle","emailTextBoxStyle","buttonSection","button","characterCounterStyle","textAlign","size","links","textDecoration","choiceGroup","flexContainer","flexFlow","choiceGroupOption","choiceFieldWrapper","innerField","labelWrapper","field","renderFooterContent","panelProps","FeedbackPanelFooterButtons","FormattedMessage","onCancelClicked","_panelProps$onDismiss","FeedbackPanel","feedbackTypes","FeatureRequest","BugReport","Others","appName","connectToSupportTeam","ChoiceGroup","_","selectedKey","maxLength","currentCounter","limit","multiline","rows","Checkbox","checkedStateChanged","helpNotImplemented","NotificationCardBase","Informational","Warning","Critical","Announcements","date1","date2","numDays","previousDay","yesterdayLabel","twoDaysAgoLabel","threeDaysAgoLabel","isSameDay","hour","minute","getPreviousDay","onPrimaryActionClicked","onSecondaryActionClicked","timestamp","primaryActionText","primaryActionLink","dismissLabel","primaryIsExternal","secondaryActionText","secondaryActionLink","secondaryIsExternal","formattedTime","getFormattedDate","cardContainerStyle","headerRowStyle","leftContainerStyle","getIconName","iconStyle","rightContainerStyle","contentStyle","timestampStyle","buttonStyle","linkStyle","NotificationCard","ResponsiveSmall","borderBottom","border","messageCard","s1","notificationsNotImplements","dismissAll","dismiss","threeDaysAgo","twoDaysAgo","allSet","activityLogsHint","critical","informational","emptySection","textContent","panelParent","renderNotificationFooterContent","NotificationPanelFooterButtons","NotificationsPanel","PolicyUpdate","setNotificationPanelTriggered","ClarityLinkDeclined","ClarityLinkExpired","propertyBag","propertyId","clarityId","onResendClarityLink","primaryExternalNotificationLabels","getFormattedMessage","fallback","onRenderNotificationCard","_getFormattedMessage","intlContentMessageValues","_onDismiss","primaryActionTextMessageDescriptor","_onPrimaryActionClicked","_onSecondaryActionClicked","_isPrimaryExternal","criticalNotifications","warningNotifications","infoNotifications","errorNotifications","emptyNotifications","List","onRenderCell","ProfilePanel","settingsPageRoute","auditHistoryPageRoute","localStorageLocale","onUpdateUserLanguage","actionButtonsWrapper","dropDownWrapper","buttonStyles","pallete","rootHovered","iconHovered","iconPressed","getButtonStyles","dropdownStyles","borderWidth","signingUp","accessPermissions","getEntityAccessPermissions","hasAccessToAuditHistory","Persona","secondaryText","PersonaSize","presence","PersonaPresence","online","showSecondaryText","hidePersonaDetails","_onUserSettingsButtonClicked","_onAuditHistoryButtonClicked","Dropdown","_onUserLanguageChanged","dropdownWidth","profileSignOut","settingsNotImplemented","getAccessPermission","userRolesMap","PublisherSearch","titleContainer","emptyGridTextStyle","detailsHeaderRootStyle","regular","borderTop","borderRight","detailsRowRootStyle","animation","keyframes","animationDuration","disabledRowStyle","checkCell","alignSelf","columnHeaderCallout","columnHeaderIcon","modifyColumnDescription","panelButton","modifyColumnPanel","footer","columnCheckbox","columnTooltip","columnCheckboxWrapper","calloutFocusable","USER_MANAGEMENT_TAB_KEY","setHomePageStatus","profileStatus","siteStatus","adUnitStatus","isHomePageSetupComplete","setIsStatusLoading","setIsFRECardShown","EvaluationStatus","PublisherEvaluationStatus","EntityEvaluationStatus","EntityEvaluationErrorCode","appealableRejectionCodes","unappealableRejectionCodes","ToastIcon","DevTokenFetch","isPublisherProfileDataPresent","_getCurrentPublisher3","getPublisherEvaluationStatus","publisherEvaluationStatus","getPublisherCountry","_getCurrentPublisher4","getPublisherEvaluationApprovalStatus","_getPublisherEvaluati","getPublisherEvaluationRejectionCodes","_getPublisherEvaluati2","_getPublisherEvaluati3","rejectionCodes","getAppealableRejectionCodes","isPublisherProfileInComplete","Pending","isPublisherApproved","Approved","isPublisherRejected","Rejected","isPublisherRejectionAppealable","getAppealDocuments","_getAppealStore$appea","publisherEvaluationApprovalStatus","InReview","appealHistory","getAppealStore","appealStatus","reviewStatus","isPublisherActionRequired","getPublisherAccountType","_getCurrentPublisher5","publisherType","isIndividualPublisher","isOrganizationPublisher","_getAppStore$publishe","_getAppStore$publishe2","appealDocuments","isAppealInReviewForRejectionCode","rejectionCode","getAppealStatusForRejectionCode","rootRejectionCode","typeToRestore","obj","__proto__","mergeTypeWithObject","groupBy","getKey","collection","from","getEnumNames","results","k","res","deepEqual","obj1","obj2","convertType","keys1","keys2","hasOwnProperty","getEstimatedEarnings","getBalance","currencyCode","getXPayJwtToken","setPublisherEvaluationStatusAction","setPublisherEvaluationFetchFailedAction","isFailed","isPublisherEvaluationStatusFetchFailed","setPublisherRejectedMessageClosedAction","isPublisherRejectedMessageClosed","setPublisherEvalutionStatusToInReview","saveRawSettings","onSettingsChanged","_active$systemPrefere","_active$systemPrefere2","setEntityType","setNotificationPreferences","generateCodeAsync","updatePublisherDetails","validateAddressAsync","SMALLER_LIST_ITEM_HEIGHT","STANDARD_LIST_ITEM_HEIGHT","HEADING_ITEM_HEIGHT","yearly","monthly","XPayJwtTokenRequest","DayPickerStrings","months","shortMonths","days","shortDays","invalidInputErrorMessage","semanticColors","s","gridActionButton","primaryButtonBackground","primaryButtonBackgroundHovered","rootPressed","primaryButtonBackgroundPressed","gridCell","overflow","textOverflow","getGridClassNames","GridCell","setupPaymentButton","setupPaymentNotificationBoldedText","setupPaymentNotificationText","loadXPayContainerFailed","paymentCheerMessages","cheerMessageTitle","cheerMessageContent","cheerMessageButtonAction","cheerMessageButtonCancel","cheerMessageCancelArialabel","customLabel","todayLabel","sundayTodayLabel","mondayTodayLabel","last7FromTodayLabel","last7FromSunToSatLabel","ExternalLink","ConditionalTooltip","showTooltip","targetSelector","Fragment","isFeatureEnabled","Activated","container","gridTemplateColumns","forcedColorAdjust","headerSection","transition","ResourceCard","iconAlt","handleIconClick","wrapperRef","setIsFeedbackOpen","titleParam","ResourceSection","imgPreloadQueue","DocumentationIcon","SupportTeamIcon","FeedBackIcon","CMUIHeaderMenuItemSerializer","useCMUIHelpExperience","isFeedbackOpen","itemsData","getHeaderItems","panel","isFooterAtBottom","onRenderFooterContent","shouldOverflowUnderExtraSmallScreen","resources","showPanel","createPanel","_item$panelProps","Panel","headerText","PanelType","customWidth","isLightDismiss","_item$panelProps2","_item$panelProps2$onR","cloneElement","resource","mutator","isNotificationPanelTrigerred","isTrigerred","AdBlockPageLazy","lazy","LazyAdBlockPage","LazyComponent","lazyComponent","onFilterChanged","onFilterErrorChanged","onFetchFiltersLoading","onFetchingFiltersData","onFiltersFetched","onFormFilterNameChanged","onFormFilterTypeChanged","onFormChannelsChanged","onFilterChannelListChanged","onFilterUpdateTypeChanged","onfilterItemsEntryTypeChanged","onFormExludedUrlChanged","onFormExludedAdKeywordChanged","onFormExludedQueryKeywordChanged","onFormAppendExcludedUrlsChanged","onFormAppendExcludedAdKeywordsChanged","onFormAppendExcludedQueryKeywordsChanged","onFormDownloadClicked","onFormDownloadExcludedUrlLoading","onFormDownloadExcludedAdkeywordLoading","onFormDownloadExcludedQuerykeywordLoading","onFormFilterStartTimeChanged","onFormFilterEndTimeChanged","onFormResetTimeRange","onFormUndoTimeRange","onManagePageInitialized","getFilterStore","gridFilters","filterModel","channelsSelected","filterItemsEntryType","excludedUrls","appendExcludedUrls","appendExcludedAdKeywords","appendExcludedQueryKeywords","downloadExcludedUrlLoading","downloadExcludedAdkeywordLoading","downloadExcludedQueryKeywordLoading","filterStartTime","filterEndTime","UTCDate","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","startTimeStamp","endTimeStamp","getMultiStepperRoute","routeName","operation","step","showExtraBtns","page","MultiStepCreation","Create","base","filterDownloader","filterItems","setPublisherAndAccountContext","accountAsync","formState","adfilter","viewModel","FilterScope","severeWarning","f","localeDate","Edit","fetchFilterById","matchedFilter","excludedUrlsCount","blockedUrlCount","excludedAdkeywordsCount","blockedAdKeywordCount","excludedQueryKeywordsCount","blockedQueryKeywordCount","blockedUrls","blockedAdKeywords","blockedQueryKeywords","filterScope","timeZoneOffset","getTimezoneOffset","associatedChannelIds","is","otherwise","mixed","oneOf","oldDomain","scopeId","m","blockedAdKeywordsList","excludedQueryKeywordsList","excludedUrlsList","floor","startTime","endTime","BulkUploadBase","isCalloutVisible","uploadDescription","onUpload","bulkUploadDescription","accept","BulkUpload","DateTimePicker","minutes","seconds","getSeconds","datePickerWidth","minDateTime","maxDateTime","onDateTimeChanged","allowSecondsField","isOutOfBoundsErrorMessage","colonSeperator","hourPicker","minutesPicker","secondsPicker","datePicker","hourComboBoxOption","toDateString","minutesComboBoxOption","strings","DatePicker","allowTextInput","minDate","maxDate","onSelectDate","_date","ComboBox","_hours","allowFreeform","autoComplete","_minutes","_seconds","onChannelChanged","onChannelErrorChanged","onFetchChannelsLoading","onFetchingChannelsData","onChannelsFetched","onFormChannelNameChanged","onFormAdunitsChanged","onFormFiltersChanged","inputChannelName","inputAdunits","adunitPickerAriaDesc","channelId","inputFilters","filterPickerAriaDesc","editChannel","updateChannel","CreateChannel","initializeForm","channelAccessPermissions","_getChannelAccessPermission","_onSubmit","_onCancel","_isDisabled","MultiSelectPicker","adunitsSelected","initialSelectedItems","onSelectedItems","filtersSelected","permission","inputName","inputNameLength","createFilter","editFilter","filterId","accountFilter","publisherFilter","inputExcludedURLs","excludedUrlPlaceholder","inputExcludedKeywordAd","excludedKeywordPlaceholder","inputExcludedKeywordQuery","inputAttachChannel","channelPickerAriaDesc","navMessage","excludedItems","excludedDescription","manualEntry","fileUpload","excludedUrlDescription","excludeAdLevelKeywordsDescription","excludedQueryLevelKeywordDescription","excludedUrlBulkUploadDescription","exlcudedKeywordsBulkUploadDescription","exportButtonDesc","timeRangeSectionTitle","timeRangeSectionDescription","filterStartTimeLabel","filterEndTimeLabel","filterEndTimePlaceholder","resetTimeRange","undoTimeRange","filterUpdateType","nonAppendOnly","startDateErrorMessage","endDateErrorMessage","excludedItemsTextField","exportButton","panelHeader","inPagePanel","excludedItemsLabel","FilterExcludedType","CreateAdFilter","filterAccessPermissions","_getFilterAccessPermission","defaultSelectedKey","enableCreateButton","createButtonLabel","onCreateButtonClick","_excludedItemsTextField","_excludedItemsUploadField","onRenderNavigation","onRenderLabel","onRenderDescription","_onRenderTextFieldDescription","textFileLoading","_uploadFile","Url","AdKeyword","QueryKeyword","_formContent","excludedType","file","files","reader","FileReader","onloadstart","result","onloadend","readAsText","create","notFound","deactivateTitle","excludedURL","excludedKeywords","channelsNumber","channelNames","adfilters","dateRangeFilterName","zeroResultTitle","zeroResultDescription","getFilterItems","filterName","filterOptions","showNullsCheckboxLabel","filterDetails","startDateFilter","endDateFilter","includeNulls","getCommandBarItems","primaryButtonLabel","includeActions","new","includeFarActions","searchBox","ManagePage","getWindowSizeStore","gridDefaultColumns","onRender","_item$associatedChann","CommandBarButton","_appStore$publisher","_appStore$account","DeleteConfirmation","NoResultComponent","GridV2","dataGridProps","gridV2Columns","renderZeroItemsComponent","isGridReady","isDataLoading","paginationProps","shouldGridHandlePagination","AdFilterPage","Route","exact","onAdCreativeChanged","adcreative","onAdSourceChanged","adSource","onAdProviderChanged","onAdCreativeAccountChanged","onAdCreativeMarketChanged","market","onAdCreativeBlockedMarketChanged","onAdCreativeSearchBoxValueChanged","onAdCreativeStartDateChanged","onAdCreativeEndDateChanged","onAdCreativeRefreshDataChanged","onAdCreativeAdPerfDataChanged","onAdCreativeBlockPanelChanged","onAdCreativeExportClicked","onAdQualityPanelApplyButtonClicked","onTeachingBubbleStartDateStatusChanged","onTeachingBubbleEndDateStatusChanged","adPerfData","selectedAdProviderId","selectedAccount","selectedMarket","selectedBlockedMarketId","blockItemType","blockErrorMessage","startDatePlaceHolder","clearStartDateSelAriaLabel","adReview","noAdsPerfData","noBlockData","blockSummary","endDatePlaceHolder","clearEndDateSelAriaLabel","searchboxPlaceHolder","accountsCombo","marketsCombo","applyFilters","applyFiltersAriaDesc","blockAds","blockImages","viewImages","blockAdsMenuButtonLabel","blockImagesMenuButtonLabel","viewImagesDescription","blockSummaryMSGridAriaLabel","blockSummaryAuctionGridAriaLabel","adReviewGridAriaLabel","exportGrid","exportImageBlocks","enableBlocking","disableBlocking","adSourceCombo","auctionAdSourceCombo","microsoft","auction","xandrAuction","blockAdTitle","blockAdURL","selectChannel","selectMarket","createNewChannel","blockReasonCategory","blockReason","additionalDetials","editBlockReason","channelName","addAdnuits","disallowedByNCAP","maliciousAdvertiser","Misspellings","competitiveExclusion","badLandingPage","misleadingAdHeadline","sensationalAdOrLandingPage","offensiveAdOrLandingPage","wrongLanguageforMarket","prohibitedAdCategory","deceptiveAdvertiser","otherReasonCategory","disallowedContent","disallowedDeceptive","disallowedMisleading","disallowedOffensive","disallowedSuffering","disallowedDrugs","disallowedTobacco","disallowedSensitive","legalPrivacyAndSecurity","legalMalware","legalPrivacy","mediaFormats","mediaAnimation","mediaNudity","relevanceAndQuality","relevanceLandingPage","restrictedCategories","restrictedAdult","restrictedAlcohol","restrictedBeauty","restrictedDating","restrictedFinance","restrictedGambling","restrictedLegalServices","restrictedCompetitors","restrictedPharmacy","restrictedPolitical","restrictedSoftware","restrictedSolicitation","restrictedWeapons","textGuidelines","textAdFunctionality","textAdLanguage","textGrammar","imageNotRelevant","lowQualityImage","offensiveImage","policyIssue","altAdTitleListings","altAdUrlListings","altAdImageListings","loadingAltAdCreativeListings","noAltAdCreativeListings","moreImages","viewOnlyImageLabel","blockedLabel","verizonMediaWarningLabel","queryTimeoutWarningHeaderLabel","queryTimeoutWarningDescriptionLabel","auctionBlockAdIdLabel","advertiserId","filterPanelApplyButtonAriaDesc","blockRequestSource","adCreativeServiceLoadEntityFailed","adqualityInvalidState","adqualityFailedToBlockAds","adqualityBlockAdsMissingFields","adqualityUpdateBlockedAdsStatusFailed","adqualityBlockedAdsSuccessfully","adqualityBlockImagesFailed","adqualityBlockImagesSuccess","adqualityBlockImagesMissingFields","adqualityDownloadBlockedImagesFailed","adqualityDownloadBlockedImagesSuccess","adqualityDownloadAdContextFailed","adqualityNoDataToDownload","adqualityBlockedAdsDataDownloadSuccess","adqualityUpdatedBlockedAdsStatusSuccess","adqualityLoadListingAdDataFailed","adqualityLoadRevenueAdDataFailed","adqualityTimeoutQueringForData","adqualityProvideSearchTerm","adqualityAdPerformanceDataDownloadSuccess","adDescriptionCheckboxLabel","blockReasons","onAdCreativePageInitialized","onAdDescriptionChanged","onBlockAdsViewChanged","onBlockAdInitialized","isImageBlock","onBlockAdsSamChanged","onBlockAdsChanged","onBlockImageAdsChanged","onBlockAdsImagesChanged","needUrlProcess","onBlockAdsAdPerfDataCleared","onBlockAdsBlockedImagesChanged","isChecked","onBlockAdsChannelsAndRevenueChanged","onBlockAdsSelectedMarketChanged","onBlockAdsReasonLevelsChanged","formatter","onBlockAdsChannelsChanged","onBlockAdsSelectedBlockRequestSourceChanged","onBlockAdsRevenueChanged","onBlockAdsListingsChanged","onBlockAdsBlockReasonChanged","onBlockAdsBlockDetailsChanged","onAdListingPageSelection","onBlockAdsSubmitted","onMSANBlockAdsSubmitted","onSAMBlockAdsSubmitted","onBlockImagesSubmitted","onBlockAdsErrorChanged","onBlockImagesErrorChanged","onBlockAdsDataChanged","onSAMBlockAdsDataChanged","onSAMBlockSummaryViewImagesClicked","onBlockedImagesExportClicked","onBlockedAdsExportClicked","onBlockAdsItemStatusChanged","onSAMBlockAdsItemStatusChanged","onRefreshBlockSummary","onBlockSummaryStartDateChanged","onBlockSummaryEndDateChanged","onBlockedContextChanged","onBlockedAdsContextChanged","onBlockedImagesContextChanged","onFilterPanelShown","onFilterPanelHide","blockAdSamData","blockAdData","adURL","adDestUrl","blockImageAdData","adType","noImage","filteredImages","blockAdsView","selectedBlockRequestSource","blockReasonL1","dropDownValues","adListingsData","blockDetails","adListingSelectedPage","blockSummaryData","samBlockSummaryData","blockSummaryStartDate","blockSummaryEndDate","getBlockedAdContext","blockedDataUrl","adunitAdIdPair","getAdPerfData","createHeaderError","statusText","filteredAds","adPerformanceData","mapAdIdAdunits","mapAdIdAccounts","ad","blockedAdIdImages","_active$samBlockSumma","locales","_active$samBlockSumma2","blockedAdFind","blockedAd","Active","createAdBlock","toggleSAMBlockedAds","getBlockSummaryData","blockReasonParts","reasonCategory","blockReasonMainCategory","blockReasonSubCategory","getSAMBlockSummaryData","filterStatus","getBlockImagesData","BlockAdsData","BlockImagessData","BlockItemType","SAMBlockAdData","blockItemErrorModel","Ads","Images","onAdCreativeDateChanged","onTeachingBubbbleStatusChanged","block","reason","blockRequestSourceId","modifiedBy","modifiedDateTime","now","blockedAdContext","filterStatusId","samBlockSummaryParams","reasonCategoryString","reasonComment","filterSource","localeScope","createSAMAdBlock","filterImage","getSAMBlockImageData","adPerfForCSVFromTable","onDropdownValueChanged","heading","_getStore$filters$act","onTextBoxValueChanged","_getStore$filters$act2","onDeleteTextCondition","filterOption","rawFilters","splice","onListValueChanged","listValues","isSelected","onClearAll","filterListType","filterTextType","elem","elemList","onAdCreativeInitialAccountsChanged","_getStore$filters","rawAccounts","onAdCreativeInitialAdProvidersChanged","auctionAdProviders","_getStore$filters2","adProviders","onAdCreativeInitialMarketsChanged","auctionMarkets","_getStore$filters3","onActiveFilterValuesChanged","onRawFilterValuesChanged","lastElement","onSetIsAppliedForAllConditions","triplet","ConditionType","getAggregation","Text","textAggregation","idAggregation","getMultiTextValues","triplets","getAdQualityListValues","getIdListValues","getIdValues","converterIn","rawFilter","_filters$AdQualityFil","_filters$AdQualityFil2","_filters$AdQualityFil3","_filters$AdQualityFil4","_filters$AdQualityFil5","_filters$AdQualityFil6","_filters$AdQualityFil7","_filters$AdQualityFil8","_filters$AdQualityFil9","_filters$AdQualityFil10","_filters$AdQualityFil11","_filters$AdQualityFil12","uniqueCreativeAdIds","advertiserNames","adIds","advertiserIds","advertiserAccountIds","adTitles","adUrls","longHeadlines","shortHeadlines","adUnitIds","_result$Filters","_result$Filters2","_result$Filters3","_result$Filters4","defaultDateTimeLocal","setHours","defaultDateUTCBased","blockRequestSourcesPromise","getBlockRequestSources","adPerfDataPromise","blockSummaryDataPromise","d","blockRequestData","mappedBlockRequestData","blockRequestSourceName","abs","_getStore$active$endD","_getStore$active$star","param","adPerfDataEnhanced","activeFilters","apiErrorObj","selectedAds","handleAPIRequestsAndResponses","processChannelsResponse","toUpperCase","startDateRevenue","endDateRevenue","paramsLastSevenDayRevenue","processAdidRevenueResponse","getAdIdRevenue","fetchedRevenue","startDateDetails","endDateDetails","paramsAdDetails","processAdidDetailsRequest","responseListingsInverted","titlesInverted","urlsInverted","destUrlsInverted","adDestUrls","imagesInverted","listingSamplesMap","listingSamples","eachTitle","listingsWithTheTitle","entries","eachListing","sample","eachUrl","listingsWithTheUrl","adUrl","eachDestUrl","listingsWithTheDestUrl","eachImage","listingsWithTheImage","adImage","adimage","listingsCount","adListingItems","getAdIdDetails","fetchedAdDetails","deactivateBlockedAds","blockSummaryParams","blockReasonComment","blockedBy","blockSource","createImageBlock","reportedImages","blockImage","blockSummaryForCSVFromTable","blockImagesSummary","getInitialFilterList","filterListValues","_getStore$filters$raw","_getStore$filters$raw2","selectAll","deselectAll","ListFilter","checkBoxRow","onSelect","onSelectAll","onDeselectAll","areAllElementsSelected","lst","hasSelectedElements","onAddRawElementToList","onSelectChanged","onSelectAllChanged","_getStore$filters$act3","onDeselectAllChanged","_getStore$filters$act4","contains","doesNotContain","beginsWith","endsWith","equals","doesNotEqual","inputValue","addMore","selectFilter","TextFilter","onSelectFunc","onChangeFunc","simpleStringFilterTypeOptions","allStringFilterTypeOptions","optionType","defaultValue","MultiTextFilters","onSelectHandle","onChangeHandle","pair","onAddMoreClick","isLastPairCompleted","lastCondition","lastValue","AdQualityFilters","filtersItems","shouldShowHeadlines","filtersToRender","addTempConditionPair","onSelectAllHandle","onDeselectAllHandle","_active$AdQualityFilt","_active$AdQualityFilt2","_active$Markets","_active$filter","adSourceField","adSourceFields","filterFields","searchBoxItem","descriptionCheckbox","float","selectedClose","cancelIcon","applyButton","blockAdChannelButton","imageListTitle","outline","boxSizing","imageListSizer","imageListPadder","imageListLabel","imageListImage","adBlockPanelListingBox","borderStyle","adBlockPanelListingPaginatedBox","adBlockPanelListingPaginatedLeftItems","adBlockPanelListingPaginatedRightItems","adBlockPanelListingLightText","adBlockPanelListingCenterLightText","adBlockPanelListingLoadingBox","adBlockPanelListingNoneBox","pivot","itemContainer","formItem","formSection","commands","HEADLINE_ENABLE_DATE","AdCreativePage","adSourceOptions","useComboBoxAsMenuWidth","_createDropDown","_createLocaleOptions","providersToNames","unshift","_gridDefaultColumns","_gridImageDefaultColumns","_commandBarProps","_getBlockDataSelectionItems","_datagrid","onRenderItemColumn","_renderBlockSummaryItemColumn","_getSAMBlockDataSelectionItems","_renderSAMBlockSummaryItemColumn","_renderAdProviderOptions","xandrAuctionAdProviders","last3Months","setMonth","isRequired","onChanged","boxSide","_renderFilterPanel","TeachingBubble","directionalHint","DirectionalHint","bottomLeftEdge","hasSmallHeadline","hasCloseIcon","headline","descriptionLabel","_getSelectionItems","_renderAdCreativeItemColumn","_filterItems","onFilterMenuCalloutClose","initialFilterListValues","showClearAll","hideCallout","smallFixedFar","listFilters","isViewOnly","FocusZone","renderedWindowsAhead","getItemCountForPage","_getItemCountForPage","getPageHeight","_getPageHeight","_onRenderImage","autoAdjustHeight","reasonsCategoriesL1","isGeminiAd","_getCurrentlySelectedListingPageItem","Pagination","totalPageCount","onPageChange","_createBlockRequestSourcesDropdown","_createBlockingMarketsDropdown","itemIndex","surfaceRect","_columnCount","_columnWidth","_rowHeight","itemNumber","Pivot","linkSize","onLinkClick","PivotItem","itemKey","_filterFields","_adPerfDataGrid","_blockAds","_blockImages","_blockSummaryPageFields","_SAMBlockSummaryDataGrid","_blockSummaryDataGrid","listingSample","currentSelection","sameAds","adData","imageElements","reasonDetails","fieldContent","_getStore$active$bloc2","imageListLength","mergeStyles","placement","adProviderEnum","destUrl","accountList","availableLocales","LOCALE","adQualityLocale","availableMarkets","blockRequestSources","AdQualityPage","InventoryPageTabs","useEntityTypeManage","activeSubTab","setActiveSubTab","Sites","Apps","apps","useStyles","makeStyles","rowGap","divider","spacer","onTabSelect","selectedValue","siteTabLabel","appTabLabel","FluentProvider","webLightTheme","TabList","onTabSelected","Tab","Divider","pending","siteId","propertyUrl","adUnitCreationDate","higherMonetization","higherMonetizationEnabled","higherMonetizationNotSetup","marketClassification","ownedAndOperatedCore","ownedAndOperated","syndicated","selectTier","sponsored","sponsoredEnhanced","mediationCardNoConnectionHeader","mediationCardNoConnectionDesc","mediationCardNoConnectionC2A","mediationCardConnectedHeader","mediationCardConnectedDesc","mediationCardConnectedC2A","changeName","zeroAdUnitsTitle","zeroAdUnitsDescription","zeroAdUnitsCallToAction","prepareAdUnitsGrid","nativeAdOnboardingMsg","saveAdunitFailed","adUnitInvalidId","adunitMediationUpdateStatusFailed","adunitDetailsFailedToLoad","adunitTemplateFailedToLoad","failedToLoadAdunits","failedToLoadAdunitsMediationStatus","failedToLoadAdunit","failedToFetchAdSenseAdunit","noConnectionWithAdSense","editedAdunitSuccess","adunitNameInvalid","createAdunitFailed","createAdunitInvalidState","AdUnitCallout","calloutStyles","textFieldContainer","spinnerStyles","buttonsContainer","visibleCallOut","Callout","callOutMessages","setInitialFocus","onScriptPageInitialized","adunitId","onScriptChanged","onCopyScriptIconChanged","onCopyCodeIconChanged","onScriptPageSubmitted","onScriptPageFormCleared","View","MultiStepEdit","isEditing","isCreating","isInPageForm","noCodeFound","setUpTemplate","noScriptDesc","NoScriptPage","NoCodeFound","setupTemplateRedirectionInPageView","_props$goToStep","goToStep","setupTemplateRedirectionFromPanel","getScriptPageStore","copyScriptIcon","copyCodeIcon","AdunitServingScript","tips","subTitle1","scriptPlacementInfo","subTitle2","copyCodeButton","copyScriptImageAlt","scriptCodePasteGuideline","copyCodeButtonDescription","doneButtonLabel","backButtonLabel","failedToFetchScript","inValidStateInScriptPage","AdUnitDoesNotHaveTemplate","pageWidth","tipsText","scriptWithImage","scriptSectionLeft","messageBar","scriptBox","scriptHolder","whiteSpace","wordBreak","_getClassNames","NativeAdScriptPage","_getAdunitStore$activ","scriptRaw","_props$siteId$toStrin","_props$siteId","_props$siteId$toStrin2","shouldManualTriggerInitialization","shouldRenderComponent","headerScript","adRenderingCode","_originalScript$match","originalScript","adUnitIdMatch","adUnitSnippetSerializer","querySelectorAll","innerText","focus","onCopyScriptClicked","navigator","clipboard","writeText","scriptPlacementImage","onCopyCodeClicked","CodePanel","_scriptProps$adunitId","uploadBoostTemplate","downloadTemplate","adunitType","marketPlaceOptionCore","marketPlaceOptionRest","marketPlaceOptionSyndicated","marketPlaceOptionSelectTier","marketPlaceOptionsSponsored","marketPlaceOptionsSponsoredEnhanced","adunitNameLabel","adunitIdLabel","marketplaceLabel","businessModelLabel","businessModelLevel2AriaLabel","distributionPartnerCodesLabel","distributionPartnerCodesLabelDescription","distributionPartnerCodesTextfieldPlaceholder","updateAdUnit","continueAdUnit","cancelAdUnit","previousStepAdUnit","channelTitle","propertySectionTitle","advOptionTitle","createChannelButton","servingTierTitle","servingTierOptionLowcost","publisherGroupConfigLabel","publisherGroupConfigOptionDefaultPlus","publisherGroupConfigOptionDefault","publisherGroupConfigOptionGeneralist","publisherGroupConfigOptionYieldOptimizer","publisherGroupConfigOptionYieldMaximizer","publisherGroupConfigOptionBingandYahoo","publisherGroupConfigOptionLowQualityDistribution","publisherGroupConfigOptionMediumQualityDistribution","publisherGroupConfigOptionHighQualityDistribution","privateMarketplaceLabel","privateMarketplaceTextfieldLabel","privateMarketplaceTextfieldPlaceholder","promotionRadioOptionLabel","promotionOptionTextfieldLabel","promotionOptionTextfieldPlaceholder","boostRadioOptionLabel","boostOptionTextfieldLabel","boostOptionTextfieldPlaceholder","propertyName","propertyButton","siteButton","websiteUrl","propertyDefaultOptionText","propertyDefaultNotFound","siteDefaultNotFound","createPropertyButtonLabel","propertySearchPlaceholder","businessModelLevel1DefaultOptionText","businessModelLevel2DefaultOptionText","propertyPickerEmptyOptionLabel","createPropButtonAriaDesc","propertyOptionsAriaLabel","propertyPickerSearchBoxAriaDesc","propertyPickerItemSelectedAnnounceMsg","createAdunit","newAudienceAd","nativeAdOptionLabel","searchAdOptionLabel","otherAdOptionLabel","nativeAdDesc","seeExample","comingSoon","templatePanelTitle","mediationHeader","mediationDescription","mediationToggleLabel","nativeAd","nativeAdSubContent","displayAd","displayAdSubContent","nativeAdConfigLabel","nativeAdConfigLabelFont","nativeAdConfigLabelTitleColor","nativeAdConfigLabelBackgroundColor","nativeAdConfigLabelButtonBackgroundColor","nativeAdConfigMsgBarContent","displayAdMsgBarContent","displayAdMsgBarLink","adPreview","adPreviewHorizontal","adPreviewVertical","adPreviewContainerSize","warningAdUnitTypeNotSelected","warningAdUnitTypeNotFullySelected","saveAndGetCode","finishAdUnitCreation","comingSoonMsg","selectDisplayAdLayout","displayAdPreviewHeadline","displayAdPreviewTextContent","displayAdPreviewLearnMoreButton","displayAdPreviewExamplePrimaryTitle","displayAdPreviewExampleSecondaryTitle","displayAdPreviewExampleTertiaryTitle","nativeAdPreviewPreviewTitle","nativeAdPreviewPreviewUrl","createAdUnitSuccessNotification","editAdUnitSuccessNotification","duplicatedSiteCreationErrorToastNotification","failedLoadAdUnitNotification","displayAdHorizontal","displayAdSqaure","displayAdVertical","settingUpAdunitMediationSuccess","removingAdunitMediationSuccess","updateAdunitFailed","loadTythonAdunitFailed","settingUpAdunitMediationFailed","removingAdunitMediationFailed","createPropertyFromAdunitFailed","createSitePanelAccessibilityAnnouncement","panelCloseButtonAriaLabel","fetchAdunitById","fetchAdunitMediationStatus","pubcenterAdUnitIds","adUnitNotConnectedStatus","updateAdUnitGrid","isMediated","shouldAvoidAdUnitViewState","adUnitsRawData","disableAdunitMediationStatus","isAppItems","nonTythonFilters","tythonFilters","_dataRow$mediatedWith","nonTythonItems","getCustomCommandBarItems","direction","before","commandBarButtonAs","tythonItems","primaryButtonUrl","onPreDeleteItems","_deletedItem$mediated","deletedItem","HeaderInfoCallout","headerInfo","bottomCenter","hoverCardStyles","HoverCard","plainCardProps","onRenderPlainCard","HoverCardType","plain","sticky","loadingGrid","hoverCardHost","actionButtonsContainer","monetizationUnderline","mediationHelpIcon","onBoardingMsg","FormatMessage","Styles","History","getCallOutContent","_item$mediatedWithAdS","callToActionLabel","editRouter","getServingStatusLabel","servingStatusType","ServingStatus","adManagementMessages","ServingStatusLabel","withParentLayout","abortDataFetch","tythonUser","setAdUnitCallout","propertyServingConfigs","isAdSenseConnected","commonColumns","_getGridPropertyStore","NotServing","config","shimmerWrapper","nonTythonEditAdUnitOptions","editAdUnitOptions","editButtonOnClick","menuProps","tythonColumns","isShowingDisabled","onRenderHeader","_item$mediatedWithAdS2","leftTopEdge","instantOpenOnClick","trapFocus","nonTythonColumns","adUnitsGridReady","adUnitsGridData","pageContent","inventoryPlatformType","InventoryPlatformType","UWP","appAdunitCodePanelTitle","appAdunitManagePageGridTitle","gridColumnTitleAppName","gridColumnTitleAppId","gridColumnTitleConnectedApp","gridColumnTitleAdUnitPlatform","gridColumnTitleAppAdUnitStatus","gridColumnTitleIssues","gridColumnTitleActions","gridCreateButtonLabel","propertyInventoryTypeLabelUWP","useAppAdUnitCodePanelStyles","textArea","textAreaWrapper","shorthands","tokens","spacingVerticalM","codeBlocOnlyTextWrapper","copyButton","spacingHorizontalXXL","spacingVerticalXXL","additionalCodeArea","useAppAdUnitCodePanel","renderCodeBlockOnly","setIsPanelOpen","codeContent","setCodeContent","adunitCode","setAdunitCode","configCode","setConfigCode","onPanelTrigger","codeForAdUnit","codeForConfig","isContentCopied","setIsContentCopied","codeBlock","mergeClasses","appearance","onMouseLeave","Button","Checkmark16Regular","Copy16Regular","Textarea","resize","OverlayDrawer","onOpenChange","DrawerHeader","DrawerHeaderTitle","Dismiss24Regular","DrawerBody","InventoryPlatformTypeLabel","useAppAdsGrid","servingConfig","_getGridPropertyStore2","_getGridPropertyStore3","_getGridPropertyStore4","_getGridPropertyStore5","commandBarItems","adUnitPanelProps","AppAdUnitCodePanel","TythonAppManagePage","getWindowsAppFeatureFlagStore","SiteAdsManageView","AppAdsManageView","AppAdsManagePage","EntityTypeSwitch","adUnitType","propertySelected","createPropertyPanelOpen","storeIds","template","isImpressionFeedbackRequired","adSenseConnectionState","Success","googleAdSense","connectionStatus","parsedPublisherId","parsedAccountId","setTemplate","adUnitid","loadPropertiesServingConfigs","propertyServingConfig","fetchPropertiesServingConfigs","fetchPropertiesDataAction","_adUnitsRaw$data","creationDate","_adUnitsRaw$data2","pubcenterAdUnitId","AdUnitMarketClassification","Syndicated","PublisherGroupConfig","DefaultPlus","tythonRole","AdUnitType","Native","_viewModel$properties","_viewModel$channels","BoostTemplate","channelIds","classification","existingFinancialClassification","financialClassification","attributes","Taxonomy","requireImpressionFeedbackForBillableTraffic","publisherGroupConfiguration","servingCostTier","p","StepState","requiredFeedbackSignalsLabel","requiredImpressionFeedbackSignalOptionLabel","defaultAdUnitName","adunitErrorInForm","createdAdunitSuccess","loadPropertyFailedInAdunit","PartnerCodesValidationSchema","matches","partnerCodeList","integer","rpsGuarantee","AdUnitRPSGuarantee","Search","Dirty","_adUnitsGrid$find","adUnitsGrid","_entity","_entity2","isBoost","errMsg","urlParamsConnect","enableAdunitMediationStatus","fetchAdSenseAccount","googleAdSenseActive","adUnitOriginalStatus","updateAdunitMediationStatus","_active$name","adUnitData","listItem","listItemLabel","PropertyPicker","Component","announceItemSelected","isCreateButtonDisabled","onListItemClicked","createButtonAriaDescription","searchBoxAriaDescription","itemSelectedAnnounceMessage","listItems","emptyOptionLabel","underlined","_onCallSuggestionsChanged","preventDismissOnScroll","shiftKey","FocusZoneDirection","vertical","isCircularNavigation","adUnitSiteLoading","textDecorationColor","green","searchContent","iconContainer","PropertySitePicker","searchText","clearSearchOnSelect","getCreatePropertyStore","PropertyIdField","onPropertyChanged","onPropertyErrorChanged","approvalStatusComments","onIdChanged","onNameChanged","onUrlChanged","onClarityChanged","onClarityIdChanged","onEditClarityId","clarityEdit","onSettingClarityErrorMessage","clarityErrorMessage","GetPropertyAccessPermission","IsDisabled","inputPropertyName","inputSiteName","propertyNameLength","PropertyNameInputField","propertyAccessPermissions","accessLevel","inputRef","getElementsByClassName","siteUrl","websiteUrlExample","websiteUrlInvalidMsg","PropertyUrlInputField","pattern","prefix","createSitePageTitle","editSitePageTitle","useDetailsPageButtonsStatus","isTythonUser","isSubmitButtonDisabled","_active$tythonClarity","tythonClarity","connectingClarityApprovalTython","_active$tythonClarity2","clarityType","ClarityType","Behavioral","_active$tythonClarity3","Fraud","onHandleSubmit","_active$clarity","_active$clarity2","onHandleCancel","fetchPropertyById","updateLoadingStatus","PropertyMessages","rawProperty","parentId","parentName","associatedAdUnitIds","clarityProjectId","originalClarityId","ClarityStatus","clarityLinkingEnabled","NotConnected","PropertyApprovalStatus","form","isEditMode","duplicateName","duplicateDomain","AutoApproved","UnderManualReview","nonTythonPropertyErrorModel","errorCount","enableMicrosoftClarity","adunitStore","adunitPropertyList","getClarityErrorMessage","PropertyEditFailedNotification","formOperation","loadAttachedAdUnits","onApprovalStatusChanged","onApprovalStatusCommentsChanged","comments","onAttachedAdunitsChanged","onEnableClarityToggleChanged","_clarity$originalClar","publisherFullInfo","SelfServe3rdParty","propertyServingConfigForProperty","ClarityErrors","onClarityUpdate","updatedProperty","updatedProperties","ClarityProjectNotLinked","ClarityProjectUnlinkingFailed","projectId","linkingNote","cancelledStatus","pendingStatus","declinedStatus","expiredStatus","ClarityInputField","isShownInPanel","existingId","isEditable","note","light","shouldShowNote","Declined","Expired","Cancelled","_active$id","getLinkStatusNote","ConnectedClarityField","clarityProjectDetails","clarityProjectResendButton","ClaritySection","clarityConfigs","showToggle","showInput","getClaritySection","inlineLabel","approved","autoApproved","rejected","manualreview","GetApprovalStatusOptions","PropertyApprovalStateField","PropertyApprovalStatusInputField","pickerAriaDescription","createButtonAriaDesc","addAllAriaDescription","removeAllAriaDescription","addIconAriaLabel","removeIconAriaLabel","expandGroupAriaLabel","selectedListAriaLabel","HierarchicalMultiSelectPickerBase","htmlFor","_id","searchBoxPlaceHolder","initialSearchBoxPlaceHolder","expandedGroup","_searchBoxPlaceHolder","css","itemsPane","disabledPanel","_onSearchChange","subPane","_renderGroupsPane","VerticalDivider","_renderSubItemsPane","onFilteredItemsLabel","groups","_createGroups","subItemsPane","headerLabel","group","disabledListItem","_onGroupExpandedClick","iconButton","subItems","renderAddAll","textButton","_onAddAll","groupName","onSubItemsLabel","_onItemAddedClick","onSelectedItemsLabel","renderRemoveAll","_onRemoveAll","groupSubItems","startIndex","groupHeader","groupHeaderIcon","selectedPaneItem","_onItemRemovedClick","_getIndexOfItemAtElement","remainingSelectedItems","queryName","allItems","collectionA","collectionB","currentGroup","itemColumnValue","level","_getIntersection","intersectedSelectedItems","availableItems","_onRenderLabel","hasErrorMessage","picker","_renderItemsPane","_renderSelectedItemsPane","DelayedRender","el","getAttribute","HierarchicalMultiSelectPicker","errorText","AnimationClassNames","slideDownIn20","headerTitle","adUnitPickerAccountsCountLabel","adUnitPickerAdUnitsCountLabel","PropertyAttachedAdUnitsField","isExpanded","CreateProperty","isInPanel","savingProp","setActivePropertyId","TemplateTypeNumber","BYTE_UNITS","convertSizeToReadableUnits","numberOfBytes","exponent","approx","nonCSVFileUploadError","uploadSizeLimitError","uploadError","uploadFile","fileUploadContainerStyle","red","fileInputStyle","fileUploadLabelStyle","csvTemplateLinkStyle","fileUploadDescriptionStyle","opacity","fileUploadedStyle","uploadStatusStyle","actionContainerStyle","errorStyle","progressContainerStyle","flexGrow","ACCEPTED_FILE_EXTENSION","FileOperation","BoostJsonFileUpload","onNewFileUpload","onReplaceFile","isUploadInProgress","setIsUploadInProgress","fileUploadError","setFileUploadError","fileUploadStats","setFileUploadStats","fileReader","fileOperation","handleReplaceFile","Replace","handleFileUpload","handleNewFileUpload","NewUpload","readableSize","readerInstance","errorDiv","innerHTML","JsonObject","numberOfAds","assets","renderingConfig","boostFileValidation","prevValue","cancelUpload","abort","ProgressIndicator","renderUploadInProgressSection","renderFileUploadedSection","jsonLink","ParsedBoostTemplate","dataStr","alert","mediationPopupMessages","turnOff","OptOutMediationPopup","PopupCard","isShown","AdUnitOptOut","popUpTitle","popUpDescription","primaryButtonAriaLabel","secondaryButtonAriaLabel","onPopupDismiss","onPrimaryButtonClick","onSecondaryButtonClick","DEFAULT_AD_PREVIEW_FONT","DEFAULT_AD_PREVIEW_BACKGROUND_COLOR","DEFAULT_AD_PREVIEW_BUTTON_BACKGROUND_COLOR","DEFAULT_AD_PREVIEW_TITLE_BACKGROUND_COLOR","TythonAdTypes","TythonAdUnitDisplayAdTypeLayout","TythonAdUnitDisplayAdTypeLayoutLabel","Horizontal","Square","Vertical","NUMERIC_FIELDS","useAdUnitTypeSelector","adTypes","nativeProperties","buttonBackground","titleColor","adDimensions","setAdDimensions","displayAdLayout","setDisplayAdLayout","HorizontalUpperAdPreview","VerticalLeftAdPreview","SquareLeftAdPreview","HorizontalBottomAdPreview","SquareBottomAdPreview","VerticalBottomAdPreview","adPreviewHeight","adPreviewWidth","adPreviewConfig","adHeight","adWidth","isNativeAdActive","isDisplayAdActive","shouldRenderNoSelectionMsg","shouldRenderFewerSelectionMsg","Display","onToggleAdType","currentType","onDisaplayAdLayoutChange","onAdPreviewConfigChange","nativePropertyConfigs","onToggleDisplayAd","onToggleNativeAd","isDisplayAdHorizontal","isDisplayAdSquare","isDisplayVertical","l1","adtypesTitle","businessModelLevel2Dropdown","dropdown","combobox","multiSelectPicker","propertySection","siteSection","boostUploadDiv","boostUploadOuter","advanceOptionTextfieldLabel","formAction","propertyDetails","adTypeContainer","servingTierChoiceGroup","checkbox","adTypeChoiceGroupOption","textBox","mediationToggle","adunitTypeAccordionWrapper","WebkitUserSelect","MozUserSelect","msUserSelect","adunitTypeAccordionCheckboxLabel","adunitTypeWarningMsgBar","adunitTypeAccordionContentWrapper","adunitTypeLeftSection","adunitTypeRightSection","previewSDKWrapper","overflowX","adunitTypeFormTitlePrimary","boldFieldTitle","horizontalSelectionWrapper","infoMsgBar","expandIcon","newPropertyPanelHeader","adPreviewWrapper","mediationDescriptionWrapper","adunitTypeDisplayAdPreviewHead","adunitTypeDisplayAdPreviewHeadButtons","borderLeft","adunitTypeDisplayAdPreviewContainer","adunitTypeDisplayAdPreviewLayoutWrapper","verticalAdPreviewBottomWrapper","displayAdPreviewExampleTitle","CreateAdunit","propertyMessages","headerTextProps","adunitAccessPermissions","selectedChannels","adUnitAccessPermissions","selectedProperty","_store$active$serving","ChoiceGroupOption","AdUnitServingTier","lowCost","handlePrivateMarketPlace","PrivateMarketplace","InHouse","privateMarketPlaceCheck","Boost","Generalist","YieldOptimize","YieldMaximize","BingYahooOAndO","LowQualityDistribution","MediumQualityDistribution","HighQualityDistribution","childrenGap","_getAdvertisersWhitelistTextFieldPlaceholder","_onRenderAdvertiserWhitelistLabel","businessModelLevel1Key","dropdownoptions","level1BusinessModel","parentValue","_getAdvertisersWhitelistTextFieldLabel","downloadTemplateMounted","marketPlaceDropdownOptions","OwnedAndOperatedCore","OwnedAndOperated","Sponsored","SponsoredEnhanced","SelectTier","businessModelDropdownOptions","businessModelLevel2Key","selectedBusinessModel","parentBusinessModel","_getAdUnitAccessPermission","_getPropertyAccessPermission","addProperty","renderAdunitDetails","_store$active$id","_tythonUser","_fetchBusinessModelLevel2Options","isValidPublisherForFeedbackSignals","InternalPremium","ManagedPremium","_channelList","_propertyPicker","Empty","_propertySitePicker","_advancedOptions","_renderPropertyPanel","_getSubmitLabel","submitButtonLabel","popupProps","onPrimaryClick","onSecondaryClick","AdUnitMediationSelector","activeAdunit","toggleIsLoading","onAdunitMediationChange","shouldRenderMediationOptOutPopUp","setShouldRenderMediationOptOutPopUp","mediationEnabled","AdUnitNameInputField","errorMsg","StepperDirection","weight","circleAbstract","verticalStepStyles","stepBlock","stepTitle","stepTitleSelected","circleWrapper","circleLabel","circleSelected","circleMarked","barStyle","horizontalStepStyles","Step","totalSteps","updateStep","isMarked","isLastChild","stepWrapper","Stepper","labelArray","currentStep","isStepMarked","stepperGoToFutureStepError","_fonts$mediumPlus","ResponsiveMedium","mainContainer","leftPane","rightPane","leavePagePopupMessages","stayOnPage","leavePage","LeavePagePopup","Leaving","useStepperLogic","steps","startAt","backToBase","goToErrorMessage","setCurrentStep","stepsState","setStepState","fill","updateStepState","newState","_URL","searchParams","isStepDirty","allowFreeNavigation","freeNavigationErrorMessage","nextStep","stepUpdater","prevStep","_steps$currentStep$on","_steps$currentStep","onNext","previousStep","navigateBack","getStepperTitle","getBreadCrumpTitle","DetailPageWithStepper","openStep","onReduceData","idx","nextBtnLbl","getSubmitLabel","isNextDisabled","previousBtnLbl","getCancelLabel","extraButtons","isFormValid","tythonPropertyErrorModel","isEditOperation","clarityProjectIdForTython","_msg$onSubmit","adsText","adsTextExplanation","adsTextObligation","createAdsTxtStepTitle","addpubCenterToFileStepTitle","stepOne","stepTwo","stepThree","downloadFilePrefix","downloadFile","addingFileToRootDirectoryStep","verifyingFileStep","addpubCenterToFileStep","poolImage","stepHeader","AdsTextPage","_URL$createObjectURL","Blob","fileIcon","_URL2","createObjectURL","fishpool","imageFit","propertyConfigs","_p$clarityConfig","_p$clarityConfig2","_p$clarityConfig3","clarityConfig","_p$clarityConfig4","originalClarityType","approvalBehavioralOption","onClarityTypeChanged","onApprovalBehavioralTC","isApproved","microsoftClarity","microsoftClarityTC","microsoftClarityPrivacy","microsoftClarityInformation","microsoftClarityTermsOfUse","advancedOptionHeader","advancedOptionDesc","advancedOptionApproval","basicOptionHeader","basicOptionDesc","existingClarityOptionHeader","existingClarityOptionDesc","advantageOneHeader","advantageOneDesc","advantageTwoHeader","advantageTwoDesc","advantageThreeHeader","advantageThreeDesc","recommendationTag","sidePanelPending","sidePanelDeclined","sidePanelExpired","sidePanelCancelled","wrapper","wrapperTitle","section","sectionDetails","disabledSection","sectionSelector","marginBlockStart","marginBlockEnd","desc","overflowWrap","advantageWrapper","advantageHeader","advantageSection","imageWrapper","panelPending","panelProjectIdApprovedSection","ClarityOptions","chosenType","isChosen","checkMark","getWindowStore","getAdvantage","getChoiceImage","imgSrc","imgAlt","onOptionClick","preventDefault","underline","richBehavior","privacy","codeFree","existingClarity","br","getInformationMessage","onClarityProjectChanged","getPropertyScriptPageStore","subTitle","microsoftConnectedClarity","microsoftClarityConnectedAccountNotice","microsoftClarityEmailSentNotice","scriptPageInvalidState","scriptPageFailedToLoadClarityProject","_propertyConfig$clari","propertyConfig","ResponsiveExtraSmall","clarityContainer","claritySection","claritySectionTitle","marginButtom","panelPendingText","PropertyScriptPage","HEADER_SCRIPT","clarityLogo","processNameCreate","processNameEdit","CreateSiteStep","AdsTxtCreationStep","GetCodeAndFinishStep","createPropertyBtnLbl","createPropertySuccessNotification","clarityProjectDoesNotExistNotification","createPropertyFailedNotification","CreateTythonProperty","activeProperty","isPropertyFormSubmittable","onPropertyFormSubmittable","clearStores","stepToBeFiltered","hideStep","AdUnitSiteSelector","onCloseNewPropertyPanel","isPropertyPanelActive","onSiteChange","onAddSiteClick","onCreatingNewProperty","isSaving","routeProps","accordionControlWrapper","borderTopLeftRadius","borderTopRightRadius","accordionToggleCheckboxLabel","accordionContentWrapper","borderBottomLeftRadius","borderBottomRightRadius","accordionChevron","subContentText","accordionCheckBoxArialLabelChecked","accordionCheckBoxArialLabelUnchecked","Accordion","subContent","wrapperClassName","disableMsg","defaultExpanded","toggleExpand","collapseAccordion","setTrue","expandAccordion","StackItem","themeColors","customColor","colorPicker","swatchColors","defaultColor","getColorByHex","HEX_CHARACTER_REGEX","HEX_MASK_REGEX","ColorPicker","_getColorByHex","_getColorByHex2","setColor","selectedColor","calloutVisible","setCalloutVisible","setCustomColor","swatchColor","buttonId","colorPickerButtonRef","bucketIcon","xLarge","chevronIcon","alignContent","colorIcon","colorSelected","swatchColorPickerCallout","handleHexCodeFieldChanged","_context","hexValue","_replaceAllInstanceProperty","_props$onChange2","controlled","colorType","onCalloutDismiss","_colorPickerButtonRef","bottomRightEdge","handleTabKey","FocusZoneTabbableElements","defaultTabbableElement","SwatchColorPicker","colorCells","columnCount","cellShape","defaultSelectedId","_color","_props$onChange","handleColorChanged","doNotContainWithinFocusZone","MaskedTextField","mask","maskFormat","onBlur","onKeyUp","fontOptions","containerRef","adPreviewRef","AdPreview","providerName","ctaText","AdUnitTypeSelector","CMUIPopupArticleByIdAnchor","Item","MessageBar","onRenderPrefix","AutoFitWidth","AutoFitHeight","linkFormat","layoutKey","propertySerializer","getSiteSelectionSummary","fetchTythonAdUnitById","TythonAdUnit","getLargestAdUnitNumber","arr","useAdUnitData","_googleAdsenseStore$a2","googleAdsenseStore","onPropertyCreated","adUnitsStore","setProperties","isPropertyLoading","setIsPropertyLoading","isPropertySaving","setIsPropertySaving","isAdUnitLoading","setIsAdUnitLoading","isAdUnitMediationLoading","setIsAdUnitMediationLoading","isAdUnitSaving","setIsAdUnitSaving","isPropertyLoadHandled","isAdUnitLoadHandled","isMediationLoadHandled","setActiveAdunit","getActiveAdunit","initialAdUnit","shouldFetchProperties","isCreatingNewAdUnit","isValidAdUnit","_activeAdunit$adTypes","existingAdUnitId","extractAdUnitId","shouldFetchAdUnitMediationStatus","_googleAdsenseStore$a","shouldInitializeHookOnCreation","shouldInitializeHookOnEdition","propertiesPromise","propertyConfigsPromise","pc","LoadingSitesFailed","fetchProperties","fetchData","fetchAdSenseAccountStatus","_data$","isAdUnitMediationEnabled","newAdunitName","_data","generateNewAdUnitName","initializeDefaultAdUnit","fetchedAdUnit","adUnitName","convertToTythonAdUnitViewState","fetchAdUnit","isAdUnitInitialized","createProperty","createPropertyService","newProperty","createTythonAdUnit","enablebCat","bCat","xCat","enablebAdv","bAdv","_resRaw$errors$0$desc","_resRaw$errors","_resRaw$errors$0$code","_resRaw$errors2","_resRaw$errors$0$desc2","_resRaw$errors3","resRaw","CreateTythonAdUnitFailed","enableTythonAdUnitMediation","onRequestSuccess","updateTythonAdUnit","isAdUnitNameUpdated","isDirty","useAdunitEventHandlers","activeNewPropertyCreation","activeScriptView","deActiveNewPropertyCreation","onRedirectBackToAdUnitManagePage","onAdunitNameChange","currentActiveAdunit","onAdunitTypeChange","DuplicatedSiteCreationErrorNotification","onAdUnitSubmit","_data$data$servingCon","newAdUnitId","onRequestStart","disableTythonAdUnitMediation","useCreateTythonAdunitRenderControl","isScriptViewActive","adUnitNameProps","adUnitSiteProps","_getSiteSelectionSumm","adUnitTypeProps","adUnitMediationProps","adUnitScriptPageProps","adUnitDetailPageProps","CreateTythonAdunit","AppAdUnitPreviewLayout","createNewAppAdUnitPrimaryFormTitle","appAdUnitNameFieldLabel","appAdUnitApplicationIdFieldLabel","appAdUnitTypeFieldLabel","appAdUnitTypeBanner","appAdUnitTypeInterstitial","appAdUnitTypeNative","appAdUnitTypeBannerDescription","appAdUnitTypeBannerHelpLink","appAdUnitTypeInterstitialDescription","appAdUnitTypeInterstitialHelpLink","appAdUnitTypeNativeDescription","overviewNativeAdsLink","appAdUnitTypeDisplayAdsTitle","appAdUnitTypeNativeAdsTitle","appAdUnitTypeVideoAdsTitle","appAdUnitDisplayAdsBannerAdSizeLabel","appAdUnitVideoAdsInterstitialVideoAdConfigTitle","appAdUnitNativeAdConfigTitle","appAdUnitNativeAdsConfigFontLabel","appAdUnitNativeAdsConfigTitleColorLabel","appAdUnitNativeAdsConfigBackgroundLabel","appAdUnitNativeAdsConfigButtonBackgroundLabel","appAdUnitNativeAdsConfigMsgBar","appAdUnitVideoAdsInterstitialVideoAdConfigVideoSkipLabel","createNewAppAdUnitBannerAdTypeFormTitle","createNewAppAdUnitInterstitialAdTypeFormTitle","createNewAppAdUnitNativeAdTypeFormTitle","adTypeInfoMsgContent","adTypeInfoMsgHelpLink","adTypePreviewTitle","adTypePreviewLayoutHorizontal","adTypePreviewLayoutVertical","adTypePreviewLayoutSquare","adUnitFormCancelLabel","adUnitFormPreviousLabel","adUnitFormNextLabel","adUnitFormDoneLabel","adUnitFormSubmissionLabelSuccess","adUnitResultSummarySecondaryContent","adUnitResultSummarySecondaryContentSecondary","adUnitResultSummaryCodeHelpContent","adUnitResultSummaryCodeButton","adUnitResultSummaryCodeButtonInactive","adUnitResultSummaryFollowInstructionContent1","adUnitResultSummaryFollowInstructionContent2","adUnitResultSummaryFollowInstructionContent3","adUnitResultSummaryFollowInstructionContent3HelpLink","adUnitResultSummaryFollowInstructionContent4","adUnitResultSummaryFollowInstructionContent4HelpLink","adUnitResultSummaryFollowInstructionContent5","adUnitResultSummaryFollowInstructionContent5HelpLink","copyCode","copiedCode","adPreviewPrimaryTitle","adPreviewPrimaryDescriptionLine1","adPreviewPrimaryDescriptionLine2","adPreviewPrimaryDescriptionActionButton","adPreviewAdBadgeContent","appDetailSubTitle","appAdUnitNamePlaceholder","appAdUnitVideoSkipYes","appAdUnitVideoSkipNo","appAdUnitVideoAdsDuration","appAdUnitVideoAdsDurationMetric","appAdUnitNativePreviewTitle","nativeAdPreviewContainerSize","appAdUnitVideoPlayMethodAutoSoundOn","appAdUnitVideoPlayMethodAutoSoundOff","appAdUnitVideoPlayMethodClickToPlay","appAdUnitVideoPlayMethodMouseOff","appAdUnitVideoPlayMethodAutoplay","appAdUnitVideoPlayMethodSoundUnknown","appAdUnitVideoPlayMethodFieldLabel","appAdUnitUpdateSuccess","AppAdUnitType","AppAdUnitBannerSize","appAdUnitVideoPlayMethod","InfoLabelContent","html","dangerouslySetInnerHTML","__html","useAppAdUnitPrimaryFormStyles","shadow4Brand","dimensionInputsWrapper","spacingHorizontalM","dimensionInput","colorSelectorWrapper","sectionTitle","typographyStyles","title3","applicationDropdown","cardsWrapper","card","spacingHorizontalL","cardTitleRadioCheckbox","colorNeutralForeground2","body1Storng","body1Strong","dimensionDropdown","msgBar","colorBrandBackgroundInvertedSelected","colorPaletteRedForeground3","infoButton","spacingVerticalL","infoBubbleNoRequire","propertyOption","spacingVerticalSNudge","useV2SectionalAccordionStyles","horizontalDivider","titleWrapper","contentWrapper","verticalDivider","spacingHorizontalXXS","contentLeft","contentRight","useAppAdUnitResultSummaryStyles","stepAvatar","checkMarkLogo","codeCard","codeIcon","codeCardContent","colorNeutralBackground3","codeCardWrapper","spacingHorizontalS","spacingVerticalMNudge","strokeWidthThicker","colorNeutralBackground1Selected","codeHelpText","spacingVerticalS","codePanelButton","useAppAdUnitPreviewStyles","tittleWrapper","layoutTagsWrapper","previewWrapper","squareAdPreviewContainerSize","horizontalAdPreviewContainerSize","flowerBackgroundImg","backgroundImage","AdPreviewBackground","backgroundSize","verticalAdPreviewContainerSize","horizontalAdIconPosition","adIconSize","adBadgeStyle","colorNeutralForegroundInverted","colorNeutralForeground3","fontSizeBase200","lineHeightBase200","borderRadiusSmall","strokeWidthThin","colorNeutralBackground2Pressed","secondarySubtitleStyles","textShadow","shadow64Brand","colorNeutralBackground1","fontWeightBold","useAdPreviewRendererStyles","nonSelectableText","primaryAdWrapperHorizontal","primaryAdWrapperVertical","colorNeutralBackground5","primaryAdWrapperSquare","secondaryAdWrapperHorizontal","backgroundPositionY","secondaryAdWrapperSquare","secondaryAdWrapperVertical","backgroundPositionX","previewCardWrapperHorizontal","previewCardWrapperVertical","previewCardWrapperSquare","primaryAdIconHorizontal","primaryAdIconVertical","spacingVerticalXXS","primaryAdIconSquare","secondaryAdIconHorizontal","secondaryAdIconSquare","secondaryAdIconVertical","primaryAdButtonHorizontal","primaryAdButtonVertical","primaryAdButtonSquare","secondaryAdButtonHorizontal","colorStatusDangerBackground2","shadow","shadow64","secondaryAdButtonSquare","secondaryAdButtonVertical","primaryAdBadgeHorizontal","primaryAdBadgeSquare","primaryAdBadgeVertical","spacingVerticalXL","secondaryBadgeHorizontal","secondaryBadgeSquare","secondaryBadgeVertical","secondarySubtitleHorizontal","secondarySubtitleSquare","secondarySubtitleVertical","fontSizeBase400","lineHeightBase300","primaryTitleVertical","lineHeightBase400","primaryTitleSquare","displayNone","primaryBodyVertical","primaryBodySquare","setAdWidth","setAdHeight","Field","slotProps","Body1Strong","InfoLabel","Body1","Input","contentBefore","classes","previewCardWrapperClass","primaryAdWrapperClass","primaryButtonClass","primaryTitleClass","primaryAdVectorClass","primaryAdBadgeClass","primaryCaptionClass","primaryBodyClass","secondaryAdWrapperClass","secondarySubtitleClass","secondaryButtonClass","secondaryAdVectorClass","secondaryAdBadgeClass","Subtitle1","Caption1","AdVector","previewLayout","setPreviewLayout","InteractionTag","InteractionTagPrimary","AdPreviewDynamicRenderer","V2SectionalAccordion","onTitleToggle","isAccordionSelected","onRenderLeft","onRenderRight","isComponentExpanded","setIsComponentExpanded","shouldComponentExpand","onTitleChecked","Radio","Subtitle2","ChevronUp24Regular","ChevronDown24Regular","_applicationOptions$f","applicationOptions","adUnitApplicationId","onAdUnitApplicationIdChange","onAdUnitNameChange","onAdUnitTypeChange","validationError","shouldRenderPrimaryForm","selectedBannerAdUnitAdSize","onBannerAdUnitAdSizeChange","bannerAdSizeOptions","videoAdUnitSkipAllowed","onVideoAdUnitSkipAllowedChange","videoAdUnitDuration","onVideoAdUnitDurationChange","nativeAdUnitConfig","onNativeAdUnitConfigChange","videoAdUnitPlayMethod","onVideoAdUnitPlayMethodChange","adTypeAccordionItems","Body1Stronger","onOptionSelect","optionValue","selectedOptions","Option","checkIcon","intent","MessageBarBody","preview","NativeAdDynamicAdPreview","helpLink","useV2Link","StaticAdPreview","Video","_appAdUnitVideoPlayMe","contentAfter","validationMessage","addUnitName","Caption1Strong","secondaryLabel","shouldRenderResultSummary","isCodeBlockActive","setIsCodeBlockActive","onCopy","publisherIdCodeSnippet","Title3","align","Body2","Avatar","initials","CodeIcon","Copy20Regular","DEFAULT_NATIVE_CONFIG","mapPropertyToApplicationOptions","MicrosoftStoreAppId","useCreateTythonAppAdUnit","setAdUnitName","setAdUnitApplicationId","setAdUnitType","bannerAdUnitAdSize","setBannerAdUnitAdSize","setVideoAdUnitPlayMethod","setApplicationOptions","setVideoAdUnitSkipAllowed","setVideoAdUnitDuration","setNativeAdUnitConfig","rawAdUnit","setRawAdUnit","setShouldRenderPrimaryForm","setShouldRenderResultSummary","isSavingAdUnit","setIsSavingAdUnit","formStateMode","propertyServingConfigPromise","fetchedAdUnitPromise","adUnitRaw","nextOptions","asyncInitAdUnitData","primaryFormProps","deStructuredNativeConfig","detailPageProps","resultSummaryProps","_rawAdUnit$adUnitId$t","_rawAdUnit$adUnitId","CreateTythonAppAdUnit","AppAdUnitPrimaryForm","AppAdUnitResultSummary","Operation","AdunitPage","getRedirectionPage","componentProps","isAppAdunit","Switch","gridChannels","fetchChannelById","NaN","associatedFilterIds","ChannelType","CUSTOM","urls","filterStore","filterChannelList","adunitChannelList","newChannel","adunitsNumber","adunitNames","adfiltersNumber","adfilterNames","associatedAdUnitCount","_item$associatedAdUni","associatedFilterCount","_item$associatedFilte","ChannelPage","propsToRender","containerStyle","headerStyle","dateStyle","AnnouncementCard","dateFormate","announcementTitle","firstAnnouncementTitle","firstAnnouncementDescription","firstAnnouncementButton","secondAnnouncementTitle","secondAnnouncementDescription","secondAnnouncementButton","thirdAnnouncementTitle","thirdAnnouncementDescription","thirdAnnouncementButton","cardsContainer","getAnnouncementCards","setIsNotificationPanelOpen","itemData","CMUIPopupArticleUsingButton","anchorStyle","isNotificationPanelOpen","showRedDot","faqTitle","firstQuestion","firstAnswer","secondQuestion","secondAnswer","thirdQuestion","thirdAnswer","fourthQuestion","fourthAnswer","fifthQuestion","fifthAnswer","redirectUser","details","listStyle","arrow","FAQCard","order","_props$setIsOpen","setIsOpen","FAQSection","formatHTMLMessage","title1","title2","description1","description2","description3","notNowButton","dialogAriaLabel","getFRECardStyles","effects","elevation16","dot","selectedDot","dialogContent","dialog","dialogDefaultMaxWidth","FRECard","isLastCard","selectedCardIndex","totalCardCount","dismissDialog","nextButtonClicked","descStyle","FREContainer","updateCurrentStep","fre1","fre2","fre3","cards","newDomain","modalProps","titleAriaId","profileCardTitleNotStarted","profileCardDescriptionNotStarted","profileCardButtonNotStarted","siteCardTitleNotStarted","siteCardDescriptionNotStarted","siteCardButtonNotStarted","adUnitCardTitleNotStarted","adUnitCardDescriptionNotStarted","adUnitCardButtonNotStarted","profileCardTitleAwaitingForVerification","profileCardDescriptionAwaitingForVerification","profileCardButtonAwaitingForVerification","siteCardTitleAwaitingForVerification","siteCardDescriptionAwaitingForVerification","siteCardButtonAwaitingForVerification","profileCardTitleCompleted","profileCardDescriptionCompleted","profileCardButtonCompleted","siteCardTitleCompleted","siteCardDescriptionCompleted","siteCardButtonCompleted","adUnitCardTitleCompleted","adUnitCardDescriptionCompleted","adUnitCardButtonCompleted","setupProfile","setupSite","setupAdunit","NotStarted","AwaitingVerification","Completed","profileCardTitleNeedsAttention","profileCardDescriptionNeedsAttention","profileCardButtonNeedsAttention","SetupCardType","cardType","statusStyle","progressStepsContainerStyle","progressStepStyle","setupCardContainerStyle","setupContentStyle","setupCardButtonStyle","GetStarted","getShimmerSetupCard","SetupCard","showContent","statusSite","statusProfile","isStatusFieldsHaveValue","getProgressBar","bars","gettingStartedTitle","isProfileNotStarted","getProfileCardInfo","ProfileStep1","ProfileStep2","ProfileStep3","ProfileStep4","getSiteCardInfo","SiteStep1","SiteStep2","SiteStep3","getAdunitCardInfo","AdUnitStep1","AdUnitStep2","GettingStarted","profileCardInfo","siteCardInfo","adunitCardInfo","getStatusCardsInfo","gettingStartedCards","ConnectAppImg","ConnectSiteImg","getSetupCards","handleProfileCardButtonClick","handleCompleteProfileCardButtonClick","handleSiteCardButtonClick","handleAdUnitCardButtonClick","fetchSetupCardsStatus","sectionContainerStyle","currBalance","getBarChartCustomData","payout","clipPath","balanceImageStyle","balanceStyle","balanceTextStyle","currentBalanceStyle","lastPaymentInfoStyle","barChartSectionStyle","currentBalanceInfoStyle","currentBalanceInfoTextStyle","iconSectionStyle","iconContentStyle","iconTextStyle","performanceSectionTitle","viewPayment","lastEarned","balanceCardTitle","balanceImage","metricsDaterange","viewReports","BalanceCard","currentBalance","balanceImg","barHeight","barChartCustomData","hideTooltip","paymentImg","valueStyle","MetricItem","dataValue","ResponsiveExtraLarge","cardContentStyle","timeRangeStyle","metricsContainerStyle","metricStyle","iconContainerStyle","PerformanceCard","reportMetadata","summaryData","dataUsage","PerformanceSection","publisherProfileAccess","hasPaymentAccess","recommendationsTitle","setupPaymentTitle","setupPaymentDescription","setupMediationTitle","setupMediationDescription","setupMediationButton","setupAdsTxtTitle","setupAdsTxtDescription","setupAdsTxtButton","paymentImage","mediationImage","adsTxtImage","adBlockCardTitle","adBlockCardDescription","adBlockCardAction","RecommendationsSection","adBlockImg","adsTxtImg","mediationImg","mediationIconImg","performanceImg","recommendationsCards","getRecommendationsCards","handlePaymentCardButtonClick","handleMediationButtonClick","handleAdsTxtCardButtonClick","handleAdBlockCardButtonClick","isMediationEnabeled","actionButtonStyle","actionButtonTextStyle","accountStatus","Recommendations","mediationIcon","adsTxt","onInitializeRecommendationSection","welcome","contentDialog","buttonDialog","triggerOneVetAPIs","EmptyLayout","headingTitle","HomePage","fetchPublisherEvaluationStatusAction","hoverCard","beakCurtain","primaryButton","defaultButton","TutorialCallout","tutorialStep","setTutorialStep","onChangeState","containerId","contentWidth","onUpdateTutorialStep","isContentReady","onDismissTutorialCallout","shouldDismissOnWindowFocus","statusCmdBtnAriaLabel","update","sidePanelLabel","sidePanelDescription","sidePanelTC","sidePanelUpdateProperty","ClarityPanel","panelDescriptor","panelAgreement","panelPendingResendButton","siteCreate","siteNotFound","deactivateSiteTitle","siteName","issues","sitesCannotServeMessage","clarityPending","clarityPendingApproval","clarityRejected","clarityNotConnected","clarityApproved","clarityExpired","clarityCancelled","clarityNotFound","clarityLinkStatusCalloutTitle","clarityLinkStatusCalloutProjectStatus","clarityLinkPendingStatus","clarityLinkRejectedStatus","clarityLinkCancelledStatus","clarityLinkExpiredStatus","clarityLinkPendingStatusCalloutDescription","clarityLinkRejectStatusCalloutDescription","clarityLinkCancelledStatusCalloutDescription","clarityLinkExpiredStatusCalloutDescription","clarityLinkNotConnectedStatusCalloutDescription","clarityLinkNotFoundStatusCalloutDescription","clarityLinkStatusCalloutResendAction","clarityLinkStatusRejected","clarityLinkStatusPendingApproval","clarityProject","clarityProjectInfo","zeroResultTitleNonTython","zeroResultDescriptionNonTython","zeroResultcallToAction","clarityTour","clarityTourSecondPageHeader","clarityTourSecondPageDesc","statusTourFirstPageHeader","statusTourFirstPageDesc","statusTourSecondPageHeader","statusTourSecondPageDesc","clarityBenefits","clarityFirstBenefit","claritySecondBenefit","claritySecondBenefitRedirection","clarityThirdBenefit","clarityThirdBenefitRedirection","siteServingAds","siteServingAdsWithoutAdsTxt","siteServingAdsWithoutScript","sitePendingWithApprovedProfile","sitePendingWithoutApprovedProfile","siteRejected","siteNotServingIssuesHeader","siteNotServingPubCenterScriptInActive","siteNotServingSiteIsRejected","siteNotServingWithoutAdsTxt","codeSnippet","siteApprovalGuideLines","approvalStatusPendingInfo","approvalStatusApprovalInfo","approvalStatusRejectedInfo","approvalStatusInfoHelp","approvalStatusInfoGuideLines","approvalStatusInfoSupport","deletePropertyPopupTitle","deletePropertyPopupDescription","redirectionLink","textDecorationLine","hoverCardTitle","hoverCardInfo","clarityCalloutTitle","clarityCalloutFooter","clarityStatusUnderline","errorMsgContent","errorBulletPoint","warningBulletPoint","orangeLighter","propertyIssuesUnorderedList","getClarityTutorialSteps","_config$clarityConfig","getSelectedItems","getClarityCommandBarItems","after","clarityPanelDisplayParams","onDeactivateDialogDismiss","onUpdatePropertyEnd","deleteLabels","getServingStatusCalloutContent","scriptStatus","adsDotTxtStatus","Serving","AdsTxtStatus","NotFound","more","snippet","_item$servingConfig","guidelines","toolTipStatus","_issues$find","issue","getStatusMessage","getTagType","TagType","Fail","getClarityStatus","getClarityCalloutDescriptionStatus","changeState","getPropertyAccessPermission","_item$servingConfig2","paddingInlineStart","onRenderData","_item$servingConfig3","_item$servingConfig4","_item$servingConfig5","Tag","topCenter","_item$servingConfig6","_item$servingConfig7","refLink","_item$servingConfig8","_item$servingConfig9","CellInfoCallout","_item$servingConfig10","_item$servingConfig12","_item$servingConfig13","_item$servingConfig14","_item$servingConfig15","_item$servingConfig16","_item$servingConfig11","Scanning","_store$data","_store$data$filter","clarityTutorialCallout","setClarityTutorialCallout","changeClarityCalloutVisibility","_store$data$","msgBarProps","learn","_property$servingConf","single","appInventoryTableTitle","appsCannotServeMessage","appNameColumnLabel","appIdColumnLabel","appUrlColumnLabel","appAdUnitPlatformColumnLabel","appAdUnitStatusColumnLabel","appAdUnitActionsColumnLabel","appAdunitGridCreateButtonLabel","appInventoryIssueColumnLabel","appInventoryZeroResultTitle","appInventoryZeroResultDescription","appInventoryZeroResultCallToAction","appInventoryDeletePopupTitle","appInventoryDeletePopupDescription","useAppInventoryGrid","TythonInventoryManagePage","SiteManageView","AppInventoryManageView","AppInventoryManagePage","HelpcenterInfoBubbleV2","errorSellerIdDoesNotMatchApp","errorPropertyNameAlreadyExists","errorInventoryAppUrlAlreadyExists","AdsTxtCreationStepTitle","appNameFieldLabel","appSellerIdFieldLabel","appUrlFieldLabel","appNameFieldPlaceholder","appSellerIdFieldPlaceholder","appUrlFieldPlaceholder","appPlatformInfo","appPlatformWindowsUWPLabel","appPlatformTitleLabel","appPlatformConnectLiveAppInfo","appPlatformConnectLiveAppTitleLabel","appSearchFieldPlaceholder","appAgreement","appAgreementSection1","appAgreementSection2","appAgreementCheckboxLabel","getCodeTitle","finishStepperTittle","finishPageExpectNextTitle","finishPageExpectNextContent1","finishPageExpectNextContent2","finishPageExpectNextContentHelpLink","finishPageExpectNextTitle2","finishPageCardTitle","finishPageActionButtonLabel","finishPageCardContent","CreateSiteStepFormTitle","coopaTnCInfo","appPropertyInvalidUrl","useAppPropertyDetailPageStyles","sectionTitleOffset","spacingVerticalXS","textTitle","caption1Strong","agreementTitle","body1","agreementContent","caption1","platformDropdown","skeletonWrapper","urlPrefix","colorSubtleBackgroundSelected","colorNeutralStrokeAccessible","useConnectAppDropdownStyles","containerWrapper","appSearchIcon","isHiding","optionCardWrapper","optionCardSelectable","colorNeutralBackground1Hover","borderRadiusNone","spacingHorizontalSNudge","optionCardTitle","colorNeutralForeground1","optionCardImgIcon","optionCardAppId","optionInnerWrapper","optionInnerWrapperLower","optionsWrapper","useAppPropertyFinishPageStyles","subtitle1","cardTitle","actionDivWrapper","inventoryAppStoreId","onChangeCallback","searchString","setSearchString","appOptions","setAppOptions","selectedOption","setSelectedOption","debouncedAppSearchString","shouldRenderOptions","setShouldRenderOptions","isSearching","setIsSearching","isOptionInitialized","optionMenuRef","useOnClickOutside","shouldInitializeOptions","fetchAppSearchData","searchedString","appSearchResult","matchingApps","controller","renderAppCard","iconImageUrl","appId","shouldRenderSearchInput","shouldRenderAppPreviewForExistingInventory","shouldRenderAppOptionsDropdown","shouldRenderSelectedAppPreview","Skeleton","SkeletonItem","SearchIcon","onAppNameChange","isAppNameInputDisabled","onAppUrlChange","appUrl","isAppUrlInputDisabled","onAppAgreementChange","appSellerId","onAppSellerIdChange","onInventoryAppStoreIdChange","errorState","renderSkeleton","ConnectAppDropdown","validationState","CreateAppIcon","ErrorType","useCreateTythonAppProperty","setAppName","setAppUrl","appSearchString","setAppSearchString","setAppAgreement","setAppSellerId","setInventoryAppStoreId","setRawProperty","rawPropertyServingConfigs","setRawPropertyServingConfigs","setIsSaving","setErrorState","handlePropertyErrors","nextErrorState","SellerIdDoesNotMatchApp","PropertyNameAlreadyExists","isValidAppInventoryCreation","fetchPropertyPromise","savedProperty","COPPAAgreement","fetchPropertyData","appPropertyFormProps","onAppSearchStringChange","onAppPropertyFormSubmit","shouldRedirect","appProperty","PartnerCenterSellerId","appPropertyId","etag","AppPropertyDetailForm","FinishPage","goBack","PropertyPage","isAppProperty","CreateTythonAppProperty","getRoutes","routes","BaseReportPage","AccountPage","ProfilePageLazy","LazyProfilePage","onUserInvited","onResendUserInvitation","userInvite","onDeleteUserInvitation","loadUserInvitations","dismissUserInvitePanel","getUserInvitationStore","userInviteErrors","userInvitePanelOpen","userInviteViewModel","recipientPreferredLang","setUserInvitationErrors","setUserInvitationPanelStatus","setUserInvitations","updateUserInvitationExpiry","userInvitation","ui","expirationDate","setFirstName","setLastName","updateEmail","updateRecipientPreferredLanguage","updateRole","invite","inviteUser","resend","send","panelDescription","inviteUserEmailTitle","recipientPreferredLanguageTitle","emailPlaceholder","expired","firstNameTitle","lastNameTitle","zeroInvitationsTitle","failedToFetchInvitedUser","resendEmailInviteFailed","userInvitedNewUserSuccessfully","userInvitedNewUserFailed","userInvitationResendSuccessfully","userInvitationInvalidState","userInvitationDeletedInvitationSuccessfully","userInvitationDeletingUserInvitation","userInvitationInvalidStateReportOrLogin","userInviteFormFailed","onUserRoleChanged","onUsersDeleted","loadUsers","newInvite","UserInvitationResend","AdView","ListManager","PublisherAdmin","userInvitationType","UserInvitationType","PubCenterSelfServeUser","lcid","entityRoles","userRoleId","roleDesc","getColumns","longestEmailLength","UserInvitationsMessages","getUserInvitationExpiryStatus","currTime","expiryDate","UserMessages","_invite$email","_Date$toISOString","expiryDateString","getPanelClassNames","panelTitleStyle","panelFooterButtonsWrapper","getUserRoleChoiceGroupOptions","renderChoiceGroupOption","onRenderField","PANEL_FIELD_WIDTH","UserInvitePanel","panelDesc","onUserLanguageChanged","ZeroInvitations","desertImage","UserInvitationsTab","longestEmail","confirmation","getPermanentDeleteButtonStyles","customStyles","rootFocused","DeleteConfirmationPopup","_deleteLabels$title","_deleteLabels$descrip","onDeleteClicked","onDialogDismissed","confirmationText","setConfirmationText","getUserManagementStore","roleChangePanelOpen","setUserRoleChangePanelStatus","setSelectedItem","setUsers","updateUserRole","updatedUser","userToUpdate","userRoleDetailsETag","removedRoles","addedRoles","UserRoleChangePanel","existingUserRole","setUserRole","getUserName","_name$firstName","UsersTab","primaryUserId","longestName","longestNameLength","notGridReadyLabel","UserManagementPage","Tabs","tabs","estimatedEarningsNoDataText","estimatedEarningsNoDataMessage","estimatedEarningsTitle","balanceTitle","thresholdNotification","nextPayout","nextPayoutDate","lastPayoutDate","yourThreshold","reachedThreshold","genericNextPayout","estimatedEarningMonthly","estimatedEarningYearly","chartsContainersStyles","chartCard","pageTitleStyle","cardsTitleBarStyle","getStackTokens","paymentThreshold","notificationMessage","cardContainer","formatByCurrencyAndLocale","getFooterNotification","sysCurrency","Balance","_data$threshold","getPaymentsCommonClassNames","passedThreshold","formattedThreshold","activeButton","buttonBorder","chartTypes","chartColor","lineChartData","earningDates","parseDateKey","earningValues","localeMonth","localYear","MONTHLY","getTopBarActions","currentChartTypeStateManagement","activeGrainStateManagement","setCurrentChartType","activeGrain","setActiveGrain","isMonthlyGrain","isYearlyGrain","YEARLY","VERTICAL_BAR","allowDisabledFocus","customFormatDateAxisData","currentGrain","dateTime","EstimatedEarnings","defaultChartType","estimatedEarningsAllGrainData","intersectionEntry","targetObservationRef","isCardVisible","parentCardHeight","setHeight","parentCardWidth","resizeObserver","ResizeObserver","contentBoxSize","inlineSize","blockSize","LineChart","yMaxValue","customDateTimeFormatter","tickValues","VerticalBarChart","useSingleColor","colors","PaymentsPage","grow","PaymentsOnboarding","SettingsPageLazy","LazySettingsPage","accountManageMessages","profileTab","paymentsTab","userManagementTab","layoutRootStyle","getTabs","fetchMediationReportsMetadata","resetColumnMembers","profileTitle","profileHeading","profileDescription","profileSubtitle","profileIncomplete","manageProfile","underReviewTitle","underReviewDescription","approvedTitle","approvedDescription","retryTitle","retryDescription","rejectedTitle","rejectedDescriptionPart1","rejectedDescriptionPart2","rejectedBannerPart1","rejectedBannerPart2","termsAndConditions","viewProfile","onFetchPublisherPreferences","onFetchUserPreferences","closePanel","setFormChanged","onFetchTnC","descriptionText","DEFAULT_TNC","nonTythonContent","DEFAULT_NON_TYTHON_TNC","latestTnCReleaseDate","latestTnCVersion","notificationText","DetectAdBlock","adBlockDetected","useDetectAdBlock","navTextColor","navWidth","navItemHeight","navChildItemHeight","floatingNavBackgroundColor","navItemHoverColor","navItemWithChildBgColor","navItemSelectedColor","BackDropSelector","navItemContainerSelector","navFocusZoneInnerContainerSelector","navExpandCollapseButtonInnerContainerSelector","navExpandCollapseButtonBackgroundContainerSelector","getResponsiveNavStyles","isCollapsed","hasChildren","nestingLevel","scrollTop","isChildLinkSelected","hasGroupName","groupIndex","isFirstNavGroup","ul","listStyleType","overlay","navItemRoot","navItemBarMarker","navItemIconColumn","navItemNameColumn","navSlimItemRoot","navFloatingRoot","webkitBackdropFilter","backdropFilter","slideRightIn20","navFloatingItemRoot","navGroupSeparatorRoot","navGroupSeparatorHrLine","navGroupSeparatorHeaderGroupName","navToggler","disabledStyle","focusedStyle","getFocusStyle","NavGroupType","NavBase","forceIntoFirstElement","getDocument","expandCollapseButton","navFocusZone","getPreferredSelectedKey","childLink","isLinkSelected","includeChildren","getLinkText","isShowMoreLink","alternateText","hasAtleastOneVisibleLink","isHidden","NavLink","rightIconName","leftIconName","dataHint","ariaExpanded","ariaCurrent","rootClassName","barClassName","iconClassName","textClassName","computedTextWidth","fixedIconWidth","Nav","isLinkExpandStateChanged","initialSelectedKey","isGroupCollapsed","_hasAtleastOneHiddenLink","_renderGroup","_onLinkClicked","nextState","onNavNodeExpandedCallback","onEditLeftNavClickedCallback","_renderCompositeLink","linkIndex","onShowMoreLinkClicked","linkText","onClickHandler","bind","_renderLink","_renderLinks","enableCustomization","groupType","CustomizationGroup","isGroupHeaderVisible","collapseMenu","expandMenu","SlimNav","_getScrollTop","navScrollerId","navScroller","_onLinkMouseEnterOrLeave","_prevFloatingNav","removeAttribute","_getFloatingNav","parentElement","_onFocus","currentFloatingNav","_onBlur","_onKeyDown","nativeEvent","keyCode","_renderFloatingLink","_renderFloatingLinks","_renderFloatingNav","_linkIndex","_nestingLevel","onMouseEnter","onFocus","NavTogglerComponent","_this","_this$props$onNavColl","_this$props","expand","onNavCollapsedCallback","isNavCollapsed","triggerNavCollapse","lockAutoCollapse","isWindowNonRegularSize","_onShowMoreLinkClicked","addEventListener","handleResizeCollapseReset","componentWillUnmount","removeEventListener","snapshot","toggleNavGroups","navGroup","ToggleGroup","nonToggleNavGroups","onOverlayClick","_renderExpandCollapseNavItem","_onNavCollapseClicked","navLinkId","bottomAutoEdge","NavToggler","renderNormalIcon","renderActiveIcon","useTythonNav","accessibleRoutes","generateNavIcons","navItems","setNavItems","generateNavItems","input","_getRoutes$find$text","_getRoutes$find","_link$title","_link$disabled","_link$key2","_link$tooltipText","isNavItemSelected","route","checkRender","_document","requestAnimationFrame","iconSrc","iconSrcActive","HomeNavIcon","HomeNavIconActive","AdUnitNavIcon","AdUnitNavIconActive","SiteNavIcon","SiteNavIconActive","AdBlockNavIcon","AdBlockNavIconActive","ReportNavIcon","ReportNavIconActive","AccountNavIcon","AccountNavIconActive","InventoryIcon","InventoryIconActive","AdsIcon","AdsIconActive","TythonNav","SideNavigation","mainMenuAriaLabel","menuAndContent","appNav","appContent","appContentRoutes","ContentLayout","nl","keyParts","renderedHeader","isDefaultLayout","menuRenderer","_getNavigationAccess","InternationalizationLayout","NotificationLayout","ignoreGlobalAsync","ignoreNotificationAsync","Footer","navAccessPermissions","navMenuLinks","_getRouteName","isTythonRoute","_onNavClicked","tythonExcludedRoutes","MenuGroup","overlayStyle","spinnerStyle","PageSpinner","footerAriaLabel","legal","privacyCookies","consumerHealthPrivacy","copyrightMicrosoft","footerLinks","smallPlus","copyrightText","AccountProfileFeature","profileNotImplemented","module","exports","dataUrl","downloadCSV","exportToPNG","html2canvas","toDataURL","getExportFileName","calendarDateRange","chartGrain","brokenDownStartDate","breakdownDate","brokenDownEndDate","startDateString","endDateString","constructName","ReportingDataRow","buttonContainer","l2","dialogContentContainer","setupNotificationWrapper","xPayContainer","xPayOverlay","primaryButtonText","xPayLoadingSpinner","transparentContainer","setupNotificationText","tncNotificationText","targetPointer","actionButton","SetupPaymentNotification","onAction","BaseButton","defaultTab","getStatesOfCountry","_metadataStore$raw","getMetaDataStore","states","isStatesPresentForCountry","getStatesDropdownOptions","documentUploadStatus","isDocumentUploadPanelOpen","daysAheadOfToday","dateString","diffTime","domainInitialize","rDomain","addMethod","excludeEmptyString","duplicateDomainInitialize","activeSite","sitesDomain","_getTheHostName$split","getTheHostName","getDomainNameFromURL","_value$split$","domainName","nameInitialize","nameRegex","duplicateNameInitialize","redirectUrl","pivotRootStyle","pivotItemContainerStyle","_history$location","showItem","currentHashValue","getDefaultSelectedTabKey","tab","redirectTab","setSelectedKey","_link$props","updateUrl","defaultDataGridColumns","onUserInvitationsGridInitialized","eventType","useCache","dismissFRE","onInitializeSystemPreferences","AuditType","EntityLimitTier","FeatureOverideTier","PaidSearch","MobilePaidSearch","AudienceAds","LinkedInAds","mappingReasonsToLabels","PaymentFailedAccountClosed","PaymentFailedBankAccountRestricted","PaymentFailedStripeCouldNotProcess","PaymentFailedCouldNotProcess","PaymentFailedDeclined","PaymentFailedExpiredCard","PaymentFailedIncorrectAccountHolderName","PaymentFailedInvalidAccountNumber","PaymentFailedInvalidCard","PaymentFailedInvalidCurrency","PaymentFailedLostOrStolenCard","PaymentFailedNoAccount","PaymentFailedNoAccountLocated","PaymentFailed","Partner","PaymentInstrumentLifeCycleStatus","PaymentOption","NetworkAffiliation","ServiceLevel","SelfServe","SelfServeTrusted","Premium","Internal","Select","DocumentUploadStatus","ORG_NAME_MIN_LENGTH","ORG_NAME_MAX_LENGTH","DEFAULT_SELECTED_ACCOUNT_TYPE","accountType","isTermsAndConditionsAgreed","fetchingOvdfStatus","optInPromotionalEmail","profileValidationModel","getUserProfileValidationModel","organizationEmailAddress","organizationUrl","ceoName","InfoButtonBase","_iconButtonElement","inset","_onInfoButtonClick","callout","_onCalloutDismiss","rightCenter","fetchBrands","keyword","effectiveUserContext","BrandSearchResponse","fetchStatesOfCountry","setStatesOfCountry","generateChars","chars","Uint8Array","msCrypto","getRandomValues","CUSTOM_MESSAGE_CODE","fetchOneVetReviewStatus","sessionId","_publisher$name","ipAddress","getIP","noAccessPageRoute","protocol","fetchOneVetCodeVerificationStatus","addThreatMetrixScripts","tmScriptId","tmNoScriptId","tmScript","tmNoScript","currentTimestamp","srcUrl","noScript","iframe","ipResponse","ip","SizeMapper","statusIdentifier","hoverAble","widthFit","fail","tooltipContent","toolTipId","renderTag","fetchUserDetails","VerificationCodeGenerationErrorCodes","PaginationDisplay","noPublisherOrAccountSelected","servingStatusPending","servingStatusNotServing","servingStatusServing","servingStatusOnHold","ListPickerLegacy","BasePicker","resolveDelay","itemLimit","onRenderItem","selectedInput","selectedText","onRemoveItem","removeButtonAriaLabel","onRenderSuggestionsItem","ListPickerBase","pickerIsDisabled","closeButtonIsDisabled","basePickerProps","onResolveSuggestions","inputProps","inputPlaceholder","pickerSuggestionsProps","noResultsFoundText","getTextFromItem","pickerCalloutProps","calloutMaxHeight","basePicker","ListPicker","publisherPlaceholder","publisherNotFound","accountPlaceholder","accountNotFound","allAccountsOption","listPickerRemoveAriaLabel","publisherAccountPickerAriaLabel","isAccountDisabled","listGroup","publisherPicker","accountPicker","caretDownWrapper","PublisherAccountPicker","isAccountSelectionDisabled","_updateAccountsCache","newPublisher","urlPath","_accountsForCurrentPublisher","isPublisherSelectionDisabled","_handleAllAccountsOptions","ms","_isComponentMounted","isAccountHidden","isPublisherDisabled","selectedPublisherItem","selectedAccountItem","_onPublishersResolveSuggestions","_onPublisherChanged","_onAccountChanged","isUpdateAccount","defaultSelectedAccount","itemType","DropdownMenuItemType","defaultAccountId","itemStyle","dotsStyle","selectedItemStyle","disabledItemStyle","DOTS","DEFAULT_SIBLING_COUNT","getRange","start","end","DottedPagination","pageSize","siblingCount","totalItemCount","paginationRange","pageCount","leftSiblingIndex","rightSiblingIndex","shouldShowLeftDots","shouldShowRightDots","lastPageIndex","rightRange","middleRange","useDottedPagination","lastPage","onPrevious","pageNumber","showRows","firstPage","prevPage","nextPage","blackTranslucent40","dropdownStyle","NavigatedPagination","onPageNumberChange","onPageSizeChange","onFirst","onLast","Navigation","calenderContainer","calenderRangeSelectorsContainer","calenderRangeSelectorDateContainer","calenderRangeSelectorDate","calenderRangeSelector","calenderRangeSelectedSelector","calenderButton","calenderHeader","calenderNavigator","calenderMonthLabel","calenderBody","daysGrid","dateNotInCurrentMonth","disabledDate","dateInCurrentMonth","dateSelected","dateSelectedInBetween","SingleDay","dayObj","handleDateRangeSelection","selectedDateRange","hoveredDateRange","handleDateRangeHover","turn","disabledClass","isInCurrentMonthClass","dayIndex","isInHoverRange","selectedClass","hoverClass","getDayClasses","CustomCalender","onSelectedDatesChanged","initialRangeType","initialDateRange","disableFutureDays","dataTestId","setSelectedDateRange","finalDateRange","setFinalDateRange","setHoveredDateRange","setTurn","isCalenderVisible","setIsCalenderVisible","rangeType","setRangeType","finalRangeType","setFinalRangeType","WEEK_DAYS","currentMonth","setCurrentMonth","currentYear","setCurrentYear","selectedDate","dates","getRangeSelectorContent","clickable","selector","getCalenderContent","hideCalender","prev","onApplyClicked","supportButtonWrapper","supportButton","hasPublisherPreferencesAccess","handledPreference","handledSystemPreference","init","initCMUIExperience","initCMUIHelpButtonEventListener","removeCMUIHelpButtonEventListener","constructSupportButton","SupportBotton","supportMessages","ReportHeader","Redirect","_generateMenuRoutes","_renderHeader","keyFnc","Suspense","clarityEnabled","dismissNotifications","notificationIds","dismissedNotifications","dismissedBackendNotificationInUI","backendDismissedNotifications","panelNotification","isUIGenerated","_store$account","selectedNotification","existingNotifications","indexOfSSNotification","updatedData","getBackendNotifications","existingNotificationsCollection","notificationId","intlNotificationTitle","intlNotificationContent","notificationItem","notificationTitle","notificationContent","lastModifiedDTime","intlNotificationPrimaryActionLabel","errorReason","errorCodeStr","intlNotificationErrorReason","intlNotificationErrorReasonTitle","notificationActions","primaryAction","secondaryAction","intlNotificationSecondaryActionLabel","intlTitleMessageValues","onDoNotRenderDefaultPageChanged","newDomainOrigin","_iframe$contentWindow","contentWindow","postMessage","helpHtml","_responseJson$Content","_responseJson$Content2","Content","getHelpInfo","_msg$publisher","_msg$publisher2","isInternalUserLogin","_userContext$userName2","homePageUrl","setUserPublisherContext","EXPIRED_NOTIFICATION_SHOWN_STATE_KEY","pushState","_msg$locale","tncStore","authorizedUserLocale","unauthorizedUserLocale","TnCLocale","releaseDate","version","localContent","metadataStore","customButton","isCloseButtonHidden","isPrimaryButtonDisabled","isBlocking","logType","_consoleLog","_getContextMessage","contextMsg","_this$userContext","_this$userContext2","_this$userContext$ema","_this$userContext3","_this$userContext4","pubObj","AppealHistory","WelcomeToPubcenterEmail","onIsAcceptInviteFlowChanged","isAcceptInviteFlow","onUserInvitationCodeChanged","pluralize","isEmpty","resultList","hasAdQualityAccess","fetchPublisherProfileDetails","intlMessageId","isAdBlockerDetectRun","setAdBlockDetected","finally","handler","listener","getSortableValue","onPublisherDeleted","onUserSelfDeleted","detailsListStyles","headingRootStyle","AuditLog","EntityEvaluation","EntityPreferences","NotificationType","IPRange","PhoneVerificationMediumType","PhoneVerificationSubStatus","VerificationStatus","PublisherCreate","UpdateStatus","fullName","FetchDevTokenStatus","GenerateDevToken","onGridPageV2Initialized","showErrorMessage","ChangingItemStatusFailure","updateSucceeded","_msg$setData","_msg$onItemsStatusCha","gridData","selItem","itemCopy","dataItem","commandText","updateParams","DeletingItemFailure","deleteSucceeded","_msg$deleteAction","_msg$postDeleteAction","copiedItems","_msg$preDeleteAction","DuplicateGridItemFailure","duplicateSucceeded","newEntity","_msg$onDuplicateActio","selectedEntity","accountIdToDuplicate","entityToDuplicate","duplicateAccount","duplicateData","initialize","DeactivateConfirmationDialog","deactivateLabels","DeactivateConfirmation","handleDeactivateButtonClick","DeleteConfirmationDialog","handleDeleteButtonClick","ModifyColumnsPanel","hideDescription","changeColumnsVisibility","onModifyColumnsPanelHide","handleModifyColumnsClicked","ModifyColumns","_column$incompatibleP","columnVisibilityChange","incompatibleProps","incompatibleWontMessage","getCustomCommandBarStyles","itemsSelected","itemsCount","overflowSetStyles","gridGap","primarySet","secondarySet","outlineColor","primaryButtonTextHovered","primaryButtonTextPressed","rootExpandedHovered","rootHasMenu","iconExpanded","iconExpandedHovered","menuIcon","menuIconHovered","menuIconPressed","menuIconExpandedHovered","menuIconExpanded","getCountMenuStyles","SearchBoxCallOut","placeHolder","handleSearch","autoFocus","addFilterButton","commandBarItemProps","buttonProps","castButtonProps","buildCommandBarProps","excludeActions","customCommandBarItems","defaultCommandBarItems","onDuplicateItems","downloadItems","shouldFocusOnMount","renderedInOverflow","iconOnly","dataStore","subMenuProps","getDefaultCommandBarItems","defaultFarCommandBarItems","downloadSubMenuProps","cancelSelection","getDefaultCommandBarFarItems","includeKey","excludeKey","customItem","keyItem","indextoAdd","keyPosition","insertCommandBarItem","countItem","cancelItem","getItemsBasedOnModeAndStatus","CustomCommandBar","commandBarRef","handleGridFilter","onDeleteItems","onPostDeleteItems","hideModifyColumnsDescription","_document$querySelect","commandBarWrapper","flattenNestedObject","parentKey","newKey","nestedValues","useSearchableGrid","updateSearchWord","searchFunction","_col$searchFunction","IKey","IValue","filterConditions","setAppliedFilters","customApplyFilterFn","shouldApplyFilter","applyFilter","itemsCopy","flatObj","nestedObj","currentKey","unflattenObject","_dataGridProps$render","_dataGridProps$constr","_pageTitle$title","bypassFiltrationAndSearching","bypassGridResetting","selectedRows","onColumnsChanged","identifier","hideDisableStyle","rowIdentifier","dataQueryProps","isSelectionDisabled","gridRows","setGridRows","_selectedRows$find","appliedFilters","rowRef","colsVisMap","useSelectionGrid","onSelectionRefChanged","onItemsChanged","setKeySelected","selectedRow","_getStore$selectedIte","rowsWithUpdatedSelectionStatus","_selectedRow","activeRows","paginateData","initializePagination","usePagination","filteredRowsUsingFilter","removeAllSelectedItems","setAllSelected","resetGrid","checkboxWrappers","headerRowWrapper","filteredRowsUsingSearch","_selectedRows$find2","renderEmptyGrid","horizontalConstrained","setKey","multiple","checkboxVisibility","CheckboxVisibility","always","headerProps","RenderHeaderCheckbox","DetailsHeader","onRenderDetailsCheckbox","onRenderRow","detailsRowProps","RenderRowCheckbox","DetailsRow","checkboxCellClassName","itemToRender","_column$onRenderData","_selection$getItems","toggleIndexSelected","showPagination","userAcceptInvitationErrorModel","contactByPhone","boolean","contactByEmail","ariaConfig","UserConstants","_getAriaToken","ariaToken","BCP","PROD","_initalizeAriaEnv","AriaLogger","AWTLogManager","setTransmitProfile","getLogger","logSession","AWTSessionState","Started","_ariaLog","_setProperties","eventProperties","setProperty","AWTEventProperties","setEventPriority","AWTEventPriority","Normal","logLevel","High","Immediate_sync","logEvent","onFeatureFlagChanged","useWindowsAppFeatureFlag","isFeatureFlagInitialized","ENABLED_PUBLISHERS_PROD","DISABLED_PUBLISHERS_NON_PROD","prevLocale","initApexPlatform","apexInitOptions","Project","Market","EndPoint","InitPopup","InitOnReady","SupportOptions","$","fn","InitApexPlatform","CMUI_HELP_BUTTON_ID","popupClickHandler","evt","PopupController","PopupJsClick","_items","headerHelpIconProps","_document$getElementB","CMUIInlineHelpAnchor","eleRef","createRef","topic","flexShrink","V2Link","helpButtons","MultiSelectPickerBase","addAllButtonAriaDescription","removeAllButtonAriaDescription","filteredItemsLabel","selectedItemsLabel","createButtonAriaDesciption","removeAllButtonLabel","addAllButtonLabel","availableItemsListBoxAriaLabel","selectedItemsPaneAriaLabel","_label","removeAllAriaDescriptionId","addAllAriaDescriptionId","_getItemAtElement","pickerAriaDescriptionId","loadAccountStatusFailed","failedToLoadPublisherStatus","cardDismissDelay","onAccountErrorChanged","onFetchAccountsLoading","onFetchingAccountsData","onAccountsFetched","onAccountIdChanged","onAccountSkuFormMediumChanged","onAccountSkuFormSkuChanged","onAccountSkuFormCleared","onAccountSkuFormSubmitted","onFormAccountNameChanged","onFormAccountCurrencyChanged","onFormAccountLanguageChanged","onFormAccountPrimaryContactChanged","onFormAccountCountryChanged","onFormAccountTimezoneChanged","onFormAccountPaymentOptionChanged","onFormAccountFinancialStatusChanged","onFormAccountPaymentLifeCycleStatusChanged","onFormAccountOperationRatioChanged","onFormAccountAllowPassedURLChanged","onFormAccountAllowPassedKeywordChanged","onFormAccountAllowCrawlingChanged","onFormAccountAllowAdultAdsChanged","onFormAccountAllowGlobalDefaultKeywordsChanged","onFormAccountAllowMeteredCallExtensionsChanged","onFormAccountAllowLocationExtensionsChanged","onFormAccountAllowPhoneExtensionsChanged","onFormAccountAllowMerchantRatingExtensionsChanged","onFormAccountAllowLocalExtensionsChanged","onFormAccountAllowCallExtensionsChanged","onFormAccountAllowSiteLinkExtensionsChanged","onFormAccountStoreIdsChanged","onFormAccountPartnerCodesChanged","onFormAccountFormCodesChanged","onFormAccountStartDistributionPlacementCodesChanged","onFormAccountStartDistributionOCIDL2sChanged","onFormAccountStartDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentageChanged","onAccountSkuSidePanelInitialized","onAccountSkuChanged","onAccountSkusChanged","accountSku","skus","countryToCurrencyMap","countyCode","sku","timeZoneId","paymentLifeCycleStatus","operationRatio","allowPassedURL","allowPassedKeyword","allowCrawling","allowAdultAds","allowGlobalDefaultKeywords","allowMeteredCallExtensions","allowLocationExtensions","allowPhoneExtensions","allowMerchantRatingExtensions","allowLocalExtensions","allowCallExtensions","allowSiteLinkExtensions","formCodes","startDistributionPlacementCodes","startDistributionOCIDL2s","startDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentage","parseFloat","accountSkus","selectedAccountSku","listOfMediums","nonSKUMappedMediums","availableSkus","AdExtensionType","FinancialStatus","onAccountPrivateMarketplaceChanged","onAccountEnablePrivateMarketplaceChanged","rawPublisher","availableLanguages","availableTimezones","availableCountries","availableUsers","isDistributionReportingApplicable","isStartDistributionReportingApplicable","isStartDistributionContentReportingApplicable","MonthlyThreshold","TaxOnHold","Validated","revenueSharePercentage","rawaccount","accountSkuInfo","adDeliverySettings","additionalMarkets","paymentInformation","paymentInstrumentationLifeCycleStatus","operationCostRatio","enabledFeatures","enFeature","EnableGlobalDefaultKeywords","EnableAdultAds","EnableCrawling","EnablePassedUrls","EnablePassedKeywords","adExtensionOptions","adExtension","SiteLink","Phone","Local","Location","MeteredCall","MerchantRatings","Call","placementCodes","createdDateTime","updateAccount","accountNumber","accountContentDeliverySetting","accountContentDeliverySettingInfo","adCountryPolicy","adLanguage","accountContentSettingType","accountContentSettingTypeSimple","accountContentSettingTypeAdvanced","allowedMarketsTitle","allowedMarketsOptionAll","skuTitle","createSku","editSku","skuCategory","skuCode","advancedAccountTitle","paymentOptionMonthlyThreshold","paymentOptionNoPay","lifecycleStatusCreated","lifecycleStatusSubmitted","lifecycleStatusPending","lifecycleStatusFailed","lifecycleStatusPinFailed","lifecycleStatusBlacklisted","lifecycleStatusSuccess","lifecycleStatusValidated","financialStatusLabel","financialStatusNoHold","financialStatusHold","financialStatusTaxOnHold","financialStatusUserHold","lifecycleStatusLabel","revenueSharePercentageLabel","operationCostRationLabel","accountLevelattributesLabel","accountLevelattributesDesc","enableAdunitDebugging","enablePassedURLs","enablePassedKeywords","donotCrawl","enableGlobalDefaultKeywords","enableAdultAds","enableRAIS","phoneExtension","enableSiteLink","localExtension","locationExtension","callExtension","meteredCallExtensions","meteredRatingExtensions","createAccount","storeIdLabel","storeIdExampleText","partnerCodeLabel","partnerCodeText","formCodeLabel","formCodeText","startDistributionPlacementCodeLabel","startDistributionPlacementCodeText","startDistributionOCIDL2Label","startDistributionOCIDL2Text","startDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentageText","inHousePromotions","boost","boostIdsLabel","boostIdsExampleText","privateMarketplaceIdsLabel","privateMarketplaceExampleText","datagrid","CreateAccount","_onAccountSkuSubmit","_createMediaTypeDropdown","_createSkuDropDown","activeAccount","accountAccessPermissions","paymentLifeCycleStatusOptions","Blacklisted","Created","PinFailed","Failed","Submitted","paymentOptionOptions","NoPay","NoHold","Hold","UserHold","_isStartDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentageRequired","_isStartDistributionNativeAdsInFeedsAndHeadlinesRevenuePercentageShareDisabled","skuPanelFormState","skuSidePanel","activePublisher","_getAccountAccessPermission","CURRENCY","_createPrimaryContactDropDown","_createLanguageDropDown","_createCountryDropDown","_createTimezoneDropDown","_advancedAccountAttributes","_SKUs","_createSkuPanel","availableAccountSkus","existingMediums","availableMediaTypes","mediaType","MediaTypeMessages","TIMEZONE","timezoneId","LANGUAGES","availableCountrys","countriesWithLocalLang","placementCodeText","hasStartDistributionPlacementCodes","isRevShareDisabled","contact","numAdUnits","adunitnames","createdDate","IndexPage","PartnerManagementHeader","_onPublisherAccountChanged","pageName","onPublisherErrorChanged","onFetchPublishersLoading","onFetchingPublishersData","onPublishersFetched","onFormPublisherPartnerChanged","onFormPublisherNameChanged","onFormPublisherNetworkChanged","onFormPublisherAddressLine1Changed","onFormPublisherAddressLine2Changed","onFormPublisherAddressCityChanged","onFormPublisherAddressCountryChanged","onFormPublisherAddressCountryCodeChanged","onFormPublisherAddressStateChanged","onFormPublisherAddressStateListsChanged","onFormPublisherAddressZipcodeChanged","onFormPublisherTierChanged","onFormPublisherOverrideTierChanged","onFormPublisherEntityLimitTierChanged","onFormPublisherServiceLevelChanged","onFormPublisherWebAdunitsChanged","onFormPublisherMobileSearchChanged","onFormPublisherDistributionChanged","onFormPublisherDistributionV2Changed","onFormPublisherStartDistributionChanged","onFormPublisherStartDistributionContentChanged","onFormPublisherSelectTierChanged","onFormPublisherMediationChanged","onFormPublisherNativeChanged","onFormPublisherSyndicationChanged","onFormPublisherPropertyAutoChanged","onFormPublisherPSReportingAPIChanged","onFormPublisherPSDashboardChanged","onFormPublisherEnableDefaultTythonV2Changed","onFormPublisherDynamicPropertyRegistrationChanged","onFormPublisherIpNameChanged","onFormPublisherMinimumIpChanged","onFormPublisherMaximumIpChanged","onFormPublisherIpChanged","onFormPublisherIpRangesChanged","onFormPublisherAccountName","onFormPublisherAccountLanguage","onFormPublisherAccountCountry","onFormPublisherAccountTimezoneChanged","onFormEditted","onFormCreated","onPanelCleared","onPublisherCreated","availableStates","postalcode","propertyAutoApproved","ipAddressName","minIPAddress","maxIPAddress","ipAddressGrid","accountLanguage","accountTimezoneId","accountCountry","accountCurrency","availableStateList","publisherBody","accountBody","Small","primaryContactUsername","publisherEntity","accountEntity","allowEndorReporting","allowedMarkets","defaultUSStates","accountAvailableLanguages","Yahoo","newIpRangeGrid","newIpAddress","Delete","_data$name","fetchedPublisher","updatePublisher","networkAffiliationLabel","networkAffiliationOptionPartnerOwned","networkAffiliationOptionSyndicated","publisherAddressTitle","publisherAddressLine2","allowedMarketsForAllTitle","allowedMarketsForSelectedTitle","createAnAccountTitle","createAnAccountInfo","contentDeliverySetting","createPublisher","editPublisher","yahoo","advancedpublihserattributes","publishertier","publisherTierInternalPremium","publisherTierManagedPremium","publishertierSelfServeStandard","publishertierSelfServe3rdParty","publishertierSelfServe1stParty","publishertierSelfServe1stPartyBoost","publisherFeatureOverrideTier","publisherFeatureOverrideTierInternalPremium","publisherFeatureOverrideTierManagedPremium","publisherFeatureOverrideTierSelfServeStandard","publisherFeatureOverrideTierAPI","publisherFeatureOverrideTierSelfServeExperiment","publisherFeatureOverrideTierSelfServeSearch","publisherEntityLimit","publisherEntityLimitInfinite","publisherEntityLimitSmall","publisherEntityLimitMedium","publisherEntityLimitLarge","publisherEntityLimitNetwork","publisherServiceLevel","publisherServiceLevelPremium","publisherServiceLevelSelfServe","publisherServiceLevelSelfServeTrusted","publisherServiceLevelInternal","publisherServiceLevelSelect","publisherAllowedFeatures","publisherAllowedFeaturesWebAdUnits","publisherAllowedFeaturesMobileSearchAdunit","publisherAllowedFeaturesDistributionReport","publisherAllowedFeaturesDistributionV2Report","publisherAllowedFeaturesStartDistributionReport","publisherAllowedFeaturesStartDistributionContentReport","publisherEnableDefaultTythonV2Report","publisherAllowedFeaturesSelectTierReport","publisherAllowedFeaturesNativeReport","publisherAllowedFeaturesMediationReport","publisherAllowedFeaturesSyndicationReport","publisherAllowedFeaturesPaidSearchReportingApi","publisherAllowedFeaturesPaidSearchDashboard","publisherAllowedFeaturesDynamicSites","publisherIPAddress","publisherIPAddressRange","publisherAdCallFeatures","publisherAdCallFeaturesAskPrice","publisherAdCallFeaturesOnBehalf","publisherAdCallFeaturesReferrer","publisherAdCallFeaturesPaidSearchAPI","publisherAdCallFeaturesOutputType","publisherAdCallFeaturesLogImpression","publisherAdCallFeaturesIPForwording","publisherAdCallFeaturesNetworkOptimizer","publisherAdCallFeaturesAdECN","publisherAdCallFeaturesContextualAPI","IPAddressCreateTitle","IPAddressEditTitle","IPAddressRangeName","IPAddressMinimum","IPAddressMaximum","IPAddressType","IPAddressIPV4","IPAddressIPV6","publisherAllowedFeaturesDesc","ipGrid","CreatePublisher","publisherAccessPermissions","_createStateOrProvinceDropDown","publisherTierDropdownOption","SelfServeStandard","SelfServe1stParty","featureOverrideTierOption","Api","SelfServeExperiment","SelfServeSearch","entityLimitTierOption","Infinite","Medium","Large","Network","publisherServiceLevelOption","_IPGrid","ipPanelFormState","gridPageMessages","_store$active$network","_getPublisherAccessPermission","_publisherAddress","_advancedpublisherAttributes","_createAccount","_createIPAddress","impressions","joinDate","PublisherPage","optionTitle","AccountRole","isAccountLevelRole","AccountManagerAccountsSelected","ReportUserAccounstSelected","AdViewAccountsSelected","ListManagerAccountsSelected","InviteUser","isLegacyUser","localeId","accountsList","accountManagerAccountsSelected","reportUserAccounstSelected","adViewAccountsSelected","listManagerAccountsSelected","contactByPost","isId","userLocale","tokenPanelsubTitle","FontSizes","tokenPanelsubTitleValue","tokenPanelDevToken","tokenPanelAgreement","tokenPanelAgreementBtn","tokenPanelInfoButton","tokenPanelAgreementText","tokenSpinner","tokenFetchFail","notInvitationFound","resendInvitation","deleteInvitation","deleteInvitationDescription","dateJoined","lastActivity","dateExpires","tokenPanelUserNameLabel","tokenPanelEmailLabel","developerTokenLabel","tokenServiceAgreementLabelPrefix","tokenServiceAgreementLabelLink","tokenServiceAgreementLabelSuffix","tokenStatusLabel","tokenPanelGenerateButtonAriaDesc","tokenPanelGenerateButtonLabel","tokenPanelFetchFailLabel","zeroResultTitleUser","zeroResultTitleUserInvitations","isFetchingUserInvitationsLoading","Resend","UserInvitationsGrid","isFetchingUserInvitations","DevTokenPanel","copyButtonType","setCopyButtonType","panelClosed","developerToken","TokenNotFound","ApiCallFailed","menuIconProps","onCopyTokenClick","copyText","onGenerateDevToken","SpinnerText","ariaLive","isFetchingUsersLoading","tokenStatus","devTokenPanelDisplayParams","UsersGrid","isFetchingUsers","_entityGridColumns$fi","_gridColumns$find$isV","_gridColumns$find","_gridColumns$find$isV2","_gridColumns$find2","_gridColumns$find$isV3","_gridColumns$find3","_gridColumns$find$isV4","_gridColumns$find4","UserPage","userAccessPermissions","_getUserAccessPermission","isReportEnabled","commonsession","PERFORMANCE_ALLOWED_CHARTS","DETAILED_PERFORMANCE_ALLOWED_CHARTS","ADUNIT_ALLOWED_CHARTS","DETAILED_ADUNIT_ALLOWED_CHARTS","SITE_ALLOWED_CHARTS","DETAILED_SITE_ALLOWED_CHARTS","MEDIATION_ALLOWED_CHARTS","DETAILED_MEDIATION_ALLOWED_CHARTS","COUNTRY_ALLOWED_CHARTS","DETAILED_COUNTRY_ALLOWED_CHARTS","EXCLUDED_FILTER_COLUMNS","ALLOWED_MEDIATION_FILTER_COLUMNS","MEDIATION_DEFAULT_COLUMNS","MEDIATION_DEFAULT_METRICS","ADUNIT_DEFAULT_COLUMNS","ADUNIT_DEFAULT_METRICS","SITE_DEFAULT_COLUMNS","PropertyUrl","SITE_DEFAULT_METRICS","PERFORMANCE_DEFAULT_METRICS","PERFORMANCE_DEFAULT_COLUMNS","COUNTRY_DEFAULT_COLUMNS","COUNTRY_DEFAULT_METRICS","useMediationAvailable","isMediationAvailable","getInitialDateRange","last7Days","initialStartDate","initialEndDate","storedDateRange","DATE_RANGE","parsedStartDate","parsedEndDate","checkIfValidDateRange","initialDateRangeType","getInitialDateRangeType","storedDateRangeType","DATE_RANGE_TYPE","marker","markerName","markerData","large","markerWrapper","MetricMarker","addMetricButtonRootStyle","sidePanelStyles","ChartSelectionMode","ChartMetricPicker","onMetricSelected","onEditButtonClicked","renderMarker","metricProps","MetricsSidePanel","onPanelHide","onMetricsChanged","availableMetrics","setAvailableMetrics","onSave","updatedMetric","temp","metricsDropdown","cardWrapper","GrainSelector","allowedGrains","activeGrainChanged","allowedGrain","removeBreakdown","generatingAndExportingPNG","MenuItemWarningIcon","breakdownWrapper","breakdownText","inCompatibleColumnWrapper","unAllowedBreakdown","removeKey","ReportDetailsGrid","isDetailedDataLoaded","hasMinimumBreakdown","initialBreakdown","defaultColumns","onBreakdownChanged","dateTimeColumn","addDateColumn","breakdownList","formattedData","newRow","MONTH_AND_YEAR","dateValue","formatDate","roundMetrics","activeDimensions","setActiveDimensions","metricColumns","addCompatibilityProps","dimensionColumns","applyOrdering","metricGridColumns","activeBreakdowns","metricMetadata","incompatibleSet","getIncompatibleBreakdown","breakdownIncompatibleMessage","isBreakdownIncompatible","incompatibleFilters","getIncompatibleFilters","filterIncompatibleMessage","filterAndBreakdownIncompatibleMessage","isFilterIncompatible","incompatibleMessage","incompatibleCantMessage","getBreakdownComponent","reportMessages","activeDimension","newActiveDimensions","onRenderOption","_option$data","_option$data2","reportDetailsMessages","incompatibleMetrics","getIncompatibleFields","onRenderContent","redactIncompatibleFields","Schedule","ShareModal","disableModal","shareSchedule","setShareSchedule","getScheduleOptions","emails","setEmails","shareErrors","setShareErrors","schedule","CompactPeoplePicker","selectionAriaLabel","newEmails","onValidateInput","ValidationState","valid","DAILY","WEEKLY","ChartTypeSelector","onChartTypeChange","allowedChartTypes","setCurrentChartGrain","enableHideChartsButton","onChartsHideClicked","chartsHidden","setChartsHidden","onChartTypeIconClick","onHideChartsClick","TopBarActions","setEnableShare","isDetailedView","cardRef","exportedFileName","disableExport","onRenderMenuIcon","getDataToExport","ReportCard","reportDetailedData","isSummaryDataLoaded","defaultMetrics","showMetricsMarkers","showDetailsReportLink","onChartGrainChanged","onSelectedMetricChanged","onActiveMetricsChanged","onBreakDownChanged","reportCardRef","viewReportRoute","reportDetails","startingChartType","CHART_GRAIN","currentBreakdown","setCurrentBreakdown","defaultSelectedMetric","setSelectedMetric","enableShare","showCharts","setShowCharts","showSidePanel","setShowSidePanel","setActiveMetrics","hasEmptyData","showMetricsDropdown","mainDimensionMetadata","setMainDimensionMetadata","selectedMetricMetadata","setSelectedMetricMetadata","chartsOptions","CountryCode","disabledRatioMetric","newChartType","stringifiedFilters","loadedMetrics","PERFORMANCE","changedMetrics","MULTI","SINGLE","selected","newBreakdown","updatedBreakdown","AdUnitsReportCard","dataMetrics","chartDataMetrics","ADUNIT","updatedGrain","CountryReportCard","COUNTRY","MediationReportCard","PerformanceReportCard","showChartGrains","SitesReportCard","SITE","filterBarFocused","filterBarUnFocused","filterInfoContainer","filterInfoContainerUnfocused","highlightedFilterInfoContainer","filterInfoFocused","filterInfoSelectors","highlightedFilterInfoSelectors","filterCloseIcon","filterIcon","filterInfoUnfocused","filterListPageStyle","FilterListItem","isFocused","onRemove","FilterListBar","isBarFocused","setBarUnfocused","setBarFocused","filterBarRef","buttonAction","cardRootStyle","ManageFilter","initialFilterMembers","isFilterOpen","areMembersLoaded","inCompatibilityMessage","labelId","descriptionId","selectedFilters","setSelectedFilter","getSelectedFilters","filterMembers","setFilterMembers","newSelection","rightTopEdge","CheckboxTreeWithSelectionBox","searchPlaceholderText","onChildCheckboxChange","onRemoveSelection","onRemoveAllSelection","selectionList","selectionTitle","onParentCheckboxChange","filterMember","unAllowedFilters","ActionBar","_activeDimension$inco","setIsFilterOpenTrue","setIsFilterOpenFalse","filterButtonId","setActiveDimension","storedFilters","FILTERS","setActiveFilters","currentColumnMembers","areColumnMembersLoaded","dimensionFilter","member","currentFilter","activeFilter","_currentFilter$values","activeDimensionIncompatibleMessage","filterMenuProps","_dimension$incompatib","checkFieldCompatibility","CommandButton","activeFilterIndex","totalMembers","updatedFilters","formTitleStyles","breadcrumbStyles","SubPageNavBar","backAriaDescription","ReportDetailsPage","mediationReportMetadata","setCalendarDateRange","setChartGrain","getMainDimension","getReportTitle","isMediationReport","mediationMetrics","canFetchDetails","canFetchMediationDetails","availableMediationFilters","exportMetadata","detailedData","mediationReportDetailedData","exportData","canExport","onExportCSVClicked","onExportPNGClicked","basis","changedFilters","metricCard","MetricCard","evenCards","metricsWrapper","columnGap","smallCards","gridAutoFlow","gridAutoColumns","cardsColumn","gridTemplateRows","MetricsSummaryCards","isSummaryDataLaded","MSXTython","reportCard","TythonReportCards","adunitReportCardRef","sitesReportCardRef","performanceReportCardRef","mediationReportCardRef","countryReportCardRef","linkTitle","ReportPage","routeChanged","setDateRange","highlight","parts","part","_getHighlightedText","termAndConditions","bold","SuspendedUserOverlay","suspendedUser","UserSettingsPage","ProfilePanelMessages","NotificationConfiguration","AdManagementHeader","onAuditHistoryPageInitialized","updateFiltersAndFetchLogs","handleDownloadButtonClicked","getAuditHistoryStore","entityTypes","auditTypes","isShowAllDetailsEnabled","setShowAllDetails","showDetails","setAuditLogs","auditLogs","setTotalPages","totalPages","setTotalRecords","totalRecords","setPageNumber","setPageSize","setFilters","setEntityTypes","setAuditTypes","setIsDataLoading","resetFilters","actionType","actionOn","actionDetails","showAll","hideAll","hideDetails","inviteAccept","payment","noAuditsFound","apiCallFailedNotification","startingDownloadNotification","fetchAuditLogs","shouldUpdateGrid","inputPageSize","queryString","generateAuditHistoryUrl","auditHistoryStore","setMinutes","setUTCMinutes","auditHistoryRequest","AuditHistoryMessages","changeLogs","getAdUnitTypes","adUnitTypes","getLifeCycleStatusIdValue","getAddedRemovedCount","addCount","removeCount","messageParts","getEntityTypeDisplayMap","Settled","Processing","TransactionTitle","TransactionMessage","AdBlockCategories","AdBlockCategoriesPlural","UniversalAdBlockCategories","UniversalAdBlockCategoriesPlural","UniversalAdBlockStatus","PaymentAccountStatus","AdblocksUpdated","AdBlockStatusEnabled","AdBlockStatusDisabled","ClarityProjectID","PropertyName","created","deleted","updated","updatedSmallCase","changed","exported","downloaded","notificationPreferencesTitle","ServingStatusNotification","BillingAlertNotification","InvitedUserNotification","ProfileReviewNotification","BackgroundColor","ButtonBackgroundColor","AdUnitTypes","TitleColor","Font","addedAs","selectedAs","updatedMessageFormat","LifeCycleStatusID","nameChangedTo","added","removed","getActionDetailsForPayment","actionDetail","auditLog","changes","change","attributeChanged","amount","transactionMessageParts","getTransactionStatusAndAmount","n","oldValue","ActionDetail","getActionDetails","_auditLog$entityName","_auditLog$entityId","entityName","auditType","CREATE","ActionDetailsMessages","DELETE","EXPORT","DOWNLOAD","INVITE","_auditLog$changes","_auditLog$changes2","invitedUserEmail","invitedUserRole","INVITE_ACCEPT","UPDATE","actionDetailMessage","ServingStatusMap","getActionDetailsForAdunit","adblockMessages","_change$newValue","getActionDetailsForProperty","getActionDetailsForUser","getActionDetailsForPublisher","updateActionDetailsForUpdate","_actionDetails$change","_actionDetails$change2","_actionDetails$change3","showDetailsIcon","actionDetailsList","actionDetailsListItem","setShowDetails","index2","Intl","DateTimeFormat","second","hour12","modifiedAt","_item$userRoles$map$j","_item$userRoles","_item$userRoles$map$j2","_item$userRoles2","newFilters","newUserRoles","newAuditTypes","newEntityTypes","filterConditionMap","_filterCondition$filt","_filterConditionMap$g","operator","AuditHistoryPage","pageId","messageBarButtonStyle","renderCustomNotifications","pageStore","profileCardMessages","MessageBarButton","_handleProfileEditButtonClick","NotificationBar","onRemoved","_renderCustomNotifications","getLeftPosition","PADDING","summaryContent","tncWrapper","neutralSecondaryAlt","tncCheckbox","tncCheckboxWrapper","svg","tncAckMsgSubline","endingButton","actionButtonWrapper","TnCModal","onSkip","onAccept","isTnCAccepted","tncReleaseDate","Layer","FocusTrapZone","Logo","renderDarkLogo","viewBox","xmlns","AUTO_DISMISS_ANIMATION_TIME","animationTime","MANUAL_DISMISS_ANIMATION_TIME","toastStyle","notificationsContainer","notificationBody","notificationAnimation","animationName","automaticFadeIn","automaticFadeInOut","animationIterationCount","notificationIcon","easing","ToastNotification","ToastNotificationItem","onMessageDismiss","onAnimationEnd","dismissButtonAriaLabel","messageBarDismissButtonAriaLabel","dialogRoot","dialogWrapper","imgWrapper","barNotifications","isPaymentNotificationHandledPerUserSession","isPaymentCheerDialogHandledPerUserSession","getUserSettingStore","paymentCheerDialogActive","dismissPaymentCheerDialog","activatePaymentCheerDialog","getTnCStore","tncSignatureStatus","tncModalProps","useTnC","shouldDisableTnC","isAppLoading","MissingPaymentInformationNotificationId","windowLocationPath","shouldFetchUserPreference","shouldFetchPaymentOnboarding","shouldFetchBackendNotifications","shouldHideBarNotifications","shouldPushPaymentNotification","_userContext$userRole","shouldRemovePaymentNotificationInPanel","shouldTriggerPaymentCheerDialog","setupPaymentNotification","messageBarStyles","MissingPaymentInformation","ImageBase","dialogImg","variant","handlePaymentSetupClick","NotificationBarBase","useTrapZone","_this$props$items","_prevProps$items","_item$messageBarStyle","applyFilterButtonLabel","filterSelectionTextBoxErrorMessage","filtersTitle","filterListAriaDescription","appliedFilterListAriaLabel","filterMenuAriaLabel","removeFilterIconAriaLabel","applyFilterAriaDesc","filterOptionDropdownAriaLabel","filterTextBoxAriaLabel","startDatePlaceholder","endDatePlaceholder","greaterThan","greaterThanEqual","lessThan","lessThanEqual","filterMenuListItem","filterSelectionCallout","filterSelectionCalloutTitle","filterSelectionToolBar","filterSelectionApplyButton","filterSelectionCancelButton","disabledApplyButton","viewAllButton","clearAllButton","filterSummaryCallout","calloutCloseIcon","filterSummaryCalloutHeader","filterInfoSummaryItem","filterSummaryCalloutTitle","GridFilterBase","appliedFilterList","isFilterBeingModified","filterSelectionColumn","_filterListContainer","fil","applyModifyFilterStyles","_onFilterInfoFocusedClicked","_onFilterRemoveButtonClicked","_onFilterInfoUnfocusedClicked","shouldRestoreFocus","_onFilterMenuItemClicked","filterSelectionCalloutTarget","textBoxErrorMessage","relationalFilterOptions","stringFilterTypeOptions","applyButtonDisabled","isTargetOutsideGridFilter","elementContains","isTargetInsideFilterContainer","filterSelectionCalloutOpen","ariaHidden","_onFilterModified","_onFilterApplyButtonClicked","focusFirstChild","filterSummaryCalloutOpen","_getIndexOfElement","_getFilterContainerId","includeNullsInFilterResults","isFilterUnique","_isFilterUnique","isFilterBarFocused","_filterId","_appliedFilterList$fi","modifyFilter","_getIndexOfParentElement","isEventTargetOutsideGridFilter","currentDoc","addFiltertarget","isTargetAddFilterButton","filterContainerId","_addListeners","_this$props$initialFi","_this$props$initialFi2","_async","_tempDisposables","_renderFilterMenuCallout","_renderFilterSelectionCallout","_renderFilterSummaryCallout","_renderAppliedFiltersFocusedList","_renderAppliedFiltersUnfocusedList","getWindow","documentElement","_dismissOnLostFocus","shouldRenderLogo","renderGreyLogo","logo","objectFit","div","span","logoNavButton","msLogo","logoStyle","microsoftGreyLogo","microsoftDarkLogo","microsoftLogo","TnCNotificationComponent","signatureDate","buffer","TNC_NOTIFICATION_ID","TNC_PRE_SIGNATURE_FLAG","patchAcceptTnC","isSkipping","onPatchStart","onPatchFinished","onSuccess","withRetry","patchUrl","handledTnCPopup","shouldRenderTnCModal","setRenderTnC","acceptingTnC","setAcceptingTnC","isLatestAccepted","acceptedVersion","isTnCPreSigned","shouldHandleTnCForExistingUser","shouldForceHidePopup","onAcceptTnC","onSkipTnC","justifyItems","chartLine","chartGrid","headingTitleStyle","headingIconStyle","sectionStyle","sectionTitleStyle","contentRowStyle","contentLabelStyle","contentLabelStyleWithColor","sectionContentStyle","bodyContainerStyle","actionStyle","SummaryCard","HeadingRow","HeadingTitle","ActionsContainer","_ref4","Action","_ref5","Body","_ref6","Section","_ref7","SectionTitle","_ref8","ContentRow","_ref9","SectionContent","_ref10","downloadData","getActivePage","_col$csvHeaderName","csvHeaderName","GridDataDownloadFailure","existingEntityColumns","newNotificationCard","selectedNotificationId","LoadingBalanceDataFailed","startYear","startMonth","PayoutInformationFailed","_xpayJwtTokenRequest$","tokenResponse","xPayJWTRequest","_getAppStore$account","xpayParams","authToken","xpayClientName","isRefreshedUI","showTransactionReport","showSetupPopup","serviceAgreement","LoadPayoutInfoFailed","headerAction","panelHeaderText","updateLanguageFailed","invalidStateReLoginOrReport","setDocumentUploadPanelOpen","setAppealHistory","GOOGLE_ADSENSE_OAUTH_CLIENT_ID_PROD","GOOGLE_ADSENSE_OAUTH_ACCESS_TYPE","GOOGLE_ADSENSE_OAUTH_RESPONSE_TYPE","GOOGLE_ADSENSE_SCOPES","GOOGLE_API_SCRIPT","NOTIFICATION_FAILED_WITH_REASON_ERROR_CODE","MULTIPLE_GAM_ID_ERROR_CODE","OnHold","DEFAULT_SHIMMER_LINES","GridWithCustomColumns","calloutArticleQuery","headingText","headingCalloutContent","helpInfoProps","fetchPropertyServingConfig","fetchPublisherServingConfig","updatePropertyServingConfig","updatePublisherServingConfig","INVALID_INPUT","CODE_GENERATION_LIMIT_REACHED","REQUESTED_CODE_VERIFICATION_RESULT_NOT_FOUND_FOR_PUBLISHER","deleteButton","footerRowStyle","preTextStyle","fieldsContainerStyle","flexBasis","flexDisplay","BrandResponse","BrandDetailsResponse","_userContext$firstNam","_userContext$lastName","localeFromInvitationUrl","isInvitationUrlSupported","termsAndConditionsAccepted","userBody","runInAction","fetchedToken","exception","getDistinctUserRolesFrom","fromUserRoles","distinctUserRoles","currentAccountRole","newRole","isUserRoleSame","getUserRoleDetails","selectedAccounts","isDeepUserRolesEqual","isSame","eachRole","someRole","isUserRoleDifferent","allAccounts","userWithId","rawUser","windowsLiveIdUsername","homePhone","fax","SecretQuestion","accountManagerAccountList","reportUserAccountList","listManagerAccountList","adViewAccountList","fetchAccounts","accountManagerResponse","accountManagerAccount","reportUserResponse","reportUserAccount","listManagerResponse","adViewResponse","existingUserRoles","editedUserRoles","newCustomerLevelRole","newAccountLevelRoles","existingAccountRoles","publisherDetails","generatedToken","fetchedUsers","fetchedUserInvitations","publisherCountry","_VerificationErrorsMe","_JSON$parse2","newUserDetails","_profile$publisher","_newUserDetails$conta","phoneNumberWithCountryCode","_getProfileStore$acti","subStatus","deliveryFailed","codeSent","_getProfileStore$acti2","apiErrorCode","VerificationErrorsMessages","Uploaded","newPublisherDetails","newUserContactDetails","updateUserContactDetails","updatedPublisherDetails","_newUserDetails$posta","_newUserDetails$posta2","_newUserDetails$posta3","_newUserDetails$posta4","_newUserDetails$posta5","_newUserDetails$posta6","addressValidation","isOrg","retValue","_newPublisherDetails$","_newPublisherDetails$2","_newPublisherDetails$3","_newPublisherDetails$4","_newPublisherDetails$5","_newPublisherDetails$6","verifyGeneratedCodeAsync","codeMatched","codeMismatched","commonCollapsibleIconStyle","collapseStyle","expandStyle","collapseIconStyle","expandIconStyle","commonCheckboxStyle","CheckboxGroup","onExpand","onCollapse","disabledCheckboxTooltipText","areAllChildrenChecked","areSomeChildrenChecked","isInExpandedState","toggleIsInExpandedState","handleExpandCollapseButtonClick","handleParentCheckboxClick","isParentCheckboxDisabled","renderLabel","getCheckboxId","parent","indeterminate","child","BOX_HEIGHT","containerBorderStyle","checkboxTreeContainerStyle","selectionBoxContainerStyle","selectedItemsContainerStyle","titleContainerStyle","removeAllButtonStyle","errorMessageStyle","searchBorderStyle","singleCheckboxStyle","checkboxContainerStyle","searchBoxRootStyle","selectedBlockStyle","isCheckboxGroup","CheckboxTree","onSearchClear","onSearchTermChange","suppressSearch","searchTerm","setSearchTerm","handleSearchTermChange","getFilteredGroups","_child$label","handleSearchClear","disabledSelectionTooltipText","onRenderSelectionItem","restProps","renderSelectedItem","DismissFRERequest","EntitySummary","Home","_userDetails$language","ccmtAccount","devtokenparam","evaluationResponse","fetchPublisherEvaluationStatus","ProfileCardMessages","billingLabel","billingDescription","servingLabel","servingDescription","profileLabel","invitedUserLabel","invitedUserDescription","saveButtonAriaDesc","alignItem","gridDisplay","panelSectionContent","panelContent","panelSection","publisherSettingsPermissions","hasPublisherPreferencesReadAccess","hasPublisherPreferencesUpdateAccess","userSettingsPermissions","hasSettingsReadAccess","hasSettingsUpdateAccess","hasBillingAlertsAccess","hasServingStatusAccess","hasProfileReviewAccess","hasInvitedUsersAccess","settingsIcon","BillingAlert","ProfileReview","InvitedUser","userPreferences","tnc","hasAccessToNotifications","notificationPreferencesUpdate","pathModels","_msg$closePanel","_msg$setFormChanged","updatedUserLanguage","updateUserResp","remove","DeletingUserWentWrong","accountDetails","oAuthConnectionStatus","connectedDate","connectedTimeStamp","connectedImageSrc","userImageUri","_response$oauthFailur","_response$oauthFailur2","oauthFailureReasons","connectionStatusTip","actionItems","_response$oauthFailur3","handleMediationResponse","healthCheckUrlParams","errorToastNotification","PubCenterUserRoles","checkInternalUserAccess","UnauthorizedInternalUserRoute","AuthenticatedRoute","redirectToOldLoginPage","redirectToNewLoginPage","signInButton","signInButtonAriaLabel","redirectionMessage","RedirectionSpinner","ResourceType","CrossEntityResourceType","crossEntityResourceTypeMap","PublisherByAccount","PublisherByAdunit","PublisherByUser","PublisherByWebProperty","ResourceTypeDistribution","defaultCalloutWidth","SearchBase","_this$_searchBarEleme","_this$props$onClearIn","_searchBarElement","onClearInResponsiveView","shimmerCallout","shimmerElement","queryText","minNumLettersForSearchTrigger","searchBoxProps","_this$props$onClearIn2","_this$props2","handleClickOutside","searchInProgress","_calloutProps$callout","minLettersToSearch","searchResultList","screenWidth","screenHeight","searchCalloutProps","otherCalloutProps","searchBar","disableAnimation","_onChange","_onClear","calloutWrapper","directionalHintFixed","_onRenderShimmer","category","onRenderSearchResult","onRenderSearchResultFooter","homeButtonAriaLabel","dropdownAriaLabel","myAccountDescribedByLabel","myAccountStatusLabel","defaultRouteDirection","isTythonExperience","defaultButtonStyle","defaultButtonWrapperStyle","itemIcon","moreInfoIcon","overflowIcon","overflowMenuWrapper","navigationLm","leftSection","rightSection","helpCenterIcon","textHeader","dropdownOption","navItem","itemIdentity","primaryText","defaultLang","_data$items","_localStorage$getItem2","_localStorage$getItem3","_this$props$renderLef","shouldRenderCustomLeftIcon","renderLeftIcon","isSearchBarActiveInNonRegularView","shouldHideDropdownInResponsiveView","shouldRenderSearchBarInResponsiveView","headerItems","headerIconItems","headerIconOverflowItems","isContentOnlyLayout","selectedLang","selectedHeaderItem","_this$state$selectedI","onItemClick","_getLanguageContextualMenuItems","_navigateTo","_shouldShowDropdownSearch","_onRenderOption","_initializeRoutesData","_onDropdownChange","searchProps","menuAs","_getMenu","persistMenu","OverflowSet","overflowItems","_onRenderItem","onRenderOverflowButton","_onRenderOverflowButton","overflowSide","_createPanel","onNavigate","identity","_renderIdentity","_renderIcon","rootExpanded","_showPanel","overflowItemSerializer","_item$onClick","_item$onClick2","_item$onClick3","_item$onClick4","_item$onClick5","_item$onClick6","initialRouteMatch","initialRoute","loadingText","selectedLanguage","_getAppStore$userCont","_localStorage$getItem4","routeMatch","headerData","ResizeGroup","_onRenderData","_onReduceData","Profile","_hidePanel","dropdownItems","onSearchTriggered","resourceTypes","globalFilters","resourceTypeDistribution","setGlobalSearchResult","setSearchQuery","setSearchingStatus","searching","getGlobalSearchCalloutStore","postSearch","resourceType","paginationOptions","pageToken","highlightingOptions","highlightPreTag","highlightPostTag","searchResultHeader","categorySeparator","borderTopColor","entityContainer","entityIcon","entityInfo","textLinkFooter","EntityIconMap","WebProperty","PublisherByAdUnit","PublisherByChannel","PublisherByFilter","GlobalSearchHeader","searchResult","retVal","searchCategory","categoryName","totalCount","resultMetadata","ResultCountPerResourceType","resultItem","searchResultItem","resourceName","resourceId","PublisherId","AccountId","_createRoutePath","DynamicBucketSize","sourceRef","searchResultCategory","searchResultHeaderDescId","_onViewMoreResultClicked","_onRenderCell","cellDescId","_onItemClicked","elementId","_searchProps","layoutStore","_searchResultToCategories","_userContext$name","_userContext$email","menuAccessPermissions","_getMenuAccessPermission","newRoutes","_onSearchQueryChange","_onClearSearch","_onRenderSearchResult","_onRenderSearchCalloutFooter","renderLeftMost","Page","renderWhiteBackground","LoginPageMessages","handleResize","_renderSpinner","localStorageLocal","renderLeftMostSection","setSearchParams","showMoreLoading","clearStore","isShowMoreLoading","searchResultInfo","resultInfo","resultData","SearchResult","CreationDateTime","Status","_item","getPublisherId","getAccountId","getResourceType","AdFilter","numberOfExcludedURLs","NumberOfExcludedURLs","numberOfExcludedKeywords","NumberOfExcludedKeywords","numberOfChannels","NumberOfChannels","numberOfAdunits","NumberOfAdunits","numberOfAdFilters","NumberOfAdFilters","lastModifiedDateTime","LastModifiedDateTime","FullName","PublisherName","WebSiteURL","resourceTypePriorityMap","Reporting","buildSearchResults","publisherCrossEntities","NextPageToken","promiseResponses","reqResourceTypes","resultPriorityOptions","responses","responseMap","resourceTypeMap","totalResultCount","routePrefix","orderedResourceTypesMap","orderedResourceTypes","getOrderedResources","clickableCellAriaDesc","showMoreDescription","buttonIcon","iconHeader","iconCell","visibility","iconImg","GlobalSearchResultList","GlobalSearchResultListMessages","cellAriaDescId","_onClick","_renderItemColumn","_buildSearchResultListColumns","isHeaderVisible","_columnNames","iconColumn","isIconOnly","_columns","isCollapsable","filterSearchBy","clearFilters","filterCheckboxAriaDesc","filterContent","clearFilterButton","GlobalSearchResultPage","_filters","_updateFilters","GlobalSearchResultPageMessages","_getFilters","_clearFilters","_getSearchResultLists","filterState","checkboxAriaDescId","_checkBoxClicked","filterResource","GlobalSearchResultRouter","productName","pubCenterNewBrand","slogan","incentive","contactUs","alreadyMember","alreadyMemberNewBrand","emailAddressLabel","signIn","signUp","usersToBeQuestion","usersToBeQuirkOne","usersToBeQuirkTwo","usersToBeQuirkThree","moneyLabel","moneyDesc","adsLabel","adsDesc","timeLabel","timeDesc","advantageOneDescOne","advantageOneDescTwo","advantageTwoDescOne","advantageTwoDescTwo","startingHeader","startingDesc","stepOneHeader","stepOneDesc","stepTwoHeader","stepTwoDesc","stepThreeHeader","stepThreeDesc","monetizationHeader","monetizationDesc","imgBackgroundAlt","imgMoneyBagAlt","imgAdsAlt","imgTimeAlt","imgPrimaryOnboardAlt","imgSecondaryOnboardAltOne","imgSecondaryOnboardAltTwo","imgSecondaryOnboardAltThree","emailInputPlaceholder","space","imageWithTextGrid","introductionContainer","textFieldTitle","textFieldGroup","centerTextAlign","imageContainer","aboutUsBG","backgroundPosition","backgroundBlendMode","backgroundRepeat","signInContainer","bodyContainer","imageWithTextOnLeft","imageWithTextOnRight","iconsContainer","iconsContainerPrimary","stepsContainer","monetizationContainer","smaller","font18","font16","font14","AboutUsPage","useLayoutEffect","handleSignInClick","fieldGroup","woman","money","time","man","twoWomen","one","two","three","inventoryCreationTitle","inventoryCreationContentSectionOne","inventoryCreationContentSectionOneLink","inventoryCreationContentSectionTwo","inventoryCreationContentSectionTwoLink","inventoryCreationCardTitleSite","adsCreationCardTitleSite","adsCreationCardTitleApp","inventoryCreationCardDescriptionSite","inventoryCreationCardDescriptionApp","inventoryCreationCardTitleApp","MSPolicyPlaceholder","AdRenderingPoliciesPlaceholder","SiteApprovalGuidelinesPlaceholder","AppApprovalGuidelinesPlaceholder","adsCreationTitle","adsCreationContentSectionOne","contentSection","cardGroupWrapper","cardSelected","colorNeutralBackground2Selected","cardDescription","EntityTypeCreationType","InventoryType","selectedInventoryType","setSelectedInventoryType","entityCreationUrl","Inventory","Site","App","useEntityCreationLayout","EntityCreationLayoutTitle","EntityCreationLayoutContentSectionOne","helpLinkPlaceholder","EntityCreationLayoutContentSectionTwo","EntityCreationLayoutSelectableCards","inventoryType","cardIcon","Title2","onSelectionChange","AdTypePage","EntityCreationLayout","InventoryTypePage","InvalidUserErrorPage","errorImageAltText","renderTitle","titleSubText","defaultButtonLabel","onDefaultButtonClick","emailStyle","UserNotFound","decodeToken","upn","decoded","output","decodeURIComponent","escape","_urlBase64Decode","pubCenterAADAuthService","pubSilentTokenRequest","pubTokenRequest","_userInfo$email","userInfo","newUserContext","preferred_username","given_name","family_name","userDoesNotExist","userDoesNotExist2","switchAccountLabel","gotoAdvertising","signupToPubCenter","unauthorizedInternalUser","requestAccess","signInWithMSA","UnauthorizedInternalUserPage","onRedirectToEnterpriseUserAccessUI","onSwitchAccountClicked","UserDoesNotExistErrorPage","errorDescriptionPart1","errorDescriptionPart2","NoAccessErrorPage","messageCode","transactionId","LandingPage","LoginPage","isRedirectionFlow","setRedirectionFlow","redirectTo","ResponsiveNonSmall","getTextFieldStyles","LoginPageView","signInButtonStyle","emailInputRef","ImageFit","cover","loginBackgroundImage","_emailInputRef$curren","signUpDetailsTitle","signUpDetailsContentYes","signUpDetailsContentNo","signUpDetailsCountryTerritory","signUpDetailsTermsAndConditions","signUpDetailsCountry","agreementText","defaultCountry","messageBarText","organizationName","orgNamePlaceholder","signupdetailsBoldBanner","signupdetailsInfoBanner","signupdetailsWaitlist","signupEmailOptIn","signupEmailOptInPrivacyLink","signUpDetailsPreferredLanguage","signUpDetailsCurrency","switchNowButton","privacyEmailLinkWrapper","AcceptInvitePage","invitationcode","_store$active$languag","getUserPageStore","loginPageStore","_onPreferredLanguageChange","signUpMessages","_onSwitchAccountButtonClicked","formTitleInputHeader","formEmailInputHeader","formEmailInputPlaceholder","formCreationFailedTitle","formCreationFailedDetails","formCreationSuccessTitle","formCreationSuccessDetails","formTitleInputPlaceholder","formDescriptionInputHeader","formDescriptionInputPlaceholder","formSubmitButton","formSubmitButtonLoading","formDescriptionWordsCount","formDescriptionWordCount","imageWidth","formWrapper","emailIcon","submitButton","errorBannerWrapper","formSuccessHead","descriptionWordCountWrapper","fontColor","formInputStyles","transparentText","MAX_WORD_COUNT","useSupportPage","titleInput","setTitleInput","descriptionInput","setDescriptionInput","emailInput","setEmailInput","shouldRenderFailureMessage","setShouldRenderFailureMessage","createdTicketCaseNumber","setCreatedTicketCaseNumber","isFormLoading","setIsFormLoading","debounceTimeout","emailLogo","emailSentLogo","_document$getElementB2","_document$getElementB3","subject","onDescriptionChange","prevWords","newWords","wordCountElement","parentNode","nextSibling","insertBefore","onFormSubmit","SupportLanguage","SupportCountry","postFormSubmission","_termsAndConditionsLi","caseNumber","termsAndConditionsLink","SupportPage","successMessageRef","ticketNumber","resizable","messageBarIconProps","msgTitle","TermsNConditionsPage","_tncContentString$rep","tncContentString","handleSkipToMainContentClick","mainContentNode","domainStringValidator","duplicateDomainStringValidator","nameStringValidator","duplicateNameStringValidator","ApplicationRoute","IntlProvider","queryClient","QueryClient","ReactDOM","QueryClientProvider","client","ReactQueryDevtools","initialIsOpen","BrowserRouter","ThemeProvider","serviceWorker","ready","registration","unregister","_Object$keys","localStorageCache","tythonRedirectionUtils"],"mappings":"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AK,0BACL,IAAK,2CACL,IAAK,iBACL,IAAK,uBACL,IAAK,cACL,IAAK,iBACL,IAAK,2BACL,IAAK,2BACL,IAAK,QACL,IAAK,uBACL,IAAK,qBACL,IAAK,eACL,IAAK,kDACL,IAAK,qBACL,IAAK,eACL,IAAK,YACL,IAAK,kCACL,IAAK,2BACL,IAAK,wBACL,IAAK,gBACL,IAAK,8BACL,IAAK,cACL,IAAK,qBACL,IAAK,gCACL,IAAK,iBACL,IAAK,8BACL,IAAK,gCACL,IAAK,+BACL,IAAK,YACL,IAAK,YACL,IAAK,QACL,IAAK,uBACL,IAAK,wCACL,IAAK,6CACL,IAAK,aACL,IAAK,uBACL,IAAK,UACL,IAAK,yBACL,IAAK,aACL,IAAK,oBACL,IAAK,YACL,IAAK,gBACL,IAAK,2BACL,IAAK,aACL,IAAK,WACL,IAAK,cACL,IAAK,qBACL,IAAK,sBACL,IAAK,YACL,IAAK,uBACL,IAAK,kBACL,IAAK,kBACL,IAAK,gBACL,IAAK,4BACL,IAAK,cACL,IAAK,kCACL,IAAK,kBACL,IAAK,YACL,IAAK,kBACL,IAAK,kBACL,IAAK,mBACL,IAAK,YACL,IAAK,UACL,IAAK,sBACL,IAAK,mBACL,IAAK,YACL,IAAK,6BACL,IAAK,aACL,IAAK,qBACL,IAAK,gBACL,IAAK,mBACL,IAAK,gBACL,IAAK,4BACL,IAAK,WACL,IAAK,kBACL,IAAK,kBACL,IAAK,MACL,IAAK,mBACL,IAAK,gBACL,IAAK,WACL,IAAK,MACL,IAAK,yCACL,IAAK,4BACL,IAAK,mBACL,IAAK,sBACL,IAAK,UACL,IAAK,6BACL,IAAK,iBACL,IAAK,mBACL,IAAK,sBACL,IAAK,oBACL,IAAK,aACL,IAAK,gCACL,IAAK,eACL,IAAK,kCACL,IAAK,+BACL,IAAK,+BACL,IAAK,4BACL,IAAK,kBACL,IAAK,iCACL,IAAK,eACL,IAAK,OACL,IAAK,yBACL,IAAK,kCACL,IAAK,SACL,IAAK,wBACL,IAAK,yBACL,IAAK,mBACL,IAAK,wCACL,IAAK,WACL,IAAK,QACL,IAAK,+CACL,IAAK,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","file":"static/js/main.05e8635b.chunk.js","sourcesContent":["import { classNamesFunction, getId } from '@fluentui/react';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { useWindowSize } from '../../../hooks';\r\nimport { getStore } from '../../../hooks/useWindowSize/store/store';\r\nimport { getScreenReaderTextStyles } from '../../../utils/GlobalStyleUtils';\r\nimport { IFormItemProps, IFormItemStyleProps, IFormItemStyles } from './FormItem.types';\r\n\r\nconst getFormClassNames = classNamesFunction<IFormItemStyleProps, IFormItemStyles>();\r\n\r\n// Usage: Can be used for presentation to provide consistent gap between multiple form elements.\r\n// If it's used to wrap multiple elements within a form, role and aria props can be set appropriately\r\n\r\nconst { windowStoreSerializer } = useWindowSize();\r\n\r\nexport const FormItemBase = observer((props: IFormItemProps) => {\r\n const { isWindowSmallSize } = windowStoreSerializer(getStore());\r\n const {\r\n id,\r\n formWidth = isWindowSmallSize ? 324 : 440,\r\n theme,\r\n styles,\r\n role,\r\n ariaLabel,\r\n ariaLabelledBy,\r\n ariaDescription,\r\n ariaDescribedBy,\r\n } = props;\r\n const formClassNames = getFormClassNames(styles, { theme: theme!, formWidth });\r\n const descId = id ? `${id}desc` : getId('FormItemDesc');\r\n\r\n return (\r\n <div\r\n id={id}\r\n className={formClassNames.root}\r\n role={role ? role : 'presentation'}\r\n aria-label={ariaLabel ? ariaLabel : undefined}\r\n aria-labelledby={ariaLabelledBy ? ariaLabelledBy : undefined}\r\n aria-describedby={ariaDescribedBy ? ariaDescribedBy : ariaDescription ? descId : undefined}\r\n >\r\n {props.children}\r\n {ariaDescription ? (\r\n <span id={descId} style={getScreenReaderTextStyles()}>\r\n {ariaDescription}\r\n </span>\r\n ) : null}\r\n </div>\r\n );\r\n});\r\n","import { styled } from '@fluentui/react';\r\nimport { FormItemBase } from './FormItem.base';\r\nimport { getStyles } from './FormItem.styles';\r\nimport { IFormItemProps, IFormItemStyleProps, IFormItemStyles } from './FormItem.types';\r\n\r\n// Use Fabric Base guidelines since this might be contributed back to Fabric.\r\nexport const FormItem = styled<IFormItemProps, IFormItemStyleProps, IFormItemStyles>(FormItemBase, getStyles, undefined, {\r\n scope: 'FormItem',\r\n});\r\n","import { IPubcenterSpacing } from '../../../../theme';\r\nimport { IFormItemStyleProps, IFormItemStyles } from './FormItem.types';\r\n\r\nexport const getStyles = (props: IFormItemStyleProps): IFormItemStyles => {\r\n const { formWidth, theme } = props;\r\n const DefaultFormWidth = 220;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n return {\r\n root: [\r\n 'ms-Form-Item',\r\n {\r\n display: 'block',\r\n width: formWidth || DefaultFormWidth,\r\n marginBottom: spacing.size16\r\n }\r\n ],\r\n };\r\n};\r\n","import { IButtonStyles, ITheme } from '@fluentui/react';\r\nimport { IPubcenterSpacing } from '../../../../theme';\r\nimport { IFormSectionStyleProps, IFormSectionStyles } from './FormSection.types';\r\n\r\nexport const getStyles = (props: IFormSectionStyleProps): IFormSectionStyles => {\r\n const { sectionWidth, expanded, theme, spaceBetween, hasBorderBottom = true } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const defaultWidth = 644;\r\n\r\n return {\r\n root: {\r\n width: sectionWidth || defaultWidth,\r\n borderTopWidth: 1,\r\n borderBottomWidth: hasBorderBottom ? 1 : 0,\r\n borderTopStyle: 'solid',\r\n borderBottomStyle: 'solid',\r\n borderColor: theme.palette.neutralLight,\r\n selectors: {\r\n $content: {\r\n display: expanded ? 'block' : 'none',\r\n },\r\n },\r\n },\r\n title: [\r\n 'ms-FormSectionTitle',\r\n {\r\n display: 'flex',\r\n justifyContent: spaceBetween ? 'space-between' : 'flex-start',\r\n alignItems: 'center',\r\n backgroundColor: theme.palette.white,\r\n height: '42px',\r\n cursor: 'pointer',\r\n selectors: {\r\n ':hover': {\r\n backgroundColor: theme.palette.neutralLighter,\r\n },\r\n },\r\n },\r\n ],\r\n content: [\r\n 'ms-FormSectionContent',\r\n {\r\n backgroundColor: theme.palette.white,\r\n marginBottom: spacing.size32,\r\n height: 'inherit',\r\n },\r\n ],\r\n titleLabel: [\r\n 'ms-fontWeight-semibold',\r\n {\r\n fontSize: theme.fonts.mediumPlus.fontSize,\r\n },\r\n ],\r\n };\r\n};\r\n\r\nexport const iconButtonStyles = (theme: ITheme): IButtonStyles => {\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n return {\r\n root: [\r\n {\r\n paddingLeft: spacing.size8,\r\n paddingRight: spacing.size12,\r\n paddingTop: spacing.size16,\r\n paddingBottom: '14px',\r\n color: theme.palette.neutralSecondary,\r\n fontSize: theme.fonts.small.fontSize,\r\n },\r\n ],\r\n };\r\n};\r\n","import { classNamesFunction, getId, Icon } from '@fluentui/react';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { useState } from 'react';\r\nimport { useWindowSize } from '../../../hooks';\r\nimport { getStore } from '../../../hooks/useWindowSize/store/store';\r\nimport { isButtonPressKey } from '../../../utils/AccessibilityUtils';\r\nimport { getScreenReaderTextStyles } from '../../../utils/GlobalStyleUtils';\r\nimport { iconButtonStyles } from './FormSection.styles';\r\nimport { IFormSectionProps, IFormSectionStyleProps, IFormSectionStyles } from './FormSection.types';\r\n\r\nconst getClassNames = classNamesFunction<IFormSectionStyleProps, IFormSectionStyles>();\r\n\r\nconst { windowStoreSerializer } = useWindowSize();\r\n\r\nexport const FormSectionBase = observer((props: IFormSectionProps) => {\r\n const { isWindowSmallSize } = windowStoreSerializer(getStore());\r\n\r\n const { styles, theme, title, ariaDescription, formWidth = isWindowSmallSize ? 324 : 440, rightChevron, hasBorderBottom } = props;\r\n const [expanded, setExpanded] = useState(props.expanded);\r\n const classNames = getClassNames(styles, {\r\n theme: theme!,\r\n sectionWidth: formWidth,\r\n spaceBetween: rightChevron,\r\n expanded,\r\n hasBorderBottom: hasBorderBottom!,\r\n });\r\n const id = getId('formSectionDescription');\r\n const formSectionDescription =\r\n (ariaDescription !== undefined ? ariaDescription : '') + 'Click to ' + (expanded ? 'collapse' : 'expand') + ' section.';\r\n\r\n const ChevronIcon = <Icon iconName={expanded ? 'ChevronUp' : 'ChevronDown'} styles={iconButtonStyles(theme!)} />;\r\n\r\n const TitleLabel = (\r\n <div className={classNames.titleLabel} role=\"heading\" aria-level={2}>\r\n {title}\r\n </div>\r\n );\r\n\r\n const onToggle = (): void => {\r\n setExpanded(!expanded);\r\n props.sectionStateChange?.(!expanded);\r\n };\r\n\r\n return (\r\n <div className={classNames.root}>\r\n <div\r\n className={classNames.title}\r\n onClick={onToggle}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key) && onToggle()}\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-expanded={expanded}\r\n aria-describedby={id}\r\n >\r\n {rightChevron ? (\r\n <>\r\n {TitleLabel}\r\n {ChevronIcon}\r\n </>\r\n ) : (\r\n <>\r\n {ChevronIcon}\r\n {TitleLabel}\r\n </>\r\n )}\r\n\r\n <span id={id} style={getScreenReaderTextStyles()}>\r\n {formSectionDescription}\r\n </span>\r\n </div>\r\n <div className={classNames.content} hidden={!expanded} aria-hidden={!expanded}>\r\n {props.children}\r\n </div>\r\n </div>\r\n );\r\n});\r\n","import { styled } from '@fluentui/react';\r\nimport { FormSectionBase } from './FormSection.base';\r\nimport { getStyles } from './FormSection.styles';\r\nimport { IFormSectionProps, IFormSectionStyleProps, IFormSectionStyles } from './FormSection.types';\r\n\r\n// Use Fabric Base guidelines since this might be contributed back to Fabric.\r\nexport const FormSection = styled<IFormSectionProps, IFormSectionStyleProps, IFormSectionStyles>(FormSectionBase, getStyles, undefined, {\r\n scope: 'FormSection',\r\n});\r\n","import { BaseComponent, ICalloutProps, classNamesFunction } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport AppMessages from '../../../App.messages';\r\nimport { InfoButton } from '../../InfoButton';\r\nimport { IFormTitleProps, IFormTitleStyleProps, IFormTitleStyles } from './FormTitle.types';\r\n\r\nconst getClassNames = classNamesFunction<IFormTitleStyleProps, IFormTitleStyles>();\r\n\r\nexport class FormTitleBase extends BaseComponent<IFormTitleProps> {\r\n public render(): JSX.Element {\r\n const {\r\n articleQuery,\r\n id,\r\n styles,\r\n theme,\r\n title,\r\n calloutContent,\r\n calloutOnDismiss,\r\n iconButtonOnClick,\r\n noHelpPopup,\r\n intl,\r\n titleHeadingLevel,\r\n } = this.props;\r\n\r\n const { formatMessage } = intl;\r\n const classNames = getClassNames(styles, { theme: theme! });\r\n const calloutProps: ICalloutProps = {\r\n calloutWidth: 300,\r\n };\r\n\r\n return (\r\n <div className={classNames.root}>\r\n <div id={id} className={classNames.title} role=\"heading\" aria-level={titleHeadingLevel ?? 1}>\r\n {title}\r\n </div>\r\n {!noHelpPopup && (\r\n <InfoButton\r\n ariaLabel={formatMessage(AppMessages.infoLabel, { label: title })}\r\n ariaDescription={formatMessage(AppMessages.infoDescription, { label: title })}\r\n iconTitle=\"Information\"\r\n calloutContent={calloutContent}\r\n calloutProps={calloutProps}\r\n calloutOnDismiss={calloutOnDismiss}\r\n iconButtonOnClick={iconButtonOnClick}\r\n articleQuery={articleQuery}\r\n />\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n","import { IPubcenterTheme } from '../../../../theme';\r\nimport { flexWithAlignCenter } from '../../../utils/GlobalStyleUtils';\r\nimport { IFormTitleStyleProps, IFormTitleStyles } from './FormTitle.types';\r\n\r\nexport const getStyles = (props: IFormTitleStyleProps): IFormTitleStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { fonts } = theme;\r\n\r\n return {\r\n root: [\r\n {\r\n ...flexWithAlignCenter,\r\n },\r\n ],\r\n title: [\r\n 'ms-fontWeight-semibold',\r\n {\r\n ...fonts.size20,\r\n },\r\n ],\r\n };\r\n};\r\n","import { styled } from '@fluentui/react';\r\nimport { FormTitleBase } from './FormTitle.base';\r\nimport { getStyles } from './FormTitle.styles';\r\nimport { IFormTitleProps, IFormTitleStyleProps, IFormTitleStyles } from './FormTitle.types';\r\n\r\nexport const FormTitle = styled<IFormTitleProps, IFormTitleStyleProps, IFormTitleStyles>(FormTitleBase, getStyles, undefined, {\r\n scope: 'FormTitle',\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n account: {\r\n id: 'app.account',\r\n defaultMessage: 'Account',\r\n },\r\n activate: {\r\n id: 'app.activate',\r\n defaultMessage: 'Activate',\r\n },\r\n delete: {\r\n id: 'app.delete',\r\n defaultMessage: 'Delete',\r\n },\r\n deactivate: {\r\n id: 'app.deactivate',\r\n defaultMessage: 'Deactivate',\r\n },\r\n duplicate: {\r\n id: 'app.duplicate',\r\n defaultMessage: 'Duplicate',\r\n },\r\n edit: {\r\n id: 'app.edit',\r\n defaultMessage: 'Edit',\r\n },\r\n code: {\r\n id: 'app.code',\r\n defaultMessage: 'Code',\r\n },\r\n information: {\r\n id: 'app.information',\r\n defaultMessage: 'Information',\r\n },\r\n atleastSelectOneAccount: {\r\n id: 'app.atleastSelectOneAccount',\r\n defaultMessage: 'At least select 1 account',\r\n },\r\n deactivateLowercase: {\r\n id: 'grid.deactivate.deactivateLowercase',\r\n defaultMessage: 'deactivate',\r\n },\r\n activateLowercase: {\r\n id: 'app.activateLowercase',\r\n defaultMessage: 'activate',\r\n },\r\n enabledUppercase: {\r\n id: 'app.enabledUppercase',\r\n defaultMessage: 'Enabled',\r\n },\r\n disabledUppercase: {\r\n id: 'app.disabledUppercase',\r\n defaultMessage: 'Disabled',\r\n },\r\n export: {\r\n id: 'app.export',\r\n defaultMessage: 'Export',\r\n },\r\n download: {\r\n id: 'app.download',\r\n defaultMessage: 'Download',\r\n },\r\n downloadSelected: {\r\n id: 'app.downloadSelected',\r\n defaultMessage: 'Download Selected',\r\n },\r\n downloadPage: {\r\n id: 'app.downloadPage',\r\n defaultMessage: 'Download Page',\r\n },\r\n downloadAll: {\r\n id: 'app.downloadAll',\r\n defaultMessage: 'Download All',\r\n },\r\n downloadSelectedCmdBtnAriaDesc: {\r\n id: 'app.downloadSelectedCmdBtnAriaDesc',\r\n defaultMessage: 'Download Selected',\r\n },\r\n downloadPageCmdBtnAriaDesc: {\r\n id: 'app.downloadPageCmdBtnAriaDesc',\r\n defaultMessage: 'Download Page',\r\n },\r\n downloadAllCmdBtnAriaDesc: {\r\n id: 'app.downloadAllCmdBtnAriaDesc',\r\n defaultMessage: 'Download All',\r\n },\r\n downloadCmdBtnAriaDesc: {\r\n id: 'grid.downloadCmdBtnAriaDesc',\r\n defaultMessage: 'Click to download grid data',\r\n },\r\n addFilter: {\r\n id: 'app.addFilter',\r\n defaultMessage: 'Add filter',\r\n },\r\n filters: {\r\n id: 'app.filters',\r\n defaultMessage: 'Filters',\r\n },\r\n filtersDescription: {\r\n id: 'app.filtersDescription',\r\n defaultMessage: 'Select the filters you want.',\r\n },\r\n updateFilters: {\r\n id: 'app.updateFilters',\r\n defaultMessage: 'Update filters',\r\n },\r\n addMetrics: {\r\n id: 'app.addMetrics',\r\n defaultMessage: 'Add metrics',\r\n },\r\n modifyColumns: {\r\n id: 'app.modifyColumns',\r\n defaultMessage: 'Modify Columns',\r\n },\r\n modifyColumnsDescription: {\r\n id: 'app.modifyColumnsDescription',\r\n defaultMessage: 'Select the columns you want. {appName} will set the order.',\r\n },\r\n updateColumns: {\r\n id: 'app.updateColumns',\r\n defaultMessage: 'Update columns',\r\n },\r\n publisher: {\r\n id: 'app.publisher',\r\n defaultMessage: 'Publisher',\r\n },\r\n noPublisherSelected: {\r\n id: 'app.noPublisherSelected',\r\n defaultMessage: 'A publisher isn’t selected yet. To start managing {entity}, search for a publisher and then if available, an account.',\r\n },\r\n noAccountSelected: {\r\n id: 'app.noAccountSelected',\r\n defaultMessage: 'The publisher does not have an account associated with it. To get started, create an account.',\r\n },\r\n customerInvalid: {\r\n id: 'app.customerInvalid',\r\n defaultMessage: `This publisher can't be accessed in {appName}. Please search for another one.`,\r\n },\r\n upload: {\r\n id: 'app.upload',\r\n defaultMessage: 'Upload',\r\n },\r\n previous: {\r\n id: 'app.previous',\r\n defaultMessage: 'Previous',\r\n },\r\n continue: {\r\n id: 'app.continue',\r\n defaultMessage: 'Continue',\r\n },\r\n cancel: {\r\n id: 'app.cancel',\r\n defaultMessage: 'Cancel',\r\n },\r\n apply: {\r\n id: 'app.apply',\r\n defaultMessage: 'Apply',\r\n },\r\n search: {\r\n id: 'app.search',\r\n defaultMessage: 'Search',\r\n },\r\n finish: {\r\n id: 'app.finish',\r\n defaultMessage: 'Finish',\r\n },\r\n required: {\r\n id: 'app.required',\r\n defaultMessage: 'Required',\r\n },\r\n optional: {\r\n id: 'app.optional',\r\n defaultMessage: 'Optional',\r\n },\r\n support: {\r\n id: 'app.support',\r\n defaultMessage: 'support',\r\n },\r\n default: {\r\n id: 'app.default',\r\n defaultMessage: 'Default',\r\n },\r\n status: {\r\n id: 'app.status',\r\n defaultMessage: 'Status',\r\n },\r\n partnerCodes: {\r\n id: 'app.partnerCodes',\r\n defaultMessage: 'Partner Codes',\r\n },\r\n removeAll: {\r\n id: 'app.removeAll',\r\n defaultMessage: 'Remove all',\r\n },\r\n addAll: {\r\n id: 'app.addAll',\r\n defaultMessage: 'Add all',\r\n },\r\n add: {\r\n id: 'app.add',\r\n defaultMessage: 'Add',\r\n },\r\n replace: {\r\n id: 'app.replace',\r\n defaultMessage: 'Replace',\r\n },\r\n append: {\r\n id: 'app.append',\r\n defaultMessage: 'Append',\r\n },\r\n name: {\r\n id: 'app.name',\r\n defaultMessage: 'Name',\r\n },\r\n domain: {\r\n id: 'app.domain',\r\n defaultMessage: 'Domain',\r\n },\r\n multiSelectPickerSelectedItemsLabel: {\r\n id: 'multiSelectPicker.selectedItemsLabel',\r\n defaultMessage: 'Selected: {count}',\r\n },\r\n timezoneLabel: {\r\n id: 'timezoneLabel',\r\n defaultMessage: ' Time zone',\r\n },\r\n timezoneEST: {\r\n id: 'timezoneEST',\r\n defaultMessage: '(GMT-05:00) Eastern Time (US & Canada)',\r\n },\r\n timezoneIDL: {\r\n id: 'timezoneIDL',\r\n defaultMessage: '(GMT-12:00) International Date Line West',\r\n },\r\n address: {\r\n id: 'address',\r\n defaultMessage: 'Address',\r\n },\r\n city: {\r\n id: 'city',\r\n defaultMessage: 'City',\r\n },\r\n countryOrRegion: {\r\n id: 'countryOrRegion',\r\n defaultMessage: 'Country or region',\r\n },\r\n stateOrProvince: {\r\n id: 'stateOrProvince',\r\n defaultMessage: 'State or province',\r\n },\r\n zipcode: {\r\n id: 'zipcode',\r\n defaultMessage: 'Zip or postal code',\r\n },\r\n language: {\r\n id: 'language',\r\n defaultMessage: 'Language',\r\n },\r\n country: {\r\n id: 'country',\r\n defaultMessage: 'Country',\r\n },\r\n currency: {\r\n id: 'currency',\r\n defaultMessage: 'Currency',\r\n },\r\n deactivateGenericTitle: {\r\n id: 'deactivateGenericTitle',\r\n defaultMessage: 'Are you sure you want to deactivate?',\r\n },\r\n deleteGenericTitle: {\r\n id: 'deleteGenericTitle',\r\n defaultMessage: 'Are you sure you want to delete?',\r\n },\r\n neverMind: {\r\n id: 'neverMind',\r\n defaultMessage: 'Never Mind',\r\n },\r\n all: {\r\n id: 'app.all',\r\n defaultMessage: 'All',\r\n },\r\n adUnits: {\r\n id: 'app.adunits',\r\n defaultMessage: 'Ad units',\r\n },\r\n adFilters: {\r\n id: 'app.adfilters',\r\n defaultMessage: 'Ad filters',\r\n },\r\n channels: {\r\n id: 'app.channels',\r\n defaultMessage: 'Channels',\r\n },\r\n publishers: {\r\n id: 'app.publishers',\r\n defaultMessage: 'Publishers',\r\n },\r\n reporting: {\r\n id: 'app.reporting',\r\n defaultMessage: 'Reporting',\r\n },\r\n properties: {\r\n id: 'app.properties',\r\n defaultMessage: 'Properties',\r\n },\r\n site: {\r\n id: 'app.site',\r\n defaultMessage: 'Site',\r\n },\r\n accounts: {\r\n id: 'app.accounts',\r\n defaultMessage: 'Accounts',\r\n },\r\n users: {\r\n id: 'app.users',\r\n defaultMessage: 'Users',\r\n },\r\n userInvitations: {\r\n id: 'app.userInvitations',\r\n defaultMessage: 'User Invitations',\r\n },\r\n showMore: {\r\n id: 'app.showmore',\r\n defaultMessage: 'Show more',\r\n },\r\n back: {\r\n id: 'app.navBack',\r\n defaultMessage: 'Back',\r\n },\r\n loadingLabel: {\r\n id: 'app.loadingLabel',\r\n defaultMessage: 'Loading...',\r\n },\r\n loadingStatusLabel: {\r\n id: 'app.loadingStatusLabel',\r\n defaultMessage: 'Loading...',\r\n },\r\n loadingWaitingLabel: {\r\n id: 'app.loadingWaitingLabel',\r\n defaultMessage: \"One moment please, this won't take long...\",\r\n },\r\n submit: {\r\n id: 'app.submit',\r\n defaultMessage: 'Submit',\r\n },\r\n save: {\r\n id: 'app.save',\r\n defaultMessage: 'Save',\r\n },\r\n saving: {\r\n id: 'app.saving',\r\n defaultMessage: 'Saving...',\r\n },\r\n createChannel: {\r\n id: 'app.createChannel',\r\n defaultMessage: 'Create channel',\r\n },\r\n close: {\r\n id: 'app.close',\r\n defaultMessage: 'Close',\r\n },\r\n on: {\r\n id: 'app.on',\r\n defaultMessage: 'On',\r\n },\r\n off: {\r\n id: 'app.off',\r\n defaultMessage: 'Off',\r\n },\r\n infoDescription: {\r\n id: 'app.infoDescription',\r\n defaultMessage: 'Click here for more information on {label}',\r\n },\r\n infoLabel: {\r\n id: 'app.infoLabel',\r\n defaultMessage: '{label} Help',\r\n },\r\n here: {\r\n id: 'app.here',\r\n defaultMessage: 'here',\r\n },\r\n learnMore: {\r\n id: 'app.learnMore',\r\n defaultMessage: 'Learn more',\r\n },\r\n statusActive: {\r\n id: 'app.statusActive',\r\n defaultMessage: 'Active',\r\n },\r\n statusInactive: {\r\n id: 'app.statusInactive',\r\n defaultMessage: 'Inactive',\r\n },\r\n skipToMainContent: {\r\n id: 'app.skipToMainContentLabel',\r\n defaultMessage: 'Skip to main content',\r\n },\r\n next: {\r\n id: 'app.next',\r\n defaultMessage: 'Next',\r\n },\r\n yes: {\r\n id: 'app.yes',\r\n defaultMessage: 'Yes',\r\n },\r\n performanceCardTitle: {\r\n id: 'app.performanceCardTitle',\r\n defaultMessage: 'Performance',\r\n },\r\n sitesCardTitle: {\r\n id: 'app.sitesCardTitle',\r\n defaultMessage: 'Sites',\r\n },\r\n adUnitsCardTitle: {\r\n id: 'app.adUnitsCardTitle',\r\n defaultMessage: 'Ad unit',\r\n },\r\n mediationCardTitle: {\r\n id: 'app.mediationCardTitle',\r\n defaultMessage: 'Mediation',\r\n },\r\n countryCardTitle: {\r\n id: 'app.countryCardTitle',\r\n defaultMessage: 'Country',\r\n },\r\n moreOptionsButtonAriaLabel: {\r\n id: 'dataGrid.moreOptionsButtonAriaLabel',\r\n defaultMessage: 'More options',\r\n },\r\n selectedCount: {\r\n id: 'selectedCount',\r\n defaultMessage: `{count} selected`,\r\n },\r\n sortByColumnHeaderTooltipLabel: {\r\n id: 'sortByColumnHeaderTooltipLabel',\r\n defaultMessage: 'Sort by {columnName}',\r\n },\r\n panelCloseButtonAriaDesc: {\r\n id: 'panelCloseButtonAriaDesc',\r\n defaultMessage: 'Click to dismiss the panel',\r\n },\r\n userDeleteWarning: {\r\n id: 'userDeleteWarning',\r\n defaultMessage: 'This action cannot be undone. This will permanently delete this account and all of the data.',\r\n },\r\n confirmActionMessage: {\r\n id: 'confirmActionMessage',\r\n defaultMessage: 'Confirm this action by typing \"yes\" below',\r\n },\r\n permanentDelete: {\r\n id: 'permanentDelete',\r\n defaultMessage: 'Permanently delete',\r\n },\r\n ariaLabelForSave: {\r\n id: 'ariaLabelForSave',\r\n defaultMessage: 'Save Changes',\r\n },\r\n ariaLabelForGrid: {\r\n id: 'ariaLabelForGrid',\r\n defaultMessage: 'Grid',\r\n },\r\n ariaLabelForListHeader: {\r\n id: 'ariaLabelForListHeader',\r\n defaultMessage: 'List Header',\r\n },\r\n ariaLabelForSelectionColumn: {\r\n id: 'ariaLabelForSelectionColumn',\r\n defaultMessage: 'Selection Column',\r\n },\r\n ariaLabelForSelectAllCheckBox: {\r\n id: 'ariaLabelForSelectAllCheckbox',\r\n defaultMessage: 'Select all rows',\r\n },\r\n checkButtonAriaLabel: {\r\n id: 'dataGrid.checkButtonAriaLabel',\r\n defaultMessage: 'Row selection checkbox',\r\n },\r\n ariaLabelForShimmer: {\r\n id: 'ariaLabelForShimmer',\r\n defaultMessage: 'Shimmer',\r\n },\r\n checkButtonGroupAriaLabel: {\r\n id: 'checkButtonGroupAriaLabel',\r\n defaultMessage: 'Check Button Group',\r\n },\r\n checkBoxLabel: {\r\n id: 'checkBoxLabel',\r\n defaultMessage: 'CheckBox',\r\n },\r\n servingStatus: {\r\n id: 'app.servingStatus',\r\n defaultMessage: 'Serving Status',\r\n },\r\n navAdFilters: {\r\n id: 'app.nav.adfilters',\r\n defaultMessage: 'Ad Filters',\r\n },\r\n navChannels: {\r\n id: 'app.nav.channels',\r\n defaultMessage: 'Channels',\r\n },\r\n navAdUnits: {\r\n id: 'app.nav.adunits',\r\n defaultMessage: 'Ad Units',\r\n },\r\n navSites: {\r\n id: 'app.nav.sites',\r\n defaultMessage: 'Sites',\r\n },\r\n navProperties: {\r\n id: 'app.nav.properties',\r\n defaultMessage: 'Properties',\r\n },\r\n navAdQuality: {\r\n id: 'app.nav.AdQuality',\r\n defaultMessage: 'Ad Quality',\r\n },\r\n navHome: {\r\n id: 'app.nav.home',\r\n defaultMessage: 'Home',\r\n },\r\n navAdBlocks: {\r\n id: 'app.nav.adBlocks',\r\n defaultMessage: 'Ad Blocks',\r\n },\r\n navReports: {\r\n id: 'app.nav.reports',\r\n defaultMessage: 'Reports',\r\n },\r\n navAccount: {\r\n id: 'app.nav.account',\r\n defaultMessage: 'Account',\r\n },\r\n navPublisherManagement: {\r\n id: 'app.nav.publisherManagement',\r\n defaultMessage: 'Publisher management',\r\n },\r\n navAccountManagement: {\r\n id: 'app.nav.accountManagement',\r\n defaultMessage: 'Account management',\r\n },\r\n navUserManagement: {\r\n id: 'app.nav.userManagement',\r\n defaultMessage: 'User management',\r\n },\r\n actions: {\r\n id: 'app.actions',\r\n defaultMessage: 'Actions',\r\n },\r\n fetchNotificationsError: {\r\n id: 'app.FetchNotificationsError',\r\n defaultMessage: 'Could not fetch the backend notifications',\r\n },\r\n dismissNotificationsError: {\r\n id: 'app.dismissNotificationsError',\r\n defaultMessage: 'Could not dismiss backend notifications',\r\n },\r\n detailPageFooterArialLabel: {\r\n id: 'app.detailPage.footer.arialLabel',\r\n defaultMessage: 'Detail page footer',\r\n },\r\n of: {\r\n id: 'of',\r\n defaultMessage: 'of',\r\n },\r\n readMore: {\r\n id: 'readMore',\r\n defaultMessage: 'Read more',\r\n },\r\n adUnit: {\r\n id: 'app.adunit',\r\n defaultMessage: 'Ad unit',\r\n },\r\n adFilter: {\r\n id: 'app.adfilter',\r\n defaultMessage: 'Ad filter',\r\n },\r\n channel: {\r\n id: 'app.channel',\r\n defaultMessage: 'Channel',\r\n },\r\n property: {\r\n id: 'app.property',\r\n defaultMessage: 'Property',\r\n },\r\n user: {\r\n id: 'app.user',\r\n defaultMessage: 'User',\r\n },\r\n deleteNotificationSingleItem: {\r\n id: 'app.deleteNotificationSingleItem',\r\n defaultMessage: 'Deleted! Your {name} ',\r\n },\r\n deleteNotificationSingleItemCont: {\r\n id: 'app.deleteNotificationSingleItemCont',\r\n defaultMessage: 'has been deleted. ',\r\n },\r\n deleteNotificationPlural: {\r\n id: 'app.deleteNotificationPlural',\r\n defaultMessage: 'Deleted! Selected ',\r\n },\r\n deleteNotificationPluralCont: {\r\n id: 'app.deleteNotificationPluralCont',\r\n defaultMessage: 'have been deleted. ',\r\n },\r\n duplicateNotificationSingleItem: {\r\n id: 'app.duplicateNotificationSingleItem',\r\n defaultMessage: 'Duplicated! Your {name} ',\r\n },\r\n duplicateNotificationSingleItemCont: {\r\n id: 'app.duplicateNotificationSingleItemCont',\r\n defaultMessage: 'has been duplicated. ',\r\n },\r\n duplicateNotificationPlural: {\r\n id: 'app.duplicateNotificationPlural',\r\n defaultMessage: 'Duplicated! Selected ',\r\n },\r\n duplicateNotificationPluralCont: {\r\n id: 'app.duplicateNotificationPluralCont',\r\n defaultMessage: 'have been duplicated. ',\r\n },\r\n listId: {\r\n id: 'app.listId',\r\n defaultMessage: ' ID: {id}',\r\n },\r\n listIds: {\r\n id: 'app.listIds',\r\n defaultMessage: ' IDs: {IDs}',\r\n },\r\n activatedUpperCase: {\r\n id: 'app.activatedUpperCase',\r\n defaultMessage: 'Activated!',\r\n },\r\n deactivatedUpperCase: {\r\n id: 'app.deactivatedUpperCase',\r\n defaultMessage: 'Deactivated!',\r\n },\r\n activatedLowerCase: {\r\n id: 'app.activatedLowerCase',\r\n defaultMessage: 'activated. ',\r\n },\r\n deactivatedLowerCase: {\r\n id: 'app.deactivatedLowerCase',\r\n defaultMessage: 'deactivated. ',\r\n },\r\n changingStatusItemName: {\r\n id: 'app.changingStatusItemName',\r\n defaultMessage: ' Your {name} ',\r\n },\r\n changingStatusItemsSelection: {\r\n id: 'app.changingStatusItemsSelection',\r\n defaultMessage: ' Selected ',\r\n },\r\n changingStatusSingular: {\r\n id: 'app.changingStatusSingular',\r\n defaultMessage: ' has been ',\r\n },\r\n changingStatusPlural: {\r\n id: 'app.changingStatusPlural',\r\n defaultMessage: ' have been ',\r\n },\r\n failedToFetchUserScope: {\r\n id: 'app.failedToFetchUserScope',\r\n defaultMessage: 'Failed to fetch user scopes, please logout and re-login',\r\n },\r\n sessionExpiredLoginAgain: {\r\n id: 'app.sessionExpiredLoginAgain',\r\n defaultMessage: 'Your session has expired. Please login again to continue.',\r\n },\r\n contactSupport: {\r\n id: 'app.contactSupport',\r\n defaultMessage: 'Contact Support',\r\n },\r\n navInventory: {\r\n id: 'app.nav.inventory',\r\n defaultMessage: 'Inventory',\r\n },\r\n navAds: {\r\n id: 'app.nav.ads',\r\n defaultMessage: 'Ads',\r\n },\r\n organization: {\r\n id: 'app.accountType.organization',\r\n defaultMessage: 'Business',\r\n },\r\n individual: {\r\n id: 'app.accountType.individual',\r\n defaultMessage: 'Individual',\r\n },\r\n});\r\n","import { Model } from '../@data';\r\nimport { LifeCycleStatus } from '../@data/store/schema/enums/LifeCycleStatus';\r\nimport { adProvidersToNames } from '../config/adProviders';\r\nimport { xandrAdProvidersToNames } from '../config/xandrAdProviders';\r\nimport { IDataGridColumn, IGridV2Column } from '../layout/GridPageV2';\r\nimport { extractPlacement } from '../pages/ad-management/AdQuality/@data/services/utility/utility';\r\nimport { getStore } from '../pages/ad-management/AdQuality/@data/store/store';\r\n\r\nexport class CSVHelper {\r\n public static escapeStringForCSV(stringToEscape): string {\r\n // Does some basic handling of escaped characters that could mess up CSV structure.\r\n // Also handles some special chars that could mess with our URI-based download.\r\n // e.g. turns quotes to double quotes, newlines into \\n, and # into %23.\r\n return stringToEscape\r\n ? stringToEscape.replace(/\"/g, '\"\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r').replace(/#/g, '%23')\r\n : stringToEscape;\r\n }\r\n\r\n public static extractDate(dateTimeStamp: string): string {\r\n return dateTimeStamp ? dateTimeStamp.substring(0, 10) : '';\r\n }\r\n\r\n public static getBlockingStatus(isEnabled: boolean): string {\r\n return isEnabled ? 'Applied' : 'Disabled';\r\n }\r\n\r\n public static getBlockRequestSource(val: number): string {\r\n return val === 0 ? 'N/A' : getStore().active.blockRequestSourceData?.get(val)!;\r\n }\r\n\r\n public static getRevenue(revenue: string): string {\r\n return '$' + revenue;\r\n }\r\n\r\n public static populateNull(val: string): string {\r\n return val ? `\"${CSVHelper.escapeStringForCSV(val)}\"` : 'null';\r\n }\r\n\r\n public static getAdProvider(provider: string): string {\r\n return provider ? CSVHelper.escapeStringForCSV(adProvidersToNames[provider]) : '';\r\n }\r\n\r\n public static getXandrAdProvider(provider: string): string {\r\n return provider ? CSVHelper.escapeStringForCSV(xandrAdProvidersToNames[provider]) : '';\r\n }\r\n\r\n public static getStatus(status: string): string {\r\n return status && status === LifeCycleStatus.Inactive ? 'BLOCKED' : '';\r\n }\r\n\r\n public static getPlacement(dataRow): string {\r\n return CSVHelper.escapeStringForCSV(extractPlacement(dataRow));\r\n }\r\n\r\n public static getXandrPlacement(dataRow): string {\r\n return CSVHelper.escapeStringForCSV(dataRow.locale);\r\n }\r\n\r\n public static downloadDataAsCSV(csvData, csvHeaders, csvFilename) {\r\n const csvDataMarker = 'data:text/csv;charset=utf-8,';\r\n const csvFileData = csvDataMarker + (csvHeaders ? `${csvHeaders}\\n` : '') + csvData;\r\n const encodedCSV = encodeURI(csvFileData);\r\n const csvLink = document.createElement('a');\r\n csvLink.setAttribute('download', csvFilename);\r\n csvLink.setAttribute('href', encodedCSV);\r\n document.body.appendChild(csvLink);\r\n csvLink.click();\r\n document.body.removeChild(csvLink);\r\n }\r\n\r\n public static getCSVStrings(rowData: Model, columns: IDataGridColumn[] | IGridV2Column[]) {\r\n // tslint:disable-next-line: no-any\r\n const cells: any[] = [];\r\n\r\n columns.forEach((col) => {\r\n let cellData = col.columnName === 'blockRequestSource' ? rowData['blockRequestSourceId'] : rowData[col.columnName];\r\n\r\n if (col.exportFunction) {\r\n if (col.friendlyName === 'Placement') {\r\n cellData = col.exportFunction(rowData);\r\n cellData = `\"${CSVHelper.escapeStringForCSV(cellData)}\"`;\r\n } else {\r\n cellData = col.exportFunction(cellData);\r\n }\r\n } else if (isNaN(cellData)) {\r\n cellData = `\"${CSVHelper.escapeStringForCSV(cellData)}\"`;\r\n }\r\n\r\n cells.push(cellData);\r\n });\r\n\r\n return cells.join(',');\r\n }\r\n\r\n public static getCSVStringsV2(rowData: Model, columns: IGridV2Column[]) {\r\n // tslint:disable-next-line: no-any\r\n const cells: any[] = [];\r\n\r\n columns.forEach((col) => {\r\n let cellData;\r\n\r\n if (col.exportFunction) {\r\n cellData = col.exportFunction(rowData);\r\n } else if (col.fieldName) {\r\n cellData = rowData[col.fieldName];\r\n } else {\r\n cellData = col.sortableValue?.(rowData);\r\n }\r\n\r\n if (cellData === undefined || cellData === 'undefined') {\r\n cellData = '';\r\n } else if (isNaN(cellData)) {\r\n if (typeof cellData === 'object') {\r\n cellData = cellData.toString();\r\n }\r\n cellData = `\"${CSVHelper.escapeStringForCSV(cellData)}\"`;\r\n }\r\n\r\n cells.push(cellData);\r\n });\r\n\r\n return cells.join(',');\r\n }\r\n}\r\n","export function roundNumber(num, decimalPlaces: number) {\r\n const modifier = 10 ** Math.trunc(decimalPlaces);\r\n return Math.round((num + Number.EPSILON) * modifier) / modifier;\r\n}\r\n","import { singularize } from '.';\r\nimport { Model } from '../@data';\r\nimport messages from '../App.messages';\r\n\r\nexport function getSuccessNotification(command: string, selectedItems: Model[], entityInstance: Model, ids?: string) {\r\n if (selectedItems.length === 1) {\r\n const selectedItem = selectedItems[0];\r\n const notificationSingularTextFn = (entityName, name, commandName, statusName, id) =>\r\n `${commandName}d! Your ${!!name ? name : ''} ${entityName} has been ${statusName}d. ${entityName} ID: ${id}`;\r\n\r\n return notificationSingularTextFn(\r\n singularize(entityInstance.className),\r\n selectedItem.name,\r\n command,\r\n command.toLocaleLowerCase(),\r\n selectedItem.id\r\n );\r\n } else {\r\n const notificationMultipleTextFn = (entityName, commandName, statusName, multipleIds) =>\r\n `${commandName}d! Selected ${entityName} have been ${statusName}d. ${entityName} IDs: ${multipleIds}`;\r\n if (ids) {\r\n return notificationMultipleTextFn(entityInstance.className, command, command.toLocaleLowerCase(), ids);\r\n }\r\n }\r\n}\r\n\r\nexport function getSuccessNotificationDeleteItem(selectedItems: Model[], entityInstance: Model, formatMessage, ids?: string) {\r\n if (selectedItems.length === 1) {\r\n const selectedItem = selectedItems[0];\r\n\r\n // return 'Deleted! Your {name} ' + 'entityName' + ' has been deleted. ' + 'entityName' + ' ID: {id}';\r\n return (\r\n formatMessage(messages.deleteNotificationSingleItem, { name: !!selectedItem.name ? selectedItem.name : '' }) +\r\n formatMessage(messages[entityInstanceMapping[singularize(entityInstance.className)]]) +\r\n formatMessage(messages.deleteNotificationSingleItemCont) +\r\n formatMessage(messages[entityInstanceMapping[singularize(entityInstance.className)]]) +\r\n formatMessage(messages.listId, { id: !!selectedItem.id ? selectedItem.id : '' })\r\n );\r\n } else if (ids) {\r\n // return 'Deleted! Selected ' + 'entityNameS' + ' have been deleted. ' + 'entityNameS' + ' IDs: {ids}';\r\n return (\r\n formatMessage(messages.deleteNotificationPlural) +\r\n formatMessage(messages[entityInstanceMapping[entityInstance.className]]) +\r\n formatMessage(messages.deleteNotificationPluralCont) +\r\n formatMessage(messages[entityInstanceMapping[entityInstance.className]]) +\r\n formatMessage(messages.listId, { IDs: ids })\r\n );\r\n }\r\n}\r\n\r\nexport function getSuccessNotificationDuplicateItem(selectedItems: Model[], entityInstance: Model, formatMessage, ids?: string) {\r\n if (selectedItems.length === 1) {\r\n const selectedItem = selectedItems[0];\r\n\r\n // return 'Duplicated! Your {name} ' + 'entityName' + ' has been duplicated. ' + 'entityName ' + 'ID: {id}';\r\n return (\r\n formatMessage(messages.duplicateNotificationSingleItem, { name: !!selectedItem.name ? selectedItem.name : '' }) +\r\n formatMessage(messages[entityInstanceMapping[singularize(entityInstance.className)]]) +\r\n formatMessage(messages.duplicateNotificationSingleItemCont) +\r\n formatMessage(messages[entityInstanceMapping[singularize(entityInstance.className)]]) +\r\n formatMessage(messages.listId, { id: !!selectedItem.id ? selectedItem.id : '' })\r\n );\r\n } else if (ids) {\r\n // return 'Duplicated! Selected ' + 'entityNameS' + ' have been duplicated. ' + 'entityNameS ' + 'IDs: {ids}';\r\n return (\r\n formatMessage(messages.duplicateNotificationPlural) +\r\n formatMessage(messages[entityInstanceMapping[entityInstance.className]]) +\r\n formatMessage(messages.duplicateNotificationPluralCont) +\r\n formatMessage(messages[entityInstanceMapping[entityInstance.className]]) +\r\n formatMessage(messages.listId, { IDs: ids })\r\n );\r\n }\r\n}\r\n\r\nexport function getSuccessNotificationChangingStatus(\r\n commandName,\r\n selectedItems: Model[],\r\n entityInstance: Model,\r\n formatMessage,\r\n ids?: string\r\n) {\r\n if (selectedItems.length === 1) {\r\n const selectedItem = selectedItems[0];\r\n\r\n // return 'Activated/Deactivated!' + ' Your {name} ' + 'entityName ' + 'has been ' + 'activated/deleted. ' + 'entityName' + ' ID: {id}';\r\n return (\r\n formatMessage(messages[changingStatusMapping[commandName]]) +\r\n formatMessage(messages.changingStatusItemName, { name: !!selectedItem.name ? selectedItem.name : '' }) +\r\n formatMessage(messages[entityInstanceMapping[singularize(entityInstance.className)]]) +\r\n formatMessage(messages.changingStatusSingular) +\r\n formatMessage(messages[changingStatusMapping[commandName.toLocaleLowerCase()]]) +\r\n formatMessage(messages[entityInstanceMapping[singularize(entityInstance.className)]]) +\r\n formatMessage(messages.listId, { id: !!selectedItem.id ? selectedItem.id : '' })\r\n );\r\n } else if (ids) {\r\n // return 'Activated/Deactivated!+ ' Selected ' + 'entityNameS ' + 'have been '+ 'activated/deleted. '+ 'entityNameS' + ' IDs: {ids}';\r\n return (\r\n formatMessage(messages[changingStatusMapping[commandName]]) +\r\n formatMessage(messages.changingStatusItemsSelection) +\r\n formatMessage(messages[entityInstanceMapping[entityInstance.className]]) +\r\n formatMessage(messages.changingStatusPlural) +\r\n formatMessage(messages[changingStatusMapping[commandName.toLocaleLowerCase()]]) +\r\n formatMessage(messages[entityInstanceMapping[singularize(entityInstance.className)]]) +\r\n formatMessage(messages.listId, { IDs: ids })\r\n );\r\n }\r\n}\r\n\r\nconst entityInstanceMapping = {\r\n adunits: 'adUnits',\r\n properties: 'properties',\r\n users: 'users',\r\n accounts: 'accounts',\r\n channels: 'channels',\r\n filters: 'adFilters',\r\n publishers: 'publishers',\r\n adunit: 'adUnit',\r\n property: 'property',\r\n user: 'user',\r\n account: 'account',\r\n channel: 'channel',\r\n filter: 'adFilter',\r\n publisher: 'publisher',\r\n};\r\n\r\nconst changingStatusMapping = {\r\n Deactivate: 'deactivatedUpperCase',\r\n Activate: 'activatedUpperCase',\r\n activate: 'activatedLowerCase',\r\n deactivate: 'deactivatedLowerCase',\r\n};\r\n","export abstract class Model {\r\n constructor(public accessPermission: number) {}\r\n public abstract or(this: Model, obj: Model);\r\n public abstract get className(): string;\r\n}\r\n","import { UserRoleEntity } from '../../../services/UserRoleService';\r\nimport { Model } from './Model';\r\n\r\nexport class Account extends Model {\r\n public className = UserRoleEntity.Account;\r\n public publisherName: number;\r\n public accountName: number;\r\n public primaryContact: number;\r\n public lanuage: number;\r\n public countryOrRegion: number;\r\n public currency: number;\r\n public timeZone: number;\r\n public paymentOption: number;\r\n public financialStatus: number;\r\n public paymentLifecycle: number;\r\n public operationCostRation: number;\r\n public accountLevelAttribute: number;\r\n public inHousePromotion: number;\r\n public partnerCodesforDistributionReport: number;\r\n public formCodesforDistributionReport: number;\r\n public startDistributionReporting: number;\r\n public SKUs: number;\r\n\r\n constructor(params: Account) {\r\n super(params.accessPermission);\r\n Object.assign(this, params);\r\n }\r\n\r\n public or(this: Account, account: Account) {\r\n // tslint:disable:no-bitwise\r\n this.accessPermission |= account.accessPermission;\r\n this.publisherName |= account.publisherName;\r\n this.accountName |= account.accountName;\r\n this.primaryContact |= account.primaryContact;\r\n this.lanuage |= account.lanuage;\r\n this.countryOrRegion |= account.countryOrRegion;\r\n this.currency |= account.currency;\r\n this.timeZone |= account.timeZone;\r\n this.paymentOption |= account.paymentOption;\r\n this.financialStatus |= account.financialStatus;\r\n this.paymentLifecycle |= account.paymentLifecycle;\r\n this.operationCostRation |= account.operationCostRation;\r\n this.accountLevelAttribute |= account.accountLevelAttribute;\r\n this.inHousePromotion |= account.inHousePromotion;\r\n this.partnerCodesforDistributionReport |= account.partnerCodesforDistributionReport;\r\n this.formCodesforDistributionReport |= account.formCodesforDistributionReport;\r\n this.startDistributionReporting |= account.startDistributionReporting;\r\n this.SKUs |= account.SKUs;\r\n // tslint:enable:no-bitwise\r\n }\r\n}\r\n","import { UserRoleEntity } from '../../../services/UserRoleService';\r\nimport { Model } from './Model';\r\n\r\nexport class AdBlock extends Model {\r\n public className = UserRoleEntity.AdBlock;\r\n public enablePublisherBlocks: number;\r\n public enableSiteBlocks: number;\r\n public editDomainBlocks: number;\r\n public editCategoryBlocks: number;\r\n\r\n constructor(params: AdBlock) {\r\n super(params.accessPermission);\r\n Object.assign(this, params);\r\n }\r\n\r\n public or(this: AdBlock, adBlock: AdBlock) {\r\n // tslint:disable:no-bitwise\r\n this.accessPermission |= adBlock.accessPermission;\r\n this.enablePublisherBlocks |= adBlock.enablePublisherBlocks;\r\n this.enableSiteBlocks |= adBlock.enableSiteBlocks;\r\n this.editDomainBlocks |= adBlock.editDomainBlocks;\r\n this.editCategoryBlocks |= adBlock.editCategoryBlocks;\r\n // tslint:enable:no-bitwise\r\n }\r\n}\r\n","import { UserRoleEntity } from '../../../services/UserRoleService';\r\nimport { Model } from './Model';\r\n\r\nexport class AdUnit extends Model {\r\n public className = UserRoleEntity.AdUnit;\r\n public name: number;\r\n public id: number;\r\n public markeplaceClassification: number;\r\n public businessModel: number;\r\n public distributionPartnerCodes: number;\r\n public channelList: number;\r\n public servingTier: number;\r\n public publisherGroupConfig: number;\r\n public inhousePromotions: number;\r\n\r\n constructor(params: AdUnit) {\r\n super(params.accessPermission);\r\n Object.assign(this, params);\r\n }\r\n\r\n public or(this: AdUnit, adunit: AdUnit) {\r\n // tslint:disable:no-bitwise\r\n this.accessPermission |= adunit.accessPermission;\r\n this.businessModel |= adunit.businessModel;\r\n this.channelList |= adunit.channelList;\r\n this.id |= adunit.id;\r\n this.inhousePromotions |= adunit.inhousePromotions;\r\n this.markeplaceClassification |= adunit.markeplaceClassification;\r\n this.distributionPartnerCodes |= adunit.distributionPartnerCodes;\r\n this.name |= adunit.name;\r\n this.publisherGroupConfig |= adunit.publisherGroupConfig;\r\n this.servingTier |= adunit.servingTier;\r\n // tslint:enable:no-bitwise\r\n }\r\n}\r\n","import { UserRoleEntity } from '../../../services/UserRoleService';\r\nimport { Model } from './Model';\r\n\r\nexport class Channel extends Model {\r\n public className = UserRoleEntity.Channel;\r\n public name: number;\r\n public id: number;\r\n public adUnitList: number;\r\n public adFilters: number;\r\n\r\n constructor(params: Channel) {\r\n super(params.accessPermission);\r\n Object.assign(this, params);\r\n }\r\n\r\n public or(this: Channel, channel: Channel) {\r\n // tslint:disable:no-bitwise\r\n this.accessPermission |= channel.accessPermission;\r\n this.adFilters |= channel.adFilters;\r\n this.adUnitList |= channel.adUnitList;\r\n this.id |= channel.id;\r\n this.name |= channel.name;\r\n // tslint:enable:no-bitwise\r\n }\r\n}\r\n","import { UserRoleEntity } from '../../../services/UserRoleService';\r\nimport { Model } from './Model';\r\n\r\nexport class DropdownMenu extends Model {\r\n public className = UserRoleEntity.DropdownMenu;\r\n public adManagement: number;\r\n public partnerManagment: number;\r\n public reporting: number;\r\n\r\n constructor(params: DropdownMenu) {\r\n super(params.accessPermission);\r\n Object.assign(this, params);\r\n }\r\n\r\n public or(this: DropdownMenu, menu: DropdownMenu) {\r\n // tslint:disable:no-bitwise\r\n this.accessPermission |= menu.accessPermission;\r\n this.adManagement |= menu.adManagement;\r\n this.partnerManagment |= menu.partnerManagment;\r\n this.reporting |= menu.reporting;\r\n // tslint:enable:no-bitwise\r\n }\r\n}\r\n","import { UserRoleEntity } from '../../../services/UserRoleService';\r\nimport { Model } from './Model';\r\n\r\nexport class Filter extends Model {\r\n public className = UserRoleEntity.Filter;\r\n public name: number;\r\n public id: number;\r\n public filterType: number;\r\n public channelList: number;\r\n public excludedURLs: number;\r\n public excludedAdKeywords: number;\r\n public excludedQueryKeywords: number;\r\n public appendOnly: number;\r\n\r\n constructor(params: Filter) {\r\n super(params.accessPermission);\r\n Object.assign(this, params);\r\n }\r\n\r\n public or(this: Filter, filter: Filter) {\r\n // tslint:disable:no-bitwise\r\n this.accessPermission |= filter.accessPermission;\r\n this.channelList |= filter.channelList;\r\n this.excludedAdKeywords |= filter.excludedAdKeywords;\r\n this.excludedQueryKeywords |= filter.excludedQueryKeywords;\r\n this.excludedURLs |= filter.excludedURLs;\r\n this.filterType |= filter.filterType;\r\n this.id |= filter.id;\r\n this.name |= filter.name;\r\n this.appendOnly |= filter.appendOnly;\r\n // tslint:enable:no-bitwise\r\n }\r\n}\r\n","import { UserRoleEntity } from '../../../services/UserRoleService';\r\nimport { Model } from './Model';\r\n\r\nexport class NavigationMenu extends Model {\r\n public className = UserRoleEntity.NavigationMenu;\r\n public home: number;\r\n public adunit: number;\r\n public channel: number;\r\n public adFilter: number;\r\n public property: number;\r\n public adblock: number;\r\n public publisherProfile: number;\r\n public reporting: number;\r\n public publisher: number;\r\n public account: number;\r\n public user: number;\r\n public adquality: number;\r\n public dashboard: number;\r\n public auditHistory: number;\r\n\r\n constructor(params: NavigationMenu) {\r\n super(params.accessPermission);\r\n Object.assign(this, params);\r\n }\r\n\r\n public or(this: NavigationMenu, menu: NavigationMenu) {\r\n // tslint:disable:no-bitwise\r\n this.accessPermission |= menu.accessPermission;\r\n this.home |= menu.home;\r\n this.adunit |= menu.adunit;\r\n this.channel |= menu.channel;\r\n this.adFilter |= menu.adFilter;\r\n this.property |= menu.property;\r\n this.adblock |= menu.adblock;\r\n this.publisherProfile |= menu.publisherProfile;\r\n this.publisher |= menu.publisher;\r\n this.account |= menu.account;\r\n this.user |= menu.user;\r\n this.reporting |= menu.reporting;\r\n this.adquality |= menu.adquality;\r\n this.dashboard |= menu.dashboard;\r\n this.auditHistory |= menu.auditHistory;\r\n // tslint:enable:no-bitwise\r\n }\r\n}\r\n","import { UserRoleEntity } from '../../../services/UserRoleService';\r\nimport { Model } from './Model';\r\n\r\nexport class Property extends Model {\r\n public className = UserRoleEntity.Property;\r\n public name: number;\r\n public id: number;\r\n public websiteURL: number;\r\n public approvalStatus: number;\r\n public notes: number;\r\n public attachedAdUnits: number;\r\n public clarity: number;\r\n\r\n constructor(params: Property) {\r\n super(params.accessPermission);\r\n Object.assign(this, params);\r\n }\r\n\r\n public or(this: Property, property: Property) {\r\n // tslint:disable:no-bitwise\r\n this.accessPermission |= property.accessPermission;\r\n this.approvalStatus |= property.approvalStatus;\r\n this.id |= property.id;\r\n this.name |= property.name;\r\n this.notes |= property.notes;\r\n this.websiteURL |= property.websiteURL;\r\n this.attachedAdUnits |= property.attachedAdUnits;\r\n this.clarity |= property.clarity;\r\n // tslint:enable:no-bitwise\r\n }\r\n}\r\n","import { UserRoleEntity } from '../../../services/UserRoleService';\r\nimport { Model } from './Model';\r\n\r\nexport class Publisher extends Model {\r\n public className = UserRoleEntity.Publisher;\r\n public id: number;\r\n public partner: number;\r\n public name: number;\r\n public networkAffiliation: number;\r\n public address: number;\r\n public publisherTier: number;\r\n public overrideFeatureTier: number;\r\n public entityLimitTier: number;\r\n public serviceLevel: number;\r\n public allowDistributionReporting: number;\r\n public allowDistributionV2Reporting: number;\r\n public allowStartDistributionReporting: number;\r\n public allowStartDistributionContentReporting: number;\r\n public allowSelectTierReporting: number;\r\n public allowMediationReporting: number;\r\n public allowMobileSearchAdUnit: number;\r\n public allowNativeReporting: number;\r\n public allowSyndicationReporting: number;\r\n public allowWebAdUnit: number;\r\n public allowPaidSearchReportingApi: number;\r\n public allowPaidSearchReportingDashboard: number;\r\n public allowDynamicPropertyRegistration: number;\r\n public enableDefaultTythonV2Reporting: number;\r\n public publisherAllowedFeaturesPropertyAutoApproved: number;\r\n public ipRanges: number;\r\n public newAccount: number;\r\n\r\n constructor(params: Publisher) {\r\n super(params.accessPermission);\r\n Object.assign(this, params);\r\n }\r\n\r\n public or(this: Publisher, publisher: Publisher) {\r\n // tslint:disable:no-bitwise\r\n this.accessPermission |= publisher.accessPermission;\r\n this.partner |= publisher.partner;\r\n this.name |= publisher.name;\r\n this.networkAffiliation |= publisher.networkAffiliation;\r\n this.address |= publisher.address;\r\n this.publisherTier |= publisher.publisherTier;\r\n this.overrideFeatureTier |= publisher.overrideFeatureTier;\r\n this.entityLimitTier |= publisher.entityLimitTier;\r\n this.serviceLevel |= publisher.serviceLevel;\r\n this.allowDistributionReporting |= publisher.allowDistributionReporting;\r\n this.allowDistributionV2Reporting |= publisher.allowDistributionV2Reporting;\r\n this.allowStartDistributionReporting |= publisher.allowStartDistributionReporting;\r\n this.allowStartDistributionContentReporting |= publisher.allowStartDistributionContentReporting;\r\n this.allowSelectTierReporting |= publisher.allowSelectTierReporting;\r\n this.allowMediationReporting |= publisher.allowMediationReporting;\r\n this.allowMobileSearchAdUnit |= publisher.allowMobileSearchAdUnit;\r\n this.allowNativeReporting |= publisher.allowNativeReporting;\r\n this.allowSyndicationReporting |= publisher.allowSyndicationReporting;\r\n this.allowWebAdUnit |= publisher.allowWebAdUnit;\r\n this.allowPaidSearchReportingApi |= publisher.allowPaidSearchReportingApi;\r\n this.allowPaidSearchReportingDashboard |= publisher.allowPaidSearchReportingDashboard;\r\n this.allowDynamicPropertyRegistration |= publisher.allowDynamicPropertyRegistration;\r\n this.enableDefaultTythonV2Reporting |= publisher.enableDefaultTythonV2Reporting;\r\n this.publisherAllowedFeaturesPropertyAutoApproved |= publisher.publisherAllowedFeaturesPropertyAutoApproved;\r\n this.ipRanges |= publisher.ipRanges;\r\n this.newAccount |= publisher.newAccount;\r\n // tslint:enable:no-bitwise\r\n }\r\n}\r\n","import { UserRoleEntity } from '../../../services/UserRoleService';\r\nimport { Model } from './Model';\r\n\r\nexport class PublisherProfileTabs extends Model {\r\n public className = UserRoleEntity.PublisherProfileTabs;\r\n public profile: number;\r\n public userManagement: number;\r\n public payments: number;\r\n public settings: number;\r\n\r\n constructor(params: PublisherProfileTabs) {\r\n super(params.accessPermission);\r\n Object.assign(this, params);\r\n }\r\n\r\n public or(this: PublisherProfileTabs, publisherProfileTabs: PublisherProfileTabs) {\r\n // tslint:disable:no-bitwise\r\n this.accessPermission |= publisherProfileTabs.accessPermission;\r\n this.profile |= publisherProfileTabs.profile;\r\n this.userManagement |= publisherProfileTabs.userManagement;\r\n this.payments |= publisherProfileTabs.payments;\r\n this.settings |= publisherProfileTabs.settings;\r\n // tslint:enable:no-bitwise\r\n }\r\n}\r\n","import { UserRoleEntity } from '../../../services/UserRoleService';\r\nimport { Model } from './Model';\r\n\r\nexport class PublisherSettings extends Model {\r\n public className = UserRoleEntity.PublisherSettings;\r\n public mediation: number;\r\n public publisherPreferences: number;\r\n public publisherDelete: number;\r\n\r\n constructor(params: PublisherSettings) {\r\n super(params.accessPermission);\r\n Object.assign(this, params);\r\n }\r\n\r\n public or(this: PublisherSettings, publisherSettings: PublisherSettings) {\r\n // tslint:disable:no-bitwise\r\n this.accessPermission |= publisherSettings.accessPermission;\r\n this.mediation |= publisherSettings.mediation;\r\n this.publisherPreferences |= publisherSettings.publisherPreferences;\r\n this.publisherDelete |= publisherSettings.publisherDelete;\r\n // tslint:enable:no-bitwise\r\n }\r\n}\r\n","import { UserRoleEntity } from '../../../services/UserRoleService';\r\nimport { Model } from './Model';\r\n\r\nexport class User extends Model {\r\n public className = UserRoleEntity.User;\r\n public userFirstName: number;\r\n public userLastName: number;\r\n public userEmail: number;\r\n public userLanguage: number;\r\n public userAccountRole: number;\r\n public userInviteFirstName: number;\r\n public userInviteLastName: number;\r\n public userInviteEmail: number;\r\n public userInviteLanguage: number;\r\n public userInviteAccountRole: number;\r\n\r\n constructor(params: User) {\r\n super(params.accessPermission);\r\n Object.assign(this, params);\r\n }\r\n\r\n public or(this: User, user: User) {\r\n // tslint:disable:no-bitwise\r\n this.accessPermission |= user.accessPermission;\r\n this.userFirstName |= user.userFirstName;\r\n this.userLastName |= user.userLastName;\r\n this.userEmail |= user.userEmail;\r\n this.userLanguage |= user.userLanguage;\r\n this.userAccountRole |= user.userAccountRole;\r\n this.userInviteFirstName |= user.userInviteFirstName;\r\n this.userInviteLastName |= user.userInviteLastName;\r\n this.userInviteEmail |= user.userInviteEmail;\r\n this.userInviteLanguage |= user.userInviteLanguage;\r\n this.userInviteAccountRole |= user.userInviteAccountRole;\r\n // tslint:enable:no-bitwise\r\n }\r\n}\r\n","import { UserRoleEntity } from '../../../services/UserRoleService';\r\nimport { Model } from './Model';\r\n\r\nexport class UserSettings extends Model {\r\n public className = UserRoleEntity.UserSettings;\r\n public systemPreferences: number;\r\n public billingAlerts: number;\r\n public servingStatus: number;\r\n public profileReview: number;\r\n public invitedUsers: number;\r\n public userDelete: number;\r\n\r\n constructor(params: UserSettings) {\r\n super(params.accessPermission);\r\n Object.assign(this, params);\r\n }\r\n\r\n public or(this: UserSettings, userSettings: UserSettings) {\r\n // tslint:disable:no-bitwise\r\n this.accessPermission |= userSettings.accessPermission;\r\n this.systemPreferences |= userSettings.systemPreferences;\r\n this.billingAlerts |= userSettings.billingAlerts;\r\n this.servingStatus |= userSettings.servingStatus;\r\n this.profileReview |= userSettings.profileReview;\r\n this.invitedUsers |= userSettings.invitedUsers;\r\n this.userDelete |= userSettings.userDelete;\r\n // tslint:enable:no-bitwise\r\n }\r\n}\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport {\r\n handleApiErrors,\r\n onAccessiblePublisherListChanged,\r\n onDefaultPublisherSet,\r\n onNotificationChanged,\r\n onUserContextChanged,\r\n UserType,\r\n} from '..';\r\nimport { Log } from '../../../logging/src';\r\nimport messages from '../../App.messages';\r\nimport { uiConfig } from '../../config/ui.config';\r\nimport { DEFAULT_PUBLISHER_CACHE_KEY } from '../../constants/AppConstants';\r\nimport { isLocationPubCenter } from '../../utils';\r\nimport { onLoadingChanged, onLoadingSetting, onLoadingWaiting } from '../actions';\r\nimport { UserContext } from '../store/schema';\r\nimport { IUserRoleScope } from '../store/schema/interfaces/IUserRoleData';\r\nimport { Account } from '../store/schema/userrolemodels/Account';\r\nimport { AdBlock } from '../store/schema/userrolemodels/AdBlock';\r\nimport { AdUnit } from '../store/schema/userrolemodels/AdUnit';\r\nimport { Channel } from '../store/schema/userrolemodels/Channel';\r\nimport { DropdownMenu } from '../store/schema/userrolemodels/DropdownMenu';\r\nimport { Filter } from '../store/schema/userrolemodels/Filter';\r\nimport { Model } from '../store/schema/userrolemodels/Model';\r\nimport { NavigationMenu } from '../store/schema/userrolemodels/NavigationMenu';\r\nimport { Property } from '../store/schema/userrolemodels/Property';\r\nimport { Publisher } from '../store/schema/userrolemodels/Publisher';\r\nimport { PublisherProfileTabs } from '../store/schema/userrolemodels/PublisherProfileTabs';\r\nimport { PublisherSettings } from '../store/schema/userrolemodels/PublisherSettings';\r\nimport { User } from '../store/schema/userrolemodels/User';\r\nimport { UserRoleResponse } from '../store/schema/userrolemodels/UserRoleResponse';\r\nimport { UserSettings } from '../store/schema/userrolemodels/UserSettings';\r\nimport { isTythonSelfServeUser } from '../utils/checkUserType';\r\nimport { buildRequestHeadersWithAuthToken } from '../utils/requestUtils';\r\nexport const userRoleKey = '_userRole';\r\nexport const completeAccess = 0b1111;\r\n\r\nexport enum UserRoleEntity {\r\n AdUnit = 'AdUnit',\r\n Channel = 'Channel',\r\n Filter = 'Filter',\r\n Property = 'Property',\r\n Publisher = 'Publisher',\r\n Account = 'Account',\r\n User = 'User',\r\n DropdownMenu = 'DropdownMenu',\r\n NavigationMenu = 'NavigationMenu',\r\n PublisherProfileTabs = 'PublisherProfileTabs',\r\n PublisherSettings = 'PublisherSettings',\r\n UserSettings = 'UserSettings',\r\n AdBlock = 'AdBlock',\r\n}\r\n\r\n/* The rolePermissions map has the details of CRUD permissions of entities(i.e. Adunit, Channel etc.)\r\n for different user roles. Key of this map is user role id and value of the map is list of entities where\r\n each entity has accessPermission number field whose 4 LSBs represents CRUD permissions :-\r\n 1st bit - Permission to delete the entity.\r\n 2nd bit - Permission to update the entity.\r\n 3rd bit - Permission to read the entity.\r\n 4th bit - Permission to create the entity.\r\n\r\n Similarly, each entity has its own fields which has their own CRUD permission details.\r\n*/\r\nconst rolePermissions = new Map<number, Model[]>([\r\n [\r\n // PC Inventory Management\r\n 169,\r\n [\r\n new DropdownMenu({\r\n adManagement: 0b1111,\r\n partnerManagment: 0b1111,\r\n reporting: 0b1111,\r\n } as DropdownMenu),\r\n new Publisher({\r\n id: 0b1111,\r\n accessPermission: 0b1111,\r\n partner: 0b1111,\r\n name: 0b1111,\r\n networkAffiliation: 0b1111,\r\n address: 0b1111,\r\n publisherTier: 0b1111,\r\n overrideFeatureTier: 0b1111,\r\n entityLimitTier: 0b1111,\r\n serviceLevel: 0b1111,\r\n allowDistributionReporting: 0b1111,\r\n allowDistributionV2Reporting: 0b1111,\r\n allowStartDistributionReporting: 0b1111,\r\n allowStartDistributionContentReporting: 0b1111,\r\n allowSelectTierReporting: 0b1111,\r\n allowMediationReporting: 0b1111,\r\n allowMobileSearchAdUnit: 0b1111,\r\n allowNativeReporting: 0b1111,\r\n allowSyndicationReporting: 0b1111,\r\n allowWebAdUnit: 0b1111,\r\n allowPaidSearchReportingApi: 0b1111,\r\n allowPaidSearchReportingDashboard: 0b1111,\r\n allowDynamicPropertyRegistration: 0b0010,\r\n enableDefaultTythonV2Reporting: 0b1111,\r\n publisherAllowedFeaturesPropertyAutoApproved: 0b1111,\r\n ipRanges: 0b1111,\r\n newAccount: 0b1111,\r\n } as Publisher),\r\n new Account({\r\n accessPermission: 0b1111,\r\n publisherName: 0b1111,\r\n accountName: 0b1111,\r\n primaryContact: 0b1111,\r\n lanuage: 0b1111,\r\n countryOrRegion: 0b1111,\r\n currency: 0b1111,\r\n timeZone: 0b1111,\r\n paymentOption: 0b1111,\r\n financialStatus: 0b1111,\r\n paymentLifecycle: 0b1111,\r\n operationCostRation: 0b1111,\r\n accountLevelAttribute: 0b1111,\r\n inHousePromotion: 0b1111,\r\n partnerCodesforDistributionReport: 0b1111,\r\n formCodesforDistributionReport: 0b1111,\r\n startDistributionReporting: 0b1111,\r\n SKUs: 0b1111,\r\n } as Account),\r\n new User({\r\n accessPermission: 0b1111,\r\n userFirstName: 0b1111,\r\n userLastName: 0b1111,\r\n userEmail: 0b1111,\r\n userAccountRole: 0b1111,\r\n userLanguage: 0b1111,\r\n userInviteFirstName: 0b1111,\r\n userInviteLastName: 0b1111,\r\n userInviteEmail: 0b1111,\r\n userInviteLanguage: 0b1111,\r\n userInviteAccountRole: 0b1111,\r\n } as User),\r\n new AdUnit({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n markeplaceClassification: 0b1111,\r\n businessModel: 0b1111,\r\n channelList: 0b1111,\r\n servingTier: 0b1111,\r\n publisherGroupConfig: 0b1111,\r\n inhousePromotions: 0b1111,\r\n } as AdUnit),\r\n new Channel({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n adFilters: 0b1111,\r\n adUnitList: 0b1111,\r\n } as Channel),\r\n new Property({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n websiteURL: 0b1101,\r\n approvalStatus: 0b1111,\r\n notes: 0b1111,\r\n attachedAdUnits: 0b1111,\r\n clarity: 0b1111,\r\n } as Property),\r\n new Filter({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n filterType: 0b1101,\r\n channelList: 0b1111,\r\n excludedAdKeywords: 0b1111,\r\n excludedQueryKeywords: 0b1111,\r\n excludedURLs: 0b1111,\r\n } as Filter),\r\n ],\r\n ],\r\n [\r\n // PC Support\r\n 170,\r\n [\r\n new Publisher({\r\n id: 0b1111,\r\n accessPermission: 0b1111,\r\n partner: 0b1111,\r\n name: 0b1111,\r\n networkAffiliation: 0b1111,\r\n address: 0b1111,\r\n publisherTier: 0b1111,\r\n overrideFeatureTier: 0b1111,\r\n entityLimitTier: 0b1111,\r\n serviceLevel: 0b1111,\r\n allowDistributionReporting: 0b1111,\r\n allowDistributionV2Reporting: 0b1111,\r\n allowStartDistributionReporting: 0b1111,\r\n allowStartDistributionContentReporting: 0b1111,\r\n allowSelectTierReporting: 0b1111,\r\n allowMediationReporting: 0b1111,\r\n allowMobileSearchAdUnit: 0b1111,\r\n allowNativeReporting: 0b1111,\r\n allowSyndicationReporting: 0b1111,\r\n allowWebAdUnit: 0b0100,\r\n allowPaidSearchReportingApi: 0b1111,\r\n allowPaidSearchReportingDashboard: 0b1111,\r\n allowDynamicPropertyRegistration: 0b0100,\r\n enableDefaultTythonV2Reporting: 0b1111,\r\n publisherAllowedFeaturesPropertyAutoApproved: 0b1111,\r\n ipRanges: 0b1111,\r\n newAccount: 0b1111,\r\n } as Publisher),\r\n new Account({\r\n accessPermission: 0b1111,\r\n publisherName: 0b1111,\r\n accountName: 0b1111,\r\n primaryContact: 0b1111,\r\n lanuage: 0b1111,\r\n countryOrRegion: 0b1111,\r\n currency: 0b1111,\r\n timeZone: 0b1111,\r\n paymentOption: 0b1111,\r\n financialStatus: 0b1111,\r\n paymentLifecycle: 0b1111,\r\n operationCostRation: 0b1111,\r\n accountLevelAttribute: 0b1111,\r\n inHousePromotion: 0b1111,\r\n partnerCodesforDistributionReport: 0b1111,\r\n formCodesforDistributionReport: 0b1111,\r\n startDistributionReporting: 0b1111,\r\n SKUs: 0b1111,\r\n } as Account),\r\n new User({\r\n accessPermission: 0b1111,\r\n userFirstName: 0b1111,\r\n userLastName: 0b1111,\r\n userEmail: 0b1111,\r\n userAccountRole: 0b1111,\r\n userLanguage: 0b1111,\r\n userInviteFirstName: 0b1111,\r\n userInviteLastName: 0b1111,\r\n userInviteEmail: 0b1111,\r\n userInviteLanguage: 0b1111,\r\n userInviteAccountRole: 0b1111,\r\n } as User),\r\n new AdUnit({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n markeplaceClassification: 0b1111,\r\n businessModel: 0b1111,\r\n distributionPartnerCodes: 0b1111,\r\n channelList: 0b1111,\r\n servingTier: 0b1111,\r\n publisherGroupConfig: 0b1111,\r\n inhousePromotions: 0b1111,\r\n } as AdUnit),\r\n new Channel({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n adFilters: 0b1111,\r\n adUnitList: 0b1111,\r\n } as Channel),\r\n new Property({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n websiteURL: 0b1101,\r\n approvalStatus: 0b1111,\r\n notes: 0b1111,\r\n attachedAdUnits: 0b1111,\r\n clarity: 0b1111,\r\n } as Property),\r\n new Filter({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n filterType: 0b1101,\r\n channelList: 0b1111,\r\n excludedAdKeywords: 0b1111,\r\n excludedQueryKeywords: 0b1111,\r\n excludedURLs: 0b1111,\r\n } as Filter),\r\n ],\r\n ],\r\n [\r\n // PC Finance Ops\r\n 172,\r\n [\r\n new Publisher({\r\n id: 0b1111,\r\n accessPermission: 0b1111,\r\n partner: 0b1111,\r\n name: 0b1111,\r\n networkAffiliation: 0b1111,\r\n address: 0b1111,\r\n publisherTier: 0b1111,\r\n overrideFeatureTier: 0b1111,\r\n entityLimitTier: 0b1111,\r\n serviceLevel: 0b1111,\r\n allowDistributionReporting: 0b1111,\r\n allowDistributionV2Reporting: 0b1111,\r\n allowStartDistributionReporting: 0b1111,\r\n allowStartDistributionContentReporting: 0b1111,\r\n allowSelectTierReporting: 0b1111,\r\n allowMediationReporting: 0b1111,\r\n allowMobileSearchAdUnit: 0b1111,\r\n allowNativeReporting: 0b1111,\r\n allowSyndicationReporting: 0b1111,\r\n allowWebAdUnit: 0b1111,\r\n allowPaidSearchReportingApi: 0b1111,\r\n allowPaidSearchReportingDashboard: 0b1111,\r\n allowDynamicPropertyRegistration: 0b1111,\r\n enableDefaultTythonV2Reporting: 0b1111,\r\n publisherAllowedFeaturesPropertyAutoApproved: 0b1111,\r\n ipRanges: 0b1111,\r\n newAccount: 0b1111,\r\n } as Publisher),\r\n new Account({\r\n accessPermission: 0b1111,\r\n publisherName: 0b1111,\r\n accountName: 0b1111,\r\n primaryContact: 0b1111,\r\n lanuage: 0b1111,\r\n countryOrRegion: 0b1111,\r\n currency: 0b1111,\r\n timeZone: 0b1111,\r\n paymentOption: 0b1111,\r\n financialStatus: 0b1111,\r\n paymentLifecycle: 0b1111,\r\n operationCostRation: 0b1111,\r\n accountLevelAttribute: 0b1111,\r\n inHousePromotion: 0b1111,\r\n partnerCodesforDistributionReport: 0b1111,\r\n formCodesforDistributionReport: 0b1111,\r\n startDistributionReporting: 0b1111,\r\n SKUs: 0b1111,\r\n } as Account),\r\n new User({\r\n accessPermission: 0b1111,\r\n userFirstName: 0b1111,\r\n userLastName: 0b1111,\r\n userEmail: 0b1111,\r\n userAccountRole: 0b1111,\r\n userLanguage: 0b1111,\r\n userInviteFirstName: 0b1111,\r\n userInviteLastName: 0b1111,\r\n userInviteEmail: 0b1111,\r\n userInviteLanguage: 0b1111,\r\n userInviteAccountRole: 0b1111,\r\n } as User),\r\n new AdUnit({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n markeplaceClassification: 0b1111,\r\n businessModel: 0b1111,\r\n channelList: 0b1111,\r\n servingTier: 0b1111,\r\n publisherGroupConfig: 0b1111,\r\n inhousePromotions: 0b1111,\r\n } as AdUnit),\r\n new Channel({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n adFilters: 0b1111,\r\n adUnitList: 0b1111,\r\n } as Channel),\r\n new Property({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n websiteURL: 0b1101,\r\n approvalStatus: 0b1111,\r\n notes: 0b1111,\r\n attachedAdUnits: 0b1111,\r\n clarity: 0b1111,\r\n } as Property),\r\n new Filter({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n filterType: 0b1101,\r\n channelList: 0b1111,\r\n excludedAdKeywords: 0b1111,\r\n excludedQueryKeywords: 0b1111,\r\n excludedURLs: 0b1111,\r\n } as Filter),\r\n ],\r\n ],\r\n [\r\n // Verizon Media\r\n 125,\r\n [\r\n new Publisher({\r\n id: 0b0100,\r\n accessPermission: 0b1111,\r\n partner: 0b0100,\r\n name: 0b1111,\r\n networkAffiliation: 0b1111,\r\n address: 0b1111,\r\n publisherTier: 0b0000,\r\n overrideFeatureTier: 0b0000,\r\n entityLimitTier: 0b0000,\r\n serviceLevel: 0b0000,\r\n allowDistributionReporting: 0b0000,\r\n allowDistributionV2Reporting: 0b0000,\r\n allowStartDistributionReporting: 0b0000,\r\n allowStartDistributionContentReporting: 0b0000,\r\n allowSelectTierReporting: 0b0000,\r\n allowMediationReporting: 0b0000,\r\n allowMobileSearchAdUnit: 0b0000,\r\n allowNativeReporting: 0b0000,\r\n allowSyndicationReporting: 0b0000,\r\n allowWebAdUnit: 0b0000,\r\n allowPaidSearchReportingApi: 0b0000,\r\n allowPaidSearchReportingDashboard: 0b0000,\r\n allowDynamicPropertyRegistration: 0b1111,\r\n enableDefaultTythonV2Reporting: 0b0000,\r\n publisherAllowedFeaturesPropertyAutoApproved: 0b0000,\r\n ipRanges: 0b0000,\r\n newAccount: 0b1111,\r\n } as Publisher),\r\n new Account({\r\n accessPermission: 0b1111,\r\n publisherName: 0b1111,\r\n accountName: 0b1111,\r\n primaryContact: 0b1111,\r\n lanuage: 0b1111,\r\n countryOrRegion: 0b1111,\r\n currency: 0b1111,\r\n timeZone: 0b1111,\r\n paymentOption: 0b0000,\r\n financialStatus: 0b0000,\r\n paymentLifecycle: 0b0000,\r\n operationCostRation: 0b0000,\r\n accountLevelAttribute: 0b0000,\r\n inHousePromotion: 0b0000,\r\n partnerCodesforDistributionReport: 0b0000,\r\n formCodesforDistributionReport: 0b0000,\r\n startDistributionReporting: 0b0000,\r\n SKUs: 0b0000,\r\n } as Account),\r\n new User({\r\n accessPermission: 0b0000,\r\n userFirstName: 0b0000,\r\n userLastName: 0b0000,\r\n userEmail: 0b0000,\r\n userAccountRole: 0b0000,\r\n userLanguage: 0b0000,\r\n userInviteFirstName: 0b0000,\r\n userInviteLastName: 0b0000,\r\n userInviteEmail: 0b0000,\r\n userInviteLanguage: 0b0000,\r\n userInviteAccountRole: 0b0000,\r\n } as User),\r\n new AdUnit({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n markeplaceClassification: 0b1111,\r\n businessModel: 0b1111,\r\n channelList: 0b1111,\r\n servingTier: 0b0000,\r\n publisherGroupConfig: 0b1111,\r\n inhousePromotions: 0b0000,\r\n } as AdUnit),\r\n new Channel({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n adFilters: 0b1111,\r\n adUnitList: 0b1111,\r\n } as Channel),\r\n new Property({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n websiteURL: 0b1101,\r\n approvalStatus: 0b1111,\r\n notes: 0b1111,\r\n attachedAdUnits: 0b1111,\r\n clarity: 0b1111,\r\n } as Property),\r\n new Filter({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n filterType: 0b1101,\r\n channelList: 0b1111,\r\n excludedAdKeywords: 0b1111,\r\n excludedQueryKeywords: 0b1111,\r\n excludedURLs: 0b1111,\r\n } as Filter),\r\n ],\r\n ],\r\n [\r\n // Verizon Media\r\n 156,\r\n [\r\n new AdUnit({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n markeplaceClassification: 0b1111,\r\n businessModel: 0b1111,\r\n channelList: 0b1111,\r\n servingTier: 0b0000,\r\n publisherGroupConfig: 0b1111,\r\n inhousePromotions: 0b0000,\r\n } as AdUnit),\r\n new Channel({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n adFilters: 0b1111,\r\n adUnitList: 0b1111,\r\n } as Channel),\r\n new Property({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n websiteURL: 0b1101,\r\n approvalStatus: 0b1111,\r\n notes: 0b1111,\r\n attachedAdUnits: 0b1111,\r\n clarity: 0b1111,\r\n } as Property),\r\n new Filter({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n filterType: 0b1101,\r\n channelList: 0b1111,\r\n excludedAdKeywords: 0b1111,\r\n excludedQueryKeywords: 0b1111,\r\n excludedURLs: 0b1111,\r\n } as Filter),\r\n ],\r\n ],\r\n [\r\n // PC Guest\r\n 171,\r\n [\r\n new Publisher({\r\n id: 0b0100,\r\n accessPermission: 0b0100,\r\n partner: 0b0100,\r\n name: 0b0100,\r\n networkAffiliation: 0b0100,\r\n address: 0b0100,\r\n publisherTier: 0b0100,\r\n overrideFeatureTier: 0b0100,\r\n entityLimitTier: 0b0100,\r\n serviceLevel: 0b0100,\r\n allowDistributionReporting: 0b0100,\r\n allowDistributionV2Reporting: 0b0100,\r\n allowStartDistributionReporting: 0b0100,\r\n allowStartDistributionContentReporting: 0b0100,\r\n allowSelectTierReporting: 0b0100,\r\n allowMediationReporting: 0b0100,\r\n allowMobileSearchAdUnit: 0b0100,\r\n allowNativeReporting: 0b0100,\r\n allowSyndicationReporting: 0b0100,\r\n allowWebAdUnit: 0b0100,\r\n allowPaidSearchReportingApi: 0b0100,\r\n allowPaidSearchReportingDashboard: 0b0100,\r\n allowDynamicPropertyRegistration: 0b0100,\r\n enableDefaultTythonV2Reporting: 0b0100,\r\n publisherAllowedFeaturesPropertyAutoApproved: 0b0100,\r\n ipRanges: 0b0100,\r\n newAccount: 0b0100,\r\n } as Publisher),\r\n new Account({\r\n publisherName: 0b0100,\r\n accountName: 0b0100,\r\n primaryContact: 0b0100,\r\n lanuage: 0b0100,\r\n countryOrRegion: 0b0100,\r\n currency: 0b0100,\r\n timeZone: 0b0100,\r\n paymentOption: 0b0100,\r\n financialStatus: 0b0100,\r\n paymentLifecycle: 0b0100,\r\n operationCostRation: 0b0100,\r\n accountLevelAttribute: 0b0100,\r\n inHousePromotion: 0b0100,\r\n partnerCodesforDistributionReport: 0b0100,\r\n formCodesforDistributionReport: 0b0100,\r\n startDistributionReporting: 0b0100,\r\n SKUs: 0b0100,\r\n } as Account),\r\n new User({\r\n accessPermission: 0b0100,\r\n userFirstName: 0b0100,\r\n userLastName: 0b0100,\r\n userEmail: 0b0100,\r\n userAccountRole: 0b0100,\r\n userLanguage: 0b0100,\r\n userInviteFirstName: 0b0100,\r\n userInviteLastName: 0b0100,\r\n userInviteEmail: 0b0100,\r\n userInviteLanguage: 0b0100,\r\n userInviteAccountRole: 0b0100,\r\n } as User),\r\n new AdUnit({\r\n accessPermission: 0b0100,\r\n name: 0b0100,\r\n id: 0b0100,\r\n markeplaceClassification: 0b0100,\r\n businessModel: 0b0100,\r\n channelList: 0b0100,\r\n servingTier: 0b0000,\r\n publisherGroupConfig: 0b0100,\r\n inhousePromotions: 0b0100,\r\n } as AdUnit),\r\n new Channel({\r\n accessPermission: 0b0100,\r\n name: 0b0100,\r\n id: 0b0100,\r\n adFilters: 0b0100,\r\n adUnitList: 0b0100,\r\n } as Channel),\r\n new Property({\r\n accessPermission: 0b0100,\r\n name: 0b0100,\r\n id: 0b0100,\r\n websiteURL: 0b0100,\r\n approvalStatus: 0b0100,\r\n notes: 0b0100,\r\n clarity: 0b0100,\r\n } as Property),\r\n new Filter({\r\n accessPermission: 0b0100,\r\n name: 0b0100,\r\n id: 0b0100,\r\n filterType: 0b0100,\r\n channelList: 0b0100,\r\n excludedAdKeywords: 0b0100,\r\n excludedQueryKeywords: 0b0100,\r\n excludedURLs: 0b0100,\r\n } as Filter),\r\n ],\r\n ],\r\n]);\r\n\r\nexport const tythonUserRolePermissions = new Map<number, Model[]>([\r\n [\r\n // Super admin\r\n 41,\r\n [\r\n new DropdownMenu({\r\n adManagement: 0b1111,\r\n partnerManagment: 0b0000,\r\n reporting: 0b0000,\r\n } as DropdownMenu),\r\n new NavigationMenu({\r\n home: 0b1111,\r\n adunit: 0b1111,\r\n channel: 0b0000,\r\n adFilter: 0b0000,\r\n property: 0b1111,\r\n adblock: 0b1111,\r\n publisherProfile: 0b1111,\r\n reporting: 0b1111,\r\n // tython users should not be able to access these pages\r\n publisher: 0b0000,\r\n account: 0b0000,\r\n user: 0b0000,\r\n adquality: 0b0000,\r\n dashboard: 0b01111,\r\n auditHistory: 0b1111,\r\n } as NavigationMenu),\r\n new Publisher({\r\n id: 0b0101,\r\n accessPermission: 0b1111,\r\n partner: 0b0000,\r\n name: 0b0000,\r\n networkAffiliation: 0b0000,\r\n address: 0b1111,\r\n publisherTier: 0b0000,\r\n overrideFeatureTier: 0b0000,\r\n entityLimitTier: 0b0000,\r\n serviceLevel: 0b0000,\r\n allowDistributionReporting: 0b0000,\r\n allowDistributionV2Reporting: 0b0000,\r\n allowStartDistributionReporting: 0b0000,\r\n allowStartDistributionContentReporting: 0b0000,\r\n allowSelectTierReporting: 0b0000,\r\n allowMediationReporting: 0b0000,\r\n allowMobileSearchAdUnit: 0b0000,\r\n allowNativeReporting: 0b0000,\r\n allowSyndicationReporting: 0b0000,\r\n allowWebAdUnit: 0b0000,\r\n allowPaidSearchReportingApi: 0b0000,\r\n allowPaidSearchReportingDashboard: 0b1111,\r\n allowDynamicPropertyRegistration: 0b0000,\r\n enableDefaultTythonV2Reporting: 0b0000,\r\n publisherAllowedFeaturesPropertyAutoApproved: 0b0000,\r\n ipRanges: 0b0000,\r\n // Tython self-serve publishers cannot access/create accounts\r\n newAccount: 0b0000,\r\n } as Publisher),\r\n new Account({\r\n accessPermission: 0b0000,\r\n publisherName: 0b0000,\r\n accountName: 0b0000,\r\n primaryContact: 0b0000,\r\n lanuage: 0b0000,\r\n countryOrRegion: 0b0000,\r\n currency: 0b0000,\r\n timeZone: 0b0000,\r\n paymentOption: 0b0000,\r\n financialStatus: 0b0000,\r\n paymentLifecycle: 0b0000,\r\n operationCostRation: 0b0000,\r\n accountLevelAttribute: 0b0000,\r\n inHousePromotion: 0b0000,\r\n partnerCodesforDistributionReport: 0b0000,\r\n formCodesforDistributionReport: 0b0000,\r\n startDistributionReporting: 0b0000,\r\n SKUs: 0b0000,\r\n } as Account),\r\n new User({\r\n accessPermission: 0b1111,\r\n userFirstName: 0b1111,\r\n userLastName: 0b1111,\r\n userEmail: 0b1111,\r\n userAccountRole: 0b1111,\r\n userLanguage: 0b1111,\r\n userInviteFirstName: 0b1111,\r\n userInviteLastName: 0b1111,\r\n userInviteEmail: 0b1111,\r\n userInviteLanguage: 0b1111,\r\n userInviteAccountRole: 0b1111,\r\n } as User),\r\n new AdUnit({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n markeplaceClassification: 0b0000,\r\n businessModel: 0b0000,\r\n distributionPartnerCodes: 0b1111,\r\n channelList: 0b0000,\r\n servingTier: 0b0000,\r\n publisherGroupConfig: 0b0000,\r\n inhousePromotions: 0b0000,\r\n } as AdUnit),\r\n new Channel({\r\n accessPermission: 0b0000,\r\n name: 0b0000,\r\n id: 0b0000,\r\n adFilters: 0b0000,\r\n adUnitList: 0b0000,\r\n } as Channel),\r\n new Property({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n websiteURL: 0b1101,\r\n approvalStatus: 0b0000,\r\n notes: 0b0000,\r\n attachedAdUnits: 0b0000,\r\n clarity: 0b0000,\r\n } as Property),\r\n new Filter({\r\n accessPermission: 0b0000,\r\n name: 0b0000,\r\n id: 0b0000,\r\n filterType: 0b0000,\r\n channelList: 0b0000,\r\n excludedAdKeywords: 0b0000,\r\n excludedQueryKeywords: 0b0000,\r\n excludedURLs: 0b0000,\r\n } as Filter),\r\n new PublisherProfileTabs({\r\n accessPermission: 0b1111,\r\n profile: 0b1111,\r\n userManagement: 0b1111,\r\n payments: 0b1111,\r\n settings: 0b1111,\r\n } as PublisherProfileTabs),\r\n new PublisherSettings({\r\n mediation: 0b1111,\r\n publisherPreferences: 0b1111,\r\n publisherDelete: 0b0001,\r\n } as PublisherSettings),\r\n new UserSettings({\r\n // Seperate user level system preferences are not provisioned yet\r\n systemPreferences: 0b0100,\r\n billingAlerts: 0b1111,\r\n servingStatus: 0b1111,\r\n profileReview: 0b1111,\r\n invitedUsers: 0b1111,\r\n userDelete: 0b0001,\r\n } as UserSettings),\r\n new AdBlock({\r\n enablePublisherBlocks: 0b1111,\r\n enableSiteBlocks: 0b1111,\r\n editDomainBlocks: 0b1111,\r\n editCategoryBlocks: 0b1111,\r\n } as AdBlock),\r\n ],\r\n ],\r\n [\r\n // Account manager\r\n 43,\r\n [\r\n new DropdownMenu({\r\n adManagement: 0b1111,\r\n partnerManagment: 0b0000,\r\n reporting: 0b0000,\r\n } as DropdownMenu),\r\n new NavigationMenu({\r\n home: 0b1111,\r\n adunit: 0b1111,\r\n channel: 0b0000,\r\n adFilter: 0b0000,\r\n property: 0b1111,\r\n adblock: 0b1111,\r\n publisherProfile: 0b1111,\r\n reporting: 0b1111,\r\n publisher: 0b0000,\r\n account: 0b0000,\r\n user: 0b0000,\r\n adquality: 0b0000,\r\n dashboard: 0b1111,\r\n auditHistory: 0b1111,\r\n } as NavigationMenu),\r\n new Publisher({\r\n id: 0b0000,\r\n accessPermission: 0b0000,\r\n partner: 0b0000,\r\n name: 0b0000,\r\n networkAffiliation: 0b0000,\r\n address: 0b0000,\r\n publisherTier: 0b0000,\r\n overrideFeatureTier: 0b0000,\r\n entityLimitTier: 0b0000,\r\n serviceLevel: 0b0000,\r\n allowDistributionReporting: 0b0000,\r\n allowDistributionV2Reporting: 0b0000,\r\n allowStartDistributionReporting: 0b0000,\r\n allowStartDistributionContentReporting: 0b0000,\r\n allowSelectTierReporting: 0b0000,\r\n allowMediationReporting: 0b0000,\r\n allowMobileSearchAdUnit: 0b0000,\r\n allowNativeReporting: 0b0000,\r\n allowSyndicationReporting: 0b0000,\r\n allowWebAdUnit: 0b0000,\r\n allowPaidSearchReportingApi: 0b0000,\r\n allowPaidSearchReportingDashboard: 0b0000,\r\n allowDynamicPropertyRegistration: 0b0000,\r\n enableDefaultTythonV2Reporting: 0b0000,\r\n publisherAllowedFeaturesPropertyAutoApproved: 0b0000,\r\n ipRanges: 0b0000,\r\n newAccount: 0b0000,\r\n } as Publisher),\r\n new Account({\r\n accessPermission: 0b0000,\r\n publisherName: 0b0000,\r\n accountName: 0b0000,\r\n primaryContact: 0b0000,\r\n lanuage: 0b0000,\r\n countryOrRegion: 0b0000,\r\n currency: 0b0000,\r\n timeZone: 0b0000,\r\n paymentOption: 0b0000,\r\n financialStatus: 0b0000,\r\n paymentLifecycle: 0b0000,\r\n operationCostRation: 0b0000,\r\n accountLevelAttribute: 0b0000,\r\n inHousePromotion: 0b0000,\r\n partnerCodesforDistributionReport: 0b0000,\r\n formCodesforDistributionReport: 0b0000,\r\n startDistributionReporting: 0b0000,\r\n SKUs: 0b0000,\r\n } as Account),\r\n new User({\r\n accessPermission: 0b0000,\r\n userFirstName: 0b0000,\r\n userLastName: 0b0000,\r\n userEmail: 0b0000,\r\n userAccountRole: 0b0000,\r\n userLanguage: 0b0000,\r\n userInviteFirstName: 0b0000,\r\n userInviteLastName: 0b0000,\r\n userInviteEmail: 0b0000,\r\n userInviteLanguage: 0b0000,\r\n userInviteAccountRole: 0b0000,\r\n } as User),\r\n new AdUnit({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n // Following fields are not exposed to tython self-serve users\r\n markeplaceClassification: 0b0000,\r\n businessModel: 0b0000,\r\n channelList: 0b0000,\r\n servingTier: 0b0000,\r\n publisherGroupConfig: 0b0000,\r\n inhousePromotions: 0b0000,\r\n } as AdUnit),\r\n new Channel({\r\n accessPermission: 0b0000,\r\n name: 0b0000,\r\n id: 0b0000,\r\n adFilters: 0b0000,\r\n adUnitList: 0b0000,\r\n } as Channel),\r\n new Property({\r\n accessPermission: 0b1111,\r\n name: 0b1111,\r\n id: 0b0101,\r\n websiteURL: 0b1101,\r\n approvalStatus: 0b0000,\r\n notes: 0b0000,\r\n attachedAdUnits: 0b0000,\r\n clarity: 0b0000,\r\n } as Property),\r\n new Filter({\r\n accessPermission: 0b0000,\r\n name: 0b0000,\r\n id: 0b0000,\r\n filterType: 0b0000,\r\n channelList: 0b0000,\r\n excludedAdKeywords: 0b0000,\r\n excludedQueryKeywords: 0b0000,\r\n excludedURLs: 0b0000,\r\n } as Filter),\r\n new PublisherProfileTabs({\r\n accessPermission: 0b1000,\r\n profile: 0b0100,\r\n userManagement: 0b0000,\r\n payments: 0b0000,\r\n settings: 0b0100,\r\n } as PublisherProfileTabs),\r\n new PublisherSettings({\r\n mediation: 0b0100,\r\n publisherPreferences: 0b0000,\r\n publisherDelete: 0b0000,\r\n } as PublisherSettings),\r\n new UserSettings({\r\n systemPreferences: 0b0100,\r\n billingAlerts: 0b0000,\r\n servingStatus: 0b1111,\r\n profileReview: 0b1111,\r\n invitedUsers: 0b0000,\r\n userDelete: 0b0001,\r\n } as UserSettings),\r\n new AdBlock({\r\n enablePublisherBlocks: 0b1111,\r\n enableSiteBlocks: 0b1111,\r\n editDomainBlocks: 0b1111,\r\n editCategoryBlocks: 0b1111,\r\n } as AdBlock),\r\n ],\r\n ],\r\n [\r\n // Report user\r\n 49,\r\n [\r\n new DropdownMenu({\r\n adManagement: 0b1111,\r\n partnerManagment: 0b0000,\r\n reporting: 0b0000,\r\n } as DropdownMenu),\r\n new NavigationMenu({\r\n home: 0b1111,\r\n adunit: 0b1111,\r\n channel: 0b0000,\r\n adFilter: 0b0000,\r\n property: 0b1111,\r\n adblock: 0b1111,\r\n publisherProfile: 0b0000,\r\n reporting: 0b1111,\r\n publisher: 0b0000,\r\n account: 0b0000,\r\n user: 0b0000,\r\n adquality: 0b0000,\r\n dashboard: 0b01111,\r\n auditHistory: 0b0000,\r\n } as NavigationMenu),\r\n new Publisher({\r\n id: 0b0000,\r\n accessPermission: 0b0000,\r\n partner: 0b0000,\r\n name: 0b0000,\r\n networkAffiliation: 0b0000,\r\n address: 0b0000,\r\n publisherTier: 0b0000,\r\n overrideFeatureTier: 0b0000,\r\n entityLimitTier: 0b0000,\r\n serviceLevel: 0b0000,\r\n allowDistributionReporting: 0b0000,\r\n allowDistributionV2Reporting: 0b0000,\r\n allowStartDistributionReporting: 0b0000,\r\n allowStartDistributionContentReporting: 0b0000,\r\n allowSelectTierReporting: 0b0000,\r\n allowMediationReporting: 0b0000,\r\n allowMobileSearchAdUnit: 0b0000,\r\n allowNativeReporting: 0b0000,\r\n allowSyndicationReporting: 0b0000,\r\n allowWebAdUnit: 0b0000,\r\n allowPaidSearchReportingApi: 0b0000,\r\n allowPaidSearchReportingDashboard: 0b0000,\r\n allowDynamicPropertyRegistration: 0b0000,\r\n enableDefaultTythonV2Reporting: 0b0000,\r\n publisherAllowedFeaturesPropertyAutoApproved: 0b0000,\r\n ipRanges: 0b0000,\r\n newAccount: 0b0000,\r\n } as Publisher),\r\n new Account({\r\n accessPermission: 0b0000,\r\n publisherName: 0b0000,\r\n accountName: 0b0000,\r\n primaryContact: 0b0000,\r\n lanuage: 0b0000,\r\n countryOrRegion: 0b0000,\r\n currency: 0b0000,\r\n timeZone: 0b0000,\r\n paymentOption: 0b0000,\r\n financialStatus: 0b0000,\r\n paymentLifecycle: 0b0000,\r\n operationCostRation: 0b0000,\r\n accountLevelAttribute: 0b0000,\r\n inHousePromotion: 0b0000,\r\n partnerCodesforDistributionReport: 0b0000,\r\n formCodesforDistributionReport: 0b0000,\r\n startDistributionReporting: 0b0000,\r\n SKUs: 0b0000,\r\n } as Account),\r\n new User({\r\n accessPermission: 0b0000,\r\n userFirstName: 0b0000,\r\n userLastName: 0b0000,\r\n userEmail: 0b0000,\r\n userAccountRole: 0b0000,\r\n userLanguage: 0b0000,\r\n userInviteFirstName: 0b0000,\r\n userInviteLastName: 0b0000,\r\n userInviteEmail: 0b0000,\r\n userInviteLanguage: 0b0000,\r\n userInviteAccountRole: 0b0000,\r\n } as User),\r\n new AdUnit({\r\n accessPermission: 0b0100,\r\n name: 0b0100,\r\n id: 0b0100,\r\n markeplaceClassification: 0b0000,\r\n businessModel: 0b0000,\r\n channelList: 0b0000,\r\n servingTier: 0b0000,\r\n publisherGroupConfig: 0b0000,\r\n inhousePromotions: 0b0000,\r\n } as AdUnit),\r\n new Channel({\r\n accessPermission: 0b0000,\r\n name: 0b0000,\r\n id: 0b0000,\r\n adFilters: 0b0000,\r\n adUnitList: 0b0000,\r\n } as Channel),\r\n new Property({\r\n accessPermission: 0b0100,\r\n name: 0b0100,\r\n id: 0b0100,\r\n websiteURL: 0b0100,\r\n approvalStatus: 0b0000,\r\n notes: 0b0000,\r\n attachedAdUnits: 0b0000,\r\n clarity: 0b0000,\r\n } as Property),\r\n new Filter({\r\n accessPermission: 0b0000,\r\n name: 0b0000,\r\n id: 0b0000,\r\n filterType: 0b0000,\r\n channelList: 0b0000,\r\n excludedAdKeywords: 0b0000,\r\n excludedQueryKeywords: 0b0000,\r\n excludedURLs: 0b0000,\r\n } as Filter),\r\n new PublisherProfileTabs({\r\n accessPermission: 0b0000,\r\n profile: 0b0000,\r\n userManagement: 0b0000,\r\n payments: 0b0000,\r\n settings: 0b0000,\r\n } as PublisherProfileTabs),\r\n new PublisherSettings({\r\n mediation: 0b0000,\r\n publisherPreferences: 0b0000,\r\n publisherDelete: 0b0000,\r\n } as PublisherSettings),\r\n new UserSettings({\r\n systemPreferences: 0b0100,\r\n billingAlerts: 0b0000,\r\n servingStatus: 0b0000,\r\n profileReview: 0b0000,\r\n invitedUsers: 0b0000,\r\n userDelete: 0b0001,\r\n } as UserSettings),\r\n new AdBlock({\r\n enablePublisherBlocks: 0b0100,\r\n enableSiteBlocks: 0b0100,\r\n editDomainBlocks: 0b0100,\r\n editCategoryBlocks: 0b0100,\r\n } as AdBlock),\r\n ],\r\n ],\r\n]);\r\n\r\n// tslint:disable:no-bitwise\r\nexport const hasReadAccess = (val: number): boolean => {\r\n return (val & (1 << 2)) > 0 ? true : false;\r\n};\r\n\r\nexport const hasCreateAccess = (val: number): boolean => {\r\n return (val & (1 << 3)) > 0 ? true : false;\r\n};\r\n\r\nexport const hasUpdateAccess = (val: number): boolean => {\r\n return (val & (1 << 1)) > 0 ? true : false;\r\n};\r\n\r\nexport const hasDeleteAccess = (val: number): boolean => {\r\n return (val & 1) > 0 ? true : false;\r\n};\r\n// tslint:enable:no-bitwise\r\n\r\nexport async function setUserRoles(userContext: UserContext) {\r\n const url = uiConfig.getApiBaseAddress() + '/user/scope';\r\n const headers = await buildRequestHeadersWithAuthToken(url, userContext);\r\n\r\n let response: Response;\r\n let id;\r\n\r\n try {\r\n onLoadingChanged(true);\r\n onLoadingSetting(false);\r\n const timeout = 30000;\r\n id = setTimeout(() => onLoadingWaiting(true), timeout);\r\n response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n });\r\n\r\n if (!response.ok) {\r\n if (response.status !== 302 || isLocationPubCenter()) {\r\n return handleApiErrors(response, url);\r\n }\r\n }\r\n\r\n const responseJson: UserRoleResponse = await response.json();\r\n\r\n if (responseJson.data) {\r\n const scope = responseJson.data.scope;\r\n\r\n setUserContext(userContext, scope, userContext.userType);\r\n\r\n setUserRolesInCache(scope.roleIds);\r\n }\r\n } catch (err) {\r\n const error = `Failed to fetch user scopes for ${url}. Errors: ${err}`;\r\n Log.error(error);\r\n onNotificationChanged({ textMessageDescriptor: messages.failedToFetchUserScope, messageBarType: MessageBarType.error });\r\n } finally {\r\n clearTimeout(id);\r\n onLoadingChanged(false);\r\n }\r\n}\r\n\r\nexport function setUserContext(userContext: UserContext, scope: IUserRoleScope, userType?: UserType) {\r\n Log.debug(`Setting user scope, parentCustomer: ${scope.parentCustomer}, role ids: ${scope.roleIds.toString()}`);\r\n\r\n userContext.id = scope.id;\r\n userContext.userRoles = scope.roleIds;\r\n onUserContextChanged({ ...userContext, userType: userType });\r\n\r\n const parentCustomerId = scope.parentCustomer;\r\n const accessiblePublisherList = scope.accessiblePublishers;\r\n\r\n onDefaultPublisherSet(parentCustomerId);\r\n onAccessiblePublisherListChanged(accessiblePublisherList);\r\n\r\n localStorage.setItem(DEFAULT_PUBLISHER_CACHE_KEY, parentCustomerId.toString());\r\n}\r\n\r\nexport function setUserRolesInCache(roleIds: number[]) {\r\n const userRoles = new Map<string, Model>();\r\n Log.debug(`Setting user access permissions in cache, ${roleIds.toString()}`);\r\n\r\n roleIds.forEach((roleId: number) => {\r\n let entities;\r\n if (isTythonSelfServeUser()) {\r\n entities = tythonUserRolePermissions.get(roleId);\r\n } else {\r\n entities = rolePermissions.get(roleId);\r\n }\r\n\r\n if (entities) {\r\n entities.forEach((entity: Model) => {\r\n const userRoleEntity = userRoles.get(entity.className);\r\n if (userRoleEntity) {\r\n userRoleEntity.or(entity);\r\n userRoles.set(userRoleEntity.className, userRoleEntity);\r\n } else {\r\n userRoles.set(entity.className, entity);\r\n }\r\n });\r\n }\r\n });\r\n\r\n const userRolesJSON = {};\r\n userRoles.forEach((value: Model, key: string) => {\r\n userRolesJSON[key] = JSON.stringify(value);\r\n });\r\n\r\n localStorage.setItem(userRoleKey, JSON.stringify(userRolesJSON));\r\n}\r\n","export const APP_NAME_PUBCENTER = 'pubCenter';\r\nexport const APP_NAME_NEW = 'Microsoft Monetize Now';\r\nexport const APP_NAME_SHORT = 'Monetize Now';\r\nexport const APP_NAME_NEW_COMPACT = 'MonetizeNow';\r\nexport const PUBCENTER_TITLE = 'PubCenter';\r\n\r\nexport const MAIN_CONTENT_ID = 'main-content';\r\n\r\n// Used to change the copy button icon for 3000ms, indicating copy was successful\r\nexport const COPY_BUTTON_TIMEOUT = 3000;\r\n// Used to dismiss notifications after 10s they show up\r\nexport const NOTIFICATION_DISMISS_TIMEOUT = 10000;\r\nexport const TOKEN_EXPIRED_SEARCH_PARAM_KEY = 'isTokenExpired';\r\nexport const CLARITY_HOME_WEB_APP = 'https://clarity.microsoft.com';\r\nexport const CLARITY_WEB_APP = 'https://clarity.microsoft.com/projects/view/{id}/settings';\r\nexport const CLARITY_PRIVACY_STATEMENT = 'https://privacy.microsoft.com/en-us/privacystatement';\r\nexport const CLARITY_DEMO = 'https://clarity.microsoft.com/demo/projects/view/3t0wlogvdz/dashboard?date=Last%203%20days';\r\nexport const CLARITY_PRIVACY_DISCLOSURE = 'https://learn.microsoft.com/en-us/clarity/setup-and-installation/privacy-disclosure';\r\nexport const WAITLIST_FORM =\r\n 'https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR9CSFbF9q-VAlTdHTCCoFF5UNFdaMjJPVTY3RjBGVUpGMEdMTFVFOUlUMi4u';\r\n\r\nexport const USER_SIGNUP_KEY = 'isUserSignUpFlow';\r\n\r\nexport const DEFAULT_COUNTRY_NAME = 'United States';\r\nexport const DEFAULT_COUNTRY_CODE = 'US';\r\nexport const DEFAULT_CURRENCY_CODE = 'USD';\r\nexport const DEFAULT_LANGUAGE_CODE = 'en';\r\nexport const DEFAULT_LOCALE = 'en-US';\r\n\r\nexport const NO_VALUE_PLACEHOLDER = '-';\r\n\r\nexport const SESSION_NOTIFICATIONS_UI = 'UIGeneratedNotifications';\r\nexport const SESSION_DISMISSED_NOTIFICATIONS_BACKEND = 'BackendDismissedNotifications';\r\nexport const SUPPORT_EMAIL = 'pubhelp@microsoft.com';\r\nexport const TYTHON_SUPPORT_EMAIL = 'monetizenow@microsoft.com';\r\n\r\nexport const TNC_HREF_PATH = '/terms-and-conditions';\r\n\r\nexport const DEFAULT_PUBLISHER_CACHE_KEY = 'app.defaulftPublisherId';\r\n\r\nexport const DEFAULT_ADUNIT_IMAGE_ASPECT_RATIO = process.env.REACT_APP_DEFAULT_ADUNIT_IMAGE_ASPECT_RATIO ?? '1.91:1';\r\n\r\nconst DEFAULT_ADUNIT_IMAGE_ASPECT_RATIOS = ['1.91:1', '1:1', '4:3', '9:16'];\r\nexport const ADUNIT_IMAGE_ASPECT_RATIOS =\r\n process.env.REACT_APP_ADUNIT_IMAGE_ASPECT_RATIOS?.split(',') ?? DEFAULT_ADUNIT_IMAGE_ASPECT_RATIOS;\r\n\r\nexport const PRIVACY_STATEMENT = 'http://go.microsoft.com/fwlink/?LinkId=248681';\r\n\r\nexport const SUCCESS_MESSAGE_WIDTH = 480;\r\nexport const CUSTOM_WIDTH = '520px';\r\nexport const CUSTOM_NOTIFICATIONS_WIDTH = '460px';\r\n\r\nexport const PAGINATION_PAGE_SIZES = [10, 25, 50, 75, 100];\r\n\r\nexport const REDIRECT_URI_SESSION_STORAGE_KEY = 'redirect_uri';\r\n\r\nexport const TYTHON_DOMAIN_REDIRECTION_CACHE_KEY = 'isRedirectedUser';\r\nexport const DOMAIN_REDIRECTION_QUERY_PARAM = 'loginHint';\r\n\r\nexport const ADS_UI_URL = process.env.REACT_APP_ENV === 'production' ? 'https://ads.microsoft.com' : 'https://ads-int.microsoft.com';\r\n\r\nexport const ENTERPRISE_USER_ACCESS_URL = 'https://euaaccessportal.microsoft.com/request/access/Advertising_PubCenter';\r\n\r\nexport const WAITLIST_FORM_LINK =\r\n 'https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR9CSFbF9q-VAlTdHTCCoFF5UNFdaMjJPVTY3RjBGVUpGMEdMTFVFOUlUMi4u';\r\n\r\nexport const ADS_DOT_TEXT_HELP_URL = 'https://help.pubcenter.microsoft.com/#apex/pcv4/en/07509/-1';\r\nexport const CONNECT_SITE_HELP_URL = 'https://help.ucm.microsoft.com/#apex/pcv4/en/07507/-1';\r\nexport const SITE_APPROVAL_HELP_URL = 'https://help.ads.microsoft.com/#apex/pcv4/en/07510/-1';\r\nexport const PUBLISHER_EVALUATION_HELP_URL = 'https://help.ads.microsoft.com/#apex/pcv4/en/07517/-1';\r\n\r\nexport const WELCOME_SEND_FLAG = 'welcomeEmailSend';\r\nexport const LOCAL_STORAGE_LOCALE = 'LOCAL_STORAGE_LOCALE';\r\nexport const UNAUTHORIZED_LOCAL_STORAGE_LOCALE = 'UNAUTHORIZED_LOCAL_STORAGE_LOCALE';\r\n\r\nexport const EN_LOCALE_KEY = 'en-us';\r\nexport const FR_LOCALE_KEY = 'fr-fr';\r\nexport const DE_LOCALE_KEY = 'de-de';\r\nexport const IT_LOCALE_KEY = 'it-it';\r\nexport const ES_LOCALE_KEY = 'es-es';\r\nexport const EN_GB_LOCALE_KEY = 'en-gb';\r\nexport const ES_MX_LOCALE_KEY = 'es-mx';\r\nexport const FR_CA_LOCALE_KEY = 'fr-ca';\r\n","export * from './GridV2';\r\nexport * from './GridV2.styles';\r\nexport * from './GridV2.types';\r\n","export enum TythonColumnsEnum {\r\n ImpressionRequests = 'ImpressionRequests',\r\n ImpressionsReturned = 'ImpressionsReturned',\r\n ImpressionsServed = 'ImpressionsServed',\r\n ImpressionsViewed = 'ImpressionsViewed',\r\n Viewability = 'Viewability',\r\n Revenue = 'Revenue',\r\n WinningBids = 'WinningBids',\r\n WinRate = 'WinRate',\r\n eCPM = 'eCPM',\r\n Clicks = 'Clicks',\r\n CTR = 'CTR',\r\n FillRate = 'FillRate',\r\n Impressions = 'Impressions',\r\n ViewableImpressions = 'ViewableImpressions',\r\n MeasurableImpressions = 'MeasurableImpressions',\r\n ImpressionsRate = 'ImpressionsRate',\r\n EligibleImpressions = 'EligibleImpressions',\r\n MeasurableImpressionsRate = 'MeasurableImpressionsRate',\r\n ResponsesServed = 'ResponsesServed',\r\n DateTime = 'DateTime',\r\n AdUnitName = 'AdUnitName',\r\n Country = 'Country',\r\n CountryCode = 'CountryCode',\r\n AdECPM = 'AdECPM',\r\n AdClicks = 'AdClicks',\r\n AdCTR = 'AdCTR',\r\n Date = 'Date',\r\n AdUnitId = 'AdUnitId',\r\n SiteName = 'SiteName',\r\n PropertyUrl = 'PropertyUrl',\r\n OperatingSystem = 'OperatingSystem',\r\n}\r\n","import { createStore } from 'satcheljs';\r\nimport { AdQualityFilterNames, IAdCreativeViewState } from './schema';\r\n\r\nexport const defaultInitialTextFilterState = {\r\n condition: undefined,\r\n value: '',\r\n isApplied: false,\r\n};\r\n\r\nexport const getStore = createStore<IAdCreativeViewState>('AdCreativeState', {\r\n active: {},\r\n loading: false,\r\n panelIsOpen: false,\r\n panelItemType: undefined,\r\n filterPanel: undefined,\r\n blockAdsPage: { adPerfBlockAdsData: [], blockReasonsL2: [], channels: {} },\r\n pageType: 'AdCreative',\r\n errors: {},\r\n columns: [],\r\n blockedAdsContext: undefined,\r\n blockedImagesContext: undefined,\r\n teachingBubbleStartDate: false,\r\n teachingBubbleEndDate: false,\r\n adDescription: false,\r\n filters: {\r\n active: {\r\n [AdQualityFilterNames.AccountName]: { values: [] },\r\n [AdQualityFilterNames.AdProviders]: { values: [] },\r\n [AdQualityFilterNames.Markets]: { values: [] },\r\n [AdQualityFilterNames.CreativeAdId]: { conditions: [] },\r\n [AdQualityFilterNames.Advertiser]: { conditions: [] },\r\n [AdQualityFilterNames.AdvertiserId]: { conditions: [] },\r\n [AdQualityFilterNames.AdvertiserAccountId]: { conditions: [] },\r\n [AdQualityFilterNames.AdId]: { conditions: [] },\r\n [AdQualityFilterNames.AdTitle]: { conditions: [] },\r\n [AdQualityFilterNames.AdURL]: { conditions: [] },\r\n [AdQualityFilterNames.LongHeadline]: { conditions: [] },\r\n [AdQualityFilterNames.ShortHeadline]: { conditions: [] },\r\n },\r\n raw: {\r\n [AdQualityFilterNames.AccountName]: { values: [] },\r\n [AdQualityFilterNames.AdProviders]: { values: [] },\r\n [AdQualityFilterNames.Markets]: { values: [] },\r\n [AdQualityFilterNames.CreativeAdId]: { conditions: [defaultInitialTextFilterState] },\r\n [AdQualityFilterNames.Advertiser]: { conditions: [defaultInitialTextFilterState] },\r\n [AdQualityFilterNames.AdvertiserId]: { conditions: [defaultInitialTextFilterState] },\r\n [AdQualityFilterNames.AdvertiserAccountId]: { conditions: [defaultInitialTextFilterState] },\r\n [AdQualityFilterNames.AdId]: { conditions: [defaultInitialTextFilterState] },\r\n [AdQualityFilterNames.AdTitle]: { conditions: [defaultInitialTextFilterState] },\r\n [AdQualityFilterNames.AdURL]: { conditions: [defaultInitialTextFilterState] },\r\n [AdQualityFilterNames.LongHeadline]: { conditions: [defaultInitialTextFilterState] },\r\n [AdQualityFilterNames.ShortHeadline]: { conditions: [defaultInitialTextFilterState] },\r\n },\r\n },\r\n});\r\n","import { AdManagementRouter } from './pages/ad-management/AdManagementRouter';\r\nimport { PartnerManagementRouter } from './pages/partner-management/PartnerManagementRouter';\r\nimport { ReportRouter } from './pages/report/ReportRouter';\r\nimport { IRoute } from './Routes.types';\r\n\r\nexport enum RoutePrefix {\r\n report = 'report',\r\n adManagement = 'ad-management',\r\n partnerManagement = 'partner-management',\r\n capacity = 'capacity',\r\n}\r\n\r\nexport const getGlobalRoutes = (): IRoute[] => [\r\n {\r\n key: `/${RoutePrefix.report}`,\r\n text: 'Reporting',\r\n icon: 'CRMReport',\r\n component: ReportRouter,\r\n },\r\n {\r\n key: `/${RoutePrefix.adManagement}`,\r\n text: 'Ad Management',\r\n icon: 'DocumentManagement',\r\n // @ts-ignore\r\n component: AdManagementRouter,\r\n },\r\n {\r\n key: `/${RoutePrefix.partnerManagement}`,\r\n text: 'Partner Management',\r\n icon: 'AccountManagement',\r\n component: PartnerManagementRouter,\r\n },\r\n // {\r\n // key: `/${RoutePrefix.capacity}`,\r\n // text: 'Capacity',\r\n // icon: 'OfflineStorageSolid',\r\n // component: CapacityRouter\r\n // }\r\n];\r\n\r\nexport const DefaultRoute = `/${RoutePrefix.adManagement}`;\r\nexport const SignUpPageRoute = '/signup';\r\nexport const LandingPageRoute = '/landing-page';\r\nexport const LogInPageRoute = '/login';\r\nexport const AccountPageRoute = '/publisherProfile';\r\nexport const AcceptInvitePageRoute = '/acceptUserInvite/code=';\r\nexport const UserDoesNotExistErrorPageRoute = '/user-does-not-exist';\r\nexport const NoAccessErrorPageRoute = '/no-access';\r\nexport const UnauthorizedInternalUserPageRoute = '/unauthorized-user';\r\nexport const HomePageRoute = '/ad-management/home';\r\nexport const AuditHistoryRoute = '/auditHistory';\r\nexport const UserLevelSettingRoute = '/userSettings';\r\nexport const SupportPageRoute = '/support';\r\n","import { RefObject } from 'react';\r\nimport { HighChartsWrapper } from '../../../../components/HighCharts/HighChartsLibrary';\r\nimport { IRouterWithIntl } from '../../../../utils';\r\nimport { TythonColumnsEnum } from '../../@data/store/schema/ColumnsEnum';\r\nimport { ICustomCalenderDateRange } from '../../components/CustomCalender/CustomCalender.types';\r\nimport { FormatMessageFuncType } from '../../utils/intlHelper';\r\nimport { IMetadataElement, IReportsMetadata, TythonReportingDataRow } from '../@data/store/schema';\r\nimport { IMetricMarkerProps } from '../MetricMarker/MetricMarker.types';\r\nimport { IActiveFilter } from '../ReportDetailsPage/ActionBar/ActionBar';\r\n\r\nexport interface IReportCardProps extends IRouterWithIntl {\r\n title: string;\r\n type: ReportCardType;\r\n allowedChartTypes: IChartButton[];\r\n defaultColumns: TythonColumnsEnum[];\r\n defaultMetrics: TythonColumnsEnum[];\r\n enableHideChartsButton?: boolean;\r\n hasMinimumBreakdown?: boolean;\r\n reportData?: TythonReportingDataRow[];\r\n summaryData?: TythonReportingDataRow[];\r\n reportDetailedData?: TythonReportingDataRow[];\r\n isSummaryDataLoaded?: boolean;\r\n reportMetadata?: IReportsMetadata;\r\n defaultChartGrain?: ChartGrain;\r\n allowedChartGrains: IMetadataElement[];\r\n showChartGrains?: boolean;\r\n showMetricsMarkers?: boolean;\r\n dataMetrics: IReportDataMetrics;\r\n mainDimension?: string;\r\n dateDimension: string;\r\n showDetailsReportLink: boolean;\r\n dateRange: ICustomCalenderDateRange;\r\n filters: IActiveFilter[];\r\n isDetailedView: boolean;\r\n onChartGrainChanged?: (grain: ChartGrain) => void;\r\n onSelectedMetricChanged?: (metric: string) => void;\r\n onActiveMetricsChanged?: (activeMetrics: ActiveMetrics) => void;\r\n onBreakDownChanged?: (newBreakdown: string[]) => void;\r\n reportCardRef: RefObject<HTMLDivElement>;\r\n}\r\n\r\nexport interface IChartButton {\r\n chartType: ChartTypes;\r\n disabled: boolean;\r\n iconName: string;\r\n dataTestId?: string;\r\n}\r\n\r\nexport interface IReportOptions {\r\n mainDimension: string;\r\n}\r\n\r\nexport interface IReportDataMetrics {\r\n chartDataMetrics: string;\r\n}\r\nexport interface IChartsOptions {\r\n currentChartType: ChartTypes;\r\n currentChartGrain: ChartGrain;\r\n reportData: TythonReportingDataRow[];\r\n mainDimension?: IMetadataElement;\r\n selectedMetric: IMetadataElement;\r\n chartComponentRef: React.RefObject<HighChartsWrapper.RefObject>;\r\n mapChartComponentRef: React.RefObject<HighChartsWrapper.RefObject>;\r\n activeMetrics: ActiveMetrics;\r\n dateDimension: string;\r\n countryCodeDimension?: string;\r\n formatMessage: FormatMessageFuncType;\r\n}\r\nexport interface IReportDetailsPageParams {\r\n type: ReportCardType;\r\n}\r\n\r\nexport enum ChartTypes {\r\n DONUT = 'Donut',\r\n BAR = 'Bar',\r\n GRID = 'Grid',\r\n LINE = 'Line',\r\n MAP = 'Map',\r\n}\r\n\r\nexport enum ChartGrain {\r\n NONE = 'None',\r\n HOURLY = 'Hour',\r\n DAILY = 'Day',\r\n WEEKLY = 'Week',\r\n MONTHLY = 'Month',\r\n YEARLY = 'Year',\r\n MONTH_AND_YEAR = 'MonthAndYear',\r\n}\r\nexport enum ReportCardType {\r\n PERFORMANCE = 'performance',\r\n ADUNIT = 'adunit',\r\n SITE = 'site',\r\n COUNTRY = 'country',\r\n MEDIATION = 'mediation',\r\n CUSTOM = 'custom',\r\n SUMMARY = 'summary',\r\n}\r\n\r\nexport type ActiveMetrics = Record<string, IMetricMarkerProps>;\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onAcceptInvitePageInitialized = action(\r\n 'onAcceptInvitePageInitialized',\r\n (invitationCode: string, invitationLocale: string) => ({ invitationCode, invitationLocale })\r\n);\r\n\r\nexport const onAcceptInvitePageSubmitted = action('onAcceptInvitePageSubmitted');\r\n\r\nexport const validateUserInvitationCode = action('validateUserInvitationCode', (invitationCode: string) => ({ invitationCode }));\r\n","import { action } from 'satcheljs';\r\nimport { Model } from '../../../../../@data';\r\nimport { IDevTokenPanelParams } from '../../Manage/ManagePage.types';\r\n\r\nexport const onDevTokenPanelShown = action('onDevTokenPanelShown', (devTokenPanelParams: IDevTokenPanelParams) => ({\r\n devTokenPanelParams,\r\n}));\r\n\r\nexport const onDevTokenPanelHide = action('onDevTokenPanelHide');\r\n\r\nexport const onFetchDevTokenStatus = action('onFetchDevTokenStatus', (selectedItem: Model) => ({\r\n selectedItem,\r\n}));\r\n\r\nexport const onGenerateDevTokenStatus = action('onGenerateDevTokenStatus', (selectedItem: Model) => ({\r\n selectedItem,\r\n}));\r\n\r\nexport const onTokenStatusItem = action('onTokenStatusItem', (selectedItem: Model) => ({\r\n selectedItem,\r\n}));\r\n","import { action } from 'satcheljs';\r\nimport { IStringDictionary, User, UserInvitation } from '../../../../../@data';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { IUserViewModel } from '../store/schema';\r\n\r\nexport const onRawChanged = action('onRawChanged', (value?: User) => ({ value }));\r\n\r\nexport const onUserChanged = action('onUserChanged', (user: IUserViewModel) => ({ user }));\r\n\r\nexport const onFetchUsersLoading = action('onFetchUsersLoading', (isLoading: boolean) => ({ isLoading }));\r\n\r\nexport const onFetchingUsersData = action('onFetchingUsersData', (isFetchingData: boolean) => ({ isFetchingData }));\r\n\r\nexport const onUserInvitationsChanged = action('onUserInvitationsChanged', (userInvitations: UserInvitation[]) => ({ userInvitations }));\r\n\r\nexport const onFetchUserInvitationsLoading = action('onFetchUserInvitationsLoading', (isLoading: boolean) => ({ isLoading }));\r\n\r\nexport const onFetchingUserInvitationsData = action('onFetchingUserInvitationsData', (isFetchingData: boolean) => ({ isFetchingData }));\r\n\r\nexport const onUsersChanged = action('onUsersChanged', (users: User[]) => ({ users }));\r\n\r\nexport const onUserErrorChanged = action('onUserErrorChanged', (values?: IStringDictionary) => ({ values }));\r\n\r\nexport const onUserInvitationChanged = action('onUserInvitationChanged', (mode: FormState, value?: UserInvitation) => ({\r\n value,\r\n mode,\r\n}));\r\n\r\nexport const onUserInvitationExpiryChanged = action('onUserInvitationExpiryChanged', (id: number, value: Date) => ({ id, value }));\r\n","import { IChoiceGroupOption, IComboBoxOption } from '@fluentui/react';\r\nimport { History } from 'history';\r\nimport { action } from 'satcheljs';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { IIdNamePair } from '../../../../../components/MultiSelectPicker';\r\n\r\nexport const onFormIdChanged = action('onFormIdChanged', (value: number) => ({ value }));\r\n\r\nexport const onFormFirstNameChanged = action('onFormFirstNameChanged', (value?: string) => ({ value }));\r\n\r\nexport const onFormLastNameChanged = action('onFormLastNameChanged', (value?: string) => ({ value }));\r\n\r\nexport const onFormPhoneNumberChanged = action('onFormPhoneNumberChanged', (value?: string) => ({ value }));\r\n\r\nexport const onFormEmailAddressChanged = action('onFormEmailAddressChanged', (value?: string) => ({ value }));\r\n\r\nexport const onFormUsernameChanged = action('onFormUsernameChanged', (value?: string) => ({ value }));\r\n\r\n// need to change string to IDropdown option once language is fixed\r\nexport const onFormLanguageChanged = action('onFormLanguageChanged', (value?: string) => ({ value }));\r\n\r\nexport const onFormUserLocaleChanged = action('onFormUserLocaleChanged', (value?: IComboBoxOption) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormContactByEmailChanged = action('onContactByEmailChanged', (value?: boolean) => ({ value }));\r\n\r\nexport const onFormContactByPhoneChanged = action('onFormContactByPhoneChanged', (value?: boolean) => ({ value }));\r\n\r\nexport const onFormAccountRoleChanged = action('onFormAccountRoleChanged', (value?: IChoiceGroupOption) => ({ value }));\r\n\r\nexport const onFormRoleAccountListChanged = action('onFormRoleAccountListChanged', (value?: IIdNamePair[]) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormInitialized = action('onFormInitialized', (mode: FormState, publisherId: string, entityId?: string) => ({\r\n mode,\r\n publisherId,\r\n entityId,\r\n}));\r\n\r\nexport const onFormCancelled = action('onFormCancelled');\r\n\r\nexport const onFormCleared = action('onFormCleared');\r\n\r\nexport const onFormSubmitted = action('onFormSubmitted', (mode: FormState, routeHistory?: History) => ({ mode, routeHistory }));\r\n","import { action } from 'satcheljs';\r\n\r\nexport const sendWelcomeToPubcenterEmail = action('sendWelcomeToPubcenterEmail');\r\n\r\n","import { action } from 'satcheljs';\r\nimport { AdUnit, LifeCycleStatus } from '../../../../../@data';\r\n\r\nexport const fetchAdUnitsDataAction = action('fetchAdUnitsDataAction');\r\n\r\nexport const fetchAdUnitMediationStatus = action('fetchAdUnitMediationStatus',\r\n (adUnitId: string,\r\n showLoadingSpinner?: boolean,\r\n showNotifications?: boolean) => ({ adUnitId, showLoadingSpinner, showNotifications }));\r\n\r\nexport const updateAdUnitMediationStatus = action('updateAdUnitMediationStatus',\r\n (adUnits: AdUnit[], state: LifeCycleStatus) => ({ adUnits, state }));","import { action } from 'satcheljs';\r\nimport { AdUnit, IStringDictionary } from '../../../../../@data';\r\nimport { IAdunitViewModel } from '../store/schema';\r\n\r\nexport const onRawChanged = action('onRawChanged', (value?: AdUnit) => ({ value }));\r\n\r\nexport const onAdunitChanged = action('onAdunitChanged', (adunit: IAdunitViewModel) => ({ adunit }));\r\n\r\nexport const onAdunitErrorChanged = action('onAdunitErrorChanged', (values?: IStringDictionary) => ({ values }));\r\n\r\nexport const onAdunitMediationUpdateStart = action('onAdunitMediationUpdateStart', (ids: number[]) => ({ ids }));\r\n\r\nexport const onAdunitMediationUpdateEnd = action('onAdunitMediationUpdateEnd', (ids: number[]) => ({ ids }));\r\n","import { IChoiceGroupOption, IDropdownOption } from '@fluentui/react';\r\nimport { History } from 'history';\r\nimport { action } from 'satcheljs';\r\nimport { AdUnitType, NativeAdTemplate, Property } from '../../../../../@data';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { IIdNamePair } from '../../../../../components/MultiSelectPicker';\r\nimport { StepState } from '../../../../../layout/DetailPageWithStepper/DetailPageWithStepper.types';\r\n\r\nexport const onFormInitialized = action(\r\n 'onFormInitialized',\r\n (mode: FormState, publisherId: string, accountId: string, entityId?: string, showLoadingSpinner?: boolean) => ({\r\n mode,\r\n publisherId,\r\n accountId,\r\n entityId,\r\n showLoadingSpinner,\r\n })\r\n);\r\n\r\nexport const onFetchAdUnitName = action(\r\n 'onFetchAdUnitName',\r\n (publisherId: string, accountId: string, entityId: string, setIsLoading: (isLoading: boolean) => void) => ({\r\n publisherId,\r\n accountId,\r\n entityId,\r\n setIsLoading,\r\n })\r\n);\r\n\r\nexport const onFetchAdUnitTemplate = action('onFetchAdUnitTemplate', (entityId: string) => ({\r\n entityId,\r\n}));\r\n\r\nexport const onAdunitIdChanged = action('onAdunitIdChanged', (value: number) => ({ value }));\r\n\r\nexport const onAdunitNameChanged = action('onAdunitNameChanged', (value?: string) => ({ value }));\r\n\r\nexport const onAdunitTypeChanged = action('onAdunitTypeChanged', (value?: AdUnitType) => ({ value }));\r\n\r\nexport const onMarketplaceChanged = action('onMarketplaceChanged', (value: IDropdownOption) => ({ value }));\r\n\r\nexport const onBusinessModelChanged = action('onBusinessModelChanged', (value?: IDropdownOption) => ({ value }));\r\n\r\nexport const onChannelsChanged = action('onChannelsChanged', (values?: IIdNamePair[]) => ({ values }));\r\n\r\nexport const onAdunitChannelListChanged = action('onAdunitChannelListChanged', (values?: IIdNamePair[]) => ({ values }));\r\n\r\nexport const onAssociatedPropertyChanged = action('onChannelsChanged', (value?: Property) => ({ value }));\r\n\r\nexport const onAdunitPropertyListChanged = action('onAdunitPropertyListChanged', (values?: Property[]) => ({ values }));\r\n\r\nexport const onCreatePropertyPanelOpenChanged = action('onCreatePropertyPanelOpenChanged', (isOpen: boolean) => ({ isOpen }));\r\n\r\nexport const onServingTierChanged = action('onServingTierChanged', (value?: IChoiceGroupOption) => ({ value }));\r\n\r\nexport const onPubGroupConfigChanged = action('onPubGroupConfigChanged', (value?: IDropdownOption) => ({ value }));\r\n\r\nexport const onStoreIdsChanged = action('onStoreIdsChanged', (values?: string) => ({ values }));\r\n\r\nexport const onAdUnitFormSubmittable = action('onAdUnitFormSubmittable', (isSubmittable: boolean) => ({ isSubmittable }));\r\n\r\nexport const onFormSubmitted = action(\r\n 'onFormSubmitted',\r\n (mode: FormState, routeHistory?: History, onSubmit?: () => void, stepState?: StepState, shouldHandleMediation?: boolean) => ({\r\n mode,\r\n routeHistory,\r\n onSubmit,\r\n stepState,\r\n shouldHandleMediation,\r\n })\r\n);\r\n\r\nexport const onAdUnitNameUpdate = action(\r\n 'onAdUnitNameUpdate',\r\n (\r\n formatMessage: (\r\n messageDescriptor: ReactIntl.FormattedMessage.MessageDescriptor,\r\n values?:\r\n | {\r\n [key: string]: ReactIntl.MessageValue;\r\n }\r\n | undefined\r\n ) => string,\r\n setIsLoading: (isLoading: boolean) => void,\r\n setErrorMessage: (error: string) => void,\r\n setVisibleCallOut: (id: number) => void\r\n ) => ({\r\n formatMessage,\r\n setIsLoading,\r\n setErrorMessage,\r\n setVisibleCallOut,\r\n })\r\n);\r\n\r\nexport const onFormCancelled = action('onFormCancelled');\r\n\r\nexport const onFormCleared = action('onFormCleared');\r\n\r\nexport const onTemplateUploaded = action('onTemplateUploaded', (content: NativeAdTemplate) => ({ content }));\r\n\r\nexport const onTemplateDownloaded = action('onTemplateDownloaded', (content: NativeAdTemplate) => ({ content }));\r\n\r\nexport const onDistributionPartnerCodesChanged = action('onDistributionPartnerCodesChanged', (value?: string) => ({ value }));\r\n\r\nexport const onImpressionFeedbackSignalChanged = action('onImpressionFeedbackSignalChanged', (value?: boolean) => ({ value }));\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onPanelOpenChanged = action(\r\n 'onPanelOpenChanged',\r\n (isPanelOpen: boolean, activePropertyId?: number, activeAdUnitId?: number) => ({\r\n isPanelOpen,\r\n activePropertyId,\r\n activeAdUnitId,\r\n })\r\n);\r\n","import { useEffect, useState } from 'react';\r\n\r\ntype MeasureStyle = {\r\n fontStyle?: string;\r\n fontVariant?: string;\r\n fontWeight?: string | number;\r\n fontSize?: string;\r\n lineHeight?: string;\r\n fontFamily?: string;\r\n};\r\n\r\nexport const defaultGridCellTextStyle: MeasureStyle = {\r\n fontSize: '14px',\r\n fontWeight: 400,\r\n};\r\n\r\n/**\r\n * const longestNameLength = useCanvasTextWidth(\r\n 'Ad Unit lonnnnnnnnnnnnnnnnnnnnnnnnnnnnnnng name', // longest string or any string you want to measure\r\n {\r\n fontSize: '14px',\r\n fontWeight: 400,\r\n },\r\n 20 // boundaries to add in px, this can used to add padding/margin to the text\r\n );\r\n console.log(longestNameLength)\r\n */\r\n\r\nexport const useCanvasTextWidth = (text: string, style: MeasureStyle = defaultGridCellTextStyle, boundary: number = 0) => {\r\n const [width, setWidth] = useState(0);\r\n\r\n useEffect(() => {\r\n const canvas = document.createElement('canvas');\r\n const context = canvas.getContext('2d');\r\n\r\n if (context) {\r\n // Construct the font string from the style object\r\n const fontParts = [\r\n style.fontStyle || '',\r\n style.fontVariant || '',\r\n style.fontWeight || '',\r\n style.fontSize || '16px',\r\n style.lineHeight || '',\r\n style.fontFamily ||\r\n '\"Segoe UI\", \"Segoe UI Web (West European)\", \"Segoe UI\", -apple-system, BlinkMacSystemFont, Roboto, \"Helvetica Neue\", sans-serif',\r\n ];\r\n context.font = fontParts.filter(Boolean).join(' ');\r\n\r\n const metrics = context.measureText(text);\r\n setWidth(metrics.width);\r\n }\r\n }, [text, style]);\r\n\r\n // TODO: make it a util function as well\r\n return width + boundary;\r\n};\r\n","import { useEffect, useState } from 'react';\r\n\r\nexport function useDebouncedValue<T>(value: T, delay: number): T {\r\n const [debouncedValue, setDebouncedValue] = useState(value);\r\n\r\n useEffect(() => {\r\n const timer = setTimeout(() => {\r\n setDebouncedValue(value);\r\n }, delay);\r\n\r\n return () => {\r\n clearTimeout(timer);\r\n };\r\n }, [value, delay]);\r\n\r\n return debouncedValue;\r\n}\r\n\r\nexport function debounce(func, wait) {\r\n let timeout;\r\n\r\n return function executedFunction(...args) {\r\n const later = () => {\r\n clearTimeout(timeout);\r\n func(...args);\r\n };\r\n\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n };\r\n}\r\n","import { useCallback, useRef, useState } from 'react';\r\n\r\nexport function useIntersectionObserverWithRefCallback(\r\n { threshold = 0, root = null, rootMargin = '20px' }: IntersectionObserverInit,\r\n unobserve: boolean = false\r\n) {\r\n const ref = useRef(null);\r\n const [entry, setEntry] = useState<IntersectionObserverEntry>();\r\n const updateEntry = ([intersectionObserverEntry]: IntersectionObserverEntry[]): void => {\r\n setEntry(intersectionObserverEntry);\r\n };\r\n const updateEntryAndUnobserve = ([intersectionObserverEntry]: IntersectionObserverEntry[], observer): void => {\r\n setEntry(intersectionObserverEntry);\r\n !!intersectionObserverEntry?.isIntersecting && ref.current && observer.unobserve(ref.current);\r\n };\r\n const setRef = useCallback(\r\n (node) => {\r\n if (node) {\r\n const observerOptions = { threshold, root, rootMargin };\r\n const observer = new IntersectionObserver(unobserve ? updateEntryAndUnobserve : updateEntry, observerOptions);\r\n observer.observe(node);\r\n }\r\n ref.current = node;\r\n },\r\n [threshold, root, rootMargin, unobserve]\r\n );\r\n return [entry, setRef] as const;\r\n}\r\n","import React from 'react';\r\n\r\nexport const useNativeAdSdk = () => {\r\n const [isSdkLoaded, setSdkLoaded] = React.useState(false);\r\n\r\n // load ad preview SDK at parent level to cache the script\r\n React.useEffect(() => {\r\n const script = document.createElement('script');\r\n script.src = 'https://adsdk.microsoft.com/ad-preview/sdk.js';\r\n script.async = true;\r\n script.crossOrigin = 'anonymous';\r\n\r\n script.onload = () => {\r\n setSdkLoaded(true);\r\n };\r\n\r\n document.head.appendChild(script);\r\n\r\n // Cleanup function to remove the script when component unmounts\r\n return () => {\r\n document.head.removeChild(script);\r\n };\r\n }, []);\r\n\r\n return {\r\n isSdkLoaded,\r\n };\r\n};\r\n","import { useEffect, useState } from 'react';\r\n\r\nexport const usePUID = (): string | null => {\r\n const [puid, setPUID] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n // Check if \"msal.account.keys\" exists in localStorage\r\n const msalAccountKeys = localStorage.getItem('msal.account.keys');\r\n\r\n if (msalAccountKeys) {\r\n try {\r\n // Parse the value as JSON\r\n const keysArray = JSON.parse(msalAccountKeys);\r\n\r\n if (Array.isArray(keysArray) && keysArray[0]) {\r\n const idTokenClaims = JSON.parse(localStorage.getItem(keysArray[0])!)?.idTokenClaims;\r\n\r\n if (idTokenClaims?.puid) {\r\n // Set the PUID state to the retrieved value\r\n setPUID(idTokenClaims.puid);\r\n }\r\n }\r\n } catch (error) {\r\n console.error('Error parsing JSON or retrieving PUID:', error);\r\n }\r\n }\r\n }, []);\r\n\r\n return puid;\r\n};\r\n","import { useEffect } from 'react';\r\n\r\nexport const usePreloadSVGImages = (imageList: string[]) => {\r\n useEffect(() => {\r\n const preloadContainer = document.createElement('div');\r\n preloadContainer.style.display = 'none';\r\n\r\n imageList.forEach((imageSrc) => {\r\n const img = new Image();\r\n img.src = imageSrc;\r\n img.width = 0;\r\n img.height = 0;\r\n preloadContainer.appendChild(img);\r\n });\r\n\r\n document.body.appendChild(preloadContainer);\r\n\r\n return () => {\r\n // Cleanup to remove the preloaded images when not needed\r\n document.body.removeChild(preloadContainer);\r\n };\r\n // eslint-disable-next-line\r\n }, []);\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { ICustomColumn } from '../types';\r\nimport { sortItemsBasedOnColumn } from '../utils/DataGridUtils/SortingUtils';\r\n\r\nexport function useSortableGridColumns<ItemType>(\r\n columns: ICustomColumn<ItemType>[],\r\n items: ItemType[],\r\n onSortItems?: (items: ItemType[]) => void,\r\n onCleanupSortItems?: () => void\r\n) {\r\n const [gridColumns, setGridColumns] = useState<ICustomColumn<ItemType>[]>(columns);\r\n\r\n useEffect(() => {\r\n setGridColumns(columns);\r\n }, [columns]);\r\n\r\n useEffect(() => {\r\n return () => onCleanupSortItems?.();\r\n }, [onCleanupSortItems]);\r\n\r\n function handleColumnHeaderClick(ev?: React.MouseEvent<HTMLElement>, column?: ICustomColumn) {\r\n if (!column || column.suppressSorting) {\r\n return;\r\n }\r\n ev?.stopPropagation();\r\n\r\n const newColumns = gridColumns.slice();\r\n const currColumn = newColumns.filter((currCol) => column.key === currCol.key)[0];\r\n\r\n newColumns.forEach((col: ICustomColumn) => {\r\n if (col === currColumn) {\r\n currColumn.isSortedDescending = !currColumn.isSortedDescending;\r\n currColumn.isSorted = true;\r\n } else {\r\n col.isSorted = false;\r\n col.isSortedDescending = undefined;\r\n }\r\n });\r\n\r\n setGridColumns(newColumns);\r\n const sortedItems = sortItemsBasedOnColumn(items, currColumn);\r\n onSortItems?.(sortedItems);\r\n }\r\n\r\n return { gridColumns, handleColumnHeaderClick };\r\n}\r\n","import { Dispatch, SetStateAction, useEffect, useRef, useState } from 'react';\r\n\r\ntype UseStateWithLatestCallback<S> = [S, Dispatch<SetStateAction<S>>, () => S];\r\n\r\nexport function useStateWithLatestCallback<S>(initialState: S): UseStateWithLatestCallback<S> {\r\n const [state, setState] = useState(initialState);\r\n const stateRef = useRef(state);\r\n\r\n useEffect(() => {\r\n stateRef.current = state;\r\n }, [state]);\r\n\r\n const getState = () => stateRef.current;\r\n\r\n return [state, setState, getState];\r\n}\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { IUseWindowSize, IWindowSize, WindowSizeType } from './index.types';\r\nimport { getStore } from './store/store';\r\n\r\nexport const useWindowSize = (): IUseWindowSize => {\r\n const windowSizeFormatter = (width?: number): WindowSizeType => {\r\n if (!width) {\r\n return undefined;\r\n } else if (width < 320) {\r\n return 'extraSmall';\r\n } else if (width < 640) {\r\n return 'small';\r\n } else if (width < 1024) {\r\n return 'medium';\r\n }\r\n return 'regular';\r\n };\r\n\r\n const onWindowResize = mutatorAction('WindowSize', ({ innerHeight, innerWidth }: Window) => {\r\n if (window.innerWidth < 320) {\r\n window.resizeTo(320, window.innerHeight);\r\n }\r\n const store = getStore();\r\n store.height = innerHeight;\r\n store.width = innerWidth;\r\n });\r\n\r\n const windowStoreSerializer = (windowSize: IWindowSize) => {\r\n const windowSizeType = windowSizeFormatter(windowSize.width);\r\n return {\r\n ...windowSize,\r\n isWindowExtraSmallSize: windowSizeType === 'extraSmall',\r\n isWindowSmallSize: windowSizeType === 'small',\r\n isWindowMediumSize: windowSizeType === 'medium',\r\n isWindowRegularSize: windowSizeType === 'regular',\r\n };\r\n };\r\n\r\n return {\r\n onWindowResize,\r\n windowStoreSerializer,\r\n windowSizeFormatter,\r\n };\r\n};\r\n","import { AdSource } from '../../../../../../@data';\r\nimport { FilterCondition } from '../../../../../../@data/store/schema/enums/FilterCondition';\r\nimport { IIdNamePair } from '../../../../../../components/MultiSelectPicker';\r\nimport { AdPerformanceData, BlockAdsData, SAMBlockSummaryData } from './models';\r\n\r\nexport enum FilterType {\r\n Text,\r\n Numerical,\r\n List,\r\n}\r\n\r\nexport enum AdQualityFilterNames {\r\n AccountName = 'Account Name',\r\n AdProviders = 'Ad Providers',\r\n Markets = 'Markets',\r\n Advertiser = 'Advertiser',\r\n AdvertiserId = 'Advertiser Id',\r\n AdvertiserAccountId = 'Advertiser Account Id',\r\n AdId = 'Ad Id',\r\n AdTitle = 'Ad Title',\r\n AdURL = 'Ad URL',\r\n CreativeAdId = 'Creative Ad Id',\r\n LongHeadline = 'Long Headline',\r\n ShortHeadline = 'Short Headline',\r\n}\r\n\r\nexport interface IConditionValue<ValueType> {\r\n condition?: FilterCondition;\r\n value?: ValueType;\r\n isApplied?: boolean;\r\n}\r\n\r\nexport interface ITextFilter {\r\n filterType?: FilterType.Text;\r\n conditions?: IConditionValue<string>[];\r\n}\r\n\r\nexport interface INumericalFilter {\r\n filterType?: FilterType.Numerical;\r\n conditions?: IConditionValue<string>[];\r\n}\r\n\r\nexport interface IListFilter {\r\n filterType?: FilterType.List;\r\n values: IIdNamePair[];\r\n}\r\n\r\nexport interface IAdQualityFilter {\r\n [AdQualityFilterNames.AccountName]?: IListFilter;\r\n [AdQualityFilterNames.AdProviders]?: IListFilter;\r\n [AdQualityFilterNames.Markets]?: IListFilter;\r\n [AdQualityFilterNames.Advertiser]?: ITextFilter;\r\n [AdQualityFilterNames.AdvertiserId]?: INumericalFilter;\r\n [AdQualityFilterNames.AdvertiserAccountId]?: INumericalFilter;\r\n [AdQualityFilterNames.AdId]?: INumericalFilter;\r\n [AdQualityFilterNames.AdTitle]?: ITextFilter;\r\n [AdQualityFilterNames.AdURL]?: ITextFilter;\r\n [AdQualityFilterNames.CreativeAdId]?: ITextFilter;\r\n [AdQualityFilterNames.LongHeadline]?: ITextFilter;\r\n [AdQualityFilterNames.ShortHeadline]?: ITextFilter;\r\n}\r\n\r\nexport interface IAdCreativeViewModel {\r\n accounts?: IIdNamePair[];\r\n adProviders?: IIdNamePair[];\r\n markets?: IIdNamePair[];\r\n selectedAccount?: number;\r\n selectedMarket?: string;\r\n searchBoxValue?: string;\r\n startDate?: Date;\r\n endDate?: Date;\r\n adPerfData?: AdPerformanceData[];\r\n blockRequestSourceData?: Map<number, string>;\r\n blockSummaryStartDate?: Date;\r\n blockSummaryEndDate?: Date;\r\n blockSummaryData?: BlockAdsData[];\r\n samBlockSummaryData?: SAMBlockSummaryData[];\r\n selectedAdSource?: AdSource;\r\n selectedAdProviderId?: number;\r\n selectedBlockedMarketId?: number;\r\n active?: IAdQualityFilter;\r\n raw?: IAdQualityFilter;\r\n}\r\n","import { createStore } from 'satcheljs';\r\nimport { DEFAULT_PUBLISHER_CACHE_KEY, EN_LOCALE_KEY, LOCAL_STORAGE_LOCALE, SESSION_NOTIFICATIONS_UI } from '../../constants/AppConstants';\r\nimport { restoreTypeWithObject } from '../../utils/ObjectUtils';\r\nimport { Account, CustomPanelType, PopupType, Publisher, UserContext } from './schema';\r\nimport { IAppState } from './schema/IAppState';\r\n\r\nexport const StoragePublisherKey = 'app.publisher';\r\nexport const StorageAccountKey = 'app.account';\r\nexport const StorageTokenKey = 'token';\r\nexport const StorageUserContextKey = 'app.userContext';\r\nexport const StorageIsUserInviteFlowKey = 'app.isUserInviteFlow';\r\nexport const StorageUserInvitationCodeFlowKey = 'app.UserInvitationCode';\r\nconst storedNotifications = sessionStorage.getItem(SESSION_NOTIFICATIONS_UI);\r\n\r\nexport const getAppStore = createStore<IAppState>('AppViewState', {\r\n account: restoreTypeWithObject(new Account(), localStorage.getItem(StorageAccountKey)) || undefined,\r\n loading: false,\r\n waiting: false,\r\n saving: false,\r\n openedPopup: PopupType.None,\r\n openedPanel: CustomPanelType.None,\r\n isFirstTimeUser: false,\r\n isUserSuspended: false,\r\n menuCollapsed: false,\r\n isInviteUserFlow: localStorage.getItem(StorageIsUserInviteFlowKey) === 'true' ? true : false,\r\n userInvitationCode: localStorage.getItem(StorageUserInvitationCodeFlowKey) || undefined,\r\n notifications: [],\r\n toastNotifications: [],\r\n notificationPanelCollapsed: false,\r\n panelNotifications: storedNotifications ? JSON.parse(storedNotifications) : [],\r\n publisher: restoreTypeWithObject(new Publisher(), localStorage.getItem(StoragePublisherKey)) || undefined,\r\n userContext: restoreTypeWithObject(new UserContext(), localStorage.getItem(StorageUserContextKey)) || undefined,\r\n helpInfo: '',\r\n entityGridColumns: [],\r\n // Removing default LayoutMode setting as it increases the loading time for pages with other layout modes,\r\n // Since API call is made to fetch publisher details and accounts list for the account picker\r\n // layout: LayoutMode.Default,\r\n defaultPublisher: Number(localStorage.getItem(DEFAULT_PUBLISHER_CACHE_KEY)) || 0,\r\n accessiblePublishers: [],\r\n deleteAdUnitTemplateOnSubmit: false,\r\n locale: localStorage.getItem(LOCAL_STORAGE_LOCALE) ?? EN_LOCALE_KEY,\r\n});\r\n","export function getScreenReaderTextStyles() {\r\n return {\r\n display: 'none',\r\n };\r\n}\r\n\r\nexport const flexWithAlignCenter = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n};\r\n\r\nexport const flexWithCenter = {\r\n ...flexWithAlignCenter,\r\n justifyContent: 'center',\r\n};\r\n\r\nexport const flexWithJustifyBetween = {\r\n ...flexWithAlignCenter,\r\n justifyContent: 'space-between',\r\n};\r\n\r\nexport const noPointerEvents = {\r\n pointerEvents: 'none',\r\n};\r\n\r\nexport const zeroMarginPTag = {\r\n margin: 0,\r\n};\r\n","import { action } from 'satcheljs';\r\nimport { Account } from '../store/schema';\r\n\r\nexport const onAccountChanged = action('onAccountChanged', (account?: Account) => ({ account }));\r\nexport const onAccountSelected = action('onAccountSelected', (id: string) => ({ id }));\r\n","import { action } from 'satcheljs';\r\nimport { UserContext } from '../store/schema';\r\n\r\nexport const onAuthLogout = action('onAuthLogout', ({ isTokenExpired = false } = {}) => ({ isTokenExpired }));\r\nexport const onUserContextChanged = action('onUserContextChanged', (userDetails?: UserContext) => ({ userDetails }));\r\n","import { action } from 'satcheljs';\r\nimport { IEntityGridColumns } from '..';\r\n\r\nexport const onEntityGridColumnsChanged = action('onEntityGridColumnsChanged', (entityColumnsData: IEntityGridColumns) => ({\r\n entityColumnsData\r\n}));\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onHelpInfoCalloutOpened = action('onHelpInfoCalloutOpened ', (popupId: string, locale?: string) => ({ popupId, locale }));\r\n\r\nexport const onHelpInfoChanged = action('onHelpInfoChanged', (helpInfo?: string) => ({ helpInfo }));\r\n","import { action } from 'satcheljs';\r\nimport { LayoutMode } from '../store/schema';\r\n\r\nexport const onLayoutChanged = action('onLayoutChanged', (layout: LayoutMode) => ({ layout }));\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onMenuCollapsedChanged = action('onMenuCollapsedChanged', (collapsed: boolean) => ({ collapsed }));\r\n","import { History } from 'history';\r\nimport { action } from 'satcheljs';\r\n\r\nexport const onNavigateBack = action('onNavigateBack', (routeHistory?: History, returnUrl?: string) => ({ routeHistory, returnUrl }));\r\n\r\nexport const redirectToReportingDashboard = action('redirectToReportingDashboard');\r\n\r\nexport const handleDomainRedirection = action('handleDomainRedirection', (username?: string, pathname?: string) => ({\r\n username,\r\n pathname,\r\n}));\r\n","import { action } from 'satcheljs';\r\nimport { INotificationBarItem } from '../../components/NotificationBar';\r\n\r\nexport const onNotificationChanged = action('onNotificationChanged', (notification: INotificationBarItem) => ({\r\n notification,\r\n}));\r\n\r\nexport const onNotificationRemoved = action('onNotificationRemoved', (notification: INotificationBarItem) => ({ notification }));\r\n","import { InjectedIntl } from 'react-intl';\r\nimport { action } from 'satcheljs';\r\nimport { INotificationCardItem } from '../../components/NotificationCard';\r\n\r\nexport const onNotificationCardAdded = action('onNotificationCardAdded', (notification: INotificationCardItem) => ({\r\n notification,\r\n}));\r\n\r\nexport const onNotificationCardRemoved = action('onNotificationCardRemoved', (id: string) => ({\r\n id,\r\n}));\r\n\r\nexport const onDismissAllNotifications = action('onDismissAllNotifications');\r\n\r\nexport const fetchBackendNotifications = action('fetchBackendNotifications', (intl: InjectedIntl) => ({\r\n intl,\r\n}));\r\n\r\nexport const onNotificationPanelItemsChanged = action('onNotificationPanelItemsChanged', (value: INotificationCardItem[]) => ({\r\n value,\r\n}));\r\n\r\nexport const onDismissNotification = action('onDismissNotification', (notification: INotificationCardItem) => ({\r\n notification,\r\n}));\r\n\r\nexport const onNotificationPanelClosed = action('onNotificationPanelClosed', (isClosed: boolean) => ({ isClosed }));\r\n","import { History } from 'history';\r\nimport { action } from 'satcheljs';\r\nimport { Publisher } from '../store/schema';\r\nimport { IUserAccessiblePublisher } from '../store/schema/interfaces/IUserRoleData';\r\n\r\nexport const onPublisherChanged = action('onPublisherChanged', (publisher?: Publisher) => ({ publisher }));\r\nexport const onPublisherSelected = action('onPublisherSelected', (id: string, routeHistory?: History) => ({ id, routeHistory }));\r\nexport const onDefaultPublisherSet = action('onDefaultPublisherSet', (id: number) => ({ id }));\r\nexport const onAccessiblePublisherListChanged = action('onAccessiblePublisherListChanged', (value: IUserAccessiblePublisher[]) => ({\r\n value,\r\n}));\r\nexport const onPublisherAccountChanged = action('onPublisherAccountChanged', (publisherId: string, accountId: string, routeHistory) => ({\r\n publisherId,\r\n accountId,\r\n routeHistory,\r\n}));\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { getAppStore } from '../store/store';\r\n\r\nexport const onUserFirstTime = mutatorAction('ON_USER_FIRST_TIME_CHANGED', function userFirstTimeChanged(value: boolean) {\r\n const store = getAppStore();\r\n store.isFirstTimeUser = value;\r\n});\r\n\r\nexport const onUserUserSuspended = mutatorAction('onUserUserSuspended', (value: boolean) => {\r\n const store = getAppStore();\r\n store.isUserSuspended = value;\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n ProfileReviewTSTFailedTitle: {\r\n id: 'notifications.profileReviewTSTFailedTitle',\r\n defaultMessage: 'Your profile has been rejected ',\r\n },\r\n ProfileReviewTSTFailedContent: {\r\n id: 'notifications.profileReviewTSTFailedContent',\r\n defaultMessage:\r\n 'We have rejected your profile because it doesn’t comply with our Terms and Conditions. In seven days, all account information and data will be deleted and cannot be restored.',\r\n },\r\n MissingPaymentInformationTitle: {\r\n id: 'notifications.missingPaymentInformationTitle',\r\n defaultMessage: 'Update your payment information',\r\n },\r\n MissingPaymentInformationContent: {\r\n id: 'notifications.missingPaymentInformationContent',\r\n defaultMessage:\r\n 'You’ll need to set up your payment information to start earning with {appName}. Add your payment details to get started.',\r\n },\r\n MissingPaymentInformationPrimaryActionLabel: {\r\n id: 'notifications.missingPaymentInformationAction',\r\n defaultMessage: 'Set up payments',\r\n },\r\n PolicyUpdatePrimaryActionLabel: {\r\n id: 'notifications.policyUpdatePrimaryActionLabel',\r\n defaultMessage: 'Accept Terms and Conditions',\r\n },\r\n PaymentFailedTitle: {\r\n id: 'notifications.PaymentFailedTitle',\r\n defaultMessage: 'Payment Failed',\r\n },\r\n PaymentFailedReason_account_closed: {\r\n id: 'notifications.PaymentFailedReason_account_closed',\r\n defaultMessage: 'Your payout failed because your bank account is closed. Please contact your banking institution for questions.',\r\n },\r\n PaymentFailedTitle_bank_account_restricted: {\r\n id: 'notifications.PaymentFailedTitle_bank_account_restricted',\r\n defaultMessage: 'Restricted payment method',\r\n },\r\n PaymentFailedReason_bank_account_restricted: {\r\n id: 'notifications.PaymentFailedReason_bank_account_restricted',\r\n defaultMessage:\r\n 'Your bank may have restrictions on the type and number of transfers allowed. This can indicate that your account is a savings or non-checking account.',\r\n },\r\n PaymentFailedReasonStripe_could_not_process: {\r\n id: 'notifications.PaymentFailedReasonStripe_could_not_process',\r\n defaultMessage: 'Stripe is unable to process your payment.',\r\n },\r\n PaymentFailedReason_could_not_process: {\r\n id: 'notifications.PaymentFailedReason_could_not_process',\r\n defaultMessage: 'Your bank could not process this transfer.',\r\n },\r\n PaymentFailedTitle_declined: {\r\n id: 'notifications.PaymentFailedTitle_declined',\r\n defaultMessage: 'Payment declined',\r\n },\r\n PaymentFailedReason_declined: {\r\n id: 'notifications.PaymentFailedReason_declined',\r\n defaultMessage: 'Your bank has declined the transfer of your payment. Please contact your banking institution for clarification.',\r\n },\r\n PaymentFailedTitle_expired_card: {\r\n id: 'notifications.PaymentFailedTitle_expired_card',\r\n defaultMessage: 'Expired credit card',\r\n },\r\n PaymentFailedReason_expired_card: {\r\n id: 'notifications.PaymentFailedReason_expired_card',\r\n defaultMessage: 'Your card has expired. Please contact your card issuer to fix any issues or consider changing your payment method.',\r\n },\r\n PaymentFailedTitle_incorrect_account_holder_name: {\r\n id: 'notifications.PaymentFailedTitle_incorrect_account_holder_name',\r\n defaultMessage: 'Invalid account holder name',\r\n },\r\n PaymentFailedReason_incorrect_account_holder_name: {\r\n id: 'notifications.PaymentFailedReason_incorrect_account_holder_name',\r\n defaultMessage:\r\n 'Your account details may have been entered incorrectly. Please check that you’ve entered the account holder’s name correctly before trying again.',\r\n },\r\n PaymentFailedTitle_invalid_account_number: {\r\n id: 'notifications.PaymentFailedTitle_invalid_account_number',\r\n defaultMessage: 'Invalid payment method',\r\n },\r\n PaymentFailedReason_invalid_account_number: {\r\n id: 'notifications.PaymentFailedReason_invalid_account_number',\r\n defaultMessage:\r\n 'Your payment details may be invalid. Please check that you’ve entered your account number correctly before trying again.',\r\n },\r\n PaymentFailedTitle_invalid_card: {\r\n id: 'notifications.PaymentFailedTitle_invalid_card',\r\n defaultMessage: 'Invalid payment method',\r\n },\r\n PaymentFailedReason_invalid_card: {\r\n id: 'notifications.PaymentFailedReason_invalid_card',\r\n defaultMessage: 'Your payment method is invalid. Please contact your card issuer and resolve the issue before trying again.',\r\n },\r\n PaymentFailedTitle_invalid_currency: {\r\n id: 'notifications.PaymentFailedTitle_invalid_currency',\r\n defaultMessage: 'Unavailable currency',\r\n },\r\n PaymentFailedReason_invalid_currency: {\r\n id: 'notifications.PaymentFailedReason_invalid_currency',\r\n defaultMessage:\r\n 'Your banking institution was unable to process your payment in your desired currency. Check with your banking institution to make sure that they allow international transactions.',\r\n },\r\n PaymentFailedTitle_lost_or_stolen_card: {\r\n id: 'notifications.PaymentFailedTitle_lost_or_stolen_card',\r\n defaultMessage: 'Lost or stolen card',\r\n },\r\n PaymentFailedReason_lost_or_stolen_card: {\r\n id: 'notifications.PaymentFailedReason_lost_or_stolen_card',\r\n defaultMessage:\r\n 'Your card has been reported lost or stolen. Please contact the card issuer to fix any issues with your card. Then update your card or switch to a different payment method.',\r\n },\r\n PaymentFailedTitle_no_account: {\r\n id: 'notifications.PaymentFailedTitle_no_account',\r\n defaultMessage: 'Invalid account',\r\n },\r\n PaymentFailedReason_no_account: {\r\n id: 'notifications.PaymentFailedReason_no_account',\r\n defaultMessage: 'Your payment method is invalid. Please check that you’ve entered your account number correctly before trying again.',\r\n },\r\n PaymentFailedReasonLocate_no_account: {\r\n id: 'notifications.PaymentFailedReasonLocate_no_account',\r\n defaultMessage:\r\n 'We couldn’t locate your banking details. Please check that you’ve entered your account number correctly before trying again. ',\r\n },\r\n ClarityLinkExpiredTitle: {\r\n id: 'notifications.ClarityLinkExpiredTitle',\r\n defaultMessage: 'Clarity project {projectId} linking failed',\r\n },\r\n ClarityLinkExpiredContent: {\r\n id: 'notifications.ClarityLinkExpiredContent',\r\n defaultMessage:\r\n 'The request to link your site {propertyName} with Clarity project ID {projectId} failed as the request was not approved by Clarity admin. Please re-trigger the request to ensure your ad serving does not get impacted.',\r\n },\r\n ClarityLinkDeclinedTitle: {\r\n id: 'notifications.ClarityLinkDeclinedTitle',\r\n defaultMessage: 'Clarity project {projectId} linking failed',\r\n },\r\n ClarityLinkDeclinedContent: {\r\n id: 'notifications.ClarityLinkDeclinedContent',\r\n defaultMessage:\r\n 'The request to link your site {propertyName} with Clarity project ID {projectId} failed as the request was rejected by Clarity admin. Please re-trigger the request to ensure your ad serving does not get impacted.',\r\n },\r\n ClarityLinkExpiredPrimaryActionLabel: {\r\n id: 'notifications.ClarityLinkExpiredPrimaryActionLabel',\r\n defaultMessage: 'Resend link request',\r\n },\r\n ClarityLinkDeclinedPrimaryActionLabel: {\r\n id: 'notifications.ClarityLinkDeclinedPrimaryActionLabel',\r\n defaultMessage: 'Resend link request',\r\n },\r\n ClarityLinkExpiredSecondaryActionLabel: {\r\n id: 'notifications.ClarityLinkExpiredSecondaryActionLabel',\r\n defaultMessage: 'Edit Project Id',\r\n },\r\n ClarityLinkDeclinedSecondaryActionLabel: {\r\n id: 'notifications.ClarityLinkDeclinedSecondaryActionLabel',\r\n defaultMessage: 'Edit Project Id',\r\n },\r\n ChooseGamNetworkFailureContent: {\r\n id: 'gamNetworkSelection.notification.post.failed',\r\n defaultMessage: 'Failed to update google network selection. Please refresh the page and try again later.',\r\n },\r\n ChooseGamNetworkFailureTitle: {\r\n id: 'gamNetworkSelection.notification.post.failed.title',\r\n defaultMessage: 'Update google network selection',\r\n },\r\n ChangingItemStatusFailureTitle: {\r\n id: 'grid.changingItemStatusFailureTitle',\r\n defaultMessage: 'Status change error',\r\n },\r\n ChangingItemStatusFailureContent: {\r\n id: 'grid.changingItemStatusFailureContent',\r\n defaultMessage: 'Something went wrong while changing the status. Please try again later.',\r\n },\r\n DeletingItemFailureTitle: {\r\n id: 'grid.deletingItemFailureTitle',\r\n defaultMessage: 'Delete failed',\r\n },\r\n DeletingItemFailureContent: {\r\n id: 'grid.deletingItemFailureContent',\r\n defaultMessage: 'Something went wrong while deleting the item. Please try again later.',\r\n },\r\n DuplicateGridItemFailureTitle: {\r\n id: 'grid.duplicatingGridItemFailureTitle',\r\n defaultMessage: 'Duplicating grid item failed',\r\n },\r\n DuplicateGridItemFailureContent: {\r\n id: 'grid.duplicatingGridItemFailureContent',\r\n defaultMessage: 'Something went wrong while duplicating the grid item. Please try again later',\r\n },\r\n GridDataDownloadFailureTitle: {\r\n id: 'grid.dataDownloadFailureTitle',\r\n defaultMessage: 'No data found',\r\n },\r\n GridDataDownloadFailureContent: {\r\n id: 'grid.dataDownloadFailureContent',\r\n defaultMessage: 'No data available to download',\r\n },\r\n FeedbackErrorMessageContent: {\r\n id: 'feedbackErrorMessage.content',\r\n defaultMessage: 'Something went wrong while submitting your feedback. Please try again later.',\r\n },\r\n FeedbackErrorMessageTitle: {\r\n id: 'feedbackErrorMessage.title',\r\n defaultMessage: 'Feedback submit failed',\r\n },\r\n FeedBackInvalidFormMessageContent: {\r\n id: 'feedBackInvalidFormMessage.content',\r\n defaultMessage: 'Feedback form is invalid. Please check the form details and try again.',\r\n },\r\n FeedBackInvalidFormMessageTitle: {\r\n id: 'feedBackInvalidFormMessage.title',\r\n defaultMessage: 'Feedback submit failed',\r\n },\r\n PropertyEditFailedNotificationContent: {\r\n id: 'siteManagement.propertyEditFailedNotificationContent',\r\n defaultMessage: 'Something went wrong while updating the item. Please try again later.',\r\n },\r\n PropertyEditFailedNotificationTitle: {\r\n id: 'siteManagement.propertyEditFailedNotificationTitle',\r\n defaultMessage: 'Failed to submit site details',\r\n },\r\n LoadingSitesFailedTitle: {\r\n id: 'adunit.loadingSitesFailedTitle',\r\n defaultMessage: 'No site found',\r\n },\r\n LoadingSitesFailedContent: {\r\n id: 'adunit.loadingSitesFailedContent',\r\n defaultMessage: 'Something went wrong while loading your sites. Please try again later',\r\n },\r\n DuplicatedSiteCreationErrorNotificationTitle: {\r\n id: 'tython.adunit.create.duplicated.site.error.notification.title',\r\n defaultMessage: 'Duplicated site creation',\r\n },\r\n DuplicatedSiteCreationErrorNotificationContent: {\r\n id: 'tython.adunit.create.duplicated.site.error.notification.content',\r\n defaultMessage: 'Your new site ({name}: {url}) has duplicated name or url against an existing site',\r\n },\r\n AdblockUpdateFailedTitle: {\r\n id: 'adBlock.adblockUpdateFailedTitle',\r\n defaultMessage: 'Ad block update failed',\r\n },\r\n AdblockUpdateFailedContent: {\r\n id: 'adBlock.adblockUpdateFailedContent',\r\n defaultMessage: `Something went wrong while updating Ad blocks for site {siteId}. Please try again later`,\r\n },\r\n AdblockToggleFailedContent: {\r\n id: 'adBlock.adblockToggleFailedContent',\r\n defaultMessage: `Something went wrong while toggling block settings for site {siteId}. Please try again later`,\r\n },\r\n AdblockToggleFailedTitle: {\r\n id: 'adBlock.adblockToggleFailedTitle',\r\n defaultMessage: `Ad block update failed`,\r\n },\r\n ToggleUniversalBlockFailedContent: {\r\n id: 'adBlock.toggleUniversalBlockFailedContent',\r\n defaultMessage: `We encountered an issue while toggling universal blocks. Please try again later.`,\r\n },\r\n ToggleUniversalBlockFailedTitle: {\r\n id: 'adBlock.toggleUniversalBlockFailedTitle',\r\n defaultMessage: `Ad block update failed`,\r\n },\r\n UniversalAdblockUpdateFailedContent: {\r\n id: 'adBlock.universalAdblockUpdateFailedContent',\r\n defaultMessage: `We encountered an issue while updating universal blocks. Please try again later.`,\r\n },\r\n UniversalAdblockUpdateFailedTitle: {\r\n id: 'adBlock.universalAdblockUpdateFailedTitle',\r\n defaultMessage: `Ad block update failed`,\r\n },\r\n PayoutInformationFailedContent: {\r\n id: 'paymentPage.payoutInformationFailedContent',\r\n defaultMessage: 'Something went wrong while loading your payout information. Please try again later',\r\n },\r\n PayoutInformationFailedTitle: {\r\n id: 'paymentPage.payoutInformationFailedTitle',\r\n defaultMessage: 'No data found',\r\n },\r\n LoadingBalanceDataFailedContent: {\r\n id: 'paymentPage.loadingBalanceDataFailedContent',\r\n defaultMessage: 'Something went wrong while loading your balance data. Please try again later',\r\n },\r\n LoadingBalanceDataFailedTitle: {\r\n id: 'paymentPage.loadingBalanceDataFailedTitle',\r\n defaultMessage: 'No data found',\r\n },\r\n LoadPayoutInfoFailedContent: {\r\n id: 'loadPayoutInfo.failedContent',\r\n defaultMessage: 'Something went wrong while loading your payout information. Please try again later',\r\n },\r\n LoadPayoutInfoFailedTitle: {\r\n id: 'loadPayoutInfo.failedTitle',\r\n defaultMessage: 'No data found',\r\n },\r\n DeletingUserWentWrongContent: {\r\n id: 'userManagement.deletingUserWentWrongContent',\r\n defaultMessage: 'Something went wrong while deleting user.',\r\n },\r\n DeletingUserWentWrongTitle: {\r\n id: 'userManagement.deletingUserWentWrongTitle',\r\n defaultMessage: 'Failed to delete user',\r\n },\r\n\r\n PaymentFailedAccountClosedTitle: {\r\n id: 'notifications.PaymentFailedAccountClosedTitle',\r\n defaultMessage: 'Payment Failed',\r\n },\r\n PaymentFailedAccountClosedContent: {\r\n id: 'notifications.PaymentFailedAccountClosedContent',\r\n defaultMessage: 'Your payout failed because your bank account is closed. Please contact your banking institution for questions.',\r\n },\r\n PaymentFailedBankAccountRestrictedTitle: {\r\n id: 'notifications.PaymentFailedBankAccountRestrictedTitle',\r\n defaultMessage: 'Restricted payment method',\r\n },\r\n PaymentFailedBankAccountRestrictedContent: {\r\n id: 'notifications.PaymentFailedBankAccountRestrictedContent',\r\n defaultMessage:\r\n 'Your bank may have restrictions on the type and number of transfers allowed. This can indicate that your account is a savings or non-checking account.',\r\n },\r\n PaymentFailedStripeCouldNotProcessTitle: {\r\n id: 'notifications.PaymentFailedStripeCouldNotProcessTitle',\r\n defaultMessage: 'Payment Failed',\r\n },\r\n PaymentFailedStripeCouldNotProcessContent: {\r\n id: 'notifications.PaymentFailedStripeCouldNotProcessContent',\r\n defaultMessage: 'Stripe is unable to process your payment.',\r\n },\r\n PaymentFailedCouldNotProcessTitle: {\r\n id: 'notifications.PaymentFailedCouldNotProcessTitle',\r\n defaultMessage: 'Payment Failed',\r\n },\r\n PaymentFailedCouldNotProcessContent: {\r\n id: 'notifications.PaymentFailedCouldNotProcessContent',\r\n defaultMessage: 'Your bank could not process this transfer.',\r\n },\r\n PaymentFailedDeclinedTitle: {\r\n id: 'notifications.PaymentFailedDeclinedTitle',\r\n defaultMessage: 'Payment declined',\r\n },\r\n PaymentFailedDeclinedContent: {\r\n id: 'notifications.PaymentFailedDeclinedContent',\r\n defaultMessage: 'Your bank has declined the transfer of your payment. Please contact your banking institution for clarification.',\r\n },\r\n PaymentFailedExpiredCardTitle: {\r\n id: 'notifications.PaymentFailedExpiredCardTitle',\r\n defaultMessage: 'Expired credit card',\r\n },\r\n PaymentFailedExpiredCardContent: {\r\n id: 'notifications.PaymentFailedExpiredCardContent',\r\n defaultMessage: 'Your card has expired. Please contact your card issuer to fix any issues or consider changing your payment method.',\r\n },\r\n PaymentFailedIncorrectAccountHolderNameTitle: {\r\n id: 'notifications.PaymentFailedIncorrectAccountHolderNameTitle',\r\n defaultMessage: 'Invalid account holder name',\r\n },\r\n PaymentFailedIncorrectAccountHolderNameContent: {\r\n id: 'notifications.PaymentFailedIncorrectAccountHolderNameContent',\r\n defaultMessage:\r\n \"Your account details may have been entered incorrectly. Please check that you've entered the account holder's name correctly before trying again.\",\r\n },\r\n PaymentFailedInvalidAccountNumberTitle: {\r\n id: 'notifications.PaymentFailedInvalidAccountNumberTitle',\r\n defaultMessage: 'Invalid payment method',\r\n },\r\n PaymentFailedInvalidAccountNumberContent: {\r\n id: 'notifications.PaymentFailedInvalidAccountNumberContent',\r\n defaultMessage:\r\n \"Your payment details may be invalid. Please check that you've entered your account number correctly before trying again.\",\r\n },\r\n PaymentFailedInvalidCardTitle: {\r\n id: 'notifications.PaymentFailedInvalidCardTitle',\r\n defaultMessage: 'Invalid payment method',\r\n },\r\n PaymentFailedInvalidCardContent: {\r\n id: 'notifications.PaymentFailedInvalidCardContent',\r\n defaultMessage: 'Your payment method is invalid. Please contact your card issuer and resolve the issue before trying again.',\r\n },\r\n PaymentFailedInvalidCurrencyTitle: {\r\n id: 'notifications.PaymentFailedInvalidCurrencyTitle',\r\n defaultMessage: 'Unavailable currency',\r\n },\r\n PaymentFailedInvalidCurrencyContent: {\r\n id: 'notifications.PaymentFailedInvalidCurrencyContent',\r\n defaultMessage:\r\n 'Your banking institution was unable to process your payment in your desired currency. Check with your banking institution to make sure that they allow international transactions.',\r\n },\r\n PaymentFailedLostOrStolenCardTitle: {\r\n id: 'notifications.PaymentFailedLostOrStolenCardTitle',\r\n defaultMessage: 'Lost or stolen card',\r\n },\r\n PaymentFailedLostOrStolenCardContent: {\r\n id: 'notifications.PaymentFailedLostOrStolenCardContent',\r\n defaultMessage:\r\n 'Your card has been reported lost or stolen. Please contact the card issuer to fix any issues with your card. Then update your card or switch to a different payment method.',\r\n },\r\n PaymentFailedNoAccountTitle: {\r\n id: 'notifications.PaymentFailedNoAccountTitle',\r\n defaultMessage: 'Invalid account',\r\n },\r\n PaymentFailedNoAccountContent: {\r\n id: 'notifications.PaymentFailedNoAccountContent',\r\n defaultMessage: \"Your payment method is invalid. Please check that you've entered your account number correctly before trying again.\",\r\n },\r\n PaymentFailedNoAccountLocatedTitle: {\r\n id: 'notifications.PaymentFailedNoAccountLocatedTitle',\r\n defaultMessage: 'Invalid account',\r\n },\r\n PaymentFailedNoAccountLocatedContent: {\r\n id: 'notifications.PaymentFailedNoAccountLocatedContent',\r\n defaultMessage:\r\n \"We couldn't locate your banking details. Please check that you've entered your account number correctly before trying again.\",\r\n },\r\n CreateTythonAdUnitFailedTitle: {\r\n id: 'notifications.createTythonAdunitFailedTitle',\r\n defaultMessage: 'Create ad unit failed',\r\n },\r\n ProfileInformationUpdatedTitle: {\r\n id: 'notifications.profileInformationUpdated',\r\n defaultMessage: `You've updated your profile.`,\r\n },\r\n ProfileInformationUpdatedContent: {\r\n id: 'notifications.profileInformationUpdatedContent',\r\n defaultMessage: `Your profile information has been updated`,\r\n },\r\n});\r\n","import { InjectedIntl } from 'react-intl';\r\nimport { action } from 'satcheljs';\r\nimport { IProfileActive, SelfServePublisherActiveModel } from '../store/schema';\r\n\r\nexport const onInitializeProfilePage = action('onInitializeProfilePage', (publisherId: string, countryCode: string) => ({\r\n publisherId,\r\n countryCode,\r\n}));\r\n\r\nexport const fetchPublisherProfileDetailsAction = action('fetchPublisherProfileDetailsAction', (publisherId: string) => ({ publisherId }));\r\n\r\nexport const publisherProfileUpdatedAction = action('publisherProfileUpdatedAction');\r\n\r\nexport const updatePublisherProfileAction = action('updatePublisherProfileAction', (profile: SelfServePublisherActiveModel) => ({\r\n profile,\r\n}));\r\n\r\nexport const fetchUserDetailsAction = action('fetchUserDetailsAction', (userId: number) => ({ userId }));\r\n\r\nexport const editProfileAction = action('editProfileAction');\r\n\r\nexport const validateAndPreviewProfileChangesAction = action(\r\n 'validateAndPreviewProfileChangesAction',\r\n (profile: SelfServePublisherActiveModel, formatMessage: InjectedIntl['formatMessage'], isVerificationRequired: boolean) => ({\r\n profile,\r\n formatMessage,\r\n isVerificationRequired,\r\n })\r\n);\r\n\r\nexport const generateVerificationCode = action('generateVerificationCode', (profile: IProfileActive) => ({ profile }));\r\n\r\nexport const verifyGeneratedCode = action(\r\n 'verifyGeneratedCode',\r\n (profile: IProfileActive, formatMessage: InjectedIntl['formatMessage']) => ({ profile, formatMessage })\r\n);\r\n\r\nexport const validateAddress = action(\r\n 'validateAddress',\r\n (profile: SelfServePublisherActiveModel, formatMessage: InjectedIntl['formatMessage']) => ({ profile, formatMessage })\r\n);\r\n\r\nexport const validateOrgAddress = action(\r\n 'validateOrgAddress',\r\n (profile: SelfServePublisherActiveModel, formatMessage: InjectedIntl['formatMessage']) => ({ profile, formatMessage })\r\n);\r\n","import { action } from 'satcheljs';\r\n\r\nexport const submitEvidenceDocument = action('submitEvidenceDocument', (setDocumentUploadStatus, documentContent: FormData) => ({\r\n setDocumentUploadStatus,\r\n documentContent,\r\n}));\r\n\r\nexport const fetchAppealHistory = action('fetchAppealHistory');\r\n","import { createStore } from 'satcheljs';\r\nimport { CustomPanelType, Model, PopupType } from '../../../../@data';\r\nimport { PAGINATION_PAGE_SIZES } from '../../../../constants/AppConstants';\r\nimport { IGridQuery } from '../../GridV2.types';\r\n\r\nexport interface IPagination {\r\n currentPageSize: number;\r\n currentPageNumber: number;\r\n numberOfPages: number;\r\n}\r\n\r\nexport interface IGridV2ViewState<T extends Model> {\r\n loading: boolean;\r\n query?: IGridQuery<T>;\r\n entity?: new () => T;\r\n filterMenuCalloutOpen?: boolean;\r\n dialogType: PopupType;\r\n panelType: CustomPanelType;\r\n selectedItems: Model[];\r\n searchWord: string;\r\n isSearchCalloutVisible: boolean;\r\n data: Model[];\r\n paginator: IPagination;\r\n}\r\n\r\nexport const getStore = createStore<IGridV2ViewState<Model>>('GridV2ViewState', {\r\n loading: false,\r\n dialogType: PopupType.None,\r\n panelType: CustomPanelType.None,\r\n filterMenuCalloutOpen: false,\r\n selectedItems: [],\r\n isSearchCalloutVisible: false,\r\n searchWord: '',\r\n data: [],\r\n paginator: {\r\n currentPageSize: PAGINATION_PAGE_SIZES[0],\r\n currentPageNumber: 1,\r\n numberOfPages: 1,\r\n },\r\n});\r\n","import { createStore } from 'satcheljs';\r\nimport { EntityType } from '../../../../../../@data';\r\nimport { DEFAULT_CURRENCY_CODE, LOCAL_STORAGE_LOCALE } from '../../../../../../constants/AppConstants';\r\nimport { ISettingsViewState } from './schema/ISettingsViewState';\r\n\r\nexport const getStore = createStore<ISettingsViewState>('ISettingsViewState', {\r\n active: {\r\n entityType: EntityType.Publisher,\r\n notificationPreferences: {\r\n billingAlerts: true,\r\n servingStatus: true,\r\n profileReview: true,\r\n invitedUsers: true,\r\n },\r\n systemPreferences: {\r\n locale: localStorage.getItem(LOCAL_STORAGE_LOCALE) || undefined,\r\n currency: DEFAULT_CURRENCY_CODE,\r\n },\r\n },\r\n});\r\n","import { LifeCycleStatus } from '../enums';\r\n\r\nexport abstract class Model {\r\n // Keeping id type to 'any' to accommodate guid (string) and integer id values\r\n // tslint:disable-next-line: no-any\r\n constructor(public id?: any, public name?: Object, public status?: LifeCycleStatus, public eTag?: string) {}\r\n public abstract get className(): string;\r\n public abstract get apiPath(): string | undefined;\r\n}\r\n","import { FluentTheme, IFontStyles, initializeIcons, IPalette, ISpacing, ITheme, loadTheme, registerIcons } from '@fluentui/react';\r\n\r\nexport interface IPubcenterPalette extends Partial<IPalette> {\r\n messageBarError: string;\r\n severeError: string;\r\n error: string;\r\n warning: string;\r\n success: string;\r\n headerGlobal: string;\r\n antiqueBronze: string;\r\n seaGreen: string;\r\n lowContrastBlue: string;\r\n disabledGray: string;\r\n eerieBlack: string;\r\n highContrastPrimary: string;\r\n highContrastLink: string;\r\n raisinBlack: string;\r\n grayX11: string;\r\n gray: string;\r\n neutralTertiaryWhiteContrast: string;\r\n neutralSecondaryAltWhiteContrast: string;\r\n taupeGray: string;\r\n darkSilver: string;\r\n frenchBlue: string;\r\n azureishWhite: string;\r\n paleChestnut: string;\r\n lavenderBlush: string;\r\n venetianRed: string;\r\n honeydew: string;\r\n grannySmithApple: string;\r\n deepGreen: string;\r\n neutralForeground1Rest: string;\r\n neutralForeground2Rest: string;\r\n neutralForeground3Rest: string;\r\n brandForeground1Rest: string;\r\n statusSuccessForeground1Rest: string;\r\n neutralBackground1Selected: string;\r\n neutralBackground4Rest: string;\r\n statusSuccessBackground1Rest: string;\r\n neutralStroke2Rest: string;\r\n statusSuccessStroke1Rest: string;\r\n ['NeutralBackground4.Rest']: string;\r\n ['NeutralForeground3.Rest']: string;\r\n ['NeutralForeground2.Rest']: string;\r\n ['NeutralForeground1.Rest']: string;\r\n ['CompoundBrandForeground1.Rest']: string;\r\n ['CompoundBrandForeground1.Hover']: string;\r\n ['NeutralBackground3.Rest']: string;\r\n ['NeutralBackground5.Rest']: string;\r\n ['NeutralStroke1.Rest']: string;\r\n ['BrandBackground.Rest']: string;\r\n ['BrandBackground2.Rest']: string;\r\n ['BrandStroke2.Rest']: string;\r\n ['BrandForeground2.Rest']: string;\r\n ['DangerForeground1.Rest']: string;\r\n ['DangerBorder1.Rest']: string;\r\n ['DangerBackground1.Rest']: string;\r\n ['Transparentbackground.Rest']: string;\r\n ['WarningBorder1.Rest']: string;\r\n ['WarningBackground1.Rest']: string;\r\n}\r\n\r\nexport interface IPubcenterBoxShadow {\r\n soft: string;\r\n aesthetic: string;\r\n creative: string;\r\n raised: string;\r\n}\r\n\r\nexport interface IPubcenterSpacing extends Partial<ISpacing> {\r\n size0: string;\r\n size1: string;\r\n size2: string;\r\n size3: string;\r\n size4: string;\r\n size5: string;\r\n size6: string;\r\n size7: string;\r\n size8: string;\r\n size10: string;\r\n size12: string;\r\n size14: string;\r\n size15: string;\r\n size16: string;\r\n size18: string;\r\n size20: string;\r\n size22: string;\r\n size24: string;\r\n size28: string;\r\n size32: string;\r\n size30: string;\r\n size36: string;\r\n size40: string;\r\n size44: string;\r\n size46: string;\r\n size48: string;\r\n size50: string;\r\n size52: string;\r\n size54: string;\r\n size56: string;\r\n size60: string;\r\n size64: string;\r\n size72: string;\r\n size80: string;\r\n size92: string;\r\n size96: string;\r\n size100: string;\r\n size120: string;\r\n size126: string;\r\n size128: string;\r\n size142: string;\r\n size146: string;\r\n size150: string;\r\n size159: string;\r\n size160: string;\r\n size180: string;\r\n size192: string;\r\n size200: string;\r\n size220: string;\r\n size250: string;\r\n size256: string;\r\n size260: string;\r\n size300: string;\r\n size320: string;\r\n size350: string;\r\n size360: string;\r\n size480: string;\r\n size500: string;\r\n size600: string;\r\n size896: string;\r\n size960: string;\r\n}\r\n\r\ninterface IPubCenterFont {\r\n fontSize: string;\r\n lineHeight: string;\r\n fontWeight?: string;\r\n}\r\nexport interface IPubCenterFonts extends Partial<IFontStyles> {\r\n size10: IPubCenterFont;\r\n size12: IPubCenterFont;\r\n size14: IPubCenterFont;\r\n size14Medium: IPubCenterFont;\r\n size16: IPubCenterFont;\r\n size18: IPubCenterFont;\r\n size20: IPubCenterFont;\r\n size24: IPubCenterFont;\r\n size28: IPubCenterFont;\r\n size32: IPubCenterFont;\r\n size42: IPubCenterFont;\r\n}\r\n\r\nexport interface IPubcenterTheme {\r\n palette: IPubcenterPalette;\r\n spacing: IPubcenterSpacing;\r\n fonts: IPubCenterFonts;\r\n boxShadow: IPubcenterBoxShadow;\r\n}\r\n\r\nconst spacing: IPubcenterSpacing = {\r\n size0: '0rem',\r\n size1: '0.0625rem',\r\n size2: '0.125rem',\r\n size3: '0.1875rem',\r\n size4: '0.25rem',\r\n size5: '0.3125rem',\r\n size6: '0.375rem',\r\n size7: '0.4375rem',\r\n size8: '0.50rem',\r\n size10: '0.625rem',\r\n size12: '0.75rem',\r\n size14: '0.875rem',\r\n size15: '0.938rem',\r\n size16: '1.0rem',\r\n size18: '1.125rem',\r\n size20: '1.25rem',\r\n size22: '1.375 rem',\r\n size24: '1.5rem',\r\n size28: '1.75rem',\r\n size30: '1.875rem',\r\n size32: '2.0rem',\r\n size36: '2.25rem',\r\n size40: '2.50rem',\r\n size44: '2.75rem',\r\n size46: '2.875rem',\r\n size48: '3.0rem',\r\n size50: '3.125rem',\r\n size52: '3.25rem',\r\n size54: '3.375rem',\r\n size56: '3.5rem',\r\n size60: '3.75rem',\r\n size64: '4.0rem',\r\n size72: '4.5rem',\r\n size80: '5.0rem',\r\n size92: '5.75rem',\r\n size96: '6.0rem',\r\n size100: '6.25rem',\r\n size120: '7.5rem',\r\n size126: '7.875rem',\r\n size128: '8.0rem',\r\n size142: '8.875rem',\r\n size146: '9.125rem',\r\n size150: '9.375rem',\r\n size159: '9.9375rem',\r\n size160: '10rem',\r\n size180: '11.25rem',\r\n size192: '12rem',\r\n size200: '12.5rem',\r\n size220: '13.75rem',\r\n size250: '15.625rem',\r\n size256: '16.0rem',\r\n size260: '16.25rem',\r\n size300: '18.75rem',\r\n size320: '20.0rem',\r\n size350: '21.875rem',\r\n size360: '22.5rem',\r\n size480: '30.0rem',\r\n size500: '31.25rem',\r\n size600: '37.5rem',\r\n size896: '56.0rem',\r\n size960: '60.0rem',\r\n};\r\n\r\nconst palette: IPubcenterPalette = {\r\n headerGlobal: '#2f2f2f',\r\n themeLighterAlt: '#EFF6FC',\r\n themeLighter: '#DEECF9',\r\n themeLight: '#C7E0F4',\r\n themePrimary: '#0078D4',\r\n themeTertiary: '#71afe5',\r\n themeSecondary: '#2b88d8',\r\n themeDarkAlt: '#106EBE',\r\n themeDark: '#005A9E',\r\n themeDarker: '#004578',\r\n neutralLighterAlt: '#FAF9F8',\r\n neutralLighter: '#F3F2F1',\r\n neutralLight: '#EDEBE9',\r\n neutralQuaternaryAlt: '#E1DFDD',\r\n neutralQuaternary: '#D2D0CE',\r\n neutralTertiaryAlt: '#C8C6C4',\r\n neutralTertiary: '#A19F9D',\r\n neutralSecondary: '#605E5C',\r\n neutralPrimaryAlt: '#3B3A39',\r\n neutralPrimary: '#323130',\r\n neutralDark: '#201F1E',\r\n black: '#000000',\r\n white: '#fff',\r\n redDark: '#a80000',\r\n blue: '#0078D7',\r\n blueDark: '#004578',\r\n messageBarError: '#FDE7E9',\r\n severeError: '#FED9CC',\r\n warning: '#fff4ce',\r\n success: '#DFF6DD',\r\n error: '#d83b01',\r\n antiqueBronze: '#7A6816',\r\n seaGreen: '#218D51',\r\n lowContrastBlue: '#0072cc',\r\n disabledGray: '#727272',\r\n eerieBlack: '#1A1A1A',\r\n highContrastPrimary: '#0072c9',\r\n highContrastLink: '#085088',\r\n raisinBlack: '#242424',\r\n grayX11: '#bbbbbb',\r\n gray: '#808080',\r\n neutralTertiaryWhiteContrast: '#737271',\r\n neutralSecondaryAltWhiteContrast: '#83817f',\r\n taupeGray: '#8A8886',\r\n darkSilver: '#6E6E6E',\r\n frenchBlue: '#036AC4',\r\n azureishWhite: '#e2e8f0',\r\n paleChestnut: '#EEACB2',\r\n lavenderBlush: '#FDF3F4',\r\n venetianRed: '#CC1512',\r\n honeydew: '#F1FAF1',\r\n grannySmithApple: '#9FD89F',\r\n deepGreen: '#0E700E',\r\n neutralForeground1Rest: '#242424',\r\n neutralForeground2Rest: '#424242',\r\n neutralForeground3Rest: '#616161',\r\n neutralBackground1Selected: '#EBEBEB',\r\n neutralBackground4Rest: '#F0F0F0',\r\n neutralStroke2Rest: '#E0E0E0',\r\n brandForeground1Rest: '#0F6CBD',\r\n statusSuccessBackground1Rest: '#F1FAF1',\r\n statusSuccessForeground1Rest: '#0E700E',\r\n statusSuccessStroke1Rest: '#9FD89F',\r\n 'NeutralForeground2.Rest': '#424242',\r\n 'NeutralForeground1.Rest': '#242424',\r\n 'NeutralBackground4.Rest': '#F0F0F0',\r\n 'CompoundBrandForeground1.Rest': '#0F6CBD',\r\n 'CompoundBrandForeground1.Hover': '#115EA3',\r\n 'NeutralBackground3.Rest': '#F5F5F5',\r\n 'NeutralBackground5.Rest': '#EBEBEB',\r\n 'NeutralStroke1.Rest': '#D1D1D1',\r\n 'BrandBackground.Rest': '#0F6CBD',\r\n 'BrandBackground2.Rest': '#EBF3FC',\r\n 'BrandForeground2.Rest': '#115EA3',\r\n 'BrandStroke2.Rest': '#B4D6FA',\r\n 'NeutralForeground3.Rest': '#616161',\r\n 'DangerForeground1.Rest': '#B10E1C',\r\n 'DangerBorder1.Rest': '#EEACB2',\r\n 'DangerBackground1.Rest': '#FDF3F4',\r\n 'Transparentbackground.Rest': 'transparent',\r\n 'WarningBorder1.Rest': '#FDCFB4',\r\n 'WarningBackground1.Rest': '#FFF9F5',\r\n};\r\n\r\nconst boxShadow = {\r\n soft: `0 2px 4px 0 rgba(0, 0, 0, .13), 0 1px 1px 0 rgba(0, 0, 0, .11)`,\r\n aesthetic: `0 3px 7px 0 rgba(0, 0, 0, .13), 0 1px 2px 0 rgba(0, 0, 0, .11)`,\r\n creative: `0 7px 15px 0 rgba(0, 0, 0, .13), 0 1px 4px 0 rgba(0, 0, 0, .11)`,\r\n raised: `0 26px 58px 0 rgba(0, 0, 0, .22), 0 5px 14px 0 rgba(0, 0, 0, .18)`,\r\n};\r\n\r\ninitializeIcons();\r\n\r\n// TODO: Remove this after we migrate icons to Fluent icons.\r\nregisterIcons({\r\n fontFace: {\r\n fontFamily: `\"Microsoft Advertising MDL2 Assets\"`,\r\n },\r\n icons: {\r\n AdUnit: '\\uF7F2',\r\n AdUnitChannel: '\\uF7F5',\r\n AdUnitBlock: '\\uF7F3',\r\n Notifications: '\\uEA8F',\r\n ShowAll: '\\uE890',\r\n },\r\n});\r\n\r\n/**\r\n * We should have a consistent typography across the pages. Generally, all font sizes comes with recommended\r\n * line-height values. Here, we have added the standard line-height values for each font size by referring\r\n * https://developer.microsoft.com/en-us/fluentui#/styles/web/typography#sizes guidelines.\r\n *\r\n * In some cases, font-weights also go hand-in-hand with font-sizes. But in the design language we use in\r\n * figma has different font-weights for the same font-size. Hence they are not part of these fonts.\r\n */\r\nconst fonts: IPubCenterFonts = {\r\n size10: { fontSize: '10px', lineHeight: '14px' },\r\n size12: { fontSize: '12px', lineHeight: '16px' },\r\n size14: { fontSize: '14px', lineHeight: '20px' },\r\n size14Medium: { fontSize: '14px', lineHeight: '22px', fontWeight: '600' },\r\n size16: { fontSize: '16px', lineHeight: '22px' },\r\n size18: { fontSize: '18px', lineHeight: '24px' },\r\n size20: { fontSize: '20px', lineHeight: '28px' },\r\n size24: { fontSize: '24px', lineHeight: '32px' },\r\n size28: { fontSize: '28px', lineHeight: '36px' },\r\n size32: { fontSize: '32px', lineHeight: '40px' },\r\n size42: { fontSize: '42px', lineHeight: '42px' },\r\n};\r\n\r\nexport const PubcenterTheme = {\r\n palette,\r\n spacing,\r\n fonts,\r\n boxShadow,\r\n};\r\nFluentTheme.palette = { ...FluentTheme.palette, ...PubcenterTheme.palette };\r\nFluentTheme.spacing = { ...FluentTheme.spacing, ...PubcenterTheme.spacing };\r\nFluentTheme.fonts = { ...FluentTheme.fonts, ...PubcenterTheme.fonts };\r\n(FluentTheme as ITheme & { boxShadow: IPubcenterBoxShadow }).boxShadow = { ...PubcenterTheme.boxShadow };\r\n\r\n// It's recommended to not use loadTheme, instead use ThemeProvider\r\n// Refer: https://github.com/microsoft/fluentui/blob/master/packages/react/src/utilities/ThemeProvider/README.md#loadtheme\r\n// TODO: Remove usage of loadTheme\r\nloadTheme(FluentTheme);\r\n\r\nexport const PubcenterCustomizations = FluentTheme;\r\n\r\nexport enum BreakPoints {\r\n ResponsiveExtraSmall = '@media(max-width: 320px)',\r\n ResponsiveSmall = '@media(max-width: 640px)',\r\n ResponsiveNonSmall = '@media(min-width: 641px)',\r\n ResponsiveMedium = '@media screen and (min-width: 641px) and (max-width: 1024px)',\r\n ResponsiveLarge = '@media(min-width: 1025px) and (max-width: 1600px)',\r\n ResponsiveExtraLarge = '@media(min-width: 1601px)',\r\n}\r\n\r\nexport enum AccessibilityContrast {\r\n Activated = '@media screen and (-ms-high-contrast: active), screen and (forced-colors: active)',\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n acceptInvite: {\r\n id: 'userpage.acceptInvite',\r\n defaultMessage: 'Accept invite',\r\n },\r\n createUser: {\r\n id: 'userpage.createUser',\r\n defaultMessage: 'Create user',\r\n },\r\n firstName: {\r\n id: 'userpage.firstName',\r\n defaultMessage: 'First name',\r\n },\r\n lastName: {\r\n id: 'userpage.lastName',\r\n defaultMessage: 'Last name',\r\n },\r\n emailAddress: {\r\n id: 'userpage.emailAddress',\r\n defaultMessage: 'E-mail address',\r\n },\r\n preferredLanguage: {\r\n id: 'userpage.preferredLanguage',\r\n defaultMessage: 'Preferred language',\r\n },\r\n accountRole: {\r\n id: 'userpage.accountRole',\r\n defaultMessage: 'Account role',\r\n },\r\n accountManager: {\r\n id: 'userpage.accountManager',\r\n defaultMessage: 'Account manager',\r\n },\r\n accountManagerDescription: {\r\n id: 'userpage.accountManagerDescription',\r\n defaultMessage: 'Typical pubCenter user',\r\n },\r\n reportUser: {\r\n id: 'userpage.reportUser',\r\n defaultMessage: 'Report user',\r\n },\r\n reportUserDescription: {\r\n id: 'userpage.reportUserDescription',\r\n defaultMessage: 'View account information and reporting',\r\n },\r\n listManager: {\r\n id: 'userpage.listManager',\r\n defaultMessage: 'List manager',\r\n },\r\n listManagerDescription: {\r\n id: 'userpage.listManagerDescription',\r\n defaultMessage: 'Manage competitive exclusions',\r\n },\r\n adViewer: {\r\n id: 'userpage.adViewer',\r\n defaultMessage: 'Ad viewer',\r\n },\r\n adViewerDescription: {\r\n id: 'userpage.adViewerDescription',\r\n defaultMessage: 'Manage properties and competitive exclusions, and view ad units',\r\n },\r\n administrator: {\r\n id: 'userpage.administrator',\r\n defaultMessage: 'Administrator',\r\n },\r\n administratorDescription: {\r\n id: 'userpage.administratorDescription',\r\n defaultMessage: 'Manage all aspects of a pubCenter account',\r\n },\r\n superAdmin: {\r\n id: 'userpage.superAdmin',\r\n defaultMessage: 'Super administrator',\r\n },\r\n superAdminDescription: {\r\n id: 'userpage.superAdminDescription',\r\n defaultMessage: 'Full access and control of all accounts',\r\n },\r\n createPageTitle: {\r\n id: 'inviteUser.createPageTitle',\r\n defaultMessage: 'Invite user',\r\n },\r\n editPageTitle: {\r\n id: 'inviteUser.editPageTitle',\r\n defaultMessage: 'Edit user',\r\n },\r\n pageDescription: {\r\n id: 'inviteUser.pageDescription',\r\n defaultMessage:\r\n // tslint:disable-next-line:max-line-length\r\n 'An email invitation will be sent to the identified user. User will be asked to provide additional information to complete their profile.',\r\n },\r\n telephoneNumber: {\r\n id: 'partnermanagement.editUser.telephoneNumber',\r\n defaultMessage: 'Telephone number',\r\n },\r\n faxNumber: {\r\n id: 'partnermanagement.editUser.faxNumber',\r\n defaultMessage: 'Fax number',\r\n },\r\n userAccountInfo: {\r\n id: 'partnermanagement.editUser.userAccountInfo',\r\n defaultMessage: 'User account information',\r\n },\r\n userName: {\r\n id: 'partnermanagement.editUser.userName',\r\n defaultMessage: 'User name',\r\n },\r\n password: {\r\n id: 'partnermanagement.editUser.password',\r\n defaultMessage: 'Password',\r\n },\r\n confirmPassword: {\r\n id: 'partnermanagement.editUser.confirmPassword',\r\n defaultMessage: 'Confirm password',\r\n },\r\n secretQuestion: {\r\n id: 'partnermanagement.editUser.secretQuestion',\r\n defaultMessage: 'Secret question',\r\n },\r\n secretAnswer: {\r\n id: 'partnermanagement.editUser.secretAnswer',\r\n defaultMessage: 'Secret answer',\r\n },\r\n marketingContactSetting: {\r\n id: 'partnermanagement.editUser.marketingContactSetting',\r\n defaultMessage: 'Marketing contact settings',\r\n },\r\n email: {\r\n id: 'partnermanagement.editUser.email',\r\n defaultMessage: 'E-mail',\r\n },\r\n phone: {\r\n id: 'partnermanagement.editUser.phone',\r\n defaultMessage: 'Phone',\r\n },\r\n postalMail: {\r\n id: 'partnermanagement.editUser.postalMail',\r\n defaultMessage: 'Postal mail',\r\n },\r\n updateUser: {\r\n id: 'partnermanagement.editUser.updateUser',\r\n defaultMessage: 'Update user',\r\n },\r\n accountMultiSelectPickerAriaDesc: {\r\n id: 'partnermanagement.editUser.accountMultiSelectPickerAriaDesc',\r\n defaultMessage: 'Select Accounts',\r\n },\r\n useDifferentAccountMessage: {\r\n id: 'acceptInvite.useDifferentAccountMessage',\r\n defaultMessage: 'You are signing up with {email}. Need to go back and sign in with another Microsoft account?',\r\n },\r\n switchNow: {\r\n id: 'acceptInvite.switchNow',\r\n defaultMessage: 'Switch now',\r\n },\r\n resendingUserInvitation: {\r\n id: 'userManagement.resendingUserInvitation',\r\n defaultMessage: 'Resending user invitation to {email}...',\r\n },\r\n resendUserInvitationSuccess: {\r\n id: 'userManagement.resendUserInvitationSuccess',\r\n defaultMessage: 'Resend user invitation to {email} successfully',\r\n },\r\n deletedUserInvitationSuccess: {\r\n id: 'userManagement.deletedUserInvitationSuccess',\r\n defaultMessage: 'Deleted invitation for {firstName} successfully',\r\n },\r\n});\r\n","/* This is copied from https://gist.github.com/jamesbar2/1c677c22df8f21e869cca7e439fc3f5b */\r\n\r\nexport const COUNTRY_WISE_ZIP_CODES_REGEX = {\r\n AF: {\r\n name: 'Afghanistan',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n AX: {\r\n name: 'Ã…land Islands',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n AL: {\r\n name: 'Albania',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n DZ: {\r\n name: 'Algeria',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n AS: {\r\n name: 'American Samoa',\r\n format: 'NNNNN (optionally NNNNN-NNNN or NNNNN-NNNNNN)',\r\n regex: '^\\\\d{5}(-{1}\\\\d{4,6})$',\r\n },\r\n AD: {\r\n name: 'Andorra',\r\n format: 'CCNNN',\r\n regex: '^[Aa][Dd]\\\\d{3}$',\r\n },\r\n AO: {\r\n name: 'Angola',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n AI: {\r\n name: 'Anguilla',\r\n format: 'AI-2640',\r\n regex: '^[Aa][I][-][2][6][4][0]$',\r\n },\r\n AG: {\r\n name: 'Antigua and Barbuda',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n AR: {\r\n name: 'Argentina',\r\n format: '1974-1998 NNNN; From 1999 ANNNNAAA',\r\n regex: '^\\\\d{4}|[A-Za-z]\\\\d{4}[a-zA-Z]{3}$',\r\n },\r\n AM: {\r\n name: 'Armenia',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n AW: {\r\n name: 'Aruba',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n AC: {\r\n name: 'Ascension island',\r\n format: 'ASCN 1ZZ',\r\n regex: '^[Aa][Ss][Cc][Nn]\\\\s{0,1}[1][Zz][Zz]$',\r\n },\r\n AU: {\r\n name: 'Australia',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n AT: {\r\n name: 'Austria',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n AZ: {\r\n name: 'Azerbaijan',\r\n format: 'CCNNNN',\r\n regex: '^[Aa][Zz]\\\\d{4}$',\r\n },\r\n BS: {\r\n name: 'Bahamas',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n BH: {\r\n name: 'Bahrain',\r\n format: 'NNN or NNNN',\r\n regex: '^\\\\d{3,4}$',\r\n },\r\n BD: {\r\n name: 'Bangladesh',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n BB: {\r\n name: 'Barbados',\r\n format: 'CCNNNNN',\r\n regex: '^[Aa][Zz]\\\\d{5}$',\r\n },\r\n BY: {\r\n name: 'Belarus',\r\n format: 'NNNNNN',\r\n regex: '^\\\\d{6}$',\r\n },\r\n BE: {\r\n name: 'Belgium',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n BZ: {\r\n name: 'Belize',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n BJ: {\r\n name: 'Benin',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n BM: {\r\n name: 'Bermuda',\r\n format: 'AA NN or AA AA',\r\n regex: '^[A-Za-z]{2}\\\\s([A-Za-z]{2}|\\\\d{2})$',\r\n },\r\n BT: {\r\n name: 'Bhutan',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n BO: {\r\n name: 'Bolivia',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n BQ: {\r\n name: 'Bonaire, Sint Eustatius and Saba',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n BA: {\r\n name: 'Bosnia and Herzegovina',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n BW: {\r\n name: 'Botswana',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n BR: {\r\n name: 'Brazil',\r\n format: 'NNNNN-NNN (NNNNN from 1971 to 1992)',\r\n regex: '^\\\\d{5}-\\\\d{3}$',\r\n },\r\n '': {\r\n name: 'British Antarctic Territory',\r\n format: 'BIQQ 1ZZ',\r\n regex: '^[Bb][Ii][Qq]{2}\\\\s{0,1}[1][Zz]{2}$',\r\n },\r\n IO: {\r\n name: 'British Indian Ocean Territory',\r\n format: 'BBND 1ZZ',\r\n regex: '^[Bb]{2}[Nn][Dd]\\\\s{0,1}[1][Zz]{2}$',\r\n },\r\n VG: {\r\n name: 'British Virgin Islands',\r\n format: 'CCNNNN',\r\n regex: '^[Vv][Gg]\\\\d{4}$',\r\n },\r\n BN: {\r\n name: 'Brunei',\r\n format: 'AANNNN',\r\n regex: '^[A-Za-z]{2}\\\\d{4}$',\r\n },\r\n BG: {\r\n name: 'Bulgaria',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n BF: {\r\n name: 'Burkina Faso',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n BI: {\r\n name: 'Burundi',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n KH: {\r\n name: 'Cambodia',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n CM: {\r\n name: 'Cameroon',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n CA: {\r\n name: 'Canada',\r\n format: 'ANA NAN',\r\n regex: '^(?=[^DdFfIiOoQqUu\\\\d\\\\s])[A-Za-z]\\\\d(?=[^DdFfIiOoQqUu\\\\d\\\\s])[A-Za-z]\\\\s{0,1}\\\\d(?=[^DdFfIiOoQqUu\\\\d\\\\s])[A-Za-z]\\\\d$',\r\n },\r\n CV: {\r\n name: 'Cape Verde',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n KY: {\r\n name: 'Cayman Islands',\r\n format: 'CCN-NNNN',\r\n regex: '^[Kk][Yy]\\\\d[-\\\\s]{0,1}\\\\d{4}$',\r\n },\r\n CF: {\r\n name: 'Central African Republic',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n TD: {\r\n name: 'Chad',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n CL: {\r\n name: 'Chile',\r\n format: 'NNNNNNN (NNN-NNNN)',\r\n regex: '^\\\\d{7}\\\\s\\\\(\\\\d{3}-\\\\d{4}\\\\)$',\r\n },\r\n CN: {\r\n name: 'China',\r\n format: 'NNNNNN',\r\n regex: '^\\\\d{6}$',\r\n },\r\n CX: {\r\n name: 'Christmas Island',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n CC: {\r\n name: 'Cocos (Keeling) Island',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n CO: {\r\n name: 'Colombia',\r\n format: 'NNNNNN',\r\n regex: '^\\\\d{6}$',\r\n },\r\n KM: {\r\n name: 'Comoros',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n CG: {\r\n name: 'Congo (Brazzaville)',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n CD: {\r\n name: 'Congo, Democratic Republic',\r\n format: '- no codes -',\r\n regex: '^[Cc][Dd]$',\r\n },\r\n CK: {\r\n name: 'Cook Islands',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n CR: {\r\n name: 'Costa Rica',\r\n format: 'NNNNN (NNNN until 2007)',\r\n regex: '^\\\\d{4,5}$',\r\n },\r\n CI: {\r\n name: \"Côte d'Ivoire (Ivory Coast)\",\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n HR: {\r\n name: 'Croatia',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n CU: {\r\n name: 'Cuba',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n CW: {\r\n name: 'Curaçao',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n CY: {\r\n name: 'Cyprus',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n CZ: {\r\n name: 'Czech Republic',\r\n format: 'NNNNN (NNN NN)',\r\n regex: '^\\\\d{5}\\\\s\\\\(\\\\d{3}\\\\s\\\\d{2}\\\\)$',\r\n },\r\n DK: {\r\n name: 'Denmark',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n DJ: {\r\n name: 'Djibouti',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n DM: {\r\n name: 'Dominica',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n DO: {\r\n name: 'Dominican Republic',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n TL: {\r\n name: 'East Timor',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n EC: {\r\n name: 'Ecuador',\r\n format: 'NNNNNN',\r\n regex: '^\\\\d{6}$',\r\n },\r\n SV: {\r\n name: 'El Salvador',\r\n format: '1101',\r\n regex: '^1101$',\r\n },\r\n EG: {\r\n name: 'Egypt',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n GQ: {\r\n name: 'Equatorial Guinea',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n ER: {\r\n name: 'Eritrea',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n EE: {\r\n name: 'Estonia',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n ET: {\r\n name: 'Ethiopia',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n FK: {\r\n name: 'Falkland Islands',\r\n format: 'FIQQ 1ZZ',\r\n regex: '^[Ff][Ii][Qq]{2}\\\\s{0,1}[1][Zz]{2}$',\r\n },\r\n FO: {\r\n name: 'Faroe Islands',\r\n format: 'NNN',\r\n regex: '^\\\\d{3}$',\r\n },\r\n FJ: {\r\n name: 'Fiji',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n FI: {\r\n name: 'Finland',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n FR: {\r\n name: 'France',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n GF: {\r\n name: 'French Guiana',\r\n format: '973NN',\r\n regex: '^973\\\\d{2}$',\r\n },\r\n PF: {\r\n name: 'French Polynesia',\r\n format: '987NN',\r\n regex: '^987\\\\d{2}$',\r\n },\r\n TF: {\r\n name: 'French Southern and Antarctic Territories',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n GA: {\r\n name: 'Gabon',\r\n format: 'NN [city name] NN',\r\n regex: '^\\\\d{2}\\\\s[a-zA-Z-_ ]\\\\s\\\\d{2}$',\r\n },\r\n GM: {\r\n name: 'Gambia',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n GE: {\r\n name: 'Georgia',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n DE: {\r\n name: 'Germany',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n GH: {\r\n name: 'Ghana',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n GI: {\r\n name: 'Gibraltar',\r\n format: 'GX11 1AA',\r\n regex: '^[Gg][Xx][1]{2}\\\\s{0,1}[1][Aa]{2}$',\r\n },\r\n GR: {\r\n name: 'Greece',\r\n format: 'NNN NN',\r\n regex: '^\\\\d{3}\\\\s{0,1}\\\\d{2}$',\r\n },\r\n GL: {\r\n name: 'Greenland',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n GD: {\r\n name: 'Grenada',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n GP: {\r\n name: 'Guadeloupe',\r\n format: '971NN',\r\n regex: '^971\\\\d{2}$',\r\n },\r\n GU: {\r\n name: 'Guam',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n GT: {\r\n name: 'Guatemala',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n GG: {\r\n name: 'Guernsey',\r\n format: 'AAN NAA, AANN NAA',\r\n regex: '^[A-Za-z]{2}\\\\d\\\\s{0,1}\\\\d[A-Za-z]{2}$',\r\n },\r\n GN: {\r\n name: 'Guinea',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n GW: {\r\n name: 'Guinea Bissau',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n GY: {\r\n name: 'Guyana',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n HT: {\r\n name: 'Haiti',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n HM: {\r\n name: 'Heard and McDonald Islands',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n HN: {\r\n name: 'Honduras',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n HK: {\r\n name: 'Hong Kong',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n HU: {\r\n name: 'Hungary',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n IS: {\r\n name: 'Iceland',\r\n format: 'NNN',\r\n regex: '^\\\\d{3}$',\r\n },\r\n IN: {\r\n name: 'India',\r\n format: 'NNNNNN, NNN NNN',\r\n regex: '^\\\\d{6}$',\r\n },\r\n ID: {\r\n name: 'Indonesia',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n IR: {\r\n name: 'Iran',\r\n format: 'NNNNN-NNNNN',\r\n regex: '^\\\\d{5}-\\\\d{5}$',\r\n },\r\n IQ: {\r\n name: 'Iraq',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n IE: {\r\n name: 'Ireland',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n IM: {\r\n name: 'Isle of Man',\r\n format: 'CCN NAA, CCNN NAA',\r\n regex: '^[Ii[Mm]\\\\d{1,2}\\\\s\\\\d\\\\[A-Z]{2}$',\r\n },\r\n IL: {\r\n name: 'Israel',\r\n format: 'NNNNNNN, NNNNN',\r\n regex: '^\\\\b\\\\d{5}(\\\\d{2})?$',\r\n },\r\n IT: {\r\n name: 'Italy',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n JM: {\r\n name: 'Jamaica',\r\n format: 'Before suspension: CCAAANN After suspension: NN',\r\n regex: '^\\\\d{2}$',\r\n },\r\n JP: {\r\n name: 'Japan',\r\n format: 'NNNNNNN (NNN-NNNN)',\r\n regex: '^\\\\d{7}\\\\s\\\\(\\\\d{3}-\\\\d{4}\\\\)$',\r\n },\r\n JE: {\r\n name: 'Jersey',\r\n format: 'CCN NAA',\r\n regex: '^[Jj][Ee]\\\\d\\\\s{0,1}\\\\d[A-Za-z]{2}$',\r\n },\r\n JO: {\r\n name: 'Jordan',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n KZ: {\r\n name: 'Kazakhstan',\r\n format: 'NNNNNN',\r\n regex: '^\\\\d{6}$',\r\n },\r\n KE: {\r\n name: 'Kenya',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n KI: {\r\n name: 'Kiribati',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n KP: {\r\n name: 'Korea, North',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n KR: {\r\n name: 'South Korea',\r\n format: 'NNNNNN (NNN-NNN)',\r\n regex: '^\\\\d{6}\\\\s\\\\(\\\\d{3}-\\\\d{3}\\\\)$',\r\n },\r\n XK: {\r\n name: 'Kosovo',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n KW: {\r\n name: 'Kuwait',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n KG: {\r\n name: 'Kyrgyzstan',\r\n format: 'NNNNNN',\r\n regex: '^\\\\d{6}$',\r\n },\r\n LV: {\r\n name: 'Latvia',\r\n format: 'LV-NNNN',\r\n regex: '^[Ll][Vv][- ]{0,1}\\\\d{4}$',\r\n },\r\n LA: {\r\n name: 'Laos',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n LB: {\r\n name: 'Lebanon',\r\n format: 'NNNN NNNN',\r\n regex: '^\\\\d{4}\\\\s{0,1}\\\\d{4}$',\r\n },\r\n LS: {\r\n name: 'Lesotho',\r\n format: 'NNN',\r\n regex: '^\\\\d{3}$',\r\n },\r\n LR: {\r\n name: 'Liberia',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n LY: {\r\n name: 'Libya',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n LI: {\r\n name: 'Liechtenstein',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n LT: {\r\n name: 'Lithuania',\r\n format: 'LT-NNNNN',\r\n regex: '^[Ll][Tt][- ]{0,1}\\\\d{5}$',\r\n },\r\n LU: {\r\n name: 'Luxembourg',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n MO: {\r\n name: 'Macau',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n MK: {\r\n name: 'Macedonia',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n MG: {\r\n name: 'Madagascar',\r\n format: 'NNN',\r\n regex: '^\\\\d{3}$',\r\n },\r\n MW: {\r\n name: 'Malawi',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n MV: {\r\n name: 'Maldives',\r\n format: 'NNNN, NNNNN',\r\n regex: '^\\\\d{4,5}$',\r\n },\r\n MY: {\r\n name: 'Malaysia',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n ML: {\r\n name: 'Mali',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n MT: {\r\n name: 'Malta',\r\n format: 'AAANNNN (AAA NNNN)',\r\n regex: '^[A-Za-z]{3}\\\\s{0,1}\\\\d{4}$',\r\n },\r\n MH: {\r\n name: 'Marshall Islands',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n MR: {\r\n name: 'Mauritania',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n MU: {\r\n name: 'Mauritius',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n MQ: {\r\n name: 'Martinique',\r\n format: '972NN',\r\n regex: '^972\\\\d{2}$',\r\n },\r\n YT: {\r\n name: 'Mayotte',\r\n format: '976NN',\r\n regex: '^976\\\\d{2}$',\r\n },\r\n FM: {\r\n name: 'Micronesia',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n MX: {\r\n name: 'Mexico',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n MD: {\r\n name: 'Moldova',\r\n format: 'CCNNNN (CC-NNNN)',\r\n regex: '^[Mm][Dd][- ]{0,1}\\\\d{4}$',\r\n },\r\n MC: {\r\n name: 'Monaco',\r\n format: '980NN',\r\n regex: '^980\\\\d{2}$',\r\n },\r\n MN: {\r\n name: 'Mongolia',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n ME: {\r\n name: 'Montenegro',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n MS: {\r\n name: 'Montserrat',\r\n format: 'MSR 1110-1350',\r\n regex: '^[Mm][Ss][Rr]\\\\s{0,1}\\\\d{4}$',\r\n },\r\n MA: {\r\n name: 'Morocco',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n MZ: {\r\n name: 'Mozambique',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n MM: {\r\n name: 'Myanmar',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n NA: {\r\n name: 'Namibia',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n NR: {\r\n name: 'Nauru',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n NP: {\r\n name: 'Nepal',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n NL: {\r\n name: 'Netherlands',\r\n format: 'NNNN AA',\r\n regex: '^\\\\d{4}\\\\s{0,1}[A-Za-z]{2}$',\r\n },\r\n NC: {\r\n name: 'New Caledonia',\r\n format: '988NN',\r\n regex: '^988\\\\d{2}$',\r\n },\r\n NZ: {\r\n name: 'New Zealand',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n NI: {\r\n name: 'Nicaragua',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n NE: {\r\n name: 'Niger',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n NG: {\r\n name: 'Nigeria',\r\n format: 'NNNNNN',\r\n regex: '^\\\\d{6}$',\r\n },\r\n NU: {\r\n name: 'Niue',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n NF: {\r\n name: 'Norfolk Island',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n MP: {\r\n name: 'Northern Mariana Islands',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n NO: {\r\n name: 'Norway',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n OM: {\r\n name: 'Oman',\r\n format: 'NNN',\r\n regex: '^\\\\d{3}$',\r\n },\r\n PK: {\r\n name: 'Pakistan',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n PW: {\r\n name: 'Palau',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n PA: {\r\n name: 'Panama',\r\n format: 'NNNNNN',\r\n regex: '^\\\\d{6}$',\r\n },\r\n PG: {\r\n name: 'Papua New Guinea',\r\n format: 'NNN',\r\n regex: '^\\\\d{3}$',\r\n },\r\n PY: {\r\n name: 'Paraguay',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n PE: {\r\n name: 'Peru',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n PH: {\r\n name: 'Philippines',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n PN: {\r\n name: 'Pitcairn Islands',\r\n format: 'PCRN 1ZZ',\r\n regex: '^[Pp][Cc][Rr][Nn]\\\\s{0,1}[1][Zz]{2}$',\r\n },\r\n PL: {\r\n name: 'Poland',\r\n format: 'NNNNN (NN-NNN)',\r\n regex: '^\\\\d{2}[- ]{0,1}\\\\d{3}$',\r\n },\r\n PT: {\r\n name: 'Portugal',\r\n format: 'NNNN-NNN (NNNN NNN)',\r\n regex: '^\\\\d{4}[- ]{0,1}\\\\d{3}$',\r\n },\r\n PR: {\r\n name: 'Puerto Rico',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n QA: {\r\n name: 'Qatar',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n RE: {\r\n name: 'Réunion',\r\n format: '974NN',\r\n regex: '^974\\\\d{2}$',\r\n },\r\n RO: {\r\n name: 'Romania',\r\n format: 'NNNNNN',\r\n regex: '^\\\\d{6}$',\r\n },\r\n RU: {\r\n name: 'Russia',\r\n format: 'NNNNNN',\r\n regex: '^\\\\d{6}$',\r\n },\r\n BL: {\r\n name: 'Saint Barthélemy',\r\n format: '97133',\r\n regex: '^97133$',\r\n },\r\n SH: {\r\n name: 'Tristan da Cunha',\r\n format: 'TDCU 1ZZ',\r\n regex: '^[Tt][Dd][Cc][Uu]\\\\s{0,1}[1][Zz]{2}$',\r\n },\r\n KN: {\r\n name: 'Saint Kitts and Nevis',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n LC: {\r\n name: 'Saint Lucia',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n MF: {\r\n name: 'Saint Martin',\r\n format: '97150',\r\n regex: '^97150$',\r\n },\r\n PM: {\r\n name: 'Saint Pierre and Miquelon',\r\n format: '97500',\r\n regex: '^97500$',\r\n },\r\n VC: {\r\n name: 'Saint Vincent and the Grenadines',\r\n format: 'CCNNNN',\r\n regex: '^[Vv][Cc]\\\\d{4}$',\r\n },\r\n SM: {\r\n name: 'San Marino',\r\n format: '4789N',\r\n regex: '^4789\\\\d$',\r\n },\r\n ST: {\r\n name: 'Sao Tome and Principe',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n SA: {\r\n name: 'Saudi Arabia',\r\n format: 'NNNNN for PO Boxes. NNNNN-NNNN for home delivery.',\r\n regex: '^\\\\d{5}(-{1}\\\\d{4})?$',\r\n },\r\n SN: {\r\n name: 'Senegal',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n RS: {\r\n name: 'Serbia',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n SC: {\r\n name: 'Seychelles',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n SX: {\r\n name: 'Sint Maarten',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n SL: {\r\n name: 'Sierra Leone',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n SG: {\r\n name: 'Singapore',\r\n format: 'NNNNNN',\r\n regex: '^\\\\d{6}$',\r\n },\r\n SK: {\r\n name: 'Slovakia',\r\n format: 'NNNNN (NNN NN)',\r\n regex: '^\\\\d{5}\\\\s\\\\(\\\\d{3}\\\\s\\\\d{2}\\\\)$',\r\n },\r\n SI: {\r\n name: 'Slovenia',\r\n format: 'NNNN (CC-NNNN)',\r\n regex: '^([Ss][Ii][- ]{0,1}){0,1}\\\\d{4}$',\r\n },\r\n SB: {\r\n name: 'Solomon Islands',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n SO: {\r\n name: 'Somalia',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n ZA: {\r\n name: 'South Africa',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n GS: {\r\n name: 'South Georgia and the South Sandwich Islands',\r\n format: 'SIQQ 1ZZ',\r\n regex: '^[Ss][Ii][Qq]{2}\\\\s{0,1}[1][Zz]{2}$',\r\n },\r\n ES: {\r\n name: 'Spain',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n LK: {\r\n name: 'Sri Lanka',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n SD: {\r\n name: 'Sudan',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n SR: {\r\n name: 'Suriname',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n SZ: {\r\n name: 'Swaziland',\r\n format: 'ANNN',\r\n regex: '^[A-Za-z]\\\\d{3}$',\r\n },\r\n SE: {\r\n name: 'Sweden',\r\n format: 'NNNNN (NNN NN)',\r\n regex: '^\\\\d{3}\\\\s*\\\\d{2}$',\r\n },\r\n CH: {\r\n name: 'Switzerland',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n SJ: {\r\n name: 'Svalbard and Jan Mayen',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n SY: {\r\n name: 'Syria',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n TW: {\r\n name: 'Taiwan',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n TJ: {\r\n name: 'Tajikistan',\r\n format: 'NNNNNN',\r\n regex: '^\\\\d{6}$',\r\n },\r\n TZ: {\r\n name: 'Tanzania',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n TH: {\r\n name: 'Thailand',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n TG: {\r\n name: 'Togo',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n TK: {\r\n name: 'Tokelau',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n TO: {\r\n name: 'Tonga',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n TT: {\r\n name: 'Trinidad and Tobago',\r\n format: 'NNNNNN',\r\n regex: '^\\\\d{6}$',\r\n },\r\n TN: {\r\n name: 'Tunisia',\r\n format: 'NNNN',\r\n regex: '^\\\\d{4}$',\r\n },\r\n TR: {\r\n name: 'Turkey',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n TM: {\r\n name: 'Turkmenistan',\r\n format: 'NNNNNN',\r\n regex: '^\\\\d{6}$',\r\n },\r\n TC: {\r\n name: 'Turks and Caicos Islands',\r\n format: 'TKCA 1ZZ',\r\n regex: '^[Tt][Kk][Cc][Aa]\\\\s{0,1}[1][Zz]{2}$',\r\n },\r\n TV: {\r\n name: 'Tuvalu',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n UG: {\r\n name: 'Uganda',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n UA: {\r\n name: 'Ukraine',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n AE: {\r\n name: 'United Arab Emirates',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n GB: {\r\n name: 'United Kingdom',\r\n format: 'A(A)N(A/N)NAA (A[A]N[A/N] NAA)',\r\n regex: '^[A-Z]{1,2}[0-9R][0-9A-Z]?\\\\s*[0-9][A-Z-[CIKMOV]]{2}',\r\n },\r\n US: {\r\n name: 'United States',\r\n format: 'NNNNN (optionally NNNNN-NNNN)',\r\n regex: '^\\\\b\\\\d{5}\\\\b(?:[- ]{1}\\\\d{4})?$',\r\n },\r\n UY: {\r\n name: 'Uruguay',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n VI: {\r\n name: 'U.S. Virgin Islands',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n UZ: {\r\n name: 'Uzbekistan',\r\n format: 'NNN NNN',\r\n regex: '^\\\\d{3} \\\\d{3}$',\r\n },\r\n VU: {\r\n name: 'Vanuatu',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n VA: {\r\n name: 'Vatican',\r\n format: '120',\r\n regex: '^120$',\r\n },\r\n VE: {\r\n name: 'Venezuela',\r\n format: 'NNNN or NNNN A',\r\n regex: '^\\\\d{4}(\\\\s[a-zA-Z]{1})?$',\r\n },\r\n VN: {\r\n name: 'Vietnam',\r\n format: 'NNNNNN',\r\n regex: '^\\\\d{6}$',\r\n },\r\n WF: {\r\n name: 'Wallis and Futuna',\r\n format: '986NN',\r\n regex: '^986\\\\d{2}$',\r\n },\r\n YE: {\r\n name: 'Yemen',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n ZM: {\r\n name: 'Zambia',\r\n format: 'NNNNN',\r\n regex: '^\\\\d{5}$',\r\n },\r\n ZW: {\r\n name: 'Zimbabwe',\r\n format: '- no codes -',\r\n regex: '',\r\n },\r\n};\r\n","import { object, string } from 'yup';\r\nimport { COUNTRY_WISE_ZIP_CODES_REGEX } from './zipcodes';\r\n\r\nexport const getAddressValidationModel = () =>\r\n object().shape({\r\n line1: string().required().label('Address line 1'),\r\n line2: string().label('Address line 2'),\r\n city: string().required().label('City'),\r\n stateOrProvince: string().required().label('State'),\r\n postalCode: string()\r\n .required()\r\n .label('ZIP code')\r\n .when('country', (country, schema) => {\r\n return schema.test({\r\n name: 'zipCode',\r\n message: 'Invalid ZIP code',\r\n test: (value) => {\r\n const regExp = new RegExp(COUNTRY_WISE_ZIP_CODES_REGEX[country].regex);\r\n if (regExp) {\r\n return regExp.test(value);\r\n }\r\n return true;\r\n },\r\n });\r\n }),\r\n country: string().required().label('Country'),\r\n });\r\n","import { object, number, string } from 'yup';\r\nimport { IIdNamePair } from '../../../../components/MultiSelectPicker';\r\n\r\nexport const IdNamePairErrorModel = object<IIdNamePair>({\r\n id: number().required(),\r\n name: string().trim().required()\r\n});\r\n","import { Log } from '../../../../../../../logging/src';\r\nimport { AdSource, Model, Publisher } from '../../../../../../@data';\r\nimport { adProvidersToNames } from '../../../../../../config/adProviders';\r\nimport { IDataGridColumn } from '../../../../../../layout/GridPageV2';\r\nimport { CSVHelper, invert } from '../../../../../../utils';\r\nimport { IAdCreativeViewModel } from '../../store/schema';\r\nimport { AdPerformanceData, BlockAdsData, BlockedContext, SAMBlockSummaryData } from '../../store/schema/models';\r\nimport { IAdReviewModel } from '../../store/schema/models/AdReviewModel';\r\nimport { AGG_LEVEL_CREATIVE, AGG_LEVEL_LISTING, AUDIENCE_INTENT_MARKETPLACE, PAGE_ADS, PAID_SEARCH, TEXT_ADS } from './constants';\r\n\r\nexport function handleError<T>(error: Error, url: string): Promise<T> {\r\n Log.error(error);\r\n return Promise.reject(error);\r\n}\r\n\r\nexport function constructUrl(baseUrl: string, models: string[][], params?: URLSearchParams, defaultParams?: URLSearchParams): string {\r\n const urlArray = [baseUrl];\r\n\r\n models.forEach((model) => {\r\n if (model[1] !== '') {\r\n model.forEach((str) => urlArray.push(encodeURIComponent(str)));\r\n }\r\n });\r\n\r\n let url = urlArray.join('/');\r\n if (params) {\r\n url = url.concat('?' + params.toString());\r\n }\r\n\r\n if (defaultParams) {\r\n url = url.concat('&' + defaultParams.toString());\r\n }\r\n\r\n return url;\r\n}\r\n\r\nexport function convertDateToString(date: Date): string {\r\n // Uses the local date of the given date, not the UTC date.\r\n return date.toISOString().split('T')[0].replace(/-/g, '');\r\n}\r\n\r\nexport function constructAdPerfRequest(\r\n active: IAdCreativeViewModel,\r\n data: IAdReviewModel,\r\n publisher: Publisher,\r\n accountIds?: number[],\r\n adDescription?: boolean\r\n): IAdReviewModel {\r\n const body: IAdReviewModel = {\r\n StartDate: active.selectedAdSource === AdSource.XandrAuction ? undefined : convertDateToString(active.startDate!),\r\n EndDate: active.selectedAdSource === AdSource.XandrAuction ? undefined : convertDateToString(active.endDate!),\r\n PageNumber: 1,\r\n PageSize: 100,\r\n Filters: data.Filters,\r\n Keyword: active.searchBoxValue && active.searchBoxValue !== '' ? active.searchBoxValue : '',\r\n Creativeagglevel:\r\n active.selectedAdSource === AdSource.Microsoft\r\n ? AGG_LEVEL_LISTING\r\n : active.selectedAdSource === AdSource.Auction\r\n ? AGG_LEVEL_CREATIVE\r\n : undefined,\r\n AdTypes: active.selectedAdSource === AdSource.Microsoft ? [PAGE_ADS, TEXT_ADS] : undefined,\r\n AdSources: active.selectedAdSource === AdSource.Microsoft ? [AUDIENCE_INTENT_MARKETPLACE, PAID_SEARCH] : undefined,\r\n ...(active.selectedAdSource === AdSource.Microsoft && adDescription\r\n ? {\r\n Fields: [\r\n 'adtitle',\r\n 'adurl',\r\n 'advertisername',\r\n 'adid',\r\n 'uniquecreativeadidstr',\r\n 'advertiseraccountid',\r\n 'advertiserid',\r\n 'uniquecreativeadid',\r\n 'addescription',\r\n ],\r\n }\r\n : {}),\r\n };\r\n\r\n if (body.Filters?.Numerical) {\r\n body.Filters.Numerical.publisherId = publisher.id;\r\n if (accountIds) {\r\n body.Filters.Numerical.accountIds = accountIds;\r\n }\r\n }\r\n\r\n return body;\r\n}\r\n\r\nexport function isImageBlockable(img: string, adtype?: string, adsource?: string): boolean {\r\n if (img && adtype === TEXT_ADS && adsource === PAID_SEARCH) {\r\n const isNativeStockPhoto = img.indexOf('pid=AdsNative') >= 0;\r\n\r\n // We can block PA corpus Images that are displayed on TA ads the\r\n // same way as we block the AdsNative stock photos.\r\n const isPaCorpusImage = img.indexOf('&pid=21.1') >= 0;\r\n\r\n return isNativeStockPhoto || isPaCorpusImage;\r\n }\r\n return false;\r\n}\r\n\r\nexport function isImageBlocked(img: string, adId: number, blockedImages?: string[], blockedAdsContext?: BlockedContext) {\r\n let isBlocked = false;\r\n const imageReportDataTuple = { adId: adId, imageUrl: img };\r\n if (\r\n (blockedImages && blockedImages.includes(JSON.stringify(imageReportDataTuple))) ||\r\n (blockedAdsContext &&\r\n blockedAdsContext.mapAdIdImages &&\r\n blockedAdsContext.mapAdIdImages!.has(adId) &&\r\n compareImages(blockedAdsContext.mapAdIdImages!.get(adId)!, img))\r\n ) {\r\n isBlocked = true;\r\n }\r\n return isBlocked;\r\n}\r\n\r\nexport function isAllImagesViewOnly(imgs?: string[], adtype?: string, adsource?: string): boolean {\r\n return imgs ? imgs.every((image) => !isImageBlockable(image, adtype, adsource)) : true;\r\n}\r\n\r\nexport function compareImages(allImages: string[], imageToCompare: string) {\r\n if (allImages.length === 0) {\r\n return false;\r\n }\r\n const strippedImages: string[] = [];\r\n allImages.forEach((imageUrl) => {\r\n strippedImages.push(imageUrl.replace('https://www.bing.com/', ''));\r\n });\r\n imageToCompare = imageToCompare.replace('https://bing.com/', '');\r\n return strippedImages.includes(imageToCompare);\r\n}\r\n\r\nexport function processImagesLink(imageUrls: string[], noImageUrl: string, isAuctionData = false): string[] {\r\n imageUrls = imageUrls.filter((v) => v !== '');\r\n imageUrls.forEach((img, imgIndex) => {\r\n if (img === null || img === '') {\r\n imageUrls[imgIndex] = noImageUrl;\r\n } else {\r\n imageUrls[imgIndex] = isAuctionData ? img : sanitizeBingImageUrl(img);\r\n }\r\n });\r\n if (imageUrls.length === 0) {\r\n imageUrls = [noImageUrl];\r\n }\r\n return imageUrls;\r\n}\r\n\r\nexport function sanitizeBingImageUrl(imgUrl: string): string {\r\n let imageUrl = '';\r\n if (imgUrl.indexOf('bing.com/th?id=') >= 0) {\r\n imageUrl = 'https://' + imgUrl.slice(imgUrl.indexOf('bing.com/th?id='));\r\n } else if (imgUrl.indexOf('th?id=') >= 0) {\r\n imageUrl = 'https://bing.com' + imgUrl;\r\n } else {\r\n imageUrl = 'https://bing.com/th?id=' + imgUrl;\r\n }\r\n return imageUrl;\r\n}\r\n\r\nexport function extractPlacement(item: AdPerformanceData): string {\r\n // tslint:disable-next-line: no-string-literal\r\n const { regions, pagetypes } = item;\r\n return (pagetypes || []).concat(regions || []).join(', ');\r\n}\r\n\r\nexport function exportCSV(blockDataForCSV: Model[], fileName: string, columns: IDataGridColumn[]) {\r\n const stringDataForCSV: string[] = [];\r\n for (const rowData of blockDataForCSV) {\r\n stringDataForCSV.push(\r\n CSVHelper.getCSVStrings(\r\n rowData,\r\n columns.filter((col) => col.isExportColumn)\r\n )\r\n );\r\n }\r\n\r\n const headerCsvList: string[] = [];\r\n for (const coldata of columns) {\r\n if (coldata && coldata.isExportColumn) {\r\n headerCsvList.push(coldata.headerCSV ? coldata.headerCSV : coldata.friendlyName);\r\n }\r\n }\r\n\r\n CSVHelper.downloadDataAsCSV(stringDataForCSV.join('\\n'), headerCsvList.join(','), fileName);\r\n}\r\n\r\nexport function toHttpsLink(urlToUpdate: string): string {\r\n if (!urlToUpdate || urlToUpdate.startsWith('http://') || urlToUpdate.startsWith('https://')) {\r\n // Url is null or already proper http.\r\n return urlToUpdate;\r\n } else {\r\n return 'https://' + urlToUpdate;\r\n }\r\n}\r\n\r\nexport function samBlockSummaryToAdPerfMapper(items: SAMBlockSummaryData[]): AdPerformanceData[] {\r\n const mappedItems: AdPerformanceData[] = [];\r\n items.forEach((item) => {\r\n if (item.adProvider && item.allAdImages) {\r\n mappedItems.push({\r\n apiPath: undefined,\r\n className: 'adPerformanceData',\r\n adTitle: item.adTitle,\r\n adProvider: Number(invert(adProvidersToNames)[item.adProvider]),\r\n advertiserName: item.advertiser,\r\n images: item.allAdImages,\r\n blockedImages: item.allAdImages,\r\n revenue: item.sevenDayRevenueImpact,\r\n uniqueCreativeAdId: item.creativeAdId,\r\n });\r\n }\r\n });\r\n\r\n return mappedItems;\r\n}\r\n\r\nexport function blockDatatoAdPerfMapper(items: BlockAdsData[]): AdPerformanceData[] {\r\n const mappedItems: AdPerformanceData[] = [];\r\n items.forEach((item) => {\r\n if (item.allImages) {\r\n const imageList = item.allImages.split('___');\r\n mappedItems.push({\r\n apiPath: undefined,\r\n className: 'adPerformanceData',\r\n adTitle: item.adTitle,\r\n adId: item.adId,\r\n revenue: item.pastRevenue,\r\n accountName: item.accountName,\r\n advertiserAccountId: item.advertiserAccountId,\r\n accountId: item.accountId,\r\n images: imageList,\r\n blockedImages: imageList,\r\n });\r\n }\r\n });\r\n return mappedItems;\r\n}\r\n","import { createStore } from 'satcheljs';\r\nimport { IPropertyViewState } from './schema/IPropertyViewState';\r\n\r\nexport const getGridPropertyStore = createStore<IPropertyViewState>('GridPropertyState', {\r\n isPanelOpen: false,\r\n isCodePanelOpen: false,\r\n isFetchingPropertyStatus: false,\r\n isFetchingData: false,\r\n isLoading: false,\r\n});\r\n","import { IDropdownOption, IIconStyleProps, IIconStyles, IRefObject, IStyle, IStyleFunctionOrObject, ITheme } from '@fluentui/react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { Model } from '../../@data';\r\nimport { FilterCondition } from '../../@data/store/schema/enums/FilterCondition';\r\nimport { IFilterItem } from '../../layout/GridPageV2';\r\n\r\nexport interface IGridFilter {\r\n resetGridFilter(): void;\r\n}\r\n\r\nexport interface IGridFilterProps extends React.HTMLAttributes<HTMLDivElement>, InjectedIntlProps {\r\n componentRef?: IRefObject<IGridFilter>;\r\n theme?: ITheme;\r\n styles?: IStyleFunctionOrObject<IGridFilterStyleProps, IGridFilterStyles>;\r\n filterItems: IFilterItem[];\r\n filterMenuCalloutOpen?: boolean;\r\n onFilterApplied: (filterList: IFilterDetails[]) => void;\r\n onFilterMenuCalloutClose: () => void;\r\n onClearAll?: () => void;\r\n onDeleteTextCondition?: (heading: string, filterCondition: FilterCondition, val: string) => void;\r\n onListValueChanged?: (heading: string, val: string) => void;\r\n showClearAll?: boolean;\r\n initialFilterListValues?: IFilterDetails[];\r\n hideCallout?: boolean;\r\n}\r\n\r\nexport enum FilterType {\r\n custom = 'custom',\r\n string = 'string',\r\n relational = 'relational',\r\n date = 'date',\r\n}\r\n\r\nexport interface IFilterDetails {\r\n filterId: string;\r\n filterName: string;\r\n filterType: FilterType;\r\n columnName?: string;\r\n filterOptions?: IDropdownOption[];\r\n filterCondition?: string;\r\n filterText?: string;\r\n startDate?: Date;\r\n endDate?: Date;\r\n customFunction?: (dataRow: Model, filterDetails: IFilterDetails) => boolean;\r\n includeNulls?: boolean;\r\n showNullsCheckboxLabel?: string;\r\n}\r\n\r\nexport interface IGridFilterStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\nexport interface IGridFilterStyles {\r\n root: IStyle;\r\n filterBarFocused?: IStyle;\r\n filterBarUnFocused?: IStyle;\r\n appliedfilterList?: IStyle;\r\n filterInfoContainer?: IStyle;\r\n highlightedFilterInfoContainer?: IStyle;\r\n filterInfoFocused?: IStyle;\r\n filterInfoUnfocused?: IStyle;\r\n viewAllButton?: IStyle;\r\n clearAllButton?: IStyle;\r\n filterSummaryCallout?: IStyle;\r\n filterCloseIcon?: IStyle;\r\n calloutCloseIcon?: IStyle;\r\n filterMenuListItem?: IStyle;\r\n disabledFilterMenuListItem?: IStyle;\r\n filterSelectionCallout?: IStyle;\r\n filterSelectionCalloutTitle?: IStyle;\r\n filterSelectionToolBar?: IStyle;\r\n filterSelectionApplyButton?: IStyle;\r\n filterSelectionCancelButton?: IStyle;\r\n disabledApplyButton?: IStyle;\r\n filterSummaryCalloutHeader?: IStyle;\r\n filterIcon?: IStyle;\r\n filterInfoSelectors?: IStyle;\r\n highlightedFilterInfoSelectors?: IStyle;\r\n filterInfoSummaryItem?: IStyle;\r\n filterSummaryCalloutTitle?: IStyle;\r\n filterListPageStyle?: IStyle;\r\n subComponentStyles: {\r\n iconButton?: IStyleFunctionOrObject<IIconStyleProps, IIconStyles>;\r\n };\r\n}\r\n","export enum FilterCondition {\r\n Equals = 'equals',\r\n DoesNotEqual = 'does not equal',\r\n GreaterThan = 'greater than',\r\n GreaterThanEqual = 'greater than or equals',\r\n LessThan = 'less than',\r\n LessThanEqual = 'less than or equals',\r\n Contains = 'contains',\r\n DoesNotContain = 'does not contain',\r\n BeginsWith = 'begins with',\r\n EndsWith = 'ends with',\r\n}","import { getAppStore, getCurrentPublisherId } from '../@data';\r\nimport { RouteName } from '../pages/ad-management/@data';\r\nimport { PAYMENTS_TAB_KEY, PROFILE_TAB_KEY, REPORT_DASHBOARD_PAGE, SETTINGS_TAB_KEY } from '../pages/ad-management/Account';\r\nimport { RoutePrefix } from '../Routes';\r\n\r\nexport function getAdUnitRoute(): string {\r\n const { account } = getAppStore();\r\n const publisherId = getCurrentPublisherId();\r\n\r\n return `/${RoutePrefix.adManagement}/${publisherId}-${account?.id}/${RouteName.adunit}`;\r\n}\r\n\r\nexport function getSitesRoute(): string {\r\n const publisherId = getCurrentPublisherId();\r\n return `/${RoutePrefix.adManagement}/${publisherId}/${RouteName.property}`;\r\n}\r\n\r\nexport function getTythonPublisherRoute() {\r\n const publisherId = getCurrentPublisherId();\r\n return `/${RoutePrefix.adManagement}/${publisherId}`;\r\n}\r\n\r\nexport function getTythonProfilePageRoute() {\r\n return `${getTythonPublisherRoute()}/${RouteName.publisherProfile}#${PROFILE_TAB_KEY}`;\r\n}\r\n\r\nexport function getTythonPaymentPageRoute() {\r\n return `${getTythonPublisherRoute()}/${RouteName.publisherProfile}#${PAYMENTS_TAB_KEY}`;\r\n}\r\n\r\nexport function getTythonAccountSettingPageRoute() {\r\n return `${getTythonPublisherRoute()}/${RouteName.publisherProfile}#${SETTINGS_TAB_KEY}`;\r\n}\r\n\r\nexport function getTythonHomePageRoute() {\r\n return `${getTythonPublisherRoute()}/${RouteName.home}`;\r\n}\r\n\r\nexport function getTythonAdUnitCreatePageRoute() {\r\n return `${getAdUnitRoute()}/create`;\r\n}\r\n\r\nexport function getTythonSiteCreatePageRoute() {\r\n return `${getSitesRoute()}/create`;\r\n}\r\n\r\nexport function getTythonInventoryPage(renderAppView = false) {\r\n const { account } = getAppStore();\r\n const publisherId = getCurrentPublisherId();\r\n if (renderAppView) {\r\n return `/${RoutePrefix.adManagement}/${publisherId}-${account?.id}/${RouteName.inventory}?view=app`;\r\n }\r\n return `/${RoutePrefix.adManagement}/${publisherId}-${account?.id}/${RouteName.inventory}`;\r\n}\r\n\r\nexport function getTythonInventoryCreationPageRoute() {\r\n return `${getTythonInventoryPage()}/create`;\r\n}\r\n\r\nexport function getTythonAdsCreationPageRoute() {\r\n const { account } = getAppStore();\r\n const publisherId = getCurrentPublisherId();\r\n return `/${RoutePrefix.adManagement}/${publisherId}-${account?.id}/${RouteName.ads}/create`;\r\n}\r\n\r\nexport function getTythonAppAdunitCreationRoute() {\r\n const publisherId = getCurrentPublisherId();\r\n return `/${RoutePrefix.adManagement}/${publisherId}/${RouteName.adunit}/createApp`;\r\n}\r\n\r\nexport function getTythonAppAdunitEditionRoute(id: string) {\r\n const publisherId = getCurrentPublisherId();\r\n return `/${RoutePrefix.adManagement}/${publisherId}/${RouteName.adunit}/editApp/${id}`;\r\n}\r\n\r\nexport function getTythonAppInventoryCreationRoute() {\r\n const publisherId = getCurrentPublisherId();\r\n return `/${RoutePrefix.adManagement}/${publisherId}/${RouteName.property}/createApp`;\r\n}\r\n\r\nexport function getTythonAppInventoryEditionRoute(id: string) {\r\n const publisherId = getCurrentPublisherId();\r\n return `/${RoutePrefix.adManagement}/${publisherId}/${RouteName.property}/editApp/${id}`;\r\n}\r\n\r\nexport function getTythonReportDashboardPageRoute() {\r\n return `${getTythonPublisherRoute()}/${REPORT_DASHBOARD_PAGE}`;\r\n}\r\n\r\nexport function getAdBlocksPageRoute() {\r\n const publisherId = getCurrentPublisherId();\r\n return `/${RoutePrefix.adManagement}/${publisherId}/${RouteName.adblock}`;\r\n}\r\n\r\nexport function getTythonAdsManageRoute(renderAppView = false) {\r\n const { account } = getAppStore();\r\n const publisherId = getCurrentPublisherId();\r\n if (renderAppView) {\r\n return `/${RoutePrefix.adManagement}/${publisherId}-${account?.id}/${RouteName.ads}?view=app`;\r\n }\r\n return `/${RoutePrefix.adManagement}/${publisherId}-${account?.id}/${RouteName.ads}`;\r\n}\r\n","import { IDictionary } from '../types';\r\n\r\nexport const PUBCENTER_TYTHON_DOMAIN_MAPPING: IDictionary<string> = {\r\n 'localhost:3000': 'http://localhost:3001',\r\n 'pubcenter.azurewebsites.net': 'https://si.monetizenow.microsoft.com',\r\n 'pubcenter2.azurewebsites.net': 'https://offline.si.monetizenow.microsoft.com',\r\n 'next.pubcenter.microsoft.com': 'https://monetizenow.microsoft.com',\r\n 'pubcenternext-staging.azurewebsites.net': 'https://staging.monetizenow.microsoft.com',\r\n};\r\n\r\nexport const PUBCENTER_NEXT_PROD = 'https://next.pubcenter.microsoft.com';\r\nexport const PUBCENTER_NEXT_PROD_STAGING = 'https://pubcenternext-staging.azurewebsites.net';\r\nexport const TYTHON_NEW_PROD = 'https://monetizenow.microsoft.com';\r\nexport const TYTHON_NEW_PROD_STAGING = 'https://staging.monetizenow.microsoft.com';\r\n\r\nexport const PUBCENTER_NEXT_SI = 'https://pubcenter.azurewebsites.net';\r\nexport const PUBCENTER_NEXT_SI_STAGING = 'https://pubcenter2.azurewebsites.net';\r\nexport const TYTHON_NEW_SI = 'https://si.monetizenow.microsoft.com';\r\nexport const TYTHON_NEW_SI_OFFLINE = 'https://offline.si.monetizenow.microsoft.com';\r\n\r\nexport const LOCALHOST = 'http://localhost:3000';\r\nexport const LOCALHOST2 = 'http://localhost:3001';\r\n\r\nexport const NEW_DOMAINS = [TYTHON_NEW_SI, TYTHON_NEW_SI_OFFLINE, TYTHON_NEW_PROD, TYTHON_NEW_PROD_STAGING, LOCALHOST2];\r\n\r\nexport const PUBCENTER_DOMAINS = [\r\n PUBCENTER_NEXT_SI,\r\n PUBCENTER_NEXT_SI_STAGING,\r\n PUBCENTER_NEXT_PROD,\r\n PUBCENTER_NEXT_PROD_STAGING,\r\n LOCALHOST,\r\n];\r\n","import { createStore } from 'satcheljs';\r\nimport { IAdunitViewState } from './schema/IAdunitViewState';\r\n\r\nexport const getAdunitStore = createStore<IAdunitViewState>('AdunitState', {\r\n active: {},\r\n enablePrivateMarketplace: false,\r\n errors: {},\r\n isPanelOpen: false,\r\n adUnitsRaw: {},\r\n isSubmittable: false,\r\n isFetchingAdUnitStatus: false,\r\n mediationUpdatePool: [],\r\n scriptProps: undefined,\r\n});\r\n","import { LOCAL_STORAGE_LOCALE } from '../../constants';\r\nimport { UserType } from '../store/schema';\r\nimport { getAppStore } from '../store/store';\r\n\r\nexport const isTythonSelfServeUser = () => {\r\n const { userContext } = getAppStore();\r\n if (userContext && userContext.userType && userContext.userType === UserType.TythonSelfServe) {\r\n return true;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nexport const isNotAuthorizedUser = () => {\r\n const { publisher, userContext } = getAppStore();\r\n return publisher === undefined && userContext?.id === undefined;\r\n};\r\n\r\nexport const isLocalRetrieved = () => {\r\n return !!localStorage.getItem(LOCAL_STORAGE_LOCALE);\r\n};\r\n\r\nexport const isInternalUser = (): boolean => {\r\n const store = getAppStore();\r\n const defaultPublisherId = store.defaultPublisher ?? 0;\r\n\r\n const publisherId = store.publisher?.id;\r\n\r\n if (publisherId && [3000, 3001, 3002, 3003, 3004, 0].includes(defaultPublisherId)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n};\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { CustomPanelType, Model, PopupType } from '../../../../@data';\r\nimport { IGridQuery } from '../../GridV2.types';\r\nimport { getStore } from '../store/store';\r\n\r\nexport const setSearchWord = mutatorAction('setSearchWord', (word: string) => {\r\n getStore().searchWord = word;\r\n});\r\n\r\nexport const setIsSearchCalloutVisible = mutatorAction('setIsSearchCalloutVisible', (isVisible: boolean) => {\r\n getStore().isSearchCalloutVisible = isVisible;\r\n});\r\n\r\nexport const setData = mutatorAction('setData', (data: Model[]) => {\r\n getStore().data = data;\r\n});\r\n\r\n// tslint:disable-next-line: no-any\r\nexport const setSelectedItems = mutatorAction('setSelectedItems', (items: any[]) => {\r\n getStore().selectedItems = items;\r\n});\r\n\r\nexport const setLoading = mutatorAction('setLoading', (loading: boolean) => {\r\n getStore().loading = loading;\r\n});\r\n\r\nexport const setQuery = mutatorAction('setQuery', (query: IGridQuery<Model>) => {\r\n getStore().query = query;\r\n});\r\n\r\nexport const setEntity = mutatorAction('setEntity', (entity: new () => Model) => {\r\n getStore().entity = entity;\r\n});\r\n\r\nexport const setFilterMenuCalloutStatus = mutatorAction('setFilterMenuCalloutStatus', (isOpen: boolean) => {\r\n getStore().filterMenuCalloutOpen = isOpen;\r\n});\r\n\r\nexport const setDialogType = mutatorAction('setDialogType', (dialogType: PopupType) => {\r\n getStore().dialogType = dialogType;\r\n});\r\n\r\nexport const setPanelType = mutatorAction('setPanelType', (panelType: CustomPanelType) => {\r\n getStore().panelType = panelType;\r\n});\r\n\r\nexport const onPageSizeChanged = mutatorAction('onPageSizeChanged', (value: number) => {\r\n getStore().paginator.currentPageSize = value;\r\n const data = getStore().data;\r\n if (data) {\r\n getStore().paginator.numberOfPages = Math.ceil(data.length / value);\r\n }\r\n});\r\n\r\nexport const onPageNumberChanged = mutatorAction('onPageNumberChanged', (value: number) => {\r\n getStore().paginator.currentPageNumber = value;\r\n});\r\n\r\nexport const onNumberOfPagesChanged = mutatorAction('onNumberOfPagesChanged', (value: number) => {\r\n getStore().paginator.numberOfPages = value;\r\n});\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { IColumnVisibilityMapping } from '../../GridV2.types';\r\nimport { getGridColumns } from '../selectors/gridSelectors';\r\nimport { getStore } from '../store/store';\r\n\r\nexport const onGridColumnsModified = mutatorAction('onGridColumnsModified', (columnVisibilityMappings: IColumnVisibilityMapping[]) => {\r\n const { entity } = getStore();\r\n const gridColumns = getGridColumns();\r\n\r\n if (entity) {\r\n columnVisibilityMappings.forEach((colVisMap) => {\r\n const gridColumn = gridColumns.find((col) => col.key === colVisMap.columnKey);\r\n\r\n if (gridColumn) {\r\n gridColumn.isVisible = colVisMap.isVisible;\r\n }\r\n });\r\n }\r\n});\r\n","import { getAppStore } from '../../../../@data';\r\nimport { IGridV2Column } from '../../GridV2.types';\r\nimport { getStore } from '../store/store';\r\n\r\nexport const getGridColumns = (): IGridV2Column[] => {\r\n const { entityGridColumns } = getAppStore();\r\n const { entity } = getStore();\r\n\r\n if (entityGridColumns && entity) {\r\n const entityColumns = entityGridColumns.find((entityGridColumn) => entityGridColumn.entity === entity);\r\n return entityColumns ? (entityColumns.gridColumns as IGridV2Column[]) : [];\r\n }\r\n return [];\r\n};\r\n","export const LOADING_SPINNER = 'loading-spinner';\r\nexport const WHITE_PAGE_LOADING_SPINNER = 'white-page-loading-spinner';\r\n\r\nexport const REPORTING_DATE_RANGE_PICKER = 'reporting-date-range-picker';\r\nexport const DATE_RANGE_PICKER_PRESET_CUSTOM = 'date-range-picker-preset-custom';\r\nexport const DATE_RANGE_PICKER_PRESET_TODAY = 'date-range-picker-preset-today';\r\nexport const DATE_RANGE_PICKER_PRESET_YESTERDAY = 'date-range-picker-preset-yesterday';\r\nexport const DATE_RANGE_PICKER_PRESET_THIS_WEEK_SUN_TODAY = 'date-range-preset-this-week-sun-today';\r\nexport const DATE_RANGE_PICKER_PRESET_THIS_WEEK_MON_TODAY = 'date-range-preset-this-week-mon-today';\r\nexport const DATE_RANGE_PICKER_PRESET_LAST_7_DAYS = 'date-range-picker-preset-last-7-days';\r\nexport const DATE_RANGE_PICKER_PRESET_LAST_WEEK_SUN_SAT = 'date-range-picker-preset-last-week-sun-sat';\r\nexport const DATE_RANGE_PICKER_APPLY_BUTTON = 'date-range-picker-apply-button';\r\nexport const GRAIN_SELECTOR_BUTTON = 'granularity-selector-button';\r\nexport const PERFORMANCE_CHART_TYPE_LINE_BUTTON = 'performance-chart-type-line-button';\r\nexport const PERFORMANCE_CHART_TYPE_BAR_BUTTON = 'performance-chart-type-bar-button';\r\nexport const PERFORMANCE_CHART_TYPE_DONUT_BUTTON = 'performance-chart-type-donut-button';\r\nexport const ADUNIT_CHART_TYPE_GRID_BUTTON = 'adunit-chart-type-grid-button';\r\nexport const ADUNIT_CHART_TYPE_BAR_BUTTON = 'adunit-chart-type-bar-button';\r\nexport const ADUNIT_CHART_TYPE_DONUT_BUTTON = 'adunit-chart-type-donut-button';\r\nexport const COUNTRY_CHART_TYPE_MAP_BUTTON = 'country-chart-type-map-button';\r\nexport const COUNTRY_CHART_TYPE_BAR_BUTTON = 'country-chart-type-bar-button';\r\nexport const COUNTRY_CHART_TYPE_GRID_BUTTON = 'country-chart-type-grid-button';\r\nexport const MEDIATION_CHART_TYPE_GRID_BUTTON = 'mediation-chart-type-grid-button';\r\nexport const MEDIATION_CHART_TYPE_BAR_BUTTON = 'mediation-chart-type-bar-button';\r\nexport const MEDIATION_CHART_TYPE_DONUT_BUTTON = 'mediation-chart-type-donut-button';\r\nexport const SITE_CHART_TYPE_BAR_BUTTON = 'site-chart-type-bar-button';\r\nexport const SITE_CHART_TYPE_GRID_BUTTON = 'site-chart-type-grid-button';\r\nexport const SITE_CHART_TYPE_DONUT_BUTTON = 'site-chart-type-donut-button';\r\nexport const CHART_WRAPPER = 'chart-wrapper';\r\nexport const CLARITY_BEHAVIORAL_RADIO_BUTTON = 'clarity-behavioral-radio-button';\r\nexport const CLARITY_BASIC_RADIO_BUTTON = 'clarity-basic-radio-button';\r\nexport const CLARITY_EXISTING_RADIO_BUTTON = 'clarity-existing-radio-button';\r\nexport const PROPERTY_NAME_INPUT = 'property-name-input';\r\nexport const PROPERTY_DOMAIN_INPUT = 'property-domain-input';\r\n","export * from './entityEvaluationMutatorActions';\r\nexport * from './onAdManagementStoreChanged';\r\nexport * from './publisherEvaluationActions';\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n reportTitle: {\r\n id: 'report.reportTitle',\r\n defaultMessage: 'Reports',\r\n },\r\n reportDescriptionForPublisherSelected: {\r\n id: 'report.reportDescriptionForPublisherSelected',\r\n defaultMessage:\r\n // tslint:disable-next-line:max-line-length\r\n 'Reports aren’t available in the latest version of pubCenter yet. To access reports through the previous version, click Go to reports.',\r\n },\r\n reportDescriptionForPublisherNotSelected: {\r\n id: 'report.reportDescriptionForPublisherNotSelected',\r\n defaultMessage:\r\n // tslint:disable-next-line:max-line-length\r\n 'Reports aren’t available in the latest version of pubCenter yet. To access reports through the previous version, please select a publisher first.',\r\n },\r\n reportDescriptionForReportsNotApplicable: {\r\n id: 'report.reportDescriptionForReportsNotApplicable',\r\n defaultMessage: 'Reports aren’t enabled for this publisher.',\r\n },\r\n reportLink: {\r\n id: 'report.reportLink',\r\n defaultMessage: 'Go to reports',\r\n },\r\n metricsDropdownLabel: {\r\n id: 'report.metricsDropdownLabel',\r\n defaultMessage: 'Metrics Dropdown',\r\n },\r\n shareScheduleDropdownLabel: {\r\n id: 'report.shareScheduleDropdownLabel',\r\n defaultMessage: 'Schedule',\r\n },\r\n viewReportLink: {\r\n id: 'report.viewReportLink',\r\n defaultMessage: 'View report',\r\n },\r\n noData: {\r\n id: 'report.noData',\r\n defaultMessage: 'No data matches filters',\r\n },\r\n breakDownBy: {\r\n id: 'report.breakDownBy',\r\n defaultMessage: 'Break down by',\r\n },\r\n toggleChartIcon: {\r\n id: 'report.toggleChartIcon',\r\n defaultMessage: 'Show/Hide chart',\r\n },\r\n chartSelectIcon: {\r\n id: 'report.chartSelectIcon',\r\n defaultMessage: '{chartType} chart',\r\n },\r\n metricPickerEditButtonTitle: {\r\n id: 'report.metricPickerEditButtonTitle',\r\n defaultMessage: 'Add or remove metrics',\r\n },\r\n exportCSV: {\r\n id: 'report.exportCSV',\r\n defaultMessage: 'Export as CSV',\r\n },\r\n exportPNG: {\r\n id: 'report.exportPNG',\r\n defaultMessage: 'Export as PNG',\r\n },\r\n chartIncompatibleFieldsWithFilterWillNotBeShown: {\r\n id: 'report.chartIncompatibleFieldsWithFilterWillNotBeShown',\r\n defaultMessage: '{metrics} values will not be shown when an {dimensions} filter is applied.',\r\n },\r\n chartIncompatibleFieldsWithFilterCantBeShown: {\r\n id: 'report.chartIncompatibleFieldsWithFilterCantBeShown',\r\n defaultMessage: '{metrics} values can not be shown when an {dimensions} filter is applied.',\r\n },\r\n gridIncompatibleFieldsWhenAddingColumnWithFilter: {\r\n id: 'report.gridIncompatibleFieldsWhenAddingColumnWithFilter',\r\n defaultMessage: '{metrics} will not show values because an {dimensions} filter is applied.',\r\n },\r\n gridIncompatibleFieldsWhenAddingColumnWithBreakdown: {\r\n id: 'report.gridIncompatibleFieldsWhenAddingColumnWithBreakdown',\r\n defaultMessage: '{metrics} will not show values because performance is broken down by {dimensions}.',\r\n },\r\n gridIncompatibleFieldsWhenAddingColumnWithFilterAndBreakdown: {\r\n id: 'report.gridIncompatibleFieldsWhenAddingColumnWithFilterAndBreakdown',\r\n defaultMessage: '{metrics} will not show values because performance is filtered and broken down by {dimensions}.',\r\n },\r\n gridIncompatibleFieldsWithFilter: {\r\n id: 'report.gridIncompatibleFieldsWithFilter',\r\n defaultMessage: '{metrics} values can not be shown because an {dimensions} filter is applied.',\r\n },\r\n gridIncompatibleFieldsWithBreakdown: {\r\n id: 'report.gridIncompatibleFieldsWithBreakdown',\r\n defaultMessage: '{metrics} values can not be shown because performance is broken down by {dimensions}.',\r\n },\r\n gridIncompatibleFieldsWithFilterAndBreakdown: {\r\n id: 'report.gridIncompatibleFieldsWithFilterAndBreakdown',\r\n defaultMessage:\r\n '{metrics} values can not be shown because an {dimensions} filter is applied and performance is broken down by {dimensions}.',\r\n },\r\n gridIncompatibleFieldsWhenBreakingDown: {\r\n id: 'report.gridIncompatibleFieldsWhenBreakingDown',\r\n defaultMessage: '{metrics} values will not be shown if broken down by {dimensions}.',\r\n },\r\n topBarExportPNG: {\r\n id: 'topBar.exportPNG',\r\n defaultMessage: 'Generating and exporting PNG',\r\n },\r\n dimensionColumnMembersFailedMessage: {\r\n id: 'report.dimensionColumnMembersFailedMessage',\r\n defaultMessage: \"We're unable to load your publisher details at this time. Please try again later.\",\r\n },\r\n loadingReportSummaryFailedMessage: {\r\n id: 'report.loadingReportSummaryFailedMessage',\r\n defaultMessage: \"We're unable to load your summary.\",\r\n },\r\n loadingReportFailedMessage: {\r\n id: 'report.loadingReportFailedMessage',\r\n defaultMessage: \"We're unable to load your {reportType} report.\",\r\n },\r\n loadingDetailedReportFailedMessage: {\r\n id: 'report.loadingDetailedReportFailedMessage',\r\n defaultMessage: \"We're unable to load your detailed {reportType} report.\",\r\n },\r\n loadingMediationReportFailedMessage: {\r\n id: 'report.loadingMediationReportFailedMessage',\r\n defaultMessage: \"We're unable to load your mediation report.\",\r\n },\r\n loadingReportMetadataFailedMessage: {\r\n id: 'report.loadingReportMetadataFailedMessage',\r\n defaultMessage: \"We're unable to load your metadata for reports.\",\r\n },\r\n loadingPublisherDetailsFailedMessage: {\r\n id: 'report.loadingPublisherDetailsFailedMessage',\r\n defaultMessage:\r\n 'Your publisher details are incomplete. Please make sure that your publisher details are updated so that your site and ad units are reported.',\r\n },\r\n failedToExportReportAsPNG: {\r\n id: 'report.failedToExportReportAsPNG',\r\n defaultMessage: 'Failed to export report as PNG',\r\n },\r\n reportInvalidState: {\r\n id: 'report.reportInvalidState',\r\n defaultMessage: 'You have arrived in an invalid state, please report.',\r\n },\r\n failedToFetchPublisherReportDetails: {\r\n id: 'report.failedToFetchPublisherReportDetails',\r\n defaultMessage: 'Failed to fetch publisher details to determine if reporting is applicable',\r\n },\r\n reportsNotAvailableAtThisTime: {\r\n id: 'report.reportsNotAvailableAtThisTime',\r\n defaultMessage: 'Reports are not available at this time. Please contact support to resolve this issue.',\r\n },\r\n});\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { getAppStore } from '..';\r\n\r\nexport const onLocaleChanged = mutatorAction('onLocaleChanged', (locale?: string) => {\r\n if (locale) {\r\n // locale: en-us\r\n getAppStore().locale = locale.split('-')[0];\r\n }\r\n});\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { PublisherTier } from '../store';\r\n\r\nexport const onSetFirstPartyBoost = mutatorAction('onIsFirstPartyBoost', (publisherTier?: PublisherTier) => {\r\n if (publisherTier === PublisherTier.SelfServe1stPartyBoost) {\r\n sessionStorage.setItem('IsBoostPublisher', 'true');\r\n } else {\r\n sessionStorage.setItem('IsBoostPublisher', 'false');\r\n }\r\n});\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { CustomPanelType } from '../store';\r\nimport { getAppStore } from '../store/store';\r\n\r\nexport const onPanelTypeChanged = mutatorAction('onDialogTypeChanged', (panelType: CustomPanelType) => {\r\n getAppStore().openedPanel = panelType;\r\n});\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { PopupType } from '../store/schema/enums/PopupType';\r\nimport { getAppStore } from '../store/store';\r\n\r\nexport const onPopupOpenChanged = mutatorAction('onPopupOpenChanged', (openedPopup: PopupType) => {\r\n getAppStore().openedPopup = openedPopup;\r\n});","import { mutatorAction } from 'satcheljs';\r\nimport {\r\n IToastNotificationItem,\r\n IToastNotificationItemContent,\r\n ToastType,\r\n} from '../../components/ToastNotification/ToastNotification.types';\r\nimport { getAppStore } from '../store/store';\r\n\r\nexport const showSuccessToastNotification = mutatorAction('showSuccessToastNotification', (content: IToastNotificationItemContent) =>\r\n appendNewNotification(ToastType.success, content)\r\n);\r\n\r\nexport const showInfoToastNotification = mutatorAction('showInfoToastNotification', (content: IToastNotificationItemContent) =>\r\n appendNewNotification(ToastType.info, content)\r\n);\r\n\r\nexport const showWarningToastNotification = mutatorAction('showWarningToastNotification', (content: IToastNotificationItemContent) =>\r\n appendNewNotification(ToastType.warning, content)\r\n);\r\n\r\nexport const showErrorToastNotification = mutatorAction('showErrorToastNotification', (content: IToastNotificationItemContent) =>\r\n appendNewNotification(ToastType.error, content)\r\n);\r\n\r\nexport const showLoadingToastNotification = mutatorAction('showLoadingToastNotification', (content: IToastNotificationItemContent) => {\r\n if (!content.onDismiss) {\r\n throw new Error('onDismiss should be provided');\r\n }\r\n content.suppressAutoDismiss = true;\r\n content.noDismissButton = true;\r\n appendNewNotification(ToastType.loading, content);\r\n});\r\n\r\nexport const removeToastNotification = mutatorAction('removeToastNotification', (notification: IToastNotificationItem) => {\r\n const store = getAppStore();\r\n const notifications = store.toastNotifications || [];\r\n const indexOfNotification = notifications.findIndex((item) => item.id === notification.id);\r\n store.toastNotifications = [...notifications.slice(0, indexOfNotification), ...notifications.slice(indexOfNotification + 1)];\r\n});\r\n\r\nconst appendNewNotification = (type: ToastType, content: IToastNotificationItemContent) => {\r\n const store = getAppStore();\r\n const notifications = store.toastNotifications || [];\r\n store.toastNotifications = [\r\n ...notifications,\r\n {\r\n // tslint:disable-next-line: no-any\r\n id: (crypto as any).randomUUID(),\r\n type,\r\n content,\r\n },\r\n ];\r\n};\r\n","const offlineUrlIdentifiers = [\r\n 'pubcenter2.azurewebsites.net', // nonTython SI LDC2\r\n 'pubcenternext-staging.azurewebsites.net', // nonTython prod LDC2\r\n 'offline.si.monetizenow.microsoft.com', // tython SI LDC2\r\n 'staging.monetizenow.microsoft.com', // tython prod LDC2\r\n];\r\n\r\nconst isOfflineUI = offlineUrlIdentifiers.some((url) => window.location.hostname.indexOf(url) > -1) ? 'offline.' : '';\r\n\r\nconst uiConfigInternal = {\r\n apiBaseAddress:\r\n process.env.REACT_APP_ENV === 'production'\r\n ? `https://${isOfflineUI}search.pubcenter.microsoft.com/api/v{version}`\r\n : `https://${isOfflineUI}search.si.pubcenter.microsoft.com/api/v{version}`,\r\n metadataApiBaseAddess:\r\n process.env.REACT_APP_ENV === 'production'\r\n ? `https://${isOfflineUI}search.pubcenter.microsoft.com/api/v{version}/metadata/clientcenter/`\r\n : `https://${isOfflineUI}search.si.pubcenter.microsoft.com/api/v{version}/metadata/clientcenter/`,\r\n customerMetadataApiBaseAddess:\r\n process.env.REACT_APP_ENV === 'production'\r\n ? `https://${isOfflineUI}search.pubcenter.microsoft.com/api/v{version}/metadata/customer/`\r\n : `https://${isOfflineUI}search.si.pubcenter.microsoft.com/api/v{version}/metadata/customer/`,\r\n adUnitMetadataApiBaseAddress:\r\n process.env.REACT_APP_ENV === 'production'\r\n ? `https://${isOfflineUI}search.pubcenter.microsoft.com/api/v{version}/metadata/adunit/`\r\n : `https://${isOfflineUI}search.si.pubcenter.microsoft.com/api/v{version}/metadata/adunit/`,\r\n adQualityApiBaseAddress:\r\n process.env.REACT_APP_ENV === 'production'\r\n ? `https://${isOfflineUI}search.pubcenter.microsoft.com/api/`\r\n : `https://${isOfflineUI}search.si.pubcenter.microsoft.com/api/`,\r\n reportingDashboardAddress:\r\n process.env.REACT_APP_ENV === 'production'\r\n ? `https://${isOfflineUI}pubcenter.microsoft.com/Dashboard?commonsessionid={commonSessionId}#paidsearchdashboard`\r\n : `https://${isOfflineUI}si.pubcenter.microsoft.com/Dashboard?commonsessionid={commonSessionId}#paidsearchdashboard`,\r\n reportingApiBaseAddress:\r\n process.env.REACT_APP_ENV === 'production'\r\n ? `https://${isOfflineUI}search.pubcenter.microsoft.com/api/preauth/reporting?routeSuffix=api/`\r\n : `https://${isOfflineUI}search.si.pubcenter.microsoft.com/api/preauth/reporting?routeSuffix=api/`,\r\n mediationReportingApiBaseAddress:\r\n process.env.REACT_APP_ENV === 'production'\r\n ? `https://${isOfflineUI}search.pubcenter.microsoft.com/api/preauth/mediation?routeSuffix=api/`\r\n : `https://${isOfflineUI}search.si.pubcenter.microsoft.com/api/preauth/mediation?routeSuffix=api/`,\r\n defaultApiVersion: '1.2',\r\n};\r\n\r\nexport const uiConfig = {\r\n getApiBaseAddress(apiVersion?: string): string {\r\n return uiConfig.replaceApiVersion(uiConfigInternal.apiBaseAddress, apiVersion);\r\n },\r\n\r\n getMetadataApiBaseAddress(apiVersion?: string): string {\r\n return uiConfig.replaceApiVersion(uiConfigInternal.metadataApiBaseAddess, apiVersion);\r\n },\r\n\r\n getCustomerMetadataApiBaseAddress(apiVersion?: string): string {\r\n return uiConfig.replaceApiVersion(uiConfigInternal.customerMetadataApiBaseAddess, apiVersion);\r\n },\r\n\r\n getAdUnitMetadataApiBaseAddress(apiVersion?: string): string {\r\n return uiConfig.replaceApiVersion(uiConfigInternal.adUnitMetadataApiBaseAddress, apiVersion);\r\n },\r\n\r\n getAdQualityApiBaseAddress(apiVersion?: string): string {\r\n return uiConfig.replaceApiVersion(uiConfigInternal.adQualityApiBaseAddress, apiVersion);\r\n },\r\n\r\n getReportingDashboardAddress(commonSessionId: string): string {\r\n return uiConfigInternal.reportingDashboardAddress.replace('{commonSessionId}', commonSessionId);\r\n },\r\n\r\n getDefaultApiVersion(): string {\r\n return uiConfigInternal.defaultApiVersion;\r\n },\r\n\r\n getReportingApiBaseAddress(apiVersion?: string): string {\r\n return uiConfigInternal.reportingApiBaseAddress;\r\n },\r\n\r\n getMediationReportingApiBaseAddress(apiVersion?: string): string {\r\n return uiConfigInternal.mediationReportingApiBaseAddress;\r\n },\r\n\r\n replaceApiVersion(endpointBaseAddress: string, apiVersion?: string): string {\r\n if (!apiVersion) {\r\n apiVersion = uiConfigInternal.defaultApiVersion;\r\n }\r\n\r\n return endpointBaseAddress.replace('{version}', String(apiVersion));\r\n },\r\n\r\n getApexInitUrl(): string {\r\n // This is the endpoint of apex service\r\n // For PROD environment it is https://help.ads.microsoft.com\r\n // For SI environment it is https://help.ads-int.microsoft.com\r\n return process.env.REACT_APP_ENV === 'production' ? 'https://help.ads.microsoft.com' : 'https://help.ads-int.microsoft.com';\r\n },\r\n};\r\n","import { ICommandBarItemProps, ICommandBarProps, IDropdownOption, IShimmeredDetailsListProps, MessageBarType } from '@fluentui/react';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport { LifeCycleStatus, Model } from '../../@data';\r\nimport { IFormTitleStyles } from '../../components/Form';\r\nimport { FilterType, IFilterDetails } from '../../components/GridFilter/GridFilter.types';\r\nimport { ICustomColumn } from '../../types';\r\nimport { IRouterWithIntl } from '../../utils';\r\nimport { IGridStyles } from './GridV2.styles';\r\n\r\nexport interface ISelectableRow extends Model {\r\n isSelected: boolean;\r\n isDisabled?: boolean;\r\n}\r\n\r\nexport interface IGridV2Props<T extends Model> extends IRouterWithIntl {\r\n entity: new () => T;\r\n pageTitle?: IPageTitleProps;\r\n notGridReadyLabel?: string;\r\n isGridReady?: boolean;\r\n isDataLoading?: boolean;\r\n commandBarProps?: IBuildCommandBarProps<T>;\r\n dataGridProps: Omit<IDataGridProps, 'columns' | 'items'>;\r\n paginationProps?: IPaginationProps;\r\n styleProps?: Partial<IGridStyles>;\r\n msgBarProps?: {\r\n className?: string;\r\n messageBarType: MessageBarType;\r\n children: JSX.Element;\r\n onDismiss?: () => void;\r\n };\r\n children?: React.ReactNode;\r\n bypassGridResetting?: boolean;\r\n bypassFiltrationAndSearching?: boolean;\r\n}\r\n\r\nexport interface IPageTitleProps {\r\n title: string;\r\n helpId?: string;\r\n styleProps?: IFormTitleStyles;\r\n}\r\n\r\nexport interface IGridV2Column extends ICustomColumn<Model> {\r\n columnOrder?: number;\r\n isVisible?: boolean;\r\n // If true, disable the checkbox for this column in the modify columns panel\r\n isShowingDisabled?: boolean;\r\n isExportable?: boolean;\r\n // to show shimmer on the column items is not ready\r\n isLoading?: boolean;\r\n // tslint:disable-next-line: no-any\r\n exportFunction?: (rowItem: Model) => any;\r\n /* in case column is rendering custom/derived data */\r\n searchFunction?: (rowItem: Model, searchWord: string) => boolean;\r\n // use this instead of onRender for custom rendering\r\n onRenderData?: (rowItem: Model) => JSX.Element;\r\n csvHeaderName?: string;\r\n incompatibleProps?: {\r\n isIncompatible?: boolean;\r\n incompatibleCantMessage?: string;\r\n incompatibleWontMessage?: string;\r\n };\r\n}\r\n\r\nexport interface IBuildCommandBarProps<T extends Model> {\r\n hasFilter?: boolean;\r\n includeActions?: CommandBarActions[];\r\n includeFarActions?: CommandBarActions[];\r\n excludeActions?: CommandBarActions[];\r\n getCustomCommandBarItems?: (getSelectedItems: () => Model[]) => IGridPageCommandBarItemProps[];\r\n filterItems?: IFilterItem[];\r\n dataQueryProps?: IGridQuery<T>;\r\n primaryButtonLabel?: FormattedMessage.MessageDescriptor;\r\n primaryButtonUrl?: string;\r\n deactivateLabels?: IDestructiveDialogLabelsProps;\r\n deleteLabels?: IDestructiveDialogLabelsProps;\r\n searchBoxPlaceholder?: FormattedMessage.MessageDescriptor;\r\n hideModifyColumnsDescription?: boolean;\r\n onDeactivateDialogDismiss?: () => void;\r\n // Returns the deleted items\r\n onPreDeleteItems?: (items: Model[]) => void;\r\n // Returns the remaining items after deletion\r\n onDeleteItems?: (items: Model[]) => void;\r\n // Returns the deleted items\r\n onPostDeleteItems?: (items: Model[]) => void;\r\n onItemsStatusChanged?: (items: Model[], status: LifeCycleStatus) => void;\r\n onDuplicateItems?: (items: Model[]) => void;\r\n // tslint:disable-next-line: no-any\r\n customApplyFilterFn?: (filterDetails: IFilterDetails[], items: any[]) => any[];\r\n}\r\n\r\nexport interface IDataGridProps extends IShimmeredDetailsListProps {\r\n gridV2Columns: IGridV2Column[];\r\n onColumnsChanged?: (columns: IGridV2Column[]) => void;\r\n onSelectionChanged?: (selectedItems: Model[]) => void;\r\n identifier?: string;\r\n defaultSortBy?: string;\r\n data: Model[];\r\n selectedRows?: Model[];\r\n setData?: (data?: Model[]) => void;\r\n renderZeroItemsComponent?: JSX.Element;\r\n noEntityFound?: FormattedMessage.MessageDescriptor;\r\n renderEmptyGrid?: boolean;\r\n hideDisableStyle?: boolean;\r\n}\r\n\r\nexport interface IPaginationProps {\r\n numberOfPages?: number;\r\n onPageChange?: (pageNumber: number, pageSize: number) => void;\r\n shouldGridHandlePagination?: boolean;\r\n showPagination?: boolean;\r\n}\r\n\r\nexport interface IColumnVisibilityMapping {\r\n columnKey: string;\r\n isVisible: boolean;\r\n}\r\n\r\nexport interface IDestructiveDialogLabelsProps {\r\n title: FormattedMessage.MessageDescriptor;\r\n description?: FormattedMessage.MessageDescriptor;\r\n}\r\n\r\nexport interface IGridQuery<T extends Model> {\r\n models?: (Model | undefined)[];\r\n entity: new () => T;\r\n params?: URLSearchParams;\r\n}\r\n\r\nexport enum CommandBarActions {\r\n new = 'new',\r\n edit = 'edit',\r\n code = 'code',\r\n delete = 'delete',\r\n activate = 'activate',\r\n deactivate = 'deativate',\r\n modifyColumns = 'modifyColumns',\r\n export = 'export',\r\n duplicate = 'duplicate',\r\n upload = 'upload',\r\n download = 'download',\r\n addFilter = 'addFilter',\r\n tokenStatus = 'tokenStatus',\r\n clarity = 'clarity',\r\n searchBox = 'searchBox',\r\n custom = 'custom',\r\n}\r\n\r\nexport interface IGridPageCommandBarItemProps extends IDataGridCommandBarItemProps {\r\n placement: IGridPageCommandBarPlacement; // relative placement of the command bar item\r\n}\r\n\r\nexport interface IGridPageCommandBarItemsProps {\r\n includes?: IGridPageCommandBarItemProps[];\r\n excludes?: CommandBarActions[];\r\n}\r\n\r\nexport interface IGridPageCommandBarPlacement {\r\n direction: Direction;\r\n key?: CommandBarActions;\r\n alignment?: CommandBarItemAlignment;\r\n}\r\n\r\nexport enum Direction {\r\n before,\r\n after,\r\n}\r\n\r\nexport enum CommandBarItemAlignment {\r\n left,\r\n right, // will be added to far actions\r\n}\r\n\r\nexport interface IDataGridCommandBarProps extends ICommandBarProps {\r\n items: IDataGridCommandBarItemProps[];\r\n}\r\n\r\nexport interface IDataGridCommandBarItemProps extends ICommandBarItemProps {\r\n selectionModes?: GridSelectionMode[];\r\n selectionStatus?: LifeCycleStatus;\r\n}\r\n\r\nexport enum GridSelectionMode {\r\n None,\r\n Single,\r\n Multiple,\r\n All,\r\n}\r\n\r\nexport interface IFilterItem {\r\n filterName: string;\r\n /**\r\n * column name in the API (JSON) response data corresponding to this filter item,\r\n * Note: Either customFunction or columnName should be passed for filter to be applied\r\n */\r\n columnName?: string;\r\n filterType: FilterType;\r\n filterOptions?: IDropdownOption[];\r\n /** Define this function to filter grid using a custom defined function */\r\n customFunction?: (dataRow: Model, filterDetails: IFilterDetails) => boolean;\r\n /**\r\n * If checkbox label is provided then user would see a checkbox while applying the filter.\r\n * When checkbox is checked filtered results will include rows with NULL/undefined values\r\n */\r\n showNullsCheckboxLabel?: string;\r\n /**\r\n * Default is false.\r\n * If true, rows with undefined/null values for this column will also be included in the filtered results\r\n */\r\n includeNullsInFilterResults?: boolean;\r\n}\r\n\r\n// To be removed -- Used by AdCreativePage\r\nexport interface IDataGridColumn {\r\n columnName: string;\r\n friendlyName: string;\r\n headerCSV?: string;\r\n isVisible: boolean;\r\n // tslint:disable-next-line: no-any\r\n exportFunction?: (val: any) => any;\r\n isExportColumn?: boolean;\r\n /**\r\n * (Optional) Provide this function to modify the column data.\r\n */\r\n // tslint:disable-next-line: no-any\r\n displayFunction?: (val: any, item?: any) => any;\r\n}\r\n\r\nexport enum DownloadOption {\r\n page,\r\n selection,\r\n all,\r\n}\r\n","import React from 'react';\r\n\r\nexport const isButtonPressKey = (key: string): boolean => {\r\n /* Based on Accessibility standard keystrokes for button press, keyboardEvents for key press of\r\n Enter and Space (encoded as ' ') are considered for button press\r\n https://www.w3.org/TR/uievents-key/#named-key-attribute-values */\r\n if (key === 'Enter' || key === ' ') {\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\nexport function isKey(event: React.KeyboardEvent, key: string): boolean {\r\n return event.key === key;\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n 'reportMetadata.grains.None': { id: 'reportMetadata.grains.None', defaultMessage: 'None' },\r\n 'reportMetadata.grains.Hour': { id: 'reportMetadata.grains.Hour', defaultMessage: 'Hourly' },\r\n 'reportMetadata.grains.Day': { id: 'reportMetadata.grains.Day', defaultMessage: 'Daily' },\r\n 'reportMetadata.grains.Week': { id: 'reportMetadata.grains.Week', defaultMessage: 'Weekly' },\r\n 'reportMetadata.grains.Month': { id: 'reportMetadata.grains.Month', defaultMessage: 'Monthly' },\r\n 'reportMetadata.grains.MonthAndYear': { id: 'reportMetadata.grains.MonthAndYear', defaultMessage: 'Monthly' },\r\n 'reportMetadataColumns.ImpressionsServed': { id: 'reportMetadataColumns.ImpressionsServed', defaultMessage: 'Filled impressions' },\r\n 'reportMetadataColumns.ImpressionsViewed': { id: 'reportMetadataColumns.ImpressionsViewed', defaultMessage: 'Viewable impressions' },\r\n 'reportMetadataColumns.Viewability': { id: 'reportMetadataColumns.Viewability', defaultMessage: 'Viewability rate' },\r\n 'reportMetadataColumns.Revenue': { id: 'reportMetadataColumns.Revenue', defaultMessage: 'Revenue' },\r\n 'reportMetadataColumns.FillRate': { id: 'reportMetadataColumns.FillRate', defaultMessage: 'Fill rate' },\r\n 'reportMetadataColumns.eCPM': { id: 'reportMetadataColumns.eCPM', defaultMessage: 'eCPM' },\r\n 'reportMetadataColumns.Clicks': { id: 'reportMetadataColumns.Clicks', defaultMessage: 'Clicks' },\r\n 'reportMetadataColumns.CTR': { id: 'reportMetadataColumns.CTR', defaultMessage: 'CTR' },\r\n 'reportMetadataColumns.DateTime': { id: 'reportMetadataColumns.DateTime', defaultMessage: 'Date' },\r\n 'reportMetadataColumns.AdUnitName': { id: 'reportMetadataColumns.AdUnitName', defaultMessage: 'Ad unit' },\r\n 'reportMetadataColumns.AdType': { id: 'reportMetadataColumns.AdType', defaultMessage: 'Ad type' },\r\n 'reportMetadataColumns.PropertyUrl': { id: 'reportMetadataColumns.PropertyUrl', defaultMessage: 'Site URL' },\r\n 'reportMetadataColumns.Country': { id: 'reportMetadataColumns.Country', defaultMessage: 'Country' },\r\n 'reportMetadataColumns.CurrencyCode': { id: 'reportMetadataColumns.CurrencyCode', defaultMessage: 'Currency' },\r\n 'reportMetadataColumns.Impressions': {\r\n id: 'reportMetadataColumns.Impressions',\r\n defaultMessage: 'Filled Impressions',\r\n },\r\n 'reportMetadataColumns.AdClicks': { id: 'reportMetadataColumns.AdClicks', defaultMessage: 'Clicks' },\r\n 'reportMetadataColumns.AdCTR': { id: 'reportMetadataColumns.AdCTR', defaultMessage: 'CTR' },\r\n 'reportMetadataColumns.AdECPM': { id: 'reportMetadataColumns.AdECPM', defaultMessage: 'eCPM' },\r\n 'reportMetadataColumns.ViewableImpressions': {\r\n id: 'reportMetadataColumns.ViewableImpressions',\r\n defaultMessage: 'Viewable Impressions',\r\n },\r\n 'reportMetadataColumns.MeasurableImpressions': {\r\n id: 'reportMetadataColumns.MeasurableImpressions',\r\n defaultMessage: 'Measurable Impressions',\r\n },\r\n 'reportMetadataColumns.ImpressionsRate': {\r\n id: 'reportMetadataColumns.ImpressionsRate',\r\n defaultMessage: 'Impressions %',\r\n },\r\n 'reportMetadataColumns.EligibleImpressions': {\r\n id: 'reportMetadataColumns.EligibleImpressions',\r\n defaultMessage: 'Eligible Impressions',\r\n },\r\n 'reportMetadataColumns.MeasurableImpressionsRate': {\r\n id: 'reportMetadataColumns.MeasurableImpressionsRate',\r\n defaultMessage: 'Measurable Impressions %',\r\n },\r\n 'reportMetadataColumns.ResponsesServed': {\r\n id: 'reportMetadataColumns.ResponsesServed',\r\n defaultMessage: 'Responses Served',\r\n },\r\n 'reportMetadataColumns.Date': { id: 'reportMetadataColumns.Date', defaultMessage: 'Date' },\r\n 'reportMetadataColumns.AdUnitId': {\r\n id: 'reportMetadataColumns.AdUnitId',\r\n defaultMessage: 'AdUnitId',\r\n },\r\n\r\n 'reportMetadataColumns.OperatingSystem': {\r\n id: 'reportMetadataColumns.OperatingSystem',\r\n defaultMessage: 'Operating System',\r\n },\r\n 'reportMetadataColumns.SiteName': { id: 'reportMetadataColumns.SiteName', defaultMessage: 'Site' },\r\n});\r\n","import { FormattedMessage, MessageValue } from 'react-intl';\r\nimport ReportMetadataMessages from '../ReportMetadata.messages';\r\n\r\nexport type FormatMessageFuncType = (\r\n messageDescriptor: FormattedMessage.MessageDescriptor,\r\n values?:\r\n | {\r\n [key: string]: MessageValue;\r\n }\r\n | undefined\r\n) => string;\r\n\r\nexport function getReportMetadataGrainMessageId(key) {\r\n return `reportMetadata.grains.${key}`;\r\n}\r\nexport function getReportMetadataColumnMessageId(key) {\r\n return `reportMetadataColumns.${key}`;\r\n}\r\n\r\nexport function getReportColumnMetadataDisplayName(key: string, formatMessage: FormatMessageFuncType) {\r\n if (!key) {\r\n return '';\r\n }\r\n const messageId = getReportMetadataColumnMessageId(key);\r\n return formatReportMetadataMessageById(formatMessage, messageId);\r\n}\r\nexport function getReportGrainsMetadataDisplayName(key: string, formatMessage: FormatMessageFuncType) {\r\n const messageId = getReportMetadataGrainMessageId(key);\r\n return formatReportMetadataMessageById(formatMessage, messageId);\r\n}\r\n\r\nfunction formatReportMetadataMessageById(formatMessage: FormatMessageFuncType, messageId: string) {\r\n if (!ReportMetadataMessages[messageId]) {\r\n return '';\r\n }\r\n return formatMessage(ReportMetadataMessages[messageId]);\r\n}\r\n","import { createStore } from 'satcheljs';\r\nimport { IWindowSize } from '../index.types';\r\n\r\nexport const getStore = createStore<IWindowSize>('WindowSize', {\r\n width: window?.innerWidth,\r\n height: window?.innerHeight,\r\n});\r\n","// The feature of Partner Codes is only enabled for the following publishers\r\nexport const partnerCodesEnabledPublishers =\r\n process.env.REACT_APP_ENV === 'production' ?\r\n [\r\n '230887', // Live Search (Prod)\r\n \r\n '251148833', // Contoso Limited (test publisher on Prod)\r\n\r\n // Add other Prod publishers here\r\n ]:\r\n [\r\n '279554782', // SI Clone MSN Native (SI)\r\n\r\n // Add other SI publishers here\r\n ];\r\n\r\nexport const isPartnerCodeEnabled = (publisherId: string | undefined): boolean => {\r\n if (partnerCodesEnabledPublishers.includes(publisherId ?? '0')) {\r\n return true;\r\n }\r\n\r\n return false;\r\n};","import { getAppStore, handleError, onAuthLogout } from '..';\r\nimport { Log } from '../../../logging/src';\r\nimport { aadConfig } from '../../config/pubCenterAAD.config';\r\nimport { fetchPubCenterAADAccessTokenAsync } from '../services/PubCenterAADAuthService';\r\nimport { UserContext } from '../store/schema';\r\nimport { TokenType } from '../store/schema/enums/TokenType';\r\n\r\nconst tokenHeaderMap = {\r\n [TokenType.SessionGuid]: 'CommonSessionId',\r\n [TokenType.PubCenterAADToken]: 'PubCenterAuthenticationToken',\r\n};\r\n\r\nexport async function buildRequestHeadersWithAuthToken(\r\n url: string,\r\n userContext?: UserContext,\r\n includeDefaultHeaders = true\r\n): Promise<Headers> {\r\n if (!userContext) {\r\n userContext = getAppStore().userContext;\r\n }\r\n\r\n const defaultHeaders = [['content-type', 'application/json']];\r\n const tokenHeader = tokenHeaderMap[TokenType.PubCenterAADToken];\r\n const token = await fetchPubCenterAADAccessTokenAsync();\r\n\r\n if (userContext && token) {\r\n const headers = new Headers([[tokenHeader, token]]);\r\n\r\n // include default headers\r\n if (includeDefaultHeaders) {\r\n defaultHeaders.forEach((header) => headers.append(header[0], header[1]));\r\n }\r\n\r\n // Add custom headers for all mediation requests\r\n if (url.includes('preauth')) {\r\n headers.append('PublisherIds', getAppStore().publisher!.id.toString());\r\n headers.append('AccountIds', getAppStore().account!.id.toString());\r\n }\r\n\r\n headers.append('DevToken', aadConfig.auth.devToken.toString());\r\n\r\n return headers;\r\n } else {\r\n Log.error('User not logged in or authentication failed');\r\n onAuthLogout();\r\n\r\n return handleError(new Error('Invalid login, please login'), url);\r\n }\r\n}\r\n","import { createStore } from 'satcheljs';\r\nimport { IUserViewState } from './schema/IUserViewState';\r\n\r\nexport const getStore = createStore<IUserViewState>('UserState', {\r\n active: {},\r\n errors: {},\r\n userInvitations: []\r\n});\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { ClarityStatus, Property } from '../../../../../../@data';\r\nimport { PropertyServingConfigs } from '../../../../../../@data/store/schema/models/ServingConfigs';\r\nimport { getGridPropertyStore } from '../store/store';\r\n\r\nexport const setPropertyData = mutatorAction('setSitesData', (data?: Property[]) => {\r\n getGridPropertyStore().data = data;\r\n});\r\n\r\nexport const setLoading = mutatorAction('setLoading', (loading: boolean) => {\r\n getGridPropertyStore().isLoading = loading;\r\n});\r\n\r\nexport const setFetchingData = mutatorAction('setFetchingData', (isFetching: boolean) => {\r\n getGridPropertyStore().isFetchingData = isFetching;\r\n});\r\n\r\nexport const setPropertiesServingConfigs = mutatorAction('setPropertiesServingConfigs', (configs: PropertyServingConfigs[]) => {\r\n getGridPropertyStore().servingConfigs = configs;\r\n});\r\n\r\nexport const setPropertiesFetching = mutatorAction('setPropertiesFetching', (isFetching: boolean) => {\r\n getGridPropertyStore().isFetchingPropertyStatus = isFetching;\r\n});\r\n\r\nexport const setClarityPanelVisibility = mutatorAction('setClarityPanelVisibility', (isOpen: boolean) => {\r\n getGridPropertyStore().isPanelOpen = isOpen;\r\n});\r\n\r\nexport const setCodePanelVisibility = mutatorAction(\r\n 'setCodePanelVisibility',\r\n (isOpen: boolean, property?: string, clarityStatus?: ClarityStatus) => {\r\n getGridPropertyStore().isCodePanelOpen = isOpen;\r\n getGridPropertyStore().selectedPropertyId = property;\r\n if (!isOpen) {\r\n getGridPropertyStore().clarityPanel = undefined;\r\n } else {\r\n getGridPropertyStore().clarityPanel = {\r\n clarityStatus: clarityStatus,\r\n };\r\n }\r\n }\r\n);\r\n\r\nexport const setSelectedPropertyId = mutatorAction('setSelectedPropertyId', (id: string) => {\r\n getGridPropertyStore().selectedPropertyId = id;\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n title: {\r\n id: 'userManagement.title',\r\n defaultMessage: 'User management',\r\n },\r\n usersTab: {\r\n id: 'userManagement.usersTab',\r\n defaultMessage: 'Team users',\r\n },\r\n userInvitationsTab: {\r\n id: 'userManagement.userInvitationsTab',\r\n defaultMessage: 'User invitations',\r\n },\r\n email: {\r\n id: 'userManagement.email',\r\n defaultMessage: 'Email',\r\n },\r\n actions: {\r\n id: 'userManagement.actions',\r\n defaultMessage: 'Actions',\r\n },\r\n role: {\r\n id: 'userManagement.role',\r\n defaultMessage: 'Role',\r\n },\r\n noEntityFound: {\r\n id: 'userManagement.noEntityFound',\r\n defaultMessage: 'No users found for this publisher, invite an user',\r\n },\r\n gridNotReadyLabel: {\r\n id: 'userManagement.gridNotReadyLabel',\r\n defaultMessage: 'Publisher context is not set in this session. Try logging out and login again.',\r\n },\r\n superAdminDesc: {\r\n id: 'userManagement.superAdminDesc',\r\n defaultMessage: `Can access and control the publisher's account.`,\r\n },\r\n accountManagerDesc: {\r\n id: 'userManagement.accountManagerDesc',\r\n defaultMessage: `Can partially manage the publisher's account.`,\r\n },\r\n reportUserDesc: {\r\n id: 'userManagement.reportUserDesc',\r\n defaultMessage: 'Can view account information and reporting.',\r\n },\r\n superAdmin: {\r\n id: 'userManagement.userpage.superAdmin',\r\n defaultMessage: 'Super admin',\r\n },\r\n accountManager: {\r\n id: 'userManagement.accountManager',\r\n defaultMessage: 'Account manager',\r\n },\r\n reportUser: {\r\n id: 'userManagement.reportUser',\r\n defaultMessage: 'Reporting user',\r\n },\r\n changeUserRole: {\r\n id: 'userManagement.changeUserRole',\r\n defaultMessage: 'Change user role',\r\n },\r\n roleChangePanelDesc: {\r\n id: 'userManagement.roleChangePanelDesc',\r\n defaultMessage: `Please select a new user role.`,\r\n },\r\n deleteConfirmationDialogTitle: {\r\n id: 'publisherShellTab.deleteConfirmationDialogTitle',\r\n defaultMessage: 'Are you sure that you want to delete this user?',\r\n },\r\n deleteConfirmationDialogDesc: {\r\n id: 'publisherShellTab.deleteConfirmationDialogDesc',\r\n defaultMessage: `This action will permanently delete the selected user and all data.`,\r\n },\r\n confirmActionMessage: {\r\n id: 'publisherShellTab.confirmActionMessage',\r\n defaultMessage: `Enter \"yes\" to confirm that you want to permanently delete this user.`,\r\n },\r\n deleteButtonText: {\r\n id: 'publisherShellTab.deleteButtonText',\r\n defaultMessage: `Delete user`,\r\n },\r\n searchByNamePlaceholder: {\r\n id: 'app.searchByNamePlaceholder',\r\n defaultMessage: 'Search by Name',\r\n },\r\n loadUserDetailsFailed: {\r\n id: 'loadUserDetails.failed',\r\n defaultMessage: 'We’re unable to load your user details at this time. Please try again later.',\r\n },\r\n userRoleChangeFailed: {\r\n id: 'userRoleChange.failed',\r\n defaultMessage: 'Something went wrong while submitting the user role change. Please try again later.',\r\n },\r\n userManagementInvalidState: {\r\n id: 'userManagement.invalidState',\r\n defaultMessage: 'You have arrived in an invalid state, please re-login or report if issue persists.',\r\n },\r\n userManagementFailedToDeleteItem: {\r\n id: 'userManagement.failedToDeleteItem',\r\n defaultMessage: 'Failed to delete item',\r\n },\r\n editedUserRoleSuccessfully: {\r\n id: 'userManagement.editedUserRoleSuccessfully',\r\n defaultMessage: 'Edited user role for user {username} successfully',\r\n },\r\n});\r\n","import { createStore } from 'satcheljs';\r\nimport '../orchestrators';\r\nimport { IAdManagementViewState } from './schema/IAdManagementViewState';\r\n\r\nexport enum RouteName {\r\n default = 'default',\r\n adunit = 'adunit',\r\n channel = 'channel',\r\n adfilter = 'adfilter',\r\n property = 'property',\r\n adquality = 'adquality',\r\n home = 'home',\r\n inventory = 'inventory',\r\n ads = 'ads',\r\n dashboard = 'dashboard',\r\n adblock = 'adblock',\r\n publisherProfile = 'publisherProfile' /* Tython account/profile management tab */,\r\n userSettings = 'userSettings',\r\n reportDetails = 'report-details',\r\n support = 'support',\r\n auditHistory = 'auditHistory',\r\n}\r\n\r\nexport const PUBLISHER_BASED_ROUTES = [\r\n RouteName.property,\r\n RouteName.adquality,\r\n RouteName.home,\r\n RouteName.adblock,\r\n RouteName.dashboard,\r\n RouteName.publisherProfile,\r\n];\r\n\r\nexport const defaultRoute = RouteName.adunit;\r\n\r\nexport const getAdManagementStore = createStore<IAdManagementViewState>('AdManagementViewState', {\r\n panelIsOpen: false,\r\n doNotRenderDefaultPage: false,\r\n});\r\n","import { ApiErrorCodes, TokenType, getAppStore, handleDomainRedirection, onAuthLogout } from '..';\r\nimport { Log } from '../../../logging/src';\r\nimport { PUBCENTER_TYTHON_DOMAIN_MAPPING, USER_SIGNUP_KEY } from '../../constants';\r\nimport { isLocationPubCenter } from '../../utils';\r\nimport { showTokenExpirationNotification } from '../actions/onTokenExpirationActions';\r\nimport { ApiError } from '../services/ApiService';\r\nimport { loginUserWithAdditionalClaims } from '../services/PubCenterAADAuthService';\r\nimport { IResponse } from '../store/schema';\r\n\r\nexport async function handleApiErrors<T>(response: Response, url: string, errorLogMessage?: string): Promise<T> {\r\n let errorObj: Error;\r\n const responseJson: IResponse<T> = await response.json();\r\n const { userContext } = getAppStore();\r\n\r\n switch (response.status) {\r\n case 302: // Redirect\r\n if (responseJson.data) {\r\n if (isLocationPubCenter()) {\r\n Log.write('HandleApiError - Tython user, redirecting to new domain');\r\n handleDomainRedirection(userContext?.userName ?? userContext?.email);\r\n }\r\n return Promise.resolve({} as T);\r\n }\r\n errorObj = new ApiError(302, JSON.stringify(responseJson)); // placeholder, will not be used\r\n break;\r\n case 401:\r\n // Promt the user to re-login in case additional claim challenge is presented by the API\r\n if (userContext?.tokenType === TokenType.PubCenterAADToken && response.headers.has('WWW-Authenticate')) {\r\n loginUserWithAdditionalClaims(response.headers.get('WWW-Authenticate'));\r\n errorObj = new ApiError(401, JSON.stringify(responseJson));\r\n break;\r\n }\r\n\r\n const errorCode = responseJson.errors?.[0]?.code;\r\n\r\n if (errorCode === ApiErrorCodes.UserDoesNotExist) {\r\n if (localStorage.getItem(USER_SIGNUP_KEY) === 'true') {\r\n const origin = isLocationPubCenter() ? PUBCENTER_TYTHON_DOMAIN_MAPPING[window.location.host] : window.location.origin;\r\n const signupPageRoute = encodeURI(origin + '/signup');\r\n Log.write(`User does not exist, redirecting to new domain signup page: ${signupPageRoute}`);\r\n\r\n window.location.replace(signupPageRoute);\r\n } else {\r\n const UserDoesNotExistPageRoute = encodeURI(window.location.origin + '/user-does-not-exist');\r\n Log.error(`Redirecting to ${UserDoesNotExistPageRoute} error page`);\r\n\r\n window.location.replace(UserDoesNotExistPageRoute);\r\n }\r\n } else if (\r\n errorCode &&\r\n [\r\n ApiErrorCodes.InvalidOAuthToken,\r\n ApiErrorCodes.InvalidCCAuthToken,\r\n ApiErrorCodes.InvalidUserCredentials,\r\n ApiErrorCodes.UserAlreadyMigrated,\r\n ApiErrorCodes.UserIdNotFound,\r\n ].includes(errorCode as ApiErrorCodes)\r\n ) {\r\n Log.error(`User scope call failed, logging out the user with error code: ${errorCode}`);\r\n showTokenExpirationNotification();\r\n onAuthLogout({ isTokenExpired: true });\r\n }\r\n errorObj = new ApiError(\r\n 401,\r\n responseJson.errors ? JSON.stringify(responseJson) : 'The user does not have the necessary role permissions for this operation'\r\n );\r\n break;\r\n case 403:\r\n errorObj = new ApiError(403, responseJson.errors ? JSON.stringify(responseJson.errors) : 'Forbidden');\r\n break;\r\n case 404:\r\n errorObj = new ApiError(404, responseJson.errors ? JSON.stringify(responseJson.errors) : 'Not Found');\r\n break;\r\n case 400:\r\n errorObj = new ApiError(400, responseJson.errors ? JSON.stringify(responseJson.errors) : 'Bad Request');\r\n break;\r\n case 500:\r\n errorObj = new ApiError(500, responseJson.errors ? JSON.stringify(responseJson.errors) : 'Internal server error');\r\n break;\r\n default:\r\n errorObj = new Error(responseJson.errors ? JSON.stringify(responseJson) : 'Invalid response');\r\n break;\r\n }\r\n return handleError(errorObj, url, errorLogMessage);\r\n}\r\n\r\nexport function handleError<T>(error: Error, url: string, errorMessage?: string): Promise<T> {\r\n Log.error(errorMessage ?? `Error: ${error.message} occurred for the API URL: ${url}`);\r\n return Promise.reject(error);\r\n}\r\n","import { AriaLoggerManager } from \"./AriaLoggerManager\";\r\nimport { ConsoleLoggerManager } from \"./ConsoleLoggerManager\";\r\nimport { DefaultLogUserContext } from \"./DefaultLogUserContext\";\r\nimport { Environment } from \"./Environment\";\r\nimport { ILogManager } from \"./ILogManager\";\r\nimport { ILogUserContext } from \"./ILogUserContext\";\r\nimport { LoggingUtils } from \"./LoggingUtils\";\r\nimport { LogType } from \"./LogType\";\r\n\r\n/**\r\n * This class uses the singleton design pattern\r\n * 1. Ensures that ONLY 1 instance of class exists, all through the session\r\n * 2. Provides global access to that single instance\r\n *\r\n * This is facilitated through (a) private constructor and (b) providing a static\r\n * method that returns a reference to the instance\r\n * Ref: https://en.wikipedia.org/wiki/Singleton_pattern\r\n */\r\n\r\nexport class Log {\r\n get DefaultLogUserContext(): ILogUserContext {\r\n return Log.logUserContext;\r\n }\r\n set DefaultLogUserContext(context: ILogUserContext) {\r\n Log.logUserContext = context;\r\n }\r\n\r\n public static Instance: Log;\r\n private static logParams={};\r\n private static logManagers: ILogManager[] = [];\r\n private static logUserContext: ILogUserContext;\r\n\r\n public static getInstance(logParams={}): Log {\r\n if (Log.Instance === undefined ) {\r\n Log.Instance = new Log();\r\n }\r\n Log.logParams = logParams;\r\n return Log.Instance;\r\n }\r\n\r\n public static write(logMessage: string | number | object, logtype=LogType.INFO): void {\r\n for (const logManager of Log.logManagers) {\r\n logManager.log(logtype, logMessage, new DefaultLogUserContext());\r\n }\r\n }\r\n\r\n public static info(logMessage: string | number | object): void {\r\n this.write(logMessage, LogType.INFO)\r\n }\r\n\r\n public static debug(logMessage: string | number | object): void {\r\n this.write(logMessage, LogType.DEBUG)\r\n }\r\n\r\n public static warn(logMessage: string | number | object): void {\r\n this.write(logMessage, LogType.WARN)\r\n }\r\n\r\n public static error(logMessage: string | number | object): void {\r\n this.write(logMessage, LogType.ERROR)\r\n }\r\n\r\n private constructor() {\r\n const environment = LoggingUtils.getEnvironment();\r\n Log.logManagers = new Array<ILogManager>();\r\n\r\n // If the app is running on local host, just write to console\r\n // For all other envs(based on trace level), write to both ARIA and console\r\n if (environment !== Environment.TEST) {\r\n Log.logManagers.push(new AriaLoggerManager(Log.logParams));\r\n }\r\n Log.logManagers.push(new ConsoleLoggerManager());\r\n }\r\n}\r\n","import atlas, { AuthenticationType, ControlPosition, Popup, control } from 'azure-maps-control';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { useI18n } from '../../../i18n/useI18n';\r\nimport { getAppStore } from '../../@data/store/store';\r\nimport { getStore } from '../../pages/ad-management/Account/Settings/@data/store/store';\r\nimport { IGeoJSONFeature } from './GeoJson.types';\r\nimport './styles.css';\r\n\r\ninterface IBubbleLayerProps {\r\n data: IGeoJSONFeature[];\r\n}\r\n\r\nconst option: atlas.Options = {\r\n center: [-100, 40],\r\n zoom: 1,\r\n style: 'grayscale_light',\r\n authOptions: {\r\n authType: AuthenticationType.subscriptionKey,\r\n subscriptionKey: process.env.REACT_APP_AZURE_MAPS_SUB,\r\n },\r\n};\r\n\r\nconst BubbleLayer: React.FC<IBubbleLayerProps> = ({ data }) => {\r\n const [popup] = useState<Popup>(new Popup({ closeButton: false }));\r\n const { publisher, userContext } = getAppStore();\r\n const { systemPreferences } = getStore().active;\r\n const { locale } = useI18n({ systemPreferences, publisher, userContext });\r\n option.language = locale;\r\n\r\n // Calculate min and max values from the data\r\n const values = data.map((feature) => feature.properties.value);\r\n const minValue = Math.min(...values);\r\n const maxValue = Math.max(...values);\r\n\r\n useEffect(() => {\r\n try {\r\n // Add CSS link\r\n const link = document.createElement('link');\r\n link.href = 'https://atlas.microsoft.com/sdk/javascript/mapcontrol/3/atlas.min.css';\r\n link.rel = 'stylesheet';\r\n document.head.appendChild(link);\r\n\r\n // Add JS script\r\n const script = document.createElement('script');\r\n script.src = 'https://atlas.microsoft.com/sdk/javascript/mapcontrol/3/atlas.min.js';\r\n script.async = false;\r\n document.body.appendChild(script);\r\n\r\n // Cleanup function to remove the script and link tags when the component unmounts\r\n return () => {\r\n document.head.removeChild(link);\r\n document.body.removeChild(script);\r\n };\r\n } catch (error) {\r\n console.error('Error loading Azure Maps SDK:', error);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n try {\r\n const mapInstance = new atlas.Map('myMap', option);\r\n console.log('Map instance created successfully.');\r\n\r\n mapInstance.events.add('ready', () => {\r\n mapInstance.controls.add(new control.ZoomControl(), {\r\n position: ControlPosition.TopRight,\r\n });\r\n\r\n const datasource = new atlas.source.DataSource();\r\n mapInstance.sources.add(datasource);\r\n datasource.add(data);\r\n\r\n const bubbleLayer = new atlas.layer.BubbleLayer(datasource, undefined, {\r\n radius: [\r\n 'interpolate',\r\n ['linear'],\r\n ['ln', ['get', 'value']],\r\n Math.log(minValue),\r\n 25, // Minimum value -> Radius 25\r\n Math.log(maxValue),\r\n 60, // Maximum value -> Radius 60\r\n ],\r\n color: '#B7CAEC', // Fixed color for all bubbles\r\n strokeWidth: 0,\r\n filter: ['has', 'value'], // Only render data points which have a value property\r\n });\r\n mapInstance.layers.add(bubbleLayer);\r\n\r\n const symbolLayer = new atlas.layer.SymbolLayer(datasource, undefined, {\r\n iconOptions: {\r\n image: 'none', // Hide the icon image.\r\n },\r\n textOptions: {\r\n textField: ['get', 'value'],\r\n offset: [0, 0.4],\r\n },\r\n });\r\n mapInstance.layers.add(symbolLayer);\r\n\r\n mapInstance.events.add('mouseover', bubbleLayer, (e: atlas.MapMouseEvent) => {\r\n if (e.shapes && e.shapes.length > 0) {\r\n const shape = e.shapes[0] as atlas.Shape;\r\n const properties = shape.getProperties();\r\n const coordinates = shape.getCoordinates() as atlas.data.Position;\r\n const popupContent = `<div class=\"tooltip\">\r\n <div class=\"tooltip-header\">\r\n <span class=\"tooltip-dot\"></span>\r\n <span class=\"tooltip-title\">${properties.name}</span>\r\n </div>\r\n <div class=\"tooltip-content\">\r\n ${properties.dimension}: ${properties.formattedValue}\r\n </div>\r\n</div>\r\n`;\r\n popup.setOptions({\r\n position: coordinates,\r\n content: popupContent,\r\n pixelOffset: [0, 0],\r\n });\r\n popup.open(mapInstance);\r\n }\r\n });\r\n\r\n mapInstance.events.add('mouseout', bubbleLayer, () => {\r\n popup.close();\r\n });\r\n });\r\n\r\n return () => {\r\n if (mapInstance) {\r\n mapInstance.dispose();\r\n }\r\n };\r\n } catch (error) {\r\n console.error('Error initializing map:', error);\r\n }\r\n }, [data, maxValue, minValue, popup]);\r\n\r\n return <div id=\"myMap\" style={{ height: '300px' }} />;\r\n};\r\n\r\nexport default BubbleLayer;\r\n","import * as HighCharts from 'highcharts';\r\nimport HighChartsWrapper from 'highcharts-react-official';\r\nimport * as HighChartsMap from 'highcharts/highmaps';\r\nimport highchartsAccessibility from 'highcharts/modules/accessibility';\r\nhighchartsAccessibility(HighCharts);\r\nhighchartsAccessibility(HighChartsMap);\r\nexport { HighCharts, HighChartsMap, HighChartsWrapper };\r\n","import React from 'react';\r\nimport { IDataMetric } from '../../../types';\r\nimport { HighCharts, HighChartsMap, HighChartsWrapper } from '../HighChartsLibrary';\r\n\r\nexport interface IHighChartProps extends IDataMetric {\r\n options?: HighCharts.Options;\r\n chartComponentRef: React.RefObject<HighChartsWrapper.RefObject>;\r\n}\r\nexport const CustomChart = ({ options, dataMetric, chartComponentRef }: IHighChartProps) => {\r\n const finalOptions: HighCharts.Options = {\r\n credits: {\r\n enabled: false,\r\n },\r\n chart: {\r\n scrollablePlotArea: {\r\n minWidth: 700,\r\n },\r\n reflow: true,\r\n events: {\r\n render: function () {\r\n this.reflow();\r\n },\r\n },\r\n },\r\n title: {\r\n text: '',\r\n },\r\n xAxis: {\r\n type: 'datetime',\r\n },\r\n tooltip: {\r\n shared: true,\r\n },\r\n ...options,\r\n };\r\n return <HighChartsWrapper ref={chartComponentRef} highcharts={HighCharts} options={finalOptions} constructorType={'chart'} />;\r\n};\r\nexport const CustomMapChart = ({ options, dataMetric, chartComponentRef }: IHighChartProps) => {\r\n const finalOptions: HighCharts.Options = {\r\n credits: {\r\n enabled: false,\r\n },\r\n chart: {\r\n scrollablePlotArea: {\r\n minWidth: 700,\r\n },\r\n reflow: true,\r\n events: {\r\n render: function () {\r\n this.reflow();\r\n },\r\n },\r\n },\r\n title: {\r\n text: '',\r\n },\r\n xAxis: {\r\n type: 'datetime',\r\n },\r\n tooltip: {\r\n shared: true,\r\n },\r\n ...options,\r\n };\r\n return <HighChartsWrapper ref={chartComponentRef} highcharts={HighChartsMap} options={finalOptions} constructorType={'mapChart'} />;\r\n};\r\n","/* Helper class for authentication. Mostly used today for MSA authentication.\r\n Can also be extended for AAD authentication if not using adal.js.\r\n */\r\nexport class AuthenticationUtils {\r\n public static createNewGuid(): string {\r\n const guidHolder: string = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';\r\n const hex: string = '0123456789abcdef';\r\n let r: number = 0;\r\n let guidResponse: string = '';\r\n for (let i: number = 0; i < 36; i++) {\r\n if (guidHolder[i] !== '-' && guidHolder[i] !== '4') {\r\n // each x and y needs to be random\r\n // tslint:disable-next-line: no-bitwise\r\n r = (Math.random() * 16) | 0;\r\n }\r\n if (guidHolder[i] === 'x') {\r\n guidResponse += hex[r];\r\n } else if (guidHolder[i] === 'y') {\r\n // clock-seq-and-reserved first hex is filtered and remaining hex values are random\r\n // tslint:disable-next-line: no-bitwise\r\n r &= 0x3; // bit and with 0011 to set pos 2 to zero ?0??\r\n // tslint:disable-next-line: no-bitwise\r\n r |= 0x8; // set pos 3 to 1 as 1???\r\n guidResponse += hex[r];\r\n } else {\r\n guidResponse += guidHolder[i];\r\n }\r\n }\r\n return guidResponse;\r\n }\r\n}\r\n","import { IStyle, classNamesFunction } from '@fluentui/react';\r\nimport React from 'react';\r\nexport interface IZeroTotalChartStyles {\r\n root: IStyle;\r\n}\r\nexport const getStyles = (): IZeroTotalChartStyles => {\r\n return {\r\n root: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n fontSize: '50px',\r\n minHeight: '200px',\r\n alignItems: 'center',\r\n userSelect: 'none',\r\n },\r\n };\r\n};\r\nconst getClassNames = classNamesFunction<{}, IZeroTotalChartStyles>();\r\nconst classNames = getClassNames(getStyles);\r\n\r\nexport const ZeroTotalChart = () => {\r\n return <div className={classNames.root}>0</div>;\r\n};\r\n","import { DataVizPalette, getColorFromToken } from '@fluentui/react-charting';\r\nimport { TythonColumnsEnum } from '../@data/store/schema/ColumnsEnum';\r\n\r\nexport const CHART_COLOR_TOKENS = [\r\n DataVizPalette.color1,\r\n DataVizPalette.color2,\r\n DataVizPalette.color3,\r\n DataVizPalette.color4,\r\n DataVizPalette.color5,\r\n DataVizPalette.color6,\r\n DataVizPalette.color7,\r\n DataVizPalette.color8,\r\n DataVizPalette.color9,\r\n DataVizPalette.color10,\r\n DataVizPalette.color11,\r\n];\r\nexport const CHART_COLOR_TOKENS_GRADIENTS = CHART_COLOR_TOKENS.map((token) => getColorFromToken(token));\r\n\r\nexport const METRICS_COLORS = {\r\n [TythonColumnsEnum.Revenue]: {\r\n main: CHART_COLOR_TOKENS_GRADIENTS[0],\r\n gradients: CHART_COLOR_TOKENS_GRADIENTS,\r\n },\r\n [TythonColumnsEnum.ImpressionsServed]: {\r\n main: CHART_COLOR_TOKENS_GRADIENTS[1],\r\n gradients: CHART_COLOR_TOKENS_GRADIENTS,\r\n },\r\n [TythonColumnsEnum.Impressions]: {\r\n main: CHART_COLOR_TOKENS_GRADIENTS[1],\r\n gradients: CHART_COLOR_TOKENS_GRADIENTS,\r\n },\r\n [TythonColumnsEnum.ImpressionsViewed]: {\r\n main: CHART_COLOR_TOKENS_GRADIENTS[2],\r\n gradients: CHART_COLOR_TOKENS_GRADIENTS,\r\n },\r\n [TythonColumnsEnum.ViewableImpressions]: {\r\n main: CHART_COLOR_TOKENS_GRADIENTS[2],\r\n gradients: CHART_COLOR_TOKENS_GRADIENTS,\r\n },\r\n [TythonColumnsEnum.eCPM]: {\r\n main: CHART_COLOR_TOKENS_GRADIENTS[3],\r\n gradients: CHART_COLOR_TOKENS_GRADIENTS,\r\n },\r\n [TythonColumnsEnum.AdECPM]: {\r\n main: CHART_COLOR_TOKENS_GRADIENTS[3],\r\n gradients: CHART_COLOR_TOKENS_GRADIENTS,\r\n },\r\n [TythonColumnsEnum.Clicks]: {\r\n main: CHART_COLOR_TOKENS_GRADIENTS[4],\r\n gradients: CHART_COLOR_TOKENS_GRADIENTS,\r\n },\r\n [TythonColumnsEnum.AdClicks]: {\r\n main: CHART_COLOR_TOKENS_GRADIENTS[4],\r\n gradients: CHART_COLOR_TOKENS_GRADIENTS,\r\n },\r\n [TythonColumnsEnum.Viewability]: {\r\n main: CHART_COLOR_TOKENS_GRADIENTS[5],\r\n gradients: CHART_COLOR_TOKENS_GRADIENTS,\r\n },\r\n [TythonColumnsEnum.ImpressionsRate]: {\r\n main: CHART_COLOR_TOKENS_GRADIENTS[5],\r\n gradients: CHART_COLOR_TOKENS_GRADIENTS,\r\n },\r\n [TythonColumnsEnum.CTR]: {\r\n main: CHART_COLOR_TOKENS_GRADIENTS[6],\r\n gradients: CHART_COLOR_TOKENS_GRADIENTS,\r\n },\r\n [TythonColumnsEnum.AdCTR]: {\r\n main: CHART_COLOR_TOKENS_GRADIENTS[6],\r\n gradients: CHART_COLOR_TOKENS_GRADIENTS,\r\n },\r\n\r\n [TythonColumnsEnum.FillRate]: {\r\n main: CHART_COLOR_TOKENS_GRADIENTS[7],\r\n gradients: CHART_COLOR_TOKENS_GRADIENTS,\r\n },\r\n [TythonColumnsEnum.MeasurableImpressionsRate]: {\r\n main: CHART_COLOR_TOKENS_GRADIENTS[7],\r\n gradients: CHART_COLOR_TOKENS_GRADIENTS,\r\n },\r\n [TythonColumnsEnum.MeasurableImpressions]: {\r\n main: CHART_COLOR_TOKENS_GRADIENTS[8],\r\n gradients: CHART_COLOR_TOKENS_GRADIENTS,\r\n },\r\n [TythonColumnsEnum.EligibleImpressions]: {\r\n main: CHART_COLOR_TOKENS_GRADIENTS[9],\r\n gradients: CHART_COLOR_TOKENS_GRADIENTS,\r\n },\r\n [TythonColumnsEnum.ResponsesServed]: {\r\n main: CHART_COLOR_TOKENS_GRADIENTS[10],\r\n gradients: CHART_COLOR_TOKENS_GRADIENTS,\r\n },\r\n};\r\n","import { IColumn, IDropdownOption, SelectionMode, ShimmeredDetailsList, ShimmerElementsGroup, ShimmerElementType } from '@fluentui/react';\r\nimport { DonutChart, HorizontalBarChart, IChartDataPoint, IChartProps } from '@fluentui/react-charting';\r\nimport { YAxisOptions } from 'highcharts';\r\nimport React from 'react';\r\nimport { Log } from '../../../../../logging/src';\r\nimport { MediationReportingDataRequestBody } from '../../../../@data/store/schema/models/MediationReportingDataRequestBody';\r\nimport BubbleMap from '../../../../components/AzureMaps/BubbleMap';\r\nimport countryCoordinatesData from '../../../../components/AzureMaps/CountryCodeToCoordinates.json';\r\nimport { IGeoJSONFeature } from '../../../../components/AzureMaps/GeoJson.types';\r\nimport { EmptyChart } from '../../../../components/EmptyChart/EmptyChart';\r\nimport { CustomChart } from '../../../../components/HighCharts/CustomChart/CustomChart';\r\nimport { HighCharts } from '../../../../components/HighCharts/HighChartsLibrary';\r\nimport { IGridV2Column } from '../../../../layout/GridPageV2';\r\nimport { AuthenticationUtils } from '../../../../utils/AuthenticationUtils';\r\nimport { endOfDay, startOfDay } from '../../../../utils/DateUtils';\r\nimport { TythonColumnsEnum } from '../../@data/store/schema/ColumnsEnum';\r\nimport { ReportsQueryStoreKeys } from '../../@data/store/schema/ReportsQueryStoreKeys';\r\nimport { getDataFromURL } from '../../@data/store/UrlQueryStore';\r\nimport { ZeroTotalChart } from '../../components/common/ZeroTotalChart/ZeroTotalChart';\r\nimport { ICustomCalenderDateRange } from '../../components/CustomCalender/CustomCalender.types';\r\nimport { METRICS_COLORS } from '../../constants/metricsColors';\r\nimport { ratioMetrics } from '../../constants/ratioMetrics';\r\nimport ReportMessages from '../../Report.messages';\r\nimport { exportToCsv } from '../../utils/exportHelper';\r\nimport { FormatMessageFuncType, getReportColumnMetadataDisplayName } from '../../utils/intlHelper';\r\nimport { formatMetric, roundMetric } from '../../utils/metricsFormatter';\r\nimport { IMetadataElement, ReportingDataRow, TythonReportingDataRow } from '../@data/store/schema';\r\nimport { getReportPageStore } from '../@data/store/store';\r\nimport { IActiveFilter } from '../ReportDetailsPage/ActionBar/ActionBar';\r\nimport { ActiveMetrics, ChartGrain, ChartTypes, IChartsOptions } from './ReportCard.types';\r\n\r\nconst MAX_TOP_ROWS = 5;\r\nconst OTHERS_NAME = 'Others';\r\n// const theme = getTheme();\r\n// const palette = theme.palette as IPubcenterPalette;\r\n\r\nexport const getDonutChartShimmerCustomElements = () => {\r\n return (\r\n <div>\r\n <ShimmerElementsGroup\r\n shimmerElements={[\r\n { type: ShimmerElementType.line, height: 20, width: '30%' },\r\n { type: ShimmerElementType.gap, height: 20, width: '70%' },\r\n ]}\r\n />\r\n <ShimmerElementsGroup shimmerElements={[{ type: ShimmerElementType.gap, height: 20, width: '100%' }]} />\r\n <ShimmerElementsGroup\r\n shimmerElements={[\r\n { type: ShimmerElementType.gap, width: 'calc(100% - 75px)', height: 150 },\r\n { type: ShimmerElementType.circle, height: 150 },\r\n { type: ShimmerElementType.gap, width: 'calc(100% - 75px)', height: 150 },\r\n ]}\r\n />\r\n <ShimmerElementsGroup shimmerElements={[{ type: ShimmerElementType.gap, width: '100%', height: 10 }]} />\r\n <ShimmerElementsGroup\r\n shimmerElements={[\r\n { type: ShimmerElementType.gap, width: 'calc(100% - 30px)', height: 10 },\r\n { type: ShimmerElementType.line, height: 20, width: '10%' },\r\n { type: ShimmerElementType.gap, height: 20, width: '5%' },\r\n { type: ShimmerElementType.line, height: 20, width: '10%' },\r\n { type: ShimmerElementType.gap, width: 'calc(100% - 30px)', height: 10 },\r\n ]}\r\n />\r\n </div>\r\n );\r\n};\r\nexport const getHorizontalBarChartShimmerCustomElements = () => {\r\n return (\r\n <div>\r\n <ShimmerElementsGroup\r\n flexWrap\r\n width=\"100%\"\r\n shimmerElements={[\r\n { type: ShimmerElementType.line, width: '10%', height: 10, verticalAlign: 'bottom' },\r\n { type: ShimmerElementType.gap, width: '90%', height: 30 },\r\n { type: ShimmerElementType.line, width: '85%', height: 20, verticalAlign: 'bottom' },\r\n { type: ShimmerElementType.gap, width: '15%', height: 30 },\r\n { type: ShimmerElementType.line, width: '10%', height: 10, verticalAlign: 'bottom' },\r\n { type: ShimmerElementType.gap, width: '90%', height: 30 },\r\n { type: ShimmerElementType.line, width: '85%', height: 20, verticalAlign: 'bottom' },\r\n { type: ShimmerElementType.gap, width: '15%', height: 30 },\r\n ]}\r\n />\r\n </div>\r\n );\r\n};\r\nexport const getDefaultShimmerCustomElements = () => {\r\n return (\r\n <div>\r\n <ShimmerElementsGroup\r\n flexWrap\r\n width=\"100%\"\r\n shimmerElements={[\r\n { type: ShimmerElementType.line, width: '100%', height: 10 },\r\n { type: ShimmerElementType.gap, width: '100%', height: 30 },\r\n { type: ShimmerElementType.line, width: '100%', height: 10 },\r\n { type: ShimmerElementType.gap, width: '100%', height: 30 },\r\n { type: ShimmerElementType.line, width: '100%', height: 10 },\r\n { type: ShimmerElementType.gap, width: '100%', height: 30 },\r\n { type: ShimmerElementType.line, width: '100%', height: 10 },\r\n { type: ShimmerElementType.gap, width: '100%', height: 30 },\r\n ]}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport const getShimmerCustomElements = (chartType: ChartTypes) => {\r\n switch (chartType) {\r\n case ChartTypes.BAR:\r\n return getHorizontalBarChartShimmerCustomElements();\r\n case ChartTypes.DONUT:\r\n return getDonutChartShimmerCustomElements();\r\n case ChartTypes.LINE:\r\n case ChartTypes.MAP:\r\n return getDefaultShimmerCustomElements();\r\n case ChartTypes.GRID:\r\n return;\r\n }\r\n};\r\n\r\nexport function mapToGridData(data: TythonReportingDataRow[], metric: string, mainDimension: string) {\r\n const items = data.map((item, index) => {\r\n return { [mainDimension]: item[mainDimension], [metric]: roundMetric(TythonColumnsEnum[metric], item[metric]) };\r\n });\r\n return items;\r\n}\r\n\r\nexport function mapToDonutChartData(data: TythonReportingDataRow[], metric: IMetadataElement, mainDimension: IMetadataElement) {\r\n const points: IChartDataPoint[] = data.map((item, index) => {\r\n const colorIndex = getMetricColorIndex(TythonColumnsEnum[metric.key], index);\r\n\r\n return {\r\n legend: item[mainDimension.key],\r\n data: roundMetric(TythonColumnsEnum[metric.key], item[metric.key]),\r\n color: getGradientColor(TythonColumnsEnum[metric.key], colorIndex),\r\n };\r\n });\r\n\r\n return {\r\n chartTitle: 'Donut chart basic example',\r\n chartData: points,\r\n };\r\n}\r\nfunction getGradientColor(metricKey: TythonColumnsEnum, colorIndex: number): string {\r\n return getMetricColor(metricKey)?.gradients[colorIndex];\r\n}\r\nfunction getMainLegendColor(metricKey: TythonColumnsEnum): string {\r\n return getMetricColor(metricKey)?.main;\r\n}\r\n\r\nfunction getMetricColor(metricKey: TythonColumnsEnum): { main: string; gradients: string[] } {\r\n return METRICS_COLORS[metricKey] ?? METRICS_COLORS[TythonColumnsEnum.Revenue];\r\n}\r\n\r\nfunction getMetricColorIndex(metricKey: TythonColumnsEnum, index: number) {\r\n const metricColor = getMetricColor(metricKey);\r\n return metricColor ? ((index % metricColor.gradients.length) + metricColor.gradients.length) % metricColor.gradients.length : 0;\r\n}\r\nexport function mapToBarChartData(\r\n data: TythonReportingDataRow[],\r\n total: number,\r\n metric: IMetadataElement,\r\n mainDimension: IMetadataElement,\r\n formatMessage: FormatMessageFuncType\r\n): IChartProps[] {\r\n const bars = data.map((point, index) => {\r\n const barXData = roundMetric(TythonColumnsEnum[metric.key], point[metric.key]);\r\n const colorIndex = getMetricColorIndex(TythonColumnsEnum[metric.key], index);\r\n return {\r\n chartTitle: point[mainDimension.key],\r\n chartData: [\r\n {\r\n legend: point[mainDimension.key],\r\n horizontalBarChartdata: { x: barXData, y: total },\r\n color: getGradientColor(TythonColumnsEnum[metric.key], colorIndex),\r\n xAxisCalloutData: getReportColumnMetadataDisplayName(metric.key, formatMessage),\r\n yAxisCalloutData: barXData,\r\n },\r\n ],\r\n };\r\n });\r\n return bars;\r\n}\r\n\r\nexport function mapToBubbleData(\r\n data: TythonReportingDataRow[],\r\n metric: IMetadataElement,\r\n mainDimension: IMetadataElement,\r\n codeDimensionKey: string,\r\n locale: string\r\n): IGeoJSONFeature[] {\r\n const bubbleData = data\r\n .filter((row) => {\r\n const coordinates = countryCoordinatesData[row[codeDimensionKey]];\r\n if (!coordinates) {\r\n Log.error(`Coordinates not found for country code: ${row[codeDimensionKey]}`);\r\n return false;\r\n }\r\n return true;\r\n })\r\n .map((row) => {\r\n const metricValue = roundMetric(TythonColumnsEnum[metric.key], row[metric.key]);\r\n const formattedMetricValue = formatMetric(TythonColumnsEnum[metric.key], row[metric.key], locale);\r\n const coordinates = countryCoordinatesData[row[codeDimensionKey]];\r\n\r\n return {\r\n type: 'Feature',\r\n properties: {\r\n name: metric.displayName,\r\n dimension: row.Country,\r\n value: Number(metricValue),\r\n formattedValue: formattedMetricValue,\r\n },\r\n geometry: {\r\n type: 'Point',\r\n coordinates: [coordinates.longitude, coordinates.latitude] as [number, number],\r\n },\r\n };\r\n })\r\n .filter((item): item is IGeoJSONFeature => item.properties.value > 0);\r\n\r\n return bubbleData;\r\n}\r\n\r\nexport function mapToLineChartData(\r\n data: TythonReportingDataRow[],\r\n activeMetrics: ActiveMetrics,\r\n dateDimension: string,\r\n mainDimension?: IMetadataElement\r\n) {\r\n const series: HighCharts.SeriesOptionsType[] = mainDimension?.key\r\n ? getTimeSeriesByDimension(data, mainDimension, dateDimension, activeMetrics)\r\n : getTimeSeriesByMetric(activeMetrics, data, dateDimension);\r\n return series;\r\n}\r\nfunction getTimeSeriesByDimension(\r\n data: TythonReportingDataRow[],\r\n mainDimension: IMetadataElement,\r\n dateDimension: string,\r\n activeMetrics: ActiveMetrics\r\n) {\r\n const lineDataByDimension = {};\r\n for (const row of data) {\r\n if (!lineDataByDimension[row[mainDimension?.key]]) {\r\n lineDataByDimension[row[mainDimension?.key]] = [];\r\n }\r\n lineDataByDimension[row[mainDimension?.key]].push({ ...row });\r\n }\r\n\r\n const metric = Object.keys(activeMetrics).filter((activeMetric) => activeMetrics[activeMetric].isActive)[0];\r\n const accumulatedData = Object.values(lineDataByDimension).map((dataByDimension: TythonReportingDataRow[]) => {\r\n return dataByDimension.reduce((acc, curr) => {\r\n const sum = acc[metric] ? acc[metric] + Number(curr[metric]) : Number(curr[metric]);\r\n return {\r\n ...acc,\r\n [metric]: sum,\r\n };\r\n });\r\n });\r\n const topDataByMetric: string[] = getTopData(accumulatedData, metric, mainDimension?.key).topData.map((row) => row[mainDimension?.key]);\r\n const series: HighCharts.SeriesOptionsType[] = Object.keys(lineDataByDimension)\r\n .filter((key) => topDataByMetric.includes(key))\r\n .map((key, index) => {\r\n const colorIndex = getMetricColorIndex(TythonColumnsEnum[metric], index);\r\n const color = getGradientColor(TythonColumnsEnum[metric], colorIndex);\r\n return {\r\n name: key,\r\n type: 'line',\r\n data: lineDataByDimension[key]\r\n .sort((a, b) => {\r\n return a[dateDimension]! >= b[dateDimension]! ? 1 : -1;\r\n })\r\n .map((row) => {\r\n const localDate = new Date(row[dateDimension]!);\r\n const utcTimeStamp = Date.UTC(\r\n localDate.getFullYear(),\r\n localDate.getMonth(),\r\n localDate.getDate(),\r\n localDate.getHours(),\r\n localDate.getMinutes()\r\n );\r\n return [utcTimeStamp, roundMetric(TythonColumnsEnum[metric], Number(row[metric]))];\r\n }),\r\n yAxis: metric,\r\n color: color,\r\n tooltip: {\r\n pointFormatter: function () {\r\n const value = this.y || 0;\r\n return `<span style=\"color: ${this.series.color}\">â—</span> ${this.series.name}: ${HighCharts.numberFormat(\r\n value,\r\n value % 1 === 0 ? 0 : 2,\r\n '.',\r\n ','\r\n )}<br/>`;\r\n },\r\n useHTML: true,\r\n },\r\n };\r\n });\r\n return series;\r\n}\r\n\r\nfunction getTimeSeriesByMetric(\r\n activeMetrics: ActiveMetrics,\r\n data: TythonReportingDataRow[],\r\n dateDimension: string\r\n): HighCharts.SeriesOptionsType[] {\r\n return Object.keys(activeMetrics)\r\n .filter((activeMetric) => activeMetrics[activeMetric].isActive)\r\n .map((metric) => {\r\n return {\r\n name: activeMetrics[metric].metricName,\r\n type: 'line',\r\n data: data\r\n .sort((a, b) => {\r\n return a[dateDimension]! >= b[dateDimension]! ? 1 : -1;\r\n })\r\n .map((row) => {\r\n const localDate = new Date(row[dateDimension]!);\r\n const utcTimeStamp = Date.UTC(\r\n localDate.getFullYear(),\r\n localDate.getMonth(),\r\n localDate.getDate(),\r\n localDate.getHours(),\r\n localDate.getMinutes()\r\n );\r\n return [utcTimeStamp, roundMetric(TythonColumnsEnum[metric], Number(row[metric]))];\r\n }),\r\n yAxis: metric,\r\n color: activeMetrics[metric].color,\r\n tooltip: {\r\n pointFormatter: function () {\r\n const value = this.y || 0;\r\n return `<span style=\"color: ${this.series.color}\">â—</span> ${this.series.name}: ${HighCharts.numberFormat(\r\n value,\r\n value % 1 === 0 ? 0 : 2,\r\n '.',\r\n ','\r\n )}<br/>`;\r\n },\r\n useHTML: true,\r\n },\r\n };\r\n });\r\n}\r\n\r\nexport function getMetricDropdownOptions(\r\n metrics: IMetadataElement[],\r\n chartType: ChartTypes,\r\n formatMessage: FormatMessageFuncType\r\n): IDropdownOption[] {\r\n return metrics\r\n .map((metric) => {\r\n return {\r\n key: metric.key,\r\n text: getReportColumnMetadataDisplayName(metric.key, formatMessage),\r\n title: getReportColumnMetadataDisplayName(metric.key, formatMessage),\r\n } as IDropdownOption;\r\n })\r\n .filter((metric) => !ratioMetrics.includes(String(metric.key)) || chartType === ChartTypes.MAP);\r\n}\r\nexport const getChart = (\r\n {\r\n currentChartType,\r\n reportData,\r\n selectedMetric,\r\n mainDimension,\r\n chartComponentRef,\r\n mapChartComponentRef,\r\n activeMetrics,\r\n dateDimension,\r\n countryCodeDimension,\r\n formatMessage,\r\n }: IChartsOptions,\r\n locale: string\r\n) => {\r\n const { topData, total } = getTopData(reportData, selectedMetric.key, mainDimension?.key);\r\n const roundedTotal = roundMetric(TythonColumnsEnum[selectedMetric.key], total);\r\n\r\n if (!reportData || reportData.length <= 0) {\r\n return (\r\n <EmptyChart\r\n noDataText={'No data available.'}\r\n noDataMessage={\r\n ' To update the tile, change the data range or select another metric. If the tile remains blank, your account might have no data.'\r\n }\r\n showGridLines={ChartTypes.LINE === currentChartType}\r\n />\r\n );\r\n }\r\n switch (currentChartType) {\r\n case ChartTypes.DONUT:\r\n if (!roundedTotal) {\r\n return <ZeroTotalChart />;\r\n }\r\n return (\r\n <DonutChart\r\n data={mapToDonutChartData(topData, selectedMetric, mainDimension!)}\r\n innerRadius={55}\r\n hideLegend={false}\r\n valueInsideDonut={formatMetric(TythonColumnsEnum[selectedMetric.key], total, locale)}\r\n enabledLegendsWrapLines={true}\r\n legendProps={{\r\n styles: {\r\n legend: {\r\n textTransform: 'none',\r\n },\r\n },\r\n }}\r\n styles={{\r\n legendContainer: {\r\n maxWidth: '100%',\r\n },\r\n }}\r\n />\r\n );\r\n case ChartTypes.BAR:\r\n if (!roundedTotal) {\r\n return <ZeroTotalChart />;\r\n }\r\n return <HorizontalBarChart data={mapToBarChartData(topData, total, selectedMetric, mainDimension!, formatMessage)} />;\r\n case ChartTypes.GRID:\r\n const gridColumns = buildGridColumns([selectedMetric, mainDimension!], formatMessage);\r\n return (\r\n <ShimmeredDetailsList\r\n items={mapToGridData(topData, selectedMetric.key, mainDimension?.key!)}\r\n columns={gridColumns || []}\r\n shimmerLines={MAX_TOP_ROWS + 1}\r\n enableShimmer={!reportData}\r\n selectionMode={SelectionMode.none}\r\n />\r\n );\r\n case ChartTypes.LINE:\r\n const lineChartSeries = mapToLineChartData(reportData, activeMetrics, dateDimension, mainDimension);\r\n const yAxes: YAxisOptions[] = buildYAxes(activeMetrics);\r\n return (\r\n <div>\r\n <CustomChart\r\n chartComponentRef={chartComponentRef}\r\n options={{\r\n series: lineChartSeries,\r\n legend: {\r\n enabled: true,\r\n },\r\n yAxis: yAxes,\r\n lang: {\r\n thousandsSep: ',',\r\n },\r\n }}\r\n dataMetric={''}\r\n />\r\n </div>\r\n );\r\n case ChartTypes.MAP:\r\n const bubbleData = mapToBubbleData(reportData, selectedMetric, mainDimension!, countryCodeDimension!, locale);\r\n return (\r\n <div>\r\n <BubbleMap data={bubbleData} />\r\n </div>\r\n );\r\n }\r\n};\r\nexport function getTopData(\r\n reportData: TythonReportingDataRow[],\r\n selectedMetric: string,\r\n mainDimension: string | undefined\r\n): { topData: TythonReportingDataRow[]; total: number } {\r\n const topCount = MAX_TOP_ROWS;\r\n\r\n const topData: TythonReportingDataRow[] = [];\r\n const others: TythonReportingDataRow = {\r\n DateTime: '',\r\n [selectedMetric]: 0,\r\n className: '',\r\n apiPath: '',\r\n };\r\n let total = 0;\r\n if (mainDimension) {\r\n others[mainDimension] = OTHERS_NAME;\r\n const sortedData = reportData.sort((a, b) => {\r\n return a[selectedMetric] <= b[selectedMetric] ? 1 : -1;\r\n });\r\n let count = 0;\r\n for (const row of sortedData) {\r\n if (count >= topCount) {\r\n others[selectedMetric] += row[selectedMetric];\r\n } else {\r\n topData.push(row);\r\n }\r\n total += row[selectedMetric];\r\n count++;\r\n }\r\n if (count > topCount) {\r\n topData.push(others);\r\n }\r\n }\r\n return { topData, total };\r\n}\r\n\r\nfunction buildYAxes(activeMetrics: ActiveMetrics) {\r\n const enabledMetrics = Object.keys(activeMetrics).filter((activeMetric) => activeMetrics[activeMetric].isActive);\r\n let hasLeftAxis = false;\r\n const yAxes: YAxisOptions[] = Object.keys(activeMetrics).map((activeMetric) => {\r\n const newAxis = {\r\n title: {\r\n text: null,\r\n },\r\n opposite: hasLeftAxis,\r\n labels: {\r\n enabled: enabledMetrics.length <= 2,\r\n },\r\n id: activeMetric,\r\n };\r\n if (activeMetrics[activeMetric].isActive && enabledMetrics.length <= 2) {\r\n hasLeftAxis = true;\r\n }\r\n return newAxis;\r\n });\r\n return yAxes;\r\n}\r\nexport function buildGridColumns(columns: IMetadataElement[], formatMessage: FormatMessageFuncType): IColumn[] {\r\n return columns.map((column) => {\r\n return {\r\n key: column.key,\r\n name: getReportColumnMetadataDisplayName(column.key, formatMessage),\r\n minWidth: 150,\r\n maxWidth: 300,\r\n fieldName: column.key,\r\n isResizable: true,\r\n };\r\n });\r\n}\r\nexport function buildGridV2Columns(\r\n dimensions: IMetadataElement[],\r\n metrics: IMetadataElement[],\r\n defaultSelected,\r\n formatMessage: FormatMessageFuncType\r\n): IGridV2Column[] {\r\n const columns = [...dimensions.sort(sortByDefaultColumns(defaultSelected)), ...metrics.sort(sortByDefaultColumns(defaultSelected))];\r\n return columns.map((column, index) => {\r\n return {\r\n key: column.key,\r\n name: getReportColumnMetadataDisplayName(column.key, formatMessage),\r\n minWidth: 150,\r\n fieldName: column.key,\r\n isSearchable: true,\r\n isVisible:\r\n defaultSelected.includes(column.key as TythonColumnsEnum) || !!dimensions.find((dimension) => column.key === dimension.key),\r\n isExportable: false,\r\n isResizable: true,\r\n suppressSorting: false,\r\n columnOrder: index,\r\n sortFunction:\r\n column.key === TythonColumnsEnum.DateTime || column.key === TythonColumnsEnum.Date\r\n ? /* tslint:disable-next-line */\r\n (a: any, b: any, isSortingDescending: boolean) => {\r\n const convertDate = (date: string) => {\r\n const dateParts = date.match(/(\\d+)\\/(\\d+)\\/(\\d+), (\\d+) (AM|PM)/);\r\n if (dateParts) {\r\n const month = parseInt(dateParts[1], 10);\r\n const day = parseInt(dateParts[2], 10);\r\n const year = parseInt(dateParts[3], 10);\r\n let hours = parseInt(dateParts[4], 10);\r\n const ampm = dateParts[5];\r\n\r\n if (ampm === 'PM' && hours < 12) {\r\n hours += 12;\r\n } else if (ampm === 'AM' && hours === 12) {\r\n hours = 0;\r\n }\r\n\r\n return new Date(year, month - 1, day, hours, 0, 0);\r\n }\r\n return date;\r\n };\r\n\r\n const aDate = convertDate(a['DateTime']);\r\n const bDate = convertDate(b['DateTime']);\r\n\r\n return isSortingDescending ? +aDate - +bDate : +bDate - +aDate;\r\n }\r\n : undefined,\r\n };\r\n });\r\n}\r\nexport function getActiveMarkers(\r\n metrics: IMetadataElement[],\r\n filters: IActiveFilter[],\r\n chartType: ChartTypes,\r\n defaultSelected: TythonColumnsEnum[],\r\n formatMessage: FormatMessageFuncType,\r\n selectedMetric: string = ''\r\n): ActiveMetrics {\r\n const activeMetrics: ActiveMetrics = {};\r\n if (metrics && metrics.length > 0) {\r\n const sortedMetrics = metrics.sort(sortByDefaultColumns(defaultSelected));\r\n const isSelectedMetricDisabled = chartType !== ChartTypes.LINE && chartType !== ChartTypes.MAP && ratioMetrics.includes(selectedMetric);\r\n for (let i = 0; i < sortedMetrics.length; i++) {\r\n const metric = sortedMetrics[i];\r\n const appliedFiltersSet = new Set(filters.map((filter) => filter.key));\r\n let incompatibleFilter = '';\r\n const isIncompatible = metric.incompatibleFields?.some((incompatibleField) => {\r\n incompatibleFilter = appliedFiltersSet.has(incompatibleField) ? incompatibleField : '';\r\n return appliedFiltersSet.has(incompatibleField);\r\n });\r\n const incompatibleDimension = incompatibleFilter ? filters.find((filter) => filter.key === incompatibleFilter) : undefined;\r\n const DEFAULT_SHOWN_METRICS = 5;\r\n const isVisible = i < DEFAULT_SHOWN_METRICS;\r\n const isActive =\r\n selectedMetric && !isSelectedMetricDisabled\r\n ? metric.key === selectedMetric\r\n : defaultSelected.includes(metric.key as TythonColumnsEnum);\r\n const isDisabled = chartType !== ChartTypes.LINE && chartType !== ChartTypes.MAP && ratioMetrics.includes(String(metric.key));\r\n const inCompatibleMessage = getIncompatibleFilterMessage(\r\n getReportColumnMetadataDisplayName(metric.key, formatMessage),\r\n getReportColumnMetadataDisplayName(incompatibleDimension?.key || '', formatMessage) || ''\r\n );\r\n activeMetrics[metric.key] = {\r\n color: getMainLegendColor(TythonColumnsEnum[metric.key]),\r\n isActive: isActive && !isDisabled,\r\n metricData: '',\r\n metricName: getReportColumnMetadataDisplayName(metric.key, formatMessage),\r\n metricKey: metric.key,\r\n isVisible: isVisible || isActive,\r\n disabled: isDisabled,\r\n isIncompatible: isIncompatible,\r\n incompatibleTooltipCantText: formatMessage(inCompatibleMessage.cantMessage, inCompatibleMessage.params),\r\n incompatibleTooltipWontText: formatMessage(inCompatibleMessage.wontMessage, inCompatibleMessage.params),\r\n };\r\n }\r\n }\r\n\r\n return activeMetrics;\r\n}\r\nexport function getIncompatibleFilterMessage(metrics: string, dimensions: string) {\r\n return {\r\n cantMessage: ReportMessages.chartIncompatibleFieldsWithFilterCantBeShown,\r\n wontMessage: ReportMessages.chartIncompatibleFieldsWithFilterWillNotBeShown,\r\n params: {\r\n metrics,\r\n dimensions,\r\n },\r\n };\r\n}\r\nexport function getIncompatibleBreakdownMessage(metrics: string, dimensions: string) {\r\n return {\r\n message: ReportMessages.gridIncompatibleFieldsWhenBreakingDown,\r\n params: {\r\n metrics,\r\n dimensions,\r\n },\r\n };\r\n}\r\nexport function getIncompatibleColumnWithBreakdownMessage(metrics: string, dimensions: string) {\r\n return {\r\n cantMessage: ReportMessages.gridIncompatibleFieldsWithBreakdown,\r\n wontMessage: ReportMessages.gridIncompatibleFieldsWhenAddingColumnWithBreakdown,\r\n params: {\r\n metrics,\r\n dimensions,\r\n },\r\n };\r\n}\r\nexport function getIncompatibleColumnWithFilterMessage(metrics: string, dimensions: string) {\r\n return {\r\n cantMessage: ReportMessages.gridIncompatibleFieldsWithFilter,\r\n wontMessage: ReportMessages.gridIncompatibleFieldsWhenAddingColumnWithFilter,\r\n params: {\r\n metrics,\r\n dimensions,\r\n },\r\n };\r\n}\r\nexport function getIncompatibleColumnWithBreakdownAndFilterMessage(metrics: string, dimensions: string) {\r\n return {\r\n cantMessage: ReportMessages.gridIncompatibleFieldsWithFilterAndBreakdown,\r\n wontMessage: ReportMessages.gridIncompatibleFieldsWhenAddingColumnWithFilterAndBreakdown,\r\n params: {\r\n metrics,\r\n dimensions,\r\n },\r\n };\r\n}\r\n\r\nfunction sortByDefaultColumns(defaultSelected: TythonColumnsEnum[]): ((a: IMetadataElement, b: IMetadataElement) => number) | undefined {\r\n return (a, b) => {\r\n return defaultSelected.indexOf(b.key as TythonColumnsEnum) - defaultSelected.indexOf(a.key as TythonColumnsEnum);\r\n };\r\n}\r\n\r\nexport function constructRequestBody(\r\n title: string,\r\n dateRange: ICustomCalenderDateRange,\r\n currentChartGrain: ChartGrain,\r\n filters: IActiveFilter[] = [],\r\n breakdown: string[] = [],\r\n metrics: IMetadataElement[] = []\r\n) {\r\n const callerGuid = AuthenticationUtils.createNewGuid();\r\n const { reportType } = getReportPageStore();\r\n\r\n return {\r\n callerGuid: callerGuid,\r\n reportName: title,\r\n reportType: reportType,\r\n dateTimeRanges: [\r\n {\r\n startDateTime: startOfDay(dateRange.startDate).toISOString(),\r\n endDateTime: endOfDay(dateRange.endDate).toISOString(),\r\n },\r\n ],\r\n grain: currentChartGrain,\r\n columns: [...breakdown, ...metrics.map((metric) => metric.key)],\r\n filters: filters.map((filter) => {\r\n return {\r\n Key: filter.filterKey,\r\n values: filter.values.map((value) => value.key),\r\n };\r\n }),\r\n requestOptions: {},\r\n };\r\n}\r\n\r\nexport function constructMediationRequestBody(\r\n dateRange: ICustomCalenderDateRange,\r\n currentChartGrain: ChartGrain,\r\n filters: IActiveFilter[] = [],\r\n breakdown: string[] = [],\r\n columns: string[] = []\r\n): MediationReportingDataRequestBody {\r\n return {\r\n startDate: startOfDay(dateRange.startDate).toISOString(),\r\n endDate: endOfDay(dateRange.endDate).toISOString(),\r\n grain: currentChartGrain,\r\n dimensions: [...breakdown],\r\n columns: columns,\r\n filters: filters.map((filter) => {\r\n return {\r\n Key: filter.filterKey,\r\n values: filter.values.map((value) => String(value.key)),\r\n };\r\n }),\r\n };\r\n}\r\nexport function getStartingBreakdown(mainDimension?: string): string[] {\r\n let startingBreakdown = mainDimension ? [mainDimension] : [];\r\n const storedBreakdown = getDataFromURL<string[]>(ReportsQueryStoreKeys.BREAKDOWN);\r\n if (storedBreakdown) {\r\n startingBreakdown = storedBreakdown;\r\n }\r\n return startingBreakdown;\r\n}\r\n\r\nexport function getStartingChartGrain(\r\n defaultChartGrain: ChartGrain | undefined,\r\n allowedChartGrains: IMetadataElement[],\r\n chartType: ChartTypes,\r\n chartGrainStoreKey: string\r\n) {\r\n const defaultBasedOnChartType = chartType === ChartTypes.LINE ? ChartGrain.HOURLY : ChartGrain.NONE;\r\n let startingChartGrain: ChartGrain = defaultChartGrain ? defaultChartGrain : defaultBasedOnChartType;\r\n const storedChartGrain = getDataFromURL<ChartGrain>(chartGrainStoreKey);\r\n if (storedChartGrain && chartType === ChartTypes.LINE) {\r\n startingChartGrain = storedChartGrain;\r\n }\r\n return startingChartGrain;\r\n}\r\nexport function exportReport(\r\n dataToExport: ReportingDataRow[],\r\n columnsMetadata: IMetadataElement[],\r\n filename: string,\r\n formatMessage: FormatMessageFuncType\r\n) {\r\n if (dataToExport.length > 0) {\r\n const columnsToExport = columnsMetadata.filter((col) => dataToExport[0][col.key] !== undefined);\r\n exportToCsv(dataToExport, columnsToExport, filename, formatMessage);\r\n }\r\n}\r\n","import { mutatorAction } from \"satcheljs\";\r\nimport { getAdunitStore } from \"../store/store\";\r\n\r\nexport const onAdSenseMediationToggleChanged = mutatorAction(\r\n 'onAdSenseMediationToggleChanged', (isEnabled: boolean) => {\r\n getAdunitStore().active.adSenseMediationToggle = isEnabled;\r\n }\r\n);\r\n\r\nexport const onAdSenseMediationChanged = mutatorAction(\r\n 'onAdSenseMediationChanged', (isEnabled: boolean) => {\r\n getAdunitStore().active.adSenseMediationStatus = isEnabled;\r\n }\r\n);","import { mutatorAction } from 'satcheljs';\r\nimport { PrivateMarketplace } from '../../../../../@data';\r\nimport { getAdunitStore } from '../store/store';\r\n\r\nexport const onAdunitPrivateMarketplaceChanged = mutatorAction(\r\n 'onAdunitPrivateMarketplaceChanged',\r\n (privateMarketplace?: PrivateMarketplace) => {\r\n getAdunitStore().privateMarketplace = privateMarketplace ? privateMarketplace : undefined;\r\n getAdunitStore().enablePrivateMarketplace = privateMarketplace ? true : false;\r\n }\r\n);\r\n\r\nexport const onAdunitEnablePrivateMarketplaceChanged = mutatorAction(\r\n 'onAdunitEnablePrivateMarketplaceChanged',\r\n (enablePrivateMarketplace: boolean) => {\r\n getAdunitStore().enablePrivateMarketplace = enablePrivateMarketplace;\r\n }\r\n);\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { AdUnit } from '../../../../../@data';\r\nimport { getAdunitStore } from '../store/store';\r\n\r\nexport const setAdUnitsData = mutatorAction('setAdUnitsData', (data?: AdUnit[]) => {\r\n const store = getAdunitStore();\r\n store.adUnitsRaw.data = data;\r\n});\r\n\r\nexport const setAdUnitsLoading = mutatorAction('setAdUnitsLoading', (loading: boolean) => {\r\n const store = getAdunitStore();\r\n store.adUnitsRaw.isLoading = loading;\r\n});\r\n\r\nexport const setAdUnitsDataFetching = mutatorAction('setAdUnitsDataFetching', (loading: boolean) => {\r\n const store = getAdunitStore();\r\n store.adUnitsRaw.isFetchingData = loading;\r\n});\r\n\r\nexport const setAdUnitsMediationFetching = mutatorAction('setAdUnitsMediationFetching', (isFetching: boolean) => {\r\n const store = getAdunitStore();\r\n store.isFetchingAdUnitStatus = isFetching;\r\n});\r\n","import { useMemo } from 'react';\r\nimport { addLocaleData } from 'react-intl';\r\nimport deLocaleData from 'react-intl/locale-data/de';\r\nimport enLocaleData from 'react-intl/locale-data/en';\r\nimport esLocaleData from 'react-intl/locale-data/es';\r\nimport frLocaleData from 'react-intl/locale-data/fr';\r\nimport itLocaleData from 'react-intl/locale-data/it';\r\nimport { upperCaseCountryCode } from '../app/@data';\r\nimport {\r\n DEFAULT_COUNTRY_CODE,\r\n DE_LOCALE_KEY,\r\n EN_GB_LOCALE_KEY,\r\n EN_LOCALE_KEY,\r\n ES_LOCALE_KEY,\r\n ES_MX_LOCALE_KEY,\r\n FR_CA_LOCALE_KEY,\r\n FR_LOCALE_KEY,\r\n IT_LOCALE_KEY,\r\n} from '../app/constants/AppConstants';\r\nimport de from './locales/de-de.json';\r\nimport enGb from './locales/en-gb.json';\r\nimport es from './locales/es-es.json';\r\nimport esMx from './locales/es-mx.json';\r\nimport frCa from './locales/fr-ca.json';\r\nimport fr from './locales/fr-fr.json';\r\nimport it from './locales/it-it.json';\r\n\r\nimport { UseI18n } from './useI18n.types';\r\n\r\nexport const useI18n: UseI18n = ({ systemPreferences, publisher, userContext }) => {\r\n const { locale: sysLocale, countryCode: sysCountryCode } = systemPreferences ?? {};\r\n addLocaleData(enLocaleData);\r\n addLocaleData(frLocaleData);\r\n addLocaleData(deLocaleData);\r\n addLocaleData(itLocaleData);\r\n addLocaleData(esLocaleData);\r\n\r\n const [locale, formattedLocale, countryCode, messages] = useMemo(() => {\r\n // set default locale to English\r\n const appLocale = sysLocale ?? EN_LOCALE_KEY;\r\n const appCountryCode = sysCountryCode ?? DEFAULT_COUNTRY_CODE;\r\n const formatLocale = upperCaseCountryCode(appLocale);\r\n switch (appLocale) {\r\n case EN_GB_LOCALE_KEY:\r\n return [appLocale, formatLocale, appCountryCode, enGb];\r\n case FR_LOCALE_KEY:\r\n return [appLocale, formatLocale, appCountryCode, fr];\r\n case DE_LOCALE_KEY:\r\n return [appLocale, formatLocale, appCountryCode, de];\r\n case IT_LOCALE_KEY:\r\n return [appLocale, formatLocale, appCountryCode, it];\r\n case FR_CA_LOCALE_KEY:\r\n return [appLocale, formatLocale, appCountryCode, frCa];\r\n case ES_LOCALE_KEY:\r\n return [appLocale, formatLocale, appCountryCode, es];\r\n case ES_MX_LOCALE_KEY:\r\n return [appLocale, formatLocale, appCountryCode, esMx];\r\n default:\r\n return [appLocale, formatLocale, appCountryCode];\r\n }\r\n }, [sysLocale, sysCountryCode]);\r\n\r\n return {\r\n locale,\r\n formattedLocale,\r\n countryCode,\r\n messages,\r\n };\r\n};\r\n","import { classNamesFunction, ICalloutProps, Toggle } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport AppMessages from '../../App.messages';\r\nimport { getScreenReaderTextStyles } from '../../utils/GlobalStyleUtils';\r\nimport { InfoButton } from '../InfoButton';\r\nimport { IInfoToggleProps, IInfoToggleStyleProps, IInfoToggleStyles } from './InfoToggle.types';\r\n\r\nconst getClassNames = classNamesFunction<IInfoToggleStyleProps, IInfoToggleStyles>();\r\n\r\nexport class InfoToggleBase extends React.Component<IInfoToggleProps> {\r\n public render(): JSX.Element {\r\n const { styles, theme, label, checked, onChange, calloutContent, ariaDescription, calloutOnDismiss, iconButtonOnClick } = this.props;\r\n const { formatMessage } = this.props.intl;\r\n\r\n const classNames = getClassNames(styles, { theme: theme! });\r\n const calloutProps: ICalloutProps = {\r\n calloutWidth: 300,\r\n };\r\n return (\r\n <div className={classNames.root}>\r\n <Toggle\r\n onText={label}\r\n offText={label}\r\n defaultChecked={checked}\r\n onChange={onChange}\r\n styles={classNames.subComponentStyles.toggle}\r\n aria-describedby={'toggleDescription'}\r\n />\r\n <InfoButton\r\n ariaLabel={formatMessage(AppMessages.infoLabel, { label: label })}\r\n ariaDescription={formatMessage(AppMessages.infoDescription, { label: label })}\r\n iconTitle=\"Information\"\r\n calloutContent={calloutContent}\r\n calloutProps={calloutProps}\r\n iconButtonOnClick={iconButtonOnClick}\r\n calloutOnDismiss={calloutOnDismiss}\r\n />\r\n <span id=\"toggleDescription\" style={getScreenReaderTextStyles()}>\r\n {ariaDescription}\r\n </span>\r\n </div>\r\n );\r\n }\r\n}\r\n","import { IInfoToggleStyleProps, IInfoToggleStyles } from './InfoToggle.types';\r\n\r\nexport const getStyles = (props: IInfoToggleStyleProps): IInfoToggleStyles => {\r\n return {\r\n root: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n subComponentStyles: {\r\n toggle: {\r\n root: {\r\n marginBottom: '0px',\r\n },\r\n },\r\n },\r\n };\r\n};\r\n","import { styled } from '@fluentui/react';\r\nimport { InfoToggleBase } from './InfoToggle.base';\r\nimport { getStyles } from './InfoToggle.styles';\r\nimport { IInfoToggleProps, IInfoToggleStyleProps, IInfoToggleStyles } from './InfoToggle.types';\r\n\r\nexport const InfoToggle = styled<IInfoToggleProps, IInfoToggleStyleProps, IInfoToggleStyles>(InfoToggleBase, getStyles, undefined, {\r\n scope: 'InfoToggle',\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n selectTextToggleLabel: {\r\n id: 'dataGrid.selectTextToggleLabel',\r\n defaultMessage: 'Select text',\r\n },\r\n selectTextToggleAriaDesc: {\r\n id: 'dataGrid.selectTextToggleAriaDesc',\r\n defaultMessage: 'Turn on the toggle to enable modal selection of grid',\r\n },\r\n ariaLabelForSelectAllCheckbox: {\r\n id: 'dataGrid.ariaLabelForSelectAllCheckbox',\r\n defaultMessage: 'Toggle selection for all items',\r\n },\r\n ariaLabelForSelectionColumn: {\r\n id: 'dataGrid.ariaLabelForSelectionColumn',\r\n defaultMessage: 'Toggle selection',\r\n },\r\n checkButtonAriaLabel: {\r\n id: 'dataGrid.checkButtonAriaLabel',\r\n defaultMessage: 'Row selection checkbox',\r\n },\r\n columnAriaLabel: {\r\n id: 'dataGrid.columnAriaLabel',\r\n defaultMessage: 'Click to open options for {columnName} column',\r\n },\r\n columnSortAscendingAriaLabel: {\r\n id: 'dataGrid.columnSortAscendingAriaLabel',\r\n defaultMessage: 'Grid sorted ascending using {columnName} column',\r\n },\r\n columnSortDescendingAriaLabel: {\r\n id: 'dataGrid.columnSortDescendingAriaLabel',\r\n defaultMessage: 'Grid sorted descending using {columnName} column',\r\n },\r\n numberOfItemsAfterFilterLabel: {\r\n id: 'dataGrid.numberOfItemsAfterFilterLabel',\r\n defaultMessage: 'Number of items after filter applied: {displayItems}',\r\n },\r\n commandBarNavigationHelpArialLabel: {\r\n id: 'dataGrid.commandBarNavigationHelpArialLabel',\r\n defaultMessage: 'Use left and right arrow keys to navigate between options',\r\n },\r\n columnResizeDialogTitle: {\r\n id: 'dataGrid.columnResizeDialogTitle',\r\n defaultMessage: 'Resize column',\r\n },\r\n columnWidthFieldLabel: {\r\n id: 'dataGrid.columnWidthFieldLabel',\r\n defaultMessage: 'Enter column width',\r\n },\r\n columnResizeDialogDescription: {\r\n id: 'dataGrid.columnWidthFieldLabel',\r\n defaultMessage: 'Enter desired column width in pixels',\r\n },\r\n resizeButtonLabel: {\r\n id: 'dataGrid.resizeButtonLabel',\r\n defaultMessage: 'Resize',\r\n },\r\n sortButtonLabel: {\r\n id: 'dataGrid.sortButtonLabel',\r\n defaultMessage: 'Sort',\r\n },\r\n});\r\n","import {\r\n Announced,\r\n BaseComponent,\r\n buildColumns,\r\n classNamesFunction,\r\n ColumnActionsMode,\r\n CommandBar,\r\n ConstrainMode,\r\n ContextualMenu,\r\n DefaultButton,\r\n DetailsListLayoutMode,\r\n Dialog,\r\n DialogFooter,\r\n DialogType,\r\n IButtonProps,\r\n IColumn,\r\n ICommandBarProps,\r\n IContextualMenuProps,\r\n IDetailsHeaderProps,\r\n IDetailsList,\r\n IProcessedStyleSet,\r\n IRenderFunction,\r\n IScrollablePane,\r\n ITextField,\r\n ITooltipHostProps,\r\n Label,\r\n nullRender,\r\n PrimaryButton,\r\n ScrollablePane,\r\n ScrollbarVisibility,\r\n SearchBox,\r\n Selection,\r\n SelectionMode,\r\n ShimmeredDetailsList,\r\n Sticky,\r\n StickyPositionType,\r\n TextField,\r\n TooltipHost,\r\n} from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { getAppStore, LifeCycleStatus, Model, onHelpInfoCalloutOpened, onHelpInfoChanged } from '../../@data';\r\nimport { FilterCondition } from '../../@data/store/schema/enums/FilterCondition';\r\nimport appMessages from '../../App.messages';\r\nimport { getSelectionMode, sortItemsBasedOnColumn } from '../../utils/DataGridUtils';\r\nimport { FormItem } from '../Form';\r\nimport { GridFilter } from '../GridFilter/GridFilter';\r\nimport { FilterType, IFilterDetails, IGridFilter } from '../GridFilter/GridFilter.types';\r\nimport { InfoToggle } from '../InfoToggle';\r\nimport messages from './DataGrid.messages';\r\nimport { IDataGrid, IDataGridProps, IDataGridStyleProps, IDataGridStyles } from './DataGrid.types';\r\n\r\nconst getClassNames = classNamesFunction<IDataGridStyleProps, IDataGridStyles>();\r\n\r\nexport enum DataGridSelectionMode {\r\n None,\r\n Single,\r\n Multiple,\r\n All,\r\n}\r\n\r\ninterface IDataGridState {\r\n displayedItems: Model[];\r\n lastSortedColumn?: IColumn;\r\n selectedCommandBarProps: ICommandBarProps;\r\n isModalSelection?: boolean;\r\n announcedMessage?: string;\r\n filterApplied?: boolean;\r\n isResizeDialogOpen?: boolean;\r\n columnHeaderMenuProps?: IContextualMenuProps;\r\n}\r\n\r\nexport class DataGridBase extends BaseComponent<IDataGridProps, IDataGridState> implements IDataGrid {\r\n private _scrollablePane = React.createRef<IScrollablePane>();\r\n private _selection: Selection;\r\n private _classNames: IProcessedStyleSet<IDataGridStyles>;\r\n private _gridFilter = React.createRef<IGridFilter>();\r\n private _columnToEdit: IColumn | null;\r\n private _columnWidthFieldRef = React.createRef<ITextField>();\r\n private _detailsListRef = React.createRef<IDetailsList>();\r\n\r\n constructor(props: IDataGridProps) {\r\n super(props);\r\n this._selection = new Selection({\r\n onSelectionChanged: () => {\r\n this.setState({\r\n selectedCommandBarProps: this._buildCommandPropsOnSelection(),\r\n });\r\n },\r\n });\r\n let items = this.props.detailListProps.items;\r\n this.state = {\r\n selectedCommandBarProps: this._buildCommandPropsOnSelection(),\r\n displayedItems: items,\r\n isModalSelection: false,\r\n announcedMessage: undefined,\r\n filterApplied: false,\r\n isResizeDialogOpen: false,\r\n };\r\n\r\n const columns = this._buildDataGridColumns();\r\n if (columns.length >= 1) {\r\n // Default to sorting by columns[0] ascending if no specific column is specified.\r\n const selectedSortColumn = this.props.sortByColumn\r\n ? columns.find((element) => this.props.sortByColumn !== undefined && element.key === this.props.sortByColumn.columnKeyToSortBy)\r\n : undefined;\r\n const lastSortedColumn = selectedSortColumn ? selectedSortColumn : columns[0];\r\n lastSortedColumn.isSorted = true;\r\n\r\n // Default is sort by ascending unless a valid column is selected and sort order is selected.\r\n lastSortedColumn.isSortedDescending =\r\n selectedSortColumn && this.props.sortByColumn && this.props.sortByColumn.isSortedDescending !== undefined\r\n ? this.props.sortByColumn.isSortedDescending\r\n : false;\r\n\r\n // Modify data to be suitable for UI display using displayFunction sent for some columns\r\n items = this.modifyDataUsingDisplayFunction(items);\r\n\r\n this.state = {\r\n selectedCommandBarProps: this._buildCommandPropsOnSelection(),\r\n lastSortedColumn: lastSortedColumn,\r\n displayedItems: sortItemsBasedOnColumn(items, lastSortedColumn),\r\n };\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: IDataGridProps, prevState: IDataGridState) {\r\n if (this.props.detailListProps.items === prevProps.detailListProps.items) {\r\n return;\r\n }\r\n\r\n // Data has been changed, modifying and sorting data before re-rendering the data grid.\r\n let items = this.props.detailListProps.items;\r\n items = this.modifyDataUsingDisplayFunction(items);\r\n\r\n this.setState({\r\n displayedItems: sortItemsBasedOnColumn(items, prevState.lastSortedColumn),\r\n });\r\n\r\n // reset grid filter when grid data changes\r\n if (this._gridFilter.current) {\r\n this._gridFilter.current.resetGridFilter();\r\n }\r\n\r\n // add 'aria-busy' to detail list component to enhance accessibility capacity\r\n if (this._detailsListRef.current) {\r\n const detailListWrapper = document.querySelector('div[role=\"row\"].ms-DetailsHeader[data-automationid=\"DetailsHeader\"]');\r\n if (detailListWrapper && !detailListWrapper.hasAttribute?.('aria-busy')) {\r\n detailListWrapper.setAttribute('aria-busy', 'true');\r\n }\r\n }\r\n }\r\n\r\n public getSelection(): Selection {\r\n return this._selection;\r\n }\r\n\r\n public getDisplayedItems(): Model[] {\r\n return this.state.displayedItems;\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { detailListProps, styles, theme, filterProps, dataIsLoading, helpInfo, dataGridfilterProps, searchResultsVisible } = this.props;\r\n const { displayedItems, lastSortedColumn, isModalSelection, announcedMessage, filterApplied } = this.state;\r\n const columns = this._buildDataGridColumns(lastSortedColumn, detailListProps.items);\r\n const commandBarProps = this._buildCommandPropsOnSelection();\r\n const displayedItemCount = displayedItems.length;\r\n this._classNames = getClassNames(styles, { theme: theme! });\r\n const { formatMessage } = this.props.intl;\r\n const { locale } = getAppStore();\r\n\r\n let filterField = nullRender();\r\n if (filterProps) {\r\n const {\r\n searchBoxPlaceholder,\r\n searchBoxVisible,\r\n onItemDisplayedLabel,\r\n onChange,\r\n searchBoxValue,\r\n searchBoxAriaLabel,\r\n onChangeText,\r\n } = filterProps;\r\n filterField = (\r\n <div className={this._classNames.filter}>\r\n {searchBoxVisible && (\r\n <FormItem>\r\n <SearchBox\r\n className={this._classNames.filterItem}\r\n onSearch={(newValue) => onChange(newValue)}\r\n onClear={() => onChange('')}\r\n onChange={(event, newValue) => onChangeText(event, newValue)}\r\n placeholder={searchBoxPlaceholder}\r\n value={searchBoxValue}\r\n ariaLabel={searchBoxAriaLabel}\r\n />\r\n </FormItem>\r\n )}\r\n <Label className={this._classNames.filterItem}> {onItemDisplayedLabel(displayedItemCount)} </Label>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={this._classNames.root}>\r\n {filterField}\r\n <CommandBar\r\n {...commandBarProps}\r\n styles={this._classNames.subComponentStyles.commandBar}\r\n ariaLabel={formatMessage(messages.commandBarNavigationHelpArialLabel)}\r\n />\r\n {searchResultsVisible ? (\r\n <Label className={this._classNames.searchResults}> {'Search Results: ' + displayedItemCount} </Label>\r\n ) : null}\r\n {dataGridfilterProps ? (\r\n <GridFilter\r\n intl={this.props.intl}\r\n componentRef={this._gridFilter}\r\n {...dataGridfilterProps}\r\n onFilterApplied={this._onFilterApplied}\r\n />\r\n ) : null}\r\n <InfoToggle\r\n label={formatMessage(messages.selectTextToggleLabel)}\r\n intl={this.props.intl}\r\n checked={isModalSelection}\r\n onChange={this._onChangeModalSelection}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_SelectMode', locale)}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n ariaDescription={formatMessage(messages.selectTextToggleAriaDesc)}\r\n />\r\n <ScrollablePane\r\n componentRef={this._scrollablePane}\r\n scrollbarVisibility={ScrollbarVisibility.auto}\r\n styles={this._classNames.subComponentStyles.scrollablePane}\r\n >\r\n {filterApplied ? (\r\n <Announced\r\n message={this.props.intl.formatMessage(messages.numberOfItemsAfterFilterLabel, { displayItems: displayedItemCount })}\r\n />\r\n ) : undefined}\r\n {announcedMessage ? <Announced message={announcedMessage} /> : undefined}\r\n <ShimmeredDetailsList\r\n {...detailListProps}\r\n componentRef={this._detailsListRef}\r\n items={!this.props.notReadyProps ? displayedItems : []}\r\n columns={columns}\r\n onColumnHeaderClick={this._onColumnHeaderClick}\r\n layoutMode={DetailsListLayoutMode.justified}\r\n constrainMode={ConstrainMode.unconstrained}\r\n onRenderDetailsHeader={this._onRenderDetailsHeader}\r\n selection={this._selection}\r\n selectionMode={isModalSelection ? SelectionMode.none : undefined}\r\n selectionPreservedOnEmptyClick={true}\r\n enableShimmer={dataIsLoading}\r\n ariaLabelForSelectAllCheckbox={formatMessage(messages.ariaLabelForSelectAllCheckbox)}\r\n ariaLabelForSelectionColumn={formatMessage(messages.ariaLabelForSelectionColumn)}\r\n ariaLabelForGrid={this.props.ariaLabel}\r\n checkButtonAriaLabel={formatMessage(messages.checkButtonAriaLabel)}\r\n aria-busy=\"true\"\r\n />\r\n {this.state.columnHeaderMenuProps && <ContextualMenu {...this.state.columnHeaderMenuProps} />}\r\n <Dialog\r\n hidden={!this.state.isResizeDialogOpen}\r\n onDismiss={this._hideResizeDialog}\r\n dialogContentProps={this._getResizeDialogContentProps()}\r\n >\r\n <TextField\r\n type=\"number\"\r\n componentRef={this._columnWidthFieldRef}\r\n ariaLabel={formatMessage(messages.columnWidthFieldLabel)}\r\n onKeyDown={(ev) => {\r\n if (ev.key === 'Enter') {\r\n this._resizeColumn();\r\n }\r\n }}\r\n />\r\n <DialogFooter>\r\n <PrimaryButton onClick={this._resizeColumn} text={formatMessage(messages.resizeButtonLabel)} />\r\n <DefaultButton onClick={this._hideResizeDialog} text={formatMessage(appMessages.cancel)} />\r\n </DialogFooter>\r\n </Dialog>\r\n </ScrollablePane>\r\n </div>\r\n );\r\n }\r\n\r\n private _hideResizeDialog = () => this.setState({ isResizeDialogOpen: false });\r\n private _showResizeDialog = () => this.setState({ isResizeDialogOpen: true });\r\n\r\n private _handleResizeButtonClick = (ev: React.MouseEvent<HTMLElement>, column: IColumn) => {\r\n ev.stopPropagation();\r\n\r\n this._columnToEdit = column;\r\n this._showResizeDialog();\r\n };\r\n\r\n private _onColumnHeaderClick = (ev: React.MouseEvent<HTMLElement>, column: IColumn): void => {\r\n this.setState({ columnHeaderMenuProps: this._getContextualMenuProps(ev, column) });\r\n };\r\n\r\n private _getContextualMenuProps = (ev: React.MouseEvent<HTMLElement>, column: IColumn): IContextualMenuProps => {\r\n const { formatMessage } = this.props.intl;\r\n const items = [\r\n { key: 'resize', text: formatMessage(messages.resizeButtonLabel), onClick: () => this._handleResizeButtonClick(ev, column) },\r\n { key: 'sort', text: formatMessage(messages.sortButtonLabel), onClick: () => this._handleSortButtonClick(ev, column) },\r\n ];\r\n\r\n return {\r\n items: items,\r\n target: ev.currentTarget as HTMLElement,\r\n gapSpace: 10,\r\n isBeakVisible: true,\r\n onDismiss: () => this.setState({ columnHeaderMenuProps: undefined }),\r\n };\r\n };\r\n\r\n private _getResizeDialogContentProps = () => {\r\n const { formatMessage } = this.props.intl;\r\n const { columnResizeDialogTitle, columnResizeDialogDescription } = messages;\r\n\r\n return {\r\n type: DialogType.normal,\r\n title: formatMessage(columnResizeDialogTitle),\r\n closeButtonAriaLabel: formatMessage(appMessages.close),\r\n subText: formatMessage(columnResizeDialogDescription),\r\n };\r\n };\r\n\r\n private _resizeColumn = () => {\r\n const column = this._columnToEdit;\r\n if (!column) {\r\n return;\r\n }\r\n\r\n this._detailsListRef.current?.updateColumn(column, { width: Number(this._columnWidthFieldRef.current?.value) });\r\n this._hideResizeDialog();\r\n this._columnToEdit = null;\r\n };\r\n\r\n private modifyDataUsingDisplayFunction = (items: Model[]) => {\r\n const { columns } = this.props.detailListProps;\r\n\r\n if (columns && columns.length >= 1) {\r\n columns\r\n .filter((col) => col.displayFunction !== undefined)\r\n .forEach((col) => {\r\n items.forEach((item) => {\r\n item[col.columnName] = col.displayFunction ? col.displayFunction(item[col.columnName], item) : item[col.columnName];\r\n });\r\n });\r\n }\r\n\r\n return items;\r\n };\r\n\r\n private _onFilterApplied = (filterList: IFilterDetails[]): void => {\r\n // displayed items might already be filtered, hence to modify filters considering original items\r\n const { items } = this.props.detailListProps;\r\n let filteredItems = sortItemsBasedOnColumn(items, this.state.lastSortedColumn);\r\n\r\n filterList.forEach((filterCol) => {\r\n if (filterCol.customFunction) {\r\n filteredItems = filteredItems.filter((dataRow: Model) =>\r\n filterCol.customFunction ? filterCol.customFunction(dataRow, filterCol) : false\r\n );\r\n } else {\r\n filteredItems = this._applyFilter(filteredItems, filterCol);\r\n }\r\n });\r\n this.setState({\r\n displayedItems: filteredItems,\r\n filterApplied: true,\r\n });\r\n };\r\n\r\n private _applyFilter = (items: Model[], filterColumn: IFilterDetails): Model[] => {\r\n if (filterColumn.columnName !== undefined) {\r\n const filteredItems = items.filter((item: object) => {\r\n const val = item[filterColumn.columnName || ''];\r\n\r\n switch (filterColumn.filterType) {\r\n case FilterType.custom:\r\n return filterColumn.filterCondition ? val === filterColumn.filterCondition : true;\r\n\r\n case FilterType.date: {\r\n const dateVal = new Date(val);\r\n const { startDate, endDate } = filterColumn;\r\n\r\n if (startDate || endDate) {\r\n if (startDate && endDate) {\r\n return dateVal >= startDate && dateVal <= endDate;\r\n }\r\n if (endDate) {\r\n return dateVal <= endDate;\r\n }\r\n if (startDate) {\r\n return dateVal >= startDate;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n case FilterType.relational: {\r\n const numVal = Number(val);\r\n\r\n if (filterColumn.filterText) {\r\n const filterNumVal = Number(filterColumn.filterText);\r\n switch (filterColumn.filterCondition) {\r\n case FilterCondition.Equals:\r\n return numVal === filterNumVal;\r\n case FilterCondition.DoesNotEqual:\r\n return numVal !== filterNumVal;\r\n case FilterCondition.GreaterThan:\r\n return numVal > filterNumVal;\r\n case FilterCondition.GreaterThanEqual:\r\n return numVal >= filterNumVal;\r\n case FilterCondition.LessThan:\r\n return numVal < filterNumVal;\r\n case FilterCondition.LessThanEqual:\r\n return numVal <= filterNumVal;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n case FilterType.string: {\r\n const filterVal = filterColumn.filterText!.toLocaleLowerCase();\r\n const strVal = String(val).toLocaleLowerCase();\r\n switch (filterColumn.filterCondition) {\r\n case FilterCondition.Contains:\r\n return strVal.indexOf(filterVal) !== -1;\r\n case FilterCondition.DoesNotContain:\r\n return strVal.indexOf(filterVal) === -1;\r\n case FilterCondition.BeginsWith:\r\n return strVal.indexOf(filterVal) === 0;\r\n case FilterCondition.EndsWith: {\r\n const lastIndex = strVal.lastIndexOf(filterVal);\r\n return lastIndex === strVal.length - filterVal.length;\r\n }\r\n case FilterCondition.Equals:\r\n return strVal === filterVal;\r\n case FilterCondition.DoesNotEqual:\r\n return strVal !== filterVal;\r\n }\r\n }\r\n }\r\n return val.toLocaleLowerCase().indexOf(filterColumn.filterText!.toLocaleLowerCase()) !== -1;\r\n });\r\n\r\n return filteredItems;\r\n }\r\n // in case column name is not passed, filter cannot be applied.\r\n return items;\r\n };\r\n\r\n private _onChangeModalSelection = (ev: React.MouseEvent<HTMLElement>, checked: boolean): void => {\r\n this.setState({ isModalSelection: checked });\r\n };\r\n\r\n // TODO: once we have all the ManagePages pass the column mapping, then we can remove this default buildcolumn behavior from the list\r\n private _buildDataGridColumns(lastSortedColumn?: IColumn, list?: Model[]): IColumn[] {\r\n const { formatMessage } = this.props.intl;\r\n const columnModel = this.props.detailListProps.columns;\r\n\r\n if (!columnModel && list) {\r\n return buildColumns(list, true).map((c) => {\r\n c.isCollapsible = false;\r\n return c;\r\n });\r\n }\r\n const newColumns: IColumn[] = [];\r\n if (columnModel) {\r\n // traversing over the columnModel will ensure order and columns for which we dont have value in items\r\n columnModel.forEach((column) => {\r\n if (column.isVisible) {\r\n let isSorted = false;\r\n if (lastSortedColumn && lastSortedColumn.key === column.columnName) {\r\n isSorted = true;\r\n }\r\n const newColumn: IColumn = {\r\n key: column.columnName,\r\n name: column.friendlyName,\r\n fieldName: column.columnName,\r\n isCollapsible: false,\r\n minWidth: 100,\r\n maxWidth: 300,\r\n isResizable: true,\r\n isPadded: true,\r\n isSorted: isSorted,\r\n isMultiline: true,\r\n columnActionsMode: ColumnActionsMode.hasDropdown,\r\n isSortedDescending: isSorted ? lastSortedColumn!.isSortedDescending : undefined,\r\n ariaLabel: formatMessage(messages.columnAriaLabel, { columnName: column.friendlyName }),\r\n sortAscendingAriaLabel: formatMessage(messages.columnSortAscendingAriaLabel, { columnName: column.friendlyName }),\r\n sortDescendingAriaLabel: formatMessage(messages.columnSortDescendingAriaLabel, { columnName: column.friendlyName }),\r\n };\r\n newColumns.push(newColumn);\r\n }\r\n });\r\n }\r\n return newColumns;\r\n }\r\n\r\n private _buildCommandPropsOnSelection(): ICommandBarProps {\r\n const overflowButtonProps: IButtonProps = { ariaLabel: this.props.intl.formatMessage(appMessages.moreOptionsButtonAriaLabel) };\r\n const commandBarProps: ICommandBarProps = { items: [], overflowButtonProps };\r\n\r\n if (this.props.commandBarProps) {\r\n const mode = getSelectionMode(this._selection.count);\r\n const hasSelection = (item) => !item.selectionModes || item.selectionModes.includes(mode);\r\n const hasStatusSelection = (item) => !item.selectionStatus || this._hasStatusinSelection(item.selectionStatus);\r\n commandBarProps.items = this.props.commandBarProps.items.filter((item) => hasSelection(item) && hasStatusSelection(item));\r\n if (this.props.commandBarProps.farItems) {\r\n commandBarProps.farItems = this.props.commandBarProps.farItems.filter((item) => hasSelection(item) && hasStatusSelection(item));\r\n }\r\n }\r\n\r\n return commandBarProps;\r\n }\r\n\r\n private _hasStatusinSelection(status: LifeCycleStatus): boolean {\r\n const selectedIndices = this._selection.getSelectedIndices();\r\n const items = this._selection.getItems() as Model[];\r\n return selectedIndices.some((selectedIndex) => status === items[selectedIndex].status);\r\n }\r\n\r\n private _handleSortButtonClick = (ev?: React.MouseEvent<HTMLElement>, column?: IColumn): void => {\r\n if (!ev || !column) {\r\n return;\r\n }\r\n let isSortedDescending = column.isSortedDescending;\r\n if (column.isSorted) {\r\n isSortedDescending = !isSortedDescending;\r\n }\r\n column.isSortedDescending = isSortedDescending;\r\n\r\n const { displayedItems } = this.state;\r\n\r\n this.setState({\r\n lastSortedColumn: column,\r\n displayedItems: sortItemsBasedOnColumn(displayedItems, column),\r\n announcedMessage: column.isSortedDescending\r\n ? this.props.intl.formatMessage(messages.columnSortDescendingAriaLabel, { columnName: column.name })\r\n : this.props.intl.formatMessage(messages.columnSortAscendingAriaLabel, { columnName: column.name }),\r\n });\r\n };\r\n\r\n private _onRenderDetailsHeader = (\r\n props?: IDetailsHeaderProps,\r\n defaultRender?: IRenderFunction<IDetailsHeaderProps>\r\n ): JSX.Element | null => {\r\n let notReadyPropsRenderer: JSX.Element | undefined;\r\n\r\n if (this.props.notReadyProps !== undefined) {\r\n notReadyPropsRenderer = (\r\n <React.Fragment>\r\n <div className={this._classNames.notReadyLabel}>{this.props.notReadyProps.notReadyLabel}</div>\r\n </React.Fragment>\r\n );\r\n }\r\n if (!props || !defaultRender) {\r\n return nullRender();\r\n }\r\n\r\n return (\r\n <Sticky stickyPosition={StickyPositionType.Header} isScrollSynced={true}>\r\n {defaultRender({\r\n ...props,\r\n onRenderColumnHeaderTooltip: (tooltipHostProps?: ITooltipHostProps) => <TooltipHost {...tooltipHostProps} />,\r\n })}\r\n {notReadyPropsRenderer}\r\n </Sticky>\r\n );\r\n };\r\n}\r\n","import { DataGridSelectionMode } from '../../components/DataGrid';\r\n\r\nexport function getSelectionMode(selectionCount: Number): DataGridSelectionMode {\r\n switch (selectionCount) {\r\n case 0:\r\n return DataGridSelectionMode.None;\r\n case 1:\r\n return DataGridSelectionMode.Single;\r\n default:\r\n return DataGridSelectionMode.Multiple;\r\n }\r\n}\r\n","import { IPubcenterSpacing } from '../../../theme';\r\nimport { IDataGridStyleProps, IDataGridStyles } from './DataGrid.types';\r\n\r\nexport const getStyles = (props: IDataGridStyleProps): IDataGridStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n return {\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: 'inherit',\r\n flex: 1,\r\n position: 'relative',\r\n },\r\n filter: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n marginBottom: spacing.size8,\r\n },\r\n filterItem: {\r\n marginLeft: spacing.size8,\r\n },\r\n searchResults: {\r\n position: 'absolute',\r\n top: spacing.size10,\r\n right: spacing.size36,\r\n },\r\n subComponentStyles: {\r\n scrollablePane: {\r\n root: {\r\n flex: 1,\r\n overflowY: 'auto',\r\n position: 'relative',\r\n },\r\n },\r\n commandBar: {\r\n root: {\r\n marginBottom: spacing.size8,\r\n },\r\n },\r\n },\r\n notReadyLabel: {\r\n color: theme.palette.neutralSecondary,\r\n marginLeft: spacing.size48,\r\n position: 'relative',\r\n marginTop: spacing.size12,\r\n fontSize: theme.fonts.medium.fontSize,\r\n },\r\n };\r\n};\r\n","import { styled } from '@fluentui/react';\r\nimport { DataGridBase } from './DataGrid.base';\r\nimport { getStyles } from './DataGrid.styles';\r\nimport { IDataGridProps, IDataGridStyleProps, IDataGridStyles } from './DataGrid.types';\r\n\r\n// Use Fabric Base guidelines since this might be contributed back to Fabric.\r\nexport const DataGrid = styled<IDataGridProps, IDataGridStyleProps, IDataGridStyles>(DataGridBase, getStyles, undefined, {\r\n scope: 'DataGrid',\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n clarityRequestSuccess: {\r\n id: 'siteManagement.clarityRequestSuccess',\r\n defaultMessage: \"You've successfully sent a request to relink your Clarity project ID.\",\r\n },\r\n propertyCreateSuccess: {\r\n id: 'siteManagement.propertyCreateSuccess',\r\n defaultMessage: \"You've successfully created a new property {entityId}.\",\r\n },\r\n propertyCreateFailed: {\r\n id: 'siteManagement.propertyCreateFailed',\r\n defaultMessage: 'Create properties failed, please try again later.',\r\n },\r\n propertyEditSuccess: {\r\n id: 'siteManagement.propertyEditSuccess',\r\n defaultMessage: \"You've successfully edited your property {entityId}.\",\r\n },\r\n invalidForm: {\r\n id: 'siteManagement.invalidForm',\r\n defaultMessage: 'Property form \"{formOperation}\" is invalid id {entityId}',\r\n },\r\n invalidState: {\r\n id: 'siteManagement.invalidState',\r\n defaultMessage: 'You have arrived in an invalid state, please report.',\r\n },\r\n clarityRelinkSuccess: {\r\n id: 'siteManagement.clarityRelinkSuccess',\r\n defaultMessage: \"You've successfully sent a request to relink your Clarity project ID.\",\r\n },\r\n clarityRelinkFailed: {\r\n id: 'siteManagement.clarityRelinkFailed',\r\n defaultMessage: \"Your request to relink your Clarity project {projectId} wasn't successful. Please try again later.\",\r\n },\r\n clarityLinkSuccess: {\r\n id: 'siteManagement.clarityLinkSuccess',\r\n defaultMessage: \"You've successfully sent a request to link your Clarity project.\",\r\n },\r\n clarityUnlinkSuccess: {\r\n id: 'siteManagement.clarityUnlinkSuccess',\r\n defaultMessage: \"You've successfully unlinked your Clarity project.\",\r\n },\r\n clarityLinkFailed: {\r\n id: 'siteManagement.clarityLinkFailed',\r\n defaultMessage: \"We're unable to link your Clarity project {projectId}.\",\r\n },\r\n propertyLoadError: {\r\n id: 'siteManagement.propertyLoadError',\r\n defaultMessage: \"We're unable to load your entity. Please try again later.\",\r\n },\r\n propertyFormError: {\r\n id: 'siteManagement.propertyFormError',\r\n defaultMessage: 'There are {errorsCount} errors in the form. Please revise and resubmit to continue.',\r\n },\r\n adUnitsFetchFailed: {\r\n id: 'siteManagement.adUnitsFetchFailed',\r\n defaultMessage: \"We're unable to load your ad units.\",\r\n },\r\n sitesFetchFailed: {\r\n id: 'siteManagement.sitesFetchFailed',\r\n defaultMessage: \"We're unable to load your sites.\",\r\n },\r\n propertiesFetchFailed: {\r\n id: 'siteManagement.sitesFetchFailed',\r\n defaultMessage: \"We're unable to load your properties.\",\r\n },\r\n failedToLoadSites: {\r\n id: 'siteManagement.failedToLoadSites',\r\n defaultMessage: 'Failed to load sites',\r\n },\r\n});\r\n","import { Account } from './Account';\r\nimport { Model } from './Model';\r\nimport { PublisherCreate } from './PublisherCreate';\r\nimport { User } from './User';\r\n\r\nexport class PublisherAccountUserCreate implements Model {\r\n public apiPath = 'signup';\r\n public className = 'signup';\r\n public publisher?: PublisherCreate;\r\n public account?: Account;\r\n public user?: User;\r\n}\r\n","import { uiConfig } from '../../config/ui.config';\r\nimport { onLoadingSetting, onLoadingWaiting } from '../actions';\r\nimport {\r\n Account,\r\n AccountSKU,\r\n FilterDownloader,\r\n IRequest,\r\n IResponse,\r\n Model,\r\n NativeAdTemplate,\r\n NotificationPreferencesUpdate,\r\n PhoneVerificationGenerateCode,\r\n PhoneVerificationVerifyCode,\r\n Publisher,\r\n UpdateUserContactDetails,\r\n User,\r\n UserContext,\r\n UserInvitation,\r\n UserRoleUpdate,\r\n UserUpdateLanguage,\r\n} from '../store/schema';\r\nimport {\r\n AdSenseAdUnitStatus,\r\n AdSenseConnectAdUnit,\r\n AdSenseDisconnectAdUnit,\r\n AdSenseUpdateAdUnitStatus,\r\n} from '../store/schema/models/AdSenseAdUnitStatus';\r\nimport {\r\n AdSenseMediation,\r\n AdSenseMediationChooseGamNetwork,\r\n AdSenseMediationHealthCheck,\r\n AdSenseMediationOptIn,\r\n AdSenseMediationOptOut,\r\n AdSenseMediationToggle,\r\n} from '../store/schema/models/AdSenseMediation';\r\nimport { AddressValidation } from '../store/schema/models/AddressValidation';\r\nimport { Feedback } from '../store/schema/models/Feedback';\r\nimport { PublisherAccountUserCreate } from '../store/schema/models/PublisherAccountUserCreate';\r\nimport { ServingConfig } from '../store/schema/models/ServingConfigs';\r\nimport { UpdateClarityProject } from '../store/schema/models/UpdateClarityProject';\r\nimport { UserCreateFromInvitation } from '../store/schema/models/UserCreateFromInvitation';\r\nimport { handleApiErrors, handleError } from '../utils/handleApiErrors';\r\nimport { buildRequestHeadersWithAuthToken } from '../utils/requestUtils';\r\n\r\nexport class ApiError extends Error {\r\n public trackingId?: string;\r\n\r\n constructor(public code: number, message: string, trackingId?: string) {\r\n super(message);\r\n this.trackingId = trackingId;\r\n }\r\n}\r\n\r\nexport async function getEntity<T extends Model>(\r\n models: Model[],\r\n userContext?: UserContext,\r\n entity?: new () => T,\r\n params?: URLSearchParams,\r\n apiVersion?: string\r\n): Promise<T> {\r\n const url = constructUrl(models, entity, params, apiVersion);\r\n onLoadingSetting(false);\r\n return await wrapSendRequest<T>(url, 'GET', userContext);\r\n}\r\n\r\nexport async function listEntity<T extends Model>(\r\n models: Model[],\r\n userContext?: UserContext,\r\n entity?: new () => T,\r\n params?: URLSearchParams,\r\n apiVersion?: string\r\n): Promise<T[]> {\r\n const url = constructUrl(models, entity, params, apiVersion);\r\n onLoadingSetting(false);\r\n const response = await wrapSendRequest<T[]>(url, 'GET', userContext);\r\n return response;\r\n}\r\n\r\nconst SINGULAR_RESOURCE_ENTITIES_FOR_POST = [\r\n new AccountSKU().className,\r\n new UserInvitation().className,\r\n new Publisher().className,\r\n new Account().className,\r\n new NativeAdTemplate().className,\r\n new ServingConfig().className,\r\n new User().className,\r\n new UserCreateFromInvitation().className,\r\n new PublisherAccountUserCreate().className,\r\n new AdSenseMediationOptIn().className,\r\n new Feedback().className,\r\n new AddressValidation().className,\r\n new PhoneVerificationGenerateCode().className,\r\n new PhoneVerificationVerifyCode().className,\r\n];\r\n\r\nexport async function postEntity<T extends Model>(\r\n models: Model[],\r\n entity: new () => T,\r\n body?: T,\r\n userContext?: UserContext,\r\n params?: URLSearchParams,\r\n apiVersion?: string\r\n): Promise<T> {\r\n const url = constructUrl(models, entity, params, apiVersion);\r\n if (body && SINGULAR_RESOURCE_ENTITIES_FOR_POST.includes(body.className)) {\r\n onLoadingSetting(false);\r\n try {\r\n const response = await wrapSendRequest<T>(url, 'POST', userContext, body);\r\n return response ? response : Promise.reject('Invalid response for POST');\r\n } catch (err) {\r\n if (err.code === 400 || err.code === 403) {\r\n return handleError(new ApiError(err.code, err.message), url);\r\n }\r\n const error = `POST operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n } else {\r\n onLoadingSetting(false);\r\n try {\r\n const response = await wrapSendRequest<T[]>(url, 'POST', userContext, body);\r\n return response && response.length === 1 ? response[0] : Promise.reject('Invalid response for POST');\r\n } catch (err) {\r\n const error = `POST operation failed for ${url}. Errors: ${err}`;\r\n if (err.code === 404) {\r\n return handleError(new ApiError(404, error), url);\r\n }\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n }\r\n}\r\n\r\nconst SINGULAR_RESOURCE_ENTITIES_FOR_PUT = [\r\n new AccountSKU().className,\r\n new UserInvitation().className,\r\n new Publisher().className,\r\n new Account().className,\r\n new NativeAdTemplate().className,\r\n new ServingConfig().className,\r\n new User().className,\r\n new AdSenseMediationToggle().className,\r\n];\r\n\r\nexport async function putEntity<T extends Model>(\r\n models: Model[],\r\n body: T,\r\n userContext?: UserContext,\r\n entity?: new () => T,\r\n params?: URLSearchParams,\r\n apiVersion?: string\r\n): Promise<T> {\r\n let url = constructUrl(models, entity, params, apiVersion);\r\n if (body.className === new NativeAdTemplate().className) {\r\n url = url + '/' + encodeURIComponent(body.id);\r\n }\r\n\r\n if (SINGULAR_RESOURCE_ENTITIES_FOR_PUT.includes(body.className)) {\r\n const response = await sendRequest<T>(url, 'PUT', userContext, body);\r\n return response ? (response as T) : Promise.reject('Invalid response for PUT');\r\n } else {\r\n const response = await sendRequest<T[]>(url, 'PUT', userContext, body);\r\n if (body.className === new AdSenseAdUnitStatus().className) {\r\n if (!response['data'] && Array.isArray(response)) {\r\n // tslint:disable-next-line: no-any\r\n return response as any;\r\n }\r\n return response['data'];\r\n }\r\n\r\n return response && response.length === 1 ? response[0] : Promise.reject('Invalid response for PUT');\r\n }\r\n}\r\n\r\nexport async function patchEntity<T extends Model>(\r\n models: Model[],\r\n entity: new () => T,\r\n body?: T,\r\n userContext?: UserContext,\r\n params?: URLSearchParams,\r\n apiVersion?: string\r\n): Promise<T> {\r\n const url = constructUrl(models, entity, params, apiVersion);\r\n const response = await sendRequest<T[]>(url, 'PATCH', userContext, body);\r\n if (body && body.className === new UserRoleUpdate().className) {\r\n // tslint:disable-next-line: no-any\r\n return response as any;\r\n } else if (body && body.className === new UserUpdateLanguage().className) {\r\n return response['data'];\r\n }\r\n return response && response.length === 1 ? response[0] : (([] as unknown) as T);\r\n}\r\n\r\nexport async function deleteEntity<T extends Model>(\r\n models: Model[],\r\n entity?: new () => T,\r\n userContext?: UserContext,\r\n params?: URLSearchParams,\r\n apiVersion?: string,\r\n body?: T\r\n): Promise<T | T[]> {\r\n const url = constructUrl(models, entity, params, apiVersion);\r\n if (body && body.className === new AdSenseDisconnectAdUnit().className) {\r\n return await wrapSendRequest<T[]>(url, 'DELETE', userContext, body);\r\n } else {\r\n return await sendRequest<T>(url, 'DELETE', userContext, body);\r\n }\r\n}\r\n\r\nfunction wrapRequestBody<T extends Model>(body?: T) {\r\n if (!body) {\r\n return null;\r\n }\r\n\r\n const bodyWrapper: IRequest<T> = {};\r\n\r\n if (\r\n body.className === new AccountSKU().className ||\r\n body.className === new NativeAdTemplate().className ||\r\n body.className === new ServingConfig().className ||\r\n body.className === new Feedback().className ||\r\n body.className === new AddressValidation().className ||\r\n body.className === new PhoneVerificationGenerateCode().className ||\r\n body.className === new PhoneVerificationVerifyCode().className ||\r\n body.className === new AddressValidation().className\r\n ) {\r\n bodyWrapper[body.className] = body;\r\n } else {\r\n bodyWrapper[body.className] = [body];\r\n }\r\n\r\n return JSON.stringify(bodyWrapper);\r\n}\r\n\r\n// tslint:disable-next-line: max-line-length\r\nasync function wrapSendRequest<T extends Model | Model[]>(\r\n url: string,\r\n method: string,\r\n userContext?: UserContext,\r\n body?: Model\r\n): Promise<T> {\r\n const timeout = 30000;\r\n const id = setTimeout(() => onLoadingWaiting(true), timeout);\r\n\r\n const response = await sendRequest(url, method, userContext, body);\r\n clearTimeout(id);\r\n return response as T;\r\n}\r\n\r\nconst SINGULAR_RESOURCE_ENTITIES = [\r\n new Publisher().className,\r\n new Account().className,\r\n new UserInvitation().className,\r\n new UserCreateFromInvitation().className,\r\n new UserRoleUpdate().className,\r\n new User().className,\r\n new UpdateUserContactDetails().className,\r\n new UpdateClarityProject().className,\r\n new PublisherAccountUserCreate().className,\r\n new AdSenseAdUnitStatus().className,\r\n new AdSenseConnectAdUnit().className,\r\n new AdSenseDisconnectAdUnit().className,\r\n new AdSenseMediationToggle().className,\r\n new NotificationPreferencesUpdate().className,\r\n new UserUpdateLanguage().className,\r\n new PhoneVerificationGenerateCode().className,\r\n new PhoneVerificationVerifyCode().className,\r\n];\r\n\r\nasync function sendRequest<T extends Model | Model[]>(url: string, method: string, userContext?: UserContext, body?: Model): Promise<T> {\r\n const headers = await buildRequestHeadersWithAuthToken(url, userContext);\r\n\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: method,\r\n headers: headers,\r\n body: body && SINGULAR_RESOURCE_ENTITIES.includes(body.className) ? JSON.stringify(body) : wrapRequestBody(body),\r\n });\r\n\r\n if (url.includes('filterdownloader')) {\r\n const responseJson = await response.json();\r\n const magicValue1 = Object.keys(responseJson.data)[0];\r\n\r\n const FilterContent = new FilterDownloader();\r\n FilterContent.downloadUrl = responseJson.data[magicValue1] as string;\r\n return Promise.resolve(FilterContent as T);\r\n } else {\r\n // Handle error responses from the API\r\n if (!response.ok) {\r\n return handleApiErrors<T>(response, url);\r\n }\r\n // Successful API response\r\n const basicResponse = await response.json();\r\n\r\n let responseJson;\r\n\r\n if (url.includes('preauth/mediation')) {\r\n responseJson = basicResponse as T;\r\n } else {\r\n responseJson = basicResponse as IResponse<T>;\r\n }\r\n\r\n if (responseJson.data) {\r\n if (url.includes('preauth/mediation') || url.includes('entitySummary') || url.includes('metadata/xandr')) {\r\n return responseJson.data;\r\n }\r\n\r\n if ((body && body.className === new UserRoleUpdate().className) || url.includes('preauth/mediation')) {\r\n return (responseJson.data as unknown) as T;\r\n }\r\n\r\n if (\r\n body &&\r\n (body.className === new PhoneVerificationGenerateCode().className ||\r\n body.className === new PhoneVerificationVerifyCode().className ||\r\n body.className === new UserUpdateLanguage().className)\r\n ) {\r\n return responseJson as T;\r\n }\r\n\r\n const magicValue = Object.keys(responseJson.data)[0];\r\n return responseJson.data[magicValue];\r\n }\r\n }\r\n return Promise.resolve({} as T);\r\n } catch (err) {\r\n // Need to figure out where to send the logs\r\n const error = `${method} operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport function constructUrl(\r\n models: Model[],\r\n entity?: new () => Model,\r\n params?: URLSearchParams,\r\n apiVersion?: string,\r\n path?: string\r\n): string {\r\n let requestUrl = uiConfig.getApiBaseAddress(apiVersion);\r\n if (\r\n entity === AdSenseConnectAdUnit ||\r\n entity === AdSenseMediation ||\r\n entity === AdSenseDisconnectAdUnit ||\r\n entity === AdSenseMediationOptIn ||\r\n entity === AdSenseMediationToggle ||\r\n entity === AdSenseMediationHealthCheck ||\r\n entity === AdSenseMediationChooseGamNetwork ||\r\n entity === AdSenseAdUnitStatus ||\r\n entity === AdSenseUpdateAdUnitStatus ||\r\n entity === AdSenseMediationOptOut\r\n ) {\r\n requestUrl = requestUrl.slice(0, -5);\r\n }\r\n\r\n const urlArray = [requestUrl];\r\n models.forEach((model: Model) => {\r\n const modelClassName = model.className;\r\n\r\n if (!(modelClassName === 'accounts' && model.id === 0)) {\r\n urlArray.push(modelClassName);\r\n\r\n if (model.id !== undefined) {\r\n urlArray.push(model.id.toString());\r\n }\r\n }\r\n });\r\n\r\n if (entity) {\r\n const entityInstance = new entity();\r\n const overrideApiPath = entityInstance.apiPath;\r\n\r\n if (overrideApiPath) {\r\n urlArray.push(overrideApiPath);\r\n } else {\r\n const entityClassName = entityInstance.className;\r\n urlArray.push(entityClassName);\r\n }\r\n }\r\n\r\n if (path) {\r\n urlArray.push(path);\r\n }\r\n\r\n let url = urlArray.join('/');\r\n\r\n if (params) {\r\n url = url.concat('?' + params.toString());\r\n }\r\n\r\n return url;\r\n}\r\n","import { DEFAULT_CURRENCY_CODE } from '../../../constants/AppConstants';\r\nimport { roundNumber } from '../../../utils';\r\nimport { getStore } from '../../ad-management/Account/Settings/@data/store/store';\r\nimport { TythonColumnsEnum } from '../@data/store/schema/ColumnsEnum';\r\nexport function roundMetric(metric: TythonColumnsEnum, value, toString = false) {\r\n if (!value) {\r\n switch (metric) {\r\n case TythonColumnsEnum.Revenue:\r\n case TythonColumnsEnum.Viewability:\r\n case TythonColumnsEnum.FillRate:\r\n case TythonColumnsEnum.WinRate:\r\n case TythonColumnsEnum.CTR:\r\n case TythonColumnsEnum.eCPM:\r\n case TythonColumnsEnum.AdECPM:\r\n case TythonColumnsEnum.AdCTR:\r\n return toString ? convertToTwoDecimalPlaces(value) : 0;\r\n default:\r\n return 0;\r\n }\r\n }\r\n switch (metric) {\r\n case TythonColumnsEnum.Revenue:\r\n case TythonColumnsEnum.Viewability:\r\n case TythonColumnsEnum.FillRate:\r\n case TythonColumnsEnum.WinRate:\r\n case TythonColumnsEnum.CTR:\r\n case TythonColumnsEnum.eCPM:\r\n case TythonColumnsEnum.AdECPM:\r\n case TythonColumnsEnum.AdCTR:\r\n return toString ? convertToTwoDecimalPlaces(value) : roundNumber(value, 2);\r\n default:\r\n return value;\r\n }\r\n}\r\nexport function formatMetric(metric: TythonColumnsEnum, value, locale: string) {\r\n if (!value) {\r\n return '';\r\n }\r\n const { systemPreferences } = getStore().active;\r\n\r\n switch (metric) {\r\n case TythonColumnsEnum.ImpressionRequests:\r\n case TythonColumnsEnum.ImpressionsReturned:\r\n case TythonColumnsEnum.ImpressionsServed:\r\n case TythonColumnsEnum.ImpressionsViewed:\r\n case TythonColumnsEnum.Clicks:\r\n case TythonColumnsEnum.WinningBids:\r\n case TythonColumnsEnum.AdClicks:\r\n return nFormatter(value, 1);\r\n case TythonColumnsEnum.Revenue:\r\n case TythonColumnsEnum.eCPM:\r\n case TythonColumnsEnum.AdECPM:\r\n return value.toLocaleString(locale, { style: 'currency', currency: systemPreferences?.currency || DEFAULT_CURRENCY_CODE });\r\n case TythonColumnsEnum.Viewability:\r\n case TythonColumnsEnum.FillRate:\r\n case TythonColumnsEnum.WinRate:\r\n case TythonColumnsEnum.CTR:\r\n case TythonColumnsEnum.AdCTR:\r\n return Number(value).toLocaleString(undefined, { style: 'percent', minimumFractionDigits: 2 });\r\n default:\r\n return value;\r\n }\r\n}\r\n\r\nfunction nFormatter(num, digits) {\r\n const lookup = [\r\n { value: 1, symbol: '' },\r\n { value: 1e3, symbol: 'k' },\r\n { value: 1e6, symbol: 'M' },\r\n { value: 1e9, symbol: 'B' },\r\n { value: 1e12, symbol: 'T' },\r\n { value: 1e15, symbol: 'Q' },\r\n { value: 1e18, symbol: 'E' },\r\n ];\r\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\r\n const format = lookup\r\n .slice()\r\n .reverse()\r\n .find(function (item) {\r\n return num >= item.value;\r\n });\r\n return format ? (num / format.value).toFixed(digits).replace(rx, '$1') + format.symbol : '0';\r\n}\r\n\r\nexport function convertToTwoDecimalPlaces(num: number): string {\r\n const roundedNumber = Math.round(num * 100) / 100; // Rounds the number to two decimal places\r\n return roundedNumber.toFixed(2); // Converts the rounded number to a string with two decimal places\r\n}\r\n","import { observer } from 'mobx-react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { RouteComponentProps, withRouter } from 'react-router-dom';\r\n\r\nexport interface IRouterWithIntl<Params extends { [K in keyof Params]?: string } = {}>\r\n extends InjectedIntlProps,\r\n RouteComponentProps<Params> {}\r\n\r\nexport function injectRouterWithIntl(component: React.ComponentType<IRouterWithIntl>) {\r\n return withRouter(injectIntl(component));\r\n}\r\n\r\nexport function injectIntlWithObserver<T extends IRouterWithIntl>(component: React.ComponentType<T>) {\r\n return injectIntl(observer(component));\r\n}\r\n\r\nexport function injectRouterAndIntlWithObserver<T extends IRouterWithIntl>(component: React.ComponentType<T>) {\r\n return withRouter(injectIntl(observer(component)));\r\n}\r\n\r\nexport function injectIntlAndObserver<T extends InjectedIntlProps>(component: React.ComponentType<T>) {\r\n return injectIntl(observer(component));\r\n}\r\n","export enum AdSenseOAuthStatus {\r\n None = \"NotConnected\",\r\n Success = \"Connected\",\r\n Failure = \"Failure\",\r\n Pending = \"Verifying\"\r\n}","import { classNamesFunction, ICalloutProps, Label } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport AppMessages from '../../../App.messages';\r\nimport { InfoButton } from '../../InfoButton';\r\nimport { IFormLabelProps, IFormLabelStyleProps, IFormLabelStyles } from './FormLabel.types';\r\n\r\nconst getClassNames = classNamesFunction<IFormLabelStyleProps, IFormLabelStyles>();\r\n\r\nexport class FormLabelBase extends React.Component<IFormLabelProps> {\r\n public render(): JSX.Element {\r\n const {\r\n id,\r\n disableHeading = false,\r\n disableAriaLevel = false,\r\n styles,\r\n theme,\r\n labelContent,\r\n labelRequired,\r\n calloutContent,\r\n noInfoButton,\r\n calloutOnDismiss,\r\n iconButtonOnClick,\r\n } = this.props;\r\n const { formatMessage } = this.props.intl;\r\n const classNames = getClassNames(styles, { theme: theme! });\r\n const calloutProps: ICalloutProps = {\r\n calloutWidth: 300,\r\n };\r\n return (\r\n <div className={classNames.root}>\r\n <Label\r\n id={id}\r\n required={labelRequired}\r\n styles={classNames.subComponentStyles.Label}\r\n role={disableHeading ? undefined : 'heading'}\r\n aria-level={disableAriaLevel ? undefined : 3}\r\n >\r\n {labelContent}\r\n </Label>\r\n {!noInfoButton ? (\r\n <InfoButton\r\n ariaLabel={formatMessage(AppMessages.infoLabel, { label: labelContent })}\r\n ariaDescription={formatMessage(AppMessages.infoDescription, { label: labelContent })}\r\n iconTitle=\"Information\"\r\n calloutContent={calloutContent}\r\n calloutProps={calloutProps}\r\n iconButtonOnClick={iconButtonOnClick}\r\n calloutOnDismiss={calloutOnDismiss}\r\n />\r\n ) : null}\r\n </div>\r\n );\r\n }\r\n}\r\n","import { IFormLabelStyleProps, IFormLabelStyles } from './FormLabel.types';\r\n\r\nexport const getStyles = (props: IFormLabelStyleProps): IFormLabelStyles => {\r\n return {\r\n root: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n subComponentStyles: {\r\n Label: {\r\n root: ['ms-fontWeight-semibold'],\r\n },\r\n },\r\n };\r\n};\r\n","import { styled } from '@fluentui/react';\r\nimport { FormLabelBase } from './FormLabel.base';\r\nimport { getStyles } from './FormLabel.styles';\r\nimport { IFormLabelProps, IFormLabelStyleProps, IFormLabelStyles } from './FormLabel.types';\r\n\r\nexport const FormLabel = styled<IFormLabelProps, IFormLabelStyleProps, IFormLabelStyles>(FormLabelBase, getStyles, undefined, {\r\n scope: 'FormLabel',\r\n});\r\n","export enum PopupType {\r\n None,\r\n Loading,\r\n Leaving,\r\n NoAds,\r\n Guide,\r\n Mediation,\r\n Disconnecting,\r\n DeleteConfirmation,\r\n RoleChangeConfirmation,\r\n DeactivateConfirmation,\r\n AdUnitOptOut,\r\n}","import { createStore } from 'satcheljs';\r\nimport { ILoginPageState } from './schema/ILoginPageState';\r\n\r\nexport const getLoginPageStore = createStore<ILoginPageState>('LoginPageState', {\r\n errors: {},\r\n active: {\r\n email: '',\r\n },\r\n loading: true,\r\n devToken: undefined,\r\n});\r\n","import { createStore } from 'satcheljs';\r\nimport { IProfileViewState } from './schema';\r\n\r\n// !NOTE: This is to be added explicitly for the orchestrators to register themselves.\r\nimport { PhoneVerificationGenerateCode, PhoneVerificationVerifyCode } from '../../../../../@data';\r\nimport '../orchestrators';\r\n\r\nexport const getProfileStore = createStore<IProfileViewState>('ProfileViewState', {\r\n active: {\r\n phoneVerificationGenerateCode: new PhoneVerificationGenerateCode(),\r\n phoneVerificationVerifyCode: new PhoneVerificationVerifyCode(),\r\n verificationCodeGenerationLimitReached: false,\r\n },\r\n raw: {},\r\n errors: {},\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n searchBoxPlaceholder: {\r\n id: 'grid.searchBoxPlaceholder',\r\n defaultMessage: 'Find by name or ID ',\r\n },\r\n itemDisplayed: {\r\n id: 'grid.itemDisplayed',\r\n defaultMessage: '{displayedCount} of {totalCount} items displayed',\r\n },\r\n itemSelectedCount: {\r\n id: 'grid.itemSelectedCount',\r\n defaultMessage: '{count} selected',\r\n },\r\n teachingBubbleHeadline: {\r\n id: 'grid.teachingBubbleHeadline',\r\n defaultMessage: 'Please select account',\r\n },\r\n teachingBubbleContent: {\r\n id: 'grid.teachingBubbleContent',\r\n defaultMessage: 'You must select a specific account first to proceed creating ad units under the account',\r\n },\r\n dialogDismissBtnAriaDesc: {\r\n id: 'grid.dialogDismissBtnAriaDesc',\r\n defaultMessage: 'Press to dismiss',\r\n },\r\n createCmdbtnAriaDesc: {\r\n id: 'grid.createCmdbtnAriaDesc',\r\n defaultMessage: 'Click to {label}',\r\n },\r\n addFilterCmdBtnAriaDesc: {\r\n id: 'grid.addFilterCmdBtnAriaDesc',\r\n defaultMessage: 'Filter the grid below',\r\n },\r\n editCmdBtnAriaDesc: {\r\n id: 'grid.editCmdBtnAriaDesc',\r\n defaultMessage: 'Click to edit entity',\r\n },\r\n codeCmdBtnAriaDesc: {\r\n id: 'grid.codeCmdBtnAriaDesc',\r\n defaultMessage: 'Click to open code panel',\r\n },\r\n deleteCmdBtnAriaDesc: {\r\n id: 'grid.deleteCmdBtnAriaDesc',\r\n defaultMessage: 'Click to delete entity',\r\n },\r\n tokenStatusCmdBtnAriaLabel: {\r\n id: 'grid.tokenStatusCmdBtnAriaLabel',\r\n defaultMessage: 'Click to display token status',\r\n },\r\n clarityStatusCmdBtnAriaLabel: {\r\n id: 'grid.clarityStatusCmdBtnAriaLabel',\r\n defaultMessage: 'Click to display clarity status',\r\n },\r\n activateCmdBtnAriaDesc: {\r\n id: 'grid.activateCmdBtnAriaDesc',\r\n defaultMessage: 'Click to activate entity',\r\n },\r\n deactivateCmdBtnAriaDesc: {\r\n id: 'grid.deactivateCmdBtnAriaDesc',\r\n defaultMessage: 'Click to deactivate entity',\r\n },\r\n copyCmdBtnAriaDesc: {\r\n id: 'grid.copyCmdBtnAriaDesc',\r\n defaultMessage: 'Click to create a copy of this entity',\r\n },\r\n modifyColumnsCmdBtnAriaDesc: {\r\n id: 'grid.modifyColumnsCmdBtnAriaDesc',\r\n defaultMessage: 'Click to modify columns in the below grid',\r\n },\r\n modifyColumnsPanelApplyButtonAriaDesc: {\r\n id: 'grid.modifyColumnsPanelApplyButtonAriaDesc',\r\n defaultMessage: 'Click to apply selected columns to the grid',\r\n },\r\n editAdunit: {\r\n id: 'grid.editAdunit',\r\n defaultMessage: 'Edit ad unit',\r\n },\r\n changeTemplate: {\r\n id: 'grid.changeTemplate',\r\n defaultMessage: 'Change template',\r\n },\r\n gridDataDownloadSuccess: {\r\n id: 'grid.dataDownloadSuccess',\r\n defaultMessage: 'Grid data download success',\r\n },\r\n gridDataDeletingItem: {\r\n id: 'grid.dataDeletingTheItem',\r\n defaultMessage: 'Deleting the item...',\r\n },\r\n gridDataDeletingItemFailed: {\r\n id: 'grid.dataDeletingTheItemFailed',\r\n defaultMessage: 'Something went wrong while deleting the item. Please try again later.',\r\n },\r\n gridDataSubmittingChangingStatus: {\r\n id: 'grid.dataSubmittingChangingStatus',\r\n defaultMessage: 'Submitting the changing status...',\r\n },\r\n gridDataSubmittingChangingStatusFailed: {\r\n id: 'grid.dataSubmittedChangingStatusFailed',\r\n defaultMessage: 'Something went wrong while changing the status. Please try again later.',\r\n },\r\n gridDataDuplicatingFailed: {\r\n id: 'grid.dataDuplicatingFailed',\r\n defaultMessage: 'Something went wrong while duplicating the grid item. Please try again later',\r\n },\r\n gridDataDuplicating: {\r\n id: 'grid.dataDuplicating',\r\n defaultMessage: 'Duplicating the item...',\r\n },\r\n});\r\n","import { InjectedIntlProps } from 'react-intl';\r\nimport { IDataMetric } from '../../../../types';\r\n\r\nexport enum RangeType {\r\n Custom = 'Custom',\r\n Today = 'Today',\r\n Yesterday = 'Yesterday',\r\n SundayToday = 'This week (Sun - Today)',\r\n MondayToday = 'This week (Mon - Today)',\r\n Last7ExcludingToday = 'Last 7 days',\r\n Last7FromSunToSat = 'Last week (Sun - Sat)',\r\n}\r\n\r\nexport type RangeTypeKey = keyof typeof RangeType;\r\n\r\nexport const RangeTypeMessage: { [key in RangeTypeKey]: string } = {\r\n Custom: 'customLabel',\r\n Today: 'todayLabel',\r\n Yesterday: 'yesterdayLabel',\r\n SundayToday: 'sundayTodayLabel',\r\n MondayToday: 'mondayTodayLabel',\r\n Last7ExcludingToday: 'last7FromTodayLabel',\r\n Last7FromSunToSat: 'last7FromSunToSatLabel',\r\n};\r\n\r\nexport interface ICustomCalenderProps extends InjectedIntlProps, IDataMetric {\r\n onSelectedDatesChanged: (dateRange: ICustomCalenderDateRange, rangeType: RangeType) => void;\r\n initialDateRange: ICustomCalenderDateRange;\r\n initialRangeType: RangeType;\r\n disableFutureDays?: boolean;\r\n}\r\nexport interface ICustomCalenderDateRange {\r\n startDate: Date;\r\n endDate: Date;\r\n}\r\n\r\nexport interface IDay {\r\n fullDay: IDateElements;\r\n day: number;\r\n isInCurrentMonth: boolean;\r\n isSelected?: boolean;\r\n isFirstOrLastInSelected?: boolean;\r\n}\r\n\r\nexport interface IDateElements {\r\n day: number;\r\n month: number;\r\n year: number;\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n pageTitle: {\r\n id: 'profilePage.title',\r\n defaultMessage: 'Profile',\r\n },\r\n submitSuccessTitle: {\r\n id: 'profilePage.submitSuccessTitle',\r\n defaultMessage: 'Thanks for completing your profile',\r\n },\r\n submitSuccessMessage: {\r\n id: 'profilePage.submitSuccessMessage',\r\n defaultMessage: \"We are reviewing your profile. This can take up to 7 business days and we'll notify you as soon as it's approved.\",\r\n },\r\n submitSuccessButtonLabel: {\r\n id: 'profilePage.submitSuccessButtonLabel',\r\n defaultMessage: 'Go to dashboard',\r\n },\r\n readOnlyPageTooltip: {\r\n id: 'profilePage.readOnlyPageTooltip',\r\n defaultMessage: \"You can only edit your profile after we've completed our review of your profile information.\",\r\n },\r\n addressLine1: {\r\n id: 'primaryContact.addressLine1',\r\n defaultMessage: 'Address line 1',\r\n },\r\n addressLine2: {\r\n id: 'primaryContact.addressLine2',\r\n defaultMessage: 'Address line 2',\r\n },\r\n city: {\r\n id: 'primaryContact.city',\r\n defaultMessage: 'City',\r\n },\r\n state: {\r\n id: 'primaryContact.state',\r\n defaultMessage: 'State',\r\n },\r\n zipCode: {\r\n id: 'primaryContact.zipCode',\r\n defaultMessage: 'ZIP code',\r\n },\r\n country: {\r\n id: 'primaryContact.country',\r\n defaultMessage: 'Country',\r\n },\r\n phoneNumber: {\r\n id: 'primaryContact.phoneNumber',\r\n defaultMessage: 'Phone number',\r\n },\r\n phoneNumberCountryCode: {\r\n id: 'primaryContact.countryCode',\r\n defaultMessage: 'Country code',\r\n },\r\n selectStatePlaceholder: {\r\n id: 'primaryContact.selectStatePlaceholder',\r\n defaultMessage: 'Select a state',\r\n },\r\n address: {\r\n id: 'primaryContact.address',\r\n defaultMessage: 'Address',\r\n },\r\n previewTitle: {\r\n id: 'primaryContact.previewTitle',\r\n defaultMessage: 'Preview to submit',\r\n },\r\n previewDescription: {\r\n id: 'primaryContact.previewDescription',\r\n defaultMessage:\r\n 'Please check and confirm the information you filled is correct to save as the average verification time is around a week.',\r\n },\r\n profileAddressBannerBold: {\r\n id: 'profileAddress.bannerBold',\r\n defaultMessage: '{appName} is currently only accepting payment in the United States',\r\n },\r\n profileAddressBanner: {\r\n id: 'profileAddress.banner',\r\n defaultMessage: 'if you do not have a payment address inside the US, please signup for the',\r\n },\r\n profileAddressBannerWaitlist: {\r\n id: 'profileAddress.bannerWaitlist',\r\n defaultMessage: 'waitlist',\r\n },\r\n phoneVerificationMethodSms: {\r\n id: 'phoneVerificationMethod.sms',\r\n defaultMessage: 'Text me at {phone}',\r\n },\r\n phoneVerificationMethodCall: {\r\n id: 'phoneVerificationMethod.call',\r\n defaultMessage: 'Call me at {phone}',\r\n },\r\n phoneVerificationDialogTitle: {\r\n id: 'phoneVerificationDialog.title',\r\n defaultMessage: 'Phone verification',\r\n },\r\n emailVerificationDialogTitle: {\r\n id: 'emailVerificationDialog.title',\r\n defaultMessage: 'Email verification',\r\n },\r\n phoneVerificationDialogChoiceGroupLabel: {\r\n id: 'phoneVerificationDialog.choiceGroupLabel',\r\n defaultMessage: 'How would you like to verify?',\r\n },\r\n phoneVerificationDialogNextButton: {\r\n id: 'phoneVerificationDialog.nextButton',\r\n defaultMessage: 'Next',\r\n },\r\n phoneVerificationDialogCancelButton: {\r\n id: 'phoneVerificationDialog.cancelButton',\r\n defaultMessage: 'Cancel',\r\n },\r\n phoneVerificationDialogVerifyButton: {\r\n id: 'phoneVerificationDialog.verifyButton',\r\n defaultMessage: 'Verify',\r\n },\r\n phoneVerificationDialogBody: {\r\n id: 'phoneVerificationDialog.body',\r\n defaultMessage: 'Message and data rates may apply. By selecting Next, you agree to the {terms} and {privacy}',\r\n },\r\n phoneVerificationDialogTermsAndConditions: {\r\n id: 'phoneVerificationDialog.termsAndCondition',\r\n defaultMessage: 'Terms and Conditions',\r\n },\r\n phoneVerificationDialogPrivacy: {\r\n id: 'phoneVerificationDialog.privacy',\r\n defaultMessage: 'Privacy statement',\r\n },\r\n phoneVerificationDialogResendCode: {\r\n id: 'phoneVerificationDialog.resendCode',\r\n defaultMessage: 'Resend code',\r\n },\r\n phoneVerificationDialogCallAgain: {\r\n id: 'phoneVerificationDialog.callAgain',\r\n defaultMessage: 'Call again',\r\n },\r\n emailVerificationDialogCodeSent: {\r\n id: 'emailVerificationDialog.codeSent',\r\n defaultMessage: 'A confirmation code was sent to {email}. Please enter the code below.',\r\n },\r\n phoneVerificationDialogSmsText: {\r\n id: 'phoneVerificationDialog.smsText',\r\n defaultMessage: 'A confirmation code was sent to {phoneNumber}. Please enter the code below.',\r\n },\r\n phoneVerificationDialogCallText: {\r\n id: 'phoneVerificationDialog.callText',\r\n defaultMessage: 'We are calling {phoneNumber} with the necessary code. Please enter the code below.',\r\n },\r\n verificationDialogPlaceholder: {\r\n id: 'verificationDialog.placeholder',\r\n defaultMessage: 'Enter code',\r\n },\r\n phoneVerificationDialogSuccess: {\r\n id: 'phoneVerificationDialog.success',\r\n defaultMessage: 'Your phone number {phoneNumber} is verified',\r\n },\r\n emailVerificationDialogSuccess: {\r\n id: 'emailVerificationDialog.success',\r\n defaultMessage: 'Your email {email} is verified.',\r\n },\r\n phoneVerificationDialogSuccessAlt: {\r\n id: 'phoneVerificationDialog.successAlt',\r\n defaultMessage: 'phone verified',\r\n },\r\n profileInvalidFieldsErrorMessage: {\r\n id: 'profileInvalidField.errorMessage',\r\n defaultMessage: 'You have { count } invalid fields, please correct them to continue.',\r\n },\r\n profileInvalidAddressErrorMessage: {\r\n id: 'profileInvalidAddress.errorMessage',\r\n defaultMessage: 'Invalid address. The postal code provided does not match the country, city or the state/province.',\r\n },\r\n profileAddressValidationFailed: {\r\n id: 'profileAddressValidation.failed',\r\n defaultMessage: 'Failed to validate user address. Please try again!',\r\n },\r\n generateVerificationCodeFailed: {\r\n id: 'generateVerificationCode.failed',\r\n defaultMessage: 'Failed to generate phone verification code. Please try again!',\r\n },\r\n generateEmailVerificationCodeLimitReached: {\r\n id: 'generateEmailVerificationCodeLimitReached',\r\n defaultMessage: \"Didn't receive the email?\",\r\n },\r\n generatePhoneVerificationCodeLimitReached: {\r\n id: 'generatePhoneVerificationCodeLimitReached',\r\n defaultMessage:\r\n \"You've reached the maximum number of attempts to resend the code. Please wait for ten minutes before requesting another code.\",\r\n },\r\n generateEmailVerificationCodeFailed: {\r\n id: 'generateVerificationCode.failed',\r\n defaultMessage: 'Failed to generate email verification code. Please try again!',\r\n },\r\n getVerificationStatusFailed: {\r\n id: 'getVerificationStatus.failed',\r\n defaultMessage: 'Failed to check email verification status.',\r\n },\r\n verifyingGeneratedCodeFailed: {\r\n id: 'verifyingGeneratedCode.failed',\r\n defaultMessage: 'Failed to verify generated code. Please try again!',\r\n },\r\n generatedCodeInvalid: {\r\n id: 'generatedCode.invalid',\r\n defaultMessage: 'This code is invalid. Please try again.',\r\n },\r\n generatedCodeExpired: {\r\n id: 'generatedCode.expired',\r\n defaultMessage: 'This code is expired. Please try again.',\r\n },\r\n generatedCodeFailed: {\r\n id: ' generatedCode.failed',\r\n defaultMessage: 'Failed to send verification code. Please try again',\r\n },\r\n publisherProfileDetailsFailed: {\r\n id: 'publisherProfileDetails.failed',\r\n defaultMessage: 'We’re unable to show your publisher profile details. Please try again later.',\r\n },\r\n updatePublisherProfileDetailsFailed: {\r\n id: 'updatePublisherProfileDetails.failed',\r\n defaultMessage: 'We’re unable to update your publisher profile details. Please try again later.',\r\n },\r\n loadUserDetailsFailed: {\r\n id: 'loadUserDetails.failed',\r\n defaultMessage: 'We’re unable to load your user details at this time. Please try again later.',\r\n },\r\n failedToLoadPublisherDetails: {\r\n id: 'publisherProfileDetails.failedToLoadPublisherDetails',\r\n defaultMessage: 'Failed to load publisher details',\r\n },\r\n failedToLoadProfileDetails: {\r\n id: 'publisherProfileDetails.failedToLoadProfileDetails',\r\n defaultMessage: 'Failed to load profile details',\r\n },\r\n profileNeedsAttentionTitle: {\r\n id: 'publisherProfileDetails.profileNeedsAttentionTitle',\r\n defaultMessage: 'Additional action required. ',\r\n },\r\n profileNeedsAttentionDesc: {\r\n id: 'publisherProfileDetails.profileNeedsAttentionDesc',\r\n defaultMessage: 'Please edit your profile details or upload the required documentation',\r\n },\r\n help: {\r\n id: 'publisherProfileDetails.help',\r\n defaultMessage: 'Help',\r\n },\r\n uploadDocument: {\r\n id: 'publisherProfileDetails.uploadDocument',\r\n defaultMessage: 'Upload',\r\n },\r\n notStarted: {\r\n id: 'publisherEvaluationStatus.notStarted',\r\n defaultMessage: 'Not started',\r\n },\r\n inReview: {\r\n id: 'publisherEvaluationStatus.inReview',\r\n defaultMessage: 'In review',\r\n },\r\n verified: {\r\n id: 'publisherEvaluationStatus.verified',\r\n defaultMessage: 'Verified',\r\n },\r\n actionRequired: {\r\n id: 'publisherEvaluationStatus.actionRequired',\r\n defaultMessage: 'Action required',\r\n },\r\n notStatedPopup: {\r\n id: 'publisherEvaluationStatus.setupRequired',\r\n defaultMessage: 'Setting up your profile is essential for serving ads on your site or app.',\r\n },\r\n inReviewPopup: {\r\n id: 'publisherEvaluationStatus.inReviewPopup',\r\n defaultMessage: `We're reviewing your profile, which can take up to seven business days to complete. We'll send an email confirmation once the review is complete.`,\r\n },\r\n failedToSubmitEvidence: {\r\n id: 'failedToSubmitEvidence',\r\n defaultMessage: 'Failed to submit evidence',\r\n },\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n backButtonAriaDesc: {\r\n id: 'detailPage.backButtonAriaDesc',\r\n defaultMessage: 'Click to go back to manage page'\r\n },\r\n breadcrumbAriaLabel: {\r\n id: 'detailPage.breadcrumbAriaLabel',\r\n defaultMessage: 'Bread crumb showing the heirarchy of subpages'\r\n }\r\n});","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterSpacing } from '../../../theme';\r\nimport { FormState } from '../../components/Form';\r\nimport { IDetailPageStyleProps, IDetailPageStyles } from './DetailPage.types';\r\n\r\nexport const getStyles = (props: IDetailPageStyleProps): IDetailPageStyles => {\r\n const { theme, pageMode, hasFormTitle = false, additionalHeightBoundary, overlayHeight } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette;\r\n const renderedOnPanel =\r\n pageMode === FormState.InPageCreate || pageMode === FormState.InPageEdit || pageMode === FormState.InPageView ? true : false;\r\n const marginLeft = !renderedOnPanel ? spacing.size48 : 0;\r\n const titleMarginLeft = !renderedOnPanel ? spacing.size32 : 1;\r\n const buttonMarginBottom = !renderedOnPanel ? (hasFormTitle ? spacing.size16 : spacing.size32) : 0;\r\n // we have marginTop32 + marginBottom24 + actual form title lineHeight32, together is 88px is the cumulative height for the form title\r\n const formTitleHeight = 88;\r\n return mergeStyleSets({\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n overflowY: 'auto',\r\n flex: 1,\r\n },\r\n navBackButton: [\r\n 'ms-navBackButton',\r\n {\r\n display: 'flex',\r\n backgroundColor: theme.palette.neutralLighter,\r\n height: spacing.size44,\r\n alignItems: 'center',\r\n },\r\n ],\r\n scrollablePanel: {\r\n borderBottomStyle: 'solid',\r\n borderColor: theme.palette.neutralLight,\r\n borderBottomWidth: renderedOnPanel ? 0 : 1,\r\n overflowY: 'auto',\r\n flex: 1,\r\n maxHeight: `calc(100% - 5rem)`,\r\n width: '100%',\r\n ...(additionalHeightBoundary\r\n ? {\r\n paddingBottom: spacing.size64,\r\n }\r\n : {}),\r\n },\r\n content: {\r\n marginLeft: marginLeft,\r\n position: 'relative',\r\n height: hasFormTitle ? `calc(100% - ${formTitleHeight}px)` : '100%',\r\n },\r\n buttons: {\r\n zIndex: 9999,\r\n position: renderedOnPanel ? 'absolute' : 'static',\r\n bottom: renderedOnPanel ? '1rem' : '0',\r\n display: 'flex',\r\n marginLeft: marginLeft,\r\n marginTop: spacing.size16,\r\n marginBottom: buttonMarginBottom,\r\n '@media(max-height: 360px)': {\r\n position: 'static',\r\n },\r\n selectors: {\r\n '.ms-Button': {\r\n marginRight: spacing.size8,\r\n },\r\n },\r\n ...(additionalHeightBoundary\r\n ? {\r\n background: palette.white,\r\n width: '100%',\r\n bottom: 0,\r\n paddingBottom: spacing.size16,\r\n paddingTop: spacing.size16,\r\n }\r\n : {}),\r\n },\r\n subComponentStyles: {\r\n formTitle: {\r\n root: {\r\n marginLeft: marginLeft,\r\n marginTop: titleMarginLeft,\r\n marginBottom: spacing.size24,\r\n },\r\n },\r\n breadcrumb: {\r\n root: {\r\n margin: 0,\r\n alignItems: 'center',\r\n },\r\n item: {\r\n lineHeight: '22px',\r\n fontSize: theme.fonts.mediumPlus.fontSize,\r\n color: theme.palette.neutralPrimary,\r\n },\r\n chevron: {\r\n lineHeight: '22px',\r\n color: theme.palette.neutralPrimary,\r\n },\r\n },\r\n },\r\n overlayStyles: {\r\n ...(overlayHeight ? { height: overlayHeight } : {}),\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): IDetailPageStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { ActionButton, Breadcrumb, DefaultButton, getId, mergeStyleSets, Overlay, PrimaryButton, Spinner } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { getAppStore, LayoutMode, onHelpInfoCalloutOpened, onHelpInfoChanged, onLayoutChanged, onNavigateBack } from '../../@data';\r\nimport AppMessages from '../../App.messages';\r\nimport { FormState, FormTitle } from '../../components/Form';\r\nimport { Main } from '../../components/Main/Main';\r\nimport { injectIntlAndObserver } from '../../utils';\r\nimport messages from './DetailPage.messages';\r\nimport { getClassNames } from './DetailPage.styles';\r\nimport { IDetailPageProps } from './DetailPage.types';\r\n\r\n/**\r\n * DetailPage is a layout component which is to be used when a form is displayed\r\n * with submit and cancel buttons. And the page should have a title and a help icon.\r\n */\r\nexport const DetailPage = injectIntlAndObserver(\r\n class DetailsPageComponent extends React.Component<IDetailPageProps> {\r\n public componentDidMount() {\r\n const { pageMode } = this.props;\r\n if (pageMode !== FormState.InPageCreate && pageMode !== FormState.InPageEdit && pageMode !== FormState.InPageView) {\r\n onLayoutChanged(LayoutMode.ContentOnly);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n titleLabel,\r\n helpId,\r\n onSubmit,\r\n onCancel,\r\n submitLabel,\r\n cancelLabel,\r\n navMessageLabel,\r\n onNavClick,\r\n saving,\r\n loading,\r\n pageMode,\r\n submitButtonDisabled,\r\n hideSubmitButton,\r\n breadcrumbItems,\r\n styles,\r\n hasFormTitle = false,\r\n hideNavButton = false,\r\n additionalHeightBoundary,\r\n overlayHeight = undefined,\r\n } = this.props;\r\n const classNames = mergeStyleSets(getClassNames({ pageMode, hasFormTitle, additionalHeightBoundary, overlayHeight }), styles);\r\n const { root, navBackButton, scrollablePanel, buttons, content, subComponentStyles, overlayStyles } = classNames;\r\n const { helpInfo, locale } = getAppStore();\r\n const { formatMessage } = this.props.intl;\r\n const formTitleId = getId('formTitle');\r\n\r\n const showOverlay = saving || loading;\r\n\r\n return (\r\n <div className={root}>\r\n {pageMode !== FormState.InPageCreate &&\r\n pageMode !== FormState.InPageEdit &&\r\n pageMode !== FormState.AcceptInvite &&\r\n pageMode !== FormState.InPageView &&\r\n !hideNavButton && (\r\n <div className={navBackButton}>\r\n {showOverlay && <Overlay />}\r\n <ActionButton\r\n iconProps={{\r\n iconName: 'Back',\r\n }}\r\n onClick={onNavClick ? onNavClick : () => onNavigateBack()}\r\n ariaDescription={formatMessage(messages.backButtonAriaDesc)}\r\n >\r\n {navMessageLabel || formatMessage(AppMessages.back)}\r\n </ActionButton>\r\n {breadcrumbItems && (\r\n <Breadcrumb\r\n items={breadcrumbItems}\r\n ariaLabel={formatMessage(messages.breadcrumbAriaLabel)}\r\n styles={subComponentStyles.breadcrumb}\r\n />\r\n )}\r\n </div>\r\n )}\r\n <Main className={scrollablePanel}>\r\n {showOverlay && <Overlay />}\r\n {titleLabel ? (\r\n <FormTitle\r\n id={formTitleId}\r\n title={titleLabel}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={helpId !== undefined ? () => onHelpInfoCalloutOpened(helpId, locale) : undefined}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n styles={subComponentStyles.formTitle}\r\n intl={this.props.intl}\r\n noHelpPopup={helpId !== undefined ? false : true}\r\n />\r\n ) : null}\r\n\r\n <div role=\"form\" aria-labelledby={formTitleId} className={content}>\r\n {this.props.children}\r\n {showOverlay && <Overlay className={overlayStyles} />}\r\n </div>\r\n </Main>\r\n <footer className={buttons} aria-label={formatMessage(AppMessages.detailPageFooterArialLabel)}>\r\n {!hideSubmitButton && <PrimaryButton text={submitLabel} onClick={onSubmit} disabled={saving || submitButtonDisabled} />}\r\n\r\n {pageMode !== FormState.AcceptInvite && onCancel && (\r\n <DefaultButton\r\n text={cancelLabel || formatMessage(AppMessages.cancel)}\r\n onClick={onCancel}\r\n disabled={saving}\r\n ariaDescription={formatMessage(messages.backButtonAriaDesc)}\r\n />\r\n )}\r\n\r\n {saving && <Spinner label={formatMessage(AppMessages.saving)} labelPosition={'right'} />}\r\n </footer>\r\n </div>\r\n );\r\n }\r\n }\r\n);\r\n","import { BrowserAuthOptions } from '@azure/msal-browser';\r\nimport { IDictionary } from '../types';\r\n\r\ntype AuthOptions = BrowserAuthOptions & { msaTenantId: string; msaAuthority: string; devToken: string; redirectUri: string };\r\n\r\nconst localConfig1: AuthOptions = {\r\n authority: 'https://login.windows-ppe.net/common',\r\n clientId: 'bbd8c357-c363-4d20-9e4a-2c98f7977eab', // PubCenter-UI (PPE)\r\n postLogoutRedirectUri: 'http://localhost:3000',\r\n redirectUri: 'http://localhost:3000/login',\r\n msaTenantId: '4925308c-f164-4d2d-bc7e-0631132e9375',\r\n msaAuthority: 'https://login.live-int.com',\r\n devToken: 'BBD37VB98',\r\n};\r\n\r\nconst localConfig2: AuthOptions = {\r\n authority: 'https://login.windows-ppe.net/common',\r\n clientId: 'bbd8c357-c363-4d20-9e4a-2c98f7977eab', // PubCenter-UI (PPE)\r\n postLogoutRedirectUri: 'http://localhost:3001',\r\n redirectUri: 'http://localhost:3001/login',\r\n msaTenantId: '4925308c-f164-4d2d-bc7e-0631132e9375',\r\n msaAuthority: 'https://login.live-int.com',\r\n devToken: 'BBD37VB98',\r\n};\r\n\r\nconst localConfig: AuthOptions = window.location.host.indexOf('3000') > -1 ? localConfig1 : localConfig2;\r\n\r\nconst devConfigOnline: AuthOptions = {\r\n authority: 'https://login.windows-ppe.net/common',\r\n clientId: 'bbd8c357-c363-4d20-9e4a-2c98f7977eab', // PubCenter-UI (PPE)\r\n postLogoutRedirectUri: 'https://pubcenter.azurewebsites.net',\r\n redirectUri: 'https://pubcenter.azurewebsites.net/login',\r\n msaTenantId: '4925308c-f164-4d2d-bc7e-0631132e9375',\r\n msaAuthority: 'https://login.live-int.com',\r\n devToken: '#{devToken_dev}#',\r\n};\r\n\r\nconst devConfigOffline: AuthOptions = {\r\n authority: 'https://login.windows-ppe.net/common',\r\n clientId: 'bbd8c357-c363-4d20-9e4a-2c98f7977eab', // PubCenter-UI (PPE)\r\n postLogoutRedirectUri: 'https://pubcenter2.azurewebsites.net',\r\n redirectUri: 'https://pubcenter2.azurewebsites.net/login',\r\n msaTenantId: '4925308c-f164-4d2d-bc7e-0631132e9375',\r\n msaAuthority: 'https://login.live-int.com',\r\n devToken: '#{devToken_dev}#',\r\n};\r\n\r\nconst devConfigNewDomain: AuthOptions = {\r\n authority: 'https://login.windows-ppe.net/common',\r\n clientId: 'bbd8c357-c363-4d20-9e4a-2c98f7977eab', // PubCenter-UI (PPE)\r\n postLogoutRedirectUri: 'https://si.monetizenow.microsoft.com',\r\n redirectUri: 'https://si.monetizenow.microsoft.com/login',\r\n msaTenantId: '4925308c-f164-4d2d-bc7e-0631132e9375',\r\n msaAuthority: 'https://login.live-int.com',\r\n devToken: '#{devToken_dev}#',\r\n};\r\n\r\nconst devConfigNewDomainOffline: AuthOptions = {\r\n authority: 'https://login.windows-ppe.net/common',\r\n clientId: 'bbd8c357-c363-4d20-9e4a-2c98f7977eab', // PubCenter-UI (PPE)\r\n postLogoutRedirectUri: 'https://offline.si.monetizenow.microsoft.com',\r\n redirectUri: 'https://offline.si.monetizenow.microsoft.com/login',\r\n msaTenantId: '4925308c-f164-4d2d-bc7e-0631132e9375',\r\n msaAuthority: 'https://login.live-int.com',\r\n devToken: '#{devToken_dev}#',\r\n};\r\n\r\nconst devConfigMapping: IDictionary<AuthOptions> = {\r\n 'pubcenter.azurewebsites.net': devConfigOnline,\r\n 'pubcenter2.azurewebsites.net': devConfigOffline,\r\n 'si.monetizenow.microsoft.com': devConfigNewDomain,\r\n 'offline.si.monetizenow.microsoft.com': devConfigNewDomainOffline,\r\n};\r\n\r\nconst devConfig: AuthOptions = devConfigMapping[window.location.host] || devConfigOnline;\r\n\r\nconst prodConfigOnline: AuthOptions = {\r\n authority: 'https://login.microsoftonline.com/common',\r\n clientId: '60e7cf7c-2b0d-468b-802d-99fa045382b8', // PubCenter-UI (PROD)\r\n postLogoutRedirectUri: 'https://next.pubcenter.microsoft.com',\r\n redirectUri: 'https://next.pubcenter.microsoft.com/login',\r\n msaTenantId: '9188040d-6c67-4c5b-b112-36a304b66dad',\r\n msaAuthority: 'https://login.live.com',\r\n devToken: '#{devToken_prod}#',\r\n};\r\n\r\nconst prodConfigOffline: AuthOptions = {\r\n authority: 'https://login.microsoftonline.com/common',\r\n clientId: '60e7cf7c-2b0d-468b-802d-99fa045382b8', // PubCenter-UI (PROD)\r\n postLogoutRedirectUri: 'https://pubcenternext-staging.azurewebsites.net',\r\n redirectUri: 'https://pubcenternext-staging.azurewebsites.net/login',\r\n msaTenantId: '9188040d-6c67-4c5b-b112-36a304b66dad',\r\n msaAuthority: 'https://login.live.com',\r\n devToken: '#{devToken_prod}#',\r\n};\r\n\r\nconst prodConfigNewDomain: AuthOptions = {\r\n authority: 'https://login.microsoftonline.com/common',\r\n clientId: '60e7cf7c-2b0d-468b-802d-99fa045382b8', // PubCenter-UI (PROD)\r\n postLogoutRedirectUri: 'https://monetizenow.microsoft.com',\r\n redirectUri: 'https://monetizenow.microsoft.com/login',\r\n msaTenantId: '9188040d-6c67-4c5b-b112-36a304b66dad',\r\n msaAuthority: 'https://login.live.com',\r\n devToken: '#{devToken_prod}#',\r\n};\r\n\r\nconst prodConfigNewDomainStaging: AuthOptions = {\r\n authority: 'https://login.microsoftonline.com/common',\r\n clientId: '60e7cf7c-2b0d-468b-802d-99fa045382b8', // PubCenter-UI (PROD)\r\n postLogoutRedirectUri: 'https://staging.monetizenow.microsoft.com',\r\n redirectUri: 'https://staging.monetizenow.microsoft.com/login',\r\n msaTenantId: '9188040d-6c67-4c5b-b112-36a304b66dad',\r\n msaAuthority: 'https://login.live.com',\r\n devToken: '#{devToken_prod}#',\r\n};\r\n\r\nconst prodConfigMapping: IDictionary<AuthOptions> = {\r\n 'next.pubcenter.microsoft.com': prodConfigOnline,\r\n 'pubcenternext-staging.azurewebsites.net': prodConfigOffline,\r\n 'monetizenow.microsoft.com': prodConfigNewDomain,\r\n 'staging.monetizenow.microsoft.com': prodConfigNewDomainStaging,\r\n};\r\n\r\nconst prodConfig: AuthOptions = prodConfigMapping[window.location.host] || prodConfigOnline;\r\n\r\nexport const envBasedConfig =\r\n process.env.REACT_APP_ENV === 'production' ? prodConfig : process.env.REACT_APP_ENV === 'staging' ? devConfig : localConfig;\r\n\r\nexport const aadConfig = {\r\n auth: {\r\n ...envBasedConfig,\r\n },\r\n cache: {\r\n cacheLocation: 'localStorage',\r\n },\r\n system: {\r\n tokenRenewalOffsetSeconds: 300,\r\n },\r\n};\r\n\r\n// Used only during login call, initially we need permissions for all these scopes from the user.\r\nexport const devPubCenterAuthTokenRequest = {\r\n scopes: ['openid', 'profile', 'offline_access', 'https://si.monetizenow.microsoft.com/ppe.pubcenter.api'],\r\n};\r\n\r\n// Used to fetch tokens before making API calls\r\n// Token is either fetched from cache or renewed using refresh grant when access token is about to expire.\r\nexport const devSilentTokenRequest = {\r\n scopes: ['https://si.monetizenow.microsoft.com/ppe.pubcenter.api'],\r\n};\r\n\r\nexport const prodPubCenterAuthTokenRequest = {\r\n scopes: ['openid', 'profile', 'offline_access', 'https://next.pubcenter.microsoft.com/prod.pubcenter.api'],\r\n};\r\n\r\nexport const prodSilentTokenRequest = {\r\n scopes: ['https://next.pubcenter.microsoft.com/prod.pubcenter.api'],\r\n};\r\n\r\n// export const silentTokenRequestRedirectUri = envBasedConfig.postLogoutRedirectUri + '/auth.html'; // check why we added auth.html here ?\r\nexport const silentTokenRequestRedirectUri = envBasedConfig.postLogoutRedirectUri;\r\n\r\nexport const authTokenRequest = process.env.REACT_APP_ENV === 'production' ? prodPubCenterAuthTokenRequest : devPubCenterAuthTokenRequest;\r\n\r\nexport const silentTokenRequest = process.env.REACT_APP_ENV === 'production' ? prodSilentTokenRequest : devSilentTokenRequest;\r\n\r\nexport const corpTenantId =\r\n process.env.REACT_APP_ENV === 'production' ? '72f988bf-86f1-41af-91ab-2d7cd011db47' : 'f686d426-8d16-42db-81b7-ab578e110ccd';\r\n\r\nexport const accountEnvironment = process.env.REACT_APP_ENV === 'production' ? 'login.microsoftonline.com' : 'login.windows-ppe.net';\r\n","import { IHomeViewModel } from './IHomeViewModel';\r\n\r\nexport interface IHomeViewState {\r\n active: IHomeViewModel;\r\n isStatusLoading: boolean;\r\n isSetupDone: boolean;\r\n adUnitStatus?: HomePageStatus;\r\n siteStatus?: HomePageStatus;\r\n profileStatus?: HomePageStatus;\r\n isFRECardShown?: boolean;\r\n}\r\n\r\nexport enum HomePageStatus {\r\n NotStarted = 'NotStarted',\r\n AwaitingVerification = 'AwaitingVerification',\r\n Completed = 'Completed',\r\n Rejected = 'Rejected',\r\n}\r\n","import { AdsTxtStatus, ClarityStatus, InventoryPlatformType, Model } from '..';\r\nimport { BlockAdCategoryNames, BlockCategoryXandrNames } from '../../../../pages/ad-management/AdBlock/@data/constants/CategoryNames';\r\nimport { ServingStatus } from '../enums/ServingStatus';\r\n\r\nexport type IABCode = keyof typeof BlockAdCategoryNames;\r\nexport type XandrCat = keyof typeof BlockCategoryXandrNames;\r\n\r\nexport class ServingConfig extends Model {\r\n public apiPath = undefined;\r\n public className = 'servingConfig';\r\n public servingStatus: ServingStatus;\r\n public scriptStatus?: boolean;\r\n public adsDotTxtStatus?: AdsTxtStatus;\r\n public enablebCat?: boolean;\r\n public enablebAdv?: boolean;\r\n public enablexBrands?: boolean;\r\n public xBrands?: number[];\r\n public bCat?: IABCode[];\r\n public xCat?: XandrCat[];\r\n public bAdv?: string[];\r\n public eTag?: string;\r\n public isBusy?: boolean;\r\n}\r\n\r\nexport class AdunitServingConfig extends ServingConfig {\r\n public adUnitId: number;\r\n}\r\n\r\nexport class PublisherServingConfig extends ServingConfig {\r\n public publisherId: number;\r\n}\r\n\r\nexport class PropertyServingConfig extends ServingConfig {\r\n public propertyId: number;\r\n public MicrosoftStoreAppId?: string | null;\r\n public COPPATimestamp?: string | null;\r\n public inventoryPlatformType?: InventoryPlatformType;\r\n public name?: string;\r\n}\r\n\r\nexport class PropertyServingConfigs extends PropertyServingConfig {\r\n public url?: string;\r\n public className = 'propertyServingConfigs';\r\n public clarityConfig?: ClarityConfig;\r\n public name?: string;\r\n}\r\n\r\nexport class AdunitServingConfigs extends AdunitServingConfig {\r\n public className = 'adUnitServingConfigs';\r\n}\r\n\r\nexport class ClarityConfig {\r\n public clarityId?: string;\r\n public clarityType?: string;\r\n public clarityTs?: string;\r\n public clarityIsEnabled?: boolean;\r\n public clarityStatus?: ClarityStatus;\r\n}\r\n","export const userLocales = {\r\n 1031: 'de-DE',\r\n 3079: 'de-AT',\r\n 1033: 'en-US',\r\n 4105: 'en-CA',\r\n 6153: 'en-IE',\r\n 2057: 'en-GB',\r\n 16393: 'en-IN',\r\n 3082: 'es-ES',\r\n 3084: 'fr-CA',\r\n 1036: 'fr-FR',\r\n 1040: 'it-IT',\r\n 3081: 'en-AU',\r\n 5129: 'en-NZ',\r\n 1046: 'pt-BR',\r\n 1028: 'zh-TW',\r\n 4100: 'zh-SG',\r\n 2070: 'pt-PT',\r\n 1042: 'ko-KR',\r\n 13322: 'es-CL',\r\n 9226: 'es-CO',\r\n 5132: 'fr-LU',\r\n 7177: 'en-ZA',\r\n 2052: 'zh-CN',\r\n 1041: 'ja-JP',\r\n 2058: 'es-MX',\r\n};\r\n\r\nexport const adQualityLocales = {\r\n 14337: 'ar-ae',\r\n 3073: 'ar-eg',\r\n 1025: 'ar-sa',\r\n 1093: 'bn-in',\r\n 1029: 'cs-cz',\r\n 1030: 'da-dk',\r\n 3079: 'de-at',\r\n 2055: 'de-ch',\r\n 1031: 'de-de',\r\n 1032: 'el-gr',\r\n // Note: my system did not find an LCID for en-ae (MSN's English UAE), so I am using placeholder -4\r\n '-4': 'en-ae',\r\n 3081: 'en-au',\r\n 4105: 'en-ca',\r\n 2057: 'en-gb',\r\n 14345: 'en-id',\r\n 6153: 'en-ie',\r\n 16393: 'en-in',\r\n 17417: 'en-my',\r\n 5129: 'en-nz',\r\n 13321: 'en-ph',\r\n 18441: 'en-sg',\r\n 1033: 'en-us',\r\n // Note: my system did not find an LCID for en-xl (MSN's English International), so I am using placeholder -1\r\n '-1': 'en-xl',\r\n 7177: 'en-za',\r\n 11274: 'es-ar',\r\n 13322: 'es-cl',\r\n 9226: 'es-co',\r\n 12298: 'es-ec',\r\n 3082: 'es-es',\r\n 2058: 'es-mx',\r\n 10250: 'es-pe',\r\n 21514: 'es-us',\r\n 8202: 'es-ve',\r\n // Note: my system did not find an LCID for es-xl (MSN's Spanish - Latin America), so I am using placeholder -3\r\n '-3': 'es-xl',\r\n 1035: 'fi-fi',\r\n 2060: 'fr-be',\r\n 3084: 'fr-ca',\r\n 4108: 'fr-ch',\r\n 1036: 'fr-fr',\r\n 5132: 'fr-lu',\r\n // Note: my system did not find an LCID for fr-xl (MSN's French - Africa), so I am using placeholder -2\r\n '-2': 'fr-xl',\r\n 1037: 'he-il',\r\n 1081: 'hi-in',\r\n 1038: 'hu-hu',\r\n 1057: 'id-id',\r\n 1040: 'it-it',\r\n 1041: 'ja-jp',\r\n 1042: 'ko-kr',\r\n 1063: 'lt-lt',\r\n 1102: 'mr-in',\r\n 1044: 'nb-no',\r\n 2067: 'nl-be',\r\n 1043: 'nl-nl',\r\n 1045: 'pl-pl',\r\n 1046: 'pt-br',\r\n 2070: 'pt-pt',\r\n 1049: 'ru-ru',\r\n 1053: 'sv-se',\r\n 1098: 'te-in',\r\n 1054: 'th-th',\r\n 1055: 'tr-tr',\r\n 1066: 'vi-vn',\r\n 2052: 'zh-cn',\r\n 3076: 'zh-hk',\r\n 4100: 'zh-sg',\r\n 1028: 'zh-tw',\r\n};\r\n\r\nexport const reverseLocales = {\r\n 'en-us': 1033,\r\n 'fr-fr': 1036,\r\n 'de-de': 1031,\r\n 'it-it': 1040,\r\n 'en-gb': 2057,\r\n 'fr-ca': 3084,\r\n 'es-es': 3082,\r\n 'es-mx': 2058,\r\n};\r\n","import { createStore } from 'satcheljs';\r\nimport { IHomeViewState } from './schema/IHomeViewState';\r\n\r\nimport '../orchestrators';\r\n\r\nexport const getStore = createStore<IHomeViewState>('HomeViewState', {\r\n active: {\r\n showDialog: true,\r\n },\r\n isStatusLoading: false,\r\n isSetupDone: false,\r\n isFRECardShown: false,\r\n});\r\n","import { FontWeights, getTheme, ITheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../theme';\r\nimport { flexWithCenter } from '../../utils/GlobalStyleUtils';\r\n\r\nexport interface IZeroResultsStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\nexport interface IZeroResultsStyles {\r\n rootStyle?: string;\r\n imageContainerStyle?: string;\r\n descriptionStyle?: string;\r\n titleStyle?: string;\r\n imageStyle?: string;\r\n}\r\n\r\nconst IMAGE_HEIGHT = 200;\r\n\r\nexport const getStyles = (props: IZeroResultsStyleProps): IZeroResultsStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { spacing, fonts, palette } = theme;\r\n\r\n return mergeStyleSets({\r\n rootStyle: {\r\n ...flexWithCenter,\r\n flexDirection: 'column',\r\n margin: '0 auto 42px auto',\r\n height: 'calc(100vh - 300px)',\r\n width: '100%',\r\n },\r\n imageStyle: {\r\n margin: '0 auto',\r\n },\r\n imageContainerStyle: {\r\n width: IMAGE_HEIGHT,\r\n height: IMAGE_HEIGHT,\r\n },\r\n descriptionStyle: {\r\n ...fonts.size16,\r\n marginTop: 0,\r\n },\r\n titleStyle: {\r\n ...fonts.size20,\r\n fontWeight: FontWeights.semibold,\r\n color: palette.neutralSecondary,\r\n marginBottom: spacing.size16,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): IZeroResultsStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { DefaultButton, Image, mergeStyleSets } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { IZeroResultsStyles, getClassNames } from './ZeroResults.styles';\r\nimport defaultImage from './resources/default.svg';\r\n\r\nexport interface IZeroResultsProps {\r\n showDefaultImage?: boolean;\r\n imageSrc?: string;\r\n title?: string;\r\n description?: string;\r\n buttonText?: string;\r\n href?: string;\r\n onButtonClick?: () => void;\r\n styleProps?: Partial<IZeroResultsStyles>;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport function ZeroResults({\r\n showDefaultImage,\r\n imageSrc,\r\n title,\r\n description,\r\n buttonText,\r\n onButtonClick,\r\n href,\r\n styleProps,\r\n children,\r\n}: IZeroResultsProps) {\r\n const { rootStyle, imageContainerStyle, descriptionStyle, titleStyle, imageStyle } = mergeStyleSets(getClassNames(), styleProps);\r\n\r\n return (\r\n <div className={rootStyle}>\r\n {(imageSrc || showDefaultImage) && (\r\n <div className={imageContainerStyle}>\r\n <Image src={imageSrc ?? defaultImage} shouldFadeIn styles={{ image: imageStyle }} aria-label={title ?? description} />\r\n </div>\r\n )}\r\n {title && <strong className={titleStyle}>{title}</strong>}\r\n {description && <p className={descriptionStyle}>{description}</p>}\r\n {buttonText && onButtonClick && <DefaultButton onClick={onButtonClick}>{buttonText}</DefaultButton>}\r\n {buttonText && href && (\r\n <Link to={href} tabIndex={-1}>\r\n <DefaultButton text={buttonText} />\r\n </Link>\r\n )}\r\n {children}\r\n </div>\r\n );\r\n}\r\n","import { getCurrentPublisher } from '../../selectors';\r\nimport { getAppStore } from '../store';\r\n\r\nexport const getCurrentUserContext = () => {\r\n return getAppStore().userContext;\r\n};\r\n\r\nexport const getPrimaryUserId = () => {\r\n return getCurrentPublisher()?.extendedProperties?.primaryContactUserId || getCurrentUserContext()?.id;\r\n};\r\n","import { createStore } from 'satcheljs';\r\nimport { IReportViewState } from './schema/IReportViewState';\r\n\r\nexport enum RouteName {\r\n dashboard = 'dashboard',\r\n reportDetails = 'report-details',\r\n}\r\n\r\nexport const defaultRoute = RouteName.dashboard;\r\n\r\nexport const getPageStore = createStore<IReportViewState>('ReportViewState', {\r\n loading: false,\r\n});\r\n","import { uiConfig } from '../../config/ui.config';\r\nimport { IColumnMemberDetails, IMetadataElement } from '../../pages/report/DashboardCards/@data/store/schema';\r\nimport { MediationReportingDataRequestBody } from '../store/schema/models/MediationReportingDataRequestBody';\r\nimport { ReportColumnMembersParams } from '../store/schema/models/ReportColumnMembersParams';\r\nimport { MediationReportingDataResponse } from '../store/schema/models/ReportingDataResponse';\r\nimport { handleApiErrors, handleError } from '../utils/handleApiErrors';\r\nimport { buildRequestHeadersWithAuthToken } from '../utils/requestUtils';\r\nimport { ApiError } from './ApiService';\r\n\r\nexport async function getMediationReportData(\r\n requestBody: MediationReportingDataRequestBody,\r\n abortController: AbortController\r\n): Promise<{ data: MediationReportingDataResponse; aborted: boolean }> {\r\n const baseUrl = `${uiConfig.getMediationReportingApiBaseAddress()}`;\r\n const redirectUrl = 'mediation/adSense/report/data';\r\n const url = baseUrl + redirectUrl;\r\n\r\n const headers = await buildRequestHeadersWithAuthToken(url);\r\n\r\n let response: Response;\r\n try {\r\n response = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: JSON.stringify(requestBody),\r\n signal: abortController.signal,\r\n });\r\n if (!response.ok) {\r\n return handleApiErrors<{ data: MediationReportingDataResponse; aborted: boolean }>(response, url);\r\n }\r\n\r\n const responseJson = await response.json();\r\n if (responseJson) {\r\n return { data: responseJson, aborted: false };\r\n }\r\n return Promise.resolve({ aborted: false } as { data: MediationReportingDataResponse; aborted: boolean });\r\n } catch (err) {\r\n if (err.name === 'AbortError') {\r\n return Promise.resolve({ aborted: true } as { data: MediationReportingDataResponse; aborted: boolean });\r\n }\r\n const error = `getReportData operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function getDimensions(reportType: string): Promise<IMetadataElement[]> {\r\n const baseUrl = `${uiConfig.getMediationReportingApiBaseAddress()}`;\r\n const redirectUrl = `mediation/adSense/report/metadata/dimensions`;\r\n const url = baseUrl + redirectUrl;\r\n\r\n const headers = await buildRequestHeadersWithAuthToken(url);\r\n\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: 'GET',\r\n headers,\r\n });\r\n\r\n if (!response.ok) {\r\n return handleApiErrors<IMetadataElement[]>(response, url);\r\n }\r\n\r\n const responseJson = await response.json();\r\n\r\n if (responseJson) {\r\n return responseJson.data;\r\n }\r\n return Promise.resolve([]);\r\n } catch (err) {\r\n const error = `getDimensions operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function getMetrics(reportType: string): Promise<IMetadataElement[]> {\r\n const baseUrl = `${uiConfig.getMediationReportingApiBaseAddress()}`;\r\n const redirectUrl = `mediation/adSense/report/metadata/metrics`;\r\n const url = baseUrl + redirectUrl;\r\n\r\n const headers = await buildRequestHeadersWithAuthToken(url);\r\n\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: 'GET',\r\n headers,\r\n });\r\n\r\n if (!response.ok) {\r\n return handleApiErrors<IMetadataElement[]>(response, url);\r\n }\r\n\r\n const responseJson = await response.json();\r\n\r\n if (responseJson) {\r\n return responseJson.data;\r\n }\r\n return Promise.resolve([]);\r\n } catch (err) {\r\n const error = `getMetrics operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function getGranularity(reportType: string): Promise<IMetadataElement[]> {\r\n const baseUrl = `${uiConfig.getMediationReportingApiBaseAddress()}`;\r\n const redirectUrl = `mediation/adSense/report/metadata/grains`;\r\n const url = baseUrl + redirectUrl;\r\n\r\n const headers = await buildRequestHeadersWithAuthToken(url);\r\n\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: 'GET',\r\n headers,\r\n });\r\n\r\n if (!response.ok) {\r\n return handleApiErrors<IMetadataElement[]>(response, url);\r\n }\r\n\r\n const responseJson = await response.json();\r\n\r\n if (responseJson) {\r\n return responseJson.data;\r\n }\r\n return Promise.resolve([]);\r\n } catch (err) {\r\n const error = `getGranularity operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function getColumnMembers(requestParams: ReportColumnMembersParams): Promise<IColumnMemberDetails[]> {\r\n const baseUrl = `${uiConfig.getMediationReportingApiBaseAddress()}`;\r\n const redirectUrl = `mediation/adSense/report/metadata/columnMembers?${new URLSearchParams(requestParams)}`;\r\n const url = baseUrl + encodeURIComponent(redirectUrl);\r\n\r\n const headers = await buildRequestHeadersWithAuthToken(url);\r\n\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: 'GET',\r\n headers,\r\n });\r\n\r\n if (!response.ok) {\r\n return handleApiErrors<IColumnMemberDetails[]>(response, url);\r\n }\r\n\r\n const responseJson = await response.json();\r\n\r\n if (responseJson) {\r\n return responseJson.data;\r\n }\r\n return Promise.resolve([]);\r\n } catch (err) {\r\n const error = `getColumnMembers operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n","import { useQuery } from '@tanstack/react-query';\r\nimport { showErrorToastNotification } from '../../../@data';\r\nimport {\r\n getDimensions as getMediationDimensions,\r\n getGranularity as getMediationGranularity,\r\n getMetrics as getMediationMetrics,\r\n getMediationReportData,\r\n} from '../../../@data/services/MediationReportingService';\r\nimport { getDimensions, getGranularity, getMetrics, getReportData } from '../../../@data/services/ReportingService';\r\nimport { MediationReportingDataRequestBody } from '../../../@data/store/schema/models/MediationReportingDataRequestBody';\r\nimport { ReportingDataRequestBody } from '../../../@data/store/schema/models/ReportingDataRequestBody';\r\nimport { getAdunitStore } from '../../ad-management/Adunit/@data';\r\nimport { IReportsMetadata, MediationReportingDataRow } from '../DashboardCards/@data/store/schema';\r\nimport { getReportType } from '../DashboardCards/@data/store/selectors';\r\nimport { mapAdUnitName } from '../DashboardCards/@data/utils/mapAdUnitName';\r\nimport { ReportCardType } from '../DashboardCards/ReportCard/ReportCard.types';\r\nimport ReportMessages from '../Report.messages';\r\n\r\nexport function useReportQuery(reportRequestBody: ReportingDataRequestBody, isDetailedReport: boolean, enabled: boolean) {\r\n const { isLoading, isError, data, error } = useQuery({\r\n queryKey: ['reportData', { ...reportRequestBody, columns: reportRequestBody.columns.sort(), callerGuid: '' }],\r\n queryFn: async () => {\r\n const { data: reportData } = await getReportData(reportRequestBody, new AbortController());\r\n return reportData.Data;\r\n },\r\n onError: () => {\r\n const isSummaryReport = ReportCardType[reportRequestBody.reportName] === ReportCardType.SUMMARY;\r\n const messageDescriptor = isSummaryReport\r\n ? ReportMessages.loadingReportSummaryFailedMessage\r\n : isDetailedReport\r\n ? ReportMessages.loadingDetailedReportFailedMessage\r\n : ReportMessages.loadingReportFailedMessage;\r\n showErrorToastNotification({\r\n textMessageDescriptor: messageDescriptor,\r\n intlMessageValues: { reportType: reportRequestBody.reportName.toLowerCase() },\r\n });\r\n },\r\n enabled,\r\n staleTime: 3600000,\r\n refetchOnWindowFocus: true,\r\n refetchOnMount: true,\r\n refetchOnReconnect: true,\r\n });\r\n return { isLoading, isError, data, error };\r\n}\r\nexport function useMediationReportQuery(reportRequestBody: MediationReportingDataRequestBody, enabled: boolean) {\r\n const { isLoading, isError, data, error } = useQuery({\r\n queryKey: ['reportData', { ...reportRequestBody, columns: reportRequestBody.columns.sort(), callerGuid: '' }],\r\n queryFn: async () => {\r\n const { data: reportData } = await getMediationReportData(reportRequestBody, new AbortController());\r\n const {\r\n adUnitsRaw: { data: adUnitsData },\r\n } = getAdunitStore();\r\n const transformedData: MediationReportingDataRow[] = mapAdUnitName(reportData, adUnitsData);\r\n return transformedData;\r\n },\r\n onError: () => {\r\n showErrorToastNotification({\r\n textMessageDescriptor: ReportMessages.loadingMediationReportFailedMessage,\r\n });\r\n },\r\n enabled: enabled && !getAdunitStore().isFetchingAdUnitStatus,\r\n staleTime: 3600000,\r\n refetchOnWindowFocus: true,\r\n refetchOnMount: true,\r\n refetchOnReconnect: true,\r\n });\r\n return { isLoading, isError, data, error };\r\n}\r\n\r\nexport function useReportMetadata() {\r\n const { isLoading, isError, data, error } = useQuery({\r\n queryKey: ['reportMetadata'],\r\n queryFn: async () => {\r\n const reportType = getReportType();\r\n const [dimensions, metrics, grains] = await Promise.all([\r\n getDimensions(reportType),\r\n getMetrics(reportType),\r\n getGranularity(reportType),\r\n ]);\r\n return { dimensions, metrics, grains } as IReportsMetadata;\r\n },\r\n onError: () => {\r\n showErrorToastNotification({ textMessageDescriptor: ReportMessages.loadingReportMetadataFailedMessage });\r\n },\r\n staleTime: 24 * 60 * 60 * 1000,\r\n refetchOnWindowFocus: true,\r\n refetchOnMount: true,\r\n refetchOnReconnect: true,\r\n });\r\n return { isLoading, isError, data, error };\r\n}\r\nexport function useMediationReportMetadata(enabled = true) {\r\n const { isLoading, isError, data, error } = useQuery({\r\n queryKey: ['mediationReportMetadata'],\r\n queryFn: async () => {\r\n const reportType = getReportType();\r\n const [dimensions, metrics, grains] = await Promise.all([\r\n getMediationDimensions(reportType),\r\n getMediationMetrics(reportType),\r\n getMediationGranularity(reportType),\r\n ]);\r\n return { dimensions, metrics, grains } as IReportsMetadata;\r\n },\r\n onError: () => {\r\n showErrorToastNotification({ textMessageDescriptor: ReportMessages.loadingReportMetadataFailedMessage });\r\n },\r\n enabled,\r\n staleTime: 24 * 60 * 60 * 1000,\r\n refetchOnWindowFocus: true,\r\n refetchOnMount: true,\r\n refetchOnReconnect: true,\r\n });\r\n return { isLoading, isError, data, error };\r\n}\r\n","import { AdUnit } from '../../../../../@data';\r\nimport { MediationReportingDataResponse, MediationReportingDataRow } from '../store/schema';\r\n\r\nexport function mapAdUnitName(data: MediationReportingDataResponse, adUnitsData: AdUnit[] = []): MediationReportingDataRow[] {\r\n return data.data.map((item) => {\r\n const matchingAdUnit = adUnitsData?.find((adUnit) => adUnit.id.toString() === item.PubCenterAdUnitId);\r\n return {\r\n ...item,\r\n AdUnitName: matchingAdUnit ? String(matchingAdUnit.name) : item.AdUnitName,\r\n };\r\n });\r\n}\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { AccountStatus, PaymentsPageBalance, PaymentsPageEstimatedEarnings, XPayJwtTokenRequest } from '../../../../../@data';\r\nimport { ChartGrain } from '../../Payments/EstimatedEarnings/EstimatedEarnings.types';\r\nimport { getAccountStatusData } from '../store/accountStatusStore';\r\nimport { getPaymentsPageData } from '../store/paymentsPageStore';\r\nimport { getPaymentsPageBalance, getPaymentsPageEstimatedEarnings } from '../store/selectors';\r\n\r\nexport const setBalanceIsDataLoadedAction = mutatorAction('setBalanceIsDataLoadedAction', (isDataLoaded: boolean) => {\r\n getPaymentsPageBalance().isDataLoaded = isDataLoaded;\r\n});\r\nexport const setEstimatedEarningsIsDataLoadedAction = mutatorAction(\r\n 'setEstimatedEarningsIsDataLoadedAction',\r\n (isDataLoaded: boolean, grain: ChartGrain) => {\r\n getPaymentsPageEstimatedEarnings()[grain].isDataLoaded = isDataLoaded;\r\n }\r\n);\r\nexport const setBalanceDataAction = mutatorAction('setBalanceDataAction', (data: PaymentsPageBalance) => {\r\n getPaymentsPageBalance().data = data;\r\n});\r\nexport const setEstimatedEarningsDataAction = mutatorAction(\r\n 'setEstimatedEarningsDataAction',\r\n (data: PaymentsPageEstimatedEarnings, grain: ChartGrain) => {\r\n getPaymentsPageEstimatedEarnings()[grain].data = data;\r\n }\r\n);\r\nexport const setAccountStatusDataAction = mutatorAction('setAccountStatusDataAction', (data: AccountStatus) => {\r\n getAccountStatusData().status = data.status;\r\n});\r\nexport const setAccountStatusIsLoading = mutatorAction('setAccountStatusIsLoading', (isLoading: boolean) => {\r\n getAccountStatusData().isLoading = isLoading;\r\n});\r\n\r\nexport const setXpayJwtToken = mutatorAction('setXpayJwtToken', (xpayJwtToken: string, xpayJwtTokenRequest: XPayJwtTokenRequest) => {\r\n getPaymentsPageData().xpayJwtToken = xpayJwtToken;\r\n getPaymentsPageData().xpayJwtTokenRequest = xpayJwtTokenRequest;\r\n});\r\nexport const setXpayJwtTokenExpirationTime = mutatorAction('setXpayJwtTokenExpirationTime', (tokenExpirationTime: number) => {\r\n getPaymentsPageData().xpayTokenExpirationTimeStamp = tokenExpirationTime;\r\n});\r\nexport const setXpayJwtTokenStatusIsLoading = mutatorAction('setXpayJwtTokenStatusIsLoading', (isLoading: boolean) => {\r\n getPaymentsPageData().xpayJwtTokenStatusIsLoading = isLoading;\r\n});\r\n","export interface IDictionary<T> {\r\n [key: string]: T;\r\n}\r\n\r\nexport const COUNTRIES: IDictionary<string> = {\r\n AF: 'Afghanistan',\r\n AL: 'Albania',\r\n DZ: 'Algeria',\r\n AS: 'American Samoa',\r\n AD: 'Andorra',\r\n AO: 'Angola',\r\n AI: 'Anguilla',\r\n AQ: 'Antarctica',\r\n AG: 'Antigua and Barbuda',\r\n AR: 'Argentina',\r\n AM: 'Armenia',\r\n AW: 'Aruba',\r\n AU: 'Australia',\r\n AT: 'Austria',\r\n AZ: 'Azerbaijan',\r\n BS: 'Bahamas',\r\n BH: 'Bahrain',\r\n BD: 'Bangladesh',\r\n BB: 'Barbados',\r\n BY: 'Belarus',\r\n BE: 'Belgium',\r\n BZ: 'Belize',\r\n BJ: 'Benin',\r\n BM: 'Bermuda',\r\n BT: 'Bhutan',\r\n BO: 'Bolivia',\r\n BA: 'Bosnia and Herzegovina',\r\n BW: 'Botswana',\r\n BV: 'Bouvet Island',\r\n BR: 'Brazil',\r\n IO: 'British Indian Ocean Territory',\r\n BN: 'Brunei',\r\n BG: 'Bulgaria',\r\n BF: 'Burkina Faso',\r\n BI: 'Burundi',\r\n CI: 'Côte d’Ivoire',\r\n KH: 'Cambodia',\r\n CM: 'Cameroon',\r\n CA: 'Canada',\r\n CV: 'Cape Verde',\r\n KY: 'Cayman Islands',\r\n CF: 'Central African Republic',\r\n TD: 'Chad',\r\n CL: 'Chile',\r\n CN: 'China',\r\n CX: 'Christmas Island',\r\n CC: 'Cocos (Keeling) Islands',\r\n CO: 'Colombia',\r\n KM: 'Comoros',\r\n CG: 'Congo',\r\n CD: 'Congo (DRC)',\r\n CK: 'Cook Islands',\r\n CR: 'Costa Rica',\r\n HR: 'Croatia',\r\n CY: 'Cyprus',\r\n CZ: 'Czech Republic',\r\n DK: 'Denmark',\r\n DJ: 'Djibouti',\r\n DM: 'Dominica',\r\n DO: 'Dominican Republic',\r\n EC: 'Ecuador',\r\n EG: 'Egypt',\r\n SV: 'El Salvador',\r\n GQ: 'Equatorial Guinea',\r\n ER: 'Eritrea',\r\n EE: 'Estonia',\r\n ET: 'Ethiopia',\r\n FK: 'Falkland Islands (Islas Malvinas)',\r\n FO: 'Faroe Islands',\r\n FJ: 'Fiji Islands',\r\n FI: 'Finland',\r\n FR: 'France',\r\n GF: 'French Guiana',\r\n PF: 'French Polynesia',\r\n TF: 'French Southern and Antarctic Lands',\r\n GA: 'Gabon',\r\n GM: 'Gambia',\r\n GE: 'Georgia',\r\n DE: 'Germany',\r\n GH: 'Ghana',\r\n GI: 'Gibraltar',\r\n GR: 'Greece',\r\n GL: 'Greenland',\r\n GD: 'Grenada',\r\n GP: 'Guadeloupe',\r\n GU: 'Guam',\r\n GT: 'Guatemala',\r\n GN: 'Guinea',\r\n GW: 'Guinea-Bissau',\r\n GY: 'Guyana',\r\n HT: 'Haiti',\r\n HM: 'Heard Island and McDonald Islands',\r\n HN: 'Honduras',\r\n HK: 'Hong Kong SAR',\r\n HU: 'Hungary',\r\n IS: 'Iceland',\r\n IN: 'India',\r\n ID: 'Indonesia',\r\n IQ: 'Iraq',\r\n IE: 'Ireland',\r\n IL: 'Israel',\r\n IT: 'Italy',\r\n JM: 'Jamaica',\r\n JP: 'Japan',\r\n JO: 'Jordan',\r\n KZ: 'Kazakhstan',\r\n KE: 'Kenya',\r\n KI: 'Kiribati',\r\n KR: 'Korea',\r\n KW: 'Kuwait',\r\n KG: 'Kyrgyzstan',\r\n LA: 'Laos',\r\n '99': 'Latin America',\r\n LV: 'Latvia',\r\n LB: 'Lebanon',\r\n LS: 'Lesotho',\r\n LR: 'Liberia',\r\n LY: 'Libya',\r\n LI: 'Liechtenstein',\r\n LT: 'Lithuania',\r\n LU: 'Luxembourg',\r\n MO: 'Macao SAR',\r\n MK: 'Macedonia',\r\n MG: 'Madagascar',\r\n MW: 'Malawi',\r\n MY: 'Malaysia',\r\n MV: 'Maldives',\r\n ML: 'Mali',\r\n MT: 'Malta',\r\n MH: 'Marshall Islands',\r\n MQ: 'Martinique',\r\n MR: 'Mauritania',\r\n MU: 'Mauritius',\r\n YT: 'Mayotte',\r\n MX: 'Mexico',\r\n FM: 'Micronesia',\r\n MD: 'Moldova',\r\n MC: 'Monaco',\r\n MN: 'Mongolia',\r\n MS: 'Montserrat',\r\n MA: 'Morocco',\r\n MZ: 'Mozambique',\r\n MM: 'Myanmar',\r\n NA: 'Namibia',\r\n NR: 'Nauru',\r\n NP: 'Nepal',\r\n AN: 'Netherlands Antilles',\r\n NL: 'Netherlands',\r\n NC: 'New Caledonia',\r\n NZ: 'New Zealand',\r\n NI: 'Nicaragua',\r\n NE: 'Niger',\r\n NG: 'Nigeria',\r\n NU: 'Niue',\r\n NF: 'Norfolk Island',\r\n MP: 'Northern Mariana Islands',\r\n NO: 'Norway',\r\n OM: 'Oman',\r\n PK: 'Pakistan',\r\n PW: 'Palau',\r\n PS: 'Palestinian Authority',\r\n PA: 'Panama',\r\n PG: 'Papua New Guinea',\r\n PY: 'Paraguay',\r\n PE: 'Peru',\r\n PH: 'Philippines',\r\n PN: 'Pitcairn Islands',\r\n PL: 'Poland',\r\n PT: 'Portugal',\r\n PR: 'Puerto Rico',\r\n QA: 'Qatar',\r\n SD: 'Republic of the Sudan',\r\n '97': 'Rest Of World',\r\n RE: 'Reunion',\r\n RO: 'Romania',\r\n RU: 'Russia',\r\n RW: 'Rwanda',\r\n SH: 'Saint Helena',\r\n KN: 'Saint Kitts and Nevis',\r\n LC: 'Saint Lucia',\r\n PM: 'Saint Pierre and Miquelon',\r\n VC: 'Saint Vincent and the Grenadines',\r\n WS: 'Samoa',\r\n SM: 'San Marino',\r\n ST: 'São Tomé and PrÃncipe',\r\n SA: 'Saudi Arabia',\r\n SN: 'Senegal',\r\n RS: 'Serbia',\r\n CS: 'Serbia and Montenegro',\r\n SC: 'Seychelles',\r\n SL: 'Sierra Leone',\r\n SG: 'Singapore',\r\n SK: 'Slovakia',\r\n SI: 'Slovenia',\r\n SB: 'Solomon Islands',\r\n SO: 'Somalia',\r\n ZA: 'South Africa',\r\n GS: 'South Georgia and the South Sandwich Islands',\r\n ES: 'Spain',\r\n LK: 'Sri Lanka',\r\n SR: 'Suriname',\r\n SJ: 'Svalbard',\r\n SZ: 'Swaziland',\r\n SE: 'Sweden',\r\n CH: 'Switzerland',\r\n TW: 'Taiwan',\r\n TJ: 'Tajikistan',\r\n TZ: 'Tanzania',\r\n '96': 'TEST USE ONLY',\r\n TH: 'Thailand',\r\n TL: 'Timor-Leste',\r\n TG: 'Togo',\r\n TK: 'Tokelau',\r\n TO: 'Tonga',\r\n TT: 'Trinidad and Tobago',\r\n TN: 'Tunisia',\r\n TR: 'Turkey',\r\n TM: 'Turkmenistan',\r\n TC: 'Turks and Caicos Islands',\r\n TV: 'Tuvalu',\r\n UM: 'U.S. Minor Outlying Islands',\r\n UG: 'Uganda',\r\n UA: 'Ukraine',\r\n AE: 'United Arab Emirates',\r\n GB: 'United Kingdom',\r\n US: 'United States',\r\n UY: 'Uruguay',\r\n UZ: 'Uzbekistan',\r\n VU: 'Vanuatu',\r\n VA: 'Vatican City',\r\n VE: 'Venezuela',\r\n VN: 'Vietnam',\r\n VG: 'Virgin Islands',\r\n VI: 'Virgin Islands',\r\n WF: 'Wallis and Futuna',\r\n ZW: 'Zimbabwe',\r\n YE: 'Yemen',\r\n ZM: 'Zambia',\r\n};\r\n\r\nexport const COUNTRIES_EN: IDictionary<string> = {\r\n AF: 'Afghanistan',\r\n AL: 'Albania',\r\n DZ: 'Algeria',\r\n AS: 'American Samoa',\r\n AD: 'Andorra',\r\n AO: 'Angola',\r\n AI: 'Anguilla',\r\n AQ: 'Antarctica',\r\n AG: 'Antigua and Barbuda',\r\n AR: 'Argentina',\r\n AM: 'Armenia',\r\n AW: 'Aruba',\r\n AU: 'Australia',\r\n AT: 'Austria',\r\n AZ: 'Azerbaijan',\r\n BS: 'Bahamas',\r\n BH: 'Bahrain',\r\n BD: 'Bangladesh',\r\n BB: 'Barbados',\r\n BY: 'Belarus',\r\n BE: 'Belgium',\r\n BZ: 'Belize',\r\n BJ: 'Benin',\r\n BM: 'Bermuda',\r\n BT: 'Bhutan',\r\n BO: 'Bolivia (Plurinational State of)',\r\n BQ: 'Bonaire, Sint Eustatius and Saba',\r\n BA: 'Bosnia and Herzegovina',\r\n BW: 'Botswana',\r\n BV: 'Bouvet Island',\r\n BR: 'Brazil',\r\n IO: 'British Indian Ocean Territory',\r\n BN: 'Brunei Darussalam',\r\n BG: 'Bulgaria',\r\n BF: 'Burkina Faso',\r\n BI: 'Burundi',\r\n CV: 'Cabo Verde',\r\n KH: 'Cambodia',\r\n CM: 'Cameroon',\r\n CA: 'Canada',\r\n KY: 'Cayman Islands',\r\n CF: 'Central African Republic',\r\n TD: 'Chad',\r\n CL: 'Chile',\r\n CN: 'China',\r\n CX: 'Christmas Island',\r\n CC: 'Cocos (Keeling) Islands',\r\n CO: 'Colombia',\r\n KM: 'Comoros',\r\n CG: 'Congo',\r\n CD: 'Congo (Democratic Republic of the)',\r\n CK: 'Cook Islands',\r\n CR: 'Costa Rica',\r\n HR: 'Croatia',\r\n CU: 'Cuba',\r\n CW: 'Curaçao',\r\n CY: 'Cyprus',\r\n CZ: 'Czechia',\r\n CI: \"Côte d'Ivoire\",\r\n DK: 'Denmark',\r\n DJ: 'Djibouti',\r\n DM: 'Dominica',\r\n DO: 'Dominican Republic',\r\n EC: 'Ecuador',\r\n EG: 'Egypt',\r\n SV: 'El Salvador',\r\n GQ: 'Equatorial Guinea',\r\n ER: 'Eritrea',\r\n EE: 'Estonia',\r\n ET: 'Ethiopia',\r\n FK: 'Falkland Islands (Malvinas)',\r\n FO: 'Faroe Islands',\r\n FJ: 'Fiji',\r\n FI: 'Finland',\r\n FR: 'France',\r\n GF: 'French Guiana',\r\n PF: 'French Polynesia',\r\n TF: 'French Southern Territories',\r\n GA: 'Gabon',\r\n GM: 'Gambia',\r\n GE: 'Georgia',\r\n DE: 'Germany',\r\n GH: 'Ghana',\r\n GI: 'Gibraltar',\r\n GR: 'Greece',\r\n GL: 'Greenland',\r\n GD: 'Grenada',\r\n GP: 'Guadeloupe',\r\n GU: 'Guam',\r\n GT: 'Guatemala',\r\n GG: 'Guernsey',\r\n GN: 'Guinea',\r\n GW: 'Guinea-Bissau',\r\n GY: 'Guyana',\r\n HT: 'Haiti',\r\n HM: 'Heard Island and McDonald Islands',\r\n VA: 'Holy See',\r\n HN: 'Honduras',\r\n HK: 'Hong Kong',\r\n HU: 'Hungary',\r\n IS: 'Iceland',\r\n IN: 'India',\r\n ID: 'Indonesia',\r\n IR: 'Iran (Islamic Republic of)',\r\n IQ: 'Iraq',\r\n IE: 'Ireland',\r\n IM: 'Isle of Man',\r\n IL: 'Israel',\r\n IT: 'Italy',\r\n JM: 'Jamaica',\r\n JP: 'Japan',\r\n JE: 'Jersey',\r\n JO: 'Jordan',\r\n KZ: 'Kazakhstan',\r\n KE: 'Kenya',\r\n KI: 'Kiribati',\r\n KP: \"Korea (Democratic People's Republic of)\",\r\n KR: 'Korea (Republic of)',\r\n KW: 'Kuwait',\r\n KG: 'Kyrgyzstan',\r\n LA: \"Lao People's Democratic Republic\",\r\n LV: 'Latvia',\r\n LB: 'Lebanon',\r\n LS: 'Lesotho',\r\n LR: 'Liberia',\r\n LY: 'Libya',\r\n LI: 'Liechtenstein',\r\n LT: 'Lithuania',\r\n LU: 'Luxembourg',\r\n MO: 'Macao',\r\n MK: 'Macedonia (the former Yugoslav Republic of)',\r\n MG: 'Madagascar',\r\n MW: 'Malawi',\r\n MY: 'Malaysia',\r\n MV: 'Maldives',\r\n ML: 'Mali',\r\n MT: 'Malta',\r\n MH: 'Marshall Islands',\r\n MQ: 'Martinique',\r\n MR: 'Mauritania',\r\n MU: 'Mauritius',\r\n YT: 'Mayotte',\r\n MX: 'Mexico',\r\n FM: 'Micronesia (Federated States of)',\r\n MD: 'Moldova (Republic of)',\r\n MC: 'Monaco',\r\n MN: 'Mongolia',\r\n ME: 'Montenegro',\r\n MS: 'Montserrat',\r\n MA: 'Morocco',\r\n MZ: 'Mozambique',\r\n MM: 'Myanmar',\r\n NA: 'Namibia',\r\n NR: 'Nauru',\r\n NP: 'Nepal',\r\n NL: 'Netherlands',\r\n NC: 'New Caledonia',\r\n NZ: 'New Zealand',\r\n NI: 'Nicaragua',\r\n NE: 'Niger',\r\n NG: 'Nigeria',\r\n NU: 'Niue',\r\n NF: 'Norfolk Island',\r\n MP: 'Northern Mariana Islands',\r\n NO: 'Norway',\r\n OM: 'Oman',\r\n PK: 'Pakistan',\r\n PW: 'Palau',\r\n PS: 'Palestine, State of',\r\n PA: 'Panama',\r\n PG: 'Papua New Guinea',\r\n PY: 'Paraguay',\r\n PE: 'Peru',\r\n PH: 'Philippines',\r\n PN: 'Pitcairn',\r\n PL: 'Poland',\r\n PT: 'Portugal',\r\n PR: 'Puerto Rico',\r\n QA: 'Qatar',\r\n RO: 'Romania',\r\n RU: 'Russian Federation',\r\n RW: 'Rwanda',\r\n RE: 'Réunion',\r\n BL: 'Saint Barthélemy',\r\n SH: 'Saint Helena, Ascension and Tristan da Cunha',\r\n KN: 'Saint Kitts and Nevis',\r\n LC: 'Saint Lucia',\r\n MF: 'Saint Martin (French part)',\r\n PM: 'Saint Pierre and Miquelon',\r\n VC: 'Saint Vincent and the Grenadines',\r\n WS: 'Samoa',\r\n SM: 'San Marino',\r\n ST: 'Sao Tome and Principe',\r\n SA: 'Saudi Arabia',\r\n SN: 'Senegal',\r\n RS: 'Serbia',\r\n SC: 'Seychelles',\r\n SL: 'Sierra Leone',\r\n SG: 'Singapore',\r\n SX: 'Sint Maarten (Dutch part)',\r\n SK: 'Slovakia',\r\n SI: 'Slovenia',\r\n SB: 'Solomon Islands',\r\n SO: 'Somalia',\r\n ZA: 'South Africa',\r\n GS: 'South Georgia and the South Sandwich Islands',\r\n SS: 'South Sudan',\r\n ES: 'Spain',\r\n LK: 'Sri Lanka',\r\n SD: 'Sudan',\r\n SR: 'Suriname',\r\n SJ: 'Svalbard and Jan Mayen',\r\n SZ: 'Swaziland',\r\n SE: 'Sweden',\r\n CH: 'Switzerland',\r\n SY: 'Syrian Arab Republic',\r\n TW: 'Taiwan, Province of China[a]',\r\n TJ: 'Tajikistan',\r\n TZ: 'Tanzania, United Republic of',\r\n TH: 'Thailand',\r\n TL: 'Timor-Leste',\r\n TG: 'Togo',\r\n TK: 'Tokelau',\r\n TO: 'Tonga',\r\n TT: 'Trinidad and Tobago',\r\n TN: 'Tunisia',\r\n TR: 'Turkey',\r\n TM: 'Turkmenistan',\r\n TC: 'Turks and Caicos Islands',\r\n TV: 'Tuvalu',\r\n UG: 'Uganda',\r\n UA: 'Ukraine',\r\n AE: 'United Arab Emirates',\r\n GB: 'United Kingdom of Great Britain',\r\n UM: 'United States Minor Outlying Islands',\r\n US: 'United States of America',\r\n UY: 'Uruguay',\r\n UZ: 'Uzbekistan',\r\n VU: 'Vanuatu',\r\n VE: 'Venezuela (Bolivarian Republic of)',\r\n VN: 'Viet Nam',\r\n VG: 'Virgin Islands (British)',\r\n VI: 'Virgin Islands (U.S.)',\r\n WF: 'Wallis and Futuna',\r\n EH: 'Western Sahara',\r\n YE: 'Yemen',\r\n ZM: 'Zambia',\r\n ZW: 'Zimbabwe',\r\n AX: 'Ã…land Islands',\r\n};\r\n\r\nexport const COUNTRIES_EN_GB: IDictionary<string> = {\r\n AF: 'Afghanistan',\r\n AL: 'Albania',\r\n DZ: 'Algeria',\r\n AS: 'American Samoa',\r\n AD: 'Andorra',\r\n AO: 'Angola',\r\n AI: 'Anguilla',\r\n AQ: 'Antarctica',\r\n AG: 'Antigua and Barbuda',\r\n AR: 'Argentina',\r\n AM: 'Armenia',\r\n AW: 'Aruba',\r\n AU: 'Australia',\r\n AT: 'Austria',\r\n AZ: 'Azerbaijan',\r\n BS: 'Bahamas',\r\n BH: 'Bahrain',\r\n BD: 'Bangladesh',\r\n BB: 'Barbados',\r\n BY: 'Belarus',\r\n BE: 'Belgium',\r\n BZ: 'Belize',\r\n BJ: 'Benin',\r\n BM: 'Bermuda',\r\n BT: 'Bhutan',\r\n BO: 'Bolivia (Plurinational State of)',\r\n BQ: 'Bonaire, Sint Eustatius and Saba',\r\n BA: 'Bosnia and Herzegovina',\r\n BW: 'Botswana',\r\n BV: 'Bouvet Island',\r\n BR: 'Brazil',\r\n IO: 'British Indian Ocean Territory',\r\n BN: 'Brunei Darussalam',\r\n BG: 'Bulgaria',\r\n BF: 'Burkina Faso',\r\n BI: 'Burundi',\r\n CV: 'Cabo Verde',\r\n KH: 'Cambodia',\r\n CM: 'Cameroon',\r\n CA: 'Canada',\r\n KY: 'Cayman Islands',\r\n CF: 'Central African Republic',\r\n TD: 'Chad',\r\n CL: 'Chile',\r\n CN: 'China',\r\n CX: 'Christmas Island',\r\n CC: 'Cocos (Keeling) Islands',\r\n CO: 'Colombia',\r\n KM: 'Comoros',\r\n CG: 'Congo',\r\n CD: 'Congo (Democratic Republic of the)',\r\n CK: 'Cook Islands',\r\n CR: 'Costa Rica',\r\n HR: 'Croatia',\r\n CU: 'Cuba',\r\n CW: 'Curaçao',\r\n CY: 'Cyprus',\r\n CZ: 'Czechia',\r\n CI: \"Côte d'Ivoire\",\r\n DK: 'Denmark',\r\n DJ: 'Djibouti',\r\n DM: 'Dominica',\r\n DO: 'Dominican Republic',\r\n EC: 'Ecuador',\r\n EG: 'Egypt',\r\n SV: 'El Salvador',\r\n GQ: 'Equatorial Guinea',\r\n ER: 'Eritrea',\r\n EE: 'Estonia',\r\n ET: 'Ethiopia',\r\n FK: 'Falkland Islands (Malvinas)',\r\n FO: 'Faroe Islands',\r\n FJ: 'Fiji',\r\n FI: 'Finland',\r\n FR: 'France',\r\n GF: 'French Guiana',\r\n PF: 'French Polynesia',\r\n TF: 'French Southern Territories',\r\n GA: 'Gabon',\r\n GM: 'Gambia',\r\n GE: 'Georgia',\r\n DE: 'Germany',\r\n GH: 'Ghana',\r\n GI: 'Gibraltar',\r\n GR: 'Greece',\r\n GL: 'Greenland',\r\n GD: 'Grenada',\r\n GP: 'Guadeloupe',\r\n GU: 'Guam',\r\n GT: 'Guatemala',\r\n GG: 'Guernsey',\r\n GN: 'Guinea',\r\n GW: 'Guinea-Bissau',\r\n GY: 'Guyana',\r\n HT: 'Haiti',\r\n HM: 'Heard Island and McDonald Islands',\r\n VA: 'Holy See',\r\n HN: 'Honduras',\r\n HK: 'Hong Kong',\r\n HU: 'Hungary',\r\n IS: 'Iceland',\r\n IN: 'India',\r\n ID: 'Indonesia',\r\n IR: 'Iran (Islamic Republic of)',\r\n IQ: 'Iraq',\r\n IE: 'Ireland',\r\n IM: 'Isle of Man',\r\n IL: 'Israel',\r\n IT: 'Italy',\r\n JM: 'Jamaica',\r\n JP: 'Japan',\r\n JE: 'Jersey',\r\n JO: 'Jordan',\r\n KZ: 'Kazakhstan',\r\n KE: 'Kenya',\r\n KI: 'Kiribati',\r\n KP: \"Korea (Democratic People's Republic of)\",\r\n KR: 'Korea (Republic of)',\r\n KW: 'Kuwait',\r\n KG: 'Kyrgyzstan',\r\n LA: \"Lao People's Democratic Republic\",\r\n LV: 'Latvia',\r\n LB: 'Lebanon',\r\n LS: 'Lesotho',\r\n LR: 'Liberia',\r\n LY: 'Libya',\r\n LI: 'Liechtenstein',\r\n LT: 'Lithuania',\r\n LU: 'Luxembourg',\r\n MO: 'Macao',\r\n MK: 'Macedonia (the former Yugoslav Republic of)',\r\n MG: 'Madagascar',\r\n MW: 'Malawi',\r\n MY: 'Malaysia',\r\n MV: 'Maldives',\r\n ML: 'Mali',\r\n MT: 'Malta',\r\n MH: 'Marshall Islands',\r\n MQ: 'Martinique',\r\n MR: 'Mauritania',\r\n MU: 'Mauritius',\r\n YT: 'Mayotte',\r\n MX: 'Mexico',\r\n FM: 'Micronesia (Federated States of)',\r\n MD: 'Moldova (Republic of)',\r\n MC: 'Monaco',\r\n MN: 'Mongolia',\r\n ME: 'Montenegro',\r\n MS: 'Montserrat',\r\n MA: 'Morocco',\r\n MZ: 'Mozambique',\r\n MM: 'Myanmar',\r\n NA: 'Namibia',\r\n NR: 'Nauru',\r\n NP: 'Nepal',\r\n NL: 'Netherlands',\r\n NC: 'New Caledonia',\r\n NZ: 'New Zealand',\r\n NI: 'Nicaragua',\r\n NE: 'Niger',\r\n NG: 'Nigeria',\r\n NU: 'Niue',\r\n NF: 'Norfolk Island',\r\n MP: 'Northern Mariana Islands',\r\n NO: 'Norway',\r\n OM: 'Oman',\r\n PK: 'Pakistan',\r\n PW: 'Palau',\r\n PS: 'Palestine, State of',\r\n PA: 'Panama',\r\n PG: 'Papua New Guinea',\r\n PY: 'Paraguay',\r\n PE: 'Peru',\r\n PH: 'Philippines',\r\n PN: 'Pitcairn',\r\n PL: 'Poland',\r\n PT: 'Portugal',\r\n PR: 'Puerto Rico',\r\n QA: 'Qatar',\r\n RO: 'Romania',\r\n RU: 'Russian Federation',\r\n RW: 'Rwanda',\r\n RE: 'Réunion',\r\n BL: 'Saint Barthélemy',\r\n SH: 'Saint Helena, Ascension and Tristan da Cunha',\r\n KN: 'Saint Kitts and Nevis',\r\n LC: 'Saint Lucia',\r\n MF: 'Saint Martin (French part)',\r\n PM: 'Saint Pierre and Miquelon',\r\n VC: 'Saint Vincent and the Grenadines',\r\n WS: 'Samoa',\r\n SM: 'San Marino',\r\n ST: 'Sao Tome and Principe',\r\n SA: 'Saudi Arabia',\r\n SN: 'Senegal',\r\n RS: 'Serbia',\r\n SC: 'Seychelles',\r\n SL: 'Sierra Leone',\r\n SG: 'Singapore',\r\n SX: 'Sint Maarten (Dutch part)',\r\n SK: 'Slovakia',\r\n SI: 'Slovenia',\r\n SB: 'Solomon Islands',\r\n SO: 'Somalia',\r\n ZA: 'South Africa',\r\n GS: 'South Georgia and the South Sandwich Islands',\r\n SS: 'South Sudan',\r\n ES: 'Spain',\r\n LK: 'Sri Lanka',\r\n SD: 'Sudan',\r\n SR: 'Suriname',\r\n SJ: 'Svalbard and Jan Mayen',\r\n SZ: 'Swaziland',\r\n SE: 'Sweden',\r\n CH: 'Switzerland',\r\n SY: 'Syrian Arab Republic',\r\n TW: 'Taiwan, Province of China[a]',\r\n TJ: 'Tajikistan',\r\n TZ: 'Tanzania, United Republic of',\r\n TH: 'Thailand',\r\n TL: 'Timor-Leste',\r\n TG: 'Togo',\r\n TK: 'Tokelau',\r\n TO: 'Tonga',\r\n TT: 'Trinidad and Tobago',\r\n TN: 'Tunisia',\r\n TR: 'Turkey',\r\n TM: 'Turkmenistan',\r\n TC: 'Turks and Caicos Islands',\r\n TV: 'Tuvalu',\r\n UG: 'Uganda',\r\n UA: 'Ukraine',\r\n AE: 'United Arab Emirates',\r\n GB: 'United Kingdom of Great Britain',\r\n UM: 'United States Minor Outlying Islands',\r\n US: 'United States of America',\r\n UY: 'Uruguay',\r\n UZ: 'Uzbekistan',\r\n VU: 'Vanuatu',\r\n VE: 'Venezuela (Bolivarian Republic of)',\r\n VN: 'Viet Nam',\r\n VG: 'Virgin Islands (British)',\r\n VI: 'Virgin Islands (U.S.)',\r\n WF: 'Wallis and Futuna',\r\n EH: 'Western Sahara',\r\n YE: 'Yemen',\r\n ZM: 'Zambia',\r\n ZW: 'Zimbabwe',\r\n AX: 'Ã…land Islands',\r\n};\r\n\r\nexport const COUNTRIES_FR: IDictionary<string> = {\r\n AF: 'Afghanistan',\r\n DE: 'Allemagne',\r\n AD: 'Andorre',\r\n AI: 'Anguilla',\r\n AG: 'Antigua-et-Barbuda',\r\n AW: 'Aruba',\r\n AT: 'Autriche',\r\n BS: 'Bahamas',\r\n BH: 'Bahreïn',\r\n BD: 'Bangladesh',\r\n BE: 'Belgique',\r\n BZ: 'Belize',\r\n BM: 'Bermudes',\r\n BO: 'Bolivie (État Plurinational de)',\r\n BQ: 'Bonaire, Sint Eustatius et Saba',\r\n BW: 'Botswana',\r\n BV: 'Bouvet Island',\r\n BN: 'Brunei Darussalam',\r\n BR: 'Brésil',\r\n BF: 'Burkina Faso',\r\n BI: 'Burundi',\r\n BJ: 'Bénin',\r\n CV: 'Cabo Verde',\r\n KH: 'Cambodge',\r\n CM: 'Cameroun',\r\n CA: 'Canada',\r\n CL: 'Chili',\r\n CY: 'Chypre',\r\n KM: 'Comores',\r\n CG: 'Congo',\r\n CD: 'Congo (République Démocratique du)',\r\n KR: 'Corée (République de)',\r\n KP: 'Corée (République populaire Démocratique de)',\r\n CR: 'Costa Rica',\r\n CU: 'Cuba',\r\n CW: 'Curaçao',\r\n DK: 'Danemark',\r\n DJ: 'Djibouti',\r\n DM: 'Dominique',\r\n SV: 'El Salvador',\r\n ES: 'Espagne',\r\n FJ: 'Fidji',\r\n FR: 'France',\r\n RU: 'Fédération De Russie',\r\n GA: 'Gabon',\r\n GI: 'Gibraltar',\r\n GP: 'Guadeloupe',\r\n GU: 'Guam',\r\n GT: 'Guatemala',\r\n GG: 'Guernesey',\r\n GQ: 'Guinée Équatoriale',\r\n GF: 'Guyane Française',\r\n GS: 'Géorgie du sud et les ÃŽles Sandwich du Sud',\r\n HT: 'Haïti',\r\n HN: 'Honduras',\r\n HK: 'Hong Kong',\r\n HU: 'Hongrie',\r\n IR: 'Iran (République Islamique de)',\r\n IL: 'Israël',\r\n IT: 'Italie',\r\n JP: 'Japon',\r\n JE: 'Jersey',\r\n KZ: 'Kazakhstan',\r\n KE: 'Kenya',\r\n KG: 'Kirghizistan',\r\n KI: 'Kiribati',\r\n KW: 'Koweït',\r\n ZA: \"L'Afrique Du Sud\",\r\n AO: \"L'Angola\",\r\n SA: \"L'Arabie Saoudite\",\r\n UA: \"L'Ukraine\",\r\n UY: \"L'Uruguay\",\r\n AL: \"L'albanie\",\r\n DZ: \"L'algérie\",\r\n AQ: \"L'antarctique\",\r\n AR: \"L'argentine\",\r\n AM: \"L'arménie\",\r\n AU: \"L'australie\",\r\n AZ: \"L'azerbaïdjan\",\r\n EG: \"L'egypte\",\r\n EE: \"L'estonie\",\r\n ET: \"L'ethiopie\",\r\n IN: \"L'inde\",\r\n ID: \"L'indonésie\",\r\n IQ: \"L'irak\",\r\n IE: \"L'irlande\",\r\n IS: \"L'islande\",\r\n UG: \"L'ouganda\",\r\n CX: \"L'ÃŽle Christmas\",\r\n NF: \"L'ÃŽle De Norfolk\",\r\n HM: \"L'ÃŽle heard et des ÃŽles McDonald\",\r\n EC: \"L'équateur\",\r\n ER: \"L'érythrée\",\r\n IM: \"L'île de Man\",\r\n MU: \"L'île maurice\",\r\n CI: \"La Côte d'Ivoire\",\r\n GW: 'La Guinée-Bissau',\r\n NC: 'La Nouvelle-Calédonie',\r\n NZ: 'La Nouvelle-Zélande',\r\n PS: \"La Palestine, l'État de\",\r\n PF: 'La Polynésie Française',\r\n LA: 'La République Démocratique populaire Lao',\r\n RE: 'La Réunion',\r\n SL: 'La Sierra Leone',\r\n BB: 'La barbade',\r\n BY: 'La biélorussie',\r\n BA: 'La bosnie-et-Herzégovine',\r\n BG: 'La bulgarie',\r\n CN: 'La chine',\r\n CO: 'La colombie',\r\n HR: 'La croatie',\r\n FI: 'La finlande',\r\n GM: 'La gambie',\r\n GD: 'La grenade',\r\n GR: 'La grèce',\r\n GN: 'La guinée',\r\n GY: 'La guyane',\r\n GE: 'La géorgie',\r\n JM: 'La jamaïque',\r\n JO: 'La jordanie',\r\n LV: 'La lettonie',\r\n LY: 'La libye',\r\n LT: 'La lituanie',\r\n MY: 'La malaisie',\r\n MR: 'La mauritanie',\r\n MN: 'La mongolie',\r\n NA: 'La namibie',\r\n NO: 'La norvège',\r\n RO: 'La roumanie',\r\n MD: 'La république de Moldova (République de)',\r\n CZ: 'La république tchèque',\r\n RS: 'La serbie',\r\n SK: 'La slovaquie',\r\n SI: 'La slovénie',\r\n SO: 'La somalie',\r\n CH: 'La suisse',\r\n TR: 'La turquie',\r\n ZM: 'La zambie',\r\n GH: 'Le Ghana',\r\n LI: 'Le Liechtenstein',\r\n ML: 'Le Mali',\r\n RW: 'Le Rwanda',\r\n SS: 'Le Soudan Du Sud',\r\n TL: 'Le Timor-Leste',\r\n VN: 'Le Viet Nam',\r\n BT: 'Le bhoutan',\r\n GL: 'Le groenland',\r\n ME: 'Le monténégro',\r\n TM: 'Le turkménistan',\r\n AX: \"Les ÃŽles D'Ã…land\",\r\n LS: 'Lesotho',\r\n LB: 'Liban',\r\n LR: 'Libéria',\r\n LU: 'Luxembourg',\r\n MO: 'Macao',\r\n MK: 'Macédoine (ex-République Yougoslave de)',\r\n MG: 'Madagascar',\r\n MW: 'Malawi',\r\n MV: 'Maldives',\r\n MT: 'Malte',\r\n MA: 'Maroc',\r\n MQ: 'Martinique',\r\n YT: 'Mayotte',\r\n MX: 'Mexique',\r\n FM: 'Micronésie (États Fédérés de)',\r\n MC: 'Monaco',\r\n MS: 'Montserrat',\r\n MZ: 'Mozambique',\r\n MM: 'Myanmar',\r\n NR: 'Nauru',\r\n NI: 'Nicaragua',\r\n NE: 'Niger',\r\n NG: 'Nigeria',\r\n NU: 'Niue',\r\n NP: 'Népal',\r\n OM: 'Oman',\r\n UZ: 'Ouzbékistan',\r\n PK: 'Pakistan',\r\n PW: 'Palau',\r\n PA: 'Panama',\r\n PG: 'Papouasie-Nouvelle-Guinée',\r\n PY: 'Paraguay',\r\n NL: 'Pays-bas',\r\n PH: 'Philippines',\r\n PN: 'Pitcairn',\r\n PL: 'Pologne',\r\n PT: 'Portugal',\r\n PR: 'Puerto Rico',\r\n PE: 'Pérou',\r\n QA: 'Qatar',\r\n GB: 'Royaume-Uni de Grande-Bretagne',\r\n SY: 'République Arabe Syrienne',\r\n CF: 'République Centrafricaine',\r\n DO: 'République Dominicaine',\r\n EH: 'Sahara Occidental',\r\n BL: 'Saint-Barthélemy',\r\n KN: 'Saint-Kitts-et-Nevis',\r\n MF: 'Saint-Martin (partie française)',\r\n PM: 'Saint-Pierre-et-Miquelon',\r\n VA: 'Saint-Siège',\r\n VC: 'Saint-Vincent-et-les-Grenadines',\r\n SH: 'Sainte-Hélène, Ascension et Tristan da Cunha',\r\n LC: 'Sainte-Lucie',\r\n WS: 'Samoa',\r\n AS: 'Samoa Américaines',\r\n SM: 'San Marino',\r\n ST: 'Sao Tomé-et-Principe',\r\n SC: 'Seychelles',\r\n SG: 'Singapour',\r\n SX: 'Sint Maarten (en néerlandais partie)',\r\n SD: 'Soudan',\r\n LK: 'Sri Lanka',\r\n SR: 'Suriname',\r\n SE: 'Suède',\r\n SJ: 'Svalbard et Jan Mayen',\r\n SZ: 'Swaziland',\r\n SN: 'Sénégal',\r\n TJ: 'Tadjikistan',\r\n TW: 'Taiwan, Province de Chine[a]',\r\n TZ: 'Tanzanie, République-Unie de',\r\n TD: 'Tchad',\r\n TF: 'Terres Australes Françaises',\r\n IO: \"Territoire Britannique De L'Océan Indien\",\r\n TH: 'Thaïlande',\r\n TG: 'Togo',\r\n TK: 'Tokelau',\r\n TO: 'Tonga',\r\n TT: 'Trinité-et-Tobago',\r\n TN: 'Tunisie',\r\n TV: 'Tuvalu',\r\n VU: 'Vanuatu',\r\n VE: 'Venezuela (République Bolivarienne du)',\r\n WF: 'Wallis-et-Futuna',\r\n YE: 'Yémen',\r\n ZW: 'Zimbabwe',\r\n AE: 'Émirats Arabes Unis',\r\n UM: 'États-Unis ÃŽles Mineures Éloignées',\r\n US: \"États-unis d'Amérique\",\r\n KY: 'ÃŽles Caïmans',\r\n CC: 'ÃŽles Cocos (Keeling) ',\r\n CK: 'ÃŽles Cook',\r\n FK: 'ÃŽles Falkland (Malvinas)',\r\n FO: 'ÃŽles Féroé',\r\n MP: 'ÃŽles Mariannes Du Nord',\r\n MH: 'ÃŽles Marshall',\r\n SB: 'ÃŽles Salomon',\r\n VG: 'ÃŽles Vierges (Britanniques)',\r\n TC: 'ÃŽles turques et Caïques',\r\n VI: 'ÃŽles vierges (états-UNIS)',\r\n};\r\n\r\nexport const COUNTRIES_DE: IDictionary<string> = {\r\n AF: 'Afghanistan',\r\n AL: 'Albanien',\r\n DZ: 'Algerien',\r\n AS: 'Amerikanisch-Samoa',\r\n AD: 'Andorra',\r\n AO: 'Angola',\r\n AI: 'Anguilla',\r\n AQ: 'Antarktis',\r\n AG: 'Antigua und Barbuda',\r\n AR: 'Argentinien',\r\n AM: 'Armenien',\r\n AW: 'Aruba',\r\n AU: 'Australien',\r\n AT: 'Österreich',\r\n AZ: 'Aserbaidschan',\r\n BS: 'Bahamas',\r\n BH: 'Bahrain',\r\n BD: 'Bangladesch',\r\n BB: 'Barbados',\r\n BY: 'Weißrussland',\r\n BE: 'Belgien',\r\n BZ: 'Belize',\r\n BJ: 'Benin',\r\n BM: 'Bermuda',\r\n BT: 'Bhutan',\r\n BO: 'Bolivien (Plurinationaler Staat)',\r\n BQ: 'Bonaire, Sint Eustatius und Saba',\r\n BA: 'Bosnien und Herzegowina',\r\n BW: 'Botswana',\r\n BV: 'Bouvetinsel',\r\n BR: 'Brasilien',\r\n IO: 'Britisches Territorium im Indischen Ozean',\r\n BN: 'Brunei Darussalam',\r\n BG: 'Bulgarien',\r\n BF: 'Burkina Faso',\r\n BI: 'Burundi',\r\n CV: 'Cabo Verde',\r\n KH: 'Kambodscha',\r\n CM: 'Kamerun',\r\n CA: 'Kanada',\r\n KY: 'Kaimaninseln',\r\n CF: 'Zentralafrikanische Republik',\r\n TD: 'Tschad',\r\n CL: 'Chile',\r\n CN: 'China',\r\n CX: 'Weihnachtsinsel',\r\n CC: 'Kokosinseln (Keeling)',\r\n CO: 'Kolumbien',\r\n KM: 'Komoren',\r\n CG: 'Kongo',\r\n CD: 'Kongo (Demokratische Republik Kongo)',\r\n CK: 'Cookinseln',\r\n CR: 'Costa Rica',\r\n HR: 'Kroatien',\r\n CU: 'Kuba',\r\n CW: 'Curaçao',\r\n CY: 'Zypern',\r\n CZ: 'Tschechien',\r\n CI: 'Elfenbeinküste',\r\n DK: 'Dänemark',\r\n DJ: 'Dschibuti',\r\n DM: 'Dominica',\r\n DO: 'Dominikanische Republik',\r\n EC: 'Ecuador',\r\n EG: 'Ägypten',\r\n SV: 'El Salvador',\r\n GQ: 'Äquatorialguinea',\r\n ER: 'Eritrea',\r\n EE: 'Estland',\r\n ET: 'Äthiopien',\r\n FK: 'Falklandinseln (Malvinas)',\r\n FO: 'Färöer-Inseln',\r\n FJ: 'Fidschi',\r\n FI: 'Finnland',\r\n FR: 'Frankreich',\r\n GF: 'Französisch-Guayana',\r\n PF: 'Französisch-Polynesien',\r\n TF: 'Französische Süd- und Antarktisgebiete',\r\n GA: 'Gabun',\r\n GM: 'Gambia',\r\n GE: 'Georgien',\r\n DE: 'Deutschland',\r\n GH: 'Ghana',\r\n GI: 'Gibraltar',\r\n GR: 'Griechenland',\r\n GL: 'Grönland',\r\n GD: 'Grenada',\r\n GP: 'Guadeloupe',\r\n GU: 'Guam',\r\n GT: 'Guatemala',\r\n GG: 'Guernsey',\r\n GN: 'Guinea',\r\n GW: 'Guinea-Bissau',\r\n GY: 'Guyana',\r\n HT: 'Haiti',\r\n HM: 'Heard Island and McDonald Islands',\r\n VA: 'Heiliger Stuhl (Vatikanstadt)',\r\n HN: 'Honduras',\r\n HK: 'Hongkong',\r\n HU: 'Ungarn',\r\n IS: 'Island',\r\n IN: 'Indien',\r\n ID: 'Indonesien',\r\n IR: 'Iran (Islamische Republik)',\r\n IQ: 'Irak',\r\n IE: 'Irland',\r\n IM: 'Isle of Man',\r\n IL: 'Israel',\r\n IT: 'Italien',\r\n JM: 'Jamaika',\r\n JP: 'Japan',\r\n JE: 'Jersey',\r\n JO: 'Jordanien',\r\n KZ: 'Kasachstan',\r\n KE: 'Kenia',\r\n KI: 'Kiribati',\r\n KP: 'Korea (Demokratische Volksrepublik)',\r\n KR: 'Korea (Republik)',\r\n KW: 'Kuwait',\r\n KG: 'Kirgisistan',\r\n LA: 'Laos',\r\n LV: 'Lettland',\r\n LB: 'Libanon',\r\n LS: 'Lesotho',\r\n LR: 'Liberia',\r\n LY: 'Libyen',\r\n LI: 'Liechtenstein',\r\n LT: 'Litauen',\r\n LU: 'Luxemburg',\r\n MO: 'Macao',\r\n MK: 'Mazedonien (ehemalige jugoslawische Republik)',\r\n MG: 'Madagaskar',\r\n MW: 'Malawi',\r\n MY: 'Malaysia',\r\n MV: 'Malediven',\r\n ML: 'Mali',\r\n MT: 'Malta',\r\n MH: 'Marshallinseln',\r\n MQ: 'Martinique',\r\n MR: 'Mauretanien',\r\n MU: 'Mauritius',\r\n YT: 'Mayotte',\r\n MX: 'Mexiko',\r\n FM: 'Mikronesien (Föderierte Staaten)',\r\n MD: 'Moldawien (Republik)',\r\n MC: 'Monaco',\r\n MN: 'Mongolei',\r\n ME: 'Montenegro',\r\n MS: 'Montserrat',\r\n MA: 'Marokko',\r\n MZ: 'Mosambik',\r\n MM: 'Myanmar',\r\n NA: 'Namibia',\r\n NR: 'Nauru',\r\n NP: 'Nepal',\r\n NL: 'Niederlande',\r\n NC: 'Neukaledonien',\r\n NZ: 'Neuseeland',\r\n NI: 'Nicaragua',\r\n NE: 'Niger',\r\n NG: 'Nigeria',\r\n NU: 'Niue',\r\n NF: 'Norfolkinsel',\r\n MP: 'Nördliche Marianen',\r\n NO: 'Norwegen',\r\n OM: 'Oman',\r\n PK: 'Pakistan',\r\n PW: 'Palau',\r\n PS: 'Palästina, Staat',\r\n PA: 'Panama',\r\n PG: 'Papua-Neuguinea',\r\n PY: 'Paraguay',\r\n PE: 'Peru',\r\n PH: 'Philippinen',\r\n PN: 'Pitcairn',\r\n PL: 'Polen',\r\n PT: 'Portugal',\r\n PR: 'Puerto Rico',\r\n QA: 'Katar',\r\n RO: 'Rumänien',\r\n RU: 'Russische Föderation',\r\n RW: 'Ruanda',\r\n RE: 'Réunion',\r\n BL: 'Saint Barthélemy',\r\n SH: 'St. Helena, Ascension und Tristan da Cunha',\r\n KN: 'St. Kitts und Nevis',\r\n LC: 'St. Lucia',\r\n MF: 'St. Martin (französischer Teil)',\r\n PM: 'St. Pierre und Miquelon',\r\n VC: 'St. Vincent und die Grenadinen',\r\n WS: 'Samoa',\r\n SM: 'San Marino',\r\n ST: 'São Tomé und PrÃncipe',\r\n SA: 'Saudi-Arabien',\r\n SN: 'Senegal',\r\n RS: 'Serbien',\r\n SC: 'Seychellen',\r\n SL: 'Sierra Leone',\r\n SG: 'Singapur',\r\n SX: 'Sint Maarten (niederländischer Teil)',\r\n SK: 'Slowakei',\r\n SI: 'Slowenien',\r\n SB: 'Salomonen',\r\n SO: 'Somalia',\r\n ZA: 'Südafrika',\r\n GS: 'Südgeorgien und die Südlichen Sandwichinseln',\r\n SS: 'Südsudan',\r\n ES: 'Spanien',\r\n LK: 'Sri Lanka',\r\n SD: 'Sudan',\r\n SR: 'Suriname',\r\n SJ: 'Svalbard und Jan Mayen',\r\n SZ: 'Swasiland',\r\n SE: 'Schweden',\r\n CH: 'Schweiz',\r\n SY: 'Syrien',\r\n TW: 'Taiwan',\r\n TJ: 'Tadschikistan',\r\n TZ: 'Tansania',\r\n TH: 'Thailand',\r\n TL: 'Timor-Leste',\r\n TG: 'Togo',\r\n TK: 'Tokelau',\r\n TO: 'Tonga',\r\n TT: 'Trinidad und Tobago',\r\n TN: 'Tunesien',\r\n TR: 'Türkei',\r\n TM: 'Turkmenistan',\r\n TC: 'Turks- und Caicosinseln',\r\n TV: 'Tuvalu',\r\n UG: 'Uganda',\r\n UA: 'Ukraine',\r\n AE: 'Vereinigte Arabische Emirate',\r\n GB: 'Vereinigtes Königreich',\r\n UM: 'United States Minor Outlying Islands',\r\n US: 'Vereinigte Staaten von Amerika',\r\n UY: 'Uruguay',\r\n UZ: 'Usbekistan',\r\n VU: 'Vanuatu',\r\n VE: 'Venezuela',\r\n VN: 'Vietnam',\r\n VG: 'Britische Jungferninseln',\r\n VI: 'Amerikanische Jungferninseln',\r\n WF: 'Wallis und Futuna',\r\n EH: 'Westsahara',\r\n YE: 'Jemen',\r\n ZM: 'Sambia',\r\n ZW: 'Simbabwe',\r\n AX: 'Ã…land-Inseln',\r\n};\r\nexport const COUNTRIES_IT: IDictionary<string> = {\r\n AF: 'Afghanistan',\r\n AL: 'Albania',\r\n DZ: 'Algeria',\r\n AS: 'Samoa Americane',\r\n AD: 'Andorra',\r\n AO: 'Angola',\r\n AI: 'Anguilla',\r\n AQ: 'Antartide',\r\n AG: 'Antigua e Barbuda',\r\n AR: 'Argentina',\r\n AM: 'Armenia',\r\n AW: 'Aruba',\r\n AU: 'Australia',\r\n AT: 'Austria',\r\n AZ: 'Azerbaigian',\r\n BS: 'Bahamas',\r\n BH: 'Bahrain',\r\n BD: 'Bangladesh',\r\n BB: 'Barbados',\r\n BY: 'Bielorussia',\r\n BE: 'Belgio',\r\n BZ: 'Belize',\r\n BJ: 'Benin',\r\n BM: 'Bermuda',\r\n BT: 'Bhutan',\r\n BO: 'Bolivia (Stato Plurinazionale)',\r\n BQ: 'Bonaire, Sint Eustatius e Saba',\r\n BA: 'Bosnia ed Erzegovina',\r\n BW: 'Botswana',\r\n BV: 'Isola Bouvet',\r\n BR: 'Brasile',\r\n IO: \"Territorio Britannico dell'Oceano Indiano\",\r\n BN: 'Brunei Darussalam',\r\n BG: 'Bulgaria',\r\n BF: 'Burkina Faso',\r\n BI: 'Burundi',\r\n CV: 'Capo Verde',\r\n KH: 'Cambogia',\r\n CM: 'Camerun',\r\n CA: 'Canada',\r\n KY: 'Isole Cayman',\r\n CF: 'Repubblica Centrafricana',\r\n TD: 'Ciad',\r\n CL: 'Cile',\r\n CN: 'Cina',\r\n CX: 'Isola di Natale',\r\n CC: 'Isole Cocos (Keeling)',\r\n CO: 'Colombia',\r\n KM: 'Comore',\r\n CG: 'Congo',\r\n CD: 'Congo (Repubblica Democratica del)',\r\n CK: 'Isole Cook',\r\n CR: 'Costa Rica',\r\n HR: 'Croazia',\r\n CU: 'Cuba',\r\n CW: 'Curaçao',\r\n CY: 'Cipro',\r\n CZ: 'Cechia',\r\n CI: \"Costa d'Avorio\",\r\n DK: 'Danimarca',\r\n DJ: 'Gibuti',\r\n DM: 'Dominica',\r\n DO: 'Repubblica Dominicana',\r\n EC: 'Ecuador',\r\n EG: 'Egitto',\r\n SV: 'El Salvador',\r\n GQ: 'Guinea Equatoriale',\r\n ER: 'Eritrea',\r\n EE: 'Estonia',\r\n ET: 'Etiopia',\r\n FK: 'Isole Falkland (Malvine)',\r\n FO: 'Isole Fær Øer',\r\n FJ: 'Figi',\r\n FI: 'Finlandia',\r\n FR: 'Francia',\r\n GF: 'Guyana Francese',\r\n PF: 'Polinesia Francese',\r\n TF: 'Territori Francesi del Sud',\r\n GA: 'Gabon',\r\n GM: 'Gambia',\r\n GE: 'Georgia',\r\n DE: 'Germania',\r\n GH: 'Ghana',\r\n GI: 'Gibilterra',\r\n GR: 'Grecia',\r\n GL: 'Groenlandia',\r\n GD: 'Grenada',\r\n GP: 'Guadalupa',\r\n GU: 'Guam',\r\n GT: 'Guatemala',\r\n GG: 'Guernsey',\r\n GN: 'Guinea',\r\n GW: 'Guinea-Bissau',\r\n GY: 'Guyana',\r\n HT: 'Haiti',\r\n HM: 'Isole Heard e McDonald',\r\n VA: 'Santa Sede (Città del Vaticano)',\r\n HN: 'Honduras',\r\n HK: 'Hong Kong',\r\n HU: 'Ungheria',\r\n IS: 'Islanda',\r\n IN: 'India',\r\n ID: 'Indonesia',\r\n IR: \"Iran (Repubblica Islamica dell')\",\r\n IQ: 'Iraq',\r\n IE: 'Irlanda',\r\n IM: 'Isola di Man',\r\n IL: 'Israele',\r\n IT: 'Italia',\r\n JM: 'Giamaica',\r\n JP: 'Giappone',\r\n JE: 'Jersey',\r\n JO: 'Giordania',\r\n KZ: 'Kazakistan',\r\n KE: 'Kenya',\r\n KI: 'Kiribati',\r\n KP: 'Corea (Repubblica Popolare Democratica di)',\r\n KR: 'Corea (Repubblica di)',\r\n KW: 'Kuwait',\r\n KG: 'Kirghizistan',\r\n LA: 'Repubblica Democratica Popolare Lao',\r\n LV: 'Lettonia',\r\n LB: 'Libano',\r\n LS: 'Lesotho',\r\n LR: 'Liberia',\r\n LY: 'Libia',\r\n LI: 'Liechtenstein',\r\n LT: 'Lituania',\r\n LU: 'Lussemburgo',\r\n MO: 'Macao',\r\n MK: 'Macedonia (ex Repubblica Iugoslava di)',\r\n MG: 'Madagascar',\r\n MW: 'Malawi',\r\n MY: 'Malesia',\r\n MV: 'Maldive',\r\n ML: 'Mali',\r\n MT: 'Malta',\r\n MH: 'Isole Marshall',\r\n MQ: 'Martinica',\r\n MR: 'Mauritania',\r\n MU: 'Mauritius',\r\n YT: 'Mayotte',\r\n MX: 'Messico',\r\n FM: 'Micronesia (Stati Federati di)',\r\n MD: 'Moldavia (Repubblica di)',\r\n MC: 'Monaco',\r\n MN: 'Mongolia',\r\n ME: 'Montenegro',\r\n MS: 'Montserrat',\r\n MA: 'Marocco',\r\n MZ: 'Mozambico',\r\n MM: 'Myanmar',\r\n NA: 'Namibia',\r\n NR: 'Nauru',\r\n NP: 'Nepal',\r\n NL: 'Paesi Bassi',\r\n NC: 'Nuova Caledonia',\r\n NZ: 'Nuova Zelanda',\r\n NI: 'Nicaragua',\r\n NE: 'Niger',\r\n NG: 'Nigeria',\r\n NU: 'Niue',\r\n NF: 'Isola Norfolk',\r\n MP: 'Isole Marianne Settentrionali',\r\n NO: 'Norvegia',\r\n OM: 'Oman',\r\n PK: 'Pakistan',\r\n PW: 'Palau',\r\n PS: 'Palestina (Stato di)',\r\n PA: 'Panama',\r\n PG: 'Papua Nuova Guinea',\r\n PY: 'Paraguay',\r\n PE: 'Perù',\r\n PH: 'Filippine',\r\n PN: 'Pitcairn',\r\n PL: 'Polonia',\r\n PT: 'Portogallo',\r\n PR: 'Porto Rico',\r\n QA: 'Qatar',\r\n RO: 'Romania',\r\n RU: 'Federazione Russa',\r\n RW: 'Ruanda',\r\n RE: 'Riunione',\r\n BL: 'Saint-Barthélemy',\r\n SH: \"Sant'Elena, Ascensione e Tristan da Cunha\",\r\n KN: 'Saint Kitts e Nevis',\r\n LC: 'Santa Lucia',\r\n MF: 'Saint Martin (parte francese)',\r\n PM: 'Saint Pierre e Miquelon',\r\n VC: 'Saint Vincent e Grenadine',\r\n WS: 'Samoa',\r\n SM: 'San Marino',\r\n ST: 'São Tomé e PrÃncipe',\r\n SA: 'Arabia Saudita',\r\n SN: 'Senegal',\r\n RS: 'Serbia',\r\n SC: 'Seychelles',\r\n SL: 'Sierra Leone',\r\n SG: 'Singapore',\r\n SX: 'Sint Maarten (parte olandese)',\r\n SK: 'Slovacchia',\r\n SI: 'Slovenia',\r\n SB: 'Isole Salomone',\r\n SO: 'Somalia',\r\n ZA: 'Sudafrica',\r\n GS: 'Georgia del Sud e Isole Sandwich del Sud',\r\n SS: 'Sudan del Sud',\r\n ES: 'Spagna',\r\n LK: 'Sri Lanka',\r\n SD: 'Sudan',\r\n SR: 'Suriname',\r\n SJ: 'Svalbard e Jan Mayen',\r\n SZ: 'Swaziland',\r\n SE: 'Svezia',\r\n CH: 'Svizzera',\r\n SY: 'Repubblica Araba Siriana',\r\n TW: 'Taiwan, Provincia di Cina',\r\n TJ: 'Tagikistan',\r\n TZ: 'Tanzania, Repubblica Unita di',\r\n TH: 'Thailandia',\r\n TL: 'Timor Est',\r\n TG: 'Togo',\r\n TK: 'Tokelau',\r\n TO: 'Tonga',\r\n TT: 'Trinidad e Tobago',\r\n TN: 'Tunisia',\r\n TR: 'Turchia',\r\n TM: 'Turkmenistan',\r\n TC: 'Isole Turks e Caicos',\r\n TV: 'Tuvalu',\r\n UG: 'Uganda',\r\n UA: 'Ucraina',\r\n AE: 'Emirati Arabi Uniti',\r\n GB: 'Regno Unito di Gran Bretagna',\r\n UM: 'Isole minori esterne degli Stati Uniti',\r\n US: \"Stati Uniti d'America\",\r\n UY: 'Uruguay',\r\n UZ: 'Uzbekistan',\r\n VU: 'Vanuatu',\r\n VE: 'Venezuela (Repubblica Bolivariana di)',\r\n VN: 'Vietnam',\r\n VG: 'Isole Vergini Britanniche',\r\n VI: 'Isole Vergini Americane',\r\n WF: 'Wallis e Futuna',\r\n EH: 'Sahara Occidentale',\r\n YE: 'Yemen',\r\n ZM: 'Zambia',\r\n ZW: 'Zimbabwe',\r\n AX: 'Isole Ã…land',\r\n};\r\n\r\nexport const COUNTRIES_FR_CA: IDictionary<string> = {\r\n AF: 'Afghanistan',\r\n AL: 'Albanie',\r\n DZ: 'Algérie',\r\n AS: 'Samoa américaines',\r\n AD: 'Andorre',\r\n AO: 'Angola',\r\n AI: 'Anguilla',\r\n AQ: 'Antarctique',\r\n AG: 'Antigua-et-Barbuda',\r\n AR: 'Argentine',\r\n AM: 'Arménie',\r\n AW: 'Aruba',\r\n AU: 'Australie',\r\n AT: 'Autriche',\r\n AZ: 'Azerbaïdjan',\r\n BS: 'Bahamas',\r\n BH: 'Bahreïn',\r\n BD: 'Bangladesh',\r\n BB: 'Barbade',\r\n BY: 'Biélorussie',\r\n BE: 'Belgique',\r\n BZ: 'Belize',\r\n BJ: 'Bénin',\r\n BM: 'Bermudes',\r\n BT: 'Bhoutan',\r\n BO: 'Bolivie (État plurinational de)',\r\n BQ: 'Bonaire, Saint-Eustache et Saba',\r\n BA: 'Bosnie-Herzégovine',\r\n BW: 'Botswana',\r\n BV: 'ÃŽle Bouvet',\r\n BR: 'Brésil',\r\n IO: \"Territoire britannique de l'océan Indien\",\r\n BN: 'Brunei Darussalam',\r\n BG: 'Bulgarie',\r\n BF: 'Burkina Faso',\r\n BI: 'Burundi',\r\n CV: 'Cabo Verde',\r\n KH: 'Cambodge',\r\n CM: 'Cameroun',\r\n CA: 'Canada',\r\n KY: 'ÃŽles Caïmans',\r\n CF: 'République centrafricaine',\r\n TD: 'Tchad',\r\n CL: 'Chili',\r\n CN: 'Chine',\r\n CX: 'ÃŽle Christmas',\r\n CC: 'ÃŽles Cocos (Keeling)',\r\n CO: 'Colombie',\r\n KM: 'Comores',\r\n CG: 'Congo',\r\n CD: 'Congo (République démocratique du)',\r\n CK: 'ÃŽles Cook',\r\n CR: 'Costa Rica',\r\n HR: 'Croatie',\r\n CU: 'Cuba',\r\n CW: 'Curaçao',\r\n CY: 'Chypre',\r\n CZ: 'Tchéquie',\r\n CI: \"Côte d'Ivoire\",\r\n DK: 'Danemark',\r\n DJ: 'Djibouti',\r\n DM: 'Dominique',\r\n DO: 'République dominicaine',\r\n EC: 'Équateur',\r\n EG: 'Égypte',\r\n SV: 'El Salvador',\r\n GQ: 'Guinée équatoriale',\r\n ER: 'Érythrée',\r\n EE: 'Estonie',\r\n ET: 'Éthiopie',\r\n FK: 'ÃŽles Falkland (Malvinas)',\r\n FO: 'ÃŽles Féroé',\r\n FJ: 'Fidji',\r\n FI: 'Finlande',\r\n FR: 'France',\r\n GF: 'Guyane française',\r\n PF: 'Polynésie française',\r\n TF: 'Territoires austraux français',\r\n GA: 'Gabon',\r\n GM: 'Gambie',\r\n GE: 'Géorgie',\r\n DE: 'Allemagne',\r\n GH: 'Ghana',\r\n GI: 'Gibraltar',\r\n GR: 'Grèce',\r\n GL: 'Groenland',\r\n GD: 'Grenade',\r\n GP: 'Guadeloupe',\r\n GU: 'Guam',\r\n GT: 'Guatemala',\r\n GG: 'Guernesey',\r\n GN: 'Guinée',\r\n GW: 'Guinée-Bissau',\r\n GY: 'Guyana',\r\n HT: 'Haïti',\r\n HM: 'ÃŽles Heard et McDonald',\r\n VA: 'Saint-Siège',\r\n HN: 'Honduras',\r\n HK: 'Hong Kong',\r\n HU: 'Hongrie',\r\n IS: 'Islande',\r\n IN: 'Inde',\r\n ID: 'Indonésie',\r\n IR: \"Iran (République islamique d')\",\r\n IQ: 'Irak',\r\n IE: 'Irlande',\r\n IM: 'ÃŽle de Man',\r\n IL: 'Israël',\r\n IT: 'Italie',\r\n JM: 'Jamaïque',\r\n JP: 'Japon',\r\n JE: 'Jersey',\r\n JO: 'Jordanie',\r\n KZ: 'Kazakhstan',\r\n KE: 'Kenya',\r\n KI: 'Kiribati',\r\n KP: 'Corée (République populaire démocratique de)',\r\n KR: 'Corée (République de)',\r\n KW: 'Koweït',\r\n KG: 'Kirghizistan',\r\n LA: 'République démocratique populaire lao',\r\n LV: 'Lettonie',\r\n LB: 'Liban',\r\n LS: 'Lesotho',\r\n LR: 'Libéria',\r\n LY: 'Libye',\r\n LI: 'Liechtenstein',\r\n LT: 'Lituanie',\r\n LU: 'Luxembourg',\r\n MO: 'Macao',\r\n MK: 'Macédoine (ex-République yougoslave de)',\r\n MG: 'Madagascar',\r\n MW: 'Malawi',\r\n MY: 'Malaisie',\r\n MV: 'Maldives',\r\n ML: 'Mali',\r\n MT: 'Malte',\r\n MH: 'ÃŽles Marshall',\r\n MQ: 'Martinique',\r\n MR: 'Mauritanie',\r\n MU: 'Maurice',\r\n YT: 'Mayotte',\r\n MX: 'Mexique',\r\n FM: 'Micronésie (États fédérés de)',\r\n MD: 'Moldavie (République de)',\r\n MC: 'Monaco',\r\n MN: 'Mongolie',\r\n ME: 'Monténégro',\r\n MS: 'Montserrat',\r\n MA: 'Maroc',\r\n MZ: 'Mozambique',\r\n MM: 'Myanmar',\r\n NA: 'Namibie',\r\n NR: 'Nauru',\r\n NP: 'Népal',\r\n NL: 'Pays-Bas',\r\n NC: 'Nouvelle-Calédonie',\r\n NZ: 'Nouvelle-Zélande',\r\n NI: 'Nicaragua',\r\n NE: 'Niger',\r\n NG: 'Nigéria',\r\n NU: 'Niue',\r\n NF: 'ÃŽle Norfolk',\r\n MP: 'ÃŽles Mariannes du Nord',\r\n NO: 'Norvège',\r\n OM: 'Oman',\r\n PK: 'Pakistan',\r\n PW: 'Palaos',\r\n PS: 'Palestine, État de',\r\n PA: 'Panama',\r\n PG: 'Papouasie-Nouvelle-Guinée',\r\n PY: 'Paraguay',\r\n PE: 'Pérou',\r\n PH: 'Philippines',\r\n PN: 'Pitcairn',\r\n PL: 'Pologne',\r\n PT: 'Portugal',\r\n PR: 'Porto Rico',\r\n QA: 'Qatar',\r\n RO: 'Roumanie',\r\n RU: 'Fédération de Russie',\r\n RW: 'Rwanda',\r\n RE: 'Réunion',\r\n BL: 'Saint-Barthélemy',\r\n SH: 'Sainte-Hélène, Ascension et Tristan da Cunha',\r\n KN: 'Saint-Kitts-et-Nevis',\r\n LC: 'Sainte-Lucie',\r\n MF: 'Saint-Martin (partie française)',\r\n PM: 'Saint-Pierre-et-Miquelon',\r\n VC: 'Saint-Vincent-et-les Grenadines',\r\n WS: 'Samoa',\r\n SM: 'Saint-Marin',\r\n ST: 'Sao Tomé-et-Principe',\r\n SA: 'Arabie saoudite',\r\n SN: 'Sénégal',\r\n RS: 'Serbie',\r\n SC: 'Seychelles',\r\n SL: 'Sierra Leone',\r\n SG: 'Singapour',\r\n SX: 'Saint-Martin (partie néerlandaise)',\r\n SK: 'Slovaquie',\r\n SI: 'Slovénie',\r\n SB: 'ÃŽles Salomon',\r\n SO: 'Somalie',\r\n ZA: 'Afrique du Sud',\r\n GS: 'Géorgie du Sud et les ÃŽles Sandwich du Sud',\r\n SS: 'Soudan du Sud',\r\n ES: 'Espagne',\r\n LK: 'Sri Lanka',\r\n SD: 'Soudan',\r\n SR: 'Suriname',\r\n SJ: 'Svalbard et Jan Mayen',\r\n SZ: 'Eswatini',\r\n SE: 'Suède',\r\n CH: 'Suisse',\r\n SY: 'République arabe syrienne',\r\n TW: 'Taïwan, Province de Chine[a]',\r\n TJ: 'Tadjikistan',\r\n TZ: 'Tanzanie, République-Unie de',\r\n TH: 'Thaïlande',\r\n TL: 'Timor-Leste',\r\n TG: 'Togo',\r\n TK: 'Tokelau',\r\n TO: 'Tonga',\r\n TT: 'Trinité-et-Tobago',\r\n TN: 'Tunisie',\r\n TR: 'Turquie',\r\n TM: 'Turkménistan',\r\n TC: 'ÃŽles Turques-et-Caïques',\r\n TV: 'Tuvalu',\r\n UG: 'Ouganda',\r\n UA: 'Ukraine',\r\n AE: 'Émirats arabes unis',\r\n GB: 'Royaume-Uni de Grande-Bretagne',\r\n UM: 'ÃŽles mineures éloignées des États-Unis',\r\n US: \"États-Unis d'Amérique\",\r\n UY: 'Uruguay',\r\n UZ: 'Ouzbékistan',\r\n VU: 'Vanuatu',\r\n VE: 'Venezuela (République bolivarienne du)',\r\n VN: 'Viet Nam',\r\n VG: 'ÃŽles Vierges britanniques',\r\n VI: 'ÃŽles Vierges des États-Unis',\r\n WF: 'Wallis-et-Futuna',\r\n EH: 'Sahara occidental',\r\n YE: 'Yémen',\r\n ZM: 'Zambie',\r\n ZW: 'Zimbabwe',\r\n AX: 'ÃŽles Ã…land',\r\n};\r\n\r\nexport const COUNTRIES_ES_ES: IDictionary<string> = {\r\n AF: 'Afganistán',\r\n AL: 'Albania',\r\n DZ: 'Argelia',\r\n AS: 'Samoa Americana',\r\n AD: 'Andorra',\r\n AO: 'Angola',\r\n AI: 'Anguila',\r\n AQ: 'Antártida',\r\n AG: 'Antigua y Barbuda',\r\n AR: 'Argentina',\r\n AM: 'Armenia',\r\n AW: 'Aruba',\r\n AU: 'Australia',\r\n AT: 'Austria',\r\n AZ: 'Azerbaiyán',\r\n BS: 'Bahamas',\r\n BH: 'Baréin',\r\n BD: 'Bangladés',\r\n BB: 'Barbados',\r\n BY: 'Bielorrusia',\r\n BE: 'Bélgica',\r\n BZ: 'Belice',\r\n BJ: 'BenÃn',\r\n BM: 'Bermudas',\r\n BT: 'Bután',\r\n BO: 'Bolivia (Estado Plurinacional de)',\r\n BQ: 'Bonaire, San Eustaquio y Saba',\r\n BA: 'Bosnia y Herzegovina',\r\n BW: 'Botsuana',\r\n BV: 'Isla Bouvet',\r\n BR: 'Brasil',\r\n IO: 'Territorio Británico del Océano Ãndico',\r\n BN: 'Brunéi Darusalam',\r\n BG: 'Bulgaria',\r\n BF: 'Burkina Faso',\r\n BI: 'Burundi',\r\n CV: 'Cabo Verde',\r\n KH: 'Camboya',\r\n CM: 'Camerún',\r\n CA: 'Canadá',\r\n KY: 'Islas Caimán',\r\n CF: 'República Centroafricana',\r\n TD: 'Chad',\r\n CL: 'Chile',\r\n CN: 'China',\r\n CX: 'Isla de Navidad',\r\n CC: 'Islas Cocos (Keeling)',\r\n CO: 'Colombia',\r\n KM: 'Comoras',\r\n CG: 'Congo',\r\n CD: 'Congo (República Democrática del)',\r\n CK: 'Islas Cook',\r\n CR: 'Costa Rica',\r\n HR: 'Croacia',\r\n CU: 'Cuba',\r\n CW: 'Curazao',\r\n CY: 'Chipre',\r\n CZ: 'Chequia',\r\n CI: 'Costa de Marfil',\r\n DK: 'Dinamarca',\r\n DJ: 'Yibuti',\r\n DM: 'Dominica',\r\n DO: 'República Dominicana',\r\n EC: 'Ecuador',\r\n EG: 'Egipto',\r\n SV: 'El Salvador',\r\n GQ: 'Guinea Ecuatorial',\r\n ER: 'Eritrea',\r\n EE: 'Estonia',\r\n ET: 'EtiopÃa',\r\n FK: 'Islas Malvinas (Falkland)',\r\n FO: 'Islas Feroe',\r\n FJ: 'Fiyi',\r\n FI: 'Finlandia',\r\n FR: 'Francia',\r\n GF: 'Guayana Francesa',\r\n PF: 'Polinesia Francesa',\r\n TF: 'Territorios Australes Franceses',\r\n GA: 'Gabón',\r\n GM: 'Gambia',\r\n GE: 'Georgia',\r\n DE: 'Alemania',\r\n GH: 'Ghana',\r\n GI: 'Gibraltar',\r\n GR: 'Grecia',\r\n GL: 'Groenlandia',\r\n GD: 'Granada',\r\n GP: 'Guadalupe',\r\n GU: 'Guam',\r\n GT: 'Guatemala',\r\n GG: 'Guernsey',\r\n GN: 'Guinea',\r\n GW: 'Guinea-Bisáu',\r\n GY: 'Guyana',\r\n HT: 'HaitÃ',\r\n HM: 'Islas Heard y McDonald',\r\n VA: 'Santa Sede',\r\n HN: 'Honduras',\r\n HK: 'Hong Kong',\r\n HU: 'HungrÃa',\r\n IS: 'Islandia',\r\n IN: 'India',\r\n ID: 'Indonesia',\r\n IR: 'Irán (República Islámica de)',\r\n IQ: 'Irak',\r\n IE: 'Irlanda',\r\n IM: 'Isla de Man',\r\n IL: 'Israel',\r\n IT: 'Italia',\r\n JM: 'Jamaica',\r\n JP: 'Japón',\r\n JE: 'Jersey',\r\n JO: 'Jordania',\r\n KZ: 'Kazajistán',\r\n KE: 'Kenia',\r\n KI: 'Kiribati',\r\n KP: 'Corea (República Popular Democrática de)',\r\n KR: 'Corea (República de)',\r\n KW: 'Kuwait',\r\n KG: 'Kirguistán',\r\n LA: 'República Democrática Popular Lao',\r\n LV: 'Letonia',\r\n LB: 'LÃbano',\r\n LS: 'Lesoto',\r\n LR: 'Liberia',\r\n LY: 'Libia',\r\n LI: 'Liechtenstein',\r\n LT: 'Lituania',\r\n LU: 'Luxemburgo',\r\n MO: 'Macao',\r\n MK: 'Macedonia (ex República Yugoslava de)',\r\n MG: 'Madagascar',\r\n MW: 'Malaui',\r\n MY: 'Malasia',\r\n MV: 'Maldivas',\r\n ML: 'MalÃ',\r\n MT: 'Malta',\r\n MH: 'Islas Marshall',\r\n MQ: 'Martinica',\r\n MR: 'Mauritania',\r\n MU: 'Mauricio',\r\n YT: 'Mayotte',\r\n MX: 'México',\r\n FM: 'Micronesia (Estados Federados de)',\r\n MD: 'Moldavia (República de)',\r\n MC: 'Mónaco',\r\n MN: 'Mongolia',\r\n ME: 'Montenegro',\r\n MS: 'Montserrat',\r\n MA: 'Marruecos',\r\n MZ: 'Mozambique',\r\n MM: 'Myanmar',\r\n NA: 'Namibia',\r\n NR: 'Nauru',\r\n NP: 'Nepal',\r\n NL: 'PaÃses Bajos',\r\n NC: 'Nueva Caledonia',\r\n NZ: 'Nueva Zelanda',\r\n NI: 'Nicaragua',\r\n NE: 'NÃger',\r\n NG: 'Nigeria',\r\n NU: 'Niue',\r\n NF: 'Isla Norfolk',\r\n MP: 'Islas Marianas del Norte',\r\n NO: 'Noruega',\r\n OM: 'Omán',\r\n PK: 'Pakistán',\r\n PW: 'Palaos',\r\n PS: 'Palestina, Estado de',\r\n PA: 'Panamá',\r\n PG: 'Papúa Nueva Guinea',\r\n PY: 'Paraguay',\r\n PE: 'Perú',\r\n PH: 'Filipinas',\r\n PN: 'Pitcairn',\r\n PL: 'Polonia',\r\n PT: 'Portugal',\r\n PR: 'Puerto Rico',\r\n QA: 'Catar',\r\n RO: 'RumanÃa',\r\n RU: 'Federación de Rusia',\r\n RW: 'Ruanda',\r\n RE: 'Reunión',\r\n BL: 'San Bartolomé',\r\n SH: 'Santa Elena, Ascensión y Tristán de Acuña',\r\n KN: 'San Cristóbal y Nieves',\r\n LC: 'Santa LucÃa',\r\n MF: 'San MartÃn (parte francesa)',\r\n PM: 'San Pedro y Miquelón',\r\n VC: 'San Vicente y las Granadinas',\r\n WS: 'Samoa',\r\n SM: 'San Marino',\r\n ST: 'Santo Tomé y PrÃncipe',\r\n SA: 'Arabia Saudita',\r\n SN: 'Senegal',\r\n RS: 'Serbia',\r\n SC: 'Seychelles',\r\n SL: 'Sierra Leona',\r\n SG: 'Singapur',\r\n SX: 'San MartÃn (parte holandesa)',\r\n SK: 'Eslovaquia',\r\n SI: 'Eslovenia',\r\n SB: 'Islas Salomón',\r\n SO: 'Somalia',\r\n ZA: 'Sudáfrica',\r\n GS: 'Georgia del Sur y las Islas Sandwich del Sur',\r\n SS: 'Sudán del Sur',\r\n ES: 'España',\r\n LK: 'Sri Lanka',\r\n SD: 'Sudán',\r\n SR: 'Surinam',\r\n SJ: 'Svalbard y Jan Mayen',\r\n SZ: 'Suazilandia',\r\n SE: 'Suecia',\r\n CH: 'Suiza',\r\n SY: 'República Ãrabe Siria',\r\n TW: 'Taiwán, Provincia de China[a]',\r\n TJ: 'Tayikistán',\r\n TZ: 'Tanzania, República Unida de',\r\n TH: 'Tailandia',\r\n TL: 'Timor-Leste',\r\n TG: 'Togo',\r\n TK: 'Tokelau',\r\n TO: 'Tonga',\r\n TT: 'Trinidad y Tobago',\r\n TN: 'Túnez',\r\n TR: 'TurquÃa',\r\n TM: 'Turkmenistán',\r\n TC: 'Islas Turcas y Caicos',\r\n TV: 'Tuvalu',\r\n UG: 'Uganda',\r\n UA: 'Ucrania',\r\n AE: 'Emiratos Ãrabes Unidos',\r\n GB: 'Reino Unido de Gran Bretaña',\r\n UM: 'Islas Ultramarinas Menores de Estados Unidos',\r\n US: 'Estados Unidos de América',\r\n UY: 'Uruguay',\r\n UZ: 'Uzbekistán',\r\n VU: 'Vanuatu',\r\n VE: 'Venezuela (República Bolivariana de)',\r\n VN: 'Vietnam',\r\n VG: 'Islas VÃrgenes (Británicas)',\r\n VI: 'Islas VÃrgenes (EE.UU.)',\r\n WF: 'Wallis y Futuna',\r\n EH: 'Sahara Occidental',\r\n YE: 'Yemen',\r\n ZM: 'Zambia',\r\n ZW: 'Zimbabue',\r\n AX: 'Islas Ã…land',\r\n};\r\n\r\nexport const COUNTRIES_ES_MX: IDictionary<string> = {\r\n AF: 'Afganistán',\r\n AL: 'Albania',\r\n DZ: 'Argelia',\r\n AS: 'Samoa Americana',\r\n AD: 'Andorra',\r\n AO: 'Angola',\r\n AI: 'Anguila',\r\n AQ: 'Antártida',\r\n AG: 'Antigua y Barbuda',\r\n AR: 'Argentina',\r\n AM: 'Armenia',\r\n AW: 'Aruba',\r\n AU: 'Australia',\r\n AT: 'Austria',\r\n AZ: 'Azerbaiyán',\r\n BS: 'Bahamas',\r\n BH: 'Baréin',\r\n BD: 'Bangladés',\r\n BB: 'Barbados',\r\n BY: 'Bielorrusia',\r\n BE: 'Bélgica',\r\n BZ: 'Belice',\r\n BJ: 'BenÃn',\r\n BM: 'Bermudas',\r\n BT: 'Bután',\r\n BO: 'Bolivia (Estado Plurinacional de)',\r\n BQ: 'Bonaire, San Eustaquio y Saba',\r\n BA: 'Bosnia y Herzegovina',\r\n BW: 'Botsuana',\r\n BV: 'Isla Bouvet',\r\n BR: 'Brasil',\r\n IO: 'Territorio Británico del Océano Ãndico',\r\n BN: 'Brunéi Darusalam',\r\n BG: 'Bulgaria',\r\n BF: 'Burkina Faso',\r\n BI: 'Burundi',\r\n CV: 'Cabo Verde',\r\n KH: 'Camboya',\r\n CM: 'Camerún',\r\n CA: 'Canadá',\r\n KY: 'Islas Caimán',\r\n CF: 'República Centroafricana',\r\n TD: 'Chad',\r\n CL: 'Chile',\r\n CN: 'China',\r\n CX: 'Isla de Navidad',\r\n CC: 'Islas Cocos (Keeling)',\r\n CO: 'Colombia',\r\n KM: 'Comoras',\r\n CG: 'Congo',\r\n CD: 'Congo (República Democrática del)',\r\n CK: 'Islas Cook',\r\n CR: 'Costa Rica',\r\n HR: 'Croacia',\r\n CU: 'Cuba',\r\n CW: 'Curazao',\r\n CY: 'Chipre',\r\n CZ: 'Chequia',\r\n CI: 'Costa de Marfil',\r\n DK: 'Dinamarca',\r\n DJ: 'Yibuti',\r\n DM: 'Dominica',\r\n DO: 'República Dominicana',\r\n EC: 'Ecuador',\r\n EG: 'Egipto',\r\n SV: 'El Salvador',\r\n GQ: 'Guinea Ecuatorial',\r\n ER: 'Eritrea',\r\n EE: 'Estonia',\r\n ET: 'EtiopÃa',\r\n FK: 'Islas Malvinas (Falkland)',\r\n FO: 'Islas Feroe',\r\n FJ: 'Fiyi',\r\n FI: 'Finlandia',\r\n FR: 'Francia',\r\n GF: 'Guayana Francesa',\r\n PF: 'Polinesia Francesa',\r\n TF: 'Territorios Australes Franceses',\r\n GA: 'Gabón',\r\n GM: 'Gambia',\r\n GE: 'Georgia',\r\n DE: 'Alemania',\r\n GH: 'Ghana',\r\n GI: 'Gibraltar',\r\n GR: 'Grecia',\r\n GL: 'Groenlandia',\r\n GD: 'Granada',\r\n GP: 'Guadalupe',\r\n GU: 'Guam',\r\n GT: 'Guatemala',\r\n GG: 'Guernsey',\r\n GN: 'Guinea',\r\n GW: 'Guinea-Bisáu',\r\n GY: 'Guyana',\r\n HT: 'HaitÃ',\r\n HM: 'Islas Heard y McDonald',\r\n VA: 'Santa Sede',\r\n HN: 'Honduras',\r\n HK: 'Hong Kong',\r\n HU: 'HungrÃa',\r\n IS: 'Islandia',\r\n IN: 'India',\r\n ID: 'Indonesia',\r\n IR: 'Irán (República Islámica de)',\r\n IQ: 'Irak',\r\n IE: 'Irlanda',\r\n IM: 'Isla de Man',\r\n IL: 'Israel',\r\n IT: 'Italia',\r\n JM: 'Jamaica',\r\n JP: 'Japón',\r\n JE: 'Jersey',\r\n JO: 'Jordania',\r\n KZ: 'Kazajistán',\r\n KE: 'Kenia',\r\n KI: 'Kiribati',\r\n KP: 'Corea (República Popular Democrática de)',\r\n KR: 'Corea (República de)',\r\n KW: 'Kuwait',\r\n KG: 'Kirguistán',\r\n LA: 'República Democrática Popular Lao',\r\n LV: 'Letonia',\r\n LB: 'LÃbano',\r\n LS: 'Lesoto',\r\n LR: 'Liberia',\r\n LY: 'Libia',\r\n LI: 'Liechtenstein',\r\n LT: 'Lituania',\r\n LU: 'Luxemburgo',\r\n MO: 'Macao',\r\n MK: 'Macedonia (ex República Yugoslava de)',\r\n MG: 'Madagascar',\r\n MW: 'Malaui',\r\n MY: 'Malasia',\r\n MV: 'Maldivas',\r\n ML: 'MalÃ',\r\n MT: 'Malta',\r\n MH: 'Islas Marshall',\r\n MQ: 'Martinica',\r\n MR: 'Mauritania',\r\n MU: 'Mauricio',\r\n YT: 'Mayotte',\r\n MX: 'México',\r\n FM: 'Micronesia (Estados Federados de)',\r\n MD: 'Moldavia (República de)',\r\n MC: 'Mónaco',\r\n MN: 'Mongolia',\r\n ME: 'Montenegro',\r\n MS: 'Montserrat',\r\n MA: 'Marruecos',\r\n MZ: 'Mozambique',\r\n MM: 'Myanmar',\r\n NA: 'Namibia',\r\n NR: 'Nauru',\r\n NP: 'Nepal',\r\n NL: 'PaÃses Bajos',\r\n NC: 'Nueva Caledonia',\r\n NZ: 'Nueva Zelanda',\r\n NI: 'Nicaragua',\r\n NE: 'NÃger',\r\n NG: 'Nigeria',\r\n NU: 'Niue',\r\n NF: 'Isla Norfolk',\r\n MP: 'Islas Marianas del Norte',\r\n NO: 'Noruega',\r\n OM: 'Omán',\r\n PK: 'Pakistán',\r\n PW: 'Palaos',\r\n PS: 'Palestina, Estado de',\r\n PA: 'Panamá',\r\n PG: 'Papúa Nueva Guinea',\r\n PY: 'Paraguay',\r\n PE: 'Perú',\r\n PH: 'Filipinas',\r\n PN: 'Pitcairn',\r\n PL: 'Polonia',\r\n PT: 'Portugal',\r\n PR: 'Puerto Rico',\r\n QA: 'Catar',\r\n RO: 'RumanÃa',\r\n RU: 'Federación de Rusia',\r\n RW: 'Ruanda',\r\n RE: 'Reunión',\r\n BL: 'San Bartolomé',\r\n SH: 'Santa Elena, Ascensión y Tristán de Acuña',\r\n KN: 'San Cristóbal y Nieves',\r\n LC: 'Santa LucÃa',\r\n MF: 'San MartÃn (parte francesa)',\r\n PM: 'San Pedro y Miquelón',\r\n VC: 'San Vicente y las Granadinas',\r\n WS: 'Samoa',\r\n SM: 'San Marino',\r\n ST: 'Santo Tomé y PrÃncipe',\r\n SA: 'Arabia Saudita',\r\n SN: 'Senegal',\r\n RS: 'Serbia',\r\n SC: 'Seychelles',\r\n SL: 'Sierra Leona',\r\n SG: 'Singapur',\r\n SX: 'San MartÃn (parte holandesa)',\r\n SK: 'Eslovaquia',\r\n SI: 'Eslovenia',\r\n SB: 'Islas Salomón',\r\n SO: 'Somalia',\r\n ZA: 'Sudáfrica',\r\n GS: 'Georgia del Sur y las Islas Sandwich del Sur',\r\n SS: 'Sudán del Sur',\r\n ES: 'España',\r\n LK: 'Sri Lanka',\r\n SD: 'Sudán',\r\n SR: 'Surinam',\r\n SJ: 'Svalbard y Jan Mayen',\r\n SZ: 'Suazilandia',\r\n SE: 'Suecia',\r\n CH: 'Suiza',\r\n SY: 'República Ãrabe Siria',\r\n TW: 'Taiwán, Provincia de China[a]',\r\n TJ: 'Tayikistán',\r\n TZ: 'Tanzania, República Unida de',\r\n TH: 'Tailandia',\r\n TL: 'Timor-Leste',\r\n TG: 'Togo',\r\n TK: 'Tokelau',\r\n TO: 'Tonga',\r\n TT: 'Trinidad y Tobago',\r\n TN: 'Túnez',\r\n TR: 'TurquÃa',\r\n TM: 'Turkmenistán',\r\n TC: 'Islas Turcas y Caicos',\r\n TV: 'Tuvalu',\r\n UG: 'Uganda',\r\n UA: 'Ucrania',\r\n AE: 'Emiratos Ãrabes Unidos',\r\n GB: 'Reino Unido de Gran Bretaña',\r\n UM: 'Islas Ultramarinas Menores de Estados Unidos',\r\n US: 'Estados Unidos de América',\r\n UY: 'Uruguay',\r\n UZ: 'Uzbekistán',\r\n VU: 'Vanuatu',\r\n VE: 'Venezuela (República Bolivariana de)',\r\n VN: 'Vietnam',\r\n VG: 'Islas VÃrgenes (Británicas)',\r\n VI: 'Islas VÃrgenes (EE.UU.)',\r\n WF: 'Wallis y Futuna',\r\n EH: 'Sahara Occidental',\r\n YE: 'Yemen',\r\n ZM: 'Zambia',\r\n ZW: 'Zimbabue',\r\n AX: 'Islas Ã…land',\r\n};\r\n\r\nexport const COUNTRIES_LANGUAGE_MAPPING = {\r\n 'en-us': COUNTRIES,\r\n 'en-gb': COUNTRIES_EN_GB,\r\n 'fr-fr': COUNTRIES_FR,\r\n 'de-de': COUNTRIES_DE,\r\n 'it-it': COUNTRIES_IT,\r\n 'fr-ca': COUNTRIES_FR_CA,\r\n 'es-es': COUNTRIES_ES_ES,\r\n 'es-mx': COUNTRIES_ES_MX,\r\n};\r\n","import { IDictionary } from './countries';\r\n\r\n// new Intl.DisplayNames(['fr-FR'], { type: 'currency' });\r\n// currencyNames.of(key) // key is currency code\r\n\r\nexport const CURRENCIES_EN: IDictionary<string> = {\r\n AUD: 'Australian Dollar (AUD)',\r\n ARS: 'Argentinean Peso (ARS)',\r\n AZN: 'Azerbaijani Manat (AZN)',\r\n BDT: 'Bangladeshi Taka (BDT)',\r\n BGN: 'Bulgarian Lev (BGN)',\r\n BHD: 'Bahraini Dinar (BHD)',\r\n BRL: 'Brazilian Real (BRL)',\r\n BWP: 'Botswanan Pula (BWP)',\r\n CAD: 'Canadian Dollar (CAD) ',\r\n CHF: 'Switzerland Franc (CHF)',\r\n CLP: 'Chilean Peso (CLP)',\r\n COP: 'Colombian Peso (COP)',\r\n CRC: 'Costa Rican Colón (CRC)',\r\n CZK: 'Czech koruna (CZK)',\r\n DKK: 'Denmark Krone (DKK)',\r\n DOP: 'Dominican Peso (DOP)',\r\n DZD: 'Algerian Dinar (DZD)',\r\n EGP: 'Egyptian Pound (EGP)',\r\n ETB: 'Ethiopian Birr (ETB)',\r\n EUR: 'Euro (EUR)',\r\n FJD: 'Fijian Dollar (FJD)',\r\n GBP: 'UK Pound (GBP)',\r\n GHS: 'Ghana Cedi (GHS)',\r\n GTQ: 'Guatemalan Quetzal (GTQ)',\r\n HKD: 'Hong Kong Dollar (HKD)',\r\n HRK: 'Croatian Kuna (HRK)',\r\n HUF: 'Hungarian forint (HUF)',\r\n IDR: 'Indonesian Rupiah',\r\n ILS: 'Shekel (ILS)',\r\n INR: 'Indian Rupee (INR)',\r\n IQD: 'Iraqi Dinar (IQD)',\r\n JMD: 'Jamaican Dollar (JMD)',\r\n JOD: 'Jordanian Dinar (JOD)',\r\n JPY: 'Japan Yen (JPY)',\r\n KES: 'Kenyan Shilling (KES)',\r\n KRW: 'Won (KRW)',\r\n KWD: 'Kuwaiti Dinar (KWD)',\r\n KZT: 'Kazakhstani Tenge (KZT)',\r\n LBP: 'Lebanese Pound (LBP)',\r\n LKR: 'Sri Lankan Rupee (LKR)',\r\n LTL: 'Lithuanian Litas (LTL)',\r\n LVL: 'Latvian Lats (LVL)',\r\n MAD: 'Moroccan Dirham (MAD)',\r\n MUR: 'Mauritian Rupee (MUR)',\r\n MWK: 'Malawian Kwacha (MWK)',\r\n MXN: 'Mexico Peso (MXN)',\r\n MYR: 'Malaysian Ringgit',\r\n NGN: 'Nigerian Naira (NGN)',\r\n NOK: 'Norwegian Krone (NOK)',\r\n NZD: 'New Zealand Dollar (NZD)',\r\n OMR: 'Rial Omani (OMR)',\r\n PEN: 'Peruvian Nuevo Sol (PEN)',\r\n PHP: 'Philippine Peso (PHP)',\r\n PKR: 'Pakistan Rupee (PKR)',\r\n PLN: 'Polish zloty (PLN)',\r\n QAR: 'Qatari Rial (QAR)',\r\n RUB: 'Russian Ruble (RUB)',\r\n RWF: 'Rwandan Franc (RWF)',\r\n SAR: 'Saudi Riyal (SAR)',\r\n SEK: 'Sweden Krona (SEK)',\r\n SGD: 'Singapore Dollar (SGD)',\r\n THB: 'Thai Baht (THB)',\r\n TND: 'Tunisian Dinar (TND)',\r\n TOP: 'Tongan Pa?anga (TOP)',\r\n TRY: 'Turkish Lira (TRY)',\r\n TTD: 'Trinidad and Tobago Dollar (TTD)',\r\n TWD: 'Taiwan Dollar (TWD)',\r\n TZS: 'Tanzanian Shilling (TZS)',\r\n UGX: 'Ugandan Shilling (UGX)',\r\n USD: 'US Dollar (USD)',\r\n UYU: 'Uruguayan Peso (UYU)',\r\n VEF: 'Venezuelan Bolivar Fuertes (VEF)',\r\n VND: 'Vietnam Dong',\r\n XAF: 'Central African CFA Franc (XAF)',\r\n XCD: 'East Caribbean Dollar (XCD)',\r\n XOF: 'West African CFA Franc (XOF)',\r\n ZAR: 'South African rand (ZAR)',\r\n ZMW: 'Zambian Kwacha (ZMW)',\r\n};\r\n\r\nexport const CURRENCIES_EN_GB: IDictionary<string> = {\r\n AUD: 'Australian Dollar (AUD)',\r\n ARS: 'Argentinean Peso (ARS)',\r\n AZN: 'Azerbaijani Manat (AZN)',\r\n BDT: 'Bangladeshi Taka (BDT)',\r\n BGN: 'Bulgarian Lev (BGN)',\r\n BHD: 'Bahraini Dinar (BHD)',\r\n BRL: 'Brazilian Real (BRL)',\r\n BWP: 'Botswanan Pula (BWP)',\r\n CAD: 'Canadian Dollar (CAD)',\r\n CHF: 'Switzerland Franc (CHF)',\r\n CLP: 'Chilean Peso (CLP)',\r\n COP: 'Colombian Peso (COP)',\r\n CRC: 'Costa Rican Colón (CRC)',\r\n CZK: 'Czech koruna (CZK)',\r\n DKK: 'Denmark Krone (DKK)',\r\n DOP: 'Dominican Peso (DOP)',\r\n DZD: 'Algerian Dinar (DZD)',\r\n EGP: 'Egyptian Pound (EGP)',\r\n ETB: 'Ethiopian Birr (ETB)',\r\n EUR: 'Euro (EUR)',\r\n FJD: 'Fijian Dollar (FJD)',\r\n GBP: 'UK Pound (GBP)',\r\n GHS: 'Ghana Cedi (GHS)',\r\n GTQ: 'Guatemalan Quetzal (GTQ)',\r\n HKD: 'Hong Kong Dollar (HKD)',\r\n HRK: 'Croatian Kuna (HRK)',\r\n HUF: 'Hungarian forint (HUF)',\r\n IDR: 'Indonesian Rupiah',\r\n ILS: 'Shekel (ILS)',\r\n INR: 'Indian Rupee (INR)',\r\n IQD: 'Iraqi Dinar (IQD)',\r\n JMD: 'Jamaican Dollar (JMD)',\r\n JOD: 'Jordanian Dinar (JOD)',\r\n JPY: 'Japan Yen (JPY)',\r\n KES: 'Kenyan Shilling (KES)',\r\n KRW: 'Won (KRW)',\r\n KWD: 'Kuwaiti Dinar (KWD)',\r\n KZT: 'Kazakhstani Tenge (KZT)',\r\n LBP: 'Lebanese Pound (LBP)',\r\n LKR: 'Sri Lankan Rupee (LKR)',\r\n LTL: 'Lithuanian Litas (LTL)',\r\n LVL: 'Latvian Lats (LVL)',\r\n MAD: 'Moroccan Dirham (MAD)',\r\n MUR: 'Mauritian Rupee (MUR)',\r\n MWK: 'Malawian Kwacha (MWK)',\r\n MXN: 'Mexico Peso (MXN)',\r\n MYR: 'Malaysian Ringgit',\r\n NGN: 'Nigerian Naira (NGN)',\r\n NOK: 'Norwegian Krone (NOK)',\r\n NZD: 'New Zealand Dollar (NZD)',\r\n OMR: 'Rial Omani (OMR)',\r\n PEN: 'Peruvian Nuevo Sol (PEN)',\r\n PHP: 'Philippine Peso (PHP)',\r\n PKR: 'Pakistan Rupee (PKR)',\r\n PLN: 'Polish zloty (PLN)',\r\n QAR: 'Qatari Rial (QAR)',\r\n RUB: 'Russian Ruble (RUB)',\r\n RWF: 'Rwandan Franc (RWF)',\r\n SAR: 'Saudi Riyal (SAR)',\r\n SEK: 'Sweden Krona (SEK)',\r\n SGD: 'Singapore Dollar (SGD)',\r\n THB: 'Thai Baht (THB)',\r\n TND: 'Tunisian Dinar (TND)',\r\n TOP: 'Tongan Pa?anga (TOP)',\r\n TRY: 'Turkish Lira (TRY)',\r\n TTD: 'Trinidad and Tobago Dollar (TTD)',\r\n TWD: 'Taiwan Dollar (TWD)',\r\n TZS: 'Tanzanian Shilling (TZS)',\r\n UGX: 'Ugandan Shilling (UGX)',\r\n USD: 'US Dollar (USD)',\r\n UYU: 'Uruguayan Peso (UYU)',\r\n VEF: 'Venezuelan Bolivar Fuertes (VEF)',\r\n VND: 'Vietnam Dong',\r\n XAF: 'Central African CFA Franc (XAF)',\r\n XCD: 'East Caribbean Dollar (XCD)',\r\n XOF: 'West African CFA Franc (XOF)',\r\n ZAR: 'South African rand (ZAR)',\r\n ZMW: 'Zambian Kwacha (ZMW)',\r\n};\r\n\r\nexport const CURRENCIES_FR: IDictionary<string> = {\r\n AUD: 'Dollar australien (AUD)',\r\n ARS: 'Peso argentin (ARS)',\r\n AZN: 'Manat azéri (AZN)',\r\n BDT: 'Taka bangladeshi (BDT)',\r\n BGN: 'Lev bulgare (BGN)',\r\n BHD: 'Dinar bahreïni (BHD)',\r\n BRL: 'Réal brésilien (BRL)',\r\n BWP: 'Pula botswanais (BWP)',\r\n CAD: 'Dollar canadien (CAD)',\r\n CHF: 'Franc suisse (CHF)',\r\n CLP: 'Peso chilien (CLP)',\r\n COP: 'Peso colombien (COP)',\r\n CRC: 'Colón costaricain (CRC)',\r\n CZK: 'Couronne tchèque (CZK)',\r\n DKK: 'Couronne danoise (DKK)',\r\n DOP: 'Peso dominicain (DOP)',\r\n DZD: 'Dinar algérien (DZD)',\r\n EGP: 'Livre égyptienne (EGP)',\r\n ETB: 'Birr éthiopien (ETB)',\r\n EUR: 'Euro (EUR)',\r\n FJD: 'Dollar fidjien (FJD)',\r\n GBP: 'Livre sterling (GBP)',\r\n GHS: 'Cédi ghanéen (GHS)',\r\n GTQ: 'Quetzal guatémaltèque (GTQ)',\r\n HKD: 'Dollar de Hong Kong (HKD)',\r\n HRK: 'Kuna croate (HRK)',\r\n HUF: 'Forint hongrois (HUF)',\r\n IDR: 'Roupie indonésienne (IDR)',\r\n ILS: 'Nouveau shekel israélien (ILS)',\r\n INR: 'Roupie indienne (INR)',\r\n IQD: 'Dinar irakien (IQD)',\r\n JMD: 'Dollar jamaïcain (JMD)',\r\n JOD: 'Dinar jordanien (JOD)',\r\n JPY: 'Yen japonais (JPY)',\r\n KES: 'Shilling kényan (KES)',\r\n KRW: 'Won sud-coréen (KRW)',\r\n KWD: 'Dinar koweïtien (KWD)',\r\n KZT: 'Tenge kazakh (KZT)',\r\n LBP: 'Livre libanaise (LBP)',\r\n LKR: 'Roupie srilankaise (LKR)',\r\n LTL: 'Litas lituanien (LTL)',\r\n LVL: 'Lats lettons (LVL)',\r\n MAD: 'Dirham marocain (MAD)',\r\n MUR: 'Roupie mauricienne (MUR)',\r\n MWK: 'Kwacha malawite (MWK)',\r\n MXN: 'Peso mexicain (MXN)',\r\n MYR: 'Ringgit malais (MYR)',\r\n NGN: 'Naira nigérian (NGN)',\r\n NOK: 'Couronne norvégienne (NOK)',\r\n NZD: 'Dollar néo-zélandais (NZD)',\r\n OMR: 'Riyal omanais (OMR)',\r\n PEN: 'Sol péruvien (PEN)',\r\n PHP: 'Peso philippin (PHP)',\r\n PKR: 'Roupie pakistanaise (PKR)',\r\n PLN: 'Zloty polonais (PLN)',\r\n QAR: 'Riyal qatari (QAR)',\r\n RUB: 'Rouble russe (RUB)',\r\n RWF: 'Franc rwandais (RWF)',\r\n SAR: 'Riyal saoudien (SAR)',\r\n SEK: 'Couronne suédoise (SEK)',\r\n SGD: 'Dollar de Singapour (SGD)',\r\n THB: 'Baht thaïlandais (THB)',\r\n TND: 'Dinar tunisien (TND)',\r\n TOP: 'Pa’anga tongan (TOP)',\r\n TRY: 'Livre turque (TRY)',\r\n TTD: 'Dollar de Trinité-et-Tobago (TTD)',\r\n TWD: 'Nouveau dollar taïwanais (TWD)',\r\n TZS: 'Shilling tanzanien (TZS)',\r\n UGX: 'Shilling ougandais (UGX)',\r\n USD: 'Dollar des États-Unis (USD)',\r\n UYU: 'Peso uruguayen (UYU)',\r\n VEF: 'Bolivar Fuertes vénézuélien (VEF)',\r\n VND: 'Dông vietnamien',\r\n XAF: 'Franc CFA (XAF)',\r\n XCD: 'Dollar des Caraïbes orientales (XCD)',\r\n XOF: 'Franc CFA (XOF)',\r\n ZAR: 'Rand sud-africain (ZAR)',\r\n ZMW: 'Kwacha zambien (ZMW)',\r\n};\r\n\r\nexport const CURRENCIES_DE: IDictionary<string> = {\r\n AUD: 'Australischer Dollar (AUD)',\r\n ARS: 'Argentinischer Peso (ARS)',\r\n AZN: 'Aserbaidschan-Manat (AZN)',\r\n BDT: 'Bangladesch-Taka (BDT)',\r\n BGN: 'Bulgarischer Lew (BGN)',\r\n BHD: 'Bahrain-Dinar (BHD)',\r\n BRL: 'Brasilianischer Real (BRL)',\r\n BWP: 'Botswanischer Pula (BWP)',\r\n CAD: 'Kanadischer Dollar (CAD)',\r\n CHF: 'Schweizer Franken (CHF)',\r\n CLP: 'Chilenischer Peso (CLP)',\r\n COP: 'Kolumbianischer Peso (COP)',\r\n CRC: 'Costa-Rica-Colón (CRC)',\r\n CZK: 'Tschechische Krone (CZK)',\r\n DKK: 'Dänische Krone (DKK)',\r\n DOP: 'Dominikanischer Peso (DOP)',\r\n DZD: 'Algerischer Dinar (DZD)',\r\n EGP: 'Ägyptisches Pfund (EGP)',\r\n ETB: 'Äthiopischer Birr (ETB)',\r\n EUR: 'Euro (EUR)',\r\n FJD: 'Fidschi-Dollar (FJD)',\r\n GBP: 'Britisches Pfund (GBP)',\r\n GHS: 'Ghanaischer Cedi (GHS)',\r\n GTQ: 'Guatemaltekischer Quetzal (GTQ)',\r\n HKD: 'Hongkong-Dollar (HKD)',\r\n HRK: 'Kroatischer Kuna (HRK)',\r\n HUF: 'Ungarischer Forint (HUF)',\r\n IDR: 'Indonesische Rupiah (IDR)',\r\n ILS: 'Israelischer Neuer Schekel (ILS)',\r\n INR: 'Indische Rupie (INR)',\r\n IQD: 'Irakischer Dinar (IQD)',\r\n JMD: 'Jamaika-Dollar (JMD)',\r\n JOD: 'Jordanischer Dinar (JOD)',\r\n JPY: 'Japanischer Yen (JPY)',\r\n KES: 'Kenia-Schilling (KES)',\r\n KRW: 'Südkoreanischer Won (KRW)',\r\n KWD: 'Kuwait-Dinar (KWD)',\r\n KZT: 'Kasachischer Tenge (KZT)',\r\n LBP: 'Libanesisches Pfund (LBP)',\r\n LKR: 'Sri-Lanka-Rupie (LKR)',\r\n LTL: 'Litauischer Litas (LTL)',\r\n LVL: 'Lettische Lats (LVL)',\r\n MAD: 'Marokkanischer Dirham (MAD)',\r\n MUR: 'Mauritius-Rupie (MUR)',\r\n MWK: 'Malawi-Kwacha (MWK)',\r\n MXN: 'Mexikanischer Peso (MXN)',\r\n MYR: 'Malaysischer Ringgit (MYR)',\r\n NGN: 'Nigerianischer Naira (NGN)',\r\n NOK: 'Norwegische Krone (NOK)',\r\n NZD: 'Neuseeland-Dollar (NZD)',\r\n OMR: 'Omanischer Rial (OMR)',\r\n PEN: 'Peruanischer Sol (PEN)',\r\n PHP: 'Philippinischer Peso (PHP)',\r\n PKR: 'Pakistanische Rupie (PKR)',\r\n PLN: 'Polnischer ZÅ‚oty (PLN)',\r\n QAR: 'Katar-Riyal (QAR)',\r\n RUB: 'Russischer Rubel (RUB)',\r\n RWF: 'Ruanda-Franc (RWF)',\r\n SAR: 'Saudi-Rial (SAR)',\r\n SEK: 'Schwedische Krone (SEK)',\r\n SGD: 'Singapur-Dollar (SGD)',\r\n THB: 'Thailändischer Baht (THB)',\r\n TND: 'Tunesischer Dinar (TND)',\r\n TOP: 'Tongaischer PaÊ»anga (TOP)',\r\n TRY: 'Türkische Lira (TRY)',\r\n TTD: 'Trinidad-und-Tobago-Dollar (TTD)',\r\n TWD: 'Neuer Taiwan-Dollar (TWD)',\r\n TZS: 'Tansania-Schilling (TZS)',\r\n UGX: 'Uganda-Schilling (UGX)',\r\n USD: 'US-Dollar (USD)',\r\n UYU: 'Uruguayischer Peso (UYU)',\r\n VEF: 'Venezolanischer Bolivar Fuertes (VEF)',\r\n VND: 'Vietnamesischer Dong (VND)',\r\n XAF: 'Zentralafrikanischer CFA-Franc (XAF)',\r\n XCD: 'Ostkaribischer Dollar (XCD)',\r\n XOF: 'Westafrikanischer CFA-Franc (XOF)',\r\n ZAR: 'Südafrikanischer Rand (ZAR)',\r\n ZMW: 'Kwacha (ZMW)',\r\n};\r\n\r\nexport const CURRENCIES_IT: IDictionary<string> = {\r\n AUD: 'Dollaro australiano (AUD)',\r\n ARS: 'Peso argentino (ARS)',\r\n AZN: 'Manat azero (AZN)',\r\n BDT: 'Taka bangladese (BDT)',\r\n BGN: 'Lev bulgaro (BGN)',\r\n BHD: 'Dinaro del Bahrein (BHD)',\r\n BRL: 'Real brasiliano (BRL)',\r\n BWP: 'Pula del Botswana (BWP)',\r\n CAD: 'Dollaro canadese (CAD)',\r\n CHF: 'Franco svizzero (CHF)',\r\n CLP: 'Peso cileno (CLP)',\r\n COP: 'Peso colombiano (COP)',\r\n CRC: 'Colón costaricano (CRC)',\r\n CZK: 'Corona ceca (CZK)',\r\n DKK: 'Corona danese (DKK)',\r\n DOP: 'Peso dominicano (DOP)',\r\n DZD: 'Dinaro algerino (DZD)',\r\n EGP: 'Sterlina egiziana (EGP)',\r\n ETB: 'Birr etiope (ETB)',\r\n EUR: 'Euro (EUR)',\r\n FJD: 'Dollaro delle Figi (FJD)',\r\n GBP: 'Sterlina britannica (GBP)',\r\n GHS: 'Cedi ghanese (GHS)',\r\n GTQ: 'Quetzal guatemalteco (GTQ)',\r\n HKD: 'Dollaro di Hong Kong (HKD)',\r\n HRK: 'Kuna croata (HRK)',\r\n HUF: 'Fiorino ungherese (HUF)',\r\n IDR: 'Rupia indonesiana (IDR)',\r\n ILS: 'Nuovo siclo israeliano (ILS)',\r\n INR: 'Rupia indiana (INR)',\r\n IQD: 'Dinaro iracheno (IQD)',\r\n JMD: 'Dollaro giamaicano (JMD)',\r\n JOD: 'Dinaro giordano (JOD)',\r\n JPY: 'Yen giapponese (JPY)',\r\n KES: 'Scellino keniota (KES)',\r\n KRW: 'Won sudcoreano (KRW)',\r\n KWD: 'Dinaro kuwaitiano (KWD)',\r\n KZT: 'Tenge kazako (KZT)',\r\n LBP: 'Lira libanese (LBP)',\r\n LKR: 'Rupia di Sri Lanka (LKR)',\r\n LTL: 'Litas lituano (LTL)',\r\n LVL: 'Lats lettone (LVL)',\r\n MAD: 'Dirham marocchino (MAD)',\r\n MUR: 'Rupia mauriziana (MUR)',\r\n MWK: 'Kwacha malawiano (MWK)',\r\n MXN: 'Peso messicano (MXN)',\r\n MYR: 'Ringgit malese (MYR)',\r\n NGN: 'Naira nigeriana (NGN)',\r\n NOK: 'Corona norvegese (NOK)',\r\n NZD: 'Dollaro neozelandese (NZD)',\r\n OMR: 'Rial omanita (OMR)',\r\n PEN: 'Sol peruviano (PEN)',\r\n PHP: 'Peso filippino (PHP)',\r\n PKR: 'Rupia pakistana (PKR)',\r\n PLN: 'Zloty polacco (PLN)',\r\n QAR: 'Rial qatariano (QAR)',\r\n RUB: 'Rublo russo (RUB)',\r\n RWF: 'Franco ruandese (RWF)',\r\n SAR: 'Riyal saudita (SAR)',\r\n SEK: 'Corona svedese (SEK)',\r\n SGD: 'Dollaro di Singapore (SGD)',\r\n THB: 'Baht thailandese (THB)',\r\n TND: 'Dinaro tunisino (TND)',\r\n TOP: 'PaÊ»anga tongano (TOP)',\r\n TRY: 'Lira turca (TRY)',\r\n TTD: 'Dollaro di Trinidad e Tobago (TTD)',\r\n TWD: 'Nuovo dollaro taiwanese (TWD)',\r\n TZS: 'Scellino della Tanzania (TZS)',\r\n UGX: 'Scellino ugandese (UGX)',\r\n USD: 'Dollaro statunitense (USD)',\r\n UYU: 'Peso uruguayano (UYU)',\r\n VEF: 'Bolivar Fuertes venezuelano (VEF)',\r\n VND: 'Dong vietnamita (VND)',\r\n XAF: 'Franco CFA BEAC (XAF)',\r\n XCD: 'Dollaro dei Caraibi orientali (XCD)',\r\n XOF: 'Franco CFA BCEAO (XOF)',\r\n ZAR: 'Rand sudafricano (ZAR)',\r\n ZMW: 'Kwacha zambiano (ZMW)',\r\n};\r\n\r\nexport const CURRENCIES_FR_CA: IDictionary<string> = {\r\n AUD: 'Dollar australien (AUD)',\r\n ARS: 'Peso argentin (ARS)',\r\n AZN: 'Manat azerbaïdjanais (AZN)',\r\n BDT: 'Taka bangladais (BDT)',\r\n BGN: 'Lev bulgare (BGN)',\r\n BHD: 'Dinar bahreïni (BHD)',\r\n BRL: 'Real brésilien (BRL)',\r\n BWP: 'Pula botswanais (BWP)',\r\n CAD: 'Dollar canadien (CAD)',\r\n CHF: 'Franc suisse (CHF)',\r\n CLP: 'Peso chilien (CLP)',\r\n COP: 'Peso colombien (COP)',\r\n CRC: 'Colón costaricain (CRC)',\r\n CZK: 'Couronne tchèque (CZK)',\r\n DKK: 'Couronne danoise (DKK)',\r\n DOP: 'Peso dominicain (DOP)',\r\n DZD: 'Dinar algérien (DZD)',\r\n EGP: 'Livre égyptienne (EGP)',\r\n ETB: 'Birr éthiopien (ETB)',\r\n EUR: 'Euro (EUR)',\r\n FJD: 'Dollar fidjien (FJD)',\r\n GBP: 'Livre sterling (GBP)',\r\n GHS: 'Cedi ghanéen (GHS)',\r\n GTQ: 'Quetzal guatémaltèque (GTQ)',\r\n HKD: 'Dollar de Hong Kong (HKD)',\r\n HRK: 'Kuna croate (HRK)',\r\n HUF: 'Forint hongrois (HUF)',\r\n IDR: 'Roupie indonésienne (IDR)',\r\n ILS: 'Shekel israélien (ILS)',\r\n INR: 'Roupie indienne (INR)',\r\n IQD: 'Dinar irakien (IQD)',\r\n JMD: 'Dollar jamaïcain (JMD)',\r\n JOD: 'Dinar jordanien (JOD)',\r\n JPY: 'Yen japonais (JPY)',\r\n KES: 'Shilling kényan (KES)',\r\n KRW: 'Won sud-coréen (KRW)',\r\n KWD: 'Dinar koweïtien (KWD)',\r\n KZT: 'Tenge kazakh (KZT)',\r\n LBP: 'Livre libanaise (LBP)',\r\n LKR: 'Roupie srilankaise (LKR)',\r\n LTL: 'Litas lituanien (LTL)',\r\n LVL: 'Lats letton (LVL)',\r\n MAD: 'Dirham marocain (MAD)',\r\n MUR: 'Roupie mauricienne (MUR)',\r\n MWK: 'Kwacha malawien (MWK)',\r\n MXN: 'Peso mexicain (MXN)',\r\n MYR: 'Ringgit malaisien (MYR)',\r\n NGN: 'Naira nigérian (NGN)',\r\n NOK: 'Couronne norvégienne (NOK)',\r\n NZD: 'Dollar néo-zélandais (NZD)',\r\n OMR: 'Rial omanais (OMR)',\r\n PEN: 'Nouveau sol péruvien (PEN)',\r\n PHP: 'Peso philippin (PHP)',\r\n PKR: 'Roupie pakistanaise (PKR)',\r\n PLN: 'Zloty polonais (PLN)',\r\n QAR: 'Rial qatari (QAR)',\r\n RUB: 'Rouble russe (RUB)',\r\n RWF: 'Franc rwandais (RWF)',\r\n SAR: 'Riyal saoudien (SAR)',\r\n SEK: 'Couronne suédoise (SEK)',\r\n SGD: 'Dollar de Singapour (SGD)',\r\n THB: 'Baht thaïlandais (THB)',\r\n TND: 'Dinar tunisien (TND)',\r\n TOP: \"Pa'anga tongan (TOP)\",\r\n TRY: 'Lira turque (TRY)',\r\n TTD: 'Dollar de Trinité-et-Tobago (TTD)',\r\n TWD: 'Dollar taïwanais (TWD)',\r\n TZS: 'Shilling tanzanien (TZS)',\r\n UGX: 'Shilling ougandais (UGX)',\r\n USD: 'Dollar américain (USD)',\r\n UYU: 'Peso uruguayen (UYU)',\r\n VEF: 'Bolivar vénézuélien (VEF)',\r\n VND: 'Dong vietnamien (VND)',\r\n XAF: \"Franc CFA d'Afrique centrale (XAF)\",\r\n XCD: 'Dollar des Caraïbes orientales (XCD)',\r\n XOF: \"Franc CFA d'Afrique de l'Ouest (XOF)\",\r\n ZAR: 'Rand sud-africain (ZAR)',\r\n ZMW: 'Kwacha zambien (ZMW)',\r\n};\r\n\r\nexport const CURRENCIES_ES_ES: IDictionary<string> = {\r\n AUD: 'Dólar australiano (AUD)',\r\n ARS: 'Peso argentino (ARS)',\r\n AZN: 'Manat azerbaiyano (AZN)',\r\n BDT: 'Taka bangladesà (BDT)',\r\n BGN: 'Lev búlgaro (BGN)',\r\n BHD: 'Dinar bareinà (BHD)',\r\n BRL: 'Real brasileño (BRL)',\r\n BWP: 'Pula botsuano (BWP)',\r\n CAD: 'Dólar canadiense (CAD)',\r\n CHF: 'Franco suizo (CHF)',\r\n CLP: 'Peso chileno (CLP)',\r\n COP: 'Peso colombiano (COP)',\r\n CRC: 'Colón costarricense (CRC)',\r\n CZK: 'Corona checa (CZK)',\r\n DKK: 'Corona danesa (DKK)',\r\n DOP: 'Peso dominicano (DOP)',\r\n DZD: 'Dinar argelino (DZD)',\r\n EGP: 'Libra egipcia (EGP)',\r\n ETB: 'Birr etÃope (ETB)',\r\n EUR: 'Euro (EUR)',\r\n FJD: 'Dólar fijiano (FJD)',\r\n GBP: 'Libra esterlina (GBP)',\r\n GHS: 'Cedi ghanés (GHS)',\r\n GTQ: 'Quetzal guatemalteco (GTQ)',\r\n HKD: 'Dólar de Hong Kong (HKD)',\r\n HRK: 'Kuna croata (HRK)',\r\n HUF: 'Forinto húngaro (HUF)',\r\n IDR: 'Rupia indonesia (IDR)',\r\n ILS: 'Nuevo séquel (ILS)',\r\n INR: 'Rupia india (INR)',\r\n IQD: 'Dinar iraquà (IQD)',\r\n JMD: 'Dólar jamaiquino (JMD)',\r\n JOD: 'Dinar jordano (JOD)',\r\n JPY: 'Yen japonés (JPY)',\r\n KES: 'ChelÃn keniano (KES)',\r\n KRW: 'Won surcoreano (KRW)',\r\n KWD: 'Dinar kuwaità (KWD)',\r\n KZT: 'Tenge kazajo (KZT)',\r\n LBP: 'Libra libanesa (LBP)',\r\n LKR: 'Rupia de Sri Lanka (LKR)',\r\n LTL: 'Litas lituano (LTL)',\r\n LVL: 'Lats letón (LVL)',\r\n MAD: 'Dirham marroquà (MAD)',\r\n MUR: 'Rupia mauriciana (MUR)',\r\n MWK: 'Kwacha malauà (MWK)',\r\n MXN: 'Peso mexicano (MXN)',\r\n MYR: 'Ringgit malasio (MYR)',\r\n NGN: 'Naira nigeriano (NGN)',\r\n NOK: 'Corona noruega (NOK)',\r\n NZD: 'Dólar neozelandés (NZD)',\r\n OMR: 'Rial omanà (OMR)',\r\n PEN: 'Sol peruano (PEN)',\r\n PHP: 'Peso filipino (PHP)',\r\n PKR: 'Rupia pakistanà (PKR)',\r\n PLN: 'ZÅ‚oty polaco (PLN)',\r\n QAR: 'Rial catarà (QAR)',\r\n RUB: 'Rublo ruso (RUB)',\r\n RWF: 'Franco ruandés (RWF)',\r\n SAR: 'Riyal saudà (SAR)',\r\n SEK: 'Corona sueca (SEK)',\r\n SGD: 'Dólar de Singapur (SGD)',\r\n THB: 'Baht tailandés (THB)',\r\n TND: 'Dinar tunecino (TND)',\r\n TOP: \"Pa'anga tongano (TOP)\",\r\n TRY: 'Lira turca (TRY)',\r\n TTD: 'Dólar de Trinidad y Tobago (TTD)',\r\n TWD: 'Dólar taiwanés (TWD)',\r\n TZS: 'ChelÃn tanzano (TZS)',\r\n UGX: 'ChelÃn ugandés (UGX)',\r\n USD: 'Dólar estadounidense (USD)',\r\n UYU: 'Peso uruguayo (UYU)',\r\n VEF: 'BolÃvar venezolano (VEF)',\r\n VND: 'Dong vietnamita (VND)',\r\n XAF: 'Franco CFA de Ãfrica Central (XAF)',\r\n XCD: 'Dólar del Caribe Oriental (XCD)',\r\n XOF: 'Franco CFA de Ãfrica Occidental (XOF)',\r\n ZAR: 'Rand sudafricano (ZAR)',\r\n ZMW: 'Kwacha zambiano (ZMW)',\r\n};\r\n\r\nexport const CURRENCIES_ES_MX: IDictionary<string> = {\r\n AUD: 'Dólar australiano (AUD)',\r\n ARS: 'Peso argentino (ARS)',\r\n AZN: 'Manat azerbaiyano (AZN)',\r\n BDT: 'Taka bangladesà (BDT)',\r\n BGN: 'Lev búlgaro (BGN)',\r\n BHD: 'Dinar bareinà (BHD)',\r\n BRL: 'Real brasileño (BRL)',\r\n BWP: 'Pula de Botsuana (BWP)',\r\n CAD: 'Dólar canadiense (CAD)',\r\n CHF: 'Franco suizo (CHF)',\r\n CLP: 'Peso chileno (CLP)',\r\n COP: 'Peso colombiano (COP)',\r\n CRC: 'Colón costarricense (CRC)',\r\n CZK: 'Corona checa (CZK)',\r\n DKK: 'Corona danesa (DKK)',\r\n DOP: 'Peso dominicano (DOP)',\r\n DZD: 'Dinar argelino (DZD)',\r\n EGP: 'Libra egipcia (EGP)',\r\n ETB: 'Birr etÃope (ETB)',\r\n EUR: 'Euro (EUR)',\r\n FJD: 'Dólar fiyiano (FJD)',\r\n GBP: 'Libra esterlina (GBP)',\r\n GHS: 'Cedi ghanés (GHS)',\r\n GTQ: 'Quetzal guatemalteco (GTQ)',\r\n HKD: 'Dólar de Hong Kong (HKD)',\r\n HRK: 'Kuna croata (HRK)',\r\n HUF: 'Forinto húngaro (HUF)',\r\n IDR: 'Rupia indonesia (IDR)',\r\n ILS: 'Nuevo shéquel (ILS)',\r\n INR: 'Rupia india (INR)',\r\n IQD: 'Dinar iraquà (IQD)',\r\n JMD: 'Dólar jamaiquino (JMD)',\r\n JOD: 'Dinar jordano (JOD)',\r\n JPY: 'Yen japonés (JPY)',\r\n KES: 'ChelÃn keniano (KES)',\r\n KRW: 'Won surcoreano (KRW)',\r\n KWD: 'Dinar kuwaità (KWD)',\r\n KZT: 'Tenge kazajo (KZT)',\r\n LBP: 'Libra libanesa (LBP)',\r\n LKR: 'Rupia de Sri Lanka (LKR)',\r\n LTL: 'Litas lituano (LTL)',\r\n LVL: 'Lats letón (LVL)',\r\n MAD: 'Dirham marroquà (MAD)',\r\n MUR: 'Rupia mauriciana (MUR)',\r\n MWK: 'Kwacha malauà (MWK)',\r\n MXN: 'Peso mexicano (MXN)',\r\n MYR: 'Ringgit malasio (MYR)',\r\n NGN: 'Naira nigeriano (NGN)',\r\n NOK: 'Corona noruega (NOK)',\r\n NZD: 'Dólar neozelandés (NZD)',\r\n OMR: 'Rial omanà (OMR)',\r\n PEN: 'Sol peruano (PEN)',\r\n PHP: 'Peso filipino (PHP)',\r\n PKR: 'Rupia pakistanà (PKR)',\r\n PLN: 'ZÅ‚oty polaco (PLN)',\r\n QAR: 'Rial catarà (QAR)',\r\n RUB: 'Rublo ruso (RUB)',\r\n RWF: 'Franco ruandés (RWF)',\r\n SAR: 'Riyal saudà (SAR)',\r\n SEK: 'Corona sueca (SEK)',\r\n SGD: 'Dólar de Singapur (SGD)',\r\n THB: 'Baht tailandés (THB)',\r\n TND: 'Dinar tunecino (TND)',\r\n TOP: \"Pa'anga tongano (TOP)\",\r\n TRY: 'Lira turca (TRY)',\r\n TTD: 'Dólar de Trinidad y Tobago (TTD)',\r\n TWD: 'Dólar taiwanés (TWD)',\r\n TZS: 'ChelÃn tanzano (TZS)',\r\n UGX: 'ChelÃn ugandés (UGX)',\r\n USD: 'Dólar estadounidense (USD)',\r\n UYU: 'Peso uruguayo (UYU)',\r\n VEF: 'BolÃvar fuerte venezolano (VEF)',\r\n VND: 'Dong vietnamita (VND)',\r\n XAF: 'Franco CFA de Ãfrica Central (XAF)',\r\n XCD: 'Dólar del Caribe Oriental (XCD)',\r\n XOF: 'Franco CFA de Ãfrica Occidental (XOF)',\r\n ZAR: 'Rand sudafricano (ZAR)',\r\n ZMW: 'Kwacha zambiano (ZMW)',\r\n};\r\n\r\nexport const CURRENCIES_LANGUAGE_MAPPING = {\r\n 'en-us': CURRENCIES_EN,\r\n 'en-gb': CURRENCIES_EN_GB,\r\n 'fr-fr': CURRENCIES_FR,\r\n 'de-de': CURRENCIES_DE,\r\n 'it-it': CURRENCIES_IT,\r\n 'fr-ca': CURRENCIES_FR_CA,\r\n 'es-es': CURRENCIES_ES_ES,\r\n 'es-mx': CURRENCIES_ES_MX,\r\n};\r\n\r\nexport const COUNTRY_CODE_CURRENCY_MAPPING = {\r\n US: 'USD',\r\n FR: 'EUR',\r\n DE: 'EUR',\r\n IT: 'EUR',\r\n};\r\n","import { IDictionary } from './countries';\r\n\r\nexport const LANGUAGES_EN: IDictionary<string> = {\r\n EN: 'English',\r\n FR: 'French',\r\n AR: 'Arabic',\r\n DA: 'Danish',\r\n ZH: 'Chinese',\r\n DE: 'German',\r\n IT: 'Italian',\r\n KO: 'Korean',\r\n PT: 'Portuguese',\r\n ES: 'Spanish',\r\n FI: 'Finnish',\r\n HI: 'Hindi',\r\n JA: 'Japanese',\r\n KN: 'Kannada',\r\n ML: 'Malayalam',\r\n NL: 'Dutch',\r\n NO: 'Norwegian (Nynorsk)',\r\n SV: 'Swedish',\r\n TA: 'Tamil',\r\n TE: 'Telugu',\r\n};\r\n\r\nexport const LANGUAGES_EN_GB: IDictionary<string> = {\r\n EN: 'English',\r\n FR: 'French',\r\n AR: 'Arabic',\r\n DA: 'Danish',\r\n ZH: 'Chinese',\r\n DE: 'German',\r\n IT: 'Italian',\r\n KO: 'Korean',\r\n PT: 'Portuguese',\r\n ES: 'Spanish',\r\n FI: 'Finnish',\r\n HI: 'Hindi',\r\n JA: 'Japanese',\r\n KN: 'Kannada',\r\n ML: 'Malayalam',\r\n NL: 'Dutch',\r\n NO: 'Norwegian (Nynorsk)',\r\n SV: 'Swedish',\r\n TA: 'Tamil',\r\n TE: 'Telugu',\r\n};\r\n\r\nexport const LANGUAGES_FR: IDictionary<string> = {\r\n EN: 'Anglais',\r\n FR: 'Français',\r\n AR: 'Arabe',\r\n DA: 'Danois',\r\n ZH: 'Chinois',\r\n DE: 'Allemand',\r\n IT: 'Italien',\r\n KO: 'Coréen',\r\n PT: 'Portugais',\r\n ES: 'Espagnol',\r\n FI: 'Finnois',\r\n HI: 'Hindi',\r\n JA: 'Japonais',\r\n KN: 'Kannada',\r\n ML: 'Malayalam',\r\n NL: 'Néerlandais',\r\n NO: 'Norvégien (Nynorsk)',\r\n SV: 'Nuédois',\r\n TA: 'Tamoul',\r\n TE: 'Télougou',\r\n};\r\n\r\nexport const LANGUAGES_DE: IDictionary<string> = {\r\n EN: 'Englisch',\r\n FR: 'Französisch',\r\n AR: 'Arabisch',\r\n DA: 'Dänisch',\r\n ZH: 'Chinesisch',\r\n DE: 'Deutsch',\r\n IT: 'Italienisch',\r\n KO: 'Koreanisch',\r\n PT: 'Portugiesisch',\r\n ES: 'Spanisch',\r\n FI: 'Finnisch',\r\n HI: 'Hindi',\r\n JA: 'Japanisch',\r\n KN: 'Kannada',\r\n ML: 'Malayalam',\r\n NL: 'Niederländisch',\r\n NO: 'Norwegisch',\r\n SV: 'Schwedisch',\r\n TA: 'Tamil',\r\n TE: 'Telugu',\r\n};\r\n\r\nexport const LANGUAGES_IT: IDictionary<string> = {\r\n EN: 'Inglese',\r\n FR: 'Francese',\r\n AR: 'Arabo',\r\n DA: 'Danese',\r\n ZH: 'Cinese',\r\n DE: 'Tedesco',\r\n IT: 'Italiano',\r\n KO: 'Coreano',\r\n PT: 'Portoghese',\r\n ES: 'Spagnolo',\r\n FI: 'Finlandese',\r\n HI: 'Hindi',\r\n JA: 'Giapponese',\r\n KN: 'Kannada',\r\n ML: 'Malayalam',\r\n NL: 'Olandese',\r\n NO: 'Norvegese',\r\n SV: 'Svedese',\r\n TA: 'Tamil',\r\n TE: 'Telugu',\r\n};\r\n\r\nexport const LANGUAGES_FR_CA: IDictionary<string> = {\r\n EN: 'anglais',\r\n FR: 'français',\r\n AR: 'arabe',\r\n DA: 'danois',\r\n ZH: 'chinois',\r\n DE: 'allemand',\r\n IT: 'italien',\r\n KO: 'coréen',\r\n PT: 'portugais',\r\n ES: 'espagnol',\r\n FI: 'finnois',\r\n HI: 'hindi',\r\n JA: 'japonais',\r\n KN: 'kannada',\r\n ML: 'malayalam',\r\n NL: 'néerlandais',\r\n NO: 'norvégien (nynorsk)',\r\n SV: 'suédois',\r\n TA: 'tamoul',\r\n TE: 'télougou',\r\n};\r\n\r\nexport const LANGUAGES_ES_ES: IDictionary<string> = {\r\n EN: 'Inglés',\r\n FR: 'Francés',\r\n AR: 'Ãrabe',\r\n DA: 'Danés',\r\n ZH: 'Chino',\r\n DE: 'Alemán',\r\n IT: 'Italiano',\r\n KO: 'Coreano',\r\n PT: 'Portugués',\r\n ES: 'Español',\r\n FI: 'Finés',\r\n HI: 'Hindi',\r\n JA: 'Japonés',\r\n KN: 'Canarés',\r\n ML: 'Malayalam',\r\n NL: 'Neerlandés',\r\n NO: 'Noruego (Nynorsk)',\r\n SV: 'Sueco',\r\n TA: 'Tamil',\r\n TE: 'Telugu',\r\n};\r\n\r\nexport const LANGUAGES_ES_MX: IDictionary<string> = {\r\n EN: 'Inglés',\r\n FR: 'Francés',\r\n AR: 'Ãrabe',\r\n DA: 'Danés',\r\n ZH: 'Chino',\r\n DE: 'Alemán',\r\n IT: 'Italiano',\r\n KO: 'Coreano',\r\n PT: 'Portugués',\r\n ES: 'Español',\r\n FI: 'Finlandés',\r\n HI: 'Hindi',\r\n JA: 'Japonés',\r\n KN: 'Canarés',\r\n ML: 'Malayalam',\r\n NL: 'Neerlandés',\r\n NO: 'Noruego (Nynorsk)',\r\n SV: 'Sueco',\r\n TA: 'Tamil',\r\n TE: 'Telugu',\r\n};\r\n\r\nexport const LANGUAGES_LANGUAGE_MAPPING = {\r\n 'en-us': LANGUAGES_EN,\r\n 'es-gb': LANGUAGES_EN_GB,\r\n 'fr-fr': LANGUAGES_FR,\r\n 'de-de': LANGUAGES_DE,\r\n 'it-it': LANGUAGES_IT,\r\n 'fr-ca': LANGUAGES_FR_CA,\r\n 'es-es': LANGUAGES_ES_ES,\r\n 'es-mx': LANGUAGES_ES_MX,\r\n};\r\n","import { IDictionary } from './countries';\r\n\r\nexport const LOCALE_EN: IDictionary<string> = {\r\n 14337: 'Arabic - United Arab Emirates',\r\n 3073: 'Arabic - Egypt',\r\n 1025: 'Arabic - Saudi Arabia',\r\n 1093: 'Bangla - India',\r\n 1029: 'Czech - Czech Republic',\r\n 1030: 'Danish - Denmark',\r\n 3079: 'German - Austria',\r\n 2055: 'German - Switzerland',\r\n 1031: 'German - Germany',\r\n 1032: 'Greek - Greece',\r\n '-4': 'English - United Arab Emirates',\r\n 3081: 'English - Australia',\r\n 4105: 'English - Canada',\r\n 2057: 'English - United Kingdom',\r\n 14345: 'English - Indonesia',\r\n 6153: 'English - Ireland',\r\n 16393: 'English - India',\r\n 17417: 'English - Malaysia',\r\n 5129: 'English - New Zealand',\r\n 13321: 'English - Philippines',\r\n 18441: 'English - Singapore',\r\n 1033: 'English - United States',\r\n '-1': 'English - International',\r\n 7177: 'English - South Africa',\r\n 11274: 'Spanish - Argentina',\r\n 13322: 'Spanish - Chile',\r\n 9226: 'Spanish - Colombia',\r\n 12298: 'Spanish - Ecuador',\r\n 3082: 'Spanish - Spain',\r\n 2058: 'Spanish - Mexico',\r\n 10250: 'Spanish - Peru',\r\n 21514: 'Spanish - United States',\r\n 8202: 'Spanish - Venezuela',\r\n '-3': 'Spanish - Latin America',\r\n 1035: 'Finnish - Finland',\r\n 2060: 'French - Belgium',\r\n 3084: 'French - Canada',\r\n 4108: 'French - Switzerland',\r\n 1036: 'French - France',\r\n 5132: 'French - Luxembourg',\r\n '-2': 'French - Africa',\r\n 1037: 'Hebrew - Israel',\r\n 1081: 'Hindi - India',\r\n 1038: 'Hungarian - Hungary',\r\n 1057: 'Indonesian - Indonesia',\r\n 1040: 'Italian - Italy',\r\n 1041: 'Japanese - Japan',\r\n 1042: 'Korean - Korea',\r\n 1063: 'Lithuanian - Lithuania',\r\n 1102: 'Marathi - India',\r\n 1044: 'Norwegian BokmÃ¥l - Norway',\r\n 2067: 'Dutch - Belgium',\r\n 1043: 'Dutch - Netherlands',\r\n 1045: 'Polish - Poland',\r\n 1046: 'Portuguese - Brazil',\r\n 2070: 'Portuguese - Portugal',\r\n 1049: 'Russian - Russia',\r\n 1053: 'Swedish - Sweden',\r\n 1098: 'Telugu - India',\r\n 1054: 'Thai - Thailand',\r\n 1055: 'Turkish - Turkey',\r\n 1066: 'Vietnamese - Vietnam',\r\n 2052: 'Chinese, Simplified - China',\r\n 3076: 'Chinese, Traditional - Hong Kong SAR',\r\n 4100: 'Chinese, Simplified - Singapore',\r\n 1028: 'Chinese, Traditional - Taiwan',\r\n};\r\n\r\nexport const LOCALE_FR: IDictionary<string> = {\r\n 14337: 'Arabe - Émirats arabes unis',\r\n 3073: 'Arabe - Égypte',\r\n 1025: 'Arabe - Arabie Saoudite',\r\n 1093: 'Bangla - Inde',\r\n 1029: 'Tchèque - République tchèque',\r\n 1030: 'Danois - Danemark',\r\n 3079: 'Allemand - Autriche',\r\n 2055: 'Allemand - Suisse',\r\n 1031: 'Allemand - Allemagne',\r\n 1032: 'Grec- Grèce',\r\n '-4': 'Anglais - Émirats arabes unis',\r\n 3081: 'Anglais - Australie',\r\n 4105: 'Anglais - Canada',\r\n 2057: 'Anglais - Royaume-Uni',\r\n 14345: 'Anglais - Indonésie',\r\n 6153: 'Anglais - Irlande',\r\n 16393: 'Anglais - Inde',\r\n 17417: 'Anglais - Malaisie',\r\n 5129: 'Anglais - Nouvelle-Zélande',\r\n 13321: 'Anglais - Philippines',\r\n 18441: 'Anglais - Singapour',\r\n 1033: 'Anglais - États-Unis',\r\n '-1': 'Anglais - International',\r\n 7177: 'Anglais - Afrique du Sud',\r\n 11274: 'Espagnol - Argentine',\r\n 13322: 'Espagnol - Chili',\r\n 9226: 'Espagnol - Colombie',\r\n 12298: 'Espagnol - Équateur',\r\n 3082: 'Espagnol - Espagne',\r\n 2058: 'Espagnol - Mexique',\r\n 10250: 'Espagnol - Pérou',\r\n 21514: 'Espagnol - États-Unis',\r\n 8202: 'Espagnol - Venezuela',\r\n '-3': 'Espagnol - Amérique latine',\r\n 1035: 'Finnois - Finlande',\r\n 2060: 'Français - Belgique',\r\n 3084: 'Français - Canada',\r\n 4108: 'Français - Suisse',\r\n 1036: 'Français - France',\r\n 5132: 'Français - Luxembourg',\r\n '-2': 'Français - Afrique',\r\n 1037: 'Hébreu - Israël',\r\n 1081: 'Hindi - Inde',\r\n 1038: 'Hongrois - Hongrie',\r\n 1057: 'Indonésien - Indonésie',\r\n 1040: 'Italien - Italie',\r\n 1041: 'Japonais - Japon',\r\n 1042: 'Coréen - Corée',\r\n 1063: 'Lituanien - Lituanie',\r\n 1102: 'Marathi - Inde',\r\n 1044: 'BokmÃ¥l norvégien - Norvège',\r\n 2067: 'Néerlandais - Belgique',\r\n 1043: 'Néerlandais - Pays-Bas',\r\n 1045: 'Polonais - Pologne',\r\n 1046: 'Portugais - Brésil',\r\n 2070: 'Portugais - Portugal',\r\n 1049: 'Russe - Russie',\r\n 1053: 'Suédois - Suède',\r\n 1098: 'Telugu - Inde',\r\n 1054: 'Thaïlandais - Thaïlande',\r\n 1055: 'Turc - Turquie',\r\n 1066: 'Vietnamien - Viêt Nam',\r\n 2052: 'Chinois, simplifié - Chine',\r\n 3076: 'Chinois, traditionnel - RAS de Hong Kong',\r\n 4100: 'Chinois, simplifié - Singapour',\r\n 1028: 'Chinois, traditionnel - Taïwan',\r\n};\r\n\r\nexport const LOCALE_DE: IDictionary<string> = {\r\n 14337: 'Arabisch - Vereinigte Arabische Emirate',\r\n 3073: 'Arabisch - Ägypten',\r\n 1025: 'Arabisch - Saudi-Arabien',\r\n 1093: 'Bangla - Indien',\r\n 1029: 'Tschechisch - Tschechische Republik',\r\n 1030: 'Dänisch - Dänemark',\r\n 3079: 'Deutsch - Österreich',\r\n 2055: 'Deutsch - Schweiz',\r\n 1031: 'Deutsch - Deutschland',\r\n 1032: 'Griechisch - Griechenland',\r\n '-4': 'Englisch - Vereinigte Arabische Emirate',\r\n 3081: 'Englisch - Australien',\r\n 4105: 'Englisch - Kanada',\r\n 2057: 'Englisch - Vereinigtes Königreich',\r\n 14345: 'Englisch - Indonesien',\r\n 6153: 'Englisch - Irland',\r\n 16393: 'Englisch - Indien',\r\n 17417: 'Englisch - Malaysia',\r\n 5129: 'Englisch - Neuseeland',\r\n 13321: 'Englisch - Philippinen',\r\n 18441: 'Englisch - Singapur',\r\n 1033: 'Englisch - Vereinigte Staaten',\r\n '-1': 'Englisch - International',\r\n 7177: 'Englisch - Südafrika',\r\n 11274: 'Spanisch - Argentinien',\r\n 13322: 'Spanisch - Chile',\r\n 9226: 'Spanisch - Kolumbien',\r\n 12298: 'Spanisch - Ecuador',\r\n 3082: 'Spanisch - Spanien',\r\n 2058: 'Spanisch - Mexiko',\r\n 10250: 'Spanisch - Peru',\r\n 21514: 'Spanisch - Vereinigte Staaten',\r\n 8202: 'Spanisch - Venezuela',\r\n '-3': 'Spanisch - Lateinamerika',\r\n 1035: 'Finnisch - Finnland',\r\n 2060: 'Französisch - Belgien',\r\n 3084: 'Französisch - Kanada',\r\n 4108: 'Französisch - Schweiz',\r\n 1036: 'Französisch - Frankreich',\r\n 5132: 'Französisch - Luxemburg',\r\n '-2': 'Französisch - Afrika',\r\n 1037: 'Hebräisch - Israel',\r\n 1081: 'Hindi - Indien',\r\n 1038: 'Ungarisch - Ungarn',\r\n 1057: 'Indonesisch - Indonesien',\r\n 1040: 'Italienisch - Italien',\r\n 1041: 'Japanisch - Japan',\r\n 1042: 'Koreanisch - Korea',\r\n 1063: 'Litauisch - Litauen',\r\n 1102: 'Marathi - Indien',\r\n 1044: 'Norwegisch BokmÃ¥l - Norwegen',\r\n 2067: 'Niederländisch - Belgien',\r\n 1043: 'Niederländisch - Niederlande',\r\n 1045: 'Polnisch - Polen',\r\n 1046: 'Portugiesisch - Brasilien',\r\n 2070: 'Portugiesisch - Portugal',\r\n 1049: 'Russisch - Russland',\r\n 1053: 'Schwedisch - Schweden',\r\n 1098: 'Telugu - Indien',\r\n 1054: 'Thailändisch - Thailand',\r\n 1055: 'Türkisch - Türkei',\r\n 1066: 'Vietnamesisch - Vietnam',\r\n 2052: 'Chinesisch (vereinfacht) - China',\r\n 3076: 'Chinesisch (traditionell) - Hongkong',\r\n 4100: 'Chinesisch (vereinfacht) - Singapur',\r\n 1028: 'Chinesisch (traditionell) - Taiwan',\r\n};\r\n\r\nexport const LOCALE_IT: IDictionary<string> = {\r\n 14337: 'Arabo - Emirati Arabi Uniti',\r\n 3073: 'Arabo - Egitto',\r\n 1025: 'Arabo - Arabia Saudita',\r\n 1093: 'Bangla - India',\r\n 1029: 'Ceco - Repubblica Ceca',\r\n 1030: 'Danese - Danimarca',\r\n 3079: 'Tedesco - Austria',\r\n 2055: 'Tedesco - Svizzera',\r\n 1031: 'Tedesco - Germania',\r\n 1032: 'Greco - Grecia',\r\n '-4': 'Inglese - Emirati Arabi Uniti',\r\n 3081: 'Inglese - Australia',\r\n 4105: 'Inglese - Canada',\r\n 2057: 'Inglese - Regno Unito',\r\n 14345: 'Inglese - Indonesia',\r\n 6153: 'Inglese - Irlanda',\r\n 16393: 'Inglese - India',\r\n 17417: 'Inglese - Malaysia',\r\n 5129: 'Inglese - Nuova Zelanda',\r\n 13321: 'Inglese - Filippine',\r\n 18441: 'Inglese - Singapore',\r\n 1033: 'Inglese - Stati Uniti',\r\n '-1': 'Inglese - Internazionale',\r\n 7177: 'Inglese - Sudafrica',\r\n 11274: 'Spagnolo - Argentina',\r\n 13322: 'Spagnolo - Cile',\r\n 9226: 'Spagnolo - Colombia',\r\n 12298: 'Spagnolo - Ecuador',\r\n 3082: 'Spagnolo - Spagna',\r\n 2058: 'Spagnolo - Messico',\r\n 10250: 'Spagnolo - Perù',\r\n 21514: 'Spagnolo - Stati Uniti',\r\n 8202: 'Spagnolo - Venezuela',\r\n '-3': 'Spagnolo - America Latina',\r\n 1035: 'Finlandese - Finlandia',\r\n 2060: 'Francese - Belgio',\r\n 3084: 'Francese - Canada',\r\n 4108: 'Francese - Svizzera',\r\n 1036: 'Francese - Francia',\r\n 5132: 'Francese - Lussemburgo',\r\n '-2': 'Francese - Africa',\r\n 1037: 'Ebraico - Israele',\r\n 1081: 'Hindi - India',\r\n 1038: 'Ungherese - Ungheria',\r\n 1057: 'Indonesiano - Indonesia',\r\n 1040: 'Italiano - Italia',\r\n 1041: 'Giapponese - Giappone',\r\n 1042: 'Coreano - Corea',\r\n 1063: 'Lituano - Lituania',\r\n 1102: 'Marathi - India',\r\n 1044: 'Norvegese BokmÃ¥l - Norvegia',\r\n 2067: 'Olandese - Belgio',\r\n 1043: 'Olandese - Paesi Bassi',\r\n 1045: 'Polacco - Polonia',\r\n 1046: 'Portoghese - Brasile',\r\n 2070: 'Portoghese - Portogallo',\r\n 1049: 'Russo - Russia',\r\n 1053: 'Svedese - Svezia',\r\n 1098: 'Telugu - India',\r\n 1054: 'Tailandese - Thailandia',\r\n 1055: 'Turco - Turchia',\r\n 1066: 'Vietnamita - Vietnam',\r\n 2052: 'Cinese semplificato - Cina',\r\n 3076: 'Cinese tradizionale - Hong Kong (SAR)',\r\n 4100: 'Cinese semplificato - Singapore',\r\n 1028: 'Cinese tradizionale - Taiwan',\r\n};\r\n\r\nexport const LOCALE_LANGUAGE_MAPPING = {\r\n 'en-us': LOCALE_EN,\r\n 'fr-fr': LOCALE_FR,\r\n};\r\n\r\n// Supported languages in the system\r\nexport const SUPPORTED_LOCALES_EN: IDictionary<string> = {\r\n 1033: 'English - United States',\r\n 2057: 'English - United Kingdom',\r\n 1036: 'French - France',\r\n 1031: 'German - Germany',\r\n 1040: 'Italian - Italy',\r\n 3084: 'French - Canada',\r\n 3082: 'Spanish - Spain',\r\n 2058: 'Spanish - Mexico',\r\n};\r\n\r\nexport const SUPPORTED_LOCALES_EN_GB: IDictionary<string> = {\r\n 1033: 'English - United States',\r\n 2057: 'English - United Kingdom',\r\n 1036: 'French - France',\r\n 1031: 'German - Germany',\r\n 1040: 'Italian - Italy',\r\n 3084: 'French - Canada',\r\n 3082: 'Spanish - Spain',\r\n 2058: 'Spanish - Mexico',\r\n};\r\n\r\nexport const SUPPORTED_LOCALES_FR: IDictionary<string> = {\r\n 1033: 'Anglais - États-Unis',\r\n 2057: 'Anglais - Royaume-Uni',\r\n 1036: 'Français - France',\r\n 1031: 'Allemand - Allemagne',\r\n 1040: 'Italien - Italie',\r\n 3084: 'Français - Canada',\r\n 3082: 'Espagnol - Espagne',\r\n 2058: 'Espagnol - Mexique',\r\n};\r\n\r\nexport const SUPPORTED_LOCALES_DE: IDictionary<string> = {\r\n 1033: 'Englisch - Vereinigte Staaten',\r\n 2057: 'Englisch - Vereinigtes Königreich',\r\n 1036: 'Französisch - Frankreich',\r\n 1031: 'Deutsch - Deutschland',\r\n 1040: 'Italienisch - Italien',\r\n 3084: 'Französisch - Kanada',\r\n 3082: 'Spanisch - Spanien',\r\n 2058: 'Spanisch - Mexiko',\r\n};\r\n\r\nexport const SUPPORTED_LOCALES_IT: IDictionary<string> = {\r\n 1033: 'Inglese - Stati Uniti',\r\n 2057: 'Inglese - Regno Unito',\r\n 1036: 'Francese - Francia',\r\n 1031: 'Tedesco - Germania',\r\n 1040: 'Italiano - Italia',\r\n 3084: 'Francese - Canada',\r\n 3082: 'Spagnolo - Spagna',\r\n 2058: 'Spagnolo - Messico',\r\n};\r\n\r\nexport const SUPPORTED_LOCALES_FR_CA: IDictionary<string> = {\r\n 1033: 'Anglais - États-Unis',\r\n 2057: 'Anglais - Royaume-Uni',\r\n 1036: 'Français - France',\r\n 1031: 'Allemand - Allemagne',\r\n 1040: 'Italien - Italie',\r\n 3084: 'Français - Canada',\r\n 3082: 'Espagnol - Espagne',\r\n 2058: 'Espagnol - Mexique',\r\n};\r\n\r\nexport const SUPPORTED_LOCALES_ES_ES: IDictionary<string> = {\r\n 1033: 'Inglés - Estados Unidos',\r\n 2057: 'Inglés - Reino Unido',\r\n 1036: 'Francés - Francia',\r\n 1031: 'Alemán - Alemania',\r\n 1040: 'Italiano - Italia',\r\n 3084: 'Francés - Canadá',\r\n 3082: 'Español - España',\r\n 2058: 'Español - México',\r\n};\r\n\r\nexport const SUPPORTED_LOCALES_ES_MX: IDictionary<string> = {\r\n 1033: 'Inglés - Estados Unidos',\r\n 2057: 'Inglés - Reino Unido',\r\n 1036: 'Francés - Francia',\r\n 1031: 'Alemán - Alemania',\r\n 1040: 'Italiano - Italia',\r\n 3084: 'Francés - Canadá',\r\n 3082: 'Español - España',\r\n 2058: 'Español - México',\r\n};\r\n\r\nexport const SUPPORTED_LOCALES_MAPPING = {\r\n 'en-us': SUPPORTED_LOCALES_EN,\r\n 'en-gb': SUPPORTED_LOCALES_EN_GB,\r\n 'fr-fr': SUPPORTED_LOCALES_FR,\r\n 'de-de': SUPPORTED_LOCALES_DE,\r\n 'it-it': SUPPORTED_LOCALES_IT,\r\n 'fr-ca': SUPPORTED_LOCALES_FR_CA,\r\n 'es-es': SUPPORTED_LOCALES_ES_ES,\r\n 'es-mx': SUPPORTED_LOCALES_ES_MX,\r\n};\r\n","import { IDictionary } from './countries';\r\n\r\nexport const TIMEZONE_EN: IDictionary<string> = {\r\n 75: '(GMT-12:00) International Date Line West',\r\n 74: '(GMT-11:00) Midway Island',\r\n 73: '(GMT-10:00) Hawaii',\r\n 72: '(GMT-09:00) Alaska',\r\n 71: '(GMT-08:00) Pacific Time (US & Canada); Tijuana',\r\n 68: '(GMT-07:00) Arizona',\r\n 69: '(GMT-07:00) Chihuahua',\r\n 70: '(GMT-07:00) Mountain Time (US & Canada)',\r\n 64: '(GMT-06:00) Central America',\r\n 65: '(GMT-06:00) Central Time (US & Canada)',\r\n 66: '(GMT-06:00) Guadalajara',\r\n 67: '(GMT-06:00) Saskatchewan',\r\n 61: '(GMT-05:00) Bogota',\r\n 62: '(GMT-05:00) Eastern Time (US & Canada)',\r\n 63: '(GMT-05:00) Indiana (East)',\r\n 58: '(GMT-04:00) Atlantic Time (Canada)',\r\n 59: '(GMT-04:00) Caracas',\r\n 57: '(GMT-03:30) Newfoundland',\r\n 60: '(GMT-03:00) Santiago',\r\n 54: '(GMT-03:00) Brasilia',\r\n 55: '(GMT-03:00) Buenos Aires',\r\n 56: '(GMT-03:00) Greenland',\r\n 53: '(GMT-02:00) Mid-Atlantic',\r\n 51: '(GMT-01:00) Azores',\r\n 52: '(GMT-01:00) Cape Verde Is.',\r\n 49: '(GMT) Casablanca',\r\n 50: '(GMT) Greenwich Mean Time ',\r\n 44: '(GMT+01:00) West Central Africa',\r\n 45: '(GMT+01:00) Sarajevo',\r\n 46: '(GMT+01:00) Brussels',\r\n 47: '(GMT+01:00) Belgrade',\r\n 48: '(GMT+01:00) Amsterdam',\r\n 38: '(GMT+02:00) Jerusalem',\r\n 39: '(GMT+02:00) Helsinki',\r\n 40: '(GMT+02:00) Harare',\r\n 41: '(GMT+02:00) Cairo',\r\n 42: '(GMT+02:00) Bucharest',\r\n 43: '(GMT+02:00) Athens',\r\n 34: '(GMT+03:00) Nairobi',\r\n 35: '(GMT+03:00) Moscow',\r\n 36: '(GMT+03:00) Kuwait',\r\n 37: '(GMT+03:00) Baghdad',\r\n 33: '(GMT+03:30) Tehran',\r\n 31: '(GMT+04:00) Baku',\r\n 32: '(GMT+04:00) Abu Dhabi',\r\n 30: '(GMT+04:30) Kabul',\r\n 28: '(GMT+05:00) Islamabad',\r\n 29: '(GMT+05:00) Ekaterinburg',\r\n 27: '(GMT+05:30) Chennai',\r\n 26: '(GMT+05:45) Kathmandu',\r\n 23: '(GMT+06:00) Sri Jayawardenepura',\r\n 24: '(GMT+06:00) Astana',\r\n 25: '(GMT+06:00) Almaty',\r\n 22: '(GMT+06:30) Rangoon',\r\n 20: '(GMT+07:00) Krasnoyarsk',\r\n 21: '(GMT+07:00) Bangkok',\r\n 15: '(GMT+08:00) Taipei',\r\n 16: '(GMT+08:00) Perth',\r\n 17: '(GMT+08:00) Kuala Lumpur',\r\n 18: '(GMT+08:00) Irkutsk',\r\n 19: '(GMT+08:00) Beijing',\r\n 12: '(GMT+09:00) Yakutsk',\r\n 13: '(GMT+09:00) Seoul',\r\n 14: '(GMT+09:00) Osaka',\r\n 10: '(GMT+09:30) Darwin',\r\n 11: '(GMT+09:30) Adelaide',\r\n 5: '(GMT+10:00) Vladivostok',\r\n 6: '(GMT+10:00) Hobart',\r\n 7: '(GMT+10:00) Guam',\r\n 8: '(GMT+10:00) Canberra',\r\n 9: '(GMT+10:00) Brisbane',\r\n 4: '(GMT+11:00) Magadan',\r\n 2: '(GMT+12:00) Fiji',\r\n 3: '(GMT+12:00) Auckland',\r\n 1: \"(GMT+13:00) Nuku'alofa\",\r\n};\r\n\r\nexport const TIMEZONE_EN_GB: IDictionary<string> = {\r\n 75: '(GMT-12:00) International Date Line West',\r\n 74: '(GMT-11:00) Midway Island',\r\n 73: '(GMT-10:00) Hawaii',\r\n 72: '(GMT-09:00) Alaska',\r\n 71: '(GMT-08:00) Pacific Time (US & Canada); Tijuana',\r\n 68: '(GMT-07:00) Arizona',\r\n 69: '(GMT-07:00) Chihuahua',\r\n 70: '(GMT-07:00) Mountain Time (US & Canada)',\r\n 64: '(GMT-06:00) Central America',\r\n 65: '(GMT-06:00) Central Time (US & Canada)',\r\n 66: '(GMT-06:00) Guadalajara',\r\n 67: '(GMT-06:00) Saskatchewan',\r\n 61: '(GMT-05:00) Bogota',\r\n 62: '(GMT-05:00) Eastern Time (US & Canada)',\r\n 63: '(GMT-05:00) Indiana (East)',\r\n 58: '(GMT-04:00) Atlantic Time (Canada)',\r\n 59: '(GMT-04:00) Caracas',\r\n 57: '(GMT-03:30) Newfoundland',\r\n 60: '(GMT-03:00) Santiago',\r\n 54: '(GMT-03:00) Brasilia',\r\n 55: '(GMT-03:00) Buenos Aires',\r\n 56: '(GMT-03:00) Greenland',\r\n 53: '(GMT-02:00) Mid-Atlantic',\r\n 51: '(GMT-01:00) Azores',\r\n 52: '(GMT-01:00) Cape Verde Is.',\r\n 49: '(GMT) Casablanca',\r\n 50: '(GMT) Greenwich Mean Time',\r\n 44: '(GMT+01:00) West Central Africa',\r\n 45: '(GMT+01:00) Sarajevo',\r\n 46: '(GMT+01:00) Brussels',\r\n 47: '(GMT+01:00) Belgrade',\r\n 48: '(GMT+01:00) Amsterdam',\r\n 38: '(GMT+02:00) Jerusalem',\r\n 39: '(GMT+02:00) Helsinki',\r\n 40: '(GMT+02:00) Harare',\r\n 41: '(GMT+02:00) Cairo',\r\n 42: '(GMT+02:00) Bucharest',\r\n 43: '(GMT+02:00) Athens',\r\n 34: '(GMT+03:00) Nairobi',\r\n 35: '(GMT+03:00) Moscow',\r\n 36: '(GMT+03:00) Kuwait',\r\n 37: '(GMT+03:00) Baghdad',\r\n 33: '(GMT+03:30) Tehran',\r\n 31: '(GMT+04:00) Baku',\r\n 32: '(GMT+04:00) Abu Dhabi',\r\n 30: '(GMT+04:30) Kabul',\r\n 28: '(GMT+05:00) Islamabad',\r\n 29: '(GMT+05:00) Ekaterinburg',\r\n 27: '(GMT+05:30) Chennai',\r\n 26: '(GMT+05:45) Kathmandu',\r\n 23: '(GMT+06:00) Sri Jayawardenepura',\r\n 24: '(GMT+06:00) Astana',\r\n 25: '(GMT+06:00) Almaty',\r\n 22: '(GMT+06:30) Rangoon',\r\n 20: '(GMT+07:00) Krasnoyarsk',\r\n 21: '(GMT+07:00) Bangkok',\r\n 15: '(GMT+08:00) Taipei',\r\n 16: '(GMT+08:00) Perth',\r\n 17: '(GMT+08:00) Kuala Lumpur',\r\n 18: '(GMT+08:00) Irkutsk',\r\n 19: '(GMT+08:00) Beijing',\r\n 12: '(GMT+09:00) Yakutsk',\r\n 13: '(GMT+09:00) Seoul',\r\n 14: '(GMT+09:00) Osaka',\r\n 10: '(GMT+09:30) Darwin',\r\n 11: '(GMT+09:30) Adelaide',\r\n 5: '(GMT+10:00) Vladivostok',\r\n 6: '(GMT+10:00) Hobart',\r\n 7: '(GMT+10:00) Guam',\r\n 8: '(GMT+10:00) Canberra',\r\n 9: '(GMT+10:00) Brisbane',\r\n 4: '(GMT+11:00) Magadan',\r\n 2: '(GMT+12:00) Fiji',\r\n 3: '(GMT+12:00) Auckland',\r\n 1: \"(GMT+13:00) Nuku'alofa\",\r\n};\r\n\r\nexport const TIMEZONE_FR: IDictionary<string> = {\r\n 75: '(GMT-12:00) Ligne de changement de date international Ouest',\r\n 74: '(GMT-11:00) ÃŽle Midway',\r\n 73: '(GMT-10:00) Hawaï',\r\n 72: '(GMT-09:00) Alaska',\r\n 71: '(GMT-08:00) Heure du Pacifique (États-Unis et Canada) ; Tijuana',\r\n 68: '(GMT-07:00) Arizona',\r\n 69: '(GMT-07:00) Chihuahua',\r\n 70: '(GMT-07:00) Heure des Rocheuses (États-Unis et Canada)',\r\n 64: '(GMT-06:00) Amérique centrale',\r\n 65: '(GMT-06:00) Heure du Centre (États-Unis et Canada)',\r\n 66: '(GMT-06:00) Guadalajara',\r\n 67: '(GMT-06:00) Saskatchewan',\r\n 61: '(GMT-05:00) Bogota',\r\n 62: '(GMT-05:00) Heure de l’Est (États-Unis et Canada)',\r\n 63: '(GMT-05:00) Indiana (Est)',\r\n 58: '(GMT-04:00) Heure de l’Atlantique (Canada)',\r\n 59: '(GMT-04:00) Caracas',\r\n 57: '(GMT-03:30) Terre-Neuve',\r\n 60: '(GMT-03:00) Santiago',\r\n 54: '(GMT-03:00) Brasilia',\r\n 55: '(GMT-03:00) Buenos Aires',\r\n 56: '(GMT-03:00) Groenland',\r\n 53: '(GMT-02:00) Centre de l’Atlantique',\r\n 51: '(GMT-01:00) Açores',\r\n 52: '(GMT-01:00) Le Cap-Vert est',\r\n 49: '(GMT) Casablanca',\r\n 50: '(GMT) Méridien de Greenwich',\r\n 44: '(GMT+01:00) Afrique de l’Ouest et du Centre',\r\n 45: '(GMT+01:00) Sarajevo',\r\n 46: '(GMT+01:00) Bruxelles',\r\n 47: '(GMT+01:00) Belgrade',\r\n 48: '(GMT+01:00) Amsterdam',\r\n 38: '(GMT+02:00) Jérusalem',\r\n 39: '(GMT+02:00) Helsinki',\r\n 40: '(GMT+02:00) Harare',\r\n 41: '(GMT+02:00) Le Caire',\r\n 42: '(GMT+02:00) Bucharest',\r\n 43: '(GMT+02:00) Athènes',\r\n 34: '(GMT+03:00) Nairobi',\r\n 35: '(GMT+03:00) Moscou',\r\n 36: '(GMT+03:00) Koweït',\r\n 37: '(GMT+03:00) Bagdad',\r\n 33: '(GMT+03:30) Téhéran',\r\n 31: '(GMT+04:00) Bakou',\r\n 32: '(GMT+04:00) Abou Dhabi',\r\n 30: '(GMT+04:30) Kaboul',\r\n 28: '(GMT+05:00) Islamabad',\r\n 29: '(GMT+05:00) Ekaterinburg',\r\n 27: '(GMT+05:30) Chennai',\r\n 26: '(GMT+05:45) Katmandou',\r\n 23: '(GMT+06:00) Sri Jayawardenepura',\r\n 24: '(GMT+06:00) Astana',\r\n 25: '(GMT+06:00) Almaty',\r\n 22: '(GMT+06:30) Rangoon',\r\n 20: '(GMT+07:00) Krasnoïarsk',\r\n 21: '(GMT+07:00) Bangkok',\r\n 15: '(GMT+08:00) Taipei',\r\n 16: '(GMT+08:00) Perth',\r\n 17: '(GMT+08:00) Kuala Lumpur',\r\n 18: '(GMT+08:00) Irkoutsk',\r\n 19: '(GMT+08:00) Beijing',\r\n 12: '(GMT+09:00) Yakoutsk',\r\n 13: '(GMT+09:00) Séoul',\r\n 14: '(GMT+09:00) Osaka',\r\n 10: '(GMT+09:30) Darwin',\r\n 11: '(GMT+09:30) Adélaïde',\r\n 5: '(GMT+10:00) Vladivostok',\r\n 6: '(GMT+10:00) Hobart',\r\n 7: '(GMT+10:00) Guam',\r\n 8: '(GMT+10:00) Canberra',\r\n 9: '(GMT+10:00) Brisbane',\r\n 4: '(GMT+11:00) Magadan',\r\n 2: '(GMT+12:00) Fidji',\r\n 3: '(GMT+12:00) Auckland',\r\n 1: \"(GMT+13:00) Nuku'alofa\",\r\n};\r\n\r\nexport const TIMEZONE_DE: IDictionary<string> = {\r\n 75: '(GMT-12:00) Internationale Datumsgrenze West',\r\n 74: '(GMT-11:00) Midway-Insel',\r\n 73: '(GMT-10:00) Hawaii',\r\n 72: '(GMT-09:00) Alaska',\r\n 71: '(GMT-08:00) Pazifikzeit (USA & Kanada); Tijuana',\r\n 68: '(GMT-07:00) Arizona',\r\n 69: '(GMT-07:00) Chihuahua',\r\n 70: '(GMT-07:00) Gebirgszeit (USA & Kanada)',\r\n 64: '(GMT-06:00) Zentralamerika',\r\n 65: '(GMT-06:00) Zentralzeit (USA & Kanada)',\r\n 66: '(GMT-06:00) Guadalajara',\r\n 67: '(GMT-06:00) Saskatchewan',\r\n 61: '(GMT-05:00) Bogota',\r\n 62: '(GMT-05:00) Ostzeit (USA & Kanada)',\r\n 63: '(GMT-05:00) Indiana (Ost)',\r\n 58: '(GMT-04:00) Atlantikzeit (Kanada)',\r\n 59: '(GMT-04:00) Caracas',\r\n 57: '(GMT-03:30) Neufundland',\r\n 60: '(GMT-03:00) Santiago',\r\n 54: '(GMT-03:00) Brasilien',\r\n 55: '(GMT-03:00) Buenos Aires',\r\n 56: '(GMT-03:00) Grönland',\r\n 53: '(GMT-02:00) Mittelatlantik',\r\n 51: '(GMT-01:00) Azoren',\r\n 52: '(GMT-01:00) Kap Verde',\r\n 49: '(GMT) Casablanca',\r\n 50: '(GMT) Greenwich Mean Time',\r\n 44: '(GMT+01:00) Westafrika',\r\n 45: '(GMT+01:00) Sarajevo',\r\n 46: '(GMT+01:00) Brüssel',\r\n 47: '(GMT+01:00) Belgrad',\r\n 48: '(GMT+01:00) Amsterdam',\r\n 38: '(GMT+02:00) Jerusalem',\r\n 39: '(GMT+02:00) Helsinki',\r\n 40: '(GMT+02:00) Harare',\r\n 41: '(GMT+02:00) Kairo',\r\n 42: '(GMT+02:00) Bukarest',\r\n 43: '(GMT+02:00) Athen',\r\n 34: '(GMT+03:00) Nairobi',\r\n 35: '(GMT+03:00) Moskau',\r\n 36: '(GMT+03:00) Kuwait',\r\n 37: '(GMT+03:00) Bagdad',\r\n 33: '(GMT+03:30) Teheran',\r\n 31: '(GMT+04:00) Baku',\r\n 32: '(GMT+04:00) Abu Dhabi',\r\n 30: '(GMT+04:30) Kabul',\r\n 28: '(GMT+05:00) Islamabad',\r\n 29: '(GMT+05:00) Jekaterinburg',\r\n 27: '(GMT+05:30) Chennai',\r\n 26: '(GMT+05:45) Kathmandu',\r\n 23: '(GMT+06:00) Sri Jayawardenepura',\r\n 24: '(GMT+06:00) Astana',\r\n 25: '(GMT+06:00) Almaty',\r\n 22: '(GMT+06:30) Rangun',\r\n 20: '(GMT+07:00) Krasnojarsk',\r\n 21: '(GMT+07:00) Bangkok',\r\n 15: '(GMT+08:00) Taipeh',\r\n 16: '(GMT+08:00) Perth',\r\n 17: '(GMT+08:00) Kuala Lumpur',\r\n 18: '(GMT+08:00) Irkutsk',\r\n 19: '(GMT+08:00) Peking',\r\n 12: '(GMT+09:00) Jakutsk',\r\n 13: '(GMT+09:00) Seoul',\r\n 14: '(GMT+09:00) Osaka',\r\n 10: '(GMT+09:30) Darwin',\r\n 11: '(GMT+09:30) Adelaide',\r\n 5: '(GMT+10:00) Wladiwostok',\r\n 6: '(GMT+10:00) Hobart',\r\n 7: '(GMT+10:00) Guam',\r\n 8: '(GMT+10:00) Canberra',\r\n 9: '(GMT+10:00) Brisbane',\r\n 4: '(GMT+11:00) Magadan',\r\n 2: '(GMT+12:00) Fiji',\r\n 3: '(GMT+12:00) Auckland',\r\n 1: \"(GMT+13:00) Nuku'alofa\",\r\n};\r\n\r\nexport const TIMEZONE_IT: IDictionary<string> = {\r\n 75: '(GMT-12:00) Linea internazionale del cambio di data ovest',\r\n 74: '(GMT-11:00) Isola di Midway',\r\n 73: '(GMT-10:00) Hawaii',\r\n 72: '(GMT-09:00) Alaska',\r\n 71: '(GMT-08:00) Ora del Pacifico (USA e Canada); Tijuana',\r\n 68: '(GMT-07:00) Arizona',\r\n 69: '(GMT-07:00) Chihuahua',\r\n 70: '(GMT-07:00) Ora delle Montagne (USA e Canada)',\r\n 64: '(GMT-06:00) America centrale',\r\n 65: '(GMT-06:00) Ora centrale (USA e Canada)',\r\n 66: '(GMT-06:00) Guadalajara',\r\n 67: '(GMT-06:00) Saskatchewan',\r\n 61: '(GMT-05:00) Bogotà ',\r\n 62: '(GMT-05:00) Ora orientale (USA e Canada)',\r\n 63: '(GMT-05:00) Indiana (Est)',\r\n 58: '(GMT-04:00) Ora dell’Atlantico (Canada)',\r\n 59: '(GMT-04:00) Caracas',\r\n 57: '(GMT-03:30) Terranova',\r\n 60: '(GMT-03:00) Santiago',\r\n 54: '(GMT-03:00) Brasilia',\r\n 55: '(GMT-03:00) Buenos Aires',\r\n 56: '(GMT-03:00) Groenlandia',\r\n 53: '(GMT-02:00) Atlantico centrale',\r\n 51: '(GMT-01:00) Azzorre',\r\n 52: '(GMT-01:00) Capo Verde',\r\n 49: '(GMT) Casablanca',\r\n 50: '(GMT) Ora media di Greenwich',\r\n 44: '(GMT+01:00) Africa occidentale centrale',\r\n 45: '(GMT+01:00) Sarajevo',\r\n 46: '(GMT+01:00) Bruxelles',\r\n 47: '(GMT+01:00) Belgrado',\r\n 48: '(GMT+01:00) Amsterdam',\r\n 38: '(GMT+02:00) Gerusalemme',\r\n 39: '(GMT+02:00) Helsinki',\r\n 40: '(GMT+02:00) Harare',\r\n 41: '(GMT+02:00) Il Cairo',\r\n 42: '(GMT+02:00) Bucarest',\r\n 43: '(GMT+02:00) Atene',\r\n 34: '(GMT+03:00) Nairobi',\r\n 35: '(GMT+03:00) Mosca',\r\n 36: '(GMT+03:00) Kuwait',\r\n 37: '(GMT+03:00) Baghdad',\r\n 33: '(GMT+03:30) Teheran',\r\n 31: '(GMT+04:00) Baku',\r\n 32: '(GMT+04:00) Abu Dhabi',\r\n 30: '(GMT+04:30) Kabul',\r\n 28: '(GMT+05:00) Islamabad',\r\n 29: '(GMT+05:00) Ekaterinburg',\r\n 27: '(GMT+05:30) Chennai',\r\n 26: '(GMT+05:45) Kathmandu',\r\n 23: '(GMT+06:00) Sri Jayawardenepura',\r\n 24: '(GMT+06:00) Astana',\r\n 25: '(GMT+06:00) Almaty',\r\n 22: '(GMT+06:30) Rangoon',\r\n 20: '(GMT+07:00) Krasnojarsk',\r\n 21: '(GMT+07:00) Bangkok',\r\n 15: '(GMT+08:00) Taipei',\r\n 16: '(GMT+08:00) Perth',\r\n 17: '(GMT+08:00) Kuala Lumpur',\r\n 18: '(GMT+08:00) Irkutsk',\r\n 19: '(GMT+08:00) Pechino',\r\n 12: '(GMT+09:00) Yakutsk',\r\n 13: '(GMT+09:00) Seoul',\r\n 14: '(GMT+09:00) Osaka',\r\n 10: '(GMT+09:30) Darwin',\r\n 11: '(GMT+09:30) Adelaide',\r\n 5: '(GMT+10:00) Vladivostok',\r\n 6: '(GMT+10:00) Hobart',\r\n 7: '(GMT+10:00) Guam',\r\n 8: '(GMT+10:00) Canberra',\r\n 9: '(GMT+10:00) Brisbane',\r\n 4: '(GMT+11:00) Magadan',\r\n 2: '(GMT+12:00) Figi',\r\n 3: '(GMT+12:00) Auckland',\r\n 1: \"(GMT+13:00) Nuku'alofa\",\r\n};\r\n\r\nexport const TIMEZONE_FR_CA: IDictionary<string> = {\r\n 75: \"(GMT-12:00) Ligne de changement de date internationale à l'ouest\",\r\n 74: '(GMT-11:00) ÃŽle de Midway',\r\n 73: '(GMT-10:00) Hawaï',\r\n 72: '(GMT-09:00) Alaska',\r\n 71: '(GMT-08:00) Heure du Pacifique (États-Unis et Canada); Tijuana',\r\n 68: '(GMT-07:00) Arizona',\r\n 69: '(GMT-07:00) Chihuahua',\r\n 70: '(GMT-07:00) Heure des Rocheuses (États-Unis et Canada)',\r\n 64: '(GMT-06:00) Amérique centrale',\r\n 65: '(GMT-06:00) Heure centrale (États-Unis et Canada)',\r\n 66: '(GMT-06:00) Guadalajara',\r\n 67: '(GMT-06:00) Saskatchewan',\r\n 61: '(GMT-05:00) Bogota',\r\n 62: \"(GMT-05:00) Heure de l'Est (États-Unis et Canada)\",\r\n 63: '(GMT-05:00) Indiana (Est)',\r\n 58: \"(GMT-04:00) Heure de l'Atlantique (Canada)\",\r\n 59: '(GMT-04:00) Caracas',\r\n 57: '(GMT-03:30) Terre-Neuve',\r\n 60: '(GMT-03:00) Santiago',\r\n 54: '(GMT-03:00) Brasilia',\r\n 55: '(GMT-03:00) Buenos Aires',\r\n 56: '(GMT-03:00) Groenland',\r\n 53: '(GMT-02:00) Atlantique-Centre',\r\n 51: '(GMT-01:00) Açores',\r\n 52: '(GMT-01:00) ÃŽles du Cap-Vert',\r\n 49: '(GMT) Casablanca',\r\n 50: '(GMT) Temps moyen de Greenwich',\r\n 44: '(GMT+01:00) Afrique centrale occidentale',\r\n 45: '(GMT+01:00) Sarajevo',\r\n 46: '(GMT+01:00) Bruxelles',\r\n 47: '(GMT+01:00) Belgrade',\r\n 48: '(GMT+01:00) Amsterdam',\r\n 38: '(GMT+02:00) Jérusalem',\r\n 39: '(GMT+02:00) Helsinki',\r\n 40: '(GMT+02:00) Harare',\r\n 41: '(GMT+02:00) Le Caire',\r\n 42: '(GMT+02:00) Bucarest',\r\n 43: '(GMT+02:00) Athènes',\r\n 34: '(GMT+03:00) Nairobi',\r\n 35: '(GMT+03:00) Moscou',\r\n 36: '(GMT+03:00) Koweït',\r\n 37: '(GMT+03:00) Bagdad',\r\n 33: '(GMT+03:30) Téhéran',\r\n 31: '(GMT+04:00) Bakou',\r\n 32: '(GMT+04:00) Abou Dabi',\r\n 30: '(GMT+04:30) Kaboul',\r\n 28: '(GMT+05:00) Islamabad',\r\n 29: '(GMT+05:00) Ekaterinbourg',\r\n 27: '(GMT+05:30) Chennai',\r\n 26: '(GMT+05:45) Katmandou',\r\n 23: '(GMT+06:00) Sri Jayawardenapura',\r\n 24: '(GMT+06:00) Astana',\r\n 25: '(GMT+06:00) Almaty',\r\n 22: '(GMT+06:30) Rangoun',\r\n 20: '(GMT+07:00) Krasnoïarsk',\r\n 21: '(GMT+07:00) Bangkok',\r\n 15: '(GMT+08:00) Taipei',\r\n 16: '(GMT+08:00) Perth',\r\n 17: '(GMT+08:00) Kuala Lumpur',\r\n 18: '(GMT+08:00) Irkoutsk',\r\n 19: '(GMT+08:00) Pékin',\r\n 12: '(GMT+09:00) Iakoutsk',\r\n 13: '(GMT+09:00) Séoul',\r\n 14: '(GMT+09:00) Osaka',\r\n 10: '(GMT+09:30) Darwin',\r\n 11: '(GMT+09:30) Adélaïde',\r\n 5: '(GMT+10:00) Vladivostok',\r\n 6: '(GMT+10:00) Hobart',\r\n 7: '(GMT+10:00) Guam',\r\n 8: '(GMT+10:00) Canberra',\r\n 9: '(GMT+10:00) Brisbane',\r\n 4: '(GMT+11:00) Magadan',\r\n 2: '(GMT+12:00) Fidji',\r\n 3: '(GMT+12:00) Auckland',\r\n 1: \"(GMT+13:00) Nuku'alofa\",\r\n};\r\n\r\nexport const TIMEZONE_ES_ES: IDictionary<string> = {\r\n 75: '(GMT-12:00) LÃnea Internacional de Cambio de Fecha (Oeste)',\r\n 74: '(GMT-11:00) Isla Midway',\r\n 73: '(GMT-10:00) Hawái',\r\n 72: '(GMT-09:00) Alaska',\r\n 71: '(GMT-08:00) Hora del PacÃfico (EE. UU. y Canadá); Tijuana',\r\n 68: '(GMT-07:00) Arizona',\r\n 69: '(GMT-07:00) Chihuahua',\r\n 70: '(GMT-07:00) Hora de la Montaña (EE. UU. y Canadá)',\r\n 64: '(GMT-06:00) América Central',\r\n 65: '(GMT-06:00) Hora Central (EE. UU. y Canadá)',\r\n 66: '(GMT-06:00) Guadalajara',\r\n 67: '(GMT-06:00) Saskatchewan',\r\n 61: '(GMT-05:00) Bogotá',\r\n 62: '(GMT-05:00) Hora del Este (EE. UU. y Canadá)',\r\n 63: '(GMT-05:00) Indiana (Este)',\r\n 58: '(GMT-04:00) Hora del Atlántico (Canadá)',\r\n 59: '(GMT-04:00) Caracas',\r\n 57: '(GMT-03:30) Terranova',\r\n 60: '(GMT-03:00) Santiago',\r\n 54: '(GMT-03:00) Brasilia',\r\n 55: '(GMT-03:00) Buenos Aires',\r\n 56: '(GMT-03:00) Groenlandia',\r\n 53: '(GMT-02:00) Atlántico Medio',\r\n 51: '(GMT-01:00) Azores',\r\n 52: '(GMT-01:00) Isla de Cabo Verde',\r\n 49: '(GMT) Casablanca',\r\n 50: '(GMT) Hora del Meridiano de Greenwich',\r\n 44: '(GMT+01:00) Ãfrica Occidental Central',\r\n 45: '(GMT+01:00) Sarajevo',\r\n 46: '(GMT+01:00) Bruselas',\r\n 47: '(GMT+01:00) Belgrado',\r\n 48: '(GMT+01:00) Ãmsterdam',\r\n 38: '(GMT+02:00) Jerusalén',\r\n 39: '(GMT+02:00) Helsinki',\r\n 40: '(GMT+02:00) Harare',\r\n 41: '(GMT+02:00) El Cairo',\r\n 42: '(GMT+02:00) Bucarest',\r\n 43: '(GMT+02:00) Atenas',\r\n 34: '(GMT+03:00) Nairobi',\r\n 35: '(GMT+03:00) Moscú',\r\n 36: '(GMT+03:00) Kuwait',\r\n 37: '(GMT+03:00) Bagdad',\r\n 33: '(GMT+03:30) Teherán',\r\n 31: '(GMT+04:00) Bakú',\r\n 32: '(GMT+04:00) Abu Dabi',\r\n 30: '(GMT+04:30) Kabul',\r\n 28: '(GMT+05:00) Islamabad',\r\n 29: '(GMT+05:00) Ekaterimburgo',\r\n 27: '(GMT+05:30) Chennai',\r\n 26: '(GMT+05:45) Katmandú',\r\n 23: '(GMT+06:00) Sri Jayawardenepura',\r\n 24: '(GMT+06:00) Astaná',\r\n 25: '(GMT+06:00) Almaty',\r\n 22: '(GMT+06:30) Rangún',\r\n 20: '(GMT+07:00) Krasnoyarsk',\r\n 21: '(GMT+07:00) Bangkok',\r\n 15: '(GMT+08:00) Taipéi',\r\n 16: '(GMT+08:00) Perth',\r\n 17: '(GMT+08:00) Kuala Lumpur',\r\n 18: '(GMT+08:00) Irkutsk',\r\n 19: '(GMT+08:00) PekÃn',\r\n 12: '(GMT+09:00) Yakutsk',\r\n 13: '(GMT+09:00) Seúl',\r\n 14: '(GMT+09:00) Osaka',\r\n 10: '(GMT+09:30) Darwin',\r\n 11: '(GMT+09:30) Adelaida',\r\n 5: '(GMT+10:00) Vladivostok',\r\n 6: '(GMT+10:00) Hobart',\r\n 7: '(GMT+10:00) Guam',\r\n 8: '(GMT+10:00) Canberra',\r\n 9: '(GMT+10:00) Brisbane',\r\n 4: '(GMT+11:00) Magadán',\r\n 2: '(GMT+12:00) Fiyi',\r\n 3: '(GMT+12:00) Auckland',\r\n 1: '(GMT+13:00) Nukualofa',\r\n};\r\n\r\nexport const TIMEZONE_ES_MX: IDictionary<string> = {\r\n 75: '(GMT-12:00) LÃnea Internacional de Cambio de Fecha Oeste',\r\n 74: '(GMT-11:00) Isla Midway',\r\n 73: '(GMT-10:00) Hawái',\r\n 72: '(GMT-09:00) Alaska',\r\n 71: '(GMT-08:00) Hora del PacÃfico (EE. UU. y Canadá); Tijuana',\r\n 68: '(GMT-07:00) Arizona',\r\n 69: '(GMT-07:00) Chihuahua',\r\n 70: '(GMT-07:00) Hora de la Montaña (EE. UU. y Canadá)',\r\n 64: '(GMT-06:00) Centroamérica',\r\n 65: '(GMT-06:00) Hora Central (EE. UU. y Canadá)',\r\n 66: '(GMT-06:00) Guadalajara',\r\n 67: '(GMT-06:00) Saskatchewan',\r\n 61: '(GMT-05:00) Bogotá',\r\n 62: '(GMT-05:00) Hora del Este (EE. UU. y Canadá)',\r\n 63: '(GMT-05:00) Indiana (Este)',\r\n 58: '(GMT-04:00) Hora Atlántica (Canadá)',\r\n 59: '(GMT-04:00) Caracas',\r\n 57: '(GMT-03:30) Terranova',\r\n 60: '(GMT-03:00) Santiago',\r\n 54: '(GMT-03:00) Brasilia',\r\n 55: '(GMT-03:00) Buenos Aires',\r\n 56: '(GMT-03:00) Groenlandia',\r\n 53: '(GMT-02:00) Atlántico Medio',\r\n 51: '(GMT-01:00) Azores',\r\n 52: '(GMT-01:00) Islas de Cabo Verde',\r\n 49: '(GMT) Casablanca',\r\n 50: '(GMT) Tiempo Medio de Greenwich',\r\n 44: '(GMT+01:00) Ãfrica Central Occidental',\r\n 45: '(GMT+01:00) Sarajevo',\r\n 46: '(GMT+01:00) Bruselas',\r\n 47: '(GMT+01:00) Belgrado',\r\n 48: '(GMT+01:00) Ãmsterdam',\r\n 38: '(GMT+02:00) Jerusalén',\r\n 39: '(GMT+02:00) Helsinki',\r\n 40: '(GMT+02:00) Harare',\r\n 41: '(GMT+02:00) El Cairo',\r\n 42: '(GMT+02:00) Bucarest',\r\n 43: '(GMT+02:00) Atenas',\r\n 34: '(GMT+03:00) Nairobi',\r\n 35: '(GMT+03:00) Moscú',\r\n 36: '(GMT+03:00) Kuwait',\r\n 37: '(GMT+03:00) Bagdad',\r\n 33: '(GMT+03:30) Teherán',\r\n 31: '(GMT+04:00) Bakú',\r\n 32: '(GMT+04:00) Abu Dabi',\r\n 30: '(GMT+04:30) Kabul',\r\n 28: '(GMT+05:00) Islamabad',\r\n 29: '(GMT+05:00) Ekaterimburgo',\r\n 27: '(GMT+05:30) Chennai',\r\n 26: '(GMT+05:45) Katmandú',\r\n 23: '(GMT+06:00) Sri Jayawardenepura',\r\n 24: '(GMT+06:00) Astaná',\r\n 25: '(GMT+06:00) Almatý',\r\n 22: '(GMT+06:30) Rangún',\r\n 20: '(GMT+07:00) Krasnoyarsk',\r\n 21: '(GMT+07:00) Bangkok',\r\n 15: '(GMT+08:00) Taipéi',\r\n 16: '(GMT+08:00) Perth',\r\n 17: '(GMT+08:00) Kuala Lumpur',\r\n 18: '(GMT+08:00) Irkutsk',\r\n 19: '(GMT+08:00) PekÃn',\r\n 12: '(GMT+09:00) Yakutsk',\r\n 13: '(GMT+09:00) Seúl',\r\n 14: '(GMT+09:00) Osaka',\r\n 10: '(GMT+09:30) Darwin',\r\n 11: '(GMT+09:30) Adelaida',\r\n 5: '(GMT+10:00) Vladivostok',\r\n 6: '(GMT+10:00) Hobart',\r\n 7: '(GMT+10:00) Guam',\r\n 8: '(GMT+10:00) Canberra',\r\n 9: '(GMT+10:00) Brisbane',\r\n 4: '(GMT+11:00) Magadán',\r\n 2: '(GMT+12:00) Fiyi',\r\n 3: '(GMT+12:00) Auckland',\r\n 1: '(GMT+13:00) Nukualofa',\r\n};\r\n\r\nexport const TIMEZONE_LANGUAGE_MAPPING = {\r\n 'en-us': TIMEZONE_EN,\r\n 'en-gb': TIMEZONE_EN_GB,\r\n 'fr-fr': TIMEZONE_FR,\r\n 'de-de': TIMEZONE_DE,\r\n 'it-it': TIMEZONE_IT,\r\n 'fr-ca': TIMEZONE_FR_CA,\r\n 'es-es': TIMEZONE_ES_ES,\r\n 'es-mx': TIMEZONE_ES_MX,\r\n};\r\n","export const WEEK_DAYS_EN = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];\r\nexport const WEEK_DAYS_EN_GB = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];\r\nexport const WEEK_DAYS_FR = ['D', 'L', 'M', 'M', 'J', 'V', 'S'];\r\nexport const WEEK_DAYS_DE = ['S', 'M', 'D', 'M', 'D', 'F', 'S'];\r\nexport const WEEK_DAYS_IT = ['D', 'L', 'M', 'M', 'G', 'V', 'S'];\r\nexport const WEEK_DAYS_FR_CA = ['D', 'L', 'M', 'M', 'J', 'V', 'S'];\r\nexport const WEEK_DAYS_ES_ES = ['L', 'M', 'M', 'J', 'V', 'S', 'S'];\r\nexport const WEEK_DAYS_ES_MX = ['L', 'M', 'M', 'J', 'V', 'S', 'S'];\r\n\r\nexport const WEEK_DAYS_LANGUAGE_MAPPING = {\r\n 'en-us': WEEK_DAYS_EN,\r\n 'fr-fr': WEEK_DAYS_FR,\r\n 'de-de': WEEK_DAYS_DE,\r\n 'it-it': WEEK_DAYS_IT,\r\n 'fr-ca': WEEK_DAYS_FR_CA,\r\n 'es-es': WEEK_DAYS_ES_ES,\r\n 'es-mx': WEEK_DAYS_ES_MX,\r\n};\r\n","import { IComboBoxOption } from '@fluentui/react';\r\nimport { Account, getAppStore, getEntity, onPublisherChanged, Publisher } from '../../../../@data';\r\nimport { IFormEditParams } from '../../../../components/Form';\r\nimport { countryToLanguagesMap } from '../../../../config/countryToLanguageMapper.config';\r\nimport { LANGUAGES_LANGUAGE_MAPPING } from '../../../../globalization';\r\nimport { RoutePrefix } from '../../../../Routes';\r\nimport { IRouterWithIntl } from '../../../../utils';\r\nimport { RouteName } from '../store/store';\r\n\r\nexport async function setPublisherContext(publisher: Publisher, account?: Account) {\r\n const appStore = getAppStore();\r\n if (appStore.publisher === undefined || appStore.publisher.id !== publisher.id) {\r\n const publisherAsync = await getEntity<Publisher>([publisher], appStore.userContext);\r\n if (publisherAsync) {\r\n const changedPublisher = new Publisher(publisherAsync.id, publisherAsync.name);\r\n changedPublisher.publisherTier = publisherAsync.publisherTier;\r\n onPublisherChanged(changedPublisher);\r\n } else {\r\n onPublisherChanged(undefined);\r\n }\r\n }\r\n}\r\n\r\nexport function createReturnUrl(entity: RouteName, publisherId?: string): string {\r\n let returnUrl = `/${RoutePrefix.partnerManagement}/${RouteName[entity]}`;\r\n\r\n if (publisherId) {\r\n returnUrl = `/${RoutePrefix.partnerManagement}/${publisherId}/${RouteName[entity]}`;\r\n }\r\n\r\n return returnUrl;\r\n}\r\n\r\nexport function createAccountAdLanguageDropDown(country: string | undefined, props: IRouterWithIntl<IFormEditParams>): IComboBoxOption[] {\r\n const availableLanguages: IComboBoxOption[] = [];\r\n const languageSet: Set<string> = new Set();\r\n const LANGUAGES = LANGUAGES_LANGUAGE_MAPPING[getAppStore().locale];\r\n\r\n if (country) {\r\n countryToLanguagesMap[country].forEach((languageCode) => {\r\n if (LANGUAGES[languageCode]) {\r\n languageSet.add(languageCode);\r\n }\r\n });\r\n }\r\n languageSet.forEach((language) => {\r\n availableLanguages!.push({\r\n key: language,\r\n text: LANGUAGES[language],\r\n });\r\n });\r\n availableLanguages.sort((a, b) => {\r\n const firstValue = a.text;\r\n const secondValue = b.text;\r\n\r\n return firstValue.toLowerCase() > secondValue.toLowerCase() ? 1 : -1;\r\n });\r\n return availableLanguages;\r\n}\r\n","import { InjectedIntl } from 'react-intl';\r\nimport { action } from 'satcheljs';\r\nimport { RouteName } from '../store/store';\r\n\r\nexport const onCurrentRouteChanged = action(\r\n 'onCurrentRouteChanged',\r\n (currentRoute: RouteName, formatMessage?: InjectedIntl['formatMessage']) => ({ currentRoute, formatMessage })\r\n);\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onReportLinkClicked = action('onReportLinkClicked');\r\n","import { action } from 'satcheljs';\r\nimport { Publisher } from '../../../../@data';\r\n\r\nexport const onSetPublisherReporting = action('onSetPublisherReporting', (publisher: Publisher) => ({ publisher }));\r\n\r\nexport const onReportingEnabled = action('onSetPublisherReporting', (isEnabled: boolean) => ({ isEnabled }));\r\n","import { array } from 'yup';\r\n\r\n/**\r\n * Schema which transforms a Mobx observable array to normal for validation.\r\n */\r\nexport class ArrayObservableSchemaYupType extends array {\r\n constructor() {\r\n super();\r\n\r\n this.withMutation(() => {\r\n this.transform(function(value, originalvalue) {\r\n if (this.isType(value)) {\r\n return value;\r\n }\r\n\r\n // const array = new Array(originalvalue.length);\r\n return [...originalvalue];\r\n });\r\n });\r\n }\r\n}\r\n","import { array } from 'yup';\r\n\r\n/**\r\n * Schema which transform a string into an array string.\r\n */\r\nexport class StringListSchemaYupType extends array {\r\n constructor() {\r\n super();\r\n\r\n this.withMutation(() => {\r\n this.transform(function(value, originalvalue) {\r\n if (this.isType(value)) {\r\n return value;\r\n }\r\n\r\n const strs = originalvalue.split('\\n');\r\n return strs.filter(i => i !== '');\r\n });\r\n });\r\n }\r\n}\r\n","import { array } from 'yup';\r\nimport { stringToList } from '../StringUtils';\r\n\r\n/**\r\n * Schema which transform a ',' or '\\n' separated string\r\n * into an array string.\r\n */\r\nexport class StringListTransformerYupType extends array {\r\n constructor() {\r\n super();\r\n\r\n this.withMutation(() => {\r\n this.transform(function(value, originalvalue) {\r\n if (this.isType(value)) {\r\n return value;\r\n }\r\n\r\n return stringToList(originalvalue);\r\n });\r\n });\r\n }\r\n}","import { ObjectSchema, Shape } from 'yup';\r\n\r\n/**\r\n * Cleans up the path by normalizing to the its root attribute.\r\n * @param path the json path error\r\n */\r\nfunction normalizePath(path: string) {\r\n return path.replace(/(\\w+)(\\[\\w+\\])*/, '$1');\r\n}\r\n/**\r\n * Validates the values for the given schema and throws errors in an object accordingly.\r\n *\r\n * @param schema The Yup validation Schema\r\n * @param values The values to validate\r\n */\r\nexport function validateSchema(schema: ObjectSchema<Shape<{}, Object>>, values: Object) {\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n await schema.validate(values, {\r\n abortEarly: false,\r\n stripUnknown: true\r\n });\r\n resolve(true);\r\n } catch (e) {\r\n reject(\r\n e.inner &&\r\n e.inner.reduce(\r\n (errors, error) => ({\r\n ...errors,\r\n [normalizePath(error.path)]: error.errors[0]\r\n }),\r\n {}\r\n )\r\n );\r\n }\r\n });\r\n}\r\n","import { InjectedIntlProps } from 'react-intl';\r\n\r\nexport interface IEstimatedEarningsProps extends InjectedIntlProps {\r\n defaultChartType: EstimatedEarningsChartTypes;\r\n defaultChartGrain: ChartGrain;\r\n}\r\n\r\nexport enum EstimatedEarningsChartTypes {\r\n VERTICAL_BAR = 'vertical_bar',\r\n LINE = 'line',\r\n}\r\nexport enum ChartGrain {\r\n MONTHLY = 'monthly',\r\n YEARLY = 'yearly',\r\n}\r\n","export * from './store/schema';\r\nexport * from './store/store';\r\n","import { action } from 'satcheljs';\r\nimport { LifeCycleStatus, Model } from '../../../../@data';\r\nimport { DownloadOption, IGridV2Column } from '../../GridV2.types';\r\n\r\nexport const onDownloadButtonClicked = action(\r\n 'onDownloadButtonClicked',\r\n (formatMessage, data: Model[], csvFileName: string, columns?: IGridV2Column[], downloadType?: DownloadOption) => ({\r\n formatMessage,\r\n data,\r\n csvFileName,\r\n columns,\r\n downloadType,\r\n })\r\n);\r\n\r\nexport const onChangeItemsStatus = action(\r\n 'onChangeItemsStatus',\r\n (\r\n selectedItems: Model[],\r\n status: LifeCycleStatus,\r\n data: Model[],\r\n formatMessage: (\r\n messageDescriptor: ReactIntl.FormattedMessage.MessageDescriptor,\r\n values?:\r\n | {\r\n [key: string]: ReactIntl.MessageValue;\r\n }\r\n | undefined\r\n ) => string,\r\n setData?: (data?: Model[]) => void,\r\n onItemsStatusChanged?: (items: Model[], status: LifeCycleStatus) => void\r\n ) => ({\r\n selectedItems,\r\n status,\r\n formatMessage,\r\n setData,\r\n data,\r\n onItemsStatusChanged,\r\n })\r\n);\r\n\r\nexport const onDeleteItem = action(\r\n 'onDeleteItem',\r\n (\r\n selectedItem: Model,\r\n data: Model[],\r\n formatMessage: (\r\n messageDescriptor: ReactIntl.FormattedMessage.MessageDescriptor,\r\n values?:\r\n | {\r\n [key: string]: ReactIntl.MessageValue;\r\n }\r\n | undefined\r\n ) => string,\r\n setData?: (data?: Model[]) => void,\r\n preDeleteAction?: (items: Model[]) => void,\r\n deleteAction?: (items: Model[]) => void,\r\n postDeleteAction?: (items: Model[]) => void\r\n ) => ({\r\n selectedItem,\r\n setData,\r\n data,\r\n formatMessage,\r\n preDeleteAction,\r\n deleteAction,\r\n postDeleteAction,\r\n })\r\n);\r\n\r\nexport const onDuplicateItem = action(\r\n 'onDuplicateItem',\r\n (\r\n selectedItem: Model,\r\n data: Model[],\r\n formatMessage: (\r\n messageDescriptor: ReactIntl.FormattedMessage.MessageDescriptor,\r\n values?:\r\n | {\r\n [key: string]: ReactIntl.MessageValue;\r\n }\r\n | undefined\r\n ) => string,\r\n setData?: (data?: Model[]) => void,\r\n onDuplicateAction?: (items: Model[]) => void\r\n ) => ({\r\n selectedItem,\r\n data,\r\n formatMessage,\r\n setData,\r\n onDuplicateAction,\r\n })\r\n);\r\n","import { Model } from './Model';\r\n\r\nexport class AdSenseMediation extends Model {\r\n public apiPath = 'preauth/mediation';\r\n public className = 'preauth/mediation';\r\n public toggle?: boolean;\r\n public email?: string;\r\n public oAuthConnectionStatus?: string;\r\n public oauthFailureReasons?: OAuthFailureReason[];\r\n public mediationStatus?: boolean;\r\n public connectedTimeStamp?: Date;\r\n public userImageUri?: string;\r\n}\r\n\r\nexport class AdSenseMediationToggle extends AdSenseMediation {\r\n public apiPath = 'preauth/mediation';\r\n public className = 'oauth';\r\n}\r\n\r\nexport class AdSenseMediationHealthCheck extends AdSenseMediation {\r\n public apiPath = 'preauth/mediation';\r\n public className = 'oauth';\r\n}\r\n\r\nexport class AdSenseMediationChooseGamNetwork extends AdSenseMediation {\r\n public apiPath = 'preauth/mediation';\r\n public className = 'oauth';\r\n}\r\n\r\nexport class AdSenseMediationOptIn extends AdSenseMediation {\r\n public apiPath = 'preauth/mediation';\r\n}\r\n\r\nexport class AdSenseMediationOptOut extends AdSenseMediation {\r\n public apiPath = 'preauth/mediation';\r\n}\r\n\r\nexport class OAuthFailureReason {\r\n public errorCode: string;\r\n public description: string;\r\n public gamNetworkDetails?: { id: string; displayName: string }[];\r\n}\r\n","import { getAppStore, isPublisherRejectionUnappealable, isPublisherUnderReview } from '../../../../../@data';\r\nimport { getProfileStore } from './store';\r\n\r\nexport function getPublisherProfileRawData() {\r\n return getAppStore().publisher;\r\n}\r\n\r\nexport function getPublisherProfileActiveData() {\r\n return getProfileStore().active;\r\n}\r\n\r\nexport function getProfileErrors() {\r\n return getProfileStore().errors;\r\n}\r\n\r\nexport function getPrimaryUserRawData() {\r\n return getProfileStore().raw.primaryUser;\r\n}\r\n\r\nexport function getPrimaryUserFullName() {\r\n const { name } = getPrimaryUserRawData() || {};\r\n if (!name) {\r\n return '';\r\n }\r\n\r\n return `${name?.firstName} ${name?.lastName}`;\r\n}\r\n\r\nexport function getPrimaryUserActiveData() {\r\n return getPublisherProfileActiveData().user;\r\n}\r\n\r\nexport function getPublisherActiveData() {\r\n return getPublisherProfileActiveData().publisher;\r\n}\r\n\r\nexport function isPrimaryUserDataPresent() {\r\n return !!getPrimaryUserRawData();\r\n}\r\n\r\nexport function isProfileEditable() {\r\n if (isPublisherUnderReview()) {\r\n return false;\r\n }\r\n if (isPublisherRejectionUnappealable()) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function getProfileActiveData() {\r\n return getProfileStore().active;\r\n}\r\n\r\nexport function isProfileInEditMode() {\r\n return !!getProfileActiveData().isInEditMode;\r\n}\r\n\r\nexport function isProfileSubmitted() {\r\n return !!getProfileActiveData().isSubmitted;\r\n}\r\n\r\nexport function isPreviewShown() {\r\n return !!getProfileActiveData().isPreviewShown;\r\n}\r\n\r\nexport function isPhoneVerificationMethodsShown() {\r\n return !!getProfileActiveData().isPhoneVerificationMethodsShown;\r\n}\r\n\r\nexport function isVerificationCodeDialogShown() {\r\n return !!getProfileActiveData().isPhoneVerificationCodeShown;\r\n}\r\n\r\nexport function isVerificationSuccessShown() {\r\n return !!getProfileActiveData().isVerificationSuccess;\r\n}\r\nexport function isCodeBeingVerified() {\r\n return !!getProfileActiveData().isCodeBeingVerified;\r\n}\r\n\r\nexport function isVerificationCodeGenerationLimitReached() {\r\n return !!getProfileActiveData().verificationCodeGenerationLimitReached;\r\n}\r\n","export function setDataInURL<T>(queryKey: string, data: T) {\r\n const currentSearchQuery = window.location.search;\r\n const searchQuery = new URLSearchParams(currentSearchQuery);\r\n searchQuery.set(queryKey, JSON.stringify(data));\r\n window.history.replaceState('', '', `?${searchQuery}`);\r\n}\r\nexport function getDataFromURL<T>(queryKey: string): T | null {\r\n try {\r\n const currentSearchQuery = window.location.search;\r\n const searchQuery = new URLSearchParams(currentSearchQuery);\r\n return JSON.parse(searchQuery.get(queryKey) || '') as T;\r\n } catch (e) {\r\n return null;\r\n }\r\n}\r\nexport function hasDataInURL(queryKey: string): boolean {\r\n const currentSearchQuery = window.location.search;\r\n const searchQuery = new URLSearchParams(currentSearchQuery);\r\n return searchQuery.has(queryKey);\r\n}\r\n","import { RedirectRequest } from '@azure/msal-browser';\r\nimport { action } from 'satcheljs';\r\n\r\nexport const onPubCenterAADLogin = action('onPubCenterAADLogin', (requestParams?: Partial<RedirectRequest>) => ({ requestParams }));\r\n","import { action, mutatorAction } from 'satcheljs';\r\nimport { getLoginPageStore } from '..';\r\nimport { IStringDictionary } from '../../../../@data';\r\n\r\nexport const onEmailChanged = mutatorAction('onEmailChanged', (email: string) => {\r\n getLoginPageStore().active.email = email;\r\n});\r\n\r\nexport const onErrorsChanged = mutatorAction('onErrorsChanged', (errors?: IStringDictionary) => {\r\n getLoginPageStore().errors = errors || {};\r\n});\r\n\r\nexport const onLoginButtonClicked = action('onLoginButtonClicked');\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onAuthPageInitialized = action('onAuthPageInitialized', (loginHint?: string) => ({ loginHint }));\r\nexport const onLoadingSet = action('onLoadingSet', (value?: boolean) => ({ value }));\r\nexport const onSwitchAccount = action('onSwitchAccount');\r\n","export enum ReportsQueryStoreKeys {\r\n DATE_RANGE = 'date-range',\r\n DATE_RANGE_TYPE = 'date-range-type',\r\n CHART_GRAIN = 'chart-grain',\r\n CHART_TYPE = 'chart-type',\r\n FILTERS = 'filters',\r\n BREAKDOWN = 'breakdown',\r\n}\r\n","export class AdSenseAdUnitStatus {\r\n public apiPath = 'preauth/mediation';\r\n public className = 'getAdUnitMediationStatus';\r\n public pubcenterAdUnitIds?: number[];\r\n public pubcenterAdUnitId?: number;\r\n public adSenseAdUnitId?: number;\r\n public mediationStatus?: boolean;\r\n}\r\n\r\nexport class AdSenseConnectAdUnit extends AdSenseAdUnitStatus {\r\n public apiPath = 'preauth/mediation';\r\n public className = 'pubcenterAdUnitsIds';\r\n}\r\n\r\nexport class AdSenseDisconnectAdUnit extends AdSenseAdUnitStatus {\r\n public apiPath = 'preauth/mediation';\r\n public className = 'pubcenterAdUnitsIds';\r\n}\r\n\r\nexport class AdSenseUpdateAdUnitStatus extends AdSenseAdUnitStatus {\r\n public apiPath = 'preauth/mediation';\r\n public className = 'pubcenterAdUnitsIds';\r\n}","import {\r\n DATE_RANGE_PICKER_PRESET_CUSTOM,\r\n DATE_RANGE_PICKER_PRESET_LAST_7_DAYS,\r\n DATE_RANGE_PICKER_PRESET_LAST_WEEK_SUN_SAT,\r\n DATE_RANGE_PICKER_PRESET_THIS_WEEK_MON_TODAY,\r\n DATE_RANGE_PICKER_PRESET_THIS_WEEK_SUN_TODAY,\r\n DATE_RANGE_PICKER_PRESET_TODAY,\r\n DATE_RANGE_PICKER_PRESET_YESTERDAY,\r\n} from '../../../../../constants/DataTestIdConstants';\r\nimport messages from '../CustomCalender.messages';\r\nimport { IDateElements, IDay, RangeType, RangeTypeMessage } from '../CustomCalender.types';\r\n\r\nexport const getDatesInRange = (startDate: Date, endDate: Date): Date[] => {\r\n const dateArray: Date[] = [];\r\n let currentDate = new Date(startDate);\r\n while (currentDate <= endDate) {\r\n dateArray.push(new Date(currentDate));\r\n currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate() + 1, 0, 0, 0);\r\n }\r\n return dateArray;\r\n};\r\n\r\nexport const isDayInFuture = (day: IDateElements): boolean => {\r\n return new Date(day.year, day.month, day.day) > new Date();\r\n};\r\n\r\nexport const getToday = (): Date[] => {\r\n return [new Date(), new Date()];\r\n};\r\n\r\nexport const getYesterday = (): Date[] => {\r\n const date = new Date();\r\n date.setDate(date.getDate() - 1);\r\n\r\n return [date, date];\r\n};\r\n\r\nexport const getSundayToToday = (): Date[] => {\r\n const today = new Date();\r\n const sunday = new Date(today.getFullYear(), today.getMonth(), today.getDate() - today.getDay());\r\n\r\n return getDatesInRange(sunday, today);\r\n};\r\n\r\nexport const getMondayToToday = (): Date[] => {\r\n const today = new Date();\r\n const mondayOffset = today.getDay() === 0 ? 6 : today.getDay() - 1;\r\n const monday = new Date(today.getFullYear(), today.getMonth(), today.getDate() - mondayOffset);\r\n\r\n return getDatesInRange(monday, today);\r\n};\r\n\r\nexport const get7DaysExcludingToday = (): Date[] => {\r\n const today = new Date();\r\n const sevenDaysLater = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 7);\r\n const yesterday = new Date();\r\n yesterday.setDate(yesterday.getDate() - 1);\r\n\r\n return getDatesInRange(sevenDaysLater, yesterday);\r\n};\r\n\r\nexport const getLastSundayToSaturday = (): Date[] => {\r\n const today = new Date();\r\n const lastSunday = new Date(today.getFullYear(), today.getMonth(), today.getDate() - today.getDay() - 7);\r\n const lastSaturday = new Date(today.getFullYear(), today.getMonth(), today.getDate() - today.getDay() - 1);\r\n\r\n return getDatesInRange(lastSunday, lastSaturday);\r\n};\r\n\r\nexport const getSelectedPeriodLabel = (type: RangeType, formatMessage) => {\r\n return `${formatMessage(messages[RangeTypeMessage[Object.keys(RangeType)[Object.values(RangeType).indexOf(type)]]])}: `;\r\n};\r\n\r\nexport const getSelectedStartingDate = (range: Date[], locale: string) => {\r\n const options: Intl.DateTimeFormatOptions = {};\r\n options.day = 'numeric';\r\n options.month = 'short';\r\n\r\n return range[0].toLocaleDateString(locale, options);\r\n};\r\n\r\nexport const getSelectedEndingDate = (range: Date[], locale: string) => {\r\n const options: Intl.DateTimeFormatOptions = {};\r\n options.day = 'numeric';\r\n options.month = 'short';\r\n const endDate = range.length - 1;\r\n if (range[0].getTime() === range[endDate].getTime()) {\r\n return;\r\n }\r\n\r\n return ` - ${range[endDate].toLocaleDateString(locale, options)}`;\r\n};\r\n\r\nexport const getMonthlyCalendar = (year: number, month: number): IDay[] => {\r\n month = month >= 12 ? 0 : month;\r\n const calender: IDay[] = [];\r\n\r\n const prevMonth = month >= 0 ? month - 1 : 11;\r\n const prevYear = month >= 0 ? year : year - 1;\r\n\r\n // Determine the number of days in the previous month\r\n const prevMonthDays = new Date(prevYear, prevMonth + 1, 0).getDate();\r\n\r\n // Determine the number of days in the current month\r\n const currentMonthDays = new Date(year, month + 1, 0).getDate();\r\n\r\n // Determine the starting day of the current month (0 is Sunday, 6 is Saturday)\r\n const firstDay = new Date(year, month, 1).getDay();\r\n\r\n // Determine the total number of days needed to fill the calendar (should be 42)\r\n const totalDays = 42;\r\n\r\n // Determine the starting day for the calendar\r\n const day = prevMonthDays - firstDay + 1;\r\n\r\n // Loop through all of the days needed to fill the calendar from the previous month\r\n for (let index = day; index <= prevMonthDays; index++) {\r\n calender.push({\r\n day: index,\r\n isInCurrentMonth: false,\r\n fullDay: { day: index, month: prevMonth, year: prevYear },\r\n });\r\n }\r\n\r\n // Loop through all of the days needed to fill the calendar from the current month\r\n for (let index = 1; index <= currentMonthDays; index++) {\r\n calender.push({ day: index, isInCurrentMonth: true, fullDay: { day: index, month: month, year: prevYear } });\r\n }\r\n\r\n // Loop through all of the days needed to fill the calendar from the next month\r\n for (let index = calender.length; index < totalDays; index++) {\r\n const dayInNextMonth = index - (firstDay + currentMonthDays) + 1;\r\n const nextMonth = month + 1 >= 12 ? 0 : month + 1;\r\n const nextMonthYear = month + 1 >= 12 ? prevYear + 1 : prevYear;\r\n\r\n calender.push({\r\n day: index - (firstDay + currentMonthDays) + 1,\r\n isInCurrentMonth: false,\r\n fullDay: { day: dayInNextMonth, month: nextMonth, year: nextMonthYear },\r\n });\r\n }\r\n\r\n return calender;\r\n};\r\n\r\nexport const getPresetDataTestId = (preset: RangeType) => {\r\n switch (preset) {\r\n case RangeType.Today:\r\n return DATE_RANGE_PICKER_PRESET_TODAY;\r\n case RangeType.Yesterday:\r\n return DATE_RANGE_PICKER_PRESET_YESTERDAY;\r\n case RangeType.SundayToday:\r\n return DATE_RANGE_PICKER_PRESET_THIS_WEEK_SUN_TODAY;\r\n case RangeType.MondayToday:\r\n return DATE_RANGE_PICKER_PRESET_THIS_WEEK_MON_TODAY;\r\n case RangeType.Last7ExcludingToday:\r\n return DATE_RANGE_PICKER_PRESET_LAST_7_DAYS;\r\n case RangeType.Last7FromSunToSat:\r\n return DATE_RANGE_PICKER_PRESET_LAST_WEEK_SUN_SAT;\r\n case RangeType.Custom:\r\n return DATE_RANGE_PICKER_PRESET_CUSTOM;\r\n }\r\n};\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onInitializeGoogleAccount = action(\r\n 'onInitializeGoogleAccount',\r\n (showLoadingSpinner?: boolean, showNotifications?: boolean, onFinished?: () => void) => ({\r\n showLoadingSpinner,\r\n showNotifications,\r\n onFinished,\r\n })\r\n);\r\n\r\nexport const onMediateGoogleAccount = action(\r\n 'onMediateGoogleAccount',\r\n (\r\n mediate: boolean,\r\n formatMessage: (\r\n messageDescriptor: ReactIntl.FormattedMessage.MessageDescriptor,\r\n values?:\r\n | {\r\n [key: string]: ReactIntl.MessageValue;\r\n }\r\n | undefined\r\n ) => string\r\n ) => ({ mediate, formatMessage })\r\n);\r\n\r\nexport const onConnectGoogleAccount = action('onConnectGoogleAccount', (code: string) => ({ code }));\r\n\r\nexport const onDisconnectGoogleAccount = action('onDisconnectGoogleAccount');\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../theme';\r\nimport { ICommonStyleProps } from '../../types';\r\n\r\ntype StyleProperties = 'gridContainer';\r\n\r\ntype GridPageLayoutStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): GridPageLayoutStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { spacing } = theme;\r\n const { withSubHeader } = props;\r\n\r\n return mergeStyleSets({\r\n gridContainer: {\r\n marginLeft: spacing.size32,\r\n marginTop: withSubHeader ? 0 : spacing.size32,\r\n marginRight: spacing.size32,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: 'inherit',\r\n flex: 1,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props: PropType): GridPageLayoutStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import React, { useEffect } from 'react';\r\nimport { LayoutMode, onLayoutChanged } from '../../@data';\r\nimport { getClassNames } from './GridPageLayout.styles';\r\n\r\nexport interface IGridPageLayoutProps {\r\n children?: JSX.Element[] | JSX.Element;\r\n withSubHeader?: boolean;\r\n}\r\n\r\nexport const GridPageLayout = function GridPageLayoutComponent(props: IGridPageLayoutProps) {\r\n const { gridContainer } = getClassNames({ withSubHeader: props.withSubHeader });\r\n\r\n useEffect(() => {\r\n onLayoutChanged(LayoutMode.Default);\r\n // eslint-disable-next-line\r\n }, []);\r\n\r\n return <div className={gridContainer}>{props.children}</div>;\r\n};\r\n","import { getAccountStatusData } from './accountStatusStore';\r\nimport { getPaymentsPageData } from './paymentsPageStore';\r\n\r\nexport function getPaymentsPageBalance() {\r\n return getPaymentsPageData().balance;\r\n}\r\n\r\nexport function getPaymentsPageEstimatedEarnings() {\r\n return getPaymentsPageData().estimatedEarnings;\r\n}\r\n\r\nexport const getAccountStatus = () => getAccountStatusData().status;\r\n\r\nexport const getAccountStatusIsLoading = () => getAccountStatusData().isLoading;\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n accountSettings: {\r\n id: 'settingsPage.accountSettings',\r\n defaultMessage: 'Account settings',\r\n },\r\n userSettings: {\r\n id: 'settingsPage.userSettings',\r\n defaultMessage: 'Profile settings',\r\n },\r\n publisherPreferencesFailed: {\r\n id: 'publisherPreferences.failed',\r\n defaultMessage: 'We’re unable to access your publisher preferences at this time. Please try again later.',\r\n },\r\n userPreferencesFailed: {\r\n id: 'userPreferences.failed',\r\n defaultMessage: 'We’re unable to access your user preferences at this time. Please try again later.',\r\n },\r\n notificationPreferencesFailed: {\r\n id: 'notificationPreferences.failed',\r\n defaultMessage: 'We’re unable to update your notification preferences. Please try again later.',\r\n },\r\n deletingUserSuccess: {\r\n id: 'userManagement.deletingUserSuccess',\r\n defaultMessage: 'Successfully deleted the user - {name}',\r\n },\r\n updatedNotificationPreferencesSuccessfully: {\r\n id: 'notificationPreferences.updatedSuccessfully',\r\n defaultMessage: 'Updated notification preferences successfully',\r\n },\r\n deletedPublisherSuccess: {\r\n id: 'userManagement.deletedPublisherSuccess',\r\n defaultMessage: 'Successfully deleted the publisher - {name}',\r\n },\r\n invalidStateLoginOrReport: {\r\n id: 'userManagement.invalidStateReLoginOrReport',\r\n defaultMessage: 'You have arrived in an invalid state, please re-login or report if issue persists.',\r\n },\r\n});\r\n","import {\r\n AccountPaymentOptionDataResponse,\r\n AccountSkuDataResponse,\r\n ApiError,\r\n getAppStore,\r\n handleApiErrors,\r\n handleError,\r\n ISubGeography,\r\n LocaleDataResponse,\r\n MarketDataResponse,\r\n ServiceLevel,\r\n serviceLevelNameIdMap,\r\n} from '..';\r\nimport { uiConfig } from '../../config/ui.config';\r\nimport { IMarket, StateOrProvinceDataResponse } from '../store/schema';\r\nimport { AdUnitTaxonomy } from '../store/schema/models/AdUnitTaxonomy';\r\nimport { AdUnitTaxonomyDataResponse } from '../store/schema/models/AdUnitTaxonomyDataResponse';\r\nimport { CountryDataResponse } from '../store/schema/models/CountryDataResponse';\r\nimport { LanguageDataResponse } from '../store/schema/models/LanguageDataResponse';\r\nimport { TimezoneDataResponse } from '../store/schema/models/TimezoneDataResponse';\r\nimport { buildRequestHeadersWithAuthToken } from '../utils/requestUtils';\r\n\r\nexport const baseAddress = uiConfig.getMetadataApiBaseAddress();\r\nexport const customerMetadataBaseAddress = uiConfig.getCustomerMetadataApiBaseAddress();\r\nexport const adUnitMetadataApiBaseAddress = uiConfig.getAdUnitMetadataApiBaseAddress();\r\nexport const languageKey = '_languages';\r\nexport const timezoneKey = '_timezones';\r\nexport const localeKey = '_locales';\r\nexport const countryKey = '_countriesData';\r\nexport const marketKey = '_markets';\r\nexport const adUnitTaxonomyKey = '_taxonomyValues';\r\n\r\nasync function fetchResources<ApiResponseType, ReturnType>(\r\n url: string,\r\n responseDataProcessor: (data: ApiResponseType) => ReturnType,\r\n onResponse?: (data: ApiResponseType) => void\r\n): Promise<ReturnType> {\r\n const { userContext } = getAppStore();\r\n const headers = await buildRequestHeadersWithAuthToken(url, userContext);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n });\r\n\r\n if (!response.ok) {\r\n return handleApiErrors(response, url);\r\n }\r\n\r\n const responseJson: ApiResponseType = await response.json();\r\n onResponse?.(responseJson);\r\n\r\n return responseDataProcessor(responseJson);\r\n } catch (err) {\r\n const error = `Data fetch operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nasync function fetchResourcesWithLocalStorageCache<ApiResponseType, ReturnType>(\r\n url: string,\r\n resourceCacheKey: string,\r\n responseDataProcessor: (data: ApiResponseType) => ReturnType\r\n): Promise<ReturnType> {\r\n const supportedResourcesFromCache = localStorage.getItem(resourceCacheKey);\r\n if (supportedResourcesFromCache === null) {\r\n return fetchResources(url, responseDataProcessor, (data) => {\r\n localStorage.setItem(resourceCacheKey, JSON.stringify(data));\r\n });\r\n } else {\r\n return responseDataProcessor(JSON.parse(supportedResourcesFromCache));\r\n }\r\n}\r\n\r\nexport async function getSupportedLanguages(): Promise<string[]> {\r\n const url = `${baseAddress}${encodeURIComponent('supportedLanguages')}`;\r\n return fetchResourcesWithLocalStorageCache<LanguageDataResponse, string[]>(url, languageKey, getLanguages);\r\n}\r\n\r\n// TODO: This is not used anywhere. Please remove it.\r\nexport async function getAvailableAllowedMarkets(): Promise<IMarket[]> {\r\n const url = `${customerMetadataBaseAddress}${encodeURIComponent('markets')}`;\r\n return fetchResourcesWithLocalStorageCache<MarketDataResponse, IMarket[]>(url, marketKey, getMarkets);\r\n}\r\n\r\nexport async function getSupportedCountries(serviceLevel?: ServiceLevel): Promise<string[]> {\r\n const url = `${baseAddress}${encodeURIComponent('supportedCountries')}`;\r\n return fetchResourcesWithLocalStorageCache<CountryDataResponse, string[]>(url, countryKey, getCountriesWithServiceLevel(serviceLevel));\r\n}\r\n\r\nexport async function getSupportedSubGeographies(countryCode: string): Promise<ISubGeography[]> {\r\n const url = `${baseAddress}${encodeURIComponent('supportedSubGeographies')}?countryCode=${countryCode}`;\r\n return fetchResources<StateOrProvinceDataResponse, ISubGeography[]>(url, (stateData) => stateData.data.subGeographyList);\r\n}\r\n\r\nexport async function getSupportedTimezones(): Promise<number[]> {\r\n const url = `${baseAddress}${encodeURIComponent('supportedTimezones')}`;\r\n return fetchResourcesWithLocalStorageCache<TimezoneDataResponse, number[]>(url, timezoneKey, getTimezones);\r\n}\r\n\r\nexport async function getSupportedAccountSkus(): Promise<string[]> {\r\n const url = `${baseAddress}${encodeURIComponent('supportedAccountSkus')}`;\r\n return fetchResources<AccountSkuDataResponse, string[]>(url, (skuData) => skuData.data.accountSKUs);\r\n}\r\n\r\nexport async function getSupportedAccountPaymentOptions(): Promise<Map<number, string>> {\r\n const url = `${baseAddress}${encodeURIComponent('supportedPaymentOptions')}`;\r\n return fetchResources<AccountPaymentOptionDataResponse, Map<number, string>>(\r\n url,\r\n (paymentOptionData) => paymentOptionData.data.paymentOptionData\r\n );\r\n}\r\n\r\n// TODO: This is not used anywhere, we can remove it.\r\nexport async function getSupportedLocales(): Promise<string[]> {\r\n const url = `${baseAddress}${encodeURIComponent('supportedLocales')}`;\r\n return fetchResourcesWithLocalStorageCache<LocaleDataResponse, string[]>(url, localeKey, getLocales);\r\n}\r\n\r\nexport async function getAdUnitTaxonomyValues(): Promise<AdUnitTaxonomy[]> {\r\n const url = `${adUnitMetadataApiBaseAddress}${encodeURI('attributes/taxonomy/values')}`;\r\n return fetchResourcesWithLocalStorageCache<AdUnitTaxonomyDataResponse, AdUnitTaxonomy[]>(url, adUnitTaxonomyKey, getTaxonomyValues);\r\n}\r\n\r\nfunction getCountriesWithServiceLevel(serviceLevel?: ServiceLevel) {\r\n return function (countriesData: CountryDataResponse) {\r\n return getCountries(countriesData, serviceLevel);\r\n };\r\n}\r\n\r\nfunction getCountries(countriesData: CountryDataResponse, serviceLevel?: ServiceLevel): string[] {\r\n const countriesJson = countriesData.data.countries;\r\n const countryCodes: string[] = [];\r\n if (serviceLevel) {\r\n countriesJson.forEach((country) => {\r\n Object.keys(country.serviceLevels).forEach((serviceLevelKey) => {\r\n country.serviceLevels[serviceLevelKey].forEach((serviceLevelValue) => {\r\n if (serviceLevelValue === serviceLevelNameIdMap[serviceLevel]) {\r\n countryCodes.push(country.code);\r\n }\r\n });\r\n });\r\n });\r\n } else {\r\n countriesJson.forEach((country) => {\r\n countryCodes.push(country.code);\r\n });\r\n }\r\n return countryCodes;\r\n}\r\n\r\nfunction getTimezones(timezoneJson: TimezoneDataResponse): number[] {\r\n const timezones: number[] = [];\r\n const timezoneData = timezoneJson.data.timeZoneData;\r\n\r\n Object.keys(timezoneData).forEach((timezoneCode) => {\r\n timezones.push(parseInt(timezoneCode, 10));\r\n });\r\n\r\n return timezones;\r\n}\r\n\r\nfunction getLanguages(languageJson: LanguageDataResponse): string[] {\r\n const languages: string[] = [];\r\n const languageData = languageJson.data.languageData;\r\n\r\n Object.keys(languageData).forEach((languageCode) => {\r\n languages.push(languageData[languageCode]);\r\n });\r\n\r\n return languages;\r\n}\r\n\r\nfunction getMarkets(marketsJson: MarketDataResponse): IMarket[] {\r\n const markets: IMarket[] = [];\r\n marketsJson.data.searchMarkets.forEach((market) => {\r\n markets.push(market);\r\n });\r\n marketsJson.data.mobileSearchMarkets.forEach((market) => {\r\n markets.push(market);\r\n });\r\n return markets;\r\n}\r\n\r\nfunction getLocales(localeJson: LocaleDataResponse): string[] {\r\n const locales: string[] = [];\r\n const localeData = localeJson.data.localeData;\r\n\r\n Object.keys(localeData).forEach((localeCode) => {\r\n locales.push(localeData[localeCode]);\r\n });\r\n\r\n return locales;\r\n}\r\n\r\nfunction getTaxonomyValues(taxonomyJson: AdUnitTaxonomyDataResponse): AdUnitTaxonomy[] {\r\n const adUnitTaxonomyValues: AdUnitTaxonomy[] = [];\r\n taxonomyJson.data.attributeValues.forEach((taxonomy) => adUnitTaxonomyValues.push(taxonomy));\r\n return adUnitTaxonomyValues;\r\n}\r\n","/**\r\n * Each element of a domain name separated by [.] is called a “label.â€\r\n * The maximum length of each label is 63 characters, and a full domain name can have a maximum of 253 characters.\r\n * Alphanumeric characters and hyphens can be used in labels, but a domain name must not commence or end with a hyphen or dot.\r\n */\r\nexport const VALID_DOMAIN_REGEXP = '^([^-\\\\.][^:/?#=\\\\s\\\\.]+){1}(\\\\.([^:/?#=\\\\s\\\\.]+[^-\\\\.])){1,2}$';\r\n\r\nexport const DOMAIN_MAX_LENGTH = 253;\r\n\r\nexport function getCurrentHashValue(): string {\r\n return (window.location.hash || '').replace('#', '');\r\n}\r\n\r\nexport function isValidDomain(domain) {\r\n const urlRegexp = new RegExp(VALID_DOMAIN_REGEXP);\r\n return domain.length < DOMAIN_MAX_LENGTH && urlRegexp.test(domain);\r\n}\r\n\r\nexport function getUrlSearchParameter(urlQuery?: string, parameter?: string) {\r\n if (!urlQuery || !parameter) {\r\n return undefined;\r\n }\r\n const urlParams = new URLSearchParams(urlQuery.substring(1));\r\n return urlParams.get(parameter) || '';\r\n}\r\n\r\nexport const isLocationPubCenter = () => {\r\n return window.location.href.indexOf('pubcenter') > -1 || window.location.host === 'localhost:3000';\r\n};\r\n","export enum Environment {\r\n TEST = 'test',\r\n SI = 'staging',\r\n BCP = 'BCP',\r\n PROD = 'production',\r\n}\r\n","export const PAID_SEARCH = 'PS';\r\n\r\nexport const AUDIENCE_INTENT_MARKETPLACE = 'AIM';\r\n\r\nexport const TEXT_ADS = 'TA';\r\n\r\nexport const PAGE_ADS = 'PA';\r\n\r\nexport const TARGET_CUSTOMER_ID = 'targetCustomerId';\r\n\r\nexport const AGG_LEVEL_LISTING = 'listingid';\r\n\r\nexport const AGG_LEVEL_CREATIVE = 'uniquecreativeadid';\r\n\r\nexport const AD_PERFORMANCE_DATA = 'adPerformanceData';\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n resourceTitle: {\r\n id: 'resource.title',\r\n defaultMessage: 'Resources',\r\n },\r\n learnTitle: {\r\n id: 'resource.learnTitle',\r\n defaultMessage: 'Learn about monetizing your site.',\r\n },\r\n learnDescription: {\r\n id: 'resource.learnDescription',\r\n defaultMessage: 'Visit our documentation center.',\r\n },\r\n assistanceTitle: {\r\n id: 'resource.assistanceTitle',\r\n defaultMessage: 'Need additional assistance?',\r\n },\r\n assistanceDescription: {\r\n id: 'resource.assistanceDescription',\r\n defaultMessage: 'Contact Support',\r\n },\r\n improveTitle: {\r\n id: 'resource.improveTitle',\r\n defaultMessage: 'Help us improve {appName}',\r\n },\r\n improveDescription: {\r\n id: 'resource.improveDescription',\r\n defaultMessage: 'Share your thoughts and ideas',\r\n },\r\n feedbackTitle: {\r\n id: 'resource.feedbacktitle',\r\n defaultMessage: 'Feedback to {appName}',\r\n },\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n headLineGreeting: {\r\n id: 'TnC.Signature.HeadlineGreeting',\r\n defaultMessage: 'Dear Publisher,',\r\n },\r\n summary: {\r\n id: 'TnC.summary.content',\r\n defaultMessage:\r\n '{appName} has updated Terms and Conditions on {releaseDate}. Please accept the new terms in order to continue using {appName}.',\r\n },\r\n thanksMsg: {\r\n id: 'TnC.summary.thanksMsg',\r\n defaultMessage: 'Thank you,',\r\n },\r\n thanksMsgSubLine: {\r\n id: 'TnC.summary.thanksMsg.subline',\r\n defaultMessage: '{appName} Team',\r\n },\r\n ackMsg: {\r\n id: 'TnC.summary.ackMsg',\r\n defaultMessage: `Yes, I've read and accept the agreement`,\r\n },\r\n ackMsgSubline: {\r\n id: 'TnC.summary.ackMsg.subline',\r\n defaultMessage:\r\n 'You represent that you are an administrator for this Account and that you are authorized to act on behalf of, and bind to this Agreement, the owner of this Account.',\r\n },\r\n acceptButton: {\r\n id: 'TnC.action.accept',\r\n defaultMessage: 'Accept',\r\n },\r\n skipButton: {\r\n id: 'TnC.action.skip',\r\n defaultMessage: 'Skip for now',\r\n },\r\n submitting: {\r\n id: 'TnC.action.submitting',\r\n defaultMessage: 'Submitting...',\r\n },\r\n goToAccept: {\r\n id: 'TnC.notification.goToAccept',\r\n defaultMessage: 'Go to accept',\r\n },\r\n unknown: {\r\n id: 'TnC.notification.date.unknown',\r\n defaultMessage: 'Unknown',\r\n },\r\n twoWeekBuffer: {\r\n id: 'TnC.notification.date.twoWeekBuffer',\r\n defaultMessage: '2 weeks',\r\n },\r\n dayBuffer: {\r\n id: 'TnC.notification.date.dayBuffer',\r\n defaultMessage: '{buffer} day(s)',\r\n },\r\n tncNotificationContent: {\r\n id: 'Tnc.notification.content',\r\n defaultMessage:\r\n 'Accept our latest Terms and Conditions to continue using {appName}. {appName} has updated Terms and Conditions on {latestTnCReleaseDate}. Please accept within {buffer} or your account will be terminated.',\r\n },\r\n});\r\n","import { mutatorAction } from \"satcheljs\";\r\nimport { isEmpty } from \"../../../../../../../../utils\";\r\nimport { IGoogleAdSenseModel } from \"../store/schema/IGoogleAdSenseModel\";\r\nimport { getGoogleAdSenseStore } from \"../store/store\";\r\n\r\nexport const onChangeConnection = mutatorAction('onChangeConnection', (connection: IGoogleAdSenseModel) => {\r\n getGoogleAdSenseStore().active = connection;\r\n});\r\n\r\nexport const onChangeMediationToggle = mutatorAction('onChangeMediationToggle', (isToggled: boolean) => {\r\n const { active} = getGoogleAdSenseStore();\r\n active.isMediationEnabled = isToggled;\r\n});\r\n\r\nexport const onChangeConnectionStatus = (msg) => {\r\n const { active} = getGoogleAdSenseStore();\r\n active.connectionStatus = msg.status;\r\n}\r\n\r\nexport const isPublisherConnectedWithAdSense = () => {\r\n const { active } = getGoogleAdSenseStore();\r\n if (active.email === undefined)\r\n {\r\n return false;\r\n }\r\n\r\n return isEmpty(active.email);\r\n}","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n feedback: {\r\n id: 'header.feedback',\r\n defaultMessage: 'Feedback to {appName}',\r\n },\r\n notifications: {\r\n id: 'header.notifications',\r\n defaultMessage: 'Notification Center',\r\n },\r\n settings: {\r\n id: 'header.settings',\r\n defaultMessage: 'Settings',\r\n },\r\n help: {\r\n id: 'header.help',\r\n defaultMessage: 'Help',\r\n },\r\n account: {\r\n id: 'header.account',\r\n defaultMessage: 'My account',\r\n },\r\n searchPlaceHolder: {\r\n id: 'globalSearch.placeHolder',\r\n defaultMessage: 'Search {appName}',\r\n },\r\n searchBoxAriaLabel: {\r\n id: 'globalSearch.SearchBoxAriaLabel',\r\n defaultMessage: 'Global search box',\r\n },\r\n searchResultListAriaLabel: {\r\n id: 'globalSearch.ResultListAriaLabel',\r\n defaultMessage: 'Global Search Results',\r\n },\r\n viewCategoryResult: {\r\n id: 'globalSearch.viewCategoryResults',\r\n defaultMessage: '{category} ({totalCount})',\r\n },\r\n viewAllResult: {\r\n id: 'globalSearch.viewAllResults',\r\n defaultMessage: 'View all results for {searchQuery}',\r\n },\r\n viewNoResult: {\r\n id: 'globalSearch.viewNoResult',\r\n defaultMessage: 'No results for {searchQuery}',\r\n },\r\n viewCategoryResultsAriaDescription: {\r\n id: 'globalSearch.viewCategoryResultsAriaDescription',\r\n defaultMessage: 'Click this to view more results for {categoryName}',\r\n },\r\n entityInfoButtonAriaDescription: {\r\n id: 'globalSearch.entityInfoButtonAriaDescription',\r\n defaultMessage: 'Click to view entity details',\r\n },\r\n footerAriaDescription: {\r\n id: 'globalSearch.footerAriaDescription',\r\n defaultMessage: 'Click to view all search results',\r\n },\r\n});\r\n","import { FontWeights, getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubCenterFonts, IPubcenterSpacing } from '../../../theme';\r\nimport { IPubcenterPalette } from './../../../theme';\r\nimport { ICardStyleProps, ICardStyles } from './Card.types';\r\n\r\n/**\r\n * Gives the default styles for the Card component.\r\n * @param props - Props used to generate the styles.\r\n * @returns - classnames for the Card component.\r\n */\r\nexport const getStyles = (props: ICardStyleProps): ICardStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const { size14 } = theme.fonts as IPubCenterFonts;\r\n\r\n // Reference: https://github.com/microsoft/fluentui/blob/master/packages/merge-styles/README.md#basic-usage\r\n return mergeStyleSets({\r\n rootStyle: {\r\n position: 'relative',\r\n borderRadius: '2px',\r\n boxShadow: '0px 1.6px 3.6px rgba(0, 0, 0, 0.132), 0px 0.3px 0.9px rgba(0, 0, 0, 0.108);',\r\n height: '100%',\r\n },\r\n titleStyle: {\r\n ...size14,\r\n fontWeight: FontWeights.semibold,\r\n margin: 0,\r\n },\r\n tooltipTitle: {\r\n display: 'flex',\r\n gap: '10px',\r\n },\r\n dismissButtonStyle: {\r\n zIndex: 1,\r\n position: 'absolute',\r\n top: '5px',\r\n right: '5px',\r\n color: palette.neutralSecondary,\r\n },\r\n bodyStyle: {\r\n padding: `${spacing.size8} ${spacing.size16}`,\r\n height: '100%',\r\n justifyContent: 'space-between',\r\n },\r\n titleBar: {\r\n padding: `${spacing.size8} ${spacing.size16}`,\r\n },\r\n footerStyle: {\r\n position: 'absolute',\r\n zIndex: 0,\r\n bottom: '0px',\r\n left: '0px',\r\n width: '100%',\r\n },\r\n footerWrapper: {\r\n marginTop: '40px',\r\n },\r\n imageStyle: {\r\n position: 'absolute',\r\n top: 0,\r\n right: 0,\r\n height: '100%',\r\n },\r\n });\r\n};\r\n\r\nexport const shimmerStyles = { root: { height: '100%' }, dataWrapper: { height: '100%' } };\r\n\r\nexport const getImageStyle = { height: '100%' };\r\n\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { getId, IconButton, IIconProps, Image, mergeStyleSets, Shimmer, Stack } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport appMessages from '../../App.messages';\r\nimport { IconTooltip } from '../IconTooltip/IconTooltip';\r\nimport { getClassNames, getImageStyle } from './Card.styles';\r\nimport { ICardProps } from './Card.types';\r\n\r\nconst closeIcon: IIconProps = { iconName: 'clear', styles: { root: { fontSize: 12 } } };\r\n\r\nexport const Card = injectIntl<ICardProps>(function CardComponent({\r\n titleText,\r\n onDismiss,\r\n showDismissButton,\r\n children,\r\n cardActions,\r\n styleProps,\r\n intl,\r\n cardTopBarActions,\r\n footerComponents,\r\n isDataLoaded = true,\r\n shimmerCustomElement,\r\n imageUrl,\r\n imageAlt,\r\n role,\r\n titleIconTooltipProps,\r\n}) {\r\n const { formatMessage } = intl;\r\n const {\r\n rootStyle,\r\n titleStyle,\r\n tooltipTitle,\r\n titleBar,\r\n bodyStyle,\r\n dismissButtonStyle,\r\n footerStyle,\r\n footerWrapper,\r\n imageStyle,\r\n } = mergeStyleSets(getClassNames({ imageUrl }), styleProps);\r\n const { close } = appMessages;\r\n const titleId = getId('cardTitle');\r\n\r\n const onDismissClick = (e) => {\r\n onDismiss?.(e);\r\n };\r\n return (\r\n <Stack verticalAlign=\"space-between\" role={role || 'region'} className={rootStyle} aria-labelledby={titleId}>\r\n {imageUrl && <Image src={imageUrl} shouldFadeIn className={imageStyle} styles={{ image: getImageStyle }} alt={imageAlt} />}\r\n {showDismissButton && (\r\n <IconButton\r\n iconProps={closeIcon}\r\n title={formatMessage(close)}\r\n ariaLabel={formatMessage(close)}\r\n onClick={onDismissClick}\r\n className={dismissButtonStyle}\r\n />\r\n )}\r\n <Stack className={titleBar} enableScopedSelectors horizontal wrap horizontalAlign=\"space-between\" verticalAlign=\"center\">\r\n <div className={tooltipTitle}>\r\n <h2 className={titleStyle} id={titleId}>\r\n {titleText}\r\n </h2>\r\n {titleIconTooltipProps && (\r\n <IconTooltip iconName={titleIconTooltipProps.iconName} tooltipMessage={titleIconTooltipProps.tooltipText} />\r\n )}\r\n </div>\r\n <Stack enableScopedSelectors horizontal wrap>\r\n {cardTopBarActions}\r\n </Stack>\r\n </Stack>\r\n <Stack className={bodyStyle}>\r\n {!isDataLoaded && <Shimmer isDataLoaded={isDataLoaded} customElementsGroup={shimmerCustomElement} />}\r\n {isDataLoaded && children}\r\n </Stack>\r\n {isDataLoaded && cardActions}\r\n {isDataLoaded && footerComponents && (\r\n <div className={footerWrapper}>\r\n <div className={footerStyle}>{footerComponents}</div>\r\n </div>\r\n )}\r\n </Stack>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { MAIN_CONTENT_ID } from '../../constants/AppConstants';\r\nimport { IMainProps } from './Main.types';\r\n\r\nexport function Main({ children, className }: IMainProps) {\r\n return (\r\n <main id={MAIN_CONTENT_ID} className={className || ''}>\r\n {children}\r\n </main>\r\n );\r\n}\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { getAppStore, upperCaseCountryCode } from '../../../../../../@data';\r\nimport { getProfileStore } from '../../../../Profile/@data';\r\nimport { getStore } from '../store/store';\r\n\r\nexport const onLanguageChanged = mutatorAction('onLanguageChanged', (locale: string, localStorageKey: string) => {\r\n const { systemPreferences } = getStore().active;\r\n if (locale && locale !== 'redirect') {\r\n localStorage.setItem(localStorageKey, locale);\r\n\r\n if (systemPreferences) {\r\n systemPreferences.locale = locale;\r\n } else {\r\n getStore().active.systemPreferences = {\r\n locale: locale,\r\n };\r\n }\r\n if (getProfileStore().raw.primaryUser !== undefined) {\r\n getProfileStore().raw.primaryUser!.language = upperCaseCountryCode(locale);\r\n }\r\n\r\n getAppStore().locale = locale;\r\n }\r\n});\r\n\r\nexport const onCurrencyChanged = mutatorAction('onCurrencyChanged', (currency: string) => {\r\n const { systemPreferences } = getStore().active;\r\n if (systemPreferences) {\r\n systemPreferences.currency = currency;\r\n } else {\r\n getStore().active.systemPreferences = {\r\n currency: currency,\r\n };\r\n }\r\n});\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { getAppStore } from '../../../../../@data';\r\nimport { getStore } from '../store/store';\r\n\r\nexport const onDialogShown = mutatorAction('ON_DIALOG_SHOWN', function showDialog() {\r\n const store = getStore();\r\n store.active.showDialog = true;\r\n});\r\n\r\nexport const onDialogDismissed = mutatorAction('ON_DIALOG_DISMISSED', function dismissDialog() {\r\n const store = getStore();\r\n store.active.showDialog = false;\r\n const appStore = getAppStore();\r\n appStore.isFirstTimeUser = false;\r\n});\r\n","export enum PublisherType {\r\n organization = 'Business',\r\n individual = 'Individual',\r\n}\r\n","import { Account, AccountSKU, getEntity, listEntity, MediaTypeString, Publisher, User, UserContext } from '../../../../../@data';\r\n\r\nexport const fetchAccountById = async (publisher: Publisher, id: string, userContext?: UserContext): Promise<Account> => {\r\n const accountId = parseInt(id, 10);\r\n const account = new Account(accountId);\r\n return await getEntity<Account>([publisher, account], userContext);\r\n};\r\n\r\nexport const fetchCcmtAccountById = async (publisher: Publisher, accountId: number, userContext?: UserContext): Promise<Account> => {\r\n const account = new Account(accountId);\r\n const urlParams = new URLSearchParams([['isCCMTOnly', 'true']]);\r\n return await getEntity<Account>([publisher, account], userContext, undefined, urlParams);\r\n};\r\n\r\nexport const fetchAllMediumAccountSkus = async (publisher: Publisher, id: string, userContext?: UserContext) => {\r\n // return [new AccountSKU(1, 'some sku2'), new AccountSKU(2, 'some sku1')];\r\n\r\n const allMediaTypes: string[] = [];\r\n\r\n Object.keys(MediaTypeString).forEach((mediaTypeKey) => {\r\n allMediaTypes.push(MediaTypeString[mediaTypeKey]);\r\n });\r\n\r\n const nonMappedMediums: string[] = [];\r\n let mediumMappedSkus: AccountSKU[] = [];\r\n mediumMappedSkus = await Promise.all(\r\n allMediaTypes.map(async (allMediaType) => {\r\n const enparams = new URLSearchParams([\r\n ['medium', allMediaType],\r\n ['accountId', id],\r\n ]);\r\n try {\r\n return await getEntity([publisher], userContext, AccountSKU, enparams);\r\n } catch {\r\n nonMappedMediums.push(allMediaType);\r\n return new AccountSKU();\r\n }\r\n })\r\n );\r\n\r\n return { mediumMappedSkus: mediumMappedSkus, nonMappedMediums: nonMappedMediums };\r\n};\r\n\r\nexport const fetchAllAvailableUsers = async (publisher: Publisher, userContext?: UserContext): Promise<User[]> => {\r\n const users = await listEntity<User>([publisher], userContext, User);\r\n\r\n if (userContext) {\r\n if (users && (users.length === 0 || !users.some((u) => u.id === userContext!.id))) {\r\n const currentUser = new User();\r\n currentUser.id = userContext.id;\r\n currentUser.username = userContext.email;\r\n users.push(currentUser);\r\n }\r\n }\r\n return users;\r\n};\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport const googleConnectorMessages = defineMessages({\r\n settingsTab: {\r\n id: 'googleConnectorMessages.settingsTab',\r\n defaultMessage: 'Settings',\r\n },\r\n googleAccountNotConnectedTab: {\r\n id: 'googleConnectorMessages.googleAccountNotConnectedTab',\r\n defaultMessage: 'Connect your Google accounts',\r\n },\r\n googleAccountConnectedTab: {\r\n id: 'googleConnectorMessages.googleAccountConnectedTab',\r\n defaultMessage: 'Google account connection',\r\n },\r\n googleAccountDetails: {\r\n id: 'googleConnectorMessages.googleAccountHeader',\r\n defaultMessage: 'Google account details',\r\n },\r\n googleAccountConnectionStatus: {\r\n id: 'googleConnectorMessages.googleAccountConnectionStatus',\r\n defaultMessage: 'Status',\r\n },\r\n googleAccountConnectedStatus: {\r\n id: 'googleConnectorMessages.googleAccountConnectedStatus',\r\n defaultMessage: 'Connected',\r\n },\r\n googleAccountVerifyingStatus: {\r\n id: 'googleConnectorMessages.googleAccountVerifyingStatus',\r\n defaultMessage: 'Verifying',\r\n },\r\n googleAccountFailedStatus: {\r\n id: 'googleConnectorMessages.googleAccountFailedStatus',\r\n defaultMessage: 'Failed',\r\n },\r\n googleAccountConnectionDate: {\r\n id: 'googleConnectorMessages.googleAccountConnectionDate',\r\n defaultMessage: 'Connection date',\r\n },\r\n googleAccountMediateHeader: {\r\n id: 'googleConnectorMessages.googleAccountMediateHeader',\r\n defaultMessage: 'Boost revenue for every ad',\r\n },\r\n googleAccountMediateDescription: {\r\n id: 'googleConnectorMessages.googleAccountMediateDescription',\r\n defaultMessage: `By enabling boost revenue for every ad, you can boost the value of each ad unit. You'll see this option when creating or editing your ad units.`,\r\n },\r\n googleAccountConnect: {\r\n id: 'googleConnectorMessages.googleAccountConnect',\r\n defaultMessage: 'Connect',\r\n },\r\n googleAccountDisconnect: {\r\n id: 'googleConnectorMessages.googleAccountDisconnect',\r\n defaultMessage: 'Disconnect',\r\n },\r\n googleAccountRetry: {\r\n id: 'googleConnectorMessages.googleAccountRetry',\r\n defaultMessage: 'Retry',\r\n },\r\n monetizationDetails: {\r\n id: 'googleConnectorMessages.monetizationDetails',\r\n defaultMessage: `Connect your Google accounts to ensure you are getting the highest bid possible for your ad inventory. We'll only serve our ads if we predict we can deliver a higher payment compared to Google.`,\r\n },\r\n monetizationInstructionHeader: {\r\n id: 'googleConnectorMessages.monetizationInstructionHeader',\r\n defaultMessage: 'Before connecting your Google Ads account, please make sure you have:',\r\n },\r\n monetizationFirstInstruction: {\r\n id: 'googleConnectorMessages.monetizationFirstInstruction',\r\n defaultMessage: 'An approved Google Ad Manager and Google Adsense account',\r\n },\r\n monetizationSecondInstruction: {\r\n id: 'googleConnectorMessages.monetizationSecondInstruction',\r\n defaultMessage: 'Administrative rights',\r\n },\r\n monetizationThirdInstruction: {\r\n id: 'googleConnectorMessages.monetizationThirdInstruction',\r\n defaultMessage: 'API access enabled for your Google Ad manager and Google Ad sense account',\r\n },\r\n monetizationReviewTOSandPP: {\r\n id: 'googleConnectorMessages.monetizationReviewTOSandPP',\r\n defaultMessage: 'Please review the {appName} ',\r\n },\r\n monetizationPP: {\r\n id: 'googleConnectorMessages.monetizationPP',\r\n defaultMessage: 'Privacy policy',\r\n },\r\n monetizationReviewAnd: {\r\n id: 'googleConnectorMessages.monetizationReviewAnd',\r\n defaultMessage: ' and ',\r\n },\r\n monetizationTOS: {\r\n id: 'googleConnectorMessages.monetizationTOS',\r\n defaultMessage: 'Terms of service',\r\n },\r\n grantOAuthConnectingProcessTerminated: {\r\n id: 'googleConnectorMessages.grantOAuthConnectingProcessTerminated',\r\n defaultMessage: 'Connecting process terminated',\r\n },\r\n googleConnectorMediationOperationEnabling: {\r\n id: 'googleConnectorMessages.googleConnectorMediationOperationEnabling',\r\n defaultMessage: 'Enabling',\r\n },\r\n googleConnectorMediationOperationDisabling: {\r\n id: 'googleConnectorMessages.googleConnectorMediationOperationDisabling',\r\n defaultMessage: 'Disabling',\r\n },\r\n googleConnectorMediationFailed: {\r\n id: 'googleConnectorMessages.googleConnectorMediationFailed',\r\n defaultMessage: ' mediation failed, please try again later',\r\n },\r\n googleConnectorFailedToFetchAdSenseConnectionDetails: {\r\n id: 'googleConnectorMessages.googleConnectorFailedToFetchAdSenseConnectionDetails',\r\n defaultMessage: 'Failed to fetching adSense connection details. Please try again!',\r\n },\r\n disconnectingGoogleAccountFailed: {\r\n id: 'googleConnectorMessages.disconnectingGoogleAccountFailed',\r\n defaultMessage: 'Disconnecting account failed.',\r\n },\r\n disconnectingGoogleAccountSuccess: {\r\n id: 'googleConnectorMessages.disconnectingGoogleAccountSuccess',\r\n defaultMessage: 'Your Google accounts are successfully disconnected.',\r\n },\r\n connectGoogleAccountFailed: {\r\n id: 'googleConnectorMessages.connectGoogleAccountFailed',\r\n defaultMessage: 'We’re unable to connect to your Google account. Please try again later.',\r\n },\r\n disconnectGoogleAccountFailed: {\r\n id: 'googleConnectorMessages.disconnectGoogleAccountFailed',\r\n defaultMessage: 'We’re unable to disconnect your Google account. Please try again later.',\r\n },\r\n initializeGoogleAccountFailed: {\r\n id: 'googleConnectorMessages.initializeGoogleAccountFailed',\r\n defaultMessage: 'We’re unable to access your AdSense connection details. Please try again later.',\r\n },\r\n googleAccountConnectedSuccessfully: {\r\n id: 'googleConnectorMessages.googleAccountConnectedSuccessfully',\r\n defaultMessage: 'Your Google account is successfully connected.',\r\n },\r\n});\r\n","import { IComboBoxOption, IDropdownOption } from '@fluentui/react';\r\nimport { userLocales } from '../../config/locale';\r\nimport { EN_LOCALE_KEY } from '../../constants';\r\nimport { SUPPORTED_LOCALES_MAPPING } from '../../globalization';\r\n\r\nexport const getSupportedLanguagesComboBoxOptions = (locale: string): IComboBoxOption[] => {\r\n const isProdEnv = process.env.REACT_APP_ENV === 'production';\r\n const supportedLocales = SUPPORTED_LOCALES_MAPPING[locale];\r\n const supportedLanguages: IComboBoxOption[] = [];\r\n\r\n Object.keys(supportedLocales).forEach((localeCode) => {\r\n supportedLanguages.push({\r\n key: userLocales[localeCode].toLocaleLowerCase(),\r\n text: supportedLocales[localeCode],\r\n });\r\n });\r\n\r\n supportedLanguages.sort((a, b) => {\r\n const firstValue = a.text;\r\n const secondValue = b.text;\r\n\r\n return firstValue.toLowerCase() > secondValue.toLowerCase() ? 1 : -1;\r\n });\r\n\r\n const filteredLanguages = supportedLanguages.filter((value, index) => value.key === EN_LOCALE_KEY);\r\n\r\n return isProdEnv ? filteredLanguages : supportedLanguages;\r\n};\r\n\r\nexport const getSupportedLanguagesDropDownOptions = (locale: string): IDropdownOption[] => {\r\n const isProdEnv = process.env.REACT_APP_ENV === 'production';\r\n const supportedLocales = getSupportedLocalesMapping(locale);\r\n const supportedLanguages: IDropdownOption[] = [];\r\n\r\n Object.keys(supportedLocales).forEach((localeCode) => {\r\n supportedLanguages.push({\r\n key: userLocales[localeCode].toLocaleLowerCase(),\r\n text: supportedLocales[localeCode],\r\n });\r\n });\r\n\r\n supportedLanguages.sort((a, b) => {\r\n const firstValue = a.text;\r\n const secondValue = b.text;\r\n\r\n return firstValue.toLowerCase() > secondValue.toLowerCase() ? 1 : -1;\r\n });\r\n\r\n const filteredLanguages = supportedLanguages.filter((value, index) => value.key === EN_LOCALE_KEY);\r\n\r\n return isProdEnv ? filteredLanguages : supportedLanguages;\r\n};\r\n\r\nexport const getSupportedLocalesMapping = (locale?: string | null): string[] => {\r\n return SUPPORTED_LOCALES_MAPPING[locale ?? EN_LOCALE_KEY] ?? SUPPORTED_LOCALES_MAPPING[EN_LOCALE_KEY];\r\n};\r\n","import { IStyle } from '@fluentui/react';\r\nimport { useBoolean, useId, useSetTimeout } from '@fluentui/react-hooks';\r\nimport { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { InjectedIntl } from 'react-intl';\r\nimport { useI18n } from '../../../../../../i18n/useI18n';\r\nimport { getAppStore, onNotificationRemoved } from '../../../../../@data';\r\nimport { useWindowSize } from '../../../../../hooks';\r\nimport { getStore } from '../../../../../hooks/useWindowSize/store/store';\r\nimport { onInitializePaymentsPage } from '../../@data/actions/actions';\r\nimport { getAccountStatus } from '../../@data/store/selectors';\r\nimport { getStore as getAccountSettingStore } from '../../Settings/@data/store/store';\r\n\r\nconst NOT_CREATED_ACCOUNT_STATUS = 'NotCreated';\r\nconst NOTIFICATION_DISMISS_BUFFER = 60000;\r\nexport const NOTIFICATION_RENDER_BUFFER = 1000;\r\nexport type PaymentNotificationBufferLocalStorageKey =\r\n | 'payment-teaching-bubble-pushed'\r\n | 'payment-setup-notification-pushed'\r\n | 'payment-setup-cheer-dialog-pushed';\r\nexport const TEACHING_BUBBLE_NOTIFICATION_FLAG: PaymentNotificationBufferLocalStorageKey = 'payment-teaching-bubble-pushed';\r\nexport const SETUP_PAYMENTS_NOTIFICATION_FLAG: PaymentNotificationBufferLocalStorageKey = 'payment-setup-notification-pushed';\r\nexport const SETUP_PAYMENTS_CHEER_DIALOG_FLAG: PaymentNotificationBufferLocalStorageKey = 'payment-setup-cheer-dialog-pushed';\r\nexport const SETUP_PAYMENTS_NOTIFICATION_ACTION_BUTTON_ID = 'paymentSetupNotificationActionButton';\r\nexport const SETUP_PAYMENTS_NOTIFICATION_ID = 'paymentSetupNotification';\r\n\r\nexport const removePaymentNotificationBuffers = () => {\r\n if (window.localStorage) {\r\n [SETUP_PAYMENTS_NOTIFICATION_FLAG, TEACHING_BUBBLE_NOTIFICATION_FLAG, SETUP_PAYMENTS_CHEER_DIALOG_FLAG].forEach((key) => {\r\n window.localStorage.removeItem(key);\r\n });\r\n }\r\n};\r\n\r\nexport const setPaymentNotificationBuffer = (key: PaymentNotificationBufferLocalStorageKey) => {\r\n if (window.localStorage) {\r\n window.localStorage.setItem(key, JSON.stringify(true));\r\n }\r\n};\r\n\r\nconst { windowStoreSerializer } = useWindowSize();\r\n\r\nconst usePaymentsOnboarding = (formatMessage: InjectedIntl['formatMessage']) => {\r\n const status = getAccountStatus();\r\n const onboardingContainerId = useId('onboarding-container');\r\n const xPayContainerRef = useRef<HTMLDivElement>(null);\r\n const [isSDKLoaded, setSDKLoaded] = useState<boolean>(false);\r\n const { publisher, userContext, notifications } = getAppStore();\r\n const { systemPreferences } = getAccountSettingStore().active;\r\n const { setTimeout } = useSetTimeout();\r\n const [isInitializingXPayContainer, { setFalse: onXPayInitializeResolved }] = useBoolean(true);\r\n const isTeachingBubbleHandledPerUserSession = localStorage.getItem(TEACHING_BUBBLE_NOTIFICATION_FLAG);\r\n const { isWindowExtraSmallSize, isWindowSmallSize } = windowStoreSerializer(getStore());\r\n const { locale, countryCode } = useI18n({ systemPreferences, publisher, userContext });\r\n\r\n const handleInitXPayContainer = (succeed: boolean) => {\r\n if (succeed) {\r\n setTimeout(() => onXPayInitializeResolved(), 500);\r\n }\r\n setPaymentNotificationBuffer(TEACHING_BUBBLE_NOTIFICATION_FLAG);\r\n };\r\n\r\n const teachingBubbleResponsiveStylings = useMemo<IStyle>(\r\n () => ({\r\n backgroundColor: 'rgb(0, 120, 212)',\r\n position: 'absolute',\r\n top: isWindowExtraSmallSize || isWindowSmallSize ? -200 : -172,\r\n }),\r\n [isWindowExtraSmallSize, isWindowSmallSize]\r\n );\r\n\r\n /**\r\n * workaround to hide setup payment notification button, we don't need to render the redirection button as this is\r\n * already in the correct tab for user to setup payment, if user stay at the page, dismiss notification in 1 minute\r\n */\r\n useEffect(() => {\r\n const setupNotificationButton = document.getElementById(SETUP_PAYMENTS_NOTIFICATION_ACTION_BUTTON_ID);\r\n let setupNotificationButtonOGStyle;\r\n if (setupNotificationButton) {\r\n setupNotificationButtonOGStyle = setupNotificationButton.style.display;\r\n setupNotificationButton.style.display = 'none';\r\n setTimeout(() => onNotificationRemoved({ id: SETUP_PAYMENTS_NOTIFICATION_ID }), NOTIFICATION_DISMISS_BUFFER);\r\n }\r\n\r\n return () => {\r\n if (setupNotificationButton) {\r\n setupNotificationButton.style.display = setupNotificationButtonOGStyle;\r\n }\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [notifications]);\r\n\r\n useEffect(() => {\r\n const script = document.createElement('script');\r\n\r\n script.src =\r\n process.env.REACT_APP_ENV === 'production'\r\n ? 'https://xpaycdn.azureedge.net/js/pack/xPayUIAccountOnboardingSDK.js'\r\n : 'https://xpaycdn-int.azureedge.net/js/pack/xPayUIAccountOnboardingSDK.js';\r\n script.async = true;\r\n script.onload = () => {\r\n setSDKLoaded(true);\r\n };\r\n document.body.appendChild(script);\r\n\r\n return () => {\r\n // clean up the script when the component in unmounted\r\n document.body.removeChild(script);\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const shouldRenderTeachingBubble = status === NOT_CREATED_ACCOUNT_STATUS && !isTeachingBubbleHandledPerUserSession;\r\n\r\n isSDKLoaded && onInitializePaymentsPage(shouldRenderTeachingBubble, locale, countryCode, handleInitXPayContainer);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isSDKLoaded, locale]);\r\n\r\n return {\r\n isInitializingXPayContainer,\r\n xPayContainerRef,\r\n onboardingContainerId,\r\n teachingBubbleResponsiveStylings,\r\n };\r\n};\r\n\r\nexport default usePaymentsOnboarding;\r\n","import { defineMessages } from \"react-intl\";\r\n\r\nexport default defineMessages({\r\n datePlaceholder: {\r\n id: 'dateTimePicker.datePlaceholder',\r\n defaultMessage: 'Select date'\r\n },\r\n label: {\r\n id: 'dateTimePicker.label',\r\n defaultMessage: 'Date time picker'\r\n },\r\n goToToday: {\r\n id: 'dateTimePicker.goToToday',\r\n defaultMessage: 'Go to today',\r\n },\r\n prevMonthAriaLabel: {\r\n id: 'dateTimePicker.prevMonthAriaLabel',\r\n defaultMessage: 'Go to previous month',\r\n },\r\n nextMonthAriaLabel: {\r\n id: 'dateTimePicker.nextMonthAriaLabel',\r\n defaultMessage: 'Go to next month',\r\n },\r\n prevYearAriaLabel: {\r\n id: 'dateTimePicker.prevYearAriaLabel',\r\n defaultMessage: 'Go to previous year',\r\n },\r\n nextYearAriaLabel: {\r\n id: 'dateTimePicker.nextYearAriaLabel',\r\n defaultMessage: 'Go to next year',\r\n },\r\n closeButtonAriaLabel: {\r\n id: 'dateTimePicker.closeButtonAriaLabel',\r\n defaultMessage: 'Close date picker',\r\n },\r\n isRequiredErrorMessage: {\r\n id: 'dateTimePicker.isRequiredErrorMessage',\r\n defaultMessage: 'Field is required.',\r\n },\r\n invalidDateErrorMessage: {\r\n id: 'dateTimePicker.invalidInputErrorMessage',\r\n defaultMessage: 'Invalid date format.',\r\n },\r\n invalidMinuteErrorMessage: {\r\n id: 'dateTimePicker.invalidMinuteErrorMessage',\r\n defaultMessage: 'Invalid minute value.',\r\n },\r\n invalidSecondsErrorMessage: {\r\n id: 'dateTimePicker.invalidSecondsErrorMessage',\r\n defaultMessage: 'Invalid second value.',\r\n },\r\n});","import { PublicClientApplication } from '@azure/msal-browser';\r\nimport { aadConfig } from './config/pubCenterAAD.config';\r\n\r\n/* Singleton class to create PubCenter AAD authentication context using MSAL library */\r\nclass PubCenterAuthContext {\r\n public static initializeAuthContext(): PublicClientApplication {\r\n return new PublicClientApplication(aadConfig);\r\n }\r\n}\r\n\r\nexport const pubcenterApp = PubCenterAuthContext.initializeAuthContext();\r\n","export function clearAllCookies() {\r\n // Clearing all cookies. This function will extract all cookies from the browser cache,\r\n // then sets their value to empty string and sets the expires parameter to current UTC datetime.\r\n // Browser will delete the cookie as soon as expires parameter value is in the past.\r\n\r\n document.cookie.split(\";\").forEach((c) => {\r\n document.cookie = c.replace(/^ +/, \"\").replace(/=.*/, \"=;expires=\" + new Date().toUTCString() + \";path=/\");\r\n });\r\n}","import { AccountInfo, AuthenticationResult, EndSessionRequest, RedirectRequest } from '@azure/msal-browser';\r\nimport { Log } from '../../../logging/src/Log';\r\nimport { pubcenterApp } from '../../PubCenterAuthContext';\r\nimport {\r\n aadConfig,\r\n accountEnvironment,\r\n authTokenRequest,\r\n envBasedConfig,\r\n silentTokenRequest,\r\n silentTokenRequestRedirectUri,\r\n} from '../../config/pubCenterAAD.config';\r\nimport {\r\n REDIRECT_URI_SESSION_STORAGE_KEY,\r\n TOKEN_EXPIRED_SEARCH_PARAM_KEY,\r\n UNAUTHORIZED_LOCAL_STORAGE_LOCALE,\r\n} from '../../constants/AppConstants';\r\nimport { clearAllCookies } from '../../utils/cookiesUtils';\r\nimport { UserContext } from '../store';\r\nimport { StorageUserContextKey, getAppStore } from '../store/store';\r\n\r\nlet authResponse: AuthenticationResult;\r\nconst { userContext } = getAppStore();\r\nlet username = userContext?.userName ?? userContext?.email ?? '';\r\n\r\nexport async function logoutPubCenterAADUser(isTokenExpired?: boolean): Promise<void> {\r\n const tenantId = pubcenterApp.getAccountByUsername(username)?.idTokenClaims?.tid;\r\n\r\n if (tenantId === aadConfig.auth.msaTenantId) {\r\n msaLogout(isTokenExpired);\r\n } else {\r\n aadLogout(isTokenExpired);\r\n }\r\n\r\n Log.debug('Clearing storage cache after logout');\r\n // clearing cache and cookies to avoid login issues\r\n const localStorageUnAuthLocale = window.localStorage.getItem(UNAUTHORIZED_LOCAL_STORAGE_LOCALE);\r\n localStorage.clear();\r\n sessionStorage.clear();\r\n clearAllCookies();\r\n if (localStorageUnAuthLocale) {\r\n window.localStorage.setItem(UNAUTHORIZED_LOCAL_STORAGE_LOCALE, localStorageUnAuthLocale);\r\n }\r\n}\r\n\r\nfunction aadLogout(isTokenExpired?: boolean) {\r\n const logoutRequest: EndSessionRequest = {\r\n logoutHint: pubcenterApp.getAccountByUsername(username)?.idTokenClaims?.login_hint,\r\n postLogoutRedirectUri: getPostLogoutRedirectUri(isTokenExpired),\r\n };\r\n\r\n Log.write('Logging out AAD user');\r\n pubcenterApp.logoutRedirect(logoutRequest);\r\n}\r\n\r\nfunction msaLogout(isTokenExpired?: boolean) {\r\n const postLogoutUrl = 'redirect_uri=' + encodeURIComponent(getPostLogoutRedirectUri(isTokenExpired));\r\n const clientIdQueryStr = 'client_id=' + encodeURIComponent(aadConfig.auth.clientId);\r\n const msaLogoutRedirectionUrl = `${aadConfig.auth.msaAuthority}/oauth20_logout.srf?${clientIdQueryStr}&${postLogoutUrl}`;\r\n\r\n Log.write('Logging out MSA user and redirecting to login page ' + msaLogoutRedirectionUrl.toString());\r\n window.location.replace(msaLogoutRedirectionUrl);\r\n}\r\n\r\nexport function loginUserWithAdditionalClaims(authenticateHeader: string | null) {\r\n if (!authenticateHeader?.includes('claims')) {\r\n return;\r\n }\r\n\r\n const claimsRegex = `claims=\"([^\"]+)\"`;\r\n const match = new RegExp(claimsRegex).exec(authenticateHeader);\r\n let claims = '';\r\n if (!match || match.length < 1) {\r\n return;\r\n }\r\n claims = atob(match[1]);\r\n\r\n sessionStorage.setItem(REDIRECT_URI_SESSION_STORAGE_KEY, window.location.pathname);\r\n\r\n const requestParams: Partial<RedirectRequest> = {\r\n redirectStartPage: '/login',\r\n extraQueryParameters: { claims: encodeURI(claims) },\r\n prompt: 'login',\r\n };\r\n loginPubCenterAADUser(requestParams);\r\n}\r\n\r\nexport function loginPubCenterAADUser(requestParams?: Partial<RedirectRequest>) {\r\n handleInvalidInteractionStatus();\r\n\r\n const redirectRequest: RedirectRequest = { ...authTokenRequest, ...requestParams };\r\n if (!redirectRequest.extraQueryParameters) {\r\n redirectRequest.extraQueryParameters = {};\r\n }\r\n\r\n // msaoauth2 paramenter is required to enable MSA user login flow\r\n redirectRequest.extraQueryParameters.msaoauth2 = 'true';\r\n pubcenterApp.loginRedirect(redirectRequest);\r\n}\r\n\r\nexport async function acquireAuthResponseAsync(request, usernameHint?: string): Promise<AuthenticationResult> {\r\n username = usernameHint ?? username ?? pubcenterApp.getActiveAccount()?.username;\r\n\r\n if (username) {\r\n const accountInfo: AccountInfo = {\r\n username: username,\r\n environment: accountEnvironment,\r\n tenantId: aadConfig.auth.msaTenantId,\r\n homeAccountId: '',\r\n localAccountId: '',\r\n };\r\n request.account = pubcenterApp.getAccountByUsername(username) || accountInfo;\r\n\r\n try {\r\n authResponse = await pubcenterApp.acquireTokenSilent({ ...request, silentTokenRequestRedirectUri });\r\n } catch (error) {\r\n Log.warn('silent token acquisition fails. acquiring token using redirect: ' + JSON.stringify(error));\r\n const requestParams: Partial<RedirectRequest> = { loginHint: username, redirectStartPage: aadConfig.auth.redirectUri };\r\n loginPubCenterAADUser(requestParams);\r\n }\r\n } else {\r\n loginPubCenterAADUser();\r\n }\r\n return authResponse;\r\n}\r\n\r\nexport async function fetchPubCenterAADAccessTokenAsync() {\r\n authResponse = await acquireAuthResponseAsync(silentTokenRequest);\r\n if (authResponse) {\r\n return authResponse.accessToken;\r\n }\r\n}\r\n\r\nexport async function getIdToken() {\r\n authResponse = await acquireAuthResponseAsync(silentTokenRequest);\r\n if (authResponse) {\r\n return authResponse.idToken;\r\n }\r\n}\r\n\r\nexport async function handleLoginRedirectAsync() {\r\n await pubcenterApp\r\n .handleRedirectPromise()\r\n .then((response) => {\r\n if (!!response) {\r\n username = response.account !== null ? response.account.username : '';\r\n Log.info('Login successful with: ' + username);\r\n authResponse = response;\r\n }\r\n })\r\n .catch((err) => {\r\n Log.error(err);\r\n });\r\n return authResponse;\r\n}\r\n\r\n/**\r\n * In cases where the Login redirection flow is interruped by the user, the session storage cached data used for proper\r\n * login flow does not get cleared out. This dormant cache data creates login issues the next time user tries\r\n * to login. This method helps in removing any dormant cache data present in session storage.\r\n */\r\nfunction handleInvalidInteractionStatus() {\r\n const interactionStatus = sessionStorage.getItem('msal.interaction.status');\r\n const clientIdInteractionStatus = sessionStorage.getItem(`msal.${envBasedConfig.clientId}.interaction.status`);\r\n\r\n // After refresh token is expired, user is successfully logged out and redirected to PubCenter login page,\r\n // it recommends us to close the browser to clear session context, but mostly user continue to login directly\r\n // here session storage is not cleared and sometimes has a interaction in progress status from the earlier interaction\r\n // When user tries to login again this status interrupts the login flow. Clearing session storage helps to start a fresh session.\r\n if (\r\n (interactionStatus && interactionStatus === envBasedConfig.clientId) ||\r\n (clientIdInteractionStatus && clientIdInteractionStatus === 'interaction_in_progress')\r\n ) {\r\n console.log('Interaction in progress, clearing session storage');\r\n localStorage.clear();\r\n sessionStorage.removeItem('msal.interaction.status');\r\n sessionStorage.removeItem(`msal.${envBasedConfig.clientId}.interaction.status`);\r\n clearAllCookies();\r\n localStorage.setItem(StorageUserContextKey, JSON.stringify(new UserContext()));\r\n }\r\n}\r\n\r\nfunction getPostLogoutRedirectUri(isTokenExpired?: boolean): string {\r\n let postLogoutRedirectUri = aadConfig.auth.redirectUri;\r\n if (isTokenExpired && postLogoutRedirectUri) {\r\n postLogoutRedirectUri += `?${TOKEN_EXPIRED_SEARCH_PARAM_KEY}=true`;\r\n }\r\n return postLogoutRedirectUri;\r\n}\r\n","export * from './onNotificationPreferencesChanged';\r\nexport * from './onPublisherDeleted';\r\nexport * from './onSettingsPageChanged';\r\nexport * from './onUserSelfDeleted';\r\n","import { IUserRoleDetail, User, UserRole, UserRoleEntityType } from '../../../../@data';\r\nimport UserManagementMessages from '../UserManagement.messages';\r\n\r\nexport function getUserRoleFromUser(user: User): UserRole | undefined {\r\n let userRole: UserRole | undefined;\r\n const roleDetails: IUserRoleDetail[] | undefined = user.userRoleDetails;\r\n\r\n if (roleDetails && roleDetails.length > 0) {\r\n roleDetails.forEach((roleDetail) => {\r\n if (roleDetail.entityType === UserRoleEntityType.Customer) {\r\n userRole = roleDetail.userRole;\r\n }\r\n });\r\n }\r\n return userRole;\r\n}\r\n\r\nexport function getUserRoleString(formatMessage, user: User): string {\r\n const userRole = getUserRoleFromUser(user);\r\n\r\n return getFormattedUserRole(formatMessage, userRole);\r\n}\r\n\r\nexport function getFormattedUserRole(formatMessage, userRole?: UserRole): string {\r\n const { superAdmin, accountManager, reportUser } = UserManagementMessages;\r\n\r\n switch (userRole) {\r\n case UserRole.SuperAdmin:\r\n return formatMessage(superAdmin);\r\n case UserRole.AccountManager:\r\n return formatMessage(accountManager);\r\n case UserRole.ReportUser:\r\n return formatMessage(reportUser);\r\n default:\r\n return '';\r\n }\r\n}\r\n\r\nexport function getUserRoleMapping(roleIds: number[] | undefined, formatMessage?): string {\r\n if (roleIds && roleIds.length > 0) {\r\n if (roleIds.find((id) => id === 41)) {\r\n return formatMessage ? formatMessage(UserManagementMessages.superAdmin) : 'Super Admin';\r\n }\r\n if (roleIds.find((id) => id === 43)) {\r\n return formatMessage ? formatMessage(UserManagementMessages.accountManager) : 'Account Manager';\r\n }\r\n if (roleIds.find((id) => id === 49)) {\r\n return formatMessage ? formatMessage(UserManagementMessages.reportUser) : 'Report User';\r\n }\r\n }\r\n return '';\r\n}\r\n\r\nexport const userRoleToRoleIdMap = new Map<UserRole, number>([\r\n [UserRole.SuperAdmin, 41],\r\n [UserRole.AccountManager, 43],\r\n [UserRole.ReportUser, 49],\r\n]);\r\n\r\nexport const userRoleIdToRoleNameMap = new Map<number, string>([\r\n // user roles scoped to publisher shell\r\n [41, 'SuperAdmin'],\r\n [43, 'AccountManager'],\r\n [49, 'ReportUser'],\r\n [42, 'PublisherAdmin'],\r\n [61, 'ListManager'],\r\n [62, 'AdViewer'],\r\n\r\n // internal user roles\r\n [91, 'Provisioning Internal'],\r\n [116, 'Partner Account Manager'],\r\n [124, 'Yahoo PRM'],\r\n [125, 'Yahoo Search Account Manager'],\r\n [156, 'Provisioning External'],\r\n [169, 'PC Inventory Management'],\r\n [170, 'PC Support'],\r\n [171, 'PC Guest Read Only'],\r\n [172, 'PC Finance Ops'],\r\n [174, 'PC 3PE Management'],\r\n]);\r\n","import { when } from 'mobx';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { getAppStore, showErrorToastNotification } from '../../../../../@data';\r\nimport { getColumnMembers } from '../../../../../@data/services/ReportingService';\r\nimport { getAdunitStore } from '../../../../ad-management/Adunit/@data';\r\nimport ReportMessages from '../../../Report.messages';\r\nimport { ReportCardType } from '../../ReportCard/ReportCard.types';\r\nimport { fetchReportDimensionColumnMembers, setColumnMembers } from '../actions';\r\nimport { IColumnMemberDetails } from '../store/schema';\r\n\r\norchestrator(fetchReportDimensionColumnMembers, async (msg) => {\r\n try {\r\n const { publisher, account } = getAppStore();\r\n if (!publisher || !account) {\r\n return;\r\n }\r\n const reportCardType = msg.reportCardType;\r\n if (reportCardType === ReportCardType.MEDIATION) {\r\n when(\r\n () => !getAdunitStore().isFetchingAdUnitStatus,\r\n () => {\r\n const allAdUnits = getAdunitStore().adUnitsRaw.data || [];\r\n const columnMembers: IColumnMemberDetails[] = allAdUnits\r\n .filter((adunit) => adunit.mediatedWithAdSense && adunit.mediatedWithAdSense.mediationStatus)\r\n .map((adunit) => ({\r\n Id: adunit.id,\r\n Value: String(adunit.name),\r\n DisplayName: String(adunit.name),\r\n }));\r\n setColumnMembers(msg.requestParams.column, columnMembers);\r\n }\r\n );\r\n } else {\r\n const columnMembers = await getColumnMembers(msg.requestParams);\r\n setColumnMembers(msg.requestParams.column, columnMembers);\r\n }\r\n } catch (error) {\r\n showErrorToastNotification({ textMessageDescriptor: ReportMessages.dimensionColumnMembersFailedMessage });\r\n }\r\n});\r\n","import { createStore } from 'satcheljs';\r\nimport '../orchestrators';\r\nimport { IReportPageData, ReportDataSource } from './schema';\r\n\r\nexport const ReportsMetadataKeyByType = {\r\n 19: 'app.reports.19.metadata',\r\n};\r\nexport const ReportTypeKey = 'app.reports.reportType';\r\nexport const getReportPageStore = createStore<IReportPageData>('ReportPageData', {\r\n metadata: { isMetadataLoaded: false, dimensions: [], grains: [], metrics: [] },\r\n mediationMetadata: { isMetadataLoaded: false, dimensions: [], grains: [], metrics: [] },\r\n columnMembers: {},\r\n reportType: ReportDataSource.TythonV2,\r\n adUnits: {\r\n Day: {},\r\n Hour: {},\r\n Month: {},\r\n None: {},\r\n Week: {},\r\n Year: {},\r\n MonthAndYear: {},\r\n },\r\n mediation: {\r\n Day: {},\r\n Hour: {},\r\n Month: {},\r\n None: {},\r\n Week: {},\r\n Year: {},\r\n MonthAndYear: {},\r\n },\r\n sites: {\r\n Day: {},\r\n Hour: {},\r\n Month: {},\r\n None: {},\r\n Week: {},\r\n Year: {},\r\n MonthAndYear: {},\r\n },\r\n performance: {\r\n Day: {},\r\n Hour: {},\r\n Month: {},\r\n None: {},\r\n Week: {},\r\n Year: {},\r\n MonthAndYear: {},\r\n },\r\n summary: {\r\n Day: {},\r\n Hour: {},\r\n Month: {},\r\n None: {},\r\n Week: {},\r\n Year: {},\r\n MonthAndYear: {},\r\n },\r\n mediationSummary: {\r\n Day: {},\r\n Hour: {},\r\n Month: {},\r\n None: {},\r\n Week: {},\r\n Year: {},\r\n MonthAndYear: {},\r\n },\r\n country: {\r\n Day: {},\r\n Hour: {},\r\n Month: {},\r\n None: {},\r\n Week: {},\r\n Year: {},\r\n MonthAndYear: {},\r\n },\r\n});\r\n","import { action } from 'satcheljs';\r\nimport { EntityType } from '../../../../../../@data';\r\nimport { INotificationPreferences } from '../store/schema/ISettingsViewModel';\r\n\r\nexport const onUpdateNotificationPreferences = action(\r\n 'onUpdateNotificationPreferences',\r\n (entityType: EntityType, np: INotificationPreferences) => ({ entityType, np })\r\n);\r\n\r\nexport const toggleBillingAlerts = action('toggleBillingAlerts', (entityType: EntityType, checked?: boolean) => ({ entityType, checked }));\r\n\r\nexport const toggleServingStatus = action('toggleServingStatus', (entityType: EntityType, checked?: boolean) => ({ entityType, checked }));\r\n\r\nexport const toggleProfileReview = action('toggleProfileReview', (entityType: EntityType, checked?: boolean) => ({ entityType, checked }));\r\n\r\nexport const toggleInvitedUsers = action('toggleInvitedUsers', (entityType: EntityType, checked?: boolean) => ({ entityType, checked }));\r\n","export enum LogType {\r\n DEBUG = 'DEBUG',\r\n INFO = 'INFO',\r\n WARN = 'WARN',\r\n ERROR = 'ERROR',\r\n}\r\n","export * from './store/schema';\r\nexport * from './store/store';\r\nexport * from './store/selectors';\r\n","import { action } from 'satcheljs';\r\nimport { ChartGrain } from '../../Payments/EstimatedEarnings/EstimatedEarnings.types';\r\n\r\nexport const onInitializePaymentsPage = action(\r\n 'onInitializePaymentsPage',\r\n (shouldRenderOnboardingPopup: boolean, locale: string, countryCode: string, onResolvedCallback?: (success: boolean) => void) => ({\r\n shouldRenderOnboardingPopup,\r\n locale,\r\n countryCode,\r\n onResolvedCallback,\r\n })\r\n);\r\nexport const fetchPaymentsPageBalance = action('fetchPaymentsPageBalance');\r\nexport const fetchPaymentsPageEstimatedEarnings = action('fetchPaymentsPageEstimatedEarnings', (grain: ChartGrain) => ({\r\n grain,\r\n}));\r\nexport const fetchAccountStatus = action('fetchAccountStatus');\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport {\r\n getAppStore,\r\n getCurrentPublisher,\r\n IPhoneVerificationData,\r\n IStringDictionary,\r\n PhoneVerificationMediumType,\r\n Publisher,\r\n User,\r\n} from '../../../../../@data';\r\nimport { DEFAULT_COUNTRY_CODE } from '../../../../../constants/AppConstants';\r\nimport { deepClone } from '../../../../../utils';\r\nimport { getPrimaryUserActiveData, getPublisherActiveData, getPublisherProfileActiveData } from '../store/selectors';\r\nimport { getProfileStore } from '../store/store';\r\n\r\nexport const setLoadingStateAction = mutatorAction('setLoadingStateAction', (isLoading: boolean) => {\r\n getPublisherProfileActiveData().isLoading = isLoading;\r\n});\r\n\r\nexport const setPublisherProfileDetailsAction = mutatorAction('setPublisherProfileDetailsAction', (publisherProfileDetails: Publisher) => {\r\n const appStore = getAppStore();\r\n appStore.publisher = { ...appStore.publisher, ...publisherProfileDetails };\r\n\r\n /** NOTE: When publisher is signed up, we set some dummy address as it is a mandatory field in CCMT.\r\n * As it can cause confusion to users in UI, we are resetting the address fields, in case\r\n * Address has dummy field values\r\n * Publisher profileComplete is false\r\n */\r\n const { publisher } = getAppStore();\r\n const isDefaultAddress = publisher?.address?.line1 === 'Address line 1' && publisher.address.city === 'City';\r\n const { id, lastUpdatedTimestamp, eTag, country } = publisher?.address || {};\r\n if (publisher && publisher.address && isDefaultAddress && !publisher.profileComplete) {\r\n Log.info('Resetting dummy address as publisher profile is incomplete');\r\n\r\n publisher.address = {\r\n id,\r\n lastUpdatedTimestamp,\r\n eTag,\r\n country,\r\n };\r\n }\r\n});\r\n\r\nexport const setPrimaryUserDetailsAction = mutatorAction('setPrimaryUserDetailsAction', (primaryUserDetails: User) => {\r\n // This is necessary because only \"users\" API endpoints don't return the className, others do.\r\n primaryUserDetails.className = new User().className;\r\n getProfileStore().raw.primaryUser = primaryUserDetails;\r\n});\r\n\r\nexport const setPrimaryUserDetailsETagAction = mutatorAction('setPrimaryUserDetailsETagAction', (userETag: string) => {\r\n const { raw } = getProfileStore();\r\n const { primaryUser } = raw;\r\n if (primaryUser?.eTag) {\r\n primaryUser.eTag = userETag;\r\n }\r\n});\r\n\r\nexport const setProfileEditModeAction = mutatorAction('setProfileEditModeAction', (isInEditMode: boolean) => {\r\n getPublisherProfileActiveData().isInEditMode = isInEditMode;\r\n});\r\n\r\nexport const initializeProfileActiveStateFromRawDataAction = mutatorAction('initializeProfileActiveStateFromRawDataAction', () => {\r\n const { raw } = getProfileStore();\r\n const { primaryUser } = raw;\r\n const publisher = getCurrentPublisher();\r\n const active = getPublisherProfileActiveData();\r\n active.publisher = deepClone(publisher);\r\n\r\n // NOTE: This is to keep the eTag updated with the server data\r\n if (active.publisher && publisher?.eTag) {\r\n active.publisher.eTag = publisher?.eTag;\r\n }\r\n active.user = deepClone(primaryUser);\r\n if (active.user && primaryUser?.eTag) {\r\n active.user.eTag = primaryUser.eTag;\r\n }\r\n\r\n // Initialize the country with the default country code if not set already\r\n if (active.user?.postalAddress && !active.user?.postalAddress?.country) {\r\n active.user.postalAddress.country = DEFAULT_COUNTRY_CODE;\r\n }\r\n if (active.publisher?.address && !active.publisher?.address?.country) {\r\n active.publisher.address.country = DEFAULT_COUNTRY_CODE;\r\n }\r\n});\r\n\r\nexport const setIsAddressValid = mutatorAction('setIsAddressValid', (isAddressValid?: boolean) => {\r\n const active = getPublisherProfileActiveData();\r\n active.isAddressValid = isAddressValid;\r\n});\r\n\r\nexport const setIsOrgAddressValid = mutatorAction('setIsOrgAddressValid', (isOrgAddressValid?: boolean) => {\r\n const active = getPublisherProfileActiveData();\r\n active.isOrgAddressValid = isOrgAddressValid;\r\n});\r\n\r\nexport const setPrimaryUserFieldAction = mutatorAction('setPrimaryUserFieldAction', (fieldName: string, fieldValue?: string) => {\r\n const primaryUser = getPrimaryUserActiveData();\r\n if (!primaryUser) {\r\n return;\r\n }\r\n\r\n if (fieldName === 'phoneNumber') {\r\n primaryUser.contactInfo = primaryUser.contactInfo || {};\r\n primaryUser.contactInfo.phone1 = fieldValue;\r\n return;\r\n }\r\n\r\n primaryUser.postalAddress = primaryUser.postalAddress || {};\r\n primaryUser.postalAddress[fieldName] = fieldValue;\r\n});\r\n\r\nexport const setPublisherFieldAction = mutatorAction('setPublisherFieldAction', (fieldName: string, fieldValue?: string) => {\r\n const publisher = getPublisherActiveData();\r\n if (!publisher) {\r\n return;\r\n }\r\n\r\n if (['organizationEmailAddress', 'organizationUrl', 'ceoName'].includes(fieldName)) {\r\n publisher.extendedProperties = publisher.extendedProperties || {};\r\n publisher.extendedProperties[fieldName] = fieldValue;\r\n return;\r\n }\r\n\r\n if (fieldName === 'name') {\r\n publisher.name = fieldValue;\r\n return;\r\n }\r\n\r\n publisher.address = publisher.address || {};\r\n publisher.address[fieldName] = fieldValue;\r\n});\r\n\r\nexport const setProfileErrorsAction = mutatorAction('setProfileErrorsAction', (errors?: IStringDictionary) => {\r\n getProfileStore().errors = errors || {};\r\n});\r\n\r\nexport const setIsSubmittedAction = mutatorAction('setIsSubmittedAction', (isSubmitted: boolean) => {\r\n getProfileStore().active.isSubmitted = isSubmitted;\r\n});\r\n\r\nexport const setIsPreviewShownAction = mutatorAction('setIsPreviewShownAction', (isPreviewShown: boolean) => {\r\n getProfileStore().active.isPreviewShown = isPreviewShown;\r\n});\r\n\r\nexport const setIsPhoneVerificationMethodsShown = mutatorAction(\r\n 'setIsPhoneVerificationMethodsShown',\r\n (isPhoneVerificationMethodsShown: boolean) => {\r\n getProfileStore().active.isPhoneVerificationMethodsShown = isPhoneVerificationMethodsShown;\r\n }\r\n);\r\n\r\nexport const setIsPhoneVerificationCodeShown = mutatorAction('setIsPhoneVerificationCodeShown', (isPhoneVerificationCodeShown: boolean) => {\r\n getProfileStore().active.isPhoneVerificationCodeShown = isPhoneVerificationCodeShown;\r\n});\r\n\r\nexport const setIsVerificationSuccess = mutatorAction('setIsPhoneVerificationSuccess', (isVerificationSuccess: boolean) => {\r\n getProfileStore().active.isVerificationSuccess = isVerificationSuccess;\r\n});\r\nexport const setIsCodeBeingVerified = mutatorAction('setIsCodeBeingVerified', (isCodeBeingVerified: boolean) => {\r\n getProfileStore().active.isCodeBeingVerified = isCodeBeingVerified;\r\n});\r\n\r\nexport const setPhoneVerificationMediumType = mutatorAction('setPhoneVerificationMediumType', (mediumType: PhoneVerificationMediumType) => {\r\n getProfileStore().active.phoneVerificationGenerateCode.verificationMediumType = mediumType;\r\n});\r\n\r\nexport const setPhoneVerificationCode = mutatorAction('setPhoneVerificationCode', (code: string) => {\r\n getProfileStore().active.phoneVerificationVerifyCode.code = code;\r\n});\r\n\r\nexport const setPhoneVerificationRequestId = mutatorAction('setPhoneVerificationRequestId', (requestId: string) => {\r\n getProfileStore().active.phoneVerificationVerifyCode.requestId = requestId;\r\n});\r\n\r\nexport const setPhoneVerificationResp = mutatorAction('setPhoneVerificationResp', (respData: IPhoneVerificationData) => {\r\n getProfileStore().active.phoneVerificationResp = respData;\r\n});\r\nexport const setVerificationCodeGenerationLimitReached = mutatorAction(\r\n 'setVerificationCodeGenerationLimitReached',\r\n (limitReached: boolean) => {\r\n getProfileStore().active.verificationCodeGenerationLimitReached = limitReached;\r\n }\r\n);\r\n","import { createStore } from 'satcheljs';\r\nimport { IPartnerManagementViewState } from './schema/IPartnerManagementViewState';\r\n\r\nexport enum RouteName {\r\n default = 'default',\r\n publisher = 'publisher',\r\n account = 'account',\r\n user = 'user'\r\n}\r\n\r\nexport const defaultRoute = RouteName.publisher;\r\n\r\nexport const getPageStore = createStore<IPartnerManagementViewState>('PartnerManagementViewState', {\r\n loading: false,\r\n invalid: false,\r\n panelIsOpen: false\r\n});\r\n","import { Icon, TooltipHost } from '@fluentui/react';\r\nimport React from 'react';\r\n\r\nexport interface IIconTooltipProps {\r\n tooltipMessage: string;\r\n iconName: string;\r\n}\r\n\r\nconst tooltipHostStyles = {\r\n root: {\r\n display: 'flex',\r\n },\r\n};\r\n\r\nexport const IconTooltip = ({ tooltipMessage: warningMessage, iconName }: IIconTooltipProps) => {\r\n return (\r\n <TooltipHost content={warningMessage} styles={tooltipHostStyles} aria-label={warningMessage}>\r\n <Icon iconName={iconName} />\r\n </TooltipHost>\r\n );\r\n};\r\n","import {\r\n IOverflowSetItemProps,\r\n IPanelProps,\r\n IPersonaStyleProps,\r\n IPersonaStyles,\r\n IStyle,\r\n IStyleFunctionOrObject,\r\n ITheme,\r\n PanelType,\r\n} from '@fluentui/react';\r\nimport { ReactNode } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { IUseCMUIExperience } from '../../hooks/useCMUIHelpExperience/index.types';\r\nimport { ISearchProps } from '../Search/Search.types';\r\n\r\nexport interface IHeaderItem extends IOverflowSetItemProps {\r\n title: string;\r\n icon?: string;\r\n identity?: IHeaderIdentity;\r\n type?: PanelTypes;\r\n panel?: React.ComponentType<object>;\r\n panelProps?: IPanelProps;\r\n query?: string;\r\n onClick?: () => void;\r\n shouldOverflowUnderExtraSmallScreen: boolean;\r\n showRedDot?: boolean;\r\n}\r\n\r\nexport enum PanelTypes {\r\n Profile = 'Profile',\r\n Feedback = 'Feedback',\r\n Notifications = 'Notifications',\r\n}\r\n\r\nexport interface IHeaderIdentity {\r\n name: string;\r\n email: string;\r\n}\r\n\r\nexport interface IHeaderProps<T> extends InjectedIntlProps {\r\n dropdownItems?: IHeaderDropdownItem[];\r\n items?: IHeaderItem[];\r\n loadingText?: string;\r\n onNavigate?: (path: string) => void;\r\n searchProps?: ISearchProps<T>;\r\n renderLeftIcon?: ReactNode;\r\n useCMUIHelpExperience: IUseCMUIExperience;\r\n}\r\n\r\nexport interface IHeaderDropdownItem {\r\n key: string;\r\n text: string;\r\n icon: string;\r\n}\r\n\r\nexport interface IHeaderItemProps {\r\n item: IHeaderItem;\r\n theme: ITheme;\r\n}\r\n\r\nexport interface IHeaderState {\r\n title: string;\r\n selectedItem?: IHeaderItem;\r\n currentRoute: string;\r\n announcedMessage?: string;\r\n panelType?: PanelType;\r\n isSearchBarActiveInNonRegularView: boolean;\r\n selectedLanguage: string;\r\n}\r\n\r\nexport interface IHeaderStyles {\r\n root: IStyle;\r\n itemIcon: IStyle;\r\n navigationLm: IStyle;\r\n leftSection: IStyle;\r\n rightSection?: IStyle;\r\n logo: IStyle;\r\n dropdownOption: IStyle;\r\n navItem: IStyle;\r\n textHeader: IStyle;\r\n helpCenterIcon: IStyle;\r\n moreInfoIcon: IStyle;\r\n overflowIcon: IStyle;\r\n overflowMenuWrapper: IStyle;\r\n subComponentStyles: {\r\n dropdown: IStyleFunctionOrObject<object, object>;\r\n itemIdentity: IStyleFunctionOrObject<IPersonaStyleProps, IPersonaStyles>;\r\n };\r\n dot: IStyle;\r\n defaultButtonWrapperStyle: IStyle;\r\n defaultButtonStyle: IStyle;\r\n}\r\n\r\nexport interface IHeaderStyleProps {\r\n theme: ITheme;\r\n isTythonExperience: boolean;\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n feedBackSuccessMessage: {\r\n id: 'feedBackSuccessMessage',\r\n defaultMessage: 'You’ve successfully submitted feedback',\r\n },\r\n});\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onFormSubmitted = action('onFormSubmitted', (hidePanel?: () => void) => ({ hidePanel }));\r\n","export enum FeedbackType {\r\n Appreciation = 'Appreciation',\r\n FeatureRequest = 'FeatureRequest',\r\n BugReport = 'BugReport',\r\n Others = 'Others',\r\n}\r\n","import { createStore } from 'satcheljs';\r\nimport { FeedbackType } from './schema/enums/FeedbackType';\r\nimport { IFeedbackPanelViewState } from './schema/IFeedbackPanelViewState';\r\n\r\nexport const getFeedbackPanelStore = createStore<IFeedbackPanelViewState>('FeedbackPanelState', {\r\n active: {\r\n type: FeedbackType.Appreciation,\r\n },\r\n errors: {},\r\n isPanelOpen: false,\r\n isContactMeChecked: false,\r\n});\r\n","import { IChoiceGroupOption } from '@fluentui/react';\r\nimport { mutatorAction } from 'satcheljs';\r\nimport { IStringDictionary } from '../../../../../../@data';\r\nimport { FeedbackType } from '../store/schema/enums/FeedbackType';\r\nimport { getFeedbackPanelStore } from '../store/store';\r\n\r\nexport const onFeedbackTypeChanged = mutatorAction('onFeedbackTypeChanged', (value?: IChoiceGroupOption) => {\r\n getFeedbackPanelStore().active.type = value?.key as FeedbackType;\r\n});\r\n\r\nexport const onFeedbackTitleChanged = mutatorAction('onFeedbackTitleChanged', (title?: string) => {\r\n getFeedbackPanelStore().active.title = title;\r\n});\r\n\r\nexport const onFeedbackDescriptionChanged = mutatorAction('onFeedbackDescriptionChanged', (description?: string) => {\r\n getFeedbackPanelStore().active.description = description;\r\n});\r\n\r\nexport const onFeedbackEmailChanged = mutatorAction('onFeedbackEmailChanged', (email?: string) => {\r\n getFeedbackPanelStore().active.email = email;\r\n});\r\n\r\nexport const onFeedbackPanelErrorChanged = mutatorAction('onFeedbackPanelErrorChanged', (values?: IStringDictionary) => {\r\n getFeedbackPanelStore().errors = values || {};\r\n});\r\n\r\nexport const onFormCleared = mutatorAction('onFormCleared', () => {\r\n getFeedbackPanelStore().active = {\r\n type: FeedbackType.Appreciation,\r\n };\r\n getFeedbackPanelStore().isContactMeChecked = false;\r\n getFeedbackPanelStore().errors = {};\r\n});\r\n\r\nexport const onFeedbackCheckboxChanged = mutatorAction('onFeedbackCheckboxChanged', (value: boolean) => {\r\n getFeedbackPanelStore().isContactMeChecked = value;\r\n if (!value) {\r\n delete getFeedbackPanelStore().errors.email;\r\n }\r\n});\r\n\r\nexport const removeEmail = mutatorAction('removeEmail', () => {\r\n delete getFeedbackPanelStore().active.email;\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport {\r\n NotificationLabel,\r\n NotificationSeverity,\r\n getAppStore,\r\n onNotificationCardAdded,\r\n onSavingChanged,\r\n postEntity,\r\n showErrorToastNotification,\r\n showSuccessToastNotification,\r\n} from '../../../../../../@data';\r\nimport { Feedback } from '../../../../../../@data/store/schema/models/Feedback';\r\nimport notificationMessages from '../../../../../../NotificationsPanel.Types.messages';\r\nimport ToastMessages from '../../../../../../Toasts.messages';\r\nimport { validateSchema } from '../../../../../../utils';\r\nimport { onFormSubmitted } from '../actions';\r\nimport { onFeedbackPanelErrorChanged, onFormCleared } from '../mutatorActions';\r\nimport { feedbackPanelErrorModel } from '../store/schema/FeedbackPanelErrorModel';\r\nimport { getFeedbackPanelStore } from '../store/store';\r\n\r\norchestrator(onFormSubmitted, async (msg) => {\r\n const { publisher, userContext } = getAppStore();\r\n const { active } = getFeedbackPanelStore();\r\n\r\n if (publisher) {\r\n // check if we need to create body\r\n const body: Feedback = {\r\n ...active,\r\n apiPath: undefined,\r\n className: 'feedback',\r\n };\r\n try {\r\n await validateSchema(feedbackPanelErrorModel(), active);\r\n onFeedbackPanelErrorChanged();\r\n } catch (e) {\r\n onFeedbackPanelErrorChanged(e);\r\n return;\r\n }\r\n onSavingChanged(true);\r\n try {\r\n await postEntity([publisher], Feedback, body, userContext);\r\n\r\n showSuccessToastNotification({ textMessageDescriptor: ToastMessages.feedBackSuccessMessage });\r\n\r\n onFormCleared();\r\n msg.hidePanel?.();\r\n } catch (e) {\r\n showErrorToastNotification({ textMessageDescriptor: notificationMessages.FeedbackErrorMessageContent });\r\n onNotificationCardAdded({\r\n // tslint:disable-next-line: no-any\r\n severity: NotificationSeverity.Error,\r\n titleMessageDescriptor: notificationMessages.FeedbackErrorMessageTitle,\r\n contentMessageDescriptor: notificationMessages.FeedbackErrorMessageContent,\r\n notificationLabel: NotificationLabel.FeedbackErrorMessage,\r\n });\r\n } finally {\r\n onSavingChanged(false);\r\n }\r\n } else {\r\n showErrorToastNotification({ textMessageDescriptor: notificationMessages.FeedBackInvalidFormMessageContent });\r\n onNotificationCardAdded({\r\n // tslint:disable-next-line: no-any\r\n severity: NotificationSeverity.Error,\r\n titleMessageDescriptor: notificationMessages.FeedBackInvalidFormMessageTitle,\r\n contentMessageDescriptor: notificationMessages.FeedBackInvalidFormMessageContent,\r\n notificationLabel: NotificationLabel.FeedBackInvalidFormMessage,\r\n });\r\n }\r\n});\r\n","import { object, string } from 'yup';\r\nimport { getFeedbackPanelStore } from '../store';\r\nimport { IFeedbackPanelViewModel } from './IFeedbackPanelViewModel';\r\n\r\nexport function feedbackPanelErrorModel() {\r\n return object<IFeedbackPanelViewModel>().shape({\r\n title: string().trim().required(),\r\n description: string().trim().required(),\r\n email: getFeedbackPanelStore().isContactMeChecked ? string().trim().email().required() : string().trim().email(),\r\n });\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n feedbackThank: {\r\n id: 'feedback.thank',\r\n defaultMessage: 'Thank you for providing us with {appName} feedback.',\r\n },\r\n feedbackSupport: {\r\n id: 'feedback.support',\r\n defaultMessage: 'We’d love to learn about your experience with {appName}. If you have any questions, please reach out to ',\r\n },\r\n feedbackType: {\r\n id: 'feedback.type',\r\n defaultMessage: 'Type of feedback',\r\n },\r\n feedbackRate: {\r\n id: 'feedback.rate',\r\n defaultMessage: 'Rate your experience',\r\n },\r\n feedbackRequired: {\r\n id: 'feedback.required',\r\n defaultMessage: 'Required',\r\n },\r\n feedbackSend: {\r\n id: 'feedback.send',\r\n defaultMessage: 'Send Feedback',\r\n },\r\n feedbackTitle: {\r\n id: 'feedback.title',\r\n defaultMessage: 'Title',\r\n },\r\n feedbackTitlePlaceholder: {\r\n id: 'feedback.titlePlaceholder',\r\n defaultMessage: 'Add a title for your feedback',\r\n },\r\n feedbackTellUsMore: {\r\n id: 'feedback.tellUsMore',\r\n defaultMessage: 'Tell us more',\r\n },\r\n feedbackTellUsMorePlaceholder: {\r\n id: 'feedback.tellUsMorePlaceholder',\r\n defaultMessage: 'Please don’t include any confidential or personal information in your feedback.',\r\n },\r\n feedbackAllowContact: {\r\n id: 'feedback.allowContact',\r\n defaultMessage: 'Allow us to follow up with you about your feedback.',\r\n },\r\n feedbackAllowContactPlaceholder: {\r\n id: 'feedback.allowContactPlaceholder',\r\n defaultMessage: 'Type your email address',\r\n },\r\n feedbackContactSupport: {\r\n id: 'feedback.contactSupport',\r\n defaultMessage: 'support.',\r\n },\r\n feedbackPrivacyStatement: {\r\n id: 'feedback.privacyStatement',\r\n defaultMessage:\r\n 'To improve our service, we may collect information about your account or device. For more details, please refer to the ',\r\n },\r\n feedbackMPS: {\r\n id: 'feedback.microsoftPrivacyStatement',\r\n defaultMessage: 'Microsoft privacy statement.',\r\n },\r\n feedbackCharacterCounter: {\r\n id: 'feedback.characterCounter',\r\n defaultMessage: '{currentCounter}/{limit} characters',\r\n },\r\n feedbackTypeAppreciation: {\r\n id: 'feedback.appreciation',\r\n defaultMessage: 'Appreciation',\r\n },\r\n feedbackTypeFeatureRequest: {\r\n id: 'feedback.featureRequest',\r\n defaultMessage: 'Feature request',\r\n },\r\n feedbackTypeBugReport: {\r\n id: 'feedback.bugReport',\r\n defaultMessage: 'Bug report',\r\n },\r\n feedbackTypeOther: {\r\n id: 'feedback.other',\r\n defaultMessage: 'Other',\r\n },\r\n feedbackDataCollection: {\r\n id: 'feedback.dataCollection',\r\n defaultMessage: `To request deletion of your submitted data, please contact our {supportTeamPlaceholder} with the subject \"Delete feedback data\".`,\r\n },\r\n supportTeamPlaceholder: {\r\n id: 'feedback.dataCollection.supportTeamPlaceholder',\r\n defaultMessage: 'support team',\r\n },\r\n deleteFeedbackDataFormSubject: {\r\n id: 'feedback.dataCollection.form.subject.deleteFeedbackData',\r\n defaultMessage: 'Delete feedback data',\r\n },\r\n});\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubCenterFonts, IPubcenterPalette, IPubcenterSpacing, IPubcenterTheme } from '../../../../../theme';\r\nimport { IFeedbackPanelClassNames } from './FeedbackPanel.types';\r\n\r\nexport const getClassNames = (): IFeedbackPanelClassNames => {\r\n const theme = (getTheme() as unknown) as IPubcenterTheme;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const { size12, size16 } = theme.fonts as IPubCenterFonts;\r\n const WIDTH = '456px';\r\n const OPTION_WIDTH = '111px';\r\n return mergeStyleSets({\r\n root: {\r\n position: 'relative',\r\n width: WIDTH,\r\n maxWidth: WIDTH,\r\n },\r\n titleStyle: {},\r\n descriptionStyle: {},\r\n checkboxStyle: {},\r\n emailTextBoxStyle: {\r\n marginTop: spacing.size8,\r\n },\r\n buttonSection: {\r\n display: 'flex',\r\n gap: spacing.size8\r\n },\r\n button: {\r\n marginRight: spacing.size2,\r\n },\r\n characterCounterStyle: {\r\n margin: '0',\r\n textAlign: 'right',\r\n size: size12,\r\n lineHeight: size16,\r\n color: palette.neutralSecondary,\r\n },\r\n links: {\r\n color: palette.themeDarkAlt,\r\n lineHeight: spacing.size22,\r\n cursor: 'pointer',\r\n textDecoration: 'underline',\r\n },\r\n subComponentStyles: {\r\n choiceGroup: {\r\n flexContainer: {\r\n display: 'flex',\r\n flexFlow: 'initial',\r\n alignItems: 'center',\r\n gap: spacing.size2,\r\n width: WIDTH,\r\n },\r\n },\r\n choiceGroupOption: {\r\n root: {},\r\n choiceFieldWrapper: {\r\n width: OPTION_WIDTH,\r\n },\r\n innerField: {\r\n width: OPTION_WIDTH,\r\n },\r\n labelWrapper: {\r\n width: OPTION_WIDTH,\r\n maxWidth: OPTION_WIDTH,\r\n },\r\n field: {\r\n width: OPTION_WIDTH,\r\n },\r\n },\r\n },\r\n });\r\n};\r\n","import {\r\n Checkbox,\r\n ChoiceGroup,\r\n DefaultButton,\r\n IChoiceGroupOption,\r\n IPanelProps,\r\n Link,\r\n mergeStyleSets,\r\n PrimaryButton,\r\n TextField,\r\n} from '@fluentui/react';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport { Log } from '../../../../../logging/src';\r\nimport { isTythonSelfServeUser } from '../../../../@data';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { FormItem } from '../../../../components/Form';\r\nimport { APP_NAME_NEW, APP_NAME_PUBCENTER, PRIVACY_STATEMENT, SUPPORT_EMAIL } from '../../../../constants/AppConstants';\r\nimport { connectToSupportTeam } from '../../../../pages/ad-management/Home/components/ResourcesSection/ResourcesSection';\r\nimport { injectIntlAndObserver } from '../../../../utils';\r\nimport { getFeedbackPanelStore } from './@data';\r\nimport { onFormSubmitted } from './@data/actions';\r\nimport {\r\n onFeedbackCheckboxChanged,\r\n onFeedbackDescriptionChanged,\r\n onFeedbackEmailChanged,\r\n onFeedbackTitleChanged,\r\n onFeedbackTypeChanged,\r\n onFormCleared,\r\n removeEmail,\r\n} from './@data/mutatorActions';\r\nimport { FeedbackType } from './@data/store/schema/enums/FeedbackType';\r\nimport messages from './FeedbackPanel.messages';\r\nimport { getClassNames } from './FeedbackPanel.styles';\r\nimport { IFeedbackPanelProps } from './FeedbackPanel.types';\r\n\r\nexport const renderFooterContent = (panelProps: IPanelProps) => <FeedbackPanelFooterButtons {...panelProps} />;\r\n\r\nexport const FeedbackPanelFooterButtons = observer(function (panelProps: IPanelProps) {\r\n const { button, buttonSection } = mergeStyleSets(getClassNames());\r\n const { active, isContactMeChecked } = getFeedbackPanelStore();\r\n const { title, description, email } = active;\r\n\r\n const onCancelClicked = () => {\r\n panelProps.onDismiss?.();\r\n onFormCleared();\r\n };\r\n\r\n const onSubmit = (): void => {\r\n if (!isContactMeChecked && active.email) {\r\n // remove email from active since it wont be validated because isContactMeChecked is false, to not to be sent to the BE\r\n removeEmail();\r\n }\r\n onFormSubmitted(panelProps.onDismiss);\r\n Log.debug('Feedback form submitted');\r\n };\r\n\r\n return (\r\n <div className={buttonSection}>\r\n <PrimaryButton className={button} onClick={() => onSubmit()} disabled={!title || !description || (isContactMeChecked && !email)}>\r\n <FormattedMessage {...AppMessages.submit} />\r\n </PrimaryButton>\r\n <DefaultButton onClick={() => onCancelClicked()}>\r\n <FormattedMessage {...AppMessages.cancel} />\r\n </DefaultButton>\r\n </div>\r\n );\r\n});\r\n\r\nexport const FeedbackPanel = injectIntlAndObserver<IFeedbackPanelProps>(function FeedbackPanelComponent(\r\n props: IFeedbackPanelProps\r\n): JSX.Element | null {\r\n const { formatMessage } = props.intl;\r\n const {\r\n root,\r\n titleStyle,\r\n descriptionStyle,\r\n characterCounterStyle,\r\n checkboxStyle,\r\n emailTextBoxStyle,\r\n links,\r\n subComponentStyles,\r\n } = mergeStyleSets(getClassNames());\r\n const store = getFeedbackPanelStore();\r\n const TITLE_LIMIT = 250;\r\n const DESCRIPTION_LIMIT = 2000;\r\n const FORM_ITEM_WIDTH = 456;\r\n\r\n const feedbackTypes: IChoiceGroupOption[] = [\r\n {\r\n key: FeedbackType.Appreciation,\r\n text: formatMessage(messages.feedbackTypeAppreciation),\r\n iconProps: { iconName: 'Emoji2' },\r\n styles: subComponentStyles.choiceGroupOption,\r\n },\r\n {\r\n key: FeedbackType.FeatureRequest,\r\n text: formatMessage(messages.feedbackTypeFeatureRequest),\r\n iconProps: { iconName: 'ClipboardList' },\r\n styles: subComponentStyles.choiceGroupOption,\r\n },\r\n {\r\n key: FeedbackType.BugReport,\r\n text: formatMessage(messages.feedbackTypeBugReport),\r\n iconProps: { iconName: 'Bug' },\r\n styles: subComponentStyles.choiceGroupOption,\r\n },\r\n {\r\n key: FeedbackType.Others,\r\n text: formatMessage(messages.feedbackTypeOther),\r\n iconProps: { iconName: 'CommentAdd' },\r\n styles: subComponentStyles.choiceGroupOption,\r\n },\r\n ];\r\n\r\n const checkedStateChanged = () => {\r\n onFeedbackCheckboxChanged(!store.isContactMeChecked);\r\n };\r\n\r\n return (\r\n <div className={root}>\r\n <p>\r\n {formatMessage(messages.feedbackSupport, { appName: isTythonSelfServeUser() ? APP_NAME_NEW : APP_NAME_PUBCENTER })}\r\n <Link\r\n className={links}\r\n onClick={isTythonSelfServeUser() ? () => connectToSupportTeam() : () => null}\r\n href={isTythonSelfServeUser() ? undefined : `mailto:${SUPPORT_EMAIL}`}\r\n aria-label={formatMessage(messages.feedbackContactSupport)}\r\n >\r\n {formatMessage(messages.feedbackContactSupport)}\r\n </Link>\r\n </p>\r\n\r\n <FormItem formWidth={FORM_ITEM_WIDTH}>\r\n <ChoiceGroup\r\n label={formatMessage(messages.feedbackType)}\r\n required\r\n options={feedbackTypes}\r\n onChange={(_, value) => onFeedbackTypeChanged(value)}\r\n selectedKey={store.active.type || FeedbackType.Appreciation}\r\n styles={subComponentStyles.choiceGroup}\r\n />\r\n </FormItem>\r\n\r\n <div className={titleStyle}>\r\n <FormItem formWidth={FORM_ITEM_WIDTH}>\r\n <TextField\r\n label={formatMessage(messages.feedbackTitle)}\r\n required\r\n placeholder={formatMessage(messages.feedbackTitlePlaceholder)}\r\n value={store.active.title || ''}\r\n maxLength={TITLE_LIMIT}\r\n onChange={(ev, value) => {\r\n onFeedbackTitleChanged(value);\r\n }}\r\n errorMessage={store.errors.title}\r\n />\r\n <p id=\"titleCounterLabel\" className={characterCounterStyle}>\r\n {formatMessage(messages.feedbackCharacterCounter, {\r\n currentCounter: store.active.title ? store.active.title.length : 0,\r\n limit: TITLE_LIMIT,\r\n })}\r\n </p>\r\n </FormItem>\r\n </div>\r\n <div className={descriptionStyle}>\r\n <FormItem formWidth={FORM_ITEM_WIDTH}>\r\n <TextField\r\n label={formatMessage(messages.feedbackTellUsMore)}\r\n required\r\n multiline\r\n rows={4}\r\n maxLength={DESCRIPTION_LIMIT}\r\n placeholder={formatMessage(messages.feedbackTellUsMorePlaceholder)}\r\n value={store.active.description || ''}\r\n onChange={(ev, value) => {\r\n onFeedbackDescriptionChanged(value);\r\n }}\r\n errorMessage={store.errors.description}\r\n />\r\n <div>\r\n <p id=\"descriptionCounterLabel\" className={characterCounterStyle}>\r\n {formatMessage(messages.feedbackCharacterCounter, {\r\n currentCounter: store.active.description ? store.active.description.length : 0,\r\n limit: DESCRIPTION_LIMIT,\r\n })}\r\n </p>\r\n </div>\r\n </FormItem>\r\n </div>\r\n <div className={checkboxStyle}>\r\n <Checkbox label={formatMessage(messages.feedbackAllowContact)} checked={store.isContactMeChecked} onChange={checkedStateChanged} />\r\n {store.isContactMeChecked && (\r\n <TextField\r\n className={emailTextBoxStyle}\r\n aria-label={formatMessage(messages.feedbackAllowContact)}\r\n placeholder={formatMessage(messages.feedbackAllowContactPlaceholder)}\r\n onChange={(ev, value) => onFeedbackEmailChanged(value)}\r\n errorMessage={store.errors.email}\r\n value={store.active.email}\r\n />\r\n )}\r\n </div>\r\n <div>\r\n <p>\r\n {formatMessage(messages.feedbackPrivacyStatement)}\r\n <a\r\n href={PRIVACY_STATEMENT}\r\n target=\"_blank\"\r\n className={links}\r\n aria-label={formatMessage(messages.feedbackMPS)}\r\n rel=\"noopener noreferrer\"\r\n >\r\n {formatMessage(messages.feedbackMPS)}\r\n </a>\r\n </p>\r\n </div>\r\n <div>\r\n <FormattedMessage\r\n {...messages.feedbackDataCollection}\r\n values={{\r\n supportTeamPlaceholder: (\r\n <Link\r\n className={links}\r\n onClick={\r\n isTythonSelfServeUser()\r\n ? () => connectToSupportTeam(`subject=${formatMessage(messages.deleteFeedbackDataFormSubject)}`)\r\n : () => null\r\n }\r\n href={isTythonSelfServeUser() ? undefined : `mailto:${SUPPORT_EMAIL}`}\r\n >\r\n {formatMessage(messages.supportTeamPlaceholder)}\r\n </Link>\r\n ),\r\n }}\r\n />\r\n </div>\r\n </div>\r\n );\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n helpNotImplemented: {\r\n id: 'help.notImplemented',\r\n defaultMessage: 'Help Not Implemented Yet'\r\n },\r\n});","import * as React from 'react';\r\nimport { injectIntl, InjectedIntlProps } from 'react-intl';\r\nimport messages from './HelpPanel.messages';\r\n\r\nexport const HelpPanel = injectIntl(class extends React.Component<InjectedIntlProps> {\r\n public render(): JSX.Element {\r\n const { formatMessage } = this.props.intl;\r\n return (\r\n <p>{formatMessage(messages.helpNotImplemented)}</p>\r\n );\r\n }\r\n});\r\n","import { BaseComponent, Icon, PrimaryButton, Stack, classNamesFunction } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { NotificationSeverity } from '../../@data';\r\nimport { INotificationCardProps, INotificationCardStyleProps, INotificationCardStyles } from './NotificationCard.types';\r\n\r\nconst getClassNames = classNamesFunction<INotificationCardStyleProps, INotificationCardStyles>();\r\n\r\nexport class NotificationCardBase extends BaseComponent<INotificationCardProps> {\r\n public render(): JSX.Element {\r\n const {\r\n styles,\r\n theme,\r\n title,\r\n content,\r\n severity,\r\n onDismiss,\r\n onPrimaryActionClicked,\r\n onSecondaryActionClicked,\r\n timestamp,\r\n primaryActionText,\r\n primaryActionLink,\r\n dismissLabel,\r\n yesterdayLabel,\r\n twoDaysAgoLabel,\r\n threeDaysAgoLabel,\r\n primaryIsExternal,\r\n secondaryActionText,\r\n secondaryActionLink,\r\n secondaryIsExternal\r\n } = this.props;\r\n const classNames = getClassNames(styles, { theme: theme!, severity: severity });\r\n\r\n const formattedTime = this.getFormattedDate(new Date(timestamp), yesterdayLabel, twoDaysAgoLabel, threeDaysAgoLabel);\r\n\r\n return (\r\n <div className={classNames.cardContainerStyle}>\r\n <Stack>\r\n <div className={classNames.headerRowStyle}>\r\n <Stack horizontal horizontalAlign=\"space-between\">\r\n <div className={classNames.leftContainerStyle}>\r\n <Icon iconName={this.getIconName(severity)} className={classNames.iconStyle} />\r\n </div>\r\n\r\n <div className={classNames.rightContainerStyle}>\r\n <Stack>\r\n <div className={classNames.titleStyle}>{title}</div>\r\n <div className={classNames.contentStyle}>{content}</div>\r\n <div className={classNames.timestampStyle}>{formattedTime}</div>\r\n </Stack>\r\n </div>\r\n </Stack>\r\n </div>\r\n <Stack horizontal>\r\n {primaryIsExternal && (\r\n <PrimaryButton className={classNames.buttonStyle} onClick={onPrimaryActionClicked}>\r\n <span>{primaryActionText}</span>\r\n </PrimaryButton>\r\n )}\r\n {primaryActionLink && !primaryIsExternal && (\r\n <Link to={primaryActionLink} className={classNames.linkStyle} onClick={onPrimaryActionClicked}>\r\n <span>{primaryActionText}</span>\r\n </Link>\r\n )}\r\n {secondaryIsExternal && (\r\n <PrimaryButton className={classNames.buttonStyle} onClick={onSecondaryActionClicked}>\r\n <span>{secondaryActionText}</span>\r\n </PrimaryButton>\r\n )}\r\n {secondaryActionLink && !secondaryIsExternal && (\r\n <Link to={secondaryActionLink} className={classNames.linkStyle} onClick={onSecondaryActionClicked}>\r\n <span>{secondaryActionText}</span>\r\n </Link>\r\n )}\r\n\r\n <PrimaryButton onClick={onDismiss} className={classNames.buttonStyle}>\r\n <span>{dismissLabel}</span>\r\n </PrimaryButton>\r\n </Stack>\r\n </Stack>\r\n </div>\r\n );\r\n }\r\n\r\n private getIconName = (severity: NotificationSeverity) => {\r\n switch (severity) {\r\n case NotificationSeverity.Informational:\r\n return 'Info';\r\n case NotificationSeverity.Warning:\r\n return 'Warning';\r\n case NotificationSeverity.Critical:\r\n return 'ErrorBadge';\r\n case NotificationSeverity.Announcements:\r\n return 'Announcements';\r\n case NotificationSeverity.Error:\r\n return 'StatusErrorFull';\r\n }\r\n };\r\n\r\n private isSameDay = (date1: Date, date2: Date) => {\r\n return date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth() && date1.getDate() === date2.getDate();\r\n };\r\n\r\n private getPreviousDay = (date: Date, numDays: number) => {\r\n const previousDay = new Date(date);\r\n previousDay.setDate(previousDay.getDate() - numDays);\r\n return previousDay;\r\n };\r\n\r\n private getFormattedDate = (date: Date, yesterdayLabel: string, twoDaysAgoLabel: string, threeDaysAgoLabel: string) => {\r\n const today = new Date();\r\n const yesterday = new Date(today);\r\n yesterday.setDate(yesterday.getDate() - 1);\r\n\r\n if (this.isSameDay(date, today)) {\r\n return date.toLocaleString([], {\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n });\r\n } else if (this.isSameDay(date, yesterday)) {\r\n return yesterdayLabel;\r\n } else if (this.isSameDay(date, this.getPreviousDay(today, 2))) {\r\n return twoDaysAgoLabel;\r\n } else if (this.isSameDay(date, this.getPreviousDay(today, 3))) {\r\n return threeDaysAgoLabel;\r\n } else {\r\n return date.toLocaleString([], { year: 'numeric', month: '2-digit', day: '2-digit' });\r\n }\r\n };\r\n}\r\n","import { BreakPoints, IPubCenterFonts, IPubcenterTheme } from '../../../theme';\r\nimport { NotificationSeverity } from '../../@data';\r\nimport { flexWithJustifyBetween } from '../../utils/GlobalStyleUtils';\r\nimport { INotificationCardStyleProps, INotificationCardStyles } from './NotificationCard.types';\r\n\r\nexport const getStyles = (props: INotificationCardStyleProps): INotificationCardStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { size14 } = theme.fonts as IPubCenterFonts;\r\n const severity = props.severity;\r\n const { spacing } = theme;\r\n const { ResponsiveSmall } = BreakPoints;\r\n\r\n return {\r\n root: {},\r\n cardContainerStyle: {\r\n display: 'flex',\r\n boxShadow: '0px 0.3px 0.9px rgba(0, 0, 0, 0.1), 0px 1.6px 3.6px rgba(0, 0, 0, 0.13)',\r\n borderRadius: 2,\r\n background: '#f9f9f9',\r\n [ResponsiveSmall]: {\r\n flexWrap: 'wrap',\r\n },\r\n marginBottom: spacing.size8,\r\n padding: spacing.size12,\r\n },\r\n iconStyle: {\r\n color: severity === NotificationSeverity.Critical ? '#A80000' : severity === NotificationSeverity.Warning ? '#D83B01' : '#797775',\r\n },\r\n headerRowStyle: {\r\n ...flexWithJustifyBetween,\r\n borderBottom: `1px solid ${theme.palette.neutralQuaternaryAlt}`,\r\n },\r\n leftContainerStyle: {},\r\n contentStyle: {\r\n marginTop: spacing.size4,\r\n marginBottom: spacing.size4,\r\n },\r\n titleStyle: {\r\n fontWeight: '600',\r\n lineHeight: '14px',\r\n },\r\n rightContainerStyle: {\r\n paddingLeft: spacing.size8,\r\n },\r\n buttonStyle: {\r\n ...size14,\r\n color: theme.palette.highContrastPrimary,\r\n paddingTop: spacing.size8,\r\n textDecoration: 'none',\r\n paddingRight: '0px',\r\n border: 'none',\r\n background: 'transparent',\r\n '&:hover': {\r\n background: 'transparent',\r\n border: 'none',\r\n color: theme.palette.highContrastPrimary,\r\n textDecoration: 'none',\r\n },\r\n '&:active': {\r\n background: 'transparent',\r\n border: 'none',\r\n color: theme.palette.highContrastPrimary,\r\n textDecoration: 'none',\r\n },\r\n },\r\n linkStyle: {\r\n ...size14,\r\n paddingLeft: spacing.size20,\r\n color: theme.palette.themePrimary,\r\n textDecoration: 'none',\r\n paddingTop: spacing.size10,\r\n },\r\n timestampStyle: {\r\n marginTop: spacing.size12,\r\n marginBottom: spacing.size12,\r\n color: '#727272',\r\n },\r\n subComponentStyles: {\r\n messageCard: {\r\n root: {\r\n marginBottom: theme.spacing.s1,\r\n selectors: {\r\n '&:last-child': {\r\n marginBottom: 0,\r\n },\r\n },\r\n },\r\n },\r\n },\r\n };\r\n};\r\n","import { styled } from '@fluentui/react';\r\nimport { NotificationCardBase } from './NotificationCard.base';\r\nimport { getStyles } from './NotificationCard.styles';\r\nimport { INotificationCardProps, INotificationCardStyleProps, INotificationCardStyles } from './NotificationCard.types';\r\n\r\nexport const NotificationCard = styled<INotificationCardProps, INotificationCardStyleProps, INotificationCardStyles>(\r\n NotificationCardBase,\r\n getStyles,\r\n undefined,\r\n {\r\n scope: 'NotificationCard',\r\n }\r\n);\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n notificationsNotImplements: {\r\n id: 'notifications.notImplemented',\r\n defaultMessage: 'Notifications Not Implemented Yet',\r\n },\r\n dismissAll: {\r\n id: 'notifications.dismissAll',\r\n defaultMessage: 'Dismiss All',\r\n },\r\n dismiss: {\r\n id: 'notifications.dismiss',\r\n defaultMessage: 'Dismiss',\r\n },\r\n yesterday: {\r\n id: 'notifications.yesterday',\r\n defaultMessage: 'Yesterday',\r\n },\r\n threeDaysAgo: {\r\n id: 'notifications.threeDaysAgo',\r\n defaultMessage: '3 days ago',\r\n },\r\n twoDaysAgo: {\r\n id: 'notifications.twoDaysAgo',\r\n defaultMessage: '2 days ago',\r\n },\r\n allSet: {\r\n id: 'notifications.allSet',\r\n defaultMessage: \"You'\\rre all up-to-date! No new notifications at the moment.\",\r\n },\r\n activityLogsHint: {\r\n id: 'notifications.activityLogsHint',\r\n defaultMessage: 'More events in the activity logs',\r\n },\r\n critical: {\r\n id: 'notifications.critical',\r\n defaultMessage: 'Critical',\r\n },\r\n warning: {\r\n id: 'notifications.warning',\r\n defaultMessage: 'Warning',\r\n },\r\n informational: {\r\n id: 'notifications.informational',\r\n defaultMessage: 'Informational',\r\n },\r\n error: {\r\n id: 'notifications.error',\r\n defaultMessage: 'Error',\r\n },\r\n});\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubCenterFonts, IPubcenterSpacing, IPubcenterTheme } from '../../../../../theme';\r\nimport { INotificationsPanelClassNames } from './NotificationsPanel.types';\r\n\r\nexport const getClassNames = (): INotificationsPanelClassNames => {\r\n const theme = (getTheme() as unknown) as IPubcenterTheme;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const WIDTH = '456px';\r\n const { size16 } = theme.fonts as IPubCenterFonts;\r\n return mergeStyleSets({\r\n root: {\r\n position: 'relative',\r\n width: WIDTH,\r\n maxWidth: WIDTH,\r\n },\r\n dismissAll: {\r\n marginRight: spacing.size2,\r\n },\r\n emptySection: {\r\n textAlign: 'center',\r\n flexDirection: 'column',\r\n },\r\n textContent: {\r\n marginTop: spacing.size8,\r\n marginBottom: '0px',\r\n fontSize: size16.fontSize,\r\n },\r\n panelParent: {\r\n height: '100%',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n img: {\r\n width: '160px',\r\n height: '160px',\r\n marginBottom: spacing.size8,\r\n },\r\n });\r\n};\r\n","import { IPanelProps, List, PrimaryButton, mergeStyleSets } from '@fluentui/react';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { FormattedMessage, InjectedIntlProps, MessageValue } from 'react-intl';\r\nimport {\r\n NotificationLabel,\r\n NotificationSeverity,\r\n getAppStore,\r\n onDismissAllNotifications,\r\n onDismissNotification,\r\n onNotificationPanelClosed,\r\n primaryExternalNotificationLabels,\r\n} from '../../../../@data';\r\nimport notificationMessages from '../../../../NotificationsPanel.Types.messages';\r\nimport { FormSection } from '../../../../components/Form';\r\nimport { INotificationCardItem, NotificationCard } from '../../../../components/NotificationCard';\r\nimport { onResendClarityLink } from '../../../../pages/ad-management/Property/Create/__data__/orchestrators';\r\nimport { setNotificationPanelTriggered } from '../../../../pages/terms-and-conditions/@data';\r\nimport { injectIntlAndObserver } from '../../../../utils';\r\nimport messages from './NotificationsPanel.messages';\r\nimport { getClassNames } from './NotificationsPanel.styles';\r\nimport emptyNotifications from './resources/empty.svg';\r\n\r\nexport const renderNotificationFooterContent = (panelProps: IPanelProps) => <NotificationPanelFooterButtons {...panelProps} />;\r\n\r\nexport const NotificationPanelFooterButtons = observer(function (panelProps: IPanelProps) {\r\n const { dismissAll } = mergeStyleSets(getClassNames());\r\n const { panelNotifications, notificationPanelCollapsed } = getAppStore();\r\n if (notificationPanelCollapsed) {\r\n panelProps.onDismiss?.();\r\n onNotificationPanelClosed(false);\r\n }\r\n\r\n const onDismissAll = (): void => {\r\n onDismissAllNotifications();\r\n };\r\n\r\n return (\r\n <div>\r\n {panelNotifications && panelNotifications.length > 0 && (\r\n <div>\r\n <PrimaryButton className={dismissAll} onClick={() => onDismissAll()}>\r\n <FormattedMessage {...messages.dismissAll} />\r\n </PrimaryButton>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n});\r\n\r\nexport const NotificationsPanel = injectIntlAndObserver(\r\n class extends React.Component<InjectedIntlProps> {\r\n public render(): JSX.Element {\r\n const { formatMessage } = this.props.intl;\r\n const { emptySection, panelParent, textContent, img } = mergeStyleSets(getClassNames());\r\n const { panelNotifications } = getAppStore();\r\n const getFormattedMessage = (key: string, fallback: string | undefined, values?: Record<string, MessageValue>) => {\r\n const message = notificationMessages[key];\r\n if (message) {\r\n return formatMessage(message, values);\r\n }\r\n return fallback;\r\n };\r\n const onRenderNotificationCard = (item: INotificationCardItem, index: number): JSX.Element => {\r\n return (\r\n <NotificationCard\r\n title={\r\n item.notificationLabel\r\n ? getFormattedMessage(item.notificationLabel + 'Title', item.title) ?? ''\r\n : item.title\r\n ? item.title\r\n : item.titleMessageDescriptor\r\n ? formatMessage(item.titleMessageDescriptor)\r\n : ''\r\n }\r\n severity={item.severity}\r\n timestamp={item.timestamp!}\r\n content={\r\n item.notificationLabel\r\n ? getFormattedMessage(item.notificationLabel + 'Content', item.content, item.intlContentMessageValues)\r\n : item.content\r\n ? item.content\r\n : item.contentMessageDescriptor\r\n ? formatMessage(item.contentMessageDescriptor, item.intlContentMessageValues)\r\n : ''\r\n }\r\n dismissLabel={formatMessage(messages.dismiss)}\r\n onDismiss={() => this._onDismiss(item)}\r\n yesterdayLabel={formatMessage(messages.yesterday)}\r\n threeDaysAgoLabel={formatMessage(messages.threeDaysAgo)}\r\n twoDaysAgoLabel={formatMessage(messages.twoDaysAgo)}\r\n primaryActionLink={item.primaryActionLink}\r\n primaryActionText={\r\n item.primaryActionTextMessageDescriptor\r\n ? formatMessage(item.primaryActionTextMessageDescriptor)\r\n : item.notificationLabel\r\n ? getFormattedMessage(item.notificationLabel + 'PrimaryActionLabel', item.primaryActionText)\r\n : item.primaryActionText\r\n }\r\n secondaryActionLink={item.secondaryActionLink}\r\n secondaryActionText={\r\n item.notificationLabel\r\n ? getFormattedMessage(item.notificationLabel + 'SecondaryActionLabel', item.secondaryActionText)\r\n : item.secondaryActionText\r\n }\r\n onPrimaryActionClicked={() => this._onPrimaryActionClicked(item)}\r\n onSecondaryActionClicked={() => this._onSecondaryActionClicked(item)}\r\n primaryIsExternal={this._isPrimaryExternal(item)}\r\n secondaryIsExternal={item.secondaryActionText !== undefined}\r\n />\r\n );\r\n };\r\n\r\n const criticalNotifications =\r\n panelNotifications && panelNotifications.filter((notification) => notification.severity === NotificationSeverity.Critical);\r\n const warningNotifications =\r\n panelNotifications && panelNotifications.filter((notification) => notification.severity === NotificationSeverity.Warning);\r\n const infoNotifications =\r\n panelNotifications && panelNotifications.filter((notification) => notification.severity === NotificationSeverity.Informational);\r\n const errorNotifications =\r\n panelNotifications && panelNotifications.filter((notification) => notification.severity === NotificationSeverity.Error);\r\n\r\n criticalNotifications?.sort((a, b) => new Date(b.timestamp!).getTime() - new Date(a.timestamp!).getTime());\r\n warningNotifications?.sort((a, b) => new Date(b.timestamp!).getTime() - new Date(a.timestamp!).getTime());\r\n infoNotifications?.sort((a, b) => new Date(b.timestamp!).getTime() - new Date(a.timestamp!).getTime());\r\n errorNotifications?.sort((a, b) => new Date(b.timestamp!).getTime() - new Date(a.timestamp!).getTime());\r\n\r\n return (\r\n <div className={panelNotifications?.length === 0 ? panelParent : ''}>\r\n {panelNotifications?.length === 0 && (\r\n <div className={emptySection}>\r\n <img className={img} src={emptyNotifications} alt={emptyNotifications} />\r\n <p className={textContent}>{formatMessage(messages.allSet)}</p>\r\n </div>\r\n )}\r\n {criticalNotifications && criticalNotifications.length > 0 && (\r\n <div>\r\n <FormSection\r\n title={formatMessage(messages.critical) + ' (' + criticalNotifications.length + ')'}\r\n formWidth={412}\r\n rightChevron\r\n expanded={true}\r\n >\r\n <List items={Object.values(criticalNotifications)} onRenderCell={onRenderNotificationCard} />\r\n </FormSection>\r\n </div>\r\n )}\r\n\r\n {warningNotifications && warningNotifications.length > 0 && (\r\n <div>\r\n <FormSection\r\n title={formatMessage(messages.warning) + ' (' + warningNotifications.length + ')'}\r\n formWidth={412}\r\n rightChevron\r\n expanded={true}\r\n >\r\n <List items={Object.values(warningNotifications)} onRenderCell={onRenderNotificationCard} />\r\n </FormSection>\r\n </div>\r\n )}\r\n\r\n {errorNotifications && errorNotifications.length > 0 && (\r\n <div>\r\n <FormSection\r\n title={formatMessage(messages.error) + ' (' + errorNotifications.length + ')'}\r\n formWidth={412}\r\n rightChevron\r\n expanded={true}\r\n >\r\n <List items={Object.values(errorNotifications)} onRenderCell={onRenderNotificationCard} />\r\n </FormSection>\r\n </div>\r\n )}\r\n\r\n {infoNotifications && infoNotifications.length > 0 && (\r\n <div>\r\n <FormSection\r\n title={formatMessage(messages.informational) + ' (' + infoNotifications.length + ')'}\r\n formWidth={412}\r\n rightChevron\r\n expanded={true}\r\n >\r\n <List items={Object.values(infoNotifications)} onRenderCell={onRenderNotificationCard} />\r\n </FormSection>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n private _onDismiss = (item: INotificationCardItem): void => {\r\n onDismissNotification(item);\r\n };\r\n\r\n private _onPrimaryActionClicked = (item: INotificationCardItem): void => {\r\n if (item.notificationLabel && item.notificationLabel === NotificationLabel.PolicyUpdate) {\r\n setNotificationPanelTriggered(true);\r\n }\r\n if (\r\n item.notificationLabel &&\r\n (item.notificationLabel === NotificationLabel.ClarityLinkDeclined ||\r\n item.notificationLabel === NotificationLabel.ClarityLinkExpired)\r\n ) {\r\n if (item.propertyBag) {\r\n const propertyId = item.propertyBag['propertyId'];\r\n const clarityId = item.propertyBag['clarityId'];\r\n onResendClarityLink(propertyId, clarityId);\r\n }\r\n }\r\n onDismissNotification(item);\r\n onNotificationPanelClosed(true);\r\n };\r\n\r\n private _onSecondaryActionClicked = (item: INotificationCardItem): void => {\r\n onDismissNotification(item);\r\n onNotificationPanelClosed(true);\r\n };\r\n\r\n private _isPrimaryExternal = (item: INotificationCardItem): boolean => {\r\n return !!item.notificationLabel && primaryExternalNotificationLabels.includes(item.notificationLabel);\r\n };\r\n }\r\n);\r\n","import { getTheme, IButtonStyles, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterPalette, IPubcenterSpacing } from '../../../../../theme';\r\n\r\nexport interface IProfileHeaderStyleProps {}\r\n\r\nexport interface IProfileHeaderStyles {\r\n actionButtonsWrapper?: string;\r\n dropDownWrapper?: string;\r\n iconStyle?: string;\r\n}\r\n\r\nexport const getClassNames = (props: IProfileHeaderStyleProps): IProfileHeaderStyles => {\r\n const theme = getTheme();\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return mergeStyleSets({\r\n actionButtonsWrapper: {\r\n marginTop: spacing.size8,\r\n },\r\n dropDownWrapper: {\r\n display: 'flex',\r\n padding: `${spacing.size0} ${spacing.size4}`,\r\n height: spacing.size40,\r\n alignItems: 'center',\r\n },\r\n iconStyle: {\r\n paddingLeft: spacing.size5,\r\n },\r\n });\r\n};\r\n\r\nexport function getButtonStyles(): IButtonStyles {\r\n const theme = getTheme();\r\n const pallete = theme.palette as IPubcenterPalette;\r\n\r\n return {\r\n root: {\r\n width: '100%',\r\n },\r\n rootHovered: {\r\n backgroundColor: pallete.neutralLighter,\r\n color: pallete.neutralPrimary,\r\n },\r\n icon: {\r\n color: pallete.neutralPrimary,\r\n },\r\n iconHovered: {\r\n color: pallete.neutralPrimary,\r\n },\r\n iconPressed: {\r\n color: pallete.neutralPrimary,\r\n },\r\n };\r\n}\r\n\r\nexport const getDropdownStyles = () => {\r\n const theme = getTheme();\r\n const size = theme.spacing as IPubcenterSpacing;\r\n return {\r\n root: {\r\n '.ms-Dropdown-title': {\r\n borderWidth: size.size0,\r\n },\r\n },\r\n };\r\n};\r\n","import { ActionButton, Dropdown, Icon, Persona, PersonaPresence, PersonaSize } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\nimport {\r\n getAppStore,\r\n getEntityAccessPermissions,\r\n isPublisherRejectionUnappealable,\r\n isTythonSelfServeUser,\r\n onAuthLogout,\r\n} from '../../../../@data';\r\nimport { UserRoleEntity, completeAccess, hasReadAccess } from '../../../../@data/services/UserRoleService';\r\nimport { NavigationMenu } from '../../../../@data/store/schema/userrolemodels/NavigationMenu';\r\nimport { getSupportedLanguagesDropDownOptions } from '../../../../@data/utils/supportedLanguages';\r\nimport { RoutePrefix } from '../../../../Routes';\r\nimport { LOCAL_STORAGE_LOCALE } from '../../../../constants';\r\nimport { RouteName } from '../../../../pages/ad-management/@data';\r\nimport { onUpdateUserLanguage } from '../../../../pages/ad-management/Account/Settings/@data/actions';\r\nimport { injectRouterWithIntl } from '../../../../utils/ReactUtils';\r\nimport messages from './ProfilePanel.messages';\r\nimport { getButtonStyles, getClassNames, getDropdownStyles } from './ProfilePanel.styles';\r\n\r\nexport interface IProfileHeaderProps extends RouteComponentProps, InjectedIntlProps {\r\n hidePanel: () => void;\r\n}\r\n\r\nexport const ProfilePanel = injectRouterWithIntl(\r\n class extends React.Component<IProfileHeaderProps> {\r\n public render(): JSX.Element {\r\n const userContext = getAppStore().userContext;\r\n const publisher = getAppStore().publisher;\r\n const localStorageLocale = localStorage.getItem(LOCAL_STORAGE_LOCALE);\r\n\r\n const { actionButtonsWrapper, dropDownWrapper, iconStyle } = getClassNames({});\r\n const buttonStyles = getButtonStyles();\r\n const dropdownStyles = getDropdownStyles();\r\n const signingUp: boolean = publisher === undefined && userContext?.id === undefined;\r\n\r\n const accessPermissions = getEntityAccessPermissions(UserRoleEntity.NavigationMenu) as NavigationMenu | null;\r\n const hasAccessToAuditHistory = hasReadAccess(accessPermissions ? accessPermissions.auditHistory : completeAccess);\r\n\r\n const name = userContext && userContext.name;\r\n const email = userContext && userContext.email;\r\n const { formatMessage } = this.props.intl;\r\n return (\r\n <React.Fragment>\r\n <Persona\r\n text={name}\r\n secondaryText={email}\r\n size={PersonaSize.size48}\r\n presence={PersonaPresence.online}\r\n showSecondaryText={true}\r\n hidePersonaDetails={false}\r\n />\r\n <div className={actionButtonsWrapper}>\r\n {isTythonSelfServeUser() && (\r\n <ActionButton\r\n iconProps={{ iconName: 'PlayerSettings' }}\r\n onClick={this._onUserSettingsButtonClicked}\r\n styles={buttonStyles}\r\n disabled={signingUp || isPublisherRejectionUnappealable()}\r\n >\r\n {formatMessage(messages.userSettings)}\r\n </ActionButton>\r\n )}\r\n {hasAccessToAuditHistory && (\r\n <ActionButton\r\n iconProps={{ iconName: 'ChangeEntitlements' }}\r\n styles={buttonStyles}\r\n onClick={this._onAuditHistoryButtonClicked}\r\n disabled={signingUp || isPublisherRejectionUnappealable()}\r\n >\r\n {formatMessage(messages.auditHistory)}\r\n </ActionButton>\r\n )}\r\n\r\n {!signingUp && isTythonSelfServeUser() && (\r\n <div className={dropDownWrapper}>\r\n <Icon iconName=\"LocaleLanguage\" className={iconStyle} />\r\n <Dropdown\r\n options={getSupportedLanguagesDropDownOptions(getAppStore().locale)}\r\n onChange={this._onUserLanguageChanged}\r\n selectedKey={localStorageLocale}\r\n styles={dropdownStyles}\r\n disabled={signingUp}\r\n dropdownWidth=\"auto\"\r\n />\r\n </div>\r\n )}\r\n\r\n <ActionButton iconProps={{ iconName: 'SignOut' }} onClick={() => onAuthLogout()} styles={buttonStyles} disabled={signingUp}>\r\n {formatMessage(messages.profileSignOut)}\r\n </ActionButton>\r\n </div>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private _onUserSettingsButtonClicked = () => {\r\n this.props.hidePanel();\r\n const { publisher } = getAppStore();\r\n const settingsPageRoute = `/${RoutePrefix.adManagement}/${publisher ? publisher.id + '/' : ''}${RouteName[RouteName.userSettings]}`;\r\n this.props.history.push(settingsPageRoute);\r\n };\r\n\r\n private _onAuditHistoryButtonClicked = () => {\r\n this.props.hidePanel();\r\n const { publisher } = getAppStore();\r\n const auditHistoryPageRoute = `/${RoutePrefix.adManagement}/${publisher ? publisher.id + '/' : ''}${\r\n RouteName[RouteName.auditHistory]\r\n }`;\r\n this.props.history.push(auditHistoryPageRoute);\r\n };\r\n\r\n private _onUserLanguageChanged = (ev, option) => {\r\n const localStorageLocale = localStorage.getItem(LOCAL_STORAGE_LOCALE);\r\n if (option.key !== localStorageLocale) {\r\n onUpdateUserLanguage(option.key);\r\n }\r\n };\r\n }\r\n);\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n settingsNotImplemented: {\r\n id: 'settings.notImplemented',\r\n defaultMessage: 'Settings Not Implemented Yet'\r\n },\r\n});","import * as React from 'react';\r\nimport { injectIntl, InjectedIntlProps } from 'react-intl';\r\nimport messages from './SettingsPanel.messages';\r\n\r\nexport const SettingsPanel = injectIntl(class extends React.Component<InjectedIntlProps> {\r\n public render(): JSX.Element {\r\n const { formatMessage } = this.props.intl;\r\n return (\r\n <p>{formatMessage(messages.settingsNotImplemented)}</p>\r\n );\r\n }\r\n});\r\n","import { AdUnit, Channel, Filter, Property, PublisherSearch } from '..';\r\nimport { completeAccess, UserRoleEntity, userRoleKey } from '../services/UserRoleService';\r\nimport { Model as UserRoleModel } from '../store/schema/userrolemodels/Model';\r\n\r\nexport const getAccessPermission = (entity): number => {\r\n const userRoles = localStorage.getItem(userRoleKey);\r\n if (userRoles === null) {\r\n return completeAccess;\r\n }\r\n const userRolesJSON = JSON.parse(userRoles);\r\n const userRolesMap = new Map<string, UserRoleModel>();\r\n\r\n // tslint:disable-next-line: forin\r\n for (const value in userRolesJSON) {\r\n userRolesMap.set(value, JSON.parse(userRolesJSON[value]));\r\n }\r\n\r\n let userRoleEntity: UserRoleModel | undefined;\r\n if (entity === AdUnit) {\r\n userRoleEntity = userRolesMap.get(UserRoleEntity.AdUnit);\r\n } else if (entity === Channel) {\r\n userRoleEntity = userRolesMap.get(UserRoleEntity.Channel);\r\n } else if (entity === Filter) {\r\n userRoleEntity = userRolesMap.get(UserRoleEntity.Filter);\r\n } else if (entity === Property) {\r\n userRoleEntity = userRolesMap.get(UserRoleEntity.Property);\r\n } else if (entity === PublisherSearch) {\r\n userRoleEntity = userRolesMap.get(UserRoleEntity.Publisher);\r\n }\r\n\r\n if (userRoleEntity) {\r\n return userRoleEntity.accessPermission;\r\n }\r\n\r\n return completeAccess;\r\n};\r\n\r\nexport function getEntityAccessPermissions(userRoleEntity: UserRoleEntity): UserRoleModel | null {\r\n const userRoles = localStorage.getItem(userRoleKey);\r\n if (userRoles === null) {\r\n return null;\r\n }\r\n const userRolesJSON = JSON.parse(userRoles);\r\n\r\n for (const value in userRolesJSON) {\r\n if (value === userRoleEntity) {\r\n return JSON.parse(userRolesJSON[value]);\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n","import {\r\n FontWeights,\r\n ICheckboxStyleProps,\r\n ICheckboxStyles,\r\n IPanelStyleProps,\r\n IPanelStyles,\r\n IStyle,\r\n IStyleFunctionOrObject,\r\n ITheme,\r\n classNamesFunction,\r\n getTheme,\r\n keyframes,\r\n mergeStyleSets,\r\n} from '@fluentui/react';\r\nimport { IPubCenterFonts, IPubcenterSpacing, IPubcenterTheme } from '../../../theme';\r\nimport { IFormTitleStyleProps, IFormTitleStyles } from '../../components/Form';\r\nimport { noPointerEvents } from '../../utils/GlobalStyleUtils';\r\n\r\nexport interface IGridStylesProps {\r\n theme: ITheme;\r\n}\r\n\r\nexport interface IGridStyles {\r\n root?: IStyle;\r\n modifyColumnDescription?: IStyle;\r\n panelButton?: IStyle;\r\n subComponentStyles: {\r\n formTitle?: IStyleFunctionOrObject<IFormTitleStyleProps, IFormTitleStyles>;\r\n modifyColumnPanel?: IStyleFunctionOrObject<IPanelStyleProps, IPanelStyles>;\r\n columnCheckbox?: IStyleFunctionOrObject<ICheckboxStyleProps, ICheckboxStyles>;\r\n };\r\n emptyGridTextStyle?: IStyle;\r\n titleContainer?: IStyle;\r\n detailsHeaderRootStyle?: IStyle;\r\n detailsRowRootStyle?: IStyle;\r\n disabledRowStyle?: IStyle;\r\n checkCell?: IStyle;\r\n columnTooltip?: IStyle;\r\n columnCheckboxWrapper?: IStyle;\r\n columnHeaderCallout?: IStyle;\r\n columnHeaderIcon?: IStyle;\r\n calloutFocusable?: IStyle;\r\n}\r\n\r\nexport const getStyles = (props: IGridStylesProps): IGridStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { palette } = theme;\r\n const fonts = theme.fonts as IPubCenterFonts;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return mergeStyleSets({\r\n root: {\r\n marginTop: spacing.size8,\r\n height: '100%',\r\n '.ms-DetailsList': {\r\n paddingRight: spacing.size1,\r\n marginRight: `-${spacing.size1}`,\r\n },\r\n '.ms-DetailsRow-cell': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n },\r\n titleContainer: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n },\r\n emptyGridTextStyle: {\r\n ...fonts.size14,\r\n margin: `${spacing.size16} 0 0 ${spacing.size10}`,\r\n },\r\n detailsHeaderRootStyle: {\r\n fontWeight: FontWeights.regular,\r\n padding: 0,\r\n borderTop: `1px solid ${palette.neutralPrimary}`,\r\n borderBottom: `1px solid ${palette.neutralPrimary}`,\r\n '.ms-DetailsHeader-cell:not(:last-child)': {\r\n borderRight: `0.5px solid ${palette.neutralLight}`,\r\n marginRight: '-0.5px',\r\n },\r\n '.ms-DetailsHeader-cellName': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n },\r\n detailsRowRootStyle: {\r\n // To make the text in the cell copyable as it is not by default in fluentUI\r\n // ------------------------------\r\n userSelect: 'text',\r\n cursor: 'text',\r\n width: 'fit-content',\r\n // ------------------------------\r\n ...fonts.size14,\r\n '.ms-DetailsRow-cell:not(:last-child)': {\r\n marginRight: '-0.5px',\r\n borderRight: `0.5px solid ${palette.neutralLight}`,\r\n },\r\n '.ms-DetailsRow-fields.updated': {\r\n animation: keyframes({\r\n '50%': {\r\n backgroundColor: palette.themeLighter,\r\n },\r\n }),\r\n animationDuration: '300ms',\r\n },\r\n },\r\n disabledRowStyle: {\r\n ...noPointerEvents,\r\n },\r\n checkCell: {\r\n alignSelf: 'center',\r\n },\r\n columnHeaderCallout: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n columnHeaderIcon: {\r\n color: palette.themePrimary,\r\n padding: `0px ${spacing.size8}`,\r\n cursor: 'pointer',\r\n '& :hover': {\r\n backgroundColor: palette.themeLighter,\r\n },\r\n },\r\n modifyColumnDescription: [\r\n 'ms-fontWeight-semibold',\r\n {\r\n fontSize: theme.fonts.size12,\r\n marginBottom: spacing.size16,\r\n },\r\n ],\r\n panelButton: {\r\n display: 'flex',\r\n selectors: {\r\n '.ms-Button': {\r\n marginRight: spacing.size8,\r\n },\r\n },\r\n },\r\n subComponentStyles: {\r\n modifyColumnPanel: {\r\n header: {\r\n marginBottom: spacing.size24,\r\n },\r\n content: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n },\r\n footer: {\r\n borderTopStyle: 'solid',\r\n borderColor: theme.palette.neutralLight,\r\n borderTopWidth: 1,\r\n },\r\n },\r\n columnCheckbox: {\r\n root: {\r\n paddingTop: spacing.size8,\r\n paddingBottom: spacing.size8,\r\n marginBottom: spacing.size8,\r\n },\r\n },\r\n },\r\n columnTooltip: {\r\n paddingTop: spacing.size8,\r\n paddingBottom: spacing.size8,\r\n marginBottom: spacing.size8,\r\n },\r\n columnCheckboxWrapper: {\r\n display: 'flex',\r\n gap: spacing.size8,\r\n alignItems: 'center',\r\n },\r\n calloutFocusable: {\r\n '&:focus': {\r\n border: '2px solid black',\r\n borderRadius: spacing.size4,\r\n },\r\n },\r\n });\r\n};\r\n\r\nconst classNames = classNamesFunction<IGridStylesProps, IGridStyles>();\r\n\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return classNames(getStyles, { theme: getTheme(), ...props });\r\n}\r\n","export const PROFILE_TAB_KEY = 'profile';\r\nexport const PAYMENTS_TAB_KEY = 'payments';\r\nexport const SETTINGS_TAB_KEY = 'settings';\r\nexport const USER_MANAGEMENT_TAB_KEY = 'user';\r\nexport const REPORT_DASHBOARD_PAGE = 'dashboard';\r\n","import { mutatorAction } from 'satcheljs';\r\n\r\nimport { HomePageStatus } from '../store/schema/IHomeViewState';\r\nimport { getStore } from '../store/store';\r\n\r\nexport const setHomePageStatus = mutatorAction(\r\n 'setHomePageStatus',\r\n (profileStatus: HomePageStatus, siteStatus: HomePageStatus, adUnitStatus: HomePageStatus, isHomePageSetupComplete: boolean) => {\r\n getStore().profileStatus = profileStatus;\r\n getStore().siteStatus = siteStatus;\r\n getStore().adUnitStatus = adUnitStatus;\r\n getStore().isSetupDone = isHomePageSetupComplete;\r\n }\r\n);\r\n\r\nexport const setIsSetupDone = mutatorAction('setIsSetupDone', (isSetupDone: boolean) => {\r\n getStore().isSetupDone = isSetupDone;\r\n});\r\n\r\nexport const setIsStatusLoading = mutatorAction('setIsStatusLoading', (isStatusLoading: boolean) => {\r\n getStore().isStatusLoading = isStatusLoading;\r\n});\r\n\r\nexport const setIsFRECardShown = mutatorAction('setIsFRECardShown', (isFRECardShown: boolean) => {\r\n getStore().isFRECardShown = isFRECardShown;\r\n});\r\n","import { EntityType } from '../enums';\r\nimport { Model } from './Model';\r\n\r\nexport interface IRejectionCode {\r\n rejectionCodes: string;\r\n appealDocuments?: string;\r\n}\r\n\r\nexport class EvaluationStatus extends Model {\r\n public apiPath = undefined;\r\n public className = 'entityEvaluation';\r\n public entityId: number;\r\n public approvalStatus: EntityEvaluationStatus;\r\n public properties?: IRejectionCode;\r\n public entityType: EntityType;\r\n}\r\n\r\nexport class PublisherEvaluationStatus extends EvaluationStatus {\r\n public entityType: EntityType.Publisher;\r\n}\r\n\r\nexport class PropertyEvaluationStatus extends EvaluationStatus {\r\n public entityType: EntityType.Property;\r\n}\r\n\r\nexport enum EntityEvaluationStatus {\r\n Pending = 'Pending',\r\n InReview = 'UnderConsideration',\r\n Rejected = 'Rejected',\r\n Approved = 'Approved',\r\n}\r\n\r\nexport enum EntityEvaluationErrorCode {\r\n 'P001' = 1, // TST failure\r\n 'P002' = 2, // OVet failure\r\n 'D001' = 3, // PDE failure\r\n 'U001' = 4, // Unknown or default\r\n 'R001' = 5, // ATS manual review failed\r\n\r\n // CRM Manual Overrides\r\n 'CRM_MO_001' = 6, // Manual override to Review Case Terminated (Unappealable)\r\n 'CRM_MO_002' = 7, // Manual Deactivation of Publisher in CRM (Unappealable)\r\n\r\n 'OV_DNE_E000' = 100, // OneVet DNE failed (Unappealable)\r\n 'OV_TSS_E000' = 200, // OneVet TSS failed (Unappealable)\r\n\r\n 'OV_EV_E000' = 300, // OneVet Email Verification failed\r\n\r\n 'OV_BV_E000' = 400, // OneVet Business Verification failed - UnAppealable\r\n 'OV_BV_E001' = 401, // OneVet Business Verification failed - Appealable\r\n\r\n 'OV_DV_E000' = 500, // OneVet Domain Verification failed - UnAppealable\r\n 'OV_DV_E001' = 501, // OneVet Domain Verification failed - Appealable\r\n\r\n 'OV_TV_E000' = 600, // OneVet Token Verification failed\r\n}\r\n\r\nexport const appealableRejectionCodes = [EntityEvaluationErrorCode['OV_BV_E001'], EntityEvaluationErrorCode['OV_DV_E001']];\r\nexport const unappealableRejectionCodes = [\r\n EntityEvaluationErrorCode['P001'],\r\n EntityEvaluationErrorCode['P002'],\r\n EntityEvaluationErrorCode['D001'],\r\n EntityEvaluationErrorCode['U001'],\r\n EntityEvaluationErrorCode['R001'],\r\n EntityEvaluationErrorCode['CRM_MO_001'],\r\n EntityEvaluationErrorCode['CRM_MO_002'],\r\n EntityEvaluationErrorCode['OV_DNE_E000'],\r\n EntityEvaluationErrorCode['OV_TSS_E000'],\r\n EntityEvaluationErrorCode['OV_EV_E000'],\r\n EntityEvaluationErrorCode['OV_BV_E000'],\r\n EntityEvaluationErrorCode['OV_DV_E000'],\r\n EntityEvaluationErrorCode['OV_TV_E000'],\r\n];\r\n\r\nexport enum EvidenceDocumentType {\r\n OV_BV_001, // OneVet Business Verification - Formation documents, such as articles of incorporation, partnership deed.\r\n OV_BV_002, // OneVet Business Verification - Franchise or agency appointment letters.\r\n OV_BV_003, // OneVet Business Verification - Government issued letter, license, registration, or certificate.\r\n OV_BV_004, // OneVet Business Verification - Lease or tenancy documents.\r\n OV_BV_005, // OneVet Business Verification - Letter or statement from a financial institution or a utility company.\r\n OV_BV_006, // OneVet Business Verification - Record on a Government registry website (site/link must be displayed).\r\n OV_BV_007, // OneVet Business Verification - Stock exchange filings or tax filing records.\r\n\r\n OV_DV_001, // OneVet Domain Verification (Email domain) - Assignment letter from an authorized representative of the organization.\r\n OV_DV_002, // OneVet Domain Verification (Email domain) - Domain ownership records, such as Whois.\r\n OV_DV_003, // OneVet Domain Verification (Email domain) - Domain purchase invoices or registry confirmation records.\r\n OV_DV_004, // OneVet Domain Verification (Email domain) - Website showing name, address, contact information and domain of the org\r\n}\r\n","import { FormattedMessage, InjectedIntl, MessageValue } from 'react-intl';\r\n\r\nexport interface IToastNotificationProps {\r\n items?: IToastNotificationItem[];\r\n dismissButtonAriaLabel?: string;\r\n intl: InjectedIntl;\r\n onRemoved?: (notification: IToastNotificationItem) => void;\r\n}\r\n\r\nexport interface IToastNotificationItemProps {\r\n item: IToastNotificationItem;\r\n intl: InjectedIntl;\r\n}\r\n\r\nexport interface IToastNotificationItem {\r\n id: string;\r\n type: ToastType;\r\n content: IToastNotificationItemContent;\r\n}\r\n\r\nexport interface IToastNotificationItemContent {\r\n text?: string;\r\n textMessageDescriptor?: FormattedMessage.MessageDescriptor;\r\n intlMessageValues?: { [key: string]: MessageValue };\r\n suppressAutoDismiss?: boolean;\r\n animationTime?: number;\r\n dismissButtonAriaLabel?: string;\r\n noDismissButton?: boolean;\r\n onDismiss?: () => void;\r\n}\r\n\r\nexport enum ToastType {\r\n info = 'info',\r\n error = 'error',\r\n warning = 'warning',\r\n success = 'success',\r\n loading = 'loading',\r\n}\r\n\r\nexport enum ToastIcon {\r\n info = 'Info',\r\n error = 'ErrorBadge',\r\n warning = 'Info',\r\n success = 'Completed',\r\n}\r\n","import { IStyle, ITheme } from '@fluentui/react';\r\n\r\nexport interface IManagePageStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\nexport interface IManagePageStyles {\r\n root?: IStyle;\r\n tokenPanelsubTitle?: IStyle;\r\n tokenPanelsubTitleValue?: IStyle;\r\n tokenPanelAgreement?: IStyle;\r\n tokenPanelAgreementBtn?: IStyle;\r\n tokenPanelDevToken?: IStyle;\r\n tokenPanelInfoButton?: IStyle;\r\n tokenPanelAgreementText?: IStyle;\r\n tokenSpinner?: IStyle;\r\n tokenFetchFail?: IStyle;\r\n}\r\n\r\nexport enum DevTokenFetch {\r\n TokenNotFound = 'TokenNotFound',\r\n ApiCallFailed = 'ApiCallFailed',\r\n}\r\n\r\nexport interface IDevTokenPanelParams {\r\n userName?: string;\r\n email?: string;\r\n developerToken?: string;\r\n panelClosed?: boolean;\r\n SpinnerText?: string;\r\n onGenerateDevToken: () => void;\r\n}\r\n","export * from './PopupCard';\r\n","import { getAppealStore } from '../../pages/ad-management/Profile/@data/store/appealStore';\r\nimport { PublisherType } from '../store/schema/enums/PublisherType';\r\nimport {\r\n appealableRejectionCodes,\r\n EntityEvaluationErrorCode,\r\n EntityEvaluationStatus,\r\n unappealableRejectionCodes,\r\n} from '../store/schema/models/EntityEvaluationStatus';\r\nimport { getAppStore } from '../store/store';\r\n\r\nexport function getCurrentPublisher() {\r\n return getAppStore().publisher;\r\n}\r\n\r\nexport function getCurrentPublisherId() {\r\n return getCurrentPublisher()?.id;\r\n}\r\n\r\nexport function getCurrentPublisherName() {\r\n return getCurrentPublisher()?.name as string;\r\n}\r\n\r\nexport function isPublisherProfileDataPresent() {\r\n return !!getCurrentPublisher()?.address;\r\n}\r\n\r\nexport function getPublisherEvaluationStatus() {\r\n return getAppStore().publisherEvaluationStatus;\r\n}\r\n\r\nexport function getPublisherCountry() {\r\n return getCurrentPublisher()?.address?.country;\r\n}\r\n\r\nexport function getPublisherEvaluationApprovalStatus() {\r\n return getPublisherEvaluationStatus()?.approvalStatus;\r\n}\r\n\r\nexport function isPublisherEvaluationStatusFetchFailed() {\r\n return getAppStore().isPublisherEvaluationStatusFetchFailed;\r\n}\r\n\r\nexport function getPublisherEvaluationRejectionCodes(): EntityEvaluationErrorCode[] {\r\n return (\r\n getPublisherEvaluationStatus()\r\n ?.properties?.rejectionCodes?.split(',')\r\n .map((code) => code.trim() as unknown as EntityEvaluationErrorCode) ?? []\r\n );\r\n}\r\n\r\nexport function getAppealableRejectionCodes() {\r\n return getPublisherEvaluationRejectionCodes().filter((code) =>\r\n appealableRejectionCodes.includes(EntityEvaluationErrorCode[code] as unknown as EntityEvaluationErrorCode)\r\n );\r\n}\r\n\r\nexport function isPublisherProfileInComplete() {\r\n return getPublisherEvaluationApprovalStatus() === EntityEvaluationStatus.Pending;\r\n}\r\n\r\nexport function isPublisherApproved() {\r\n return getPublisherEvaluationApprovalStatus() === EntityEvaluationStatus.Approved;\r\n}\r\n\r\n// NOTE: Currently we are handling any rejection codes.\r\n// If publisher EntityEvaluationStatus is Rejected, then publisher is shown as suspended in UI\r\nexport function isPublisherRejected() {\r\n return getPublisherEvaluationApprovalStatus() === EntityEvaluationStatus.Rejected;\r\n}\r\n\r\nexport function isPublisherRejectionAppealable() {\r\n return isPublisherRejected() && !isPublisherRejectionUnappealable();\r\n}\r\n\r\nexport function isPublisherRejectionUnappealable(): boolean {\r\n // if publisher is not rejected, then it is not unappealable\r\n if (!isPublisherRejected()) {\r\n return false;\r\n }\r\n\r\n const rejectionCodes = getPublisherEvaluationRejectionCodes();\r\n // if rejection codes is empty, then publisher rejection is unappealable\r\n if (!rejectionCodes || rejectionCodes.length === 0) {\r\n return true;\r\n }\r\n\r\n // if appeal documents list is empty, then publisher rejection is unappealable\r\n if (getAppealDocuments().length === 0) {\r\n return true;\r\n }\r\n\r\n // if any of the rejection codes is unappealable, then publisher rejection is unappealable\r\n for (const code of rejectionCodes) {\r\n if (unappealableRejectionCodes.includes(EntityEvaluationErrorCode[code] as unknown as EntityEvaluationErrorCode)) {\r\n return true;\r\n }\r\n }\r\n\r\n // publisher rejection is appealable if it does not have any unappealable rejection codes\r\n return false;\r\n}\r\n\r\nexport function isPublisherUnderReview() {\r\n const publisherEvaluationApprovalStatus = getPublisherEvaluationApprovalStatus();\r\n if (publisherEvaluationApprovalStatus && publisherEvaluationApprovalStatus === EntityEvaluationStatus.InReview) {\r\n return true;\r\n }\r\n\r\n const appealHistory = getAppealStore().appealHistory ?? [];\r\n if (isPublisherRejected() && isPublisherRejectionAppealable() && appealHistory.length > 0) {\r\n for (const appealStatus of appealHistory) {\r\n // Publisher is not in review and needs to take action, if any of the appeal status is not Pending or UnderConsideration\r\n if (appealStatus.reviewStatus !== 'Pending' && appealStatus.reviewStatus !== 'UnderConsideration') {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n // Publisher is not review - if publisherEvaluationApprovalStatus is not InReview\r\n // - if publisher is not rejected or if their appealHistory doesn't exist\r\n return false;\r\n}\r\n\r\nexport function isPublisherActionRequired() {\r\n return isPublisherRejectionAppealable() && !isPublisherUnderReview();\r\n}\r\n\r\nexport function getPublisherAccountType() {\r\n return getCurrentPublisher()?.publisherType;\r\n}\r\n\r\nexport function isIndividualPublisher() {\r\n return getPublisherAccountType() === PublisherType.individual;\r\n}\r\n\r\nexport function isOrganizationPublisher() {\r\n return getPublisherAccountType() === PublisherType.organization;\r\n}\r\n\r\nexport function getAppealDocuments() {\r\n return getAppStore().publisherEvaluationStatus?.properties?.appealDocuments?.split(',') ?? [];\r\n}\r\n\r\nexport function isAppealInReviewForRejectionCode(rejectionCode: EntityEvaluationErrorCode) {\r\n const appealStatus = getAppealStatusForRejectionCode(rejectionCode);\r\n if (appealStatus && (appealStatus.reviewStatus === 'Pending' || appealStatus.reviewStatus === 'UnderConsideration')) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function getAppealStatusForRejectionCode(rejectionCode: EntityEvaluationErrorCode) {\r\n const { appealHistory } = getAppealStore();\r\n return appealHistory?.find((history) => history.rootRejectionCode === rejectionCode.toString());\r\n}\r\n","/**\r\n * Types the responses coming from json and decorates them with the specified classes.\r\n *\r\n * @param typeToRestore The object to copy its type from, basically just do `new ObjectName`\r\n * @param obj The erased object that we need to restore.\r\n */\r\n// tslint:disable-next-line:no-any\r\nexport function restoreTypeWithObject<T extends { constructor: any }>(typeToRestore: T, obj: any): T | undefined {\r\n if (!obj) {\r\n return undefined;\r\n }\r\n\r\n if (typeof obj === 'string') {\r\n try {\r\n obj = JSON.parse(obj);\r\n } catch (_) {\r\n return undefined;\r\n }\r\n }\r\n\r\n obj.constructor = typeToRestore.constructor;\r\n // tslint:disable-next-line:no-any\r\n obj.__proto__ = (typeToRestore as any).__proto__;\r\n\r\n // Add all values spread.\r\n typeToRestore = {\r\n ...typeToRestore,\r\n ...obj,\r\n };\r\n\r\n return typeToRestore;\r\n}\r\n\r\n// tslint:disable-next-line:no-any\r\nexport function mergeTypeWithObject<T>(typeToRestore: T, obj: any): T {\r\n return restoreTypeWithObject(typeToRestore, obj) || typeToRestore;\r\n}\r\n\r\nexport function groupBy<T, K>(list: T[], getKey: (item: T) => K) {\r\n const map = new Map<K, T[]>();\r\n list.forEach((item) => {\r\n const key = getKey(item);\r\n const collection = map.get(key);\r\n if (!collection) {\r\n map.set(key, [item]);\r\n } else {\r\n collection.push(item);\r\n }\r\n });\r\n return Array.from(map);\r\n}\r\n\r\nexport function getEnumNames<T>(obj: T): string[] {\r\n const results: string[] = [];\r\n for (const key of Object.keys(obj).filter((k: string) => {\r\n return !isNaN(+k);\r\n })) {\r\n results.push(obj[key]);\r\n }\r\n return results;\r\n}\r\n\r\n// tslint:disable-next-line: no-any\r\nexport function deepClone(obj: any) {\r\n return JSON.parse(JSON.stringify(obj));\r\n}\r\n\r\n// tslint:disable-next-line: no-any\r\nexport function invert(obj: any) {\r\n const res = {};\r\n Object.keys(obj).forEach((key) => {\r\n res[obj[key]] = key;\r\n });\r\n\r\n return res;\r\n}\r\n\r\ntype AnyObject = { [key: string]: unknown };\r\n\r\nexport function deepEqual(obj1: AnyObject, obj2: AnyObject, convertType: boolean = false): boolean {\r\n if (obj1 === obj2) {\r\n return true;\r\n }\r\n\r\n if (typeof obj1 !== 'object' || obj1 === null || typeof obj2 !== 'object' || obj2 === null) {\r\n return false;\r\n }\r\n\r\n const keys1 = Object.keys(obj1);\r\n const keys2 = Object.keys(obj2);\r\n\r\n if (keys1.length !== keys2.length) {\r\n return false;\r\n }\r\n\r\n for (const key of keys1) {\r\n if (!obj2.hasOwnProperty(key)) {\r\n return false;\r\n }\r\n if (convertType) {\r\n // Handle type conversion for numbers and strings\r\n if (typeof obj1[key] === 'number' && typeof obj2[key] === 'string') {\r\n // @ts-ignore\r\n if (obj1[key].toString() !== obj2[key]) {\r\n return false;\r\n }\r\n } else if (typeof obj1[key] === 'string' && typeof obj2[key] === 'number') {\r\n // @ts-ignore\r\n if (obj1[key] !== obj2[key].toString()) {\r\n return false;\r\n }\r\n // @ts-ignore\r\n } else if (!deepEqual(obj1[key], obj2[key], convertType)) {\r\n return false;\r\n }\r\n } else {\r\n // @ts-ignore\r\n if (!deepEqual(obj1[key], obj2[key], convertType)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n","import { uiConfig } from '../../config/ui.config';\r\nimport {\r\n AccountStatus,\r\n PaymentsPageBalance,\r\n PaymentsPageEstimatedEarnings,\r\n UserContext,\r\n XPayJwtTokenRequest,\r\n XPayJwtTokenResponse,\r\n} from '../store/schema';\r\nimport { PaymentsPageEstimatedEarningsRequestParams } from '../store/schema/models/PaymentPageEstimatedEarningsRequestParams';\r\nimport { handleApiErrors, handleError } from '../utils/handleApiErrors';\r\nimport { buildRequestHeadersWithAuthToken } from '../utils/requestUtils';\r\nimport { ApiError } from './ApiService';\r\n\r\nexport async function getEstimatedEarnings(\r\n publisherId,\r\n requestParams: PaymentsPageEstimatedEarningsRequestParams,\r\n userContext: UserContext\r\n): Promise<PaymentsPageEstimatedEarnings> {\r\n const url = `${uiConfig.getApiBaseAddress()}/billing/publishers/${publisherId}/earnings?${new URLSearchParams(requestParams)}`;\r\n const headers = await buildRequestHeadersWithAuthToken(url, userContext);\r\n\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n });\r\n if (!response.ok) {\r\n return handleApiErrors<PaymentsPageEstimatedEarnings>(response, url);\r\n }\r\n\r\n const responseJson = await response.json();\r\n if (responseJson.data) {\r\n return responseJson.data;\r\n }\r\n return Promise.resolve({} as PaymentsPageEstimatedEarnings);\r\n } catch (err) {\r\n const error = `getEstimatedEarnings operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\nexport async function getBalance(publisherId, currencyCode, userContext: UserContext): Promise<PaymentsPageBalance> {\r\n const url = `${uiConfig.getApiBaseAddress()}/billing/publishers/${publisherId}/balance?currencyCode=${currencyCode}`;\r\n const headers = await buildRequestHeadersWithAuthToken(url, userContext);\r\n\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n });\r\n\r\n if (!response.ok) {\r\n return handleApiErrors<PaymentsPageBalance>(response, url);\r\n }\r\n\r\n const responseJson = await response.json();\r\n\r\n if (responseJson.data) {\r\n return responseJson.data;\r\n }\r\n return Promise.resolve({} as PaymentsPageBalance);\r\n } catch (err) {\r\n const error = `getBalance operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport const getAccountStatus = async (publisherId, userContext: UserContext): Promise<AccountStatus> => {\r\n const url = `${uiConfig.getApiBaseAddress()}/billing/publishers/${publisherId}/xpayAccountStatus`;\r\n const headers = await buildRequestHeadersWithAuthToken(url, userContext);\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n });\r\n\r\n if (!response.ok) {\r\n return handleApiErrors<AccountStatus>(response, url);\r\n }\r\n\r\n const responseJson = await response.json();\r\n\r\n if (responseJson.data) {\r\n return responseJson.data;\r\n }\r\n return Promise.resolve({} as AccountStatus);\r\n } catch (err) {\r\n const error = `getAccountStatus operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n};\r\n\r\nexport async function getXPayJwtToken(body: XPayJwtTokenRequest, userContext: UserContext): Promise<XPayJwtTokenResponse> {\r\n const url =\r\n uiConfig.getApiBaseAddress() + '/billing/publishers/' + body.publisherId + '/generateXPayToken?countryCode=' + body.countryCode;\r\n const headers = await buildRequestHeadersWithAuthToken(url, userContext);\r\n\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n });\r\n\r\n if (!response.ok) {\r\n return handleApiErrors<XPayJwtTokenResponse>(response, url);\r\n }\r\n\r\n const responseJson = await response.json();\r\n if (responseJson.data) {\r\n return responseJson.data;\r\n }\r\n return Promise.resolve({} as XPayJwtTokenResponse);\r\n } catch (err) {\r\n const error = `getXPayJwtToken operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { Log } from '../../../../../logging/src';\r\nimport { EntityEvaluationStatus, getAppStore, Publisher, PublisherEvaluationStatus } from '../../../../@data';\r\nimport { getAdManagementStore } from '../store/store';\r\n\r\nexport const setPublisherEvaluationStatusAction = mutatorAction(\r\n 'setPublisherEvaluationStatusAction',\r\n (publisherEvaluationStatus: PublisherEvaluationStatus) => {\r\n const appStore = getAppStore();\r\n appStore.publisherEvaluationStatus = publisherEvaluationStatus;\r\n }\r\n);\r\n\r\nexport const setPublisherEvaluationFetchFailedAction = mutatorAction('setPublisherEvaluationFetchFailedAction', (isFailed: boolean) => {\r\n const appStore = getAppStore();\r\n appStore.isPublisherEvaluationStatusFetchFailed = isFailed;\r\n});\r\n\r\nexport const setPublisherRejectedMessageClosedAction = mutatorAction(\r\n 'setPublisherRejectedMessageClosedAction',\r\n (isPublisherRejectedMessageClosed: boolean) => {\r\n const adManagementStore = getAdManagementStore();\r\n adManagementStore.isPublisherRejectedMessageClosed = isPublisherRejectedMessageClosed;\r\n }\r\n);\r\n\r\nexport const setPublisherEvalutionStatusToInReview = mutatorAction('setPublisherEvalutionStatusToInReview', (publisher: Publisher) => {\r\n Log.debug('Setting evaluation status to in review, when publisher profile is edited');\r\n const publisherEvaluationStatus: PublisherEvaluationStatus = new PublisherEvaluationStatus();\r\n publisherEvaluationStatus.entityId = publisher.id;\r\n publisherEvaluationStatus.approvalStatus = EntityEvaluationStatus.InReview;\r\n getAppStore().publisherEvaluationStatus = publisherEvaluationStatus;\r\n});\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { Log } from '../../../../../../../logging/src';\r\nimport { EntityPreferences, EntityType, getAppStore } from '../../../../../../@data';\r\nimport { LOCAL_STORAGE_LOCALE } from '../../../../../../constants/AppConstants';\r\nimport { INotificationPreferences, ISettingsViewModel } from '../store/schema/ISettingsViewModel';\r\nimport { getStore } from '../store/store';\r\n\r\nexport const saveRawSettings = mutatorAction('saveRawSettings', (raw: EntityPreferences) => {\r\n getStore().raw = raw;\r\n});\r\n\r\nexport const onSettingsChanged = mutatorAction('onSettingsChanged', (active: ISettingsViewModel) => {\r\n getStore().active = active;\r\n if (active.systemPreferences?.locale) {\r\n localStorage.setItem(LOCAL_STORAGE_LOCALE, active.systemPreferences.locale);\r\n getAppStore().locale = active.systemPreferences?.locale;\r\n }\r\n});\r\n\r\nexport const setEntityType = mutatorAction('setEntityType', (entityType: EntityType) => {\r\n Log.debug(`Setting entityType: ${entityType}`);\r\n getStore().active.entityType = entityType;\r\n});\r\n\r\nexport const setNotificationPreferences = mutatorAction('setNotificationPreferences', (np: INotificationPreferences) => {\r\n getStore().active.notificationPreferences = np;\r\n});\r\n","import { PhoneVerificationGenerateCode, getAppStore, postEntity } from '../../../../../@data';\r\nimport { EvaluationStatus, Publisher } from '../../../../../@data/store';\r\n\r\nexport async function generateCodeAsync(body: PhoneVerificationGenerateCode, publisher: Publisher) {\r\n const { userContext } = getAppStore();\r\n const phoneVerificationResp = await postEntity<PhoneVerificationGenerateCode>(\r\n [new EvaluationStatus(), publisher],\r\n PhoneVerificationGenerateCode,\r\n body,\r\n userContext\r\n );\r\n return phoneVerificationResp.data;\r\n}\r\n","import { getAppStore, getCurrentPublisher, Publisher, putEntity } from '../../../../../@data';\r\n\r\nexport async function updatePublisherDetails(body: Publisher): Promise<Publisher> {\r\n const publisher = getCurrentPublisher();\r\n if (!publisher) {\r\n return Promise.reject('No publisher found');\r\n }\r\n\r\n const { userContext } = getAppStore();\r\n const publisherDetails = await putEntity([publisher], body, userContext);\r\n return publisherDetails;\r\n}\r\n","import { getAppStore, postEntity } from '../../../../../@data';\r\nimport { Publisher } from '../../../../../@data/store';\r\nimport { AddressValidation } from '../../../../../@data/store/schema/models/AddressValidation';\r\n\r\nexport async function validateAddressAsync(body: AddressValidation, publisher: Publisher) {\r\n const { userContext } = getAppStore();\r\n const addressValidation = await postEntity([publisher], AddressValidation, body, userContext);\r\n return addressValidation;\r\n}\r\n","import { Model } from './Model';\r\n\r\nexport class AddressValidation extends Model {\r\n public apiPath = undefined;\r\n public className = 'addressValidation';\r\n public city?: string;\r\n public country?: string;\r\n public line1?: string;\r\n public line2?: string;\r\n public postalCode?: string;\r\n public stateOrProvince?: string;\r\n public isAddressValid?: boolean;\r\n public isOrgAddressValid?: boolean;\r\n public isOrg?: boolean;\r\n}\r\n","export const SMALLER_LIST_ITEM_HEIGHT = 24;\r\nexport const STANDARD_LIST_ITEM_HEIGHT = 36;\r\nexport const HEADING_ITEM_HEIGHT = 44;\r\n","export const adProvidersToNames = {\r\n 1: 'AdYouLike',\r\n 2: 'App Nexus',\r\n 3: 'Baidu',\r\n 4: 'Bing',\r\n 5: 'Dable',\r\n 6: 'EngageYa',\r\n 7: 'MediaNet',\r\n 8: 'MGID',\r\n 9: 'OutBrain',\r\n 10: 'PopIn',\r\n 11: 'PostSquare',\r\n 12: 'RevContent',\r\n 13: 'ShareThrough',\r\n 14: 'Strossle',\r\n 15: 'Taboola',\r\n 16: 'Triple Lift',\r\n 17: 'Yengo',\r\n 18: 'Criteo',\r\n 19: 'Gemini',\r\n 20: 'Taboola NetBidder',\r\n 21: 'Colombia',\r\n 22: 'SongHeng',\r\n 23: 'LockerDome',\r\n 24: 'LinkedIn',\r\n 25: 'Gecko',\r\n 26: 'Qihoo',\r\n};\r\n","import { createStore } from 'satcheljs';\r\nimport { IPaymentsPageData } from './schema';\r\n\r\n// !NOTE: This is to be added explicitly for the orchestrators to register themselves.\r\nimport { XPayJwtTokenRequest } from '../../../../../@data';\r\nimport '../orchestrators';\r\n\r\nexport const getPaymentsPageData = createStore<IPaymentsPageData>('PaymentsPageData', {\r\n estimatedEarnings: { yearly: { isDataLoaded: false }, monthly: { isDataLoaded: false } },\r\n balance: { isDataLoaded: false },\r\n xpayJwtTokenStatusIsLoading: false,\r\n xpayJwtTokenRequest: new XPayJwtTokenRequest(),\r\n});\r\n","import {\r\n IComboBoxStyles,\r\n IDatePickerStrings,\r\n IDatePickerStyleProps,\r\n IDatePickerStyles,\r\n IRefObject,\r\n IStyle,\r\n IStyleFunctionOrObject,\r\n ITheme,\r\n} from '@fluentui/react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { DateTimePicker } from './DateTimePicker';\r\nimport messages from './DateTimePicker.messages';\r\n\r\nexport interface IDateTimePickerProps extends React.HTMLAttributes<HTMLDivElement>, InjectedIntlProps {\r\n onDateTimeChanged: (value: Date) => void;\r\n componentRef?: IRefObject<DateTimePicker>;\r\n label?: string;\r\n value?: Date;\r\n disabled?: boolean;\r\n datePlaceholder?: string;\r\n hourPlaceholder?: string;\r\n timePlaceholder?: string;\r\n datePickerWidth?: number;\r\n minDateTime?: Date;\r\n maxDateTime?: Date;\r\n allowSecondsField?: boolean;\r\n styles?: Partial<IDateTimePickerStyles>;\r\n /**\r\n * Error message to render for TextField if date boundary (minDate, maxDate) validation fails.\r\n */\r\n isOutOfBoundsErrorMessage?: string;\r\n}\r\n\r\nexport interface IDateTimePickerStyleProps {\r\n theme: ITheme;\r\n datePickerWidth?: number;\r\n}\r\n\r\nexport interface IDateTimePickerStyles {\r\n root?: IStyle;\r\n colonSeperator?: IStyle;\r\n datePicker?: IStyle;\r\n hourPicker?: Partial<IComboBoxStyles>;\r\n minutesPicker?: Partial<IComboBoxStyles>;\r\n secondsPicker?: IStyle;\r\n subComponentStyles: {\r\n datePicker?: IStyleFunctionOrObject<IDatePickerStyleProps, IDatePickerStyles>;\r\n };\r\n}\r\n\r\nexport const DayPickerStrings: IDatePickerStrings = {\r\n months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\r\n\r\n shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\r\n\r\n days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\r\n\r\n shortDays: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\r\n\r\n goToToday: messages.goToToday.defaultMessage!,\r\n prevMonthAriaLabel: messages.prevMonthAriaLabel.defaultMessage!,\r\n nextMonthAriaLabel: messages.nextMonthAriaLabel.defaultMessage!,\r\n prevYearAriaLabel: messages.prevYearAriaLabel.defaultMessage!,\r\n nextYearAriaLabel: messages.nextYearAriaLabel.defaultMessage!,\r\n closeButtonAriaLabel: messages.closeButtonAriaLabel.defaultMessage!,\r\n isRequiredErrorMessage: messages.isRequiredErrorMessage.defaultMessage!,\r\n invalidInputErrorMessage: messages.invalidDateErrorMessage.defaultMessage!,\r\n};\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubCenterFonts, IPubcenterSpacing } from '../../../theme';\r\nimport { ICommonStyleProps } from '../../types';\r\n\r\ntype StyleProperties = 'actionButtonsWrapper' | 'gridActionButton' | 'gridCell';\r\ntype GridCommonStyles = Record<StyleProperties, string>;\r\n\r\nconst getStyles = (props: ICommonStyleProps): GridCommonStyles => {\r\n const spacing = props.theme.spacing as IPubcenterSpacing;\r\n const { semanticColors: s } = props.theme;\r\n const { size14 } = props.theme.fonts as IPubCenterFonts;\r\n\r\n return mergeStyleSets({\r\n actionButtonsWrapper: {\r\n display: 'flex',\r\n gap: spacing.size8,\r\n },\r\n gridActionButton: {\r\n root: {\r\n color: s.primaryButtonBackground,\r\n ...size14,\r\n height: spacing.size36,\r\n },\r\n rootHovered: {\r\n color: s.primaryButtonBackgroundHovered,\r\n },\r\n rootPressed: {\r\n color: s.primaryButtonBackgroundPressed,\r\n },\r\n },\r\n gridCell: {\r\n userSelect: 'text',\r\n cursor: 'text',\r\n width: 'fit-content',\r\n lineHeight: spacing.size20,\r\n margin: spacing.size8,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n },\r\n });\r\n};\r\n\r\nexport function getGridClassNames<PropType>(props?: PropType): GridCommonStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import React from 'react';\r\nimport { getGridClassNames } from './GridCommonStyles';\r\n\r\nexport function GridCell({ children }): JSX.Element {\r\n const { gridCell } = getGridClassNames();\r\n return (\r\n <div title={typeof children === 'string' ? children : ''} className={gridCell}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport const notificationMessages = defineMessages({\r\n setupPaymentButton: {\r\n id: 'payment.setup.notification.button',\r\n defaultMessage: 'Set up payments',\r\n },\r\n setupPaymentNotificationBoldedText: {\r\n id: 'payment.setup.notification.bolded.text',\r\n defaultMessage: 'You’ll need to set up your payment to start earning with {appName}.',\r\n },\r\n setupPaymentNotificationText: {\r\n id: 'payment.setup.notification.text',\r\n defaultMessage: `Add your payment details to get started.`,\r\n },\r\n loadXPayContainerFailed: {\r\n id: 'payment.xPay.container.load.fail',\r\n defaultMessage: 'Failed to load xPay container, please try again later.',\r\n },\r\n});\r\n\r\nexport const paymentCheerMessages = defineMessages({\r\n cheerMessageTitle: {\r\n id: 'payment.cheerMessage.title',\r\n defaultMessage: ' Your payout is ready.',\r\n },\r\n cheerMessageContent: {\r\n id: 'payment.cheerMessage.content',\r\n defaultMessage: 'You’ll need to set up your payment information to receive your payout. Add your payment details to get started.',\r\n },\r\n cheerMessageButtonAction: {\r\n id: 'payment.cheerMessage.button.action',\r\n defaultMessage: `Set up payments`,\r\n },\r\n cheerMessageButtonCancel: {\r\n id: 'payment.cheerMessage.button.cancel',\r\n defaultMessage: `Remind me later`,\r\n },\r\n cheerMessageCancelArialabel: {\r\n id: 'payment.cheerMessage.button.cancel.ariaLabel',\r\n defaultMessage: 'Close payment cheer message',\r\n },\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n customLabel: {\r\n id: 'customCalender.CustomLabel',\r\n defaultMessage: 'Custom',\r\n },\r\n todayLabel: {\r\n id: 'customCalender.todayLabel',\r\n defaultMessage: 'Today',\r\n },\r\n yesterdayLabel: {\r\n id: 'customCalender.yesterdayLabel',\r\n defaultMessage: 'Yesterday',\r\n },\r\n sundayTodayLabel: {\r\n id: 'customCalender.yesterdayLabel',\r\n defaultMessage: 'This week (Sun - Today)',\r\n },\r\n mondayTodayLabel: {\r\n id: 'customCalender.sundayTodayLabel',\r\n defaultMessage: 'This week (Mon - Today)',\r\n },\r\n last7FromTodayLabel: {\r\n id: 'customCalender.mondayTodayLabel',\r\n defaultMessage: 'Last 7 days',\r\n },\r\n last7FromSunToSatLabel: {\r\n id: 'customCalender.last7FromSunToSatLabel',\r\n defaultMessage: 'Last week (Sun - Sat)',\r\n },\r\n});\r\n","import React from 'react';\r\n\r\nexport interface IExternalLinkProps extends React.HTMLProps<HTMLAnchorElement> {}\r\n\r\nexport function ExternalLink(props: IExternalLinkProps) {\r\n return (\r\n <a {...props} target=\"_blank\" rel=\"noopener noreferrer\">\r\n {props.children}\r\n </a>\r\n );\r\n}\r\n","import { ITooltipHostProps, TooltipHost } from '@fluentui/react';\r\nimport React from 'react';\r\n\r\nexport interface IConditionalTooltipProps extends ITooltipHostProps {\r\n showTooltip?: boolean;\r\n targetSelector?: string;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function ConditionalTooltip({ showTooltip = false, children, targetSelector, ...tooltipHostProps }: IConditionalTooltipProps) {\r\n if (showTooltip) {\r\n return (\r\n <TooltipHost calloutProps={{ target: targetSelector, gapSpace: 0 }} {...tooltipHostProps}>\r\n {children}\r\n </TooltipHost>\r\n );\r\n }\r\n\r\n return <>{children}</>;\r\n}\r\n","import { createStore } from 'satcheljs';\r\nimport { IWindowsAppFeatureFlag } from '../types';\r\n\r\nexport const getStore = createStore<IWindowsAppFeatureFlag>('WindowsAppFeatureFlag', {\r\n isLoading: false,\r\n isFeatureEnabled: undefined,\r\n});\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { AccessibilityContrast, IPubcenterSpacing } from '../../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../../types';\r\n\r\ntype StyleProperties = 'container' | 'headerSection';\r\ntype SetupCardStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): SetupCardStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const { Activated } = AccessibilityContrast;\r\n\r\n return mergeStyleSets({\r\n container: {\r\n display: 'grid',\r\n gridTemplateColumns: `repeat(auto-fit, minmax(${spacing.size320}, 1fr))`,\r\n gap: spacing.size14,\r\n justifyContent: 'space-between',\r\n cursor: 'pointer',\r\n [Activated]: {\r\n color: 'windowtext',\r\n borderColor: 'window',\r\n forcedColorAdjust: 'none',\r\n },\r\n },\r\n headerSection: {\r\n margin: `${spacing.size15} 0`,\r\n fontSize: spacing.size20,\r\n fontWeight: '600',\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { FontWeights, getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubCenterFonts, IPubcenterPalette, IPubcenterSpacing } from '../../../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../../../types';\r\n\r\ntype StyleProperties = 'container';\r\n\r\ntype SetupCardStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): SetupCardStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const fonts = theme.fonts as IPubCenterFonts;\r\n\r\n return mergeStyleSets({\r\n container: {\r\n width: '100%',\r\n display: 'flex',\r\n boxShadow: `0px 0px ${spacing.size7} 0px rgba(0,0,0,0.2)`,\r\n borderRadius: spacing.size4,\r\n transition: 'all 0.5s',\r\n img: {\r\n marginLeft: spacing.size12,\r\n },\r\n '& i': {\r\n background: palette.themeLighterAlt,\r\n color: palette.themePrimary,\r\n fontSize: spacing.size20,\r\n padding: spacing.size24,\r\n },\r\n '& div:nth-child(2)': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n padding: spacing.size14,\r\n '& span:nth-child(2)': {\r\n color: palette.neutralSecondary,\r\n },\r\n '& span:nth-child(1)': {\r\n fontSize: fonts.size16,\r\n fontWeight: FontWeights.semibold,\r\n },\r\n },\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { injectIntlAndObserver } from '../../../../../../utils';\r\nimport { isButtonPressKey } from '../../../../../../utils/AccessibilityUtils';\r\nimport { getClassNames } from './ResourceCard.styles';\r\n\r\nexport interface IResourceCardProps {\r\n icon?: string;\r\n iconAlt?: string;\r\n title: string;\r\n description: string;\r\n onClick?: () => void;\r\n wrapperRef?: React.RefObject<HTMLDivElement>;\r\n handleIconClick?: (event: React.MouseEvent<HTMLElement, MouseEvent>) => void;\r\n}\r\n\r\nconst ResourceCard = injectIntlAndObserver<InjectedIntlProps & IResourceCardProps>(({ intl, ...props }) => {\r\n const { icon, iconAlt, title, description, onClick, handleIconClick, wrapperRef } = props;\r\n const { container } = getClassNames();\r\n\r\n return (\r\n <div\r\n ref={wrapperRef}\r\n className={container}\r\n onClick={onClick}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key) && onClick?.()}\r\n tabIndex={onClick ? 0 : -1}\r\n aria-label={title + ' ' + description}\r\n >\r\n {(!!icon || !!iconAlt) && <img src={icon} alt={iconAlt} onClick={handleIconClick} />}\r\n\r\n <div>\r\n <span>{description}</span>\r\n <span>{title}</span>\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\nexport default ResourceCard;\r\n","import { Panel, PanelType } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { isTythonSelfServeUser } from '../../../../../../@data';\r\nimport AppMessages from '../../../../../../App.messages';\r\nimport { IHeaderItem, PanelTypes } from '../../../../../../components/Header/Header.types';\r\nimport { APP_NAME_NEW, CUSTOM_WIDTH } from '../../../../../../constants/AppConstants';\r\nimport { FeedbackPanel, renderFooterContent } from '../../../../../../layout/PageLayout/header-panels';\r\nimport messages from '../ResourcesSection.messages';\r\n\r\ninterface IHeaderData {\r\n items?: IHeaderItem[];\r\n}\r\n\r\nexport const getHeaderItems = (CMUIHeaderMenuItemSerializer, formatMessage) => {\r\n const items: IHeaderItem[] = [\r\n {\r\n key: 'feedback',\r\n icon: 'Feedback',\r\n title: formatMessage(messages.feedbackTitle, { appName: APP_NAME_NEW }),\r\n type: PanelTypes.Feedback,\r\n panel: FeedbackPanel,\r\n panelProps: {\r\n isFooterAtBottom: true,\r\n onRenderFooterContent: renderFooterContent,\r\n },\r\n shouldOverflowUnderExtraSmallScreen: true,\r\n },\r\n ];\r\n\r\n const itemsData: IHeaderData = {\r\n items: CMUIHeaderMenuItemSerializer(isTythonSelfServeUser(), items),\r\n };\r\n\r\n return itemsData;\r\n};\r\n\r\nexport const createPanel = (item: IHeaderItem, isFeedbackOpen: boolean, formatMessage, setIsFeedbackOpen): JSX.Element => {\r\n // For icons such as CMUI help icon, panels are integrated with 3rd party libraries no need to render native panel\r\n if (item && !item.panel) {\r\n return <></>;\r\n }\r\n\r\n return (\r\n <Panel\r\n headerText={item?.title}\r\n type={PanelType.custom}\r\n customWidth={CUSTOM_WIDTH}\r\n isOpen={isFeedbackOpen}\r\n isLightDismiss={true}\r\n onDismiss={() => hidePanel(setIsFeedbackOpen)}\r\n closeButtonAriaLabel={formatMessage(AppMessages.close)}\r\n isFooterAtBottom={item?.panelProps?.isFooterAtBottom}\r\n onRenderFooterContent={() => item?.panelProps?.onRenderFooterContent?.({ onDismiss: () => hidePanel(setIsFeedbackOpen) }) || null}\r\n >\r\n {item?.panel ? React.cloneElement(<item.panel />, { hidePanel: () => hidePanel(setIsFeedbackOpen) }) : <p>Loading...</p>}\r\n </Panel>\r\n );\r\n};\r\n\r\nexport const showPanel = (setIsFeedbackOpen) => {\r\n setIsFeedbackOpen(true);\r\n};\r\n\r\nconst hidePanel = (setIsFeedbackOpen) => {\r\n setIsFeedbackOpen(false);\r\n};\r\n","import React, { useState } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { SupportPageRoute } from '../../../../../Routes';\r\nimport { IHeaderItem } from '../../../../../components/Header/Header.types';\r\nimport { APP_NAME_NEW } from '../../../../../constants/AppConstants';\r\nimport { useCMUIHelpExperience, usePreloadSVGImages } from '../../../../../hooks';\r\nimport { injectIntlAndObserver } from '../../../../../utils';\r\nimport messages from './ResourcesSection.messages';\r\nimport { getClassNames } from './ResourcesSection.styles';\r\nimport ResourceCard, { IResourceCardProps } from './components/ResourceCard';\r\nimport DocumentationIcon from './resources/DocumentationCenterIcon.svg';\r\nimport FeedBackIcon from './resources/FeedBackIcon.svg';\r\nimport SupportTeamIcon from './resources/SupportTeamIcon.svg';\r\nimport { createPanel, getHeaderItems, showPanel } from './utils/utils';\r\n\r\ninterface IHeaderData {\r\n items?: IHeaderItem[];\r\n}\r\n\r\nexport const connectToSupportTeam = (titleParam?: string) => {\r\n window.open(titleParam ? `${SupportPageRoute}?${titleParam}` : SupportPageRoute, '_blank');\r\n};\r\n\r\nconst ResourceSection = injectIntlAndObserver<InjectedIntlProps>(({ intl: { formatMessage } }) => {\r\n const imgPreloadQueue = [DocumentationIcon, SupportTeamIcon, FeedBackIcon];\r\n usePreloadSVGImages(imgPreloadQueue);\r\n const { container, headerSection } = getClassNames();\r\n const { CMUIHeaderMenuItemSerializer } = useCMUIHelpExperience();\r\n const [isFeedbackOpen, setIsFeedbackOpen] = useState(false);\r\n\r\n const itemsData: IHeaderData = getHeaderItems(CMUIHeaderMenuItemSerializer, formatMessage);\r\n\r\n const resources: IResourceCardProps[] = [\r\n {\r\n icon: DocumentationIcon,\r\n iconAlt: formatMessage(messages.learnTitle),\r\n title: formatMessage(messages.learnTitle),\r\n description: formatMessage(messages.learnDescription),\r\n onClick: () => window.open('https://help.ads.microsoft.com/#apex/pcv4/en/07501/-1', '_blank'),\r\n },\r\n {\r\n icon: SupportTeamIcon,\r\n iconAlt: formatMessage(messages.assistanceTitle),\r\n title: formatMessage(messages.assistanceTitle),\r\n description: formatMessage(messages.assistanceDescription),\r\n onClick: () => {\r\n connectToSupportTeam();\r\n },\r\n },\r\n {\r\n icon: FeedBackIcon, // AccountManagement -> FeedbackIcon\r\n iconAlt: formatMessage(messages.improveTitle, { appName: APP_NAME_NEW }),\r\n title: formatMessage(messages.improveTitle, { appName: APP_NAME_NEW }),\r\n description: formatMessage(messages.improveDescription),\r\n onClick: () => {\r\n showPanel(setIsFeedbackOpen);\r\n },\r\n },\r\n ];\r\n\r\n return (\r\n <>\r\n <h2 className={headerSection}>{formatMessage(messages.resourceTitle)}</h2>\r\n {createPanel(itemsData.items![1], isFeedbackOpen, formatMessage, setIsFeedbackOpen)}\r\n <div className={container}>\r\n {resources.map((resource, index) => (\r\n <ResourceCard key={index} {...resource} />\r\n ))}\r\n </div>\r\n </>\r\n );\r\n});\r\n\r\nexport default ResourceSection;\r\n","import { mutator } from 'satcheljs';\r\nimport { setNotificationPanelTriggered } from '../actions';\r\nimport { getStore } from '../store/store';\r\n\r\nmutator(setNotificationPanelTriggered, (msg) => {\r\n getStore().isNotificationPanelTrigerred = msg.isTrigerred;\r\n});\r\n","import React from 'react';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\nimport { LazyComponent } from '../../../components/LazyComponents';\r\n\r\nconst AdBlockPageLazy = React.lazy(() => import('./AdBlockPage'));\r\n\r\nexport function LazyAdBlockPage(props: RouteComponentProps) {\r\n return <LazyComponent lazyComponent={<AdBlockPageLazy {...props} />} />;\r\n}\r\n","import { action } from 'satcheljs';\r\nimport { Filter, IStringDictionary } from '../../../../../@data';\r\nimport { IFilterViewModel } from '../store/schema';\r\n\r\nexport const onRawChanged = action('onRawChanged', (value?: Filter) => ({ value }));\r\n\r\nexport const onFilterChanged = action('onFilterChanged', (filter: IFilterViewModel) => ({ filter }));\r\n\r\nexport const onFilterErrorChanged = action('onFilterErrorChanged', (values?: IStringDictionary) => ({ values }));\r\n\r\nexport const onFetchFiltersLoading = action('onFetchFiltersLoading', (isLoading: boolean) => ({ isLoading }));\r\n\r\nexport const onFetchingFiltersData = action('onFetchingFiltersData', (isFetchingData: boolean) => ({ isFetchingData }));\r\n\r\nexport const onFiltersFetched = action('onFiltersFetched', (items: Filter[]) => ({ items }));\r\n","import { IChoiceGroupOption, IDropdownOption } from '@fluentui/react';\r\nimport { History } from 'history';\r\nimport { action } from 'satcheljs';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { IIdNamePair } from '../../../../../components/MultiSelectPicker';\r\n\r\nexport const onFormIdChanged = action('onFormIdChanged', (value: number) => ({ value }));\r\n\r\nexport const onFormFilterNameChanged = action('onFormFilterNameChanged', (value?: string) => ({ value }));\r\n\r\nexport const onFormFilterTypeChanged = action('onFormFilterTypeChanged', (value: IDropdownOption) => ({ value }));\r\n\r\nexport const onFormChannelsChanged = action('onFormChannelsChanged', (values?: IIdNamePair[]) => ({ values }));\r\n\r\nexport const onFilterChannelListChanged = action('onFilterChannelListChanged', (values?: IIdNamePair[]) => ({ values }));\r\n\r\nexport const onFilterUpdateTypeChanged = action('onFilterUpdateTypeChanged', (value: IChoiceGroupOption) => ({ value }));\r\n\r\nexport const onfilterItemsEntryTypeChanged = action('onfilterItemsEntryTypeChanged', (value: IChoiceGroupOption) => ({ value }));\r\n\r\nexport const onFormExludedUrlChanged = action('onFormExludedUrlChanged', (value?: string) => ({ value }));\r\n\r\nexport const onFormExludedAdKeywordChanged = action('onFormExludedAdKeywordChanged', (value?: string) => ({ value }));\r\n\r\nexport const onFormExludedQueryKeywordChanged = action('onFormExludedQueryKeywordChanged', (value?: string) => ({ value }));\r\n\r\nexport const onFormAppendExcludedUrlsChanged = action('onFormAppendExcludedUrlsChanged', (value?: string) => ({ value }));\r\n\r\nexport const onFormAppendExcludedAdKeywordsChanged = action('onFormAppendExcludedAdKeywordsChanged', (value?: string) => ({ value }));\r\n\r\nexport const onFormAppendExcludedQueryKeywordsChanged = action('onFormAppendExcludedQueryKeywordsChanged', (value?: string) => ({ value }));\r\n\r\nexport const onFormDownloadClicked = action('onFormDownloadClicked', (value: string) => ({ value }));\r\n\r\nexport const onFormDownloadExcludedUrlLoading = action('onFormDownloadExcludedUrlLoading', (value: boolean) => ({ value }));\r\n\r\nexport const onFormDownloadExcludedAdkeywordLoading = action('onFormDownloadExcludedAdkeywordLoading', (value: boolean) => ({ value }));\r\n\r\nexport const onFormDownloadExcludedQuerykeywordLoading = action('onFormDownloadExcludedQuerykeywordLoading', (value: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormFilterStartTimeChanged = action('onFormFilterStartTimeChanged', (value?: Date) => ({ value }));\r\n\r\nexport const onFormFilterEndTimeChanged = action('onFormFilterEndTimeChanged', (value?: Date) => ({ value }));\r\n\r\nexport const onFormResetTimeRange = action('onFormResetTimeRange');\r\nexport const onFormUndoTimeRange = action('onFormUndoTimeRange');\r\n\r\nexport const onFormInitialized = action(\r\n 'onFormInitialized',\r\n (mode: FormState, publisherId: string, accountId: string, entityId?: string) => ({ mode, publisherId, accountId, entityId })\r\n);\r\n\r\nexport const onFormSubmitted = action('onFormSubmitted', (mode: FormState, routeHistory?: History) => ({ mode, routeHistory }));\r\n\r\nexport const onFormCancelled = action('onFormCancelled');\r\n\r\nexport const onFormCleared = action('onFormCleared');\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onManagePageInitialized = action('onManagePageInitialized');\r\n","import { createStore } from 'satcheljs';\r\nimport { IFilterViewState } from './schema/IFilterViewState';\r\n\r\nexport const getFilterStore = createStore<IFilterViewState>('FilterState', {\r\n active: {},\r\n errors: {}\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { Filter } from '../../../../../@data';\r\nimport { mergeTypeWithObject } from '../../../../../utils/ObjectUtils';\r\nimport {\r\n onFetchFiltersLoading,\r\n onFetchingFiltersData,\r\n onFilterChanged,\r\n onFilterErrorChanged,\r\n onFiltersFetched,\r\n onRawChanged,\r\n} from '../actions';\r\nimport { getFilterStore } from '../store/store';\r\n\r\nmutator(onRawChanged, (msg) => {\r\n getFilterStore().raw = mergeTypeWithObject(new Filter(), msg.value);\r\n});\r\n\r\nmutator(onFilterChanged, (msg) => {\r\n getFilterStore().active = msg.filter;\r\n});\r\n\r\nmutator(onFilterErrorChanged, (msg) => {\r\n getFilterStore().errors = msg.values || {};\r\n});\r\n\r\nmutator(onFetchFiltersLoading, (msg) => {\r\n getFilterStore().isLoading = msg.isLoading;\r\n});\r\n\r\nmutator(onFetchingFiltersData, (msg) => {\r\n getFilterStore().isFetchingData = msg.isFetchingData;\r\n});\r\n\r\nmutator(onFiltersFetched, (msg) => {\r\n getFilterStore().gridFilters = msg.items;\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { FilterScope } from '../../../../../@data';\r\nimport {\r\n onFilterChannelListChanged,\r\n onfilterItemsEntryTypeChanged,\r\n onFilterUpdateTypeChanged,\r\n onFormAppendExcludedAdKeywordsChanged,\r\n onFormAppendExcludedQueryKeywordsChanged,\r\n onFormAppendExcludedUrlsChanged,\r\n onFormChannelsChanged,\r\n onFormCleared,\r\n onFormDownloadExcludedAdkeywordLoading,\r\n onFormDownloadExcludedQuerykeywordLoading,\r\n onFormDownloadExcludedUrlLoading,\r\n onFormExludedAdKeywordChanged,\r\n onFormExludedQueryKeywordChanged,\r\n onFormExludedUrlChanged,\r\n onFormFilterEndTimeChanged,\r\n onFormFilterNameChanged,\r\n onFormFilterStartTimeChanged,\r\n onFormFilterTypeChanged,\r\n onFormIdChanged,\r\n onFormResetTimeRange,\r\n onFormUndoTimeRange,\r\n} from '../actions';\r\nimport { IFilterViewModel } from '../store/schema';\r\nimport { getFilterStore } from '../store/store';\r\n\r\nmutator(onFormIdChanged, (msg) => {\r\n getFilterStore().active.id = msg.value;\r\n});\r\n\r\nmutator(onFormFilterNameChanged, (msg) => {\r\n getFilterStore().active.name = msg.value;\r\n});\r\n\r\nmutator(onFormFilterNameChanged, (msg) => {\r\n getFilterStore().active.name = msg.value;\r\n});\r\n\r\nmutator(onFormFilterTypeChanged, (msg) => {\r\n const filterModel: IFilterViewModel = {\r\n ...getFilterStore().active,\r\n };\r\n filterModel.filterType = msg.value.key as FilterScope;\r\n getFilterStore().active = filterModel;\r\n});\r\n\r\nmutator(onFormChannelsChanged, (msg) => {\r\n getFilterStore().active.channelsSelected = msg.values;\r\n});\r\n\r\nmutator(onFilterChannelListChanged, (msg) => {\r\n getFilterStore().active.channels = msg.values;\r\n});\r\n\r\nmutator(onFilterUpdateTypeChanged, (msg) => {\r\n const filterModel: IFilterViewModel = {\r\n ...getFilterStore().active,\r\n };\r\n filterModel.appendOnly = msg.value.key === 'appendOnly' ? true : false;\r\n getFilterStore().active = filterModel;\r\n});\r\n\r\nmutator(onfilterItemsEntryTypeChanged, (msg) => {\r\n getFilterStore().active.filterItemsEntryType = msg.value.key;\r\n});\r\n\r\nmutator(onFormExludedUrlChanged, (msg) => {\r\n getFilterStore().active.excludedUrls = msg.value;\r\n});\r\n\r\nmutator(onFormExludedAdKeywordChanged, (msg) => {\r\n getFilterStore().active.excludedAdKeywords = msg.value;\r\n});\r\n\r\nmutator(onFormExludedQueryKeywordChanged, (msg) => {\r\n getFilterStore().active.excludedQueryKeywords = msg.value;\r\n});\r\n\r\nmutator(onFormAppendExcludedUrlsChanged, (msg) => {\r\n getFilterStore().active.appendExcludedUrls = msg.value;\r\n});\r\n\r\nmutator(onFormAppendExcludedAdKeywordsChanged, (msg) => {\r\n getFilterStore().active.appendExcludedAdKeywords = msg.value;\r\n});\r\n\r\nmutator(onFormAppendExcludedQueryKeywordsChanged, (msg) => {\r\n getFilterStore().active.appendExcludedQueryKeywords = msg.value;\r\n});\r\n\r\nmutator(onFormDownloadExcludedUrlLoading, (msg) => {\r\n getFilterStore().active.downloadExcludedUrlLoading = msg.value;\r\n});\r\n\r\nmutator(onFormDownloadExcludedAdkeywordLoading, (msg) => {\r\n getFilterStore().active.downloadExcludedAdkeywordLoading = msg.value;\r\n});\r\n\r\nmutator(onFormDownloadExcludedQuerykeywordLoading, (msg) => {\r\n getFilterStore().active.downloadExcludedQueryKeywordLoading = msg.value;\r\n});\r\n\r\nmutator(onFormFilterStartTimeChanged, (msg) => {\r\n getFilterStore().active.filterStartTime = msg.value;\r\n});\r\n\r\nmutator(onFormFilterEndTimeChanged, (msg) => {\r\n getFilterStore().active.filterEndTime = msg.value;\r\n});\r\n\r\nmutator(onFormResetTimeRange, () => {\r\n getFilterStore().active.filterStartTime = new Date();\r\n getFilterStore().active.filterEndTime = undefined;\r\n});\r\n\r\nmutator(onFormUndoTimeRange, () => {\r\n const { raw } = getFilterStore();\r\n const localDate = new Date();\r\n const UTCDate = new Date(\r\n localDate.getUTCFullYear(),\r\n localDate.getUTCMonth(),\r\n localDate.getUTCDate(),\r\n localDate.getUTCHours(),\r\n localDate.getUTCMinutes()\r\n );\r\n getFilterStore().active.filterStartTime = raw && raw.startTimeStamp ? new Date(raw.startTimeStamp * 1000) : UTCDate;\r\n getFilterStore().active.filterEndTime = raw && raw.endTimeStamp ? new Date(raw.endTimeStamp * 1000) : undefined;\r\n});\r\n\r\nmutator(onFormCleared, () => {\r\n getFilterStore().active = {};\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { onFormCancelled, onFormCleared } from '../actions';\r\n\r\norchestrator(onFormCancelled, () => {\r\n onFormCleared();\r\n});\r\n","import { isTythonSelfServeUser } from '../../../@data';\r\nimport { FormState } from '../../../components/Form';\r\nimport { RoutePrefix } from '../../../Routes';\r\n\r\ntype IdType = number | string;\r\n\r\nexport function getMultiStepperRoute(\r\n routeName: string,\r\n operation: FormState,\r\n publisherId: IdType,\r\n accountId?: IdType,\r\n entityId?: IdType,\r\n step?: number,\r\n showExtraBtns?: boolean\r\n): string {\r\n const page = operation === FormState.MultiStepCreation || operation === FormState.Create ? 'create' : 'edit';\r\n let base = '';\r\n if (accountId) {\r\n base = `/${RoutePrefix.adManagement}/${publisherId}-${accountId}/${routeName}/${page}`;\r\n } else {\r\n base = `/${RoutePrefix.adManagement}/${publisherId}/${routeName}/${page}`;\r\n }\r\n\r\n if (entityId && step !== undefined && showExtraBtns && isTythonSelfServeUser()) {\r\n return `${base}/${entityId}?step=${step}&showExtraBtns=${showExtraBtns}`;\r\n } else if (entityId && step !== undefined) {\r\n return `${base}/${entityId}?step=${step}`;\r\n } else if (entityId) {\r\n return `${base}/${entityId}`;\r\n }\r\n return base;\r\n}\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { FilterDownloader, getAppStore, getEntity, onNotificationChanged } from '../../../../../@data';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport {\r\n onFormDownloadClicked,\r\n onFormDownloadExcludedAdkeywordLoading,\r\n onFormDownloadExcludedQuerykeywordLoading,\r\n onFormDownloadExcludedUrlLoading,\r\n} from '../actions';\r\nimport { getFilterStore } from '../store/store';\r\n\r\norchestrator(onFormDownloadClicked, async (msg) => {\r\n const { publisher, userContext } = getAppStore();\r\n const { active } = getFilterStore();\r\n\r\n // TODO: Figure out how to internationalize orchestrators. #1632176\r\n let notification: INotificationBarItem = {};\r\n\r\n if (publisher) {\r\n try {\r\n const params = new URLSearchParams([['blockType', msg.value]]);\r\n\r\n const filterDownloader: FilterDownloader = {\r\n apiPath: undefined,\r\n className: 'filterdownloader',\r\n id: active.id,\r\n };\r\n switch (msg.value) {\r\n case 'ExcludedURL':\r\n onFormDownloadExcludedUrlLoading(true);\r\n break;\r\n case 'ExcludedAdKeyword':\r\n onFormDownloadExcludedAdkeywordLoading(true);\r\n break;\r\n case 'ExcludedQueryKeyword':\r\n onFormDownloadExcludedQuerykeywordLoading(true);\r\n break;\r\n }\r\n const response = await getEntity<FilterDownloader>([publisher, filterDownloader], userContext, undefined, params);\r\n const filterItems = response;\r\n\r\n const a = document.createElement('a');\r\n a.style.display = 'none';\r\n a.href = filterItems.downloadUrl!;\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n\r\n switch (msg.value) {\r\n case 'ExcludedURL':\r\n onFormDownloadExcludedUrlLoading(false);\r\n break;\r\n case 'ExcludedAdKeyword':\r\n onFormDownloadExcludedAdkeywordLoading(false);\r\n break;\r\n case 'ExcludedQueryKeyword':\r\n onFormDownloadExcludedQuerykeywordLoading(false);\r\n break;\r\n }\r\n\r\n notification = {\r\n text: `Download Filter_${active.id}_${msg.value} success`,\r\n messageBarType: MessageBarType.success,\r\n };\r\n } catch (e) {\r\n notification = {\r\n text: `Download Filter_${active.id}_${msg.value} caught an error \"${e}\"`,\r\n messageBarType: MessageBarType.error,\r\n };\r\n }\r\n } else {\r\n notification = {\r\n text: `No publisher is selected.`,\r\n messageBarType: MessageBarType.error,\r\n };\r\n }\r\n\r\n onNotificationChanged(notification);\r\n});\r\n","import {\r\n Account,\r\n getAppStore,\r\n getEntity,\r\n isTythonSelfServeUser,\r\n onAccountChanged,\r\n onPublisherChanged,\r\n onSetFirstPartyBoost,\r\n Publisher,\r\n} from '../../../../@data';\r\nimport { FormState } from '../../../../components/Form';\r\nimport { getMultiStepperRoute } from '../../../../layout/DetailPageWithStepper/utils/getMultiStepperRoute';\r\nimport { RoutePrefix } from '../../../../Routes';\r\nimport { RouteName } from '../store/store';\r\n\r\nexport async function setPublisherAndAccountContext(publisher: Publisher, account?: Account) {\r\n const appStore = getAppStore();\r\n if (appStore.publisher === undefined || appStore.publisher.id !== publisher.id) {\r\n const publisherAsync = await getEntity<Publisher>([publisher], appStore.userContext);\r\n onSetFirstPartyBoost(publisherAsync.publisherTier);\r\n\r\n if (publisherAsync) {\r\n const changedPublisher = new Publisher(publisherAsync.id, publisherAsync.name);\r\n changedPublisher.publisherTier = publisherAsync.publisherTier;\r\n onPublisherChanged(changedPublisher);\r\n } else {\r\n onPublisherChanged(undefined);\r\n }\r\n }\r\n\r\n if (!!account) {\r\n if (appStore.account === undefined || appStore.account.id !== account.id) {\r\n if (appStore.account && appStore.account.id !== account.id && appStore.account.id === 0) {\r\n // to allow adunit edit while all accounts option is selected\r\n return;\r\n }\r\n const accountAsync = await getEntity([publisher, account], appStore.userContext);\r\n if (accountAsync) {\r\n onAccountChanged(new Account(accountAsync.id, accountAsync.name));\r\n } else {\r\n onAccountChanged(undefined);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function createReturnUrl(\r\n entity: RouteName,\r\n publisherId?: string,\r\n accountId?: string,\r\n id?: string,\r\n formState?: FormState,\r\n step?: number,\r\n showExtraBtns?: boolean\r\n): string {\r\n let returnUrl = `/${RoutePrefix.adManagement}/${RouteName[entity]}`;\r\n\r\n switch (entity) {\r\n case RouteName.property:\r\n if (publisherId && !isTythonSelfServeUser()) {\r\n returnUrl = `/${RoutePrefix.adManagement}/${publisherId}/${RouteName[entity]}`;\r\n } else if (publisherId && isTythonSelfServeUser()) {\r\n if (formState !== undefined) {\r\n returnUrl = getMultiStepperRoute(RouteName[entity], formState, publisherId, accountId, id, step);\r\n } else {\r\n returnUrl = `/${RoutePrefix.adManagement}/${publisherId}/${RouteName[entity]}`;\r\n }\r\n }\r\n break;\r\n case RouteName.adunit:\r\n if (publisherId && accountId === '0') {\r\n returnUrl = `/${RoutePrefix.adManagement}/${publisherId}/${RouteName[entity]}`;\r\n } else if (publisherId && accountId && formState !== undefined) {\r\n returnUrl = getMultiStepperRoute(RouteName[entity], formState, publisherId, accountId, id, step, showExtraBtns);\r\n } else {\r\n returnUrl = `/${RoutePrefix.adManagement}/${publisherId}-${accountId}/${RouteName[entity]}`;\r\n }\r\n break;\r\n case RouteName.inventory:\r\n case RouteName.adfilter:\r\n case RouteName.channel:\r\n case RouteName.default:\r\n if (publisherId && accountId) {\r\n returnUrl = `/${RoutePrefix.adManagement}/${publisherId}-${accountId}/${RouteName[entity]}`;\r\n }\r\n }\r\n return returnUrl;\r\n}\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport {\r\n Account,\r\n Channel,\r\n Filter,\r\n FilterScope,\r\n getAppStore,\r\n listEntity,\r\n onLoadingChanged,\r\n onNotificationChanged,\r\n Publisher,\r\n} from '../../../../../@data';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { IIdNamePair } from '../../../../../components/MultiSelectPicker';\r\nimport { setPublisherAndAccountContext } from '../../../@data/services/AdManagementService';\r\nimport { onFilterChanged, onFilterErrorChanged, onFormInitialized, onRawChanged } from '../actions';\r\nimport { fetchFilterById } from '../services/FilterService';\r\nimport { IFilterViewModel } from '../store/schema';\r\n\r\norchestrator(onFormInitialized, async (msg) => {\r\n const { userContext } = getAppStore();\r\n\r\n const viewModel: IFilterViewModel = {\r\n channels: [],\r\n filterType: FilterScope.Account,\r\n };\r\n\r\n const publisherId = parseInt(msg.publisherId, 10);\r\n const accountId = parseInt(msg.accountId, 10);\r\n\r\n if (!isNaN(publisherId) && !isNaN(accountId)) {\r\n const publisher = new Publisher(publisherId);\r\n const account = new Account(accountId);\r\n\r\n try {\r\n setPublisherAndAccountContext(publisher, account);\r\n\r\n onFilterErrorChanged();\r\n onLoadingChanged(true);\r\n\r\n const response = await listEntity([publisher, account], userContext, Channel);\r\n viewModel.channels = response ? response.map((f) => ({ id: f.id, name: f.name } as IIdNamePair)) : [];\r\n\r\n const localeDate = new Date();\r\n const UTCDate = new Date(\r\n localeDate.getUTCFullYear(),\r\n localeDate.getUTCMonth(),\r\n localeDate.getUTCDate(),\r\n localeDate.getUTCHours(),\r\n localeDate.getUTCMinutes(),\r\n 0\r\n );\r\n // We decided to keep filter start time as current datetime by default.\r\n viewModel.filterStartTime = UTCDate;\r\n viewModel.filterItemsEntryType = 'manualEntry';\r\n\r\n if (msg.mode === FormState.Edit && msg.entityId) {\r\n const raw = await fetchFilterById(publisher, msg.entityId, userContext);\r\n\r\n viewModel.id = raw.id;\r\n viewModel.name = String(raw.name);\r\n viewModel.appendOnly = raw.appendOnly;\r\n viewModel.filterItemsEntryType = raw.appendOnly ? 'fileUpload' : 'manualEntry';\r\n\r\n if (!viewModel.appendOnly) {\r\n viewModel.excludedUrlsCount = raw.blockedUrls!.length;\r\n viewModel.excludedAdkeywordsCount = raw.blockedAdKeywords!.length;\r\n viewModel.excludedQueryKeywordsCount = raw.blockedQueryKeywords!.length;\r\n } else {\r\n const filterResponse = await listEntity([publisher, account], userContext, Filter);\r\n const matchedFilter = filterResponse.filter((f) => f.id === raw.id)[0];\r\n\r\n viewModel.excludedUrlsCount = matchedFilter.blockedUrlCount;\r\n viewModel.excludedAdkeywordsCount = matchedFilter.blockedAdKeywordCount;\r\n viewModel.excludedQueryKeywordsCount = matchedFilter.blockedQueryKeywordCount;\r\n }\r\n\r\n // Set filter Type to Standard as default.\r\n viewModel.filterType = raw.filterScope || FilterScope.Account;\r\n\r\n if (raw.blockedUrls) {\r\n viewModel.excludedUrls = raw.blockedUrls.join('\\n');\r\n }\r\n\r\n if (raw.blockedAdKeywords) {\r\n viewModel.excludedAdKeywords = raw.blockedAdKeywords.join('\\n');\r\n }\r\n\r\n if (raw.blockedQueryKeywords) {\r\n viewModel.excludedQueryKeywords = raw.blockedQueryKeywords.join('\\n');\r\n }\r\n\r\n // Currently API accepts and returns start/end time in epoch. Converting epoch to Date type.\r\n const timeZoneOffset = new Date().getTimezoneOffset();\r\n viewModel.filterStartTime = raw.startTimeStamp ? new Date((raw.startTimeStamp + timeZoneOffset * 60) * 1000) : undefined;\r\n viewModel.filterEndTime = raw.endTimeStamp ? new Date((raw.endTimeStamp + timeZoneOffset * 60) * 1000) : undefined;\r\n\r\n viewModel.channelsSelected =\r\n raw.associatedChannelIds && raw.associatedChannelIds.length > 0\r\n ? viewModel.channels.filter((c) => raw.associatedChannelIds!.includes(c.id))\r\n : [];\r\n\r\n onRawChanged(raw);\r\n } else {\r\n onRawChanged();\r\n }\r\n onFilterChanged(viewModel);\r\n } catch (e) {\r\n onNotificationChanged({\r\n text: 'Failed to load entity',\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n text: `You have arrived in an invalid state, please report.`,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { Filter, listEntity, Publisher, UserContext } from '../../../../../@data';\r\n\r\nexport const fetchFilterById = async (publisher: Publisher, id: string, userContext?: UserContext): Promise<Filter> => {\r\n const list = await listEntity([publisher], userContext, Filter, new URLSearchParams([['ids', id]]));\r\n\r\n if (!list || !list.length) {\r\n throw Error('Cannot find filter Id');\r\n }\r\n\r\n return list[0];\r\n};","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport {\r\n Filter,\r\n FilterScope,\r\n getAppStore,\r\n onNavigateBack,\r\n onNotificationChanged,\r\n onSavingChanged,\r\n postEntity,\r\n putEntity,\r\n} from '../../../../../@data';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport { stringToList, validateSchema } from '../../../../../utils';\r\nimport { RouteName } from '../../../@data';\r\nimport { createReturnUrl } from '../../../@data/services/AdManagementService';\r\nimport { onFilterErrorChanged, onFormCleared, onFormIdChanged, onFormSubmitted } from '../actions';\r\nimport { filterErrorModel } from '../store/schema/FilterErrorModel';\r\nimport { getFilterStore } from '../store/store';\r\n\r\norchestrator(onFormSubmitted, async (msg) => {\r\n const { publisher, userContext, account } = getAppStore();\r\n const { active, raw } = getFilterStore();\r\n\r\n // TODO: Figure out how to internationalize orchestrators. #1632176\r\n let notification: INotificationBarItem = {};\r\n\r\n if (publisher && account && raw) {\r\n const body: Filter = {\r\n ...raw,\r\n id: active.id,\r\n name: active.name,\r\n };\r\n\r\n let excludedUrls, excludedAdKeywords, excludedQueryKeywords;\r\n if (active.filterItemsEntryType === 'manualEntry') {\r\n excludedUrls = active.excludedUrls;\r\n excludedAdKeywords = active.excludedAdKeywords;\r\n excludedQueryKeywords = active.excludedQueryKeywords;\r\n } else {\r\n excludedUrls = active.appendExcludedUrls;\r\n excludedAdKeywords = active.appendExcludedAdKeywords;\r\n excludedQueryKeywords = active.appendExcludedQueryKeywords;\r\n }\r\n\r\n try {\r\n await validateSchema(filterErrorModel(), active);\r\n onFilterErrorChanged();\r\n } catch (e) {\r\n onFilterErrorChanged(e);\r\n onNotificationChanged({\r\n text: `Filter - You have ${Object.keys(e).length} missing fields, please fill them to continue.`,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n return;\r\n }\r\n onSavingChanged(true);\r\n\r\n body.filterScope = active.filterType;\r\n body.scopeId = active.filterType === FilterScope.Account ? account.id : publisher.id;\r\n body.associatedChannelIds =\r\n active.channelsSelected && active.filterType === FilterScope.Account ? active.channelsSelected.map((m) => m.id) : [];\r\n\r\n const blockedAdKeywordsList: string[] = stringToList(excludedAdKeywords);\r\n body.blockedAdKeywords = blockedAdKeywordsList;\r\n\r\n const excludedQueryKeywordsList: string[] = stringToList(excludedQueryKeywords);\r\n body.blockedQueryKeywords = excludedQueryKeywordsList;\r\n\r\n const excludedUrlsList: string[] = stringToList(excludedUrls);\r\n body.blockedUrls = excludedUrlsList;\r\n\r\n body.appendOnly = active.appendOnly;\r\n\r\n const timeZoneOffset = new Date().getTimezoneOffset();\r\n body.startTimeStamp =\r\n active.filterStartTime !== undefined\r\n ? Math.floor((active.filterStartTime!.getTime() - timeZoneOffset * 60 * 1000) / 1000)\r\n : undefined;\r\n body.endTimeStamp =\r\n active.filterEndTime !== undefined ? Math.floor((active.filterEndTime!.getTime() - timeZoneOffset * 60 * 1000) / 1000) : undefined;\r\n\r\n try {\r\n let entity: Filter | undefined;\r\n\r\n if (msg.mode === FormState.Edit) {\r\n entity = await putEntity([publisher], body, userContext, Filter);\r\n\r\n notification = {\r\n text: `Edited ad filter ${entity.id} success`,\r\n messageBarType: MessageBarType.success,\r\n };\r\n } else {\r\n entity = await postEntity([publisher], Filter, body, userContext);\r\n\r\n if (entity && entity.id) {\r\n onFormIdChanged(entity.id);\r\n }\r\n\r\n notification = {\r\n text: `Created new ad filter ${entity.id} success`,\r\n messageBarType: MessageBarType.success,\r\n };\r\n }\r\n\r\n // return to manage page\r\n const returnUrl = createReturnUrl(RouteName.adfilter, String(publisher.id), String(account.id));\r\n onNavigateBack(msg.routeHistory, returnUrl);\r\n onFormCleared();\r\n } catch (e) {\r\n notification = {\r\n text: `Submitting the adfilter form \"${FormState[msg.mode]}\" caught an error \"${e}\"`,\r\n messageBarType: MessageBarType.error,\r\n };\r\n } finally {\r\n onSavingChanged(false);\r\n }\r\n } else {\r\n notification = {\r\n text: `Adfilter form \"${FormState[msg.mode]}\" is invalid id ${active.id}`,\r\n messageBarType: MessageBarType.warning,\r\n };\r\n }\r\n\r\n onNotificationChanged(notification);\r\n});\r\n","import { array, mixed, object, string } from 'yup';\r\nimport { FilterScope, IdNamePairErrorModel } from '../../../../../../@data/store/schema';\r\nimport { ArrayObservableSchemaYupType, StringListSchemaYupType } from '../../../../../../utils/validation';\r\nimport { IFilterViewModel } from './IFilterViewModel';\r\n\r\nexport function filterErrorModel() {\r\n return object<IFilterViewModel>().shape({\r\n name: string().trim().required(),\r\n channelsSelected: new ArrayObservableSchemaYupType().of(IdNamePairErrorModel).when('filterType', {\r\n is: FilterScope.Account,\r\n then: array().required(),\r\n otherwise: array(),\r\n }),\r\n filterType: mixed().oneOf([FilterScope.Account, FilterScope.Publisher]).required(),\r\n excludedUrls: new StringListSchemaYupType().of(string().trim().oldDomain()),\r\n excludedAdKeywords: new StringListSchemaYupType().of(string().trim()),\r\n excludedQueryKeywords: new StringListSchemaYupType().of(string().trim()),\r\n });\r\n}\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { Filter, getAppStore, listEntity, onNotificationChanged } from '../../../../../@data';\r\nimport { onFetchFiltersLoading, onFetchingFiltersData, onFiltersFetched } from '../actions';\r\nimport { onManagePageInitialized } from '../actions/onManagePageInitialized';\r\nimport { getFilterStore } from '../store/store';\r\n\r\norchestrator(onManagePageInitialized, async () => {\r\n try {\r\n const { publisher, userContext, account } = getAppStore();\r\n const filters = getFilterStore().gridFilters;\r\n\r\n if (filters === undefined || filters.length === 0) {\r\n onFetchFiltersLoading(true);\r\n }\r\n onFetchingFiltersData(true);\r\n\r\n if (publisher && account && userContext) {\r\n const params = new URLSearchParams([['extendedInfo', 'true']]);\r\n const data = await listEntity([publisher, account], userContext, Filter, params);\r\n data.forEach((filter) => {\r\n if (!!filter.startTimeStamp && !isNaN(Number(filter.startTimeStamp))) {\r\n filter.startTime = new Date(Number(filter.startTimeStamp) * 1000).toISOString();\r\n }\r\n if (!!filter.endTimeStamp && !isNaN(Number(filter.endTimeStamp))) {\r\n filter.endTime = new Date(Number(filter.endTimeStamp) * 1000).toISOString();\r\n }\r\n });\r\n onFiltersFetched(data);\r\n }\r\n } catch (error) {\r\n Log.error(error);\r\n onNotificationChanged({ messageBarType: MessageBarType.error, text: 'Failed to load ad filters' });\r\n } finally {\r\n onFetchFiltersLoading(false);\r\n onFetchingFiltersData(false);\r\n }\r\n});\r\n","import { classNamesFunction, getId, Spinner } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { getScreenReaderTextStyles } from '../../utils/GlobalStyleUtils';\r\nimport { IBulkUploadProps, IBulkUploadStyleProps, IBulkUploadStyles } from './bulkUpload.types';\r\n\r\nconst getClassNames = classNamesFunction<IBulkUploadStyleProps, IBulkUploadStyles>();\r\n\r\ninterface IBulkUploadState {\r\n isCalloutVisible?: boolean;\r\n file?: string;\r\n}\r\n\r\nexport class BulkUploadBase extends React.Component<IBulkUploadProps, IBulkUploadState> {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n isCalloutVisible: false,\r\n };\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { styles, theme, uploadDescription, isLoading, onUpload, disabled, ariaLabelledBy, ariaLabel } = this.props;\r\n const classNames = getClassNames(styles, { theme: theme! });\r\n const bulkUploadDescription = getId('bulkUploadDescription');\r\n\r\n return (\r\n <div className={classNames.root}>\r\n <input\r\n type=\"file\"\r\n accept=\".txt\"\r\n onChange={(event) => {\r\n onUpload(event);\r\n }}\r\n disabled={disabled}\r\n {...(ariaLabelledBy ? { 'aria-labelledby': ariaLabelledBy } : { 'aria-label': ariaLabel })}\r\n aria-describedby={bulkUploadDescription}\r\n />\r\n {isLoading && <Spinner label=\"Uploading file...\" labelPosition=\"right\" />}\r\n <div className={classNames.uploadDescription}>{uploadDescription}</div>\r\n <span id={bulkUploadDescription} style={getScreenReaderTextStyles()}>\r\n {uploadDescription}\r\n </span>\r\n </div>\r\n );\r\n }\r\n}\r\n","import { IPubcenterSpacing } from '../../../theme';\r\nimport { IBulkUploadStyleProps, IBulkUploadStyles } from './bulkUpload.types';\r\n\r\nexport const getStyles = (props: IBulkUploadStyleProps): IBulkUploadStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n return {\r\n root: {},\r\n uploadDescription: [\r\n 'ms-fontWeight-regular',\r\n {\r\n fontSize: 12,\r\n paddingTop: spacing.size8\r\n }\r\n ]\r\n };\r\n};\r\n","import { styled } from '@fluentui/react';\r\nimport { BulkUploadBase } from './bulkUpload.base';\r\nimport { getStyles } from './bulkUpload.styles';\r\nimport { IBulkUploadProps, IBulkUploadStyleProps, IBulkUploadStyles } from './bulkUpload.types';\r\n\r\nexport const BulkUpload = styled<IBulkUploadProps, IBulkUploadStyleProps, IBulkUploadStyles>(BulkUploadBase, getStyles, undefined, {\r\n scope: 'BulkUpload',\r\n});\r\n","import {\r\n BaseComponent,\r\n classNamesFunction,\r\n ComboBox,\r\n DatePicker,\r\n getTheme,\r\n IComboBoxOption,\r\n IDatePickerStrings,\r\n IProcessedStyleSet,\r\n TextField,\r\n} from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport messages from './DateTimePicker.messages';\r\nimport { getStyles } from './DateTimePicker.styles';\r\nimport { DayPickerStrings, IDateTimePickerProps, IDateTimePickerStyleProps, IDateTimePickerStyles } from './DateTimePicker.types';\r\n\r\ninterface IDateTimePickerState {\r\n date?: number;\r\n month?: number;\r\n year?: number;\r\n hours: number;\r\n minutes: number;\r\n seconds: number;\r\n}\r\n\r\nconst getClassNames = classNamesFunction<IDateTimePickerStyleProps, IDateTimePickerStyles>();\r\n\r\nexport class DateTimePicker extends BaseComponent<IDateTimePickerProps, IDateTimePickerState> {\r\n private _classNames: IProcessedStyleSet<IDateTimePickerStyles>;\r\n\r\n constructor(props: IDateTimePickerProps) {\r\n super(props);\r\n\r\n const { value } = this.props;\r\n if (value) {\r\n this.state = {\r\n date: value.getDate(),\r\n month: value.getMonth(),\r\n year: value.getFullYear(),\r\n hours: value.getHours(),\r\n minutes: value.getMinutes(),\r\n seconds: value.getSeconds(),\r\n };\r\n } else {\r\n this.state = {\r\n hours: 0,\r\n minutes: 0,\r\n seconds: 0,\r\n };\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: IDateTimePickerProps, prevState: IDateTimePickerState): void {\r\n if (prevProps !== this.props) {\r\n const { value } = this.props;\r\n if (value) {\r\n this.setState({\r\n date: value.getDate(),\r\n month: value.getMonth(),\r\n year: value.getFullYear(),\r\n hours: value.getHours(),\r\n minutes: value.getMinutes(),\r\n seconds: value.getSeconds(),\r\n });\r\n }\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { formatMessage } = this.props.intl;\r\n const {\r\n datePickerWidth,\r\n datePlaceholder,\r\n label,\r\n minDateTime,\r\n maxDateTime,\r\n onDateTimeChanged,\r\n allowSecondsField,\r\n disabled,\r\n isOutOfBoundsErrorMessage,\r\n } = this.props;\r\n const { year, month, date, hours, minutes, seconds } = this.state;\r\n\r\n const theme = getTheme();\r\n const styles = getStyles({ theme, datePickerWidth });\r\n this._classNames = getClassNames(styles);\r\n\r\n const hourComboBoxOption: IComboBoxOption[] = [];\r\n\r\n hourComboBoxOption.push({ key: 0, text: `12 AM` });\r\n for (let i = 1; i < 12; i++) {\r\n hourComboBoxOption.push({ key: i, text: `${i} AM` });\r\n }\r\n hourComboBoxOption.push({ key: 12, text: `12 PM` });\r\n for (let i = 1; i < 12; i++) {\r\n hourComboBoxOption.push({ key: 12 + i, text: `${i} PM` });\r\n }\r\n\r\n // Disabling out of bound hour options\r\n if (this.props.value && minDateTime && this.props.value!.toDateString() === minDateTime!.toDateString()) {\r\n hourComboBoxOption.forEach((option) => {\r\n if (option.key < minDateTime!.getHours()) {\r\n option.disabled = true;\r\n }\r\n });\r\n }\r\n if (this.props.value && maxDateTime && this.props.value!.toDateString() === maxDateTime!.toDateString()) {\r\n hourComboBoxOption.forEach((option) => {\r\n if (option.key > maxDateTime!.getHours()) {\r\n option.disabled = true;\r\n }\r\n });\r\n }\r\n\r\n // We are only providing these options but using comboBox user can choose to add a custom value as well\r\n const minutesComboBoxOption: IComboBoxOption[] = [\r\n { key: 0, text: '00' },\r\n { key: 15, text: '15' },\r\n { key: 30, text: '30' },\r\n { key: 45, text: '45' },\r\n ];\r\n\r\n // Adding a new options for the custom minute from input value\r\n if (minutes && !minutesComboBoxOption.find((option) => option.key === minutes)) {\r\n minutesComboBoxOption.push({ key: minutes, text: minutes.toString() });\r\n }\r\n\r\n const strings: IDatePickerStrings = DayPickerStrings;\r\n strings.isOutOfBoundsErrorMessage = isOutOfBoundsErrorMessage;\r\n\r\n return (\r\n <div className={this._classNames.root}>\r\n <DatePicker\r\n strings={strings}\r\n allowTextInput={true}\r\n label={label ? label : formatMessage(messages.label)}\r\n placeholder={datePlaceholder ? datePlaceholder : formatMessage(messages.datePlaceholder)}\r\n minDate={minDateTime}\r\n maxDate={maxDateTime}\r\n value={this.props.value}\r\n onSelectDate={(val: Date) => {\r\n if (val) {\r\n const _date = new Date(\r\n val.getFullYear(),\r\n val.getMonth(),\r\n val.getDate(),\r\n this.state.hours,\r\n this.state.minutes,\r\n this.state.seconds,\r\n 0\r\n );\r\n onDateTimeChanged(_date);\r\n this.setState({\r\n date: val.getDate(),\r\n month: val.getMonth(),\r\n year: val.getFullYear(),\r\n });\r\n }\r\n }}\r\n disabled={disabled}\r\n styles={this._classNames.subComponentStyles.datePicker}\r\n />\r\n <ComboBox\r\n selectedKey={hours}\r\n options={hourComboBoxOption}\r\n styles={styles.hourPicker}\r\n disabled={disabled}\r\n onChange={(_, option) => {\r\n if (option) {\r\n const _hours = parseInt(option.key.toString(), 10);\r\n\r\n if (year && month && date) {\r\n const _date = new Date(year, month, date, _hours, minutes, seconds, 0);\r\n onDateTimeChanged(_date);\r\n }\r\n this.setState({ hours: _hours });\r\n }\r\n }}\r\n />\r\n <span className={this._classNames.colonSeperator}>{':'}</span>\r\n <ComboBox\r\n selectedKey={minutes}\r\n options={minutesComboBoxOption}\r\n allowFreeform\r\n autoComplete=\"on\"\r\n styles={styles.minutesPicker}\r\n onChange={(_, option, index, value) => {\r\n let _minutes;\r\n if (option) {\r\n _minutes = parseInt(option.key.toString(), 10);\r\n } else if (!option && value) {\r\n // since allowfreeform is true, here we are adding custom option\r\n _minutes = parseInt(value.toString(), 10);\r\n minutesComboBoxOption.push({ key: _minutes, text: value });\r\n }\r\n if (year && month && date) {\r\n // if date is already selected, then update the datetime\r\n const _date = new Date(year, month, date, hours, _minutes, seconds, 0);\r\n onDateTimeChanged(_date);\r\n }\r\n this.setState({ minutes: _minutes });\r\n }}\r\n errorMessage={minutes && minutes >= 60 ? formatMessage(messages.invalidMinuteErrorMessage) : undefined}\r\n disabled={disabled}\r\n />\r\n {allowSecondsField ? (\r\n <>\r\n <span className={this._classNames.colonSeperator}>{':'}</span>\r\n <TextField\r\n value={seconds ? seconds.toString() : '00'}\r\n className={this._classNames.secondsPicker}\r\n onChange={(_, text) => {\r\n if (text) {\r\n const _seconds = parseInt(text, 10);\r\n\r\n if (year && month && date) {\r\n const _date = new Date(year, month, date, hours, minutes, _seconds, 0);\r\n onDateTimeChanged(_date);\r\n }\r\n this.setState({ seconds: _seconds });\r\n }\r\n }}\r\n errorMessage={seconds && seconds >= 60 ? formatMessage(messages.invalidSecondsErrorMessage) : undefined}\r\n disabled={disabled}\r\n />\r\n </>\r\n ) : null}\r\n </div>\r\n );\r\n }\r\n}\r\n","import { IPubcenterSpacing } from \"../../../theme\";\r\nimport { IDateTimePickerStyleProps, IDateTimePickerStyles } from \"./DateTimePicker.types\";\r\n\r\nexport const getStyles = (props: IDateTimePickerStyleProps): IDateTimePickerStyles => {\r\n const { theme } = props\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n // In future we can use datePickerWidth to customise the width of the date time picker\r\n\r\n return {\r\n root: {\r\n display: 'flex',\r\n marginBottom: spacing.size16,\r\n maxWidth: props.datePickerWidth ? props.datePickerWidth : 640,\r\n },\r\n colonSeperator: {\r\n margin: '32px 8px 0 8px'\r\n },\r\n hourPicker: {\r\n root: {\r\n marginTop: '29px',\r\n marginLeft: '16px',\r\n maxWidth: 133,\r\n }\r\n },\r\n minutesPicker: {\r\n root: {\r\n marginTop: '29px',\r\n maxWidth: 133,\r\n }\r\n },\r\n secondsPicker: {\r\n marginTop: '29px',\r\n maxWidth: 133,\r\n },\r\n subComponentStyles: {\r\n datePicker: {\r\n root: {\r\n width: 320\r\n }\r\n }\r\n }\r\n }\r\n}","import { createStore } from 'satcheljs';\r\nimport { IChannelViewState } from './schema/IChannelViewState';\r\n\r\nexport const getStore = createStore<IChannelViewState>('ChannelState', {\r\n active: {},\r\n errors: {}\r\n});\r\n","import { action } from 'satcheljs';\r\nimport { Channel, IStringDictionary } from '../../../../../@data';\r\nimport { IChannelViewModel } from '../store/schema';\r\n\r\nexport const onRawChanged = action('onRawChanged', (value?: Channel) => ({ value }));\r\n\r\nexport const onChannelChanged = action('onChannelChanged', (channel: IChannelViewModel) => ({ channel }));\r\n\r\nexport const onChannelErrorChanged = action('onChannelErrorChanged', (values?: IStringDictionary) => ({ values }));\r\n\r\nexport const onFetchChannelsLoading = action('onFetchChannelsLoading', (isLoading: boolean) => ({ isLoading }));\r\n\r\nexport const onFetchingChannelsData = action('onFetchingChannelsData', (isFetchingData: boolean) => ({ isFetchingData }));\r\n\r\nexport const onChannelsFetched = action('onChannelsFetched', (items: Channel[]) => ({ items }));\r\n","import { History } from 'history';\r\nimport { action } from 'satcheljs';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { IIdNamePair } from '../../../../../components/MultiSelectPicker';\r\n\r\nexport const onFormIdChanged = action('onFormIdChanged', (value: number) => ({ value }));\r\n\r\nexport const onFormChannelNameChanged = action('onFormChannelNameChanged', (value?: string) => ({ value }));\r\n\r\nexport const onFormAdunitsChanged = action('onFormAdunitsChanged', (values: IIdNamePair[]) => ({ values }));\r\n\r\nexport const onFormFiltersChanged = action('onFormFiltersChanged', (values: IIdNamePair[]) => ({ values }));\r\n\r\nexport const onFormInitialized = action(\r\n 'onFormInitialized',\r\n (mode: FormState, publisherId: string, accountId: string, entityId?: string) => ({ mode, publisherId, accountId, entityId })\r\n);\r\n\r\nexport const onFormSubmitted = action(\r\n 'onFormSubmitted',\r\n (mode: FormState, routeHistory?: History, entityId?: string) => ({ mode, routeHistory, entityId })\r\n);\r\n\r\nexport const onFormCancelled = action('onFormCancelled', (mode: FormState) => ({ mode }));\r\n\r\nexport const onFormCleared = action('onFormCleared');\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onManagePageInitialized = action('onManagePageInitialized');\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n inputChannelName: {\r\n id: 'admanagement.channel.inputChannelName',\r\n defaultMessage: 'Channel name',\r\n },\r\n inputAdunits: {\r\n id: 'admanagement.channel.inputAdunits',\r\n defaultMessage: 'Add ad units',\r\n },\r\n adunitPickerAriaDesc: {\r\n id: 'admanagement.channel.adunitPickerAriaDesc',\r\n defaultMessage: 'Select ad units to be associated with the channel'\r\n },\r\n channelId: {\r\n id: 'admanagement.channel.channelId',\r\n defaultMessage: 'Channel ID',\r\n },\r\n inputFilters: {\r\n id: 'admanagement.channel.inputFilters',\r\n defaultMessage: 'Add ad filters',\r\n },\r\n filterPickerAriaDesc: {\r\n id: 'admanagement.channel.filterPickerAriaDesc',\r\n defaultMessage: 'Select ad filters to be associated with the channel'\r\n },\r\n createChannel: {\r\n id: 'admanagement.channel.createTitle',\r\n defaultMessage: 'Create channel',\r\n },\r\n editChannel: {\r\n id: 'admanagement.channel.editTitle',\r\n defaultMessage: 'Edit channel',\r\n },\r\n updateChannel: {\r\n id: 'admanagement.channel.updateChannel',\r\n defaultMessage: 'Update channel',\r\n },\r\n});\r\n","import { TextField } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { getAppStore, onNavigateBack } from '../../../../@data';\r\nimport { completeAccess, hasUpdateAccess, UserRoleEntity, userRoleKey } from '../../../../@data/services/UserRoleService';\r\nimport { Channel as ChannelAccessPermissions } from '../../../../@data/store/schema/userrolemodels/Channel';\r\nimport { FormItem, FormState } from '../../../../components/Form';\r\nimport { MultiSelectPicker } from '../../../../components/MultiSelectPicker';\r\nimport { DetailPage } from '../../../../layout/DetailPage/DetailPage';\r\nimport { injectIntlWithObserver } from '../../../../utils/ReactUtils';\r\nimport { RouteName } from '../../@data';\r\nimport { createReturnUrl } from '../../@data/services/AdManagementService';\r\nimport { getStore } from '../@data';\r\nimport {\r\n onFormAdunitsChanged,\r\n onFormCancelled,\r\n onFormChannelNameChanged,\r\n onFormFiltersChanged,\r\n onFormInitialized,\r\n onFormSubmitted,\r\n} from '../@data/actions';\r\nimport messages from './CreateChannel.messages';\r\nimport { ICreateChannelProps, IFormInitializationState } from './CreateChannel.types';\r\n\r\nexport const CreateChannel = injectIntlWithObserver(\r\n class CreateChannelPage extends React.Component<ICreateChannelProps, IFormInitializationState> {\r\n constructor(props: ICreateChannelProps) {\r\n super(props);\r\n this.state = {\r\n initializeForm: true,\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n const publisherId = this.props.match.params.publisherId;\r\n const accountId = this.props.match.params.accountId;\r\n const entityId = this.props.match.params.id;\r\n if (publisherId && entityId && accountId === undefined && this.props.location.pathname.includes('adunit/edit')) {\r\n onFormInitialized(FormState.InPageCreate, publisherId, '0', entityId);\r\n }\r\n\r\n this.setState({ id: entityId });\r\n if (publisherId && accountId) {\r\n onFormInitialized(this.props.mode, publisherId, accountId, entityId);\r\n }\r\n }\r\n\r\n public componentDidUpdate() {\r\n const publisherId = this.props.match.params.publisherId;\r\n const accountId = this.props.match.params.accountId;\r\n const entityId = this.props.match.params.id;\r\n if (this.state.initializeForm && this.state.id !== entityId) {\r\n this.setState({ id: entityId });\r\n if (publisherId && accountId) {\r\n onFormInitialized(this.props.mode, publisherId, accountId, entityId);\r\n }\r\n }\r\n }\r\n\r\n public render() {\r\n const { formatMessage } = this.props.intl;\r\n const store = getStore();\r\n const { saving, loading } = getAppStore();\r\n const publisherId = this.props.match.params.publisherId;\r\n const accountId = this.props.match.params.accountId;\r\n\r\n const channelAccessPermissions = this._getChannelAccessPermission();\r\n\r\n return (\r\n <DetailPage\r\n titleLabel={this.props.mode === FormState.Edit ? formatMessage(messages.editChannel) : formatMessage(messages.createChannel)}\r\n helpId={'pop_PCv4_ChannelsCreate'}\r\n submitLabel={formatMessage(this.props.mode === FormState.Edit ? messages.updateChannel : messages.createChannel)}\r\n onSubmit={() => this._onSubmit(publisherId, accountId)}\r\n onCancel={() => this._onCancel(publisherId, accountId)}\r\n onNavClick={() => this._onCancel(publisherId, accountId)}\r\n saving={saving}\r\n loading={loading}\r\n pageMode={this.props.mode}\r\n >\r\n <FormItem formWidth={440}>\r\n <TextField\r\n label={formatMessage(messages.inputChannelName)}\r\n errorMessage={store.errors.name}\r\n required={true}\r\n value={store.active.name}\r\n onChange={(_, value) => onFormChannelNameChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n channelAccessPermissions === null ? completeAccess : channelAccessPermissions.name\r\n )}\r\n />\r\n </FormItem>\r\n\r\n {store.active.id && (\r\n <FormItem formWidth={440}>\r\n <TextField label={formatMessage(messages.channelId)} required={true} disabled={true} value={String(store.active.id)} />\r\n </FormItem>\r\n )}\r\n\r\n <FormItem formWidth={580}>\r\n <MultiSelectPicker\r\n {...this.props}\r\n label={formatMessage(messages.inputAdunits)}\r\n ariaDescription={formatMessage(messages.adunitPickerAriaDesc)}\r\n required={true}\r\n errorMessage={store.errors.adunitsSelected}\r\n items={store.active.adunits || []}\r\n initialSelectedItems={store.active.adunitsSelected}\r\n onSelectedItems={(items) => onFormAdunitsChanged(items)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n channelAccessPermissions === null ? completeAccess : channelAccessPermissions.adUnitList\r\n )}\r\n />\r\n </FormItem>\r\n\r\n <FormItem formWidth={600}>\r\n <MultiSelectPicker\r\n {...this.props}\r\n label={formatMessage(messages.inputFilters)}\r\n ariaDescription={formatMessage(messages.filterPickerAriaDesc)}\r\n errorMessage={store.errors.filtersSelected}\r\n items={store.active.filters || []}\r\n initialSelectedItems={store.active.filtersSelected}\r\n onSelectedItems={(items) => onFormFiltersChanged(items)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n channelAccessPermissions === null ? completeAccess : channelAccessPermissions.adFilters\r\n )}\r\n />\r\n </FormItem>\r\n </DetailPage>\r\n );\r\n }\r\n\r\n private _onSubmit = (publisherId?: string, accountId?: string): void => {\r\n this.setState({ initializeForm: false });\r\n let entityId;\r\n if (publisherId && !accountId && this.props.location.pathname.includes('adunit/edit')) {\r\n // to enable channel creation on adunit edit page scoped to 'All accounts', fetch accountId using adunitId from route\r\n entityId = this.props.match.params.id;\r\n }\r\n onFormSubmitted(this.props.mode, this.props.history, entityId);\r\n };\r\n\r\n private _onCancel = (publisherId?: string, accountId?: string): void => {\r\n this.setState({ initializeForm: false });\r\n onFormCancelled(this.props.mode);\r\n if (this.props.mode !== FormState.InPageCreate) {\r\n // return to manage page\r\n const returnUrl = createReturnUrl(RouteName.channel, publisherId, accountId);\r\n onNavigateBack(this.props.history, returnUrl);\r\n }\r\n };\r\n\r\n private _getChannelAccessPermission(): ChannelAccessPermissions | null {\r\n const userRoles = localStorage.getItem(userRoleKey);\r\n if (userRoles === null) {\r\n return null;\r\n }\r\n const userRolesJSON = JSON.parse(userRoles);\r\n\r\n for (const value in userRolesJSON) {\r\n if (value === UserRoleEntity.Channel) {\r\n return JSON.parse(userRolesJSON[value]);\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _isDisabled(mode: FormState, permission: number): boolean {\r\n if (mode === FormState.Create || mode === FormState.InPageCreate) {\r\n return false;\r\n }\r\n\r\n return !hasUpdateAccess(permission);\r\n }\r\n }\r\n);\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n inputName: {\r\n id: 'admanagement.adfilter.inputName',\r\n defaultMessage: 'Ad filter name',\r\n },\r\n inputNameLength: {\r\n id: 'admanagement.adfilter.inputNameLength',\r\n defaultMessage: 'Do not exceed 35 characters',\r\n },\r\n createFilter: {\r\n id: 'admanagement.adfilter.createFilter',\r\n defaultMessage: 'Create ad filter',\r\n },\r\n editFilter: {\r\n id: 'admanagement.adfilter.editFilter',\r\n defaultMessage: 'Update ad filter',\r\n },\r\n filterId: {\r\n id: 'admanagement.adfilter.filterId',\r\n defaultMessage: 'Ad filter ID',\r\n },\r\n filterType: {\r\n id: 'admanagement.adfilter.filterType',\r\n defaultMessage: 'Filter Type',\r\n },\r\n accountFilter: {\r\n id: 'admanagement.adfilter.accountFilter',\r\n defaultMessage: 'Account level filter',\r\n },\r\n publisherFilter: {\r\n id: 'admanagement.adfilter.publisherFilter',\r\n defaultMessage: 'Publisher level filter',\r\n },\r\n inputExcludedURLs: {\r\n id: 'admanagement.adfilter.inputExcludedURLs',\r\n defaultMessage: 'Excluded URLs',\r\n },\r\n excludedUrlPlaceholder: {\r\n id: 'admanagement.adfilter.excludedUrlPH',\r\n defaultMessage: 'http://www.contoso.com',\r\n },\r\n inputExcludedKeywordAd: {\r\n id: 'admanagement.adfilter.inputExcludedKeywordAd',\r\n defaultMessage: 'Excluded keywords - ad level',\r\n },\r\n excludedKeywordPlaceholder: {\r\n id: 'admanagement.adfilter.excludedKeywordPH',\r\n defaultMessage: 'Example Keyword 1\\nExample Keyword 2\\nExample Keyword 3',\r\n },\r\n inputExcludedKeywordQuery: {\r\n id: 'admanagement.adfilter.inputExcludedKeywordQuery',\r\n defaultMessage: 'Excluded keywords - query level',\r\n },\r\n inputAttachChannel: {\r\n id: 'admanagement.adfilter.inputAttachChannel',\r\n defaultMessage: 'Attach to channels',\r\n },\r\n channelPickerAriaDesc: {\r\n id: 'admanagement.adfilter.channelPickerAriaDesc',\r\n defaultMessage: 'Select channels to be attached with the ad filter',\r\n },\r\n navMessage: {\r\n id: 'admanagement.adfilter.navMessage',\r\n defaultMessage: 'Go back to Ad filter management',\r\n },\r\n excludedItems: {\r\n id: 'admanagement.adfilter.excludedItems',\r\n defaultMessage: 'Excluded items',\r\n },\r\n excludedDescription: {\r\n id: 'admanagement.adfilter.excludedDescription',\r\n defaultMessage:\r\n // tslint:disable-next-line:max-line-length\r\n 'You can enter the items you want to block manually or upload a txt. file. New items are appended to the current list and duplicates are removed.',\r\n },\r\n manualEntry: {\r\n id: 'admanagement.adfilter.manualEntry',\r\n defaultMessage: 'Manual entry',\r\n },\r\n fileUpload: {\r\n id: 'admanagement.adfilter.fileUpload',\r\n defaultMessage: 'File upload',\r\n },\r\n excludedUrlDescription: {\r\n id: 'admanagement.adfilter.excludedUrlDescription',\r\n defaultMessage: 'List URLs to exclude(one per line). May contain up to 250 URLs.',\r\n },\r\n excludeAdLevelKeywordsDescription: {\r\n id: 'admanagement.adfilter.excludeAdLevelKeywordsDescription',\r\n defaultMessage: 'List ad level keywords to exclude(one per line). May contain up to 50 keywords.',\r\n },\r\n excludedQueryLevelKeywordDescription: {\r\n id: 'admanagement.adfilter.excludedQueryLevelKeywordDescription',\r\n defaultMessage: 'List query level keywords to exclude(one per line). May contain up to 250 keywords.',\r\n },\r\n excludedUrlBulkUploadDescription: {\r\n id: 'admanagement.adfilter.excludedUrlBulkUploadDescription',\r\n defaultMessage: 'File may contain up to 5,000 urls.',\r\n },\r\n exlcudedKeywordsBulkUploadDescription: {\r\n id: 'admanagement.adfilter.exlcudedKeywordsBulkUploadDescription',\r\n defaultMessage: 'File may contain up to 5,000 keywords.',\r\n },\r\n exportButtonDesc: {\r\n id: 'admanagement.adfilter.exportButtonDesc',\r\n defaultMessage: 'Export a file containing existing {label}',\r\n },\r\n timeRangeSectionTitle: {\r\n id: 'admanagement.adfilter.timeRangeSectionTitle',\r\n defaultMessage: 'Filter Time Range',\r\n },\r\n timeRangeSectionDescription: {\r\n id: 'admanagement.adfilter.timeRangeSectionDescription',\r\n defaultMessage:\r\n '(Optional) Select time range to apply the filter in a specific time range. Start time is set to current datetime by default.',\r\n },\r\n filterStartTimeLabel: {\r\n id: 'admanagement.adfilter.filterStartTimeLabel',\r\n defaultMessage: 'Filter Start Time (UTC)',\r\n },\r\n filterEndTimeLabel: {\r\n id: 'admanagement.adfilter.filterEndTimeLabel',\r\n defaultMessage: 'Filter End Time (UTC)',\r\n },\r\n filterEndTimePlaceholder: {\r\n id: 'admanagement.adfilter.filterEndTimePlaceholder',\r\n defaultMessage: 'Select your end date',\r\n },\r\n resetTimeRange: {\r\n id: 'admanagement.adfilter.resetTimeRange',\r\n defaultMessage: 'Reset time range',\r\n },\r\n undoTimeRange: {\r\n id: 'admanagement.adfilter.undoTimeRange',\r\n defaultMessage: 'Undo time range',\r\n },\r\n filterUpdateType: {\r\n id: 'admanagement.adfilter.filterUpdateType',\r\n defaultMessage: 'Filter update type',\r\n },\r\n appendOnly: {\r\n id: 'admanagement.adfilter.appendOnly',\r\n defaultMessage: 'Append only',\r\n },\r\n nonAppendOnly: {\r\n id: 'admanagement.adfilter.nonAppendOnly',\r\n defaultMessage: 'Non-append only',\r\n },\r\n startDateErrorMessage: {\r\n id: 'admanagement.adfilter.startDateErrorMessage',\r\n defaultMessage: 'Start date must be before end date',\r\n },\r\n endDateErrorMessage: {\r\n id: 'admanagement.adfilter.endDateErrorMessage',\r\n defaultMessage: 'End date must be after start date and current date time',\r\n },\r\n});\r\n","import { IPubcenterSpacing } from '../../../../../theme';\r\nimport { ICreateAdFilterStyleProps, ICreateAdFilterStyles } from './CreateAdFilter.types';\r\n\r\nexport const getStyles = (props: ICreateAdFilterStyleProps): ICreateAdFilterStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n return {\r\n description: {\r\n fontSize: 12\r\n },\r\n excludedItemsTextField: {\r\n width: 440\r\n },\r\n exportButton: {\r\n display: 'flex',\r\n flexDirection: 'row'\r\n },\r\n panelHeader: {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n padding: '5px 5px 0px 0px',\r\n },\r\n subComponentStyles: {\r\n inPagePanel: {},\r\n excludedItemsLabel: {\r\n root: {\r\n fontSize: 16,\r\n borderTopStyle: 'solid',\r\n borderColor: theme.palette.neutralLight,\r\n borderTopWidth: 1,\r\n paddingTop: spacing.size16\r\n }\r\n },\r\n excludedDescription: {\r\n root: [\r\n 'ms-fontWeight-regular',\r\n {\r\n fontSize: 14\r\n }\r\n ]\r\n },\r\n choiceGroup: {\r\n root: {\r\n marginBottom: spacing.size16\r\n },\r\n flexContainer: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'flex-start',\r\n selectors: {\r\n '.ms-ChoiceField': {\r\n marginRight: theme.spacing.m\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n};\r\n","import {\r\n IChoiceGroupStyleProps,\r\n IChoiceGroupStyles,\r\n ILabelStyleProps,\r\n ILabelStyles,\r\n IPanelStyleProps,\r\n IPanelStyles,\r\n IStyle,\r\n IStyleFunction,\r\n IStyleFunctionOrObject,\r\n ITheme,\r\n} from '@fluentui/react';\r\nimport { IFormEditParams, IFormStateProps } from '../../../../components/Form';\r\nimport { IRouterWithIntl } from '../../../../utils/ReactUtils';\r\n\r\nexport interface IFormInitializationState {\r\n initializeForm: boolean;\r\n id?: string;\r\n textFileLoading?: boolean;\r\n}\r\n\r\nexport interface ICreateAdFilterProps extends IRouterWithIntl<IFormEditParams>, IFormStateProps {\r\n styles?: IStyleFunction<ICreateAdFilterStyleProps, ICreateAdFilterStyles>;\r\n theme?: ITheme;\r\n}\r\n\r\nexport interface ICreateAdFilterStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\nexport interface ICreateAdFilterStyles {\r\n description?: IStyle;\r\n excludedItemsTextField?: IStyle;\r\n exportButton?: IStyle;\r\n panelHeader?: IStyle;\r\n subComponentStyles: {\r\n inPagePanel?: IStyleFunctionOrObject<IPanelStyleProps, IPanelStyles>;\r\n excludedItemsLabel?: IStyleFunctionOrObject<ILabelStyleProps, ILabelStyles>;\r\n excludedDescription?: IStyleFunctionOrObject<ILabelStyleProps, ILabelStyles>;\r\n choiceGroup?: IStyleFunctionOrObject<IChoiceGroupStyleProps, IChoiceGroupStyles>;\r\n };\r\n}\r\n\r\nexport enum FilterExcludedType {\r\n Url,\r\n AdKeyword,\r\n QueryKeyword,\r\n}\r\n","import {\r\n ActionButton,\r\n ChoiceGroup,\r\n classNamesFunction,\r\n Dropdown,\r\n getTheme,\r\n IconButton,\r\n IProcessedStyleSet,\r\n ITextFieldProps,\r\n Label,\r\n Link,\r\n Panel,\r\n PanelType,\r\n Spinner,\r\n TextField,\r\n} from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { FilterScope, getAppStore, onHelpInfoCalloutOpened, onHelpInfoChanged, onNavigateBack } from '../../../../@data';\r\nimport { completeAccess, hasUpdateAccess, UserRoleEntity, userRoleKey } from '../../../../@data/services/UserRoleService';\r\nimport { Filter as FilterAccessPermissions } from '../../../../@data/store/schema/userrolemodels/Filter';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { BulkUpload } from '../../../../components/bulkUpload/bulkUpload';\r\nimport { DateTimePicker } from '../../../../components/DateTimePicker/DateTimePicker';\r\nimport { FormItem, FormSection, FormState } from '../../../../components/Form';\r\nimport { FormLabel } from '../../../../components/Form/FormLabel';\r\nimport { MultiSelectPicker } from '../../../../components/MultiSelectPicker';\r\nimport { DetailPage } from '../../../../layout/DetailPage/DetailPage';\r\nimport { injectIntlWithObserver } from '../../../../utils/ReactUtils';\r\nimport { getAdManagementStore, RouteName } from '../../@data';\r\nimport { onPanelOpenChanged } from '../../@data/actions';\r\nimport { createReturnUrl } from '../../@data/services/AdManagementService';\r\nimport { CreateChannel } from '../../Channel/Create/CreateChannel';\r\nimport { getFilterStore } from '../@data';\r\nimport {\r\n onfilterItemsEntryTypeChanged,\r\n onFilterUpdateTypeChanged,\r\n onFormAppendExcludedAdKeywordsChanged,\r\n onFormAppendExcludedQueryKeywordsChanged,\r\n onFormAppendExcludedUrlsChanged,\r\n onFormCancelled,\r\n onFormChannelsChanged,\r\n onFormDownloadClicked,\r\n onFormExludedAdKeywordChanged,\r\n onFormExludedQueryKeywordChanged,\r\n onFormExludedUrlChanged,\r\n onFormFilterEndTimeChanged,\r\n onFormFilterNameChanged,\r\n onFormFilterStartTimeChanged,\r\n onFormFilterTypeChanged,\r\n onFormInitialized,\r\n onFormResetTimeRange,\r\n onFormSubmitted,\r\n onFormUndoTimeRange,\r\n} from '../@data/actions';\r\nimport messages from './CreateAdFilter.messages';\r\nimport { getStyles } from './CreateAdFilter.styles';\r\nimport {\r\n FilterExcludedType,\r\n ICreateAdFilterProps,\r\n ICreateAdFilterStyleProps,\r\n ICreateAdFilterStyles,\r\n IFormInitializationState,\r\n} from './CreateAdFilter.types';\r\n\r\nconst getClassNames = classNamesFunction<ICreateAdFilterStyleProps, ICreateAdFilterStyles>();\r\n\r\nexport const CreateAdFilter = injectIntlWithObserver(\r\n class CreateAdFilterPage extends React.Component<ICreateAdFilterProps, IFormInitializationState> {\r\n private _classNames: IProcessedStyleSet<ICreateAdFilterStyles>;\r\n\r\n constructor(props: ICreateAdFilterProps) {\r\n super(props);\r\n this.state = {\r\n initializeForm: true,\r\n textFileLoading: false,\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n const publisherId = this.props.match.params.publisherId;\r\n const accountId = this.props.match.params.accountId;\r\n const entityId = this.props.match.params.id;\r\n this.setState({ id: entityId });\r\n if (publisherId && accountId) {\r\n onFormInitialized(this.props.mode, publisherId, accountId, entityId);\r\n }\r\n }\r\n\r\n public componentDidUpdate() {\r\n const publisherId = this.props.match.params.publisherId;\r\n const accountId = this.props.match.params.accountId;\r\n const entityId = this.props.match.params.id;\r\n if (this.state.initializeForm && this.state.id !== entityId) {\r\n this.setState({ id: entityId });\r\n if (publisherId && accountId) {\r\n onFormInitialized(this.props.mode, publisherId, accountId, entityId);\r\n }\r\n }\r\n }\r\n\r\n public render() {\r\n const theme = getTheme();\r\n this._classNames = getClassNames(getStyles, { theme });\r\n const { formatMessage } = this.props.intl;\r\n const publisherId = this.props.match.params.publisherId;\r\n const accountId = this.props.match.params.accountId;\r\n const { saving, loading } = getAppStore();\r\n\r\n return (\r\n <DetailPage\r\n titleLabel={formatMessage(this.props.mode === FormState.Edit ? messages.editFilter : messages.createFilter)}\r\n helpId={'pop_PCv4_FilterCreate'}\r\n submitLabel={formatMessage(this.props.mode === FormState.Edit ? messages.editFilter : messages.createFilter)}\r\n onSubmit={() => this._onSubmit(publisherId, accountId)}\r\n onCancel={() => this._onCancel(publisherId, accountId)}\r\n onNavClick={() => this._onCancel(publisherId, accountId)}\r\n saving={saving}\r\n loading={loading}\r\n pageMode={this.props.mode}\r\n >\r\n {this._formContent()}\r\n </DetailPage>\r\n );\r\n }\r\n\r\n private _formContent = (): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const store = getFilterStore();\r\n const filterAccessPermissions = this._getFilterAccessPermission();\r\n\r\n return (\r\n <div>\r\n <FormItem formWidth={440}>\r\n <TextField\r\n label={formatMessage(messages.inputName)}\r\n required={true}\r\n placeholder={formatMessage(messages.inputNameLength)}\r\n errorMessage={store.errors.name}\r\n value={store.active.name}\r\n onChange={(_, value) => onFormFilterNameChanged(value)}\r\n disabled={this._isDisabled(this.props.mode, filterAccessPermissions === null ? completeAccess : filterAccessPermissions.name)}\r\n />\r\n </FormItem>\r\n {store.active.id && (\r\n <FormItem formWidth={440}>\r\n <TextField label={formatMessage(messages.filterId)} required={true} disabled={true} value={String(store.active.id)} />\r\n </FormItem>\r\n )}\r\n <FormItem>\r\n <Dropdown\r\n label={formatMessage(messages.filterType)}\r\n required={true}\r\n options={[\r\n { key: FilterScope.Account, text: formatMessage(messages.accountFilter) },\r\n { key: FilterScope.Publisher, text: formatMessage(messages.publisherFilter) },\r\n ]}\r\n defaultSelectedKey={store.active.filterType}\r\n onChange={(_, value) => onFormFilterTypeChanged(value!!)}\r\n errorMessage={store.errors.filterType}\r\n disabled={this.props.mode === FormState.Edit}\r\n />\r\n </FormItem>\r\n <FormItem formWidth={440}>\r\n <ChoiceGroup\r\n label={formatMessage(messages.filterUpdateType)}\r\n options={[\r\n { key: 'nonAppendOnly', text: formatMessage(messages.nonAppendOnly) },\r\n { key: 'appendOnly', text: formatMessage(messages.appendOnly) },\r\n ]}\r\n styles={this._classNames.subComponentStyles.choiceGroup}\r\n onChange={(_, value) => onFilterUpdateTypeChanged(value!!)}\r\n selectedKey={store.active.appendOnly ? 'appendOnly' : 'nonAppendOnly'}\r\n disabled={\r\n this.props.mode === FormState.Edit ||\r\n this._isDisabled(this.props.mode, filterAccessPermissions === null ? completeAccess : filterAccessPermissions.appendOnly)\r\n }\r\n />\r\n </FormItem>\r\n {store.active.filterType !== FilterScope.Publisher && (\r\n <FormItem formWidth={600}>\r\n <MultiSelectPicker\r\n intl={this.props.intl}\r\n required={true}\r\n errorMessage={store.errors.channelsSelected}\r\n label={formatMessage(messages.inputAttachChannel)}\r\n ariaDescription={formatMessage(messages.channelPickerAriaDesc)}\r\n enableCreateButton={this.props.mode !== FormState.InPageCreate}\r\n createButtonLabel={formatMessage(AppMessages.createChannel)}\r\n onCreateButtonClick={() => onPanelOpenChanged(true)}\r\n items={store.active.channels || []}\r\n initialSelectedItems={store.active.channelsSelected}\r\n onSelectedItems={(items) => onFormChannelsChanged(items)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n filterAccessPermissions === null ? completeAccess : filterAccessPermissions.channelList\r\n )}\r\n />\r\n </FormItem>\r\n )}\r\n <FormSection\r\n title={formatMessage(messages.excludedItems)}\r\n formWidth={1000}\r\n expanded={true}\r\n ariaDescription={formatMessage(messages.excludedDescription)}\r\n >\r\n <Label id=\"excludedDescription\" styles={this._classNames.subComponentStyles.excludedDescription}>\r\n {formatMessage(messages.excludedDescription)}\r\n </Label>\r\n <ChoiceGroup\r\n options={[\r\n { key: 'manualEntry', text: formatMessage(messages.manualEntry) },\r\n { key: 'fileUpload', text: formatMessage(messages.fileUpload) },\r\n ]}\r\n styles={this._classNames.subComponentStyles.choiceGroup}\r\n onChange={(_, value) => onfilterItemsEntryTypeChanged(value!!)}\r\n selectedKey={store.active.filterItemsEntryType || 'manualEntry'}\r\n />\r\n {(!store.active.filterItemsEntryType || store.active.filterItemsEntryType === 'manualEntry') &&\r\n this._excludedItemsTextField(filterAccessPermissions)}\r\n {store.active.filterItemsEntryType === 'fileUpload' && this._excludedItemsUploadField(filterAccessPermissions)}\r\n </FormSection>\r\n <FormSection\r\n title={formatMessage(messages.timeRangeSectionTitle)}\r\n formWidth={1000}\r\n expanded={true}\r\n ariaDescription={formatMessage(messages.timeRangeSectionDescription)}\r\n >\r\n <Label id=\"excludedDescription\" styles={this._classNames.subComponentStyles.excludedDescription}>\r\n {formatMessage(messages.timeRangeSectionDescription)}\r\n </Label>\r\n <DateTimePicker\r\n intl={this.props.intl}\r\n label={formatMessage(messages.filterStartTimeLabel)}\r\n maxDateTime={store.active.filterEndTime}\r\n onDateTimeChanged={onFormFilterStartTimeChanged}\r\n value={store.active.filterStartTime ? store.active.filterStartTime : undefined}\r\n isOutOfBoundsErrorMessage={formatMessage(messages.startDateErrorMessage)}\r\n />\r\n <DateTimePicker\r\n intl={this.props.intl}\r\n label={formatMessage(messages.filterEndTimeLabel)}\r\n datePlaceholder={formatMessage(messages.filterEndTimePlaceholder)}\r\n minDateTime={store.active.filterStartTime}\r\n onDateTimeChanged={onFormFilterEndTimeChanged}\r\n value={store.active.filterEndTime ? store.active.filterEndTime : undefined}\r\n isOutOfBoundsErrorMessage={formatMessage(messages.endDateErrorMessage)}\r\n />\r\n {this.props.mode === FormState.Edit ? (\r\n <Link onClick={(ev) => onFormUndoTimeRange()}>{formatMessage(messages.undoTimeRange)}</Link>\r\n ) : (\r\n <Link onClick={(ev) => onFormResetTimeRange()}>{formatMessage(messages.resetTimeRange)}</Link>\r\n )}\r\n </FormSection>\r\n <Panel\r\n isOpen={getAdManagementStore().panelIsOpen}\r\n type={PanelType.custom}\r\n customWidth=\"700px\"\r\n onDismiss={() => onPanelOpenChanged(false)}\r\n styles={this._classNames.subComponentStyles.inPagePanel}\r\n onRenderNavigation={() => (\r\n <div className={this._classNames.panelHeader} role=\"navigation\">\r\n <IconButton\r\n iconProps={{ iconName: 'Cancel' }}\r\n aria-label={formatMessage(AppMessages.close)}\r\n onClick={() => onPanelOpenChanged(false)}\r\n />\r\n </div>\r\n )}\r\n >\r\n <CreateChannel {...this.props} mode={FormState.InPageCreate} />\r\n </Panel>\r\n </div>\r\n );\r\n };\r\n\r\n private _onSubmit = (publisherId?: string, accountId?: string): void => {\r\n this.setState({ initializeForm: false });\r\n onFormSubmitted(this.props.mode, this.props.history);\r\n };\r\n\r\n private _onCancel = (publisherId?: string, accountId?: string): void => {\r\n this.setState({ initializeForm: false });\r\n onFormCancelled();\r\n // return to manage page\r\n const returnUrl = createReturnUrl(RouteName.adfilter, publisherId, accountId);\r\n onNavigateBack(this.props.history, returnUrl);\r\n };\r\n\r\n private _onRenderTextFieldDescription = (props: ITextFieldProps): JSX.Element => {\r\n return <div className={this._classNames.description}>{props.description}</div>;\r\n };\r\n\r\n private _excludedItemsTextField = (filterAccessPermissions: FilterAccessPermissions | null): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const store = getFilterStore();\r\n const { helpInfo, locale } = getAppStore();\r\n return (\r\n <div className={this._classNames.excludedItemsTextField}>\r\n <FormItem formWidth={440}>\r\n <TextField\r\n errorMessage={store.errors.excludedUrls}\r\n multiline={true}\r\n placeholder={formatMessage(messages.excludedUrlPlaceholder)}\r\n description={formatMessage(messages.excludedUrlDescription)}\r\n aria-labelledby=\"filterExcludedUrlLabel\"\r\n onRenderLabel={() => {\r\n return (\r\n <FormLabel\r\n id=\"filterExcludedUrlLabel\"\r\n labelContent={formatMessage(messages.inputExcludedURLs)}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_FilterExcludeURL', locale)}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n intl={this.props.intl}\r\n />\r\n );\r\n }}\r\n value={store.active.excludedUrls}\r\n onChange={(_, value) => onFormExludedUrlChanged(value)}\r\n onRenderDescription={this._onRenderTextFieldDescription}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n filterAccessPermissions === null ? completeAccess : filterAccessPermissions.excludedURLs\r\n )}\r\n />\r\n </FormItem>\r\n <FormItem formWidth={440}>\r\n <TextField\r\n errorMessage={store.errors.excludedAdKeywords}\r\n multiline={true}\r\n placeholder={formatMessage(messages.excludedKeywordPlaceholder)}\r\n description={formatMessage(messages.excludeAdLevelKeywordsDescription)}\r\n aria-labelledby=\"filterExcludedAdKeywordLabel\"\r\n onRenderLabel={() => {\r\n return (\r\n <FormLabel\r\n id=\"filterExcludedAdKeywordLabel\"\r\n labelContent={formatMessage(messages.inputExcludedKeywordAd)}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_FilterExcludeKwyAd', locale)}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n intl={this.props.intl}\r\n />\r\n );\r\n }}\r\n value={store.active.excludedAdKeywords}\r\n onChange={(_, value) => onFormExludedAdKeywordChanged(value)}\r\n onRenderDescription={this._onRenderTextFieldDescription}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n filterAccessPermissions === null ? completeAccess : filterAccessPermissions.excludedAdKeywords\r\n )}\r\n />\r\n </FormItem>\r\n <FormItem formWidth={440}>\r\n <TextField\r\n errorMessage={store.errors.excludedQueryKeywords}\r\n multiline={true}\r\n placeholder={formatMessage(messages.excludedKeywordPlaceholder)}\r\n description={formatMessage(messages.excludedQueryLevelKeywordDescription)}\r\n aria-labelledby=\"filterExcludedQueryKeywordLabel\"\r\n onRenderLabel={() => {\r\n return (\r\n <FormLabel\r\n id=\"filterExcludedQueryKeywordLabel\"\r\n labelContent={formatMessage(messages.inputExcludedKeywordQuery)}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_FilterExcludeKwyQuery', locale)}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n intl={this.props.intl}\r\n />\r\n );\r\n }}\r\n value={store.active.excludedQueryKeywords}\r\n onChange={(_, value) => onFormExludedQueryKeywordChanged(value)}\r\n onRenderDescription={this._onRenderTextFieldDescription}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n filterAccessPermissions === null ? completeAccess : filterAccessPermissions.excludedQueryKeywords\r\n )}\r\n />\r\n </FormItem>\r\n </div>\r\n );\r\n };\r\n\r\n private _excludedItemsUploadField = (filterAccessPermissions: FilterAccessPermissions | null): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const { helpInfo, locale } = getAppStore();\r\n const store = getFilterStore();\r\n\r\n return (\r\n <>\r\n <FormItem formWidth={440}>\r\n <FormLabel\r\n id=\"filterExcludedUrlBulkLabel\"\r\n labelContent={formatMessage(messages.inputExcludedURLs)}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_FilterExcludeURL', locale)}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n intl={this.props.intl}\r\n />\r\n <BulkUpload\r\n uploadDescription={formatMessage(messages.excludedUrlBulkUploadDescription)}\r\n isLoading={this.state.textFileLoading}\r\n onUpload={(e) => this._uploadFile(e, FilterExcludedType.Url)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n filterAccessPermissions === null ? completeAccess : filterAccessPermissions.excludedURLs\r\n )}\r\n ariaLabelledBy={'filterExcludedUrlBulkLabel'}\r\n />\r\n <>\r\n <ActionButton\r\n className={this._classNames.exportButton}\r\n iconProps={{ iconName: 'export' }}\r\n onClick={() => onFormDownloadClicked('ExcludedURL')}\r\n disabled={\r\n this.props.mode !== FormState.Edit ||\r\n this._isDisabled(\r\n this.props.mode,\r\n filterAccessPermissions === null ? completeAccess : filterAccessPermissions.excludedURLs\r\n ) ||\r\n store.active.downloadExcludedUrlLoading\r\n }\r\n ariaDescription={formatMessage(messages.exportButtonDesc, { label: formatMessage(messages.inputExcludedURLs) })}\r\n >\r\n {formatMessage(AppMessages.export)}\r\n </ActionButton>\r\n {store.active.downloadExcludedUrlLoading && <Spinner />}\r\n </>\r\n </FormItem>\r\n <FormItem formWidth={440}>\r\n <FormLabel\r\n id=\"filterExcludedAdKeywordBulkLabel\"\r\n labelContent={formatMessage(messages.inputExcludedKeywordAd)}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_FilterExcludeKwyAd', locale)}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n intl={this.props.intl}\r\n />\r\n <BulkUpload\r\n uploadDescription={formatMessage(messages.exlcudedKeywordsBulkUploadDescription)}\r\n isLoading={this.state.textFileLoading}\r\n onUpload={(e) => this._uploadFile(e, FilterExcludedType.AdKeyword)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n filterAccessPermissions === null ? completeAccess : filterAccessPermissions.excludedAdKeywords\r\n )}\r\n ariaLabelledBy={'filterExcludedAdKeywordBulkLabel'}\r\n />\r\n <>\r\n <ActionButton\r\n className={this._classNames.exportButton}\r\n iconProps={{ iconName: 'export' }}\r\n onClick={() => onFormDownloadClicked('ExcludedAdKeyword')}\r\n disabled={\r\n this.props.mode !== FormState.Edit ||\r\n this._isDisabled(\r\n this.props.mode,\r\n filterAccessPermissions === null ? completeAccess : filterAccessPermissions.excludedAdKeywords\r\n ) ||\r\n store.active.downloadExcludedAdkeywordLoading\r\n }\r\n ariaDescription={formatMessage(messages.exportButtonDesc, { label: formatMessage(messages.inputExcludedKeywordAd) })}\r\n >\r\n {formatMessage(AppMessages.export)}\r\n </ActionButton>\r\n {store.active.downloadExcludedAdkeywordLoading && <Spinner />}\r\n </>\r\n </FormItem>\r\n <FormItem formWidth={440}>\r\n <FormLabel\r\n id=\"filterExcludedQueryKeywordBulkLabel\"\r\n labelContent={formatMessage(messages.inputExcludedKeywordQuery)}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_FilterExcludeKwyQuery', locale)}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n intl={this.props.intl}\r\n />\r\n <BulkUpload\r\n uploadDescription={formatMessage(messages.exlcudedKeywordsBulkUploadDescription)}\r\n isLoading={this.state.textFileLoading}\r\n onUpload={(e) => this._uploadFile(e, FilterExcludedType.QueryKeyword)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n filterAccessPermissions === null ? completeAccess : filterAccessPermissions.excludedQueryKeywords\r\n )}\r\n ariaLabelledBy={'filterExcludedQueryKeywordBulkLabel'}\r\n />\r\n <>\r\n <ActionButton\r\n className={this._classNames.exportButton}\r\n iconProps={{ iconName: 'export' }}\r\n onClick={() => onFormDownloadClicked('ExcludedQueryKeyword')}\r\n disabled={\r\n this.props.mode !== FormState.Edit ||\r\n this._isDisabled(\r\n this.props.mode,\r\n filterAccessPermissions === null ? completeAccess : filterAccessPermissions.excludedQueryKeywords\r\n ) ||\r\n store.active.downloadExcludedQueryKeywordLoading\r\n }\r\n ariaDescription={formatMessage(messages.exportButtonDesc, { label: formatMessage(messages.inputExcludedKeywordQuery) })}\r\n >\r\n {formatMessage(AppMessages.export)}\r\n </ActionButton>\r\n {store.active.downloadExcludedQueryKeywordLoading && <Spinner />}\r\n </>\r\n </FormItem>\r\n </>\r\n );\r\n };\r\n\r\n private _uploadFile(event, excludedType: FilterExcludedType) {\r\n const file = event.target.files[0];\r\n\r\n const reader = new FileReader();\r\n reader.onloadstart = () => {\r\n this.setState({ textFileLoading: true });\r\n };\r\n // tslint:disable-next-line\r\n reader.onload = (event: any) => {\r\n const content = event.target.result;\r\n switch (excludedType) {\r\n case FilterExcludedType.Url:\r\n onFormAppendExcludedUrlsChanged(content);\r\n break;\r\n case FilterExcludedType.AdKeyword:\r\n onFormAppendExcludedAdKeywordsChanged(content);\r\n break;\r\n case FilterExcludedType.QueryKeyword:\r\n onFormAppendExcludedQueryKeywordsChanged(content);\r\n break;\r\n }\r\n };\r\n reader.onloadend = () => {\r\n this.setState({ textFileLoading: false });\r\n };\r\n if (file) {\r\n reader.readAsText(file);\r\n }\r\n }\r\n\r\n private _getFilterAccessPermission(): FilterAccessPermissions | null {\r\n const userRoles = localStorage.getItem(userRoleKey);\r\n if (userRoles === null) {\r\n return null;\r\n }\r\n const userRolesJSON = JSON.parse(userRoles);\r\n\r\n for (const value in userRolesJSON) {\r\n if (value === UserRoleEntity.Filter) {\r\n return JSON.parse(userRolesJSON[value]);\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _isDisabled(mode: FormState, permission: number): boolean {\r\n if (mode === FormState.Create || mode === FormState.InPageCreate) {\r\n return false;\r\n }\r\n\r\n return !hasUpdateAccess(permission);\r\n }\r\n }\r\n);\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n create: {\r\n id: 'adfilter.create',\r\n defaultMessage: 'Create Ad Filter',\r\n },\r\n notFound: {\r\n id: 'adfilter.notFound',\r\n defaultMessage: 'No Ad Filters found for this account, create one.',\r\n },\r\n deactivateTitle: {\r\n id: 'adfilter.deactivateTitle',\r\n defaultMessage: 'Do you want to deactivate ad filter(s)?',\r\n },\r\n name: {\r\n id: 'adfilter.name',\r\n defaultMessage: 'Ad filter name',\r\n },\r\n id: {\r\n id: 'adfilter.id',\r\n defaultMessage: 'Ad filter ID',\r\n },\r\n scope: {\r\n id: 'adfilter.scope',\r\n defaultMessage: 'Scope',\r\n },\r\n excludedURL: {\r\n id: 'adfilter.excludedURL',\r\n defaultMessage: 'Excluded URLs',\r\n },\r\n excludedKeywords: {\r\n id: 'adfilter.excludedKeywords',\r\n defaultMessage: 'Excluded keywords',\r\n },\r\n channelsNumber: {\r\n id: 'adfilter.ChannelsNumber',\r\n defaultMessage: '# of channels',\r\n },\r\n channelNames: {\r\n id: 'adfilter.channelNames',\r\n defaultMessage: 'Channel names',\r\n },\r\n adfilters: {\r\n id: 'adfilters',\r\n defaultMessage: 'Ad filters',\r\n },\r\n dateRangeFilterName: {\r\n id: 'adfilter.dateRangeFilterName',\r\n defaultMessage: 'Date range',\r\n },\r\n startTime: {\r\n id: 'adfilter.startTime',\r\n defaultMessage: 'Start time',\r\n },\r\n endTime: {\r\n id: 'adfilter.endTime',\r\n defaultMessage: 'End time',\r\n },\r\n actions: {\r\n id: 'adfilter.actions',\r\n defaultMessage: 'Actions',\r\n },\r\n zeroResultTitle: {\r\n id: 'channel.zeroResultTitle',\r\n defaultMessage: 'No filters yet',\r\n },\r\n zeroResultDescription: {\r\n id: 'channel.zeroResultDescription',\r\n defaultMessage: 'You haven’t created any filters yet',\r\n },\r\n noPublisherSelected: {\r\n id: 'property.noPublisherSelected',\r\n defaultMessage: 'A publisher isn’t selected yet. To start managing filters, search for a publisher..',\r\n },\r\n});\r\n","import { IDropdownOption } from '@fluentui/react';\r\nimport { Filter } from '../../../../../@data';\r\nimport AppMessages from '../../../../../App.messages';\r\nimport { FilterType, IFilterDetails } from '../../../../../components/GridFilter/GridFilter.types';\r\nimport { IFilterItem } from '../../../../../layout/GridPageV2';\r\nimport messages from '../ManagePage.messages';\r\n\r\nexport function getFilterItems(formatMessage): IFilterItem[] {\r\n const filters: IFilterItem[] = [\r\n { columnName: 'name', filterName: formatMessage(messages.name), filterType: FilterType.string },\r\n { columnName: 'id', filterName: formatMessage(messages.id), filterType: FilterType.relational },\r\n {\r\n columnName: 'filterScope',\r\n filterName: formatMessage(messages.scope),\r\n filterType: FilterType.custom,\r\n filterOptions: [\r\n { key: 'Publisher', text: 'Publisher level filter' },\r\n { key: 'Account', text: 'Account level filter' },\r\n ] as IDropdownOption[],\r\n },\r\n {\r\n columnName: 'status',\r\n filterName: formatMessage(AppMessages.status),\r\n filterType: FilterType.custom,\r\n filterOptions: [\r\n { key: 'Active', text: formatMessage(AppMessages.statusActive) },\r\n { key: 'Inactive', text: formatMessage(AppMessages.statusInactive) },\r\n ] as IDropdownOption[],\r\n },\r\n {\r\n filterName: formatMessage(messages.dateRangeFilterName),\r\n filterType: FilterType.date,\r\n showNullsCheckboxLabel: 'Indefinite date',\r\n customFunction: (dataRow: Filter, filterDetails: IFilterDetails) => {\r\n const startTime = dataRow.startTimeStamp ? dataRow.startTimeStamp.toString() : undefined;\r\n const endTime = dataRow.endTimeStamp ? dataRow.endTimeStamp.toString() : undefined;\r\n\r\n const startDateFilter = filterDetails.startDate ? new Date(filterDetails.startDate.getTime()).toISOString() : undefined;\r\n const endDateFilter = filterDetails.endDate ? new Date(filterDetails.endDate.getTime()).toISOString() : undefined;\r\n\r\n if (!filterDetails.includeNulls) {\r\n if (!startTime && !endTime) {\r\n return false;\r\n }\r\n\r\n if (startDateFilter && endTime && endTime < startDateFilter) {\r\n return false;\r\n }\r\n if (endDateFilter && startTime && endDateFilter < startTime) {\r\n return false;\r\n }\r\n return true;\r\n } else {\r\n // if includeNulls is true, then return filters which are applied indefinetly.\r\n if (endTime) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n },\r\n },\r\n ];\r\n\r\n return filters;\r\n}\r\n","import { Model, getAppStore } from '../../../../../@data';\r\nimport { CommandBarActions, IBuildCommandBarProps } from '../../../../../layout/GridPageV2';\r\nimport { getFilterStore } from '../../@data';\r\nimport messages from '../ManagePage.messages';\r\nimport { getFilterItems } from './getFilterItems';\r\n\r\nexport function getCommandBarItems(formatMessage): IBuildCommandBarProps<Model> | undefined {\r\n const { publisher, account } = getAppStore();\r\n const { gridFilters, isLoading } = getFilterStore();\r\n\r\n const commandBarItems: IBuildCommandBarProps<Model> | undefined =\r\n (gridFilters && gridFilters.length !== 0 && publisher && account) || isLoading === true\r\n ? {\r\n primaryButtonLabel: messages.create,\r\n includeActions: [CommandBarActions.new],\r\n includeFarActions: [\r\n CommandBarActions.searchBox,\r\n CommandBarActions.addFilter,\r\n CommandBarActions.edit,\r\n CommandBarActions.activate,\r\n CommandBarActions.deactivate,\r\n CommandBarActions.delete,\r\n CommandBarActions.download,\r\n CommandBarActions.duplicate,\r\n CommandBarActions.modifyColumns,\r\n ],\r\n filterItems: getFilterItems(formatMessage),\r\n }\r\n : undefined;\r\n\r\n return commandBarItems;\r\n}\r\n","import * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { Filter, getAppStore } from '../../../../@data';\r\nimport { DefaultRoute } from '../../../../Routes';\r\nimport { ZeroResults } from '../../../../components/ZeroResults/ZeroResults';\r\nimport { useWindowSize } from '../../../../hooks';\r\nimport { getStore as getWindowSizeStore } from '../../../../hooks/useWindowSize/store/store';\r\nimport { GridPageLayout } from '../../../../layout/GridPageLayout/GridPageLayout';\r\nimport { GridV2, IGridV2Column } from '../../../../layout/GridPageV2';\r\nimport { IRouterWithIntl, injectIntlWithObserver } from '../../../../utils/ReactUtils';\r\nimport { RouteName } from '../../@data';\r\nimport { getFilterStore } from '../@data';\r\nimport { onFiltersFetched } from '../@data/actions';\r\nimport { onManagePageInitialized } from '../@data/actions/onManagePageInitialized';\r\nimport messages from './ManagePage.messages';\r\nimport { getCommandBarItems } from './utils/getCommandBarItems';\r\nimport { getGridColumns } from './utils/getGridColumns';\r\n\r\nexport const ManagePage = injectIntlWithObserver(function FilterManagePage(props: IRouterWithIntl) {\r\n const { publisher, account } = getAppStore();\r\n const { gridFilters, isLoading, isFetchingData } = getFilterStore();\r\n const { formatMessage } = props.intl;\r\n const { windowStoreSerializer } = useWindowSize();\r\n const { isWindowRegularSize } = windowStoreSerializer(getWindowSizeStore());\r\n const gridDefaultColumns: IGridV2Column[] = getGridColumns(formatMessage, isWindowRegularSize, props.history);\r\n\r\n const NoResultComponent = (\r\n <ZeroResults\r\n showDefaultImage\r\n title={!!publisher ? formatMessage(messages.zeroResultTitle) : undefined}\r\n description={formatMessage(!!publisher ? messages.zeroResultDescription : messages.noPublisherSelected)}\r\n buttonText={formatMessage(messages.create)}\r\n onButtonClick={\r\n !!publisher ? () => props.history.push(`${DefaultRoute}/${publisher?.id}-${account?.id}/${RouteName.adfilter}/create`) : undefined\r\n }\r\n />\r\n );\r\n\r\n useEffect(() => {\r\n onManagePageInitialized();\r\n // eslint-disable-next-line\r\n }, [publisher, account]);\r\n\r\n return (\r\n <GridPageLayout>\r\n <GridV2\r\n history={props.history}\r\n location={props.location}\r\n match={props.match}\r\n entity={Filter}\r\n pageTitle={{ title: formatMessage(messages.adfilters), helpId: 'pop_PCv4_Filters' }}\r\n commandBarProps={getCommandBarItems(formatMessage)}\r\n dataGridProps={{\r\n gridV2Columns: gridDefaultColumns,\r\n data: publisher && account ? gridFilters || [] : [],\r\n setData: onFiltersFetched,\r\n shimmerLines: 10,\r\n renderZeroItemsComponent: NoResultComponent,\r\n }}\r\n isGridReady={!isLoading}\r\n isDataLoading={isFetchingData}\r\n paginationProps={{\r\n shouldGridHandlePagination: true,\r\n }}\r\n />\r\n </GridPageLayout>\r\n );\r\n});\r\n","import { CommandBarButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { Filter, PopupType, getAccessPermission, getAppStore } from '../../../../../@data';\r\nimport { hasDeleteAccess, hasUpdateAccess } from '../../../../../@data/services/UserRoleService';\r\nimport AppMessages from '../../../../../App.messages';\r\nimport { IGridV2Column } from '../../../../../layout/GridPageV2';\r\nimport { setDialogType } from '../../../../../layout/GridPageV2/@data/mutatorActions';\r\nimport messages from '../ManagePage.messages';\r\n\r\nexport function getGridColumns(formatMessage, isWindowRegularSize, routeHistory): IGridV2Column[] {\r\n const appStore = getAppStore();\r\n\r\n const columns: IGridV2Column[] = [\r\n {\r\n columnOrder: 1,\r\n key: 'name',\r\n fieldName: 'name',\r\n name: formatMessage(messages.name),\r\n minWidth: 100,\r\n maxWidth: 125,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n suppressSorting: false,\r\n },\r\n {\r\n columnOrder: 2,\r\n key: 'id',\r\n fieldName: 'id',\r\n name: formatMessage(messages.id),\r\n minWidth: 100,\r\n maxWidth: 100,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n },\r\n {\r\n columnOrder: 3,\r\n key: 'filterScope',\r\n fieldName: 'filterScope',\r\n name: formatMessage(messages.scope),\r\n minWidth: 100,\r\n maxWidth: 100,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 4,\r\n key: 'status',\r\n fieldName: 'status',\r\n name: formatMessage(AppMessages.status),\r\n minWidth: 100,\r\n maxWidth: 100,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 5,\r\n key: 'blockedUrlCount',\r\n fieldName: 'blockedUrlCount',\r\n name: formatMessage(messages.excludedURL),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 6,\r\n key: 'blockedAdKeywordCount',\r\n fieldName: 'blockedAdKeywordCount',\r\n name: formatMessage(messages.excludedKeywords),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 7,\r\n key: 'associatedChannelCount',\r\n fieldName: 'associatedChannelCount',\r\n name: formatMessage(messages.channelsNumber),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 8,\r\n key: 'channelNames',\r\n fieldName: 'channelNames',\r\n name: formatMessage(messages.channelNames),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: false,\r\n isExportable: true,\r\n onRender: (item: Filter) => item.associatedChannelIds?.join(', '),\r\n },\r\n {\r\n columnOrder: 9,\r\n key: 'startTime',\r\n fieldName: 'startTime',\r\n name: formatMessage(messages.startTime),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 10,\r\n key: 'endTime',\r\n fieldName: 'endTime',\r\n name: formatMessage(messages.endTime),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: false,\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 11,\r\n key: 'actions',\r\n name: formatMessage(messages.actions),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isPadded: true,\r\n isSearchable: true,\r\n isVisible: true,\r\n suppressSorting: true,\r\n onRender: (item: Filter) => {\r\n const accessPermission = getAccessPermission(item);\r\n\r\n return (\r\n <div>\r\n <CommandBarButton\r\n id={`adunitCallout-${item.id}`}\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'edit' }}\r\n ariaLabel={formatMessage(AppMessages.edit)}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.edit) : ''}\r\n disabled={!hasUpdateAccess(accessPermission) || appStore?.publisher === undefined || appStore?.account === undefined}\r\n onClick={() =>\r\n routeHistory.push(`/ad-management/${appStore?.publisher?.id}-${appStore?.account?.id}/adfilter/edit/${item.id}`)\r\n }\r\n />\r\n <CommandBarButton\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'Delete' }}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.delete) : ''}\r\n onClick={() => setDialogType(PopupType.DeleteConfirmation)}\r\n disabled={!hasDeleteAccess(accessPermission)}\r\n />\r\n </div>\r\n );\r\n },\r\n },\r\n ];\r\n\r\n return columns;\r\n}\r\n","import * as React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { Route, RouteComponentProps } from 'react-router-dom';\r\nimport { RoutePrefix } from '../../../Routes';\r\nimport { FormState } from '../../../components/Form';\r\nimport { RouteName } from '../@data';\r\nimport { onCurrentRouteChanged } from '../@data/actions';\r\nimport './@data/mutators';\r\nimport './@data/orchestrators';\r\nimport { CreateAdFilter } from './Create/CreateAdFilter';\r\nimport { ManagePage } from './Manage/ManagePage';\r\n\r\nexport const AdFilterPage = injectIntl(function AdFilterPageComponent({\r\n match,\r\n intl,\r\n}: RouteComponentProps & InjectedIntlProps): JSX.Element {\r\n React.useEffect(() => {\r\n onCurrentRouteChanged(RouteName.adfilter, intl.formatMessage);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <React.Fragment>\r\n <Route exact path={`${match.url}`} component={ManagePage} />\r\n <Route\r\n path={`/${RoutePrefix.adManagement}/:publisherId-:accountId/${RouteName[RouteName.adfilter]}/create`}\r\n render={(props) => <CreateAdFilter {...props} mode={FormState.Create} />}\r\n />\r\n <Route\r\n path={`/${RoutePrefix.adManagement}/:publisherId-:accountId/${RouteName[RouteName.adfilter]}/edit/:id`}\r\n render={(props) => <CreateAdFilter {...props} mode={FormState.Edit} />}\r\n />\r\n </React.Fragment>\r\n );\r\n});\r\n","import { IComboBoxOption } from '@fluentui/react';\r\nimport { action } from 'satcheljs';\r\nimport { IDataGridColumn } from '../../../../../layout/GridPageV2';\r\nimport { IAdCreativeViewModel } from '../store/schema';\r\nimport { AdPerformanceData, BlockItemType } from '../store/schema/models';\r\n\r\nexport const onAdCreativeChanged = action('onAdCreativeChanged', (adcreative: IAdCreativeViewModel) => ({ adcreative }));\r\n\r\nexport const onAdSourceChanged = action('onAdSourceChanged', (adSource?: IComboBoxOption) => ({ adSource }));\r\n\r\nexport const onAdProviderChanged = action('onAdProviderChanged', (adProvider?: IComboBoxOption) => ({ adProvider }));\r\n\r\nexport const onAdCreativeAccountChanged = action('onAdCreativeAccountChanged', (account?: IComboBoxOption) => ({ account }));\r\n\r\nexport const onAdCreativeMarketChanged = action('onAdCreativeMarketChanged', (market?: IComboBoxOption) => ({ market }));\r\n\r\nexport const onAdCreativeBlockedMarketChanged = action('onAdCreativeBlockedMarketChanged', (market?: IComboBoxOption) => ({ market }));\r\n\r\nexport const onAdCreativeSearchBoxValueChanged = action('onAdCreativeSearchBoxValueChanged', (value?: string) => ({ value }));\r\n\r\nexport const onAdCreativeStartDateChanged = action('onAdCreativeStartDateChanged', (startDate?: Date) => ({ startDate }));\r\n\r\nexport const onAdCreativeEndDateChanged = action('onAdCreativeEndDateChanged', (endDate?: Date) => ({ endDate }));\r\n\r\nexport const onAdCreativeRefreshDataChanged = action('onAdCreativeRefreshDataChanged', () => ({}));\r\n\r\nexport const onAdCreativeAdPerfDataChanged = action('onAdCreativeAdPerfDataChanged', (data?: AdPerformanceData[]) => ({ data }));\r\n\r\nexport const onAdCreativeBlockPanelChanged = action('onAdCreativeBlockPanelChanged', (value: boolean, item?: BlockItemType) => ({\r\n value,\r\n item,\r\n}));\r\n\r\nexport const onAdCreativeExportClicked = action('onAdCreativeExportClicked', (columns?: IDataGridColumn[]) => ({ columns }));\r\n\r\nexport const onAdQualityPanelApplyButtonClicked = action('onAdQualityPanelApplyButtonClicked', () => ({}));\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onTeachingBubbleStartDateStatusChanged = action('onTeachingBubbleStatusChanged', (isVisible?: boolean) => ({ isVisible }));\r\nexport const onTeachingBubbleEndDateStatusChanged = action('onTeachingBubbleStatusChanged', (isVisible?: boolean) => ({ isVisible }));\r\n","import { mutator } from 'satcheljs';\r\nimport { AdSource } from '../../../../../@data';\r\nimport {\r\n onAdCreativeAccountChanged,\r\n onAdCreativeAdPerfDataChanged,\r\n onAdCreativeBlockedMarketChanged,\r\n onAdCreativeBlockPanelChanged,\r\n onAdCreativeChanged,\r\n onAdCreativeEndDateChanged,\r\n onAdCreativeExportClicked,\r\n onAdCreativeMarketChanged,\r\n onAdCreativeSearchBoxValueChanged,\r\n onAdCreativeStartDateChanged,\r\n onAdProviderChanged,\r\n onAdSourceChanged,\r\n} from '../actions/onAdCreativeChanged';\r\nimport { onTeachingBubbleEndDateStatusChanged, onTeachingBubbleStartDateStatusChanged } from '../actions/onTeachingBubbleActions';\r\nimport { getStore } from '../store/store';\r\n\r\nmutator(onAdCreativeChanged, (msg) => {\r\n getStore().active = msg.adcreative;\r\n});\r\n\r\nmutator(onAdSourceChanged, (msg) => {\r\n if (msg.adSource) {\r\n getStore().active.selectedAdSource = msg.adSource.key as AdSource;\r\n getStore().active.adPerfData = [];\r\n }\r\n});\r\n\r\nmutator(onAdProviderChanged, (msg) => {\r\n if (msg.adProvider) {\r\n getStore().active.selectedAdProviderId = msg.adProvider.key as number;\r\n }\r\n});\r\n\r\nmutator(onAdCreativeAccountChanged, (msg) => {\r\n if (msg.account) {\r\n getStore().active.selectedAccount = msg.account.key as number;\r\n } else {\r\n getStore().active.selectedAccount = undefined;\r\n }\r\n});\r\n\r\nmutator(onAdCreativeMarketChanged, (msg) => {\r\n if (msg.market) {\r\n getStore().active.selectedMarket = msg.market.key as string;\r\n } else {\r\n getStore().active.selectedMarket = undefined;\r\n }\r\n});\r\n\r\nmutator(onAdCreativeBlockedMarketChanged, (msg) => {\r\n if (msg.market) {\r\n getStore().active.selectedBlockedMarketId = msg.market.key as number;\r\n } else {\r\n getStore().active.selectedBlockedMarketId = undefined;\r\n }\r\n});\r\n\r\nmutator(onAdCreativeSearchBoxValueChanged, (msg) => {\r\n getStore().active.searchBoxValue = msg.value;\r\n});\r\n\r\nmutator(onAdCreativeStartDateChanged, (msg) => {\r\n // Datepicker gives date in local time at 00:00:00\r\n getStore().active.startDate = msg.startDate;\r\n});\r\n\r\nmutator(onAdCreativeEndDateChanged, (msg) => {\r\n // Datepicker gives date in local time at 00:00:00\r\n getStore().active.endDate = msg.endDate;\r\n});\r\n\r\nmutator(onAdCreativeAdPerfDataChanged, (msg) => {\r\n getStore().active.adPerfData = msg.data;\r\n});\r\n\r\nmutator(onAdCreativeBlockPanelChanged, (msg) => {\r\n getStore().panelIsOpen = msg.value;\r\n getStore().panelItemType = msg.item;\r\n getStore().blockAdsPage.blockItemType = msg.item;\r\n if (!msg.value) {\r\n getStore().blockAdsPage = { adPerfBlockAdsData: [], channels: {} };\r\n getStore().errors = {};\r\n }\r\n});\r\n\r\nmutator(onAdCreativeExportClicked, (msg) => {\r\n getStore().columns = msg.columns;\r\n});\r\n\r\nmutator(onTeachingBubbleEndDateStatusChanged, (msg) => {\r\n const store = getStore();\r\n store.teachingBubbleEndDate = msg.isVisible;\r\n});\r\n\r\nmutator(onTeachingBubbleStartDateStatusChanged, (msg) => {\r\n const store = getStore();\r\n store.teachingBubbleStartDate = msg.isVisible;\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n startDate: {\r\n id: 'admanagement.adquality.startDate',\r\n defaultMessage: 'Start date (UTC)',\r\n },\r\n blockErrorMessage: {\r\n id: 'admanagement.adquality.blockErrorMessage',\r\n defaultMessage: 'Error in bulk blocking. Please select maximum of 30 ads when using bulk blocks.',\r\n },\r\n startDatePlaceHolder: {\r\n id: 'admanagement.adquality.startDatePlaceHolder',\r\n defaultMessage: 'Select start date...',\r\n },\r\n clearStartDateSelAriaLabel: {\r\n id: 'admanagement.adquality.clearStartDateSelAriaLabel',\r\n defaultMessage: 'clear start date selection',\r\n },\r\n clear: {\r\n id: 'admanagement.adquality.clear',\r\n defaultMessage: 'Clear',\r\n },\r\n adReview: {\r\n id: 'admanagement.adquality.adReview',\r\n defaultMessage: 'Ad review',\r\n },\r\n noAdsPerfData: {\r\n id: 'admanagement.adquality.noAdsPerfData',\r\n defaultMessage: 'There is no data for this selection',\r\n },\r\n noBlockData: {\r\n id: 'admanagement.adquality.noBlockData',\r\n defaultMessage: 'There are no ad blocks for this selection',\r\n },\r\n blockSummary: {\r\n id: 'admanagement.adquality.blockSummary',\r\n defaultMessage: 'Block summary',\r\n },\r\n endDate: {\r\n id: 'admanagement.adquality.endDate',\r\n defaultMessage: 'End date (UTC)',\r\n },\r\n endDatePlaceHolder: {\r\n id: 'admanagement.adquality.endDatePlaceHolder',\r\n defaultMessage: 'Select end date...',\r\n },\r\n clearEndDateSelAriaLabel: {\r\n id: 'admanagement.adquality.clearEndDateSelAriaLabel',\r\n defaultMessage: 'clear end date selection',\r\n },\r\n searchboxPlaceHolder: {\r\n id: 'admanagement.adquality.searchboxPlaceHolder',\r\n defaultMessage: 'Filter',\r\n },\r\n searchBoxAriaLabel: {\r\n id: 'admanagement.adquality.searchBoxAriaLabel',\r\n defaultMessage: 'Filter data grid',\r\n },\r\n accountsCombo: {\r\n id: 'admanagement.adquality.accountsCombo',\r\n defaultMessage: 'Accounts',\r\n },\r\n marketsCombo: {\r\n id: 'admanagement.adquality.marketsCombo',\r\n defaultMessage: 'Markets',\r\n },\r\n applyFilters: {\r\n id: 'admanagement.adquality.applyFilters',\r\n defaultMessage: 'Apply',\r\n },\r\n applyFiltersAriaDesc: {\r\n id: 'admanagement.adquality.applyFiltersAriaDesc',\r\n defaultMessage: 'Press to apply selected filters on the data grid',\r\n },\r\n blockAds: {\r\n id: 'admanagement.adquality.blockad',\r\n defaultMessage: 'Block Ads',\r\n },\r\n blockImages: {\r\n id: 'admanagement.adquality.blockImages',\r\n defaultMessage: 'Block images',\r\n },\r\n viewImages: {\r\n id: 'admanagement.adquality.viewImages',\r\n defaultMessage: 'View images',\r\n },\r\n blockAdsMenuButtonLabel: {\r\n id: 'admanagement.adquality.blockAdsMenuButtonLabel',\r\n defaultMessage: 'Block ads',\r\n },\r\n blockImagesMenuButtonLabel: {\r\n id: 'admanagement.adquality.blockImagesMenuButtonLabel',\r\n defaultMessage: 'Block/View images',\r\n },\r\n viewImagesDescription: {\r\n id: 'admanagement.adquality.viewImagesDescription',\r\n defaultMessage: 'Some images cannot be blocked. Currently the entire ad must be blocked to prevent those images from being served.',\r\n },\r\n blockSummaryMSGridAriaLabel: {\r\n id: 'admanagement.adquality.blockSummaryMSGridAriaLabel',\r\n defaultMessage: 'Grid containing details of blocked Microsoft ads',\r\n },\r\n blockSummaryAuctionGridAriaLabel: {\r\n id: 'admanagement.adquality.blockSummaryAuctionGridAriaLabel',\r\n defaultMessage: 'Grid containing details of blocked Auction ads',\r\n },\r\n adReviewGridAriaLabel: {\r\n id: 'admanagement.adquality.adReviewGridAriaLabel',\r\n defaultMessage: 'Datagrid containing ads',\r\n },\r\n exportGrid: {\r\n id: 'admanagement.adquality.exportGrid',\r\n defaultMessage: 'Export below table',\r\n },\r\n exportImageBlocks: {\r\n id: 'admanagement.adquality.exportImageBlocks',\r\n defaultMessage: 'Export all image blocks',\r\n },\r\n enableBlocking: {\r\n id: 'enableBlocking',\r\n defaultMessage: 'Enable blocking',\r\n },\r\n disableBlocking: {\r\n id: 'disableBlocking',\r\n defaultMessage: 'Disable blocking',\r\n },\r\n adSourceCombo: {\r\n id: 'admanagement.adquality.adSourceCombo',\r\n defaultMessage: 'Ad Source',\r\n },\r\n auctionAdSourceCombo: {\r\n id: 'admanagement.adquality.auctionAdSourceCombo',\r\n defaultMessage: 'Ad Provider',\r\n },\r\n microsoft: {\r\n id: 'admanagement.adquality.microsoft',\r\n defaultMessage: 'Microsoft',\r\n },\r\n auction: {\r\n id: 'admanagement.adquality.auction',\r\n defaultMessage: 'Auction',\r\n },\r\n xandrAuction: {\r\n id: 'admanagement.adquality.xandrAuction',\r\n defaultMessage: 'Xandr Auction',\r\n },\r\n AdId: {\r\n id: 'admanagement.adquality.AdId',\r\n defaultMessage: 'Ad Id - Displaying {count}',\r\n },\r\n blockAdTitle: {\r\n id: 'admanagement.adquality.blockAdTitle',\r\n defaultMessage: 'Title',\r\n },\r\n blockAdURL: {\r\n id: 'admanagement.adquality.blockAdURL',\r\n defaultMessage: 'URL',\r\n },\r\n selectChannel: {\r\n id: 'admanagement.adquality.selectChannel',\r\n defaultMessage: 'Select channel',\r\n },\r\n selectMarket: {\r\n id: 'admanagement.adquality.selectMarket',\r\n defaultMessage: 'Select market',\r\n },\r\n createNewChannel: {\r\n id: 'admanagement.adquality.createNewChannel',\r\n defaultMessage: 'Create new channel',\r\n },\r\n blockReasonCategory: {\r\n id: 'admanagement.adquality.blockReasonCategory',\r\n defaultMessage: 'Block reason category',\r\n },\r\n blockReason: {\r\n id: 'admanagement.adquality.blockReason',\r\n defaultMessage: 'Block reason sub-category',\r\n },\r\n additionalDetials: {\r\n id: 'admanagement.adquality.additionalDetials',\r\n defaultMessage: 'Additional details/reason for blocking',\r\n },\r\n editBlockReason: {\r\n id: 'admanagement.adquality.editBlockReason',\r\n defaultMessage: 'Edit block reason',\r\n },\r\n channelName: {\r\n id: 'admanagement.adquality.channelName',\r\n defaultMessage: 'Channel name',\r\n },\r\n addAdnuits: {\r\n id: 'admanagement.adquality.addAdunits',\r\n defaultMessage: 'Add ad units',\r\n },\r\n disallowedByNCAP: {\r\n id: 'admanagement.adquality.disallowedByNCAP',\r\n defaultMessage: 'Disallowed by NCAP',\r\n },\r\n maliciousAdvertiser: {\r\n id: 'admanagement.adquality.maliciousAdvertiser',\r\n defaultMessage: 'Malicious Advertiser',\r\n },\r\n Misspellings: {\r\n id: 'admanagement.adquality.Misspellings',\r\n defaultMessage: 'Ad Text Quality – Misspellings',\r\n },\r\n competitiveExclusion: {\r\n id: 'admanagement.adquality.competitiveExclusion',\r\n defaultMessage: 'Competitive Exclusion',\r\n },\r\n badLandingPage: {\r\n id: 'admanagement.adquality.badLandingPage',\r\n defaultMessage: 'Bad landing page experience',\r\n },\r\n misleadingAdHeadline: {\r\n id: 'admanagement.adquality.misleadingAdHeadline',\r\n defaultMessage: 'Misleading ad headline',\r\n },\r\n sensationalAdOrLandingPage: {\r\n id: 'admanagement.adquality.sensationalAdOrLandingPage',\r\n defaultMessage: 'Sensational ad or landing page content',\r\n },\r\n offensiveAdOrLandingPage: {\r\n id: 'admanagement.adquality.offensiveAdOrLandingPage',\r\n defaultMessage: 'Offensive ad or landing page content',\r\n },\r\n wrongLanguageforMarket: {\r\n id: 'admanagement.adquality.wrongLanguageforMarket',\r\n defaultMessage: 'Wrong language for market',\r\n },\r\n prohibitedAdCategory: {\r\n id: 'admanagement.adquality.prohibitedAdCategory',\r\n defaultMessage: 'Prohibited ad category',\r\n },\r\n deceptiveAdvertiser: {\r\n id: 'admanagement.adquality.deceptiveAdvertiser',\r\n defaultMessage: 'Deceptive advertiser',\r\n },\r\n otherReasonCategory: {\r\n id: 'admanagement.adquality.otherReasonCategory',\r\n defaultMessage: 'Other',\r\n },\r\n pastRevenue: {\r\n id: 'admanagement.adquality.pastRevenue',\r\n defaultMessage: 'Publisher 7-day revenue impact',\r\n },\r\n disallowedContent: {\r\n id: 'admanagement.adquality.disallowed',\r\n defaultMessage: 'Disallowed Content',\r\n },\r\n disallowedDeceptive: {\r\n id: 'admanagement.adquality.disallowedDeceptive',\r\n defaultMessage: 'Deceptive Products and services',\r\n },\r\n disallowedMisleading: {\r\n id: 'admanagement.adquality.disallowedMisleading',\r\n defaultMessage: 'Misleading messaging, content, or images',\r\n },\r\n disallowedOffensive: {\r\n id: 'admanagement.adquality.disallowedOffensive',\r\n defaultMessage: 'Offensive/controversial content',\r\n },\r\n disallowedSuffering: {\r\n id: 'admanagement.adquality.disallowedSuffering',\r\n defaultMessage: 'Suffering and violence',\r\n },\r\n disallowedDrugs: {\r\n id: 'admanagement.adquality.disallowedDrugs',\r\n defaultMessage: 'Drugs and related paraphernalia',\r\n },\r\n disallowedTobacco: {\r\n id: 'admanagement.adquality.disallowedTobacco',\r\n defaultMessage: 'Tobacco products',\r\n },\r\n disallowedSensitive: {\r\n id: 'admanagement.adquality.disallowedSensitive',\r\n defaultMessage: 'Sensitive advertising',\r\n },\r\n legalPrivacyAndSecurity: {\r\n id: 'admanagement.adquality.legalPrivacyAndSecurity',\r\n defaultMessage: 'Legal, privacy, and security',\r\n },\r\n legalMalware: {\r\n id: 'admanagement.adquality.legalMalware',\r\n defaultMessage: 'Malware and security',\r\n },\r\n legalPrivacy: {\r\n id: 'admanagement.adquality.legalPrivacy',\r\n defaultMessage: 'Privacy and data protection policies',\r\n },\r\n mediaFormats: {\r\n id: 'admanagement.adquality.mediaFormats',\r\n defaultMessage: 'Media formats',\r\n },\r\n mediaAnimation: {\r\n id: 'admanagement.adquality.mediaAnimation',\r\n defaultMessage: 'Animation',\r\n },\r\n mediaNudity: {\r\n id: 'admanagement.adquality.mediaNudity',\r\n defaultMessage: 'Nudity, offensive advertising',\r\n },\r\n relevanceAndQuality: {\r\n id: 'admanagement.adquality.relevanceAndQuality',\r\n defaultMessage: 'Relevance and quality',\r\n },\r\n relevanceLandingPage: {\r\n id: 'admanagement.adquality.relevanceLandingPage',\r\n defaultMessage: 'Landing pages',\r\n },\r\n restrictedCategories: {\r\n id: 'admanagement.adquality.restrictedCategories',\r\n defaultMessage: 'Restricted categories',\r\n },\r\n restrictedAdult: {\r\n id: 'admanagement.adquality.restrictedAdult',\r\n defaultMessage: 'Adult content',\r\n },\r\n restrictedAlcohol: {\r\n id: 'admanagement.adquality.restrictedAlcohol',\r\n defaultMessage: 'Alcohol',\r\n },\r\n restrictedBeauty: {\r\n id: 'admanagement.adquality.restrictedBeauty',\r\n defaultMessage: 'Beauty & Cosmetics',\r\n },\r\n restrictedDating: {\r\n id: 'admanagement.adquality.restrictedDating',\r\n defaultMessage: 'Dating / personals',\r\n },\r\n restrictedFinance: {\r\n id: 'admanagement.adquality.restrictedFinance',\r\n defaultMessage: 'Finance',\r\n },\r\n restrictedGambling: {\r\n id: 'admanagement.adquality.restrictedGambling',\r\n defaultMessage: 'Gambling and lotteries',\r\n },\r\n restrictedLegalServices: {\r\n id: 'admanagement.adquality.restrictedLegalServices',\r\n defaultMessage: 'Legal Services',\r\n },\r\n restrictedCompetitors: {\r\n id: 'admanagement.adquality.restrictedCompetitors',\r\n defaultMessage: 'Microsoft competitors',\r\n },\r\n restrictedPharmacy: {\r\n id: 'admanagement.adquality.restrictedPharmacy',\r\n defaultMessage: 'Pharmacy and healthcare',\r\n },\r\n restrictedPolitical: {\r\n id: 'admanagement.adquality.restrictedPolitical',\r\n defaultMessage: 'Political content',\r\n },\r\n restrictedSoftware: {\r\n id: 'admanagement.adquality.restrictedSoftware',\r\n defaultMessage: 'Software, freeware and shareware',\r\n },\r\n restrictedSolicitation: {\r\n id: 'admanagement.adquality.restrictedSolicitation',\r\n defaultMessage: 'Solicitation of funds/ fund-raising',\r\n },\r\n restrictedWeapons: {\r\n id: 'admanagement.adquality.restrictedWeapons',\r\n defaultMessage: 'Weapons, knives, firearms, ammunition',\r\n },\r\n textGuidelines: {\r\n id: 'admanagement.adquality.textGuidelines',\r\n defaultMessage: 'Text guidelines',\r\n },\r\n textAdFunctionality: {\r\n id: 'admanagement.adquality.textAdFunctionality',\r\n defaultMessage: 'Ad functionality',\r\n },\r\n textAdLanguage: {\r\n id: 'admanagement.adquality.textAdLanguage',\r\n defaultMessage: 'Ad language',\r\n },\r\n textGrammar: {\r\n id: 'admanagement.adquality.textGrammar',\r\n defaultMessage: 'Grammar, punctuation, and spelling',\r\n },\r\n imageNotRelevant: {\r\n id: 'admanagement.adquality.imageNotRelevant',\r\n defaultMessage: 'Image not relevant to Ad',\r\n },\r\n lowQualityImage: {\r\n id: 'admanagement.adquality.lowQualityImage',\r\n defaultMessage: 'Low quality image',\r\n },\r\n offensiveImage: {\r\n id: 'admanagement.adquality.offensiveImage',\r\n defaultMessage: 'Offensive image',\r\n },\r\n policyIssue: {\r\n id: 'admanagement.adquality.policyIssue',\r\n defaultMessage: 'Additional policy issue',\r\n },\r\n altAdTitleListings: {\r\n id: 'admanagement.adquality.altAdTitleListings',\r\n defaultMessage: 'Alternate Ad Title',\r\n },\r\n altAdUrlListings: {\r\n id: 'admanagement.adquality.altAdUrlListings',\r\n defaultMessage: 'Alternate Ad Url',\r\n },\r\n altAdImageListings: {\r\n id: 'admanagement.adquality.altAdImageListings',\r\n defaultMessage: 'Alt. Ad Image',\r\n },\r\n loadingAltAdCreativeListings: {\r\n id: 'admanagement.adquality.loadingAltAdCreativeListings',\r\n defaultMessage: 'Loading Alternate Ad Creatives',\r\n },\r\n noAltAdCreativeListings: {\r\n id: 'admanagement.adquality.noAltAdCreativeListings',\r\n defaultMessage: 'No Alternate Ad Creatives for this Ad',\r\n },\r\n allImages: {\r\n id: 'admanagement.adquality.allImages',\r\n defaultMessage: 'View all images',\r\n },\r\n moreImages: {\r\n id: 'admanagement.adquality.moreImages',\r\n defaultMessage: '... {imageListLength} more images',\r\n },\r\n viewOnlyImageLabel: {\r\n id: 'admanagement.adquality.viewOnlyImageLabel',\r\n defaultMessage: 'image {itemNumber} view only',\r\n },\r\n blockedLabel: {\r\n id: 'admanagement.adquality.blockedLabel',\r\n defaultMessage: 'BLOCKED',\r\n },\r\n verizonMediaWarningLabel: {\r\n id: 'admanagement.adquality.verizonMediaWarningLabel',\r\n defaultMessage: 'Warning : Block ads for Gemini in Pubcenter & Partner Native Tool',\r\n },\r\n queryTimeoutWarningHeaderLabel: {\r\n id: 'admanagement.adquality.queryTimeoutWarningHeaderLabel',\r\n defaultMessage: 'Querying data for date ranges greater than 5 days may time out',\r\n },\r\n queryTimeoutWarningDescriptionLabel: {\r\n id: 'admanagement.adquality.queryTimeoutWarningDescriptionLabel',\r\n defaultMessage: 'Please consider using a shorter date range or using filters if you need a date range greater than 5 days.',\r\n },\r\n auctionBlockAdIdLabel: {\r\n id: 'admanagement.adquality.auctionBlockAdIdLabel',\r\n defaultMessage: 'AdId: {uniqueCreativeAdId}',\r\n },\r\n accountName: {\r\n id: 'admanagement.adquality.accountName',\r\n defaultMessage: 'Account',\r\n },\r\n adId: {\r\n id: 'admanagement.adquality.adid',\r\n defaultMessage: 'Ad id',\r\n },\r\n adTitle: {\r\n id: 'admanagement.adquality.adTitle',\r\n defaultMessage: 'Ad title',\r\n },\r\n advertiser: {\r\n id: 'admanagement.adquality.advertiser',\r\n defaultMessage: 'Advertiser',\r\n },\r\n advertiserId: {\r\n id: 'admanagement.adquality.advertiserId',\r\n defaultMessage: 'Advertiser id',\r\n },\r\n advertiserAccountId: {\r\n id: 'admanagement.adquality.advertiserAccountId',\r\n defaultMessage: 'Advertiser account id',\r\n },\r\n filterPanelApplyButtonAriaDesc: {\r\n id: 'admanagement.adquality.filterPanelApplyButtonAriaDesc',\r\n defaultMessage: 'Click to apply selected options to the filter',\r\n },\r\n blockRequestSource: {\r\n id: 'admanagement.adquality.blockRequestSource',\r\n defaultMessage: 'Block request source',\r\n },\r\n adCreativeServiceLoadEntityFailed: {\r\n id: 'admanagement.adquality.adCreativeServiceLoadEntityFailed',\r\n defaultMessage: 'Failed to load entity',\r\n },\r\n adqualityInvalidState: {\r\n id: 'admanagement.adquality.invalidState',\r\n defaultMessage: 'You have arrived in an invalid state, please report.',\r\n },\r\n adqualityFailedToBlockAds: {\r\n id: 'admanagement.adquality.failedToBlockAds',\r\n defaultMessage: 'Failed to block ads',\r\n },\r\n adqualityBlockAdsMissingFields: {\r\n id: 'admanagement.adquality.blockAdsMissingFields',\r\n defaultMessage: 'BlockAds - You have {count} missing fields, please fill them to continue',\r\n },\r\n adqualityUpdateBlockedAdsStatusFailed: {\r\n id: 'admanagement.adquality.updatedBlockedAdsStatusFailed',\r\n defaultMessage: 'Failed to update blocked ads status',\r\n },\r\n adqualityBlockedAdsSuccessfully: {\r\n id: 'admanagement.adquality.blockedAdsSuccessfully',\r\n defaultMessage: 'Blocked ads successfully',\r\n },\r\n adqualityBlockImagesFailed: {\r\n id: 'admanagement.adquality.blockImagesFailed',\r\n defaultMessage: 'Failed to block images',\r\n },\r\n adqualityBlockImagesSuccess: {\r\n id: 'admanagement.adquality.blockImagesSuccess',\r\n defaultMessage: 'Block Images success',\r\n },\r\n adqualityBlockImagesMissingFields: {\r\n id: 'admanagement.adquality.blockImagesMissingFields',\r\n defaultMessage: 'Block Images - You have {count} missing/incorrect fields, please fill them to continue',\r\n },\r\n adqualityDownloadBlockedImagesFailed: {\r\n id: 'admanagement.adquality.downloadBlockedImagesFailed',\r\n defaultMessage: 'Failed to download blocked images',\r\n },\r\n adqualityDownloadBlockedImagesSuccess: {\r\n id: 'admanagement.adquality.downloadBlockedImagesSuccess',\r\n defaultMessage: 'Blocked images data download success',\r\n },\r\n adqualityDownloadAdContextFailed: {\r\n id: 'admanagement.adquality.downloadAdContextFailed',\r\n defaultMessage: 'Failed to download ad context',\r\n },\r\n adqualityNoDataToDownload: {\r\n id: 'admanagement.adquality.noDataToDownload',\r\n defaultMessage: 'It appears as though there is currently no data to download!',\r\n },\r\n adqualityBlockedAdsDataDownloadSuccess: {\r\n id: 'admanagement.adquality.blockedAdsDataDownloadSuccess',\r\n defaultMessage: 'Blocked ads data download success',\r\n },\r\n adqualityUpdatedBlockedAdsStatusSuccess: {\r\n id: 'admanagement.adquality.updatedBlockedAdsStatusSuccess',\r\n defaultMessage: 'Update blocked ads {ID} status success',\r\n },\r\n adqualityLoadListingAdDataFailed: {\r\n id: 'admanagement.adquality.loadListingAdDataFailed',\r\n defaultMessage: 'Failed to load ad listing data',\r\n },\r\n adqualityLoadRevenueAdDataFailed: {\r\n id: 'admanagement.adquality.loadRevenueAdDataFailed',\r\n defaultMessage: 'Failed to load ad revenue data',\r\n },\r\n adqualityTimeoutQueringForData: {\r\n id: 'admanagement.adquality.timeoutQueringForData',\r\n defaultMessage:\r\n 'An error occurred. This is likely due to a timeout querying the data for the time range selected. Please try a shorter date range. {trackingId}',\r\n },\r\n adqualityProvideSearchTerm: {\r\n id: 'admanagement.adquality.provideSearchTerm',\r\n defaultMessage: 'Please provide a search term, while searching over multiple days',\r\n },\r\n adqualityAdPerformanceDataDownloadSuccess: {\r\n id: 'admanagement.adquality.adPerformanceDataDownloadSuccess',\r\n defaultMessage: 'Ad Performance data download success',\r\n },\r\n adDescriptionCheckboxLabel: {\r\n id: 'admanagement.adquality.adDescriptionCheckboxLabel',\r\n defaultMessage: 'Include description',\r\n },\r\n});\r\n","import messages from '../pages/ad-management/AdQuality/AdReview/AdCreativePage.messages';\r\n\r\nexport const blockReasons = {\r\n 0: [\r\n messages.disallowedDeceptive,\r\n messages.disallowedMisleading,\r\n messages.disallowedOffensive,\r\n messages.disallowedSuffering,\r\n messages.disallowedDrugs,\r\n messages.disallowedTobacco,\r\n messages.disallowedSensitive,\r\n messages.otherReasonCategory,\r\n ],\r\n 1: [messages.legalMalware, messages.legalPrivacy, messages.otherReasonCategory],\r\n 2: [messages.mediaAnimation, messages.mediaNudity, messages.otherReasonCategory],\r\n 3: [messages.relevanceLandingPage, messages.otherReasonCategory],\r\n 4: [\r\n messages.restrictedAdult,\r\n messages.restrictedAlcohol,\r\n messages.restrictedBeauty,\r\n messages.restrictedDating,\r\n messages.restrictedFinance,\r\n messages.restrictedGambling,\r\n messages.restrictedLegalServices,\r\n messages.restrictedCompetitors,\r\n messages.restrictedPharmacy,\r\n messages.restrictedPolitical,\r\n messages.restrictedSoftware,\r\n messages.restrictedSolicitation,\r\n messages.restrictedWeapons,\r\n messages.otherReasonCategory,\r\n ],\r\n 5: [messages.textAdFunctionality, messages.textAdLanguage, messages.textGrammar, messages.otherReasonCategory],\r\n};\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onAdCreativePageInitialized = action('onAdCreativePageInitialized', (publisherId?: number) => ({ publisherId }));\r\n","import { IDropdownOption } from '@fluentui/react';\r\nimport { action } from 'satcheljs';\r\nimport { IStringDictionary } from '../../../../../@data';\r\nimport { IAdListingsData, IBlockItemViewModel } from '../store/schema';\r\nimport { AdPerformanceData } from '../store/schema/models';\r\n\r\nexport const onAdDescriptionChanged = action('onAdDescriptionChanged', (value: boolean) => ({ value }));\r\n\r\nexport const onBlockAdsViewChanged = action('onBlockAdsViewChanged', (value: IBlockItemViewModel) => ({ value }));\r\n\r\nexport const onBlockAdInitialized = action('onBlockAdInitiallized', (value: AdPerformanceData[], isImageBlock?: boolean) => ({\r\n value,\r\n isImageBlock,\r\n}));\r\n\r\nexport const onBlockAdsSamChanged = action('onBlockAdsSamChanged', (value: AdPerformanceData[]) => ({ value }));\r\n\r\nexport const onBlockAdsChanged = action('onBlockAdsChanged', (value: AdPerformanceData[]) => ({ value }));\r\n\r\nexport const onBlockImageAdsChanged = action('onBlockImageAdsChanged', (value: AdPerformanceData[], isAuctionData: boolean = false) => ({\r\n value,\r\n isAuctionData,\r\n}));\r\n\r\nexport const onBlockAdsImagesChanged = action(\r\n 'onBlockAdsImagesChanged',\r\n (images?: string[], index?: number, needUrlProcess?: boolean, isAuctionData: boolean = false) => ({\r\n images,\r\n index,\r\n needUrlProcess,\r\n isAuctionData,\r\n })\r\n);\r\n\r\nexport const onBlockAdsAdPerfDataCleared = action('onBlockAdsAdPerfDataCleared');\r\n\r\nexport const onBlockAdsBlockedImagesChanged = action('onBlockAdsBlockedImagesChanged', (item: string, isChecked?: boolean) => ({\r\n isChecked,\r\n item,\r\n}));\r\n\r\nexport const onBlockAdsChannelsAndRevenueChanged = action('onBlockAdsChannelsAndRevenueChanged', (value: AdPerformanceData[]) => ({\r\n value,\r\n}));\r\n\r\nexport const onBlockAdsSelectedMarketChanged = action('onBlockAdsSelectedMarketChanged', (value: IDropdownOption) => ({ value }));\r\n\r\nexport const onBlockAdsReasonLevelsChanged = action(\r\n 'onBlockAdsReasonLevelsChanged',\r\n (value: IDropdownOption, formatter: Function, index: number) => ({\r\n value,\r\n formatter,\r\n index,\r\n })\r\n);\r\n\r\nexport const onBlockAdsChannelsChanged = action('onBlockAdsChannelsListChanged', (accountId: number, channelId?: number) => ({\r\n accountId,\r\n channelId,\r\n}));\r\n\r\nexport const onBlockAdsSelectedBlockRequestSourceChanged = action(\r\n 'onBlockAdsSelectedBlockRequestSourceChanged',\r\n (value: IDropdownOption) => ({\r\n value,\r\n })\r\n);\r\n\r\nexport const onBlockAdsRevenueChanged = action('onBlockAdsRevenueChanged', (value: number, index: number) => ({ value, index }));\r\n\r\nexport const onBlockAdsListingsChanged = action('onBlockAdsListingsChanged', (value: IAdListingsData, index: number) => ({ value, index }));\r\n\r\nexport const onBlockAdsBlockReasonChanged = action('onBlockAdsBlockReasonChanged', (value: IDropdownOption) => ({ value }));\r\n\r\nexport const onBlockAdsBlockDetailsChanged = action('onBlockAdsBlockDetailsChanged', (value?: string) => ({ value }));\r\n\r\nexport const onAdListingPageSelection = action('onAdListingPageSelection', (value?: number, index?: number) => ({ value, index }));\r\n\r\nexport const onBlockAdsSubmitted = action('onBlockAdsSubmitted');\r\n\r\nexport const onMSANBlockAdsSubmitted = action('onMSANBlockAdsSubmitted');\r\n\r\nexport const onSAMBlockAdsSubmitted = action('onSAMBlockAdsSubmitted');\r\n\r\nexport const onBlockImagesSubmitted = action('onBlockImagesSubmitted');\r\n\r\nexport const onBlockAdsErrorChanged = action('onBlockAdsErrorChanged', (values?: IStringDictionary) => ({ values }));\r\n\r\nexport const onBlockImagesErrorChanged = action('onBlockImagesErrorChanged', (values?: IStringDictionary) => ({ values }));\r\n","import { action } from 'satcheljs';\r\nimport { LifeCycleStatus } from '../../../../../@data';\r\nimport { IDataGridColumn } from '../../../../../layout/GridPageV2';\r\nimport { BlockAdsData, SAMBlockSummaryData } from '../store/schema/models';\r\n\r\nexport const onBlockAdsDataChanged = action('onBlockAdsDataChanged', (data?: BlockAdsData[]) => ({ data }));\r\n\r\nexport const onSAMBlockAdsDataChanged = action('onSAMBlockAdsDataChanged', (data?: SAMBlockSummaryData[]) => ({ data }));\r\n\r\nexport const onSAMBlockSummaryViewImagesClicked = action('onSAMBlockSummaryViewImagesClicked', (item: SAMBlockSummaryData) => ({\r\n item,\r\n}));\r\n\r\nexport const onBlockedImagesExportClicked = action('onBlockedImagesExportClicked', (columns?: IDataGridColumn[]) => ({ columns }));\r\n\r\nexport const onBlockedAdsExportClicked = action('onBlockedAdsExportClicked', (columns?: IDataGridColumn[]) => ({ columns }));\r\n\r\nexport const onBlockAdsItemStatusChanged = action('onBlockAdsItemStatusChanged', (data: BlockAdsData, status: LifeCycleStatus) => ({\r\n data,\r\n status,\r\n}));\r\n\r\nexport const onSAMBlockAdsItemStatusChanged = action(\r\n 'onSAMBlockAdsItemStatusChanged',\r\n (data: SAMBlockSummaryData, status: LifeCycleStatus) => ({\r\n data,\r\n status,\r\n })\r\n);\r\n\r\nexport const onRefreshBlockSummary = action('onRefreshBlockSummary', () => ({}));\r\n\r\nexport const onBlockSummaryStartDateChanged = action('onBlockSummaryStartDateChanged', (startDate?: Date) => ({ startDate }));\r\n\r\nexport const onBlockSummaryEndDateChanged = action('onBlockSummaryEndDateChanged', (endDate?: Date) => ({ endDate }));\r\n","import { action } from 'satcheljs';\r\nimport { BlockedContext } from '../store/schema/models';\r\n\r\nexport const onBlockedContextChanged = action('onBlockedContextChanged', (publisherId: number) => ({ publisherId }));\r\n\r\nexport const onBlockedAdsContextChanged = action('onBlockedAdsContextChanged', (data?: BlockedContext) => {\r\n return { data };\r\n});\r\n\r\nexport const onBlockedImagesContextChanged = action('onBlockedImagesContextChanged', (data?: string[]) => ({ data }));\r\n","import { action } from 'satcheljs';\r\nimport { IFilterPanelProps } from '../../AdReview/AdCreativePage.types';\r\n\r\nexport const onFilterPanelShown = action('onFilterPanelShown', (filterPanel: IFilterPanelProps) => ({\r\n filterPanel,\r\n}));\r\n\r\nexport const onFilterPanelHide = action('onFilterPanelHide');\r\n","import { IDropdownOption } from '@fluentui/react';\r\nimport { mutator } from 'satcheljs';\r\nimport { AdSource } from '../../../../../@data';\r\nimport { adProvidersToNames } from '../../../../../config/adProviders';\r\nimport { blockReasons } from '../../../../../config/blockReasons';\r\nimport { xandrAdProvidersToNames } from '../../../../../config/xandrAdProviders';\r\nimport noImage from '../../AdReview/noImageAvailable.svg';\r\nimport {\r\n onAdListingPageSelection,\r\n onBlockAdsAdPerfDataCleared,\r\n onBlockAdsBlockDetailsChanged,\r\n onBlockAdsBlockedImagesChanged,\r\n onBlockAdsBlockReasonChanged,\r\n onBlockAdsChanged,\r\n onBlockAdsErrorChanged,\r\n onBlockAdsImagesChanged,\r\n onBlockAdsReasonLevelsChanged,\r\n onBlockAdsSamChanged,\r\n onBlockAdsSelectedMarketChanged,\r\n onBlockAdsViewChanged,\r\n onBlockImageAdsChanged,\r\n onBlockImagesErrorChanged,\r\n} from '../actions';\r\nimport {\r\n onAdDescriptionChanged,\r\n onBlockAdsChannelsChanged,\r\n onBlockAdsListingsChanged,\r\n onBlockAdsRevenueChanged,\r\n onBlockAdsSelectedBlockRequestSourceChanged,\r\n} from '../actions/onBlockAdsFormChanged';\r\nimport { processImagesLink } from '../services/utility/utility';\r\nimport { IBlockItemViewModel } from '../store/schema';\r\nimport { AdPerformanceBlockData } from '../store/schema/models/AdPerformanceBlockData';\r\nimport { getStore } from '../store/store';\r\n\r\nmutator(onBlockAdsViewChanged, (msg) => {\r\n getStore().blockAdsPage = msg.value;\r\n});\r\n\r\nmutator(onAdDescriptionChanged, (msg) => {\r\n getStore().adDescription = msg.value;\r\n});\r\n\r\nmutator(onBlockAdsSamChanged, (msg) => {\r\n const adSource = getStore().active.selectedAdSource;\r\n const selectedAds = msg.value;\r\n selectedAds.forEach((item) => {\r\n const blockAdSamData: AdPerformanceBlockData = {\r\n uniqueCreativeAdId: item.uniqueCreativeAdId,\r\n adTitle: item.adTitle,\r\n advertiserName: item.advertiserName,\r\n adProvider: item.adProvider\r\n ? adSource === AdSource.Auction\r\n ? adProvidersToNames[item.adProvider]\r\n : xandrAdProvidersToNames[item.adProvider]\r\n : undefined,\r\n adDescription: item.adDescription,\r\n revenue: item.revenue,\r\n };\r\n\r\n getStore().blockAdsPage.adPerfBlockAdsData.push(blockAdSamData);\r\n });\r\n});\r\n\r\nmutator(onBlockAdsChanged, (msg) => {\r\n const selectedAds = msg.value;\r\n selectedAds.forEach((item) => {\r\n const blockAdData: AdPerformanceBlockData = {\r\n adId: item.adId,\r\n adUnitId: item.adUnitId,\r\n adTitle: item.adTitle,\r\n adURL: item.adURL,\r\n adProvider: item.adProvider ? adProvidersToNames[item.adProvider] : undefined,\r\n advertiserName: item.advertiserName,\r\n advertiserAccountId: item.advertiserAccountId,\r\n adDescription: item.adDescription,\r\n adDestUrl: item.adDestUrl,\r\n accountId: item.accountId,\r\n accountName: item.accountName,\r\n };\r\n getStore().blockAdsPage.adPerfBlockAdsData.push(blockAdData);\r\n });\r\n});\r\n\r\nmutator(onBlockImageAdsChanged, (msg) => {\r\n const selectedAds = msg.value;\r\n selectedAds.forEach((item) => {\r\n const blockImageAdData: AdPerformanceBlockData = {\r\n adId: item.adId,\r\n adTitle: item.adTitle,\r\n adUnitId: item.adUnitId,\r\n adSource: item.adSource,\r\n adType: item.adType,\r\n };\r\n\r\n getStore().blockAdsPage.adPerfBlockAdsData.push(blockImageAdData);\r\n });\r\n});\r\n\r\nmutator(onBlockAdsImagesChanged, (msg) => {\r\n if (msg.images) {\r\n let imgs = processImagesLink(msg.images ? msg.images : [], noImage, msg.isAuctionData);\r\n const filteredImages = msg.images!.filter((i) => i !== '');\r\n imgs = msg.needUrlProcess ? imgs : filteredImages;\r\n getStore().blockAdsPage.adPerfBlockAdsData[msg.index!].images = imgs;\r\n }\r\n});\r\n\r\nmutator(onBlockAdsAdPerfDataCleared, (msg) => {\r\n getStore().blockAdsPage.adPerfBlockAdsData = [];\r\n});\r\n\r\nmutator(onBlockAdsBlockedImagesChanged, (msg) => {\r\n let imgs: string[] = [];\r\n const blockAdsView: IBlockItemViewModel = {\r\n ...getStore().blockAdsPage,\r\n };\r\n if (blockAdsView.adPerfBlockAdsData[0].blockedImages) {\r\n blockAdsView.adPerfBlockAdsData[0].blockedImages.forEach((img) => {\r\n imgs.push(img);\r\n });\r\n }\r\n if (msg.isChecked && !imgs.includes(msg.item)) {\r\n imgs.push(msg.item);\r\n }\r\n if (msg.isChecked === false && imgs.includes(msg.item)) {\r\n imgs = imgs.filter((img) => img !== msg.item);\r\n }\r\n\r\n blockAdsView.adPerfBlockAdsData[0].blockedImages = imgs;\r\n getStore().blockAdsPage = blockAdsView;\r\n});\r\n\r\nmutator(onBlockAdsSelectedBlockRequestSourceChanged, (msg) => {\r\n getStore().blockAdsPage.selectedBlockRequestSource = msg.value.key as number;\r\n});\r\n\r\nmutator(onBlockAdsSelectedMarketChanged, (msg) => {\r\n getStore().blockAdsPage.selectedMarket = msg.value.key as string;\r\n});\r\n\r\nmutator(onBlockAdsReasonLevelsChanged, (msg) => {\r\n getStore().blockAdsPage.blockReasonL1 = msg.value.key as string;\r\n const dropDownValues: IDropdownOption[] = [];\r\n blockReasons[msg.index].forEach((value) => {\r\n if (msg.formatter) {\r\n dropDownValues.push({\r\n key: msg.formatter(value),\r\n text: msg.formatter(value),\r\n ariaLabel: msg.formatter(value),\r\n });\r\n }\r\n });\r\n\r\n getStore().blockAdsPage.blockReasonsL2 = dropDownValues;\r\n getStore().blockAdsPage.blockReason = undefined;\r\n});\r\n\r\nmutator(onBlockAdsChannelsChanged, (msg) => {\r\n getStore().blockAdsPage.channels[msg.accountId] = msg.channelId;\r\n});\r\n\r\nmutator(onBlockAdsRevenueChanged, (msg) => {\r\n getStore().blockAdsPage.adPerfBlockAdsData[msg.index].revenue = msg.value;\r\n});\r\n\r\nmutator(onBlockAdsListingsChanged, (msg) => {\r\n getStore().blockAdsPage.adPerfBlockAdsData[msg.index].adListingsData = msg.value;\r\n});\r\n\r\nmutator(onBlockAdsBlockReasonChanged, (msg) => {\r\n const blockReason = (getStore().blockAdsPage.blockReasonL1 + ' - ' + msg.value.key) as string;\r\n getStore().blockAdsPage.blockReason = blockReason;\r\n});\r\n\r\nmutator(onBlockAdsBlockDetailsChanged, (msg) => {\r\n getStore().blockAdsPage.blockDetails = msg.value;\r\n});\r\n\r\nmutator(onAdListingPageSelection, (msg) => {\r\n if (getStore().blockAdsPage.adPerfBlockAdsData[msg.index!].adListingsData) {\r\n getStore().blockAdsPage.adPerfBlockAdsData[msg.index!].adListingsData!.adListingSelectedPage = msg.value as number;\r\n }\r\n});\r\n\r\nmutator(onBlockAdsErrorChanged, (msg) => {\r\n getStore().errors = msg.values || {};\r\n});\r\n\r\nmutator(onBlockImagesErrorChanged, (msg) => {\r\n getStore().errors = msg.values || {};\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport {\r\n onBlockAdsDataChanged,\r\n onBlockedAdsExportClicked,\r\n onBlockedImagesExportClicked,\r\n onBlockSummaryEndDateChanged,\r\n onBlockSummaryStartDateChanged,\r\n onSAMBlockAdsDataChanged,\r\n} from '../actions';\r\nimport { getStore } from '../store/store';\r\n\r\nmutator(onBlockAdsDataChanged, (msg) => {\r\n getStore().active.blockSummaryData = msg.data;\r\n});\r\n\r\nmutator(onSAMBlockAdsDataChanged, (msg) => {\r\n getStore().active.samBlockSummaryData = msg.data;\r\n});\r\n\r\nmutator(onBlockSummaryStartDateChanged, (msg) => {\r\n getStore().active.blockSummaryStartDate = msg.startDate;\r\n});\r\n\r\nmutator(onBlockSummaryEndDateChanged, (msg) => {\r\n if (msg.endDate) {\r\n getStore().active.blockSummaryEndDate = new Date(\r\n msg.endDate.getFullYear(),\r\n msg.endDate.getMonth(),\r\n msg.endDate.getDate(),\r\n 23,\r\n 59,\r\n 59,\r\n 999\r\n );\r\n }\r\n});\r\n\r\nmutator(onBlockedAdsExportClicked, (msg) => {\r\n getStore().columns = msg.columns;\r\n});\r\n\r\nmutator(onBlockedImagesExportClicked, (msg) => {\r\n getStore().columns = msg.columns;\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { onBlockedAdsContextChanged, onBlockedImagesContextChanged } from '../actions';\r\nimport { getStore } from '../store/store';\r\n\r\nmutator(onBlockedAdsContextChanged, msg => {\r\n getStore().blockedAdsContext = msg.data;\r\n});\r\n\r\nmutator(onBlockedImagesContextChanged, msg => {\r\n getStore().blockedImagesContext = msg.data;\r\n});\r\n","import { mutator } from 'satcheljs';\r\n\r\nimport { onFilterPanelHide, onFilterPanelShown } from '../actions';\r\nimport { getStore } from '../store/store';\r\n\r\nmutator(onFilterPanelShown, (msg) => {\r\n const store = getStore();\r\n store.filterPanel = msg.filterPanel;\r\n});\r\n\r\nmutator(onFilterPanelHide, () => {\r\n const store = getStore();\r\n store.filterPanel = undefined;\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { AdSource, ApiError, LifeCycleStatus, getAppStore, onNotificationChanged } from '../../../../../@data';\r\nimport { buildRequestHeadersWithAuthToken } from '../../../../../@data/utils/requestUtils';\r\nimport { adQualityLocales } from '../../../../../config/locale';\r\nimport { uiConfig } from '../../../../../config/ui.config';\r\nimport messages from '../../AdReview/AdCreativePage.messages';\r\nimport { IAdListingSample } from '../store/schema';\r\nimport { IAdListingsData } from '../store/schema/IAdListingsData';\r\nimport {\r\n AdPerformanceData,\r\n BlockAdsData,\r\n BlockImagessData,\r\n BlockedContext,\r\n InvertedAdDetails,\r\n SAMBlockAdData,\r\n} from '../store/schema/models';\r\nimport { IAdReviewModel } from '../store/schema/models/AdReviewModel';\r\nimport { BlockRequestSourceData } from '../store/schema/models/BlockRequestSourceData';\r\nimport { getStore } from '../store/store';\r\nimport { constructUrl, handleError, sanitizeBingImageUrl } from './utility/utility';\r\n\r\nexport const baseAddress = uiConfig.getAdQualityApiBaseAddress();\r\n\r\nexport async function getBlockedAdContext(publisherId: number): Promise<BlockedContext> {\r\n const { userContext } = getAppStore();\r\n const blockedDataUrl =\r\n baseAddress + 'adblockdata/adunitadidtuples/' + publisherId.toString() + '?targetCustomerId=' + publisherId.toString();\r\n\r\n const headers = await buildRequestHeadersWithAuthToken(blockedDataUrl, userContext);\r\n const adunitAdIdPair = await fetch(blockedDataUrl, {\r\n method: 'GET',\r\n headers: headers,\r\n });\r\n\r\n const blockedContext: BlockedContext = await adunitAdIdPair.json();\r\n return blockedContext;\r\n}\r\n\r\nexport async function getAdPerfData(body: IAdReviewModel, params: URLSearchParams): Promise<AdPerformanceData[]> {\r\n const { active, blockedAdsContext, blockedImagesContext } = getStore();\r\n const baseUrl = baseAddress + 'adperfdata/search';\r\n const url = constructUrl(baseUrl, [], params);\r\n let headers: Headers;\r\n try {\r\n headers = await buildRequestHeadersWithAuthToken(url);\r\n } catch (createHeaderError) {\r\n return handleError(createHeaderError, url);\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: JSON.stringify(body),\r\n });\r\n\r\n const responseJson = await response.json();\r\n if (response.status === 500) {\r\n const error = `data fetch operation failed for ${url}. Errors: ${response.statusText}`;\r\n return handleError(new ApiError(response.status, error, responseJson.trackingId), url);\r\n }\r\n\r\n let filteredAds = responseJson.adPerformanceData ? responseJson.adPerformanceData : [];\r\n if (active.selectedAdSource === AdSource.Microsoft) {\r\n if (blockedAdsContext) {\r\n const mapAdIdAdunits: Map<number, number[]> = blockedAdsContext.mapAdIdAdunits as Map<number, number[]>;\r\n const mapAdIdAccounts: Map<number, number[]> = blockedAdsContext.mapAdIdAccounts as Map<number, number[]>;\r\n if (mapAdIdAdunits) {\r\n filteredAds = filteredAds.filter((a) => {\r\n if (a.adId) {\r\n return !(Object.keys(mapAdIdAdunits).includes(a.adId!.toString()) && mapAdIdAdunits[a.adId!].includes(a.adUnitId!));\r\n } else {\r\n return true;\r\n }\r\n });\r\n }\r\n if (mapAdIdAccounts) {\r\n filteredAds = filteredAds.filter((a) => {\r\n if (a.adId) {\r\n return !(Object.keys(mapAdIdAccounts).includes(a.adId!.toString()) && mapAdIdAccounts[a.adId!].includes(a.accountId!));\r\n } else {\r\n return true;\r\n }\r\n });\r\n }\r\n if (blockedAdsContext.mapAdIdImages) {\r\n filteredAds.forEach((ad) => {\r\n ad.blockedImages = blockedAdsContext.mapAdIdImages!.get(ad.adId!) || [];\r\n });\r\n }\r\n }\r\n if (blockedImagesContext) {\r\n filteredAds.forEach((ad) => {\r\n ad.blockedAdIdImages = blockedImagesContext;\r\n // we will need the below in case we decide to do the filtering of reported images in UI\r\n // ad.imagesContext = [];\r\n // if (ad.images) {\r\n // ad.images.forEach((image) => {\r\n // const imageMetadata: ImageMetaData = { imageUrl: image, isBlocked: false };\r\n // const imageReportDataTuple = { adId: ad.adId, imageUrl: image };\r\n // if (blockedImagesContext.includes(JSON.stringify(imageReportDataTuple))) {\r\n // imageMetadata.isBlocked = true;\r\n // }\r\n // ad.imagesContext!.push(imageMetadata);\r\n // });\r\n // }\r\n });\r\n }\r\n } else {\r\n // We assume that the block summary is up-to-date for Auction blocked Ads\r\n const locales: string[] = ['global', adQualityLocales[active.selectedMarket!]];\r\n active.samBlockSummaryData?.filter((blockSummary) => blockSummary.locale && locales.includes(blockSummary.locale));\r\n filteredAds.forEach((ad) => {\r\n const blockedAdFind = active.samBlockSummaryData?.find((blockedAd) => ad.uniqueCreativeAdId === blockedAd.creativeAdId);\r\n blockedAdFind && blockedAdFind.status === LifeCycleStatus.Active\r\n ? (ad.status = LifeCycleStatus.Inactive)\r\n : (ad.status = LifeCycleStatus.Active);\r\n });\r\n }\r\n return filteredAds;\r\n } catch (err) {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adCreativeServiceLoadEntityFailed,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n const error = `data fetch operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function getAdIdRevenue(models: string[][], params: URLSearchParams): Promise<number> {\r\n const baseUrl = baseAddress + 'adperfdata';\r\n const url = constructUrl(baseUrl, models, params);\r\n\r\n let headers: Headers;\r\n try {\r\n headers = await buildRequestHeadersWithAuthToken(url);\r\n } catch (createHeaderError) {\r\n return handleError(createHeaderError, url);\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n });\r\n\r\n const responseJson = await response.json();\r\n return responseJson;\r\n } catch (err) {\r\n const error = `data fetch operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function getAdIdDetails(models: string[][], params: URLSearchParams): Promise<IAdListingsData> {\r\n const baseUrl = baseAddress + 'adperfdata';\r\n const url = constructUrl(baseUrl, models, params);\r\n\r\n let headers: Headers;\r\n try {\r\n headers = await buildRequestHeadersWithAuthToken(url);\r\n } catch (createHeaderError) {\r\n return handleError(createHeaderError, url);\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n });\r\n\r\n const responseListingsInverted: InvertedAdDetails = await response.json();\r\n const titlesInverted = responseListingsInverted.adTitles as Map<string, string[]>;\r\n const urlsInverted = responseListingsInverted.adUrls;\r\n const destUrlsInverted = responseListingsInverted.adDestUrls;\r\n const imagesInverted = responseListingsInverted.images;\r\n\r\n const listingSamplesMap: Map<string, IAdListingSample> = new Map();\r\n let listingSamples: IAdListingSample[] = [];\r\n\r\n // Add all Titles, urls, desturls, images to each sample based on its adlisting.\r\n for (const [eachTitle, listingsWithTheTitle] of Object.entries(titlesInverted)) {\r\n listingsWithTheTitle.forEach((eachListing) => {\r\n if (!listingSamplesMap.has(eachListing)) {\r\n listingSamplesMap.set(eachListing, { adTitle: eachTitle } as IAdListingSample);\r\n } else {\r\n const sample = listingSamplesMap.get(eachListing);\r\n if (sample) {\r\n sample.adTitle = eachTitle;\r\n }\r\n }\r\n });\r\n }\r\n\r\n for (const [eachUrl, listingsWithTheUrl] of Object.entries(urlsInverted)) {\r\n listingsWithTheUrl.forEach((eachListing) => {\r\n if (!listingSamplesMap.has(eachListing)) {\r\n listingSamplesMap.set(eachListing, { adUrl: eachUrl } as IAdListingSample);\r\n } else {\r\n const sample = listingSamplesMap.get(eachListing);\r\n if (sample) {\r\n sample.adUrl = eachUrl;\r\n }\r\n }\r\n });\r\n }\r\n\r\n for (const [eachDestUrl, listingsWithTheDestUrl] of Object.entries(destUrlsInverted)) {\r\n listingsWithTheDestUrl.forEach((eachListing) => {\r\n if (!listingSamplesMap.has(eachListing)) {\r\n listingSamplesMap.set(eachListing, { adDestUrl: eachDestUrl } as IAdListingSample);\r\n } else {\r\n const sample = listingSamplesMap.get(eachListing);\r\n if (sample) {\r\n sample.adDestUrl = eachDestUrl;\r\n }\r\n }\r\n });\r\n }\r\n\r\n for (const [eachImage, listingsWithTheImage] of Object.entries(imagesInverted)) {\r\n listingsWithTheImage.forEach((eachListing) => {\r\n if (!listingSamplesMap.has(eachListing)) {\r\n listingSamplesMap.set(eachListing, { adimage: sanitizeBingImageUrl(eachImage) } as IAdListingSample);\r\n } else {\r\n const sample = listingSamplesMap.get(eachListing);\r\n if (sample) {\r\n sample.adImage = sanitizeBingImageUrl(eachImage);\r\n }\r\n }\r\n });\r\n }\r\n\r\n listingSamples = Array.from(listingSamplesMap.values());\r\n\r\n // in case of empty samples we will just push one empty sample to avoid downstream errors.\r\n if (listingSamples.length < 1) {\r\n listingSamples.push({});\r\n }\r\n\r\n const adListingsData: IAdListingsData = {\r\n listingsCount: listingSamples.length,\r\n adListingItems: listingSamples,\r\n adListingSelectedPage: 1,\r\n };\r\n return adListingsData;\r\n } catch (err) {\r\n const error = `data fetch operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function getBlockRequestSources(publisherId: number): Promise<BlockRequestSourceData[]> {\r\n let url = baseAddress + 'adperfdata/blockRequestSources';\r\n url = url.concat('?targetCustomerId=' + publisherId);\r\n\r\n let headers: Headers;\r\n try {\r\n headers = await buildRequestHeadersWithAuthToken(url);\r\n } catch (createHeaderError) {\r\n return handleError(createHeaderError, url);\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n });\r\n const responseJson = await response.json();\r\n return responseJson;\r\n } catch (err) {\r\n const error = `data fetch operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function createAdBlock(body: BlockAdsData[], params: URLSearchParams): Promise<BlockAdsData> {\r\n let url = baseAddress + 'adblockdata/bulkAdBlock';\r\n url = url.concat('?' + params.toString());\r\n\r\n let headers: Headers;\r\n try {\r\n headers = await buildRequestHeadersWithAuthToken(url);\r\n } catch (createHeaderError) {\r\n return handleError(createHeaderError, url);\r\n }\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: JSON.stringify(body),\r\n });\r\n\r\n const responseJson = await response.json();\r\n return responseJson;\r\n } catch (err) {\r\n const error = `data fetch operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function createImageBlock(body: BlockImagessData, params: URLSearchParams): Promise<BlockImagessData> {\r\n let url = baseAddress + 'adblockdata/imagereporting';\r\n\r\n url = url.concat('?' + params.toString());\r\n\r\n let headers: Headers;\r\n try {\r\n headers = await buildRequestHeadersWithAuthToken(url);\r\n } catch (createHeaderError) {\r\n return handleError(createHeaderError, url);\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: JSON.stringify(body),\r\n });\r\n\r\n const responseJson = await response.json();\r\n return responseJson;\r\n } catch (err) {\r\n const error = `ad image blocking failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function createSAMAdBlock(body: SAMBlockAdData[], params: URLSearchParams): Promise<BlockAdsData> {\r\n let url = baseAddress + 'adblockdata/samrtbBulk';\r\n url = url.concat('?' + params.toString());\r\n\r\n let headers: Headers;\r\n try {\r\n headers = await buildRequestHeadersWithAuthToken(url);\r\n } catch (createHeaderError) {\r\n return handleError(createHeaderError, url);\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: JSON.stringify(body),\r\n });\r\n\r\n const responseJson = await response.json();\r\n return responseJson;\r\n } catch (err) {\r\n const error = `Data fetch operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n","import { ApiError, handleError, LifeCycleStatus } from '../../../../../@data';\r\nimport { buildRequestHeadersWithAuthToken } from '../../../../../@data/utils/requestUtils';\r\nimport { BlockAdsData, BlockImageSummaryData, SAMBlockSummaryData } from '../store/schema/models';\r\nimport { baseAddress } from './AdCreativeService';\r\nimport { constructUrl } from './utility/utility';\r\n\r\nexport async function deactivateBlockedAds(models: string[][], params: URLSearchParams): Promise<number> {\r\n const baseUrl = baseAddress + 'adblockdata';\r\n const url = constructUrl(baseUrl, models, params);\r\n\r\n let headers: Headers;\r\n try {\r\n headers = await buildRequestHeadersWithAuthToken(url);\r\n } catch (createHeaderError) {\r\n return handleError(createHeaderError, url);\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'DELETE',\r\n headers: headers,\r\n });\r\n\r\n const responseJson = await response.json();\r\n return responseJson;\r\n } catch (err) {\r\n const error = `data fetch operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function toggleSAMBlockedAds(params: URLSearchParams, body: string): Promise<number> {\r\n let url = baseAddress + 'adblockdata/samrtbblock';\r\n url = url.concat('?' + params.toString());\r\n\r\n let headers: Headers;\r\n try {\r\n headers = await buildRequestHeadersWithAuthToken(url);\r\n } catch (createHeaderError) {\r\n return handleError(createHeaderError, url);\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'PATCH',\r\n headers: headers,\r\n body: body,\r\n });\r\n\r\n const responseJson = await response.json();\r\n return responseJson;\r\n } catch (err) {\r\n const error = `data fetch operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function getBlockSummaryData(models: string[][], params: URLSearchParams): Promise<BlockAdsData[]> {\r\n const baseUrl = baseAddress + 'adblockdata';\r\n const url = constructUrl(baseUrl, models, params);\r\n let headers: Headers;\r\n try {\r\n headers = await buildRequestHeadersWithAuthToken(url);\r\n } catch (createHeaderError) {\r\n return handleError(createHeaderError, url);\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n });\r\n\r\n const responseJson: BlockAdsData[] = await response.json();\r\n responseJson.forEach((item) => {\r\n const blockReasonParts = item.reasonCategory ? item.reasonCategory.split(' - ') : ' ';\r\n item.blockReasonMainCategory = blockReasonParts[0];\r\n item.blockReasonSubCategory = blockReasonParts[1];\r\n });\r\n return responseJson;\r\n } catch (err) {\r\n const error = `data fetch operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function getSAMBlockSummaryData(models: string[][], params: URLSearchParams): Promise<SAMBlockSummaryData[]> {\r\n const baseUrl = baseAddress + 'adblockdata/samrtb';\r\n const url = constructUrl(baseUrl, models, params);\r\n\r\n let headers: Headers;\r\n try {\r\n headers = await buildRequestHeadersWithAuthToken(url);\r\n } catch (createHeaderError) {\r\n return handleError(createHeaderError, url);\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n });\r\n\r\n const responseJson: SAMBlockSummaryData[] = await response.json();\r\n // Set the LifeCycleStatus based on whether or not the block is applied or disabled\r\n responseJson.forEach((item) => {\r\n const blockReasonParts = item.blockReasonCategory ? item.blockReasonCategory.split(' - ') : ' ';\r\n item.blockReasonMainCategory = blockReasonParts[0];\r\n item.blockReasonSubCategory = blockReasonParts[1];\r\n item.status = item.filterStatus === 'Applied' ? LifeCycleStatus.Active : LifeCycleStatus.Inactive;\r\n });\r\n return responseJson;\r\n } catch (err) {\r\n const error = `data fetch operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function getBlockImagesData(publisherId: number): Promise<BlockImageSummaryData[]> {\r\n const params = new URLSearchParams([\r\n ['targetCustomerId', publisherId.toString()],\r\n ['isNativeAdmin', 'true'],\r\n ]);\r\n const baseUrl = baseAddress + 'adblockdata/image';\r\n const url = constructUrl(baseUrl, [['publisher', publisherId.toString()]], params);\r\n\r\n let headers: Headers;\r\n try {\r\n headers = await buildRequestHeadersWithAuthToken(url);\r\n } catch (createHeaderError) {\r\n return handleError(createHeaderError, url);\r\n }\r\n try {\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n });\r\n\r\n const responseJson: BlockImageSummaryData[] = await response.json();\r\n return responseJson;\r\n } catch (err) {\r\n const error = `data fetch operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function getSAMBlockImageData(adId: string, publisherId: number): Promise<string[]> {\r\n const models = [['images', adId]];\r\n const baseUrl = baseAddress + 'adblockdata/samrtb';\r\n const params = new URLSearchParams([['targetCustomerId', publisherId.toString()]]);\r\n\r\n const url = constructUrl(baseUrl, models, params);\r\n let headers: Headers;\r\n try {\r\n headers = await buildRequestHeadersWithAuthToken(url);\r\n } catch (createHeaderError) {\r\n return handleError(createHeaderError, url);\r\n }\r\n try {\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n });\r\n\r\n const responseJson: [number, string][] = await response.json();\r\n const imageList: string[] = [];\r\n responseJson.forEach((filterImage) => {\r\n const key = 'adImageUrl';\r\n imageList.push(filterImage[key]);\r\n });\r\n return imageList;\r\n } catch (err) {\r\n const error = `Data fetch operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n","import { ImageMetaData, LifeCycleStatus, Model } from '../../../../../../../@data';\r\nimport '../../../../../../../@data/store/schema/models/ImageMetaData';\r\n\r\nexport class AdPerformanceData extends Model {\r\n public apiPath = undefined;\r\n public className = 'adPerformanceData';\r\n public publisherId?: number;\r\n public accountId?: number;\r\n public accountName?: string;\r\n public adUnitId?: number;\r\n public adUnitName?: string;\r\n public advertiserId?: number;\r\n public advertiserAccountId?: number;\r\n public advertiserName?: string;\r\n public adId?: number;\r\n public uniqueCreativeAdId?: string;\r\n public adTitle?: string;\r\n public adDescription?: string;\r\n public adURL?: string;\r\n public adDestUrl?: string;\r\n public adImpressions?: number;\r\n public images?: string[];\r\n public revenue?: number;\r\n public adType?: string;\r\n public adSource?: string;\r\n public adunitIdAdId?: string;\r\n public imagesContext?: ImageMetaData[];\r\n public blockedAdIdImages?: string[];\r\n public blockedImages: string[];\r\n public pagetypes?: string[];\r\n public regions?: string[];\r\n public adProvider?: number;\r\n public status?: LifeCycleStatus;\r\n}\r\n","import { Model } from '../../../../../../../@data';\r\n\r\nexport class BlockAdsData extends Model {\r\n public apiPath = undefined;\r\n public className = 'blockAdsData';\r\n public channelId?: number;\r\n public channelName?: string | null;\r\n public adId?: number;\r\n public adTitle?: string;\r\n public allImages?: string;\r\n public accountName?: string;\r\n public accountId?: number;\r\n public advertiserAccountId?: number;\r\n public advertiserName?: string;\r\n public blockRequestSourceId?: number;\r\n public reason?: string;\r\n public reasonCategory?: string;\r\n public blockReasonMainCategory?: string;\r\n public blockReasonSubCategory?: string;\r\n public modifiedBy?: string;\r\n public modifiedDateTime?: string;\r\n public modifiedByName?: string;\r\n public startDate?: string | null;\r\n public endDate?: string | null;\r\n public isEnabled?: boolean | string;\r\n public pastRevenue?: number;\r\n}\r\n","export class BlockImagessData {\r\n public adId?: number;\r\n public adTitle?: string;\r\n public adUnitId?: number;\r\n public images?: string[];\r\n public blockReason?: string;\r\n public blockReasonComment?: string;\r\n public blockedBy?: number;\r\n public blockSource?: number;\r\n}\r\n","import { Model } from '../../../../../../../@data';\r\n\r\nexport class BlockImageSummaryData extends Model {\r\n public apiPath = undefined;\r\n public className = 'blockImagesSummaryData';\r\n public adId?: number;\r\n public adTitle?: string;\r\n public image?: string;\r\n public adUnitId?: number;\r\n public blockReason?: string;\r\n public blockReasonComment?: string;\r\n public reportedBy?: number;\r\n public reportedByName?: string;\r\n public modifiedDateTime?: string;\r\n}\r\n","export enum BlockItemType {\r\n Ads,\r\n Images,\r\n}\r\n","import { Model } from '../../../../../../../@data';\r\n\r\nexport class SAMBlockAdData extends Model {\r\n public apiPath = undefined;\r\n public className = 'samBlockAdsData';\r\n public creativeAdId?: string;\r\n public adTitle?: string;\r\n public allAdImages?: string[];\r\n public advertiserName?: string;\r\n public adProvider?: string;\r\n public blockRequestSourceId?: number;\r\n public reasonCategoryId?: number;\r\n public reasonCategoryString?: string;\r\n public blockReasonMainCategory?: string;\r\n public blockReasonSubCategory?: string;\r\n public reasonComment?: string;\r\n public modifiedBy?: number;\r\n public publisherId?: number;\r\n public sevenDayRevenueImpact?: number;\r\n public localeScope?: string;\r\n public filterSource?: string;\r\n}\r\n","import { LifeCycleStatus, Model } from '../../../../../../../@data';\r\n\r\nexport class SAMBlockSummaryData extends Model {\r\n public apiPath = undefined;\r\n public className = 'samBlockSummaryData';\r\n public filterId?: number;\r\n public filterScope?: string;\r\n public creativeAdId?: string;\r\n public adTitle?: string;\r\n public advertiser?: string;\r\n public sevenDayRevenueImpact?: number;\r\n public adProvider?: string;\r\n public blockRequestSourceId?: number;\r\n public locale?: string;\r\n public allAdImages?: string[];\r\n public blockReasonCategory?: string;\r\n public blockReasonMainCategory?: string;\r\n public blockReasonSubCategory?: string;\r\n public blockReasonComment?: string;\r\n public reportedBy?: number;\r\n public reportedByName?: string;\r\n public modifiedDateTime?: string;\r\n public filterStatus?: string;\r\n public status?: LifeCycleStatus;\r\n}\r\n","import { array, mixed, object, string } from 'yup';\r\nimport { StringListSchemaYupType } from '../../../../../../utils';\r\nimport { IBlockItemViewModel } from './IBlockItemViewModel';\r\nimport { BlockItemType } from './models';\r\n\r\nexport function blockItemErrorModel() {\r\n return object<IBlockItemViewModel>().shape({\r\n blockReason: string().required(),\r\n blockItemType: mixed().oneOf([BlockItemType.Ads, BlockItemType.Images]),\r\n adPerfBlockAdsData: array().of(\r\n object().shape({\r\n blockedImages: new StringListSchemaYupType().when('blockItemType', {\r\n is: BlockItemType.Images,\r\n then: array().required('Please select atleast one image to block'),\r\n otherwise: array(),\r\n }),\r\n })\r\n ),\r\n blockDetails: string().max(200),\r\n });\r\n}\r\n","import { orchestrator } from 'satcheljs';\r\nimport { onTeachingBubbleEndDateStatusChanged, onTeachingBubbleStartDateStatusChanged } from '../actions';\r\nimport {\r\n onAdCreativeEndDateChanged, onAdCreativeStartDateChanged\r\n} from '../actions/onAdCreativeChanged';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onAdCreativeStartDateChanged, async (msg) => {\r\n onAdCreativeDateChanged(onTeachingBubbleStartDateStatusChanged);\r\n});\r\n\r\norchestrator(onAdCreativeEndDateChanged, async (msg) => {\r\n onAdCreativeDateChanged(onTeachingBubbleEndDateStatusChanged);\r\n});\r\n\r\nfunction onAdCreativeDateChanged(onTeachingBubbbleStatusChanged) {\r\n const { active } = getStore();\r\n const queryMayTimeoutDays = 5;\r\n const milisecondsToDays = 1000*3600*24;\r\n\r\n if (active.endDate !== undefined && active.startDate !== undefined\r\n && active.endDate.toString().length !== 0 && active.startDate.toString().length !== 0) {\r\n const diffInDays = (active.endDate.getTime() - active.startDate.getTime()) / milisecondsToDays;\r\n if (diffInDays > queryMayTimeoutDays){\r\n onTeachingBubbbleStatusChanged(true);\r\n }\r\n }\r\n}\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { getAppStore, onNotificationChanged, onSavingChanged } from '../../../../../@data';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport { validateSchema } from '../../../../../utils';\r\nimport messages from '../../AdReview/AdCreativePage.messages';\r\nimport {\r\n onAdCreativeBlockPanelChanged,\r\n onAdCreativeRefreshDataChanged,\r\n onBlockAdsErrorChanged,\r\n onBlockedAdsContextChanged,\r\n onMSANBlockAdsSubmitted,\r\n onRefreshBlockSummary,\r\n} from '../actions';\r\nimport { getBlockImagesData } from '../services/AdBlockService';\r\nimport { createAdBlock, getBlockedAdContext } from '../services/AdCreativeService';\r\nimport { blockItemErrorModel } from '../store/schema/BlockItemErrorModel';\r\nimport { BlockItemType } from '../store/schema/models';\r\nimport { BlockAdsData } from '../store/schema/models/BlockAdsData';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onMSANBlockAdsSubmitted, async (msg) => {\r\n const { publisher, userContext } = getAppStore();\r\n const { blockAdsPage } = getStore();\r\n\r\n let notification: INotificationBarItem = {};\r\n if (publisher && publisher.id && userContext) {\r\n const body: BlockAdsData[] = [];\r\n blockAdsPage.adPerfBlockAdsData.forEach(async (item, index) => {\r\n const block: BlockAdsData = new BlockAdsData();\r\n block.channelId = blockAdsPage.channels[item.accountId!];\r\n block.channelName = null;\r\n block.adId = item.adId;\r\n block.adTitle = item.adTitle;\r\n block.reason = blockAdsPage.blockDetails;\r\n block.reasonCategory = blockAdsPage.blockReason;\r\n block.advertiserAccountId = item.advertiserAccountId;\r\n block.blockRequestSourceId = blockAdsPage.selectedBlockRequestSource;\r\n block.modifiedBy = userContext.id.toString();\r\n block.modifiedDateTime = new Date(Date.now()).toISOString();\r\n block.startDate = null;\r\n block.endDate = null;\r\n block.isEnabled = true;\r\n block.pastRevenue = item.revenue ? item.revenue : 0;\r\n const imgs = item.images ? item.images : [];\r\n block.allImages = imgs.join('___');\r\n\r\n body.push(block);\r\n });\r\n\r\n const params = new URLSearchParams([['targetCustomerId', publisher.id!.toString()]]);\r\n\r\n try {\r\n onAdCreativeBlockPanelChanged(true, BlockItemType.Ads);\r\n await validateSchema(blockItemErrorModel(), blockAdsPage);\r\n onBlockAdsErrorChanged();\r\n } catch (e) {\r\n onBlockAdsErrorChanged(e);\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityBlockAdsMissingFields,\r\n intlMessageValues: { count: Object.keys(e).length },\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n return;\r\n }\r\n\r\n onSavingChanged(true);\r\n try {\r\n await createAdBlock(body, params);\r\n notification = {\r\n textMessageDescriptor: messages.adqualityBlockedAdsSuccessfully,\r\n messageBarType: MessageBarType.success,\r\n };\r\n onNotificationChanged(notification);\r\n } catch (e) {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityFailedToBlockAds,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } finally {\r\n // TODO: Figure out why using onBlockedContextChanged isnt working anymore\r\n const blockedAdContext = await getBlockedAdContext(publisher.id!);\r\n blockedAdContext.mapAdIdImages = new Map<number, string[]>();\r\n const blockedImageSummary = await getBlockImagesData(publisher.id!);\r\n blockedImageSummary.forEach((element) => {\r\n if (blockedAdContext.mapAdIdImages) {\r\n if (blockedAdContext.mapAdIdImages.has(element.adId!)) {\r\n blockedAdContext.mapAdIdImages.get(element.adId!)!.push(element.image!);\r\n } else {\r\n blockedAdContext.mapAdIdImages.set(element.adId!, [element.image!]);\r\n }\r\n }\r\n });\r\n onBlockedAdsContextChanged(blockedAdContext);\r\n onRefreshBlockSummary();\r\n onAdCreativeBlockPanelChanged(false);\r\n onSavingChanged(false);\r\n onAdCreativeRefreshDataChanged();\r\n }\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityInvalidState,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { getAppStore, LifeCycleStatus, onLoadingChanged, onNotificationChanged, onSavingChanged } from '../../../../../@data';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport { adQualityLocales } from '../../../../../config/locale';\r\nimport messages from '../../AdReview/AdCreativePage.messages';\r\nimport { onSAMBlockAdsDataChanged, onSAMBlockAdsItemStatusChanged } from '../actions';\r\nimport { getSAMBlockSummaryData, toggleSAMBlockedAds } from '../services/AdBlockService';\r\nimport { SAMBlockSummaryData } from '../store/schema/models';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onSAMBlockAdsItemStatusChanged, async (msg) => {\r\n const { publisher, userContext } = getAppStore();\r\n const status = msg.status;\r\n const creativeAdId = msg.data.creativeAdId;\r\n const locale = msg.data.locale;\r\n\r\n let notification: INotificationBarItem = {};\r\n let params;\r\n\r\n if (publisher && publisher.id && userContext && creativeAdId && locale) {\r\n params = new URLSearchParams([\r\n ['targetCustomerId', publisher.id.toString()],\r\n ['creativeId', creativeAdId],\r\n ['locale', locale],\r\n ]);\r\n\r\n onSavingChanged(true);\r\n onLoadingChanged(true);\r\n\r\n try {\r\n let result, filterStatusId;\r\n\r\n if (status === LifeCycleStatus.Inactive) {\r\n // Set the filter to the 'Disabled' status\r\n filterStatusId = '4';\r\n result = await toggleSAMBlockedAds(params, filterStatusId);\r\n } else if (status === LifeCycleStatus.Active) {\r\n // Set the filter to the 'Applied' status\r\n filterStatusId = '1';\r\n result = await toggleSAMBlockedAds(params, filterStatusId);\r\n }\r\n\r\n if (result) {\r\n const active = getStore().active;\r\n const samBlockSummaryParams = new URLSearchParams([\r\n ['targetCustomerId', publisher.id.toString()],\r\n ['NumImages', 2],\r\n ]);\r\n let samBlockSummaryData: SAMBlockSummaryData[] = [];\r\n if (active.selectedMarket) {\r\n samBlockSummaryData = await getSAMBlockSummaryData([['publisher', publisher.id!.toString()]], samBlockSummaryParams);\r\n if (active.selectedBlockedMarketId !== undefined) {\r\n if (active.selectedBlockedMarketId === 0) {\r\n samBlockSummaryData.filter((blockSummary) => blockSummary.locale === 'global');\r\n } else {\r\n samBlockSummaryData.filter(\r\n (blockSummary) =>\r\n blockSummary.locale === 'global' || blockSummary.locale === adQualityLocales[active.selectedBlockedMarketId!]\r\n );\r\n }\r\n }\r\n }\r\n\r\n samBlockSummaryData.forEach((item) => {\r\n item.status = item.filterStatus === 'Applied' ? (item.status = LifeCycleStatus.Active) : (item.status = LifeCycleStatus.Inactive);\r\n });\r\n\r\n onSAMBlockAdsDataChanged(samBlockSummaryData);\r\n\r\n notification = {\r\n text: `Update blocked ads ${creativeAdId} status success`,\r\n messageBarType: MessageBarType.success,\r\n };\r\n\r\n onNotificationChanged(notification);\r\n }\r\n } catch (e) {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityUpdateBlockedAdsStatusFailed,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } finally {\r\n onLoadingChanged(false);\r\n onSavingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityInvalidState,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { getAppStore, onNotificationChanged, onSavingChanged } from '../../../../../@data';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport { adQualityLocales } from '../../../../../config/locale';\r\nimport { validateSchema } from '../../../../../utils';\r\nimport messages from '../../AdReview/AdCreativePage.messages';\r\nimport {\r\n onAdCreativeBlockPanelChanged,\r\n onAdCreativeRefreshDataChanged,\r\n onBlockAdsErrorChanged,\r\n onRefreshBlockSummary,\r\n onSAMBlockAdsSubmitted,\r\n} from '../actions';\r\nimport { createSAMAdBlock } from '../services/AdCreativeService';\r\nimport { samBlockItemErrorModel } from '../store/schema/SAMBlockItemErrorModel';\r\nimport { BlockItemType, SAMBlockAdData } from '../store/schema/models';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onSAMBlockAdsSubmitted, async (msg) => {\r\n const { publisher, userContext } = getAppStore();\r\n const { blockAdsPage } = getStore();\r\n\r\n let notification: INotificationBarItem = {};\r\n if (publisher && publisher.id && userContext) {\r\n const body: SAMBlockAdData[] = [];\r\n blockAdsPage.adPerfBlockAdsData.forEach(async (item, index) => {\r\n const block: SAMBlockAdData = new SAMBlockAdData();\r\n block.creativeAdId = item.uniqueCreativeAdId;\r\n block.adTitle = item.adTitle;\r\n block.allAdImages = item.images;\r\n block.advertiserName = item.advertiserName;\r\n block.adProvider = item.adProvider;\r\n block.blockRequestSourceId = blockAdsPage.selectedBlockRequestSource;\r\n block.reasonCategoryString = blockAdsPage.blockReason;\r\n block.reasonComment = blockAdsPage.blockDetails;\r\n block.modifiedBy = userContext.id;\r\n block.publisherId = publisher.id;\r\n block.sevenDayRevenueImpact = item.revenue;\r\n block.filterSource = 'TakedownTool';\r\n if (blockAdsPage.selectedMarket) {\r\n block.localeScope = blockAdsPage.selectedMarket === 'All' ? 'global' : adQualityLocales[blockAdsPage.selectedMarket];\r\n }\r\n body.push(block);\r\n });\r\n\r\n const params = new URLSearchParams([['targetCustomerId', publisher.id!.toString()]]);\r\n try {\r\n onAdCreativeBlockPanelChanged(true, BlockItemType.Ads);\r\n await validateSchema(samBlockItemErrorModel(), blockAdsPage);\r\n onBlockAdsErrorChanged();\r\n } catch (e) {\r\n onBlockAdsErrorChanged(e);\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityBlockAdsMissingFields,\r\n intlMessageValues: { count: Object.keys(e).length },\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n return;\r\n }\r\n\r\n onSavingChanged(true);\r\n try {\r\n await createSAMAdBlock(body, params);\r\n notification = {\r\n textMessageDescriptor: messages.adqualityBlockedAdsSuccessfully,\r\n messageBarType: MessageBarType.success,\r\n };\r\n onNotificationChanged(notification);\r\n } catch (e) {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityFailedToBlockAds,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } finally {\r\n onRefreshBlockSummary();\r\n onAdCreativeBlockPanelChanged(false);\r\n onSavingChanged(false);\r\n onAdCreativeRefreshDataChanged();\r\n }\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityInvalidState,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { mixed, object, string } from 'yup';\r\nimport { AdSource } from '../../../../../../@data';\r\nimport { IBlockItemViewModel } from './IBlockItemViewModel';\r\nimport { BlockItemType } from './models';\r\n\r\nexport function samBlockItemErrorModel() {\r\n return object<IBlockItemViewModel>().shape({\r\n selectedMarket: string().when('adSource', {\r\n is: AdSource.Auction,\r\n then: string().required(),\r\n }),\r\n blockReason: string().required(),\r\n blockItemType: mixed().oneOf([BlockItemType.Ads, BlockItemType.Images]),\r\n });\r\n}\r\n","import { orchestrator } from 'satcheljs';\r\nimport { getAppStore, onLoadingChanged } from '../../../../../@data';\r\nimport {\r\n onAdCreativeBlockPanelChanged,\r\n onBlockAdsImagesChanged,\r\n onBlockImageAdsChanged,\r\n onSAMBlockSummaryViewImagesClicked,\r\n} from '../actions';\r\nimport { getSAMBlockImageData } from '../services/AdBlockService';\r\nimport { BlockItemType } from '../store/schema/models';\r\n\r\norchestrator(onSAMBlockSummaryViewImagesClicked, async (msg) => {\r\n if (msg.item.creativeAdId) {\r\n onLoadingChanged(true);\r\n const images = await getSAMBlockImageData(msg.item.creativeAdId, getAppStore().publisher!.id);\r\n onBlockImageAdsChanged([\r\n { apiPath: msg.item.apiPath, className: msg.item.className, blockedImages: [], uniqueCreativeAdId: msg.item.creativeAdId },\r\n ]);\r\n onBlockAdsImagesChanged(images, 0, false, true);\r\n onLoadingChanged(false);\r\n onAdCreativeBlockPanelChanged(true, BlockItemType.Images);\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { AdSource, onNotificationChanged } from '../../../../../@data';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport messages from '../../AdReview/AdCreativePage.messages';\r\nimport { onAdCreativeExportClicked } from '../actions';\r\nimport { exportCSV } from '../services/utility/utility';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onAdCreativeExportClicked, async (msg) => {\r\n let notification: INotificationBarItem = {};\r\n const adSource = getStore().active.selectedAdSource;\r\n\r\n const adPerfForCSVFromTable = getStore().active.adPerfData;\r\n const columns = getStore().columns;\r\n if (adPerfForCSVFromTable) {\r\n if (adSource === AdSource.Microsoft && columns) {\r\n exportCSV(adPerfForCSVFromTable, 'publisher_ad_performance.csv', columns);\r\n } else if (columns) {\r\n exportCSV(adPerfForCSVFromTable, 'publisher_auction_ad_performance.csv', columns);\r\n }\r\n\r\n notification = {\r\n textMessageDescriptor: messages.adqualityAdPerformanceDataDownloadSuccess,\r\n messageBarType: MessageBarType.success,\r\n };\r\n onNotificationChanged(notification);\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityNoDataToDownload,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { IDropdownOption } from '@fluentui/react';\r\nimport { mutatorAction } from 'satcheljs';\r\nimport { FilterCondition } from '../../../../../@data/store/schema/enums/FilterCondition';\r\nimport { IIdNamePair } from '../../../../../components/MultiSelectPicker';\r\nimport { AdQualityFilterNames } from '../store/schema';\r\nimport { defaultInitialTextFilterState, getStore } from '../store/store';\r\n\r\nexport const onDropdownValueChanged = mutatorAction(\r\n 'onDropDownValueChanged',\r\n (heading: string, value: IDropdownOption<FilterCondition>, index: number) => {\r\n const t = getStore().filters.active?.[heading];\r\n t.conditions[index].condition! = value.key;\r\n }\r\n);\r\n\r\nexport const onTextBoxValueChanged = mutatorAction('onTextBoxValueChanged', (heading: string, value: string, index: number) => {\r\n const t = getStore().filters.active?.[heading];\r\n t.conditions[index].value = value;\r\n});\r\n\r\nexport const onDeleteTextCondition = mutatorAction(\r\n 'onDeleteTextCondition',\r\n (heading: string, filterOption: FilterCondition, val: string) => {\r\n const rawFilters = getStore().filters.raw;\r\n\r\n if (rawFilters && rawFilters[heading] && rawFilters[heading].conditions) {\r\n const conditions = rawFilters[heading].conditions;\r\n const index = conditions.findIndex((c) => c.condition === filterOption && c.value === val);\r\n if (index >= 0) {\r\n conditions.splice(index, 1);\r\n }\r\n if (conditions.length === 0) {\r\n conditions.push(defaultInitialTextFilterState);\r\n }\r\n }\r\n }\r\n);\r\n\r\nexport const onListValueChanged = mutatorAction('onListValueChanged', (heading: string, val: string) => {\r\n const rawFilters = getStore().filters.raw;\r\n if (rawFilters && rawFilters[heading]) {\r\n const listValues = rawFilters[heading].values;\r\n const index = listValues.findIndex((c) => c.name === val);\r\n listValues[index].isSelected = false;\r\n }\r\n});\r\n\r\nexport const onClearAll = mutatorAction('onClearAll', () => {\r\n const filterListType = [AdQualityFilterNames.AccountName];\r\n\r\n const filterTextType = [\r\n AdQualityFilterNames.CreativeAdId,\r\n AdQualityFilterNames.Advertiser,\r\n AdQualityFilterNames.AdvertiserId,\r\n AdQualityFilterNames.AdvertiserAccountId,\r\n AdQualityFilterNames.AdId,\r\n AdQualityFilterNames.AdTitle,\r\n AdQualityFilterNames.AdURL,\r\n AdQualityFilterNames.LongHeadline,\r\n AdQualityFilterNames.ShortHeadline,\r\n ];\r\n const rawFilters = getStore().filters.raw;\r\n filterTextType.forEach((elem: string) => {\r\n if (rawFilters && rawFilters[elem].conditions) {\r\n rawFilters[elem].conditions = [defaultInitialTextFilterState];\r\n }\r\n });\r\n filterListType.forEach((elem: string) => {\r\n if (rawFilters && rawFilters[elem]) {\r\n rawFilters[elem].values.forEach((elemList: IIdNamePair) => {\r\n elemList.isSelected = false;\r\n });\r\n }\r\n });\r\n});\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { IIdNamePair } from '../../../../../components/MultiSelectPicker';\r\nimport { deepClone } from '../../../../../utils';\r\nimport { AdQualityFilterNames, IAdQualityFilter } from '../store/schema';\r\nimport { getStore } from '../store/store';\r\n\r\nexport const onAdCreativeInitialAccountsChanged = mutatorAction(\r\n 'onAdCreativeInitialAccountsChanged',\r\n (accounts: IIdNamePair[], account: number | undefined) => {\r\n const rawAccounts = getStore().filters?.raw?.[AdQualityFilterNames.AccountName];\r\n if (rawAccounts) {\r\n rawAccounts.values = accounts;\r\n }\r\n\r\n if (account) {\r\n rawAccounts?.values.map((item: IIdNamePair) => {\r\n if (item.id === account) {\r\n item.isSelected = true;\r\n }\r\n return item;\r\n });\r\n }\r\n }\r\n);\r\n\r\nexport const onAdCreativeInitialAdProvidersChanged = mutatorAction(\r\n 'onAdCreativeInitialAdProvidersChanged',\r\n (auctionAdProviders: IIdNamePair[]) => {\r\n const adProviders = getStore().filters?.raw?.[AdQualityFilterNames.AdProviders];\r\n if (adProviders) {\r\n adProviders.values = auctionAdProviders;\r\n }\r\n }\r\n);\r\n\r\nexport const onAdCreativeInitialMarketsChanged = mutatorAction('onAdCreativeInitialMarketsChanged', (auctionMarkets: IIdNamePair[]) => {\r\n const locales = getStore().filters?.raw?.Markets;\r\n if (locales) {\r\n locales.values = auctionMarkets;\r\n }\r\n});\r\n\r\nexport const onActiveFilterValuesChanged = mutatorAction(\r\n 'onActiveFilterValuesChanged',\r\n function filterValuesChanged(raw: IAdQualityFilter) {\r\n getStore().filters.active = deepClone(raw);\r\n }\r\n);\r\n\r\nexport const onRawFilterValuesChanged = mutatorAction('onRawFilterValuesChanged', function filterValuesChanged(active: IAdQualityFilter) {\r\n for (const key in active) {\r\n if (active[key] && active[key].conditions) {\r\n const lastElement = active[key].conditions[active[key].conditions.length - 1];\r\n if (lastElement.condition === undefined || lastElement.value === '') {\r\n lastElement.condition = undefined;\r\n lastElement.value = '';\r\n lastElement.isApplied = false;\r\n }\r\n }\r\n }\r\n\r\n getStore().filters.raw = deepClone(active);\r\n});\r\n\r\nexport const onSetIsAppliedForAllConditions = mutatorAction(\r\n 'onSetIsAppliedForAllConditions',\r\n function setIsAppliedForAllConditions(active: IAdQualityFilter) {\r\n for (const key in active) {\r\n if (active[key] && active[key].conditions) {\r\n active[key].conditions.forEach((triplet) => {\r\n if (triplet.condition && triplet.value !== '') {\r\n triplet.isApplied = true;\r\n } else {\r\n triplet.isApplied = false;\r\n }\r\n });\r\n }\r\n }\r\n }\r\n);\r\n","import { AdSource } from '../../../../../@data';\r\nimport { FilterCondition } from '../../../../../@data/store/schema/enums/FilterCondition';\r\nimport { IIdNamePair } from '../../../../../components/MultiSelectPicker';\r\nimport { adQualityLocales } from '../../../../../config/locale';\r\nimport { AdQualityFilterNames, IConditionValue } from './schema';\r\nimport { IAdReviewModel } from './schema/models/AdReviewModel';\r\nimport { getStore } from './store';\r\n\r\nenum ConditionType {\r\n Text,\r\n Numerical,\r\n}\r\n\r\nfunction idAggregation(condition: FilterCondition, val: string): string {\r\n let result: string = '';\r\n switch (condition) {\r\n case FilterCondition.Equals:\r\n result = val;\r\n break;\r\n case FilterCondition.DoesNotEqual:\r\n result = '-'.concat(val);\r\n break;\r\n default:\r\n break;\r\n }\r\n return result;\r\n}\r\n\r\nfunction textAggregation(condition: FilterCondition, val: string): string {\r\n let result: string = '';\r\n val = val.trim();\r\n switch (condition) {\r\n case FilterCondition.Contains:\r\n result = val;\r\n break;\r\n case FilterCondition.DoesNotContain:\r\n const tokens = val.split(' ');\r\n result = tokens.map((token) => (token = '-'.concat(token))).join(' ');\r\n break;\r\n case FilterCondition.BeginsWith:\r\n result = val.concat('*');\r\n break;\r\n case FilterCondition.Equals:\r\n result = '\"'.concat(val).concat('\"');\r\n break;\r\n case FilterCondition.DoesNotEqual:\r\n result = '-\"'.concat(val).concat('\"');\r\n break;\r\n default:\r\n break;\r\n }\r\n return result;\r\n}\r\n\r\nfunction getAggregation(type: ConditionType, condition?: FilterCondition, val?: string): string {\r\n let result: string = '';\r\n\r\n if (condition !== undefined && val !== undefined) {\r\n switch (type) {\r\n case ConditionType.Text:\r\n result = textAggregation(condition, val);\r\n break;\r\n\r\n case ConditionType.Numerical:\r\n result = idAggregation(condition, val);\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nfunction getMultiTextValues(triplets: IConditionValue<string>[] | undefined, type: ConditionType): string[] {\r\n const values = triplets?.map((triplet: IConditionValue<string>) => getAggregation(type, triplet.condition, triplet.value));\r\n const result: string = values ? values?.filter((value: string) => value !== '').join(' | ') : '';\r\n return result !== '' ? [result] : [];\r\n}\r\n\r\nexport function getAdQualityListValues(list: IIdNamePair[] | undefined) {\r\n const result: string[] = [];\r\n if (list) {\r\n list.forEach((item: IIdNamePair) => {\r\n if (item.isSelected) {\r\n result.push(adQualityLocales[item.id]);\r\n }\r\n });\r\n }\r\n return result;\r\n}\r\n\r\nfunction getIdListValues(list: IIdNamePair[] | undefined) {\r\n const result: number[] = [];\r\n if (list) {\r\n list.forEach((item: IIdNamePair) => {\r\n if (item.isSelected) {\r\n result.push(item.id);\r\n }\r\n });\r\n }\r\n return result;\r\n}\r\n\r\nfunction getIdValues(list: IIdNamePair[] | undefined) {\r\n const result: string[] = [];\r\n if (list) {\r\n list.forEach((item: IIdNamePair) => {\r\n if (item.isSelected) {\r\n result.push(item.id.toString());\r\n }\r\n });\r\n }\r\n return result;\r\n}\r\n\r\nexport function converterIn(adSource: AdSource, rawFilter: boolean): IAdReviewModel {\r\n const filters = rawFilter ? getStore().filters.raw : getStore().filters.active;\r\n const result: IAdReviewModel = {\r\n Filters: {\r\n Text: {\r\n adProviders: getIdValues(filters?.[AdQualityFilterNames.AdProviders]?.values),\r\n locales: getAdQualityListValues(filters?.[AdQualityFilterNames.Markets]?.values),\r\n uniqueCreativeAdIds: getMultiTextValues(filters?.[AdQualityFilterNames.CreativeAdId]?.conditions, ConditionType.Numerical),\r\n advertiserNames: getMultiTextValues(filters?.[AdQualityFilterNames.Advertiser]?.conditions, ConditionType.Text),\r\n adIds: getMultiTextValues(filters?.[AdQualityFilterNames.AdId]?.conditions, ConditionType.Numerical),\r\n advertiserIds: getMultiTextValues(filters?.[AdQualityFilterNames.AdvertiserId]?.conditions, ConditionType.Numerical),\r\n advertiserAccountIds: getMultiTextValues(filters?.[AdQualityFilterNames.AdvertiserAccountId]?.conditions, ConditionType.Numerical),\r\n adTitles: getMultiTextValues(filters?.[AdQualityFilterNames.AdTitle]?.conditions, ConditionType.Text),\r\n adUrls: getMultiTextValues(filters?.[AdQualityFilterNames.AdURL]?.conditions, ConditionType.Text),\r\n longHeadlines: getMultiTextValues(filters?.[AdQualityFilterNames.LongHeadline]?.conditions, ConditionType.Text),\r\n shortHeadlines: getMultiTextValues(filters?.[AdQualityFilterNames.ShortHeadline]?.conditions, ConditionType.Text),\r\n },\r\n Numerical: {\r\n accountIds: getIdListValues(filters?.[AdQualityFilterNames.AccountName]?.values),\r\n adUnitIds: [],\r\n },\r\n },\r\n };\r\n\r\n if (adSource === AdSource.Microsoft) {\r\n delete result.Filters?.Text?.locales;\r\n delete result.Filters?.Text?.adProviders;\r\n }\r\n\r\n if (adSource !== AdSource.Microsoft) {\r\n delete result.Filters?.Text?.longHeadlines;\r\n delete result.Filters?.Text?.shortHeadlines;\r\n }\r\n\r\n return result;\r\n}\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport {\r\n Account,\r\n AdSource,\r\n LifeCycleStatus,\r\n Publisher,\r\n getAppStore,\r\n listEntity,\r\n onLoadingChanged,\r\n onNotificationChanged,\r\n} from '../../../../../@data';\r\nimport { IIdNamePair } from '../../../../../components/MultiSelectPicker';\r\nimport messages from '../../AdReview/AdCreativePage.messages';\r\nimport { onAdCreativeChanged, onBlockedContextChanged } from '../actions';\r\nimport { onAdCreativePageInitialized } from '../actions/onAdCreativePageInitialized';\r\nimport { onAdCreativeInitialAccountsChanged } from '../mutatorActions';\r\nimport { getBlockSummaryData } from '../services/AdBlockService';\r\nimport { getAdPerfData, getBlockRequestSources } from '../services/AdCreativeService';\r\nimport { TARGET_CUSTOMER_ID } from '../services/utility/constants';\r\nimport { constructAdPerfRequest } from '../services/utility/utility';\r\nimport { converterIn } from '../store/adQualityConverter';\r\nimport { IAdCreativeViewModel } from '../store/schema';\r\nimport { BlockRequestSourceData } from '../store/schema/models/BlockRequestSourceData';\r\n\r\norchestrator(onAdCreativePageInitialized, async (msg) => {\r\n const { userContext } = getAppStore();\r\n\r\n const viewModel: IAdCreativeViewModel = {\r\n selectedAdSource: AdSource.Microsoft,\r\n selectedAdProviderId: 0,\r\n selectedBlockedMarketId: 0,\r\n };\r\n if (msg.publisherId) {\r\n const publisher = new Publisher(msg.publisherId);\r\n\r\n try {\r\n onLoadingChanged(true);\r\n onBlockedContextChanged(msg.publisherId);\r\n\r\n const accounts = await listEntity([publisher], userContext, Account);\r\n viewModel.accounts = accounts ? accounts.map((f) => ({ id: f.id, name: f.name } as IIdNamePair)) : [];\r\n viewModel.selectedAccount = accounts[0].id;\r\n\r\n const account = new Account(viewModel.selectedAccount);\r\n\r\n // Set default date (for ad perf) to be the date of UTC now minus 4 hours.\r\n // We give the 4 hour buffer for data coming in on the new day.\r\n const defaultDateTimeLocal = new Date();\r\n defaultDateTimeLocal.setHours(defaultDateTimeLocal.getHours() - 4);\r\n const defaultDateUTCBased = new Date(\r\n defaultDateTimeLocal.getUTCFullYear(),\r\n defaultDateTimeLocal.getUTCMonth(),\r\n defaultDateTimeLocal.getUTCDate()\r\n );\r\n viewModel.startDate = defaultDateUTCBased;\r\n viewModel.endDate = defaultDateUTCBased;\r\n\r\n const blockRequestSourcesPromise = getBlockRequestSources(msg.publisherId);\r\n const params = new URLSearchParams([[TARGET_CUSTOMER_ID, publisher.id.toString()]]);\r\n onAdCreativeInitialAccountsChanged(viewModel.accounts, viewModel.selectedAccount);\r\n\r\n const data = converterIn(AdSource.Microsoft, false);\r\n const adPerfDataPromise = getAdPerfData(constructAdPerfRequest(viewModel, data, publisher, [account.id]), params);\r\n\r\n const blockSummaryDataPromise = getBlockSummaryData(\r\n [['account', account.id!.toString()]],\r\n new URLSearchParams([[TARGET_CUSTOMER_ID, msg.publisherId.toString()]])\r\n );\r\n\r\n const blockSummaryData = await blockSummaryDataPromise;\r\n blockSummaryData.forEach((d) => (d.isEnabled ? (d.status = LifeCycleStatus.Active) : (d.status = LifeCycleStatus.Inactive)));\r\n\r\n viewModel.blockSummaryData = blockSummaryData;\r\n viewModel.adPerfData = await adPerfDataPromise;\r\n const blockRequestData: BlockRequestSourceData[] = await blockRequestSourcesPromise;\r\n const mappedBlockRequestData = new Map();\r\n blockRequestData.forEach((blockRequestSource) => {\r\n mappedBlockRequestData.set(blockRequestSource.blockRequestSourceId, blockRequestSource.blockRequestSourceName);\r\n });\r\n viewModel.blockRequestSourceData = mappedBlockRequestData;\r\n onAdCreativeChanged(viewModel);\r\n } catch (e) {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adCreativeServiceLoadEntityFailed,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityInvalidState,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { getAppStore, onLoadingChanged, onNotificationChanged } from '../../../../../@data';\r\nimport { validateSchema } from '../../../../../utils';\r\nimport messages from '../../AdReview/AdCreativePage.messages';\r\nimport { onAdCreativeAdPerfDataChanged, onAdCreativeRefreshDataChanged } from '../actions';\r\nimport { getAdPerfData } from '../services/AdCreativeService';\r\nimport { TARGET_CUSTOMER_ID } from '../services/utility/constants';\r\nimport { constructAdPerfRequest } from '../services/utility/utility';\r\nimport { converterIn } from '../store/adQualityConverter';\r\nimport { adCreativeViewErrorModel } from '../store/schema/AdCreativeViewErrorModel';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onAdCreativeRefreshDataChanged, async (msg) => {\r\n const { publisher } = getAppStore();\r\n const { active, adDescription } = getStore();\r\n if (publisher && publisher.id) {\r\n try {\r\n await validateSchema(adCreativeViewErrorModel(), active);\r\n } catch (e) {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityProvideSearchTerm,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n\r\n return;\r\n }\r\n\r\n try {\r\n onLoadingChanged(true);\r\n const adSource = active.selectedAdSource;\r\n if (!adSource) {\r\n return;\r\n }\r\n const data = converterIn(adSource, true);\r\n const param = new URLSearchParams([[TARGET_CUSTOMER_ID, publisher.id.toString()]]);\r\n const adPerfDataEnhanced = await getAdPerfData(constructAdPerfRequest(active, data, publisher, undefined, adDescription), param);\r\n onAdCreativeAdPerfDataChanged(adPerfDataEnhanced);\r\n } catch (e) {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adCreativeServiceLoadEntityFailed,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityInvalidState,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { date, object, string } from 'yup';\r\nimport { getStore } from '../store';\r\nimport { IAdCreativeViewModel } from './IAdCreativeViewModel';\r\n\r\nexport function adCreativeViewErrorModel() {\r\n return object<IAdCreativeViewModel>().shape({\r\n startDate: date().required(),\r\n endDate: date().required(),\r\n searchBoxValue:\r\n Math.abs(getStore().active.endDate?.getTime()! - getStore().active.startDate?.getTime()!) > 0\r\n ? string().trim().required()\r\n : string().trim(),\r\n });\r\n}\r\n","import { IComboBoxOption, MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { getAppStore, onNotificationChanged } from '../../../../../@data';\r\nimport messages from '../../AdReview/AdCreativePage.messages';\r\nimport { onAdCreativeAccountChanged, onAdCreativeMarketChanged, onAdProviderChanged } from '../actions/onAdCreativeChanged';\r\n\r\norchestrator(onAdProviderChanged, async (msg) => {\r\n const { publisher } = getAppStore();\r\n if (msg.adProvider && publisher) {\r\n try {\r\n onAdCreativeAccountChanged(undefined);\r\n // en-us market\r\n onAdCreativeMarketChanged({ key: 1033 } as IComboBoxOption);\r\n } catch (e) {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adCreativeServiceLoadEntityFailed,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { ApiError, getAppStore, onLoadingChanged, onNotificationChanged } from '../../../../../@data';\r\nimport messages from '../../AdReview/AdCreativePage.messages';\r\nimport { onAdCreativeAdPerfDataChanged, onAdQualityPanelApplyButtonClicked, onFilterPanelHide } from '../actions';\r\nimport { onRawFilterValuesChanged, onSetIsAppliedForAllConditions } from '../mutatorActions';\r\nimport { getAdPerfData } from '../services/AdCreativeService';\r\nimport { TARGET_CUSTOMER_ID } from '../services/utility/constants';\r\nimport { constructAdPerfRequest } from '../services/utility/utility';\r\nimport { converterIn } from '../store/adQualityConverter';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onAdQualityPanelApplyButtonClicked, async (msg) => {\r\n const { publisher } = getAppStore();\r\n const { active } = getStore();\r\n if (publisher && publisher.id && active.selectedAdSource) {\r\n try {\r\n onLoadingChanged(true);\r\n onAdCreativeAdPerfDataChanged([]);\r\n const data = converterIn(active.selectedAdSource, false);\r\n const param = new URLSearchParams([[TARGET_CUSTOMER_ID, publisher.id.toString()]]);\r\n const adPerfDataEnhanced = await getAdPerfData(constructAdPerfRequest(active, data, publisher), param);\r\n onAdCreativeAdPerfDataChanged(adPerfDataEnhanced);\r\n const activeFilters = getStore().filters.active;\r\n if (activeFilters) {\r\n onSetIsAppliedForAllConditions(activeFilters);\r\n onRawFilterValuesChanged(activeFilters);\r\n }\r\n onFilterPanelHide();\r\n } catch (e) {\r\n const apiErrorObj = e as ApiError;\r\n if (apiErrorObj && apiErrorObj.code === 500) {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityTimeoutQueringForData,\r\n intlMessageValues: { trackingId: apiErrorObj.trackingId },\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adCreativeServiceLoadEntityFailed,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityInvalidState,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { IComboBoxOption, MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { AdSource, getAppStore, onNotificationChanged } from '../../../../../@data';\r\nimport messages from '../../AdReview/AdCreativePage.messages';\r\nimport { onAdCreativeAccountChanged, onAdCreativeMarketChanged, onAdSourceChanged } from '../actions/onAdCreativeChanged';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onAdSourceChanged, async (msg) => {\r\n const { publisher } = getAppStore();\r\n if (msg.adSource && publisher) {\r\n try {\r\n const adSource = msg.adSource.key as AdSource;\r\n if (adSource === AdSource.Microsoft) {\r\n onAdCreativeMarketChanged(undefined);\r\n\r\n const accounts = getStore().active.accounts;\r\n if (accounts) {\r\n onAdCreativeAccountChanged({ key: accounts[0].id } as IComboBoxOption);\r\n }\r\n } else {\r\n onAdCreativeAccountChanged(undefined);\r\n // en-us market\r\n onAdCreativeMarketChanged({ key: 1033 } as IComboBoxOption);\r\n }\r\n } catch (e) {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adCreativeServiceLoadEntityFailed,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { AdSource } from '../../../../../@data';\r\nimport {\r\n onBlockAdInitialized,\r\n onBlockAdsChanged,\r\n onBlockAdsChannelsAndRevenueChanged,\r\n onBlockAdsImagesChanged,\r\n onBlockAdsSamChanged,\r\n onBlockImageAdsChanged,\r\n} from '../actions';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onBlockAdInitialized, async (msg) => {\r\n const selectedAds = msg.value;\r\n const { active } = getStore();\r\n if (active.selectedAdSource === AdSource.Microsoft) {\r\n if (!msg.isImageBlock) {\r\n onBlockAdsChanged(selectedAds);\r\n selectedAds.forEach((item, index) => onBlockAdsImagesChanged(item.images, index, true, false));\r\n onBlockAdsChannelsAndRevenueChanged(selectedAds);\r\n } else {\r\n onBlockImageAdsChanged(selectedAds, true);\r\n selectedAds.forEach((item, index) => onBlockAdsImagesChanged(item.images, index, true, false));\r\n }\r\n } else {\r\n onBlockAdsSamChanged(selectedAds);\r\n selectedAds.forEach((item, index) => onBlockAdsImagesChanged(item.images, index, false, true));\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport {\r\n Account,\r\n ApiError,\r\n Channel,\r\n getAppStore,\r\n listEntity,\r\n onAuthLogout,\r\n onLoadingChanged,\r\n onNotificationChanged,\r\n} from '../../../../../@data';\r\nimport { IIdNamePair } from '../../../../../components/MultiSelectPicker';\r\nimport messages from '../../AdReview/AdCreativePage.messages';\r\nimport {\r\n onBlockAdsChannelsAndRevenueChanged,\r\n onBlockAdsChannelsChanged,\r\n onBlockAdsListingsChanged,\r\n onBlockAdsRevenueChanged,\r\n} from '../actions';\r\nimport { getAdIdDetails, getAdIdRevenue } from '../services/AdCreativeService';\r\nimport { convertDateToString } from '../services/utility/utility';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onBlockAdsChannelsAndRevenueChanged, async (msg) => {\r\n const { publisher, userContext } = getAppStore();\r\n const { adPerfData, endDate, startDate } = getStore().active;\r\n const selectedAds = msg.value;\r\n\r\n const handleAPIRequestsAndResponses: Promise<void>[] = [];\r\n selectedAds.forEach((item, index) => {\r\n onLoadingChanged(true);\r\n if (publisher && item.accountId && !getStore().blockAdsPage.channels[item.accountId]) {\r\n const account = new Account(item.accountId);\r\n const processChannelsResponse = listEntity([publisher, account], userContext, Channel).then((response) => {\r\n const channels = response ? response.map((f) => ({ id: f.id, name: f.name } as IIdNamePair)) : [];\r\n\r\n if (channels) {\r\n channels.forEach((channel) => {\r\n if (channel.name.toString().toUpperCase() === 'Default'.toUpperCase()) {\r\n onBlockAdsChannelsChanged(item.accountId!, channel.id);\r\n }\r\n });\r\n }\r\n });\r\n\r\n handleAPIRequestsAndResponses.push(processChannelsResponse);\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityInvalidState,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n if (publisher && publisher.id && item.adId && adPerfData && adPerfData.length > 0) {\r\n const today = new Date(Date.now());\r\n const startDateRevenue = new Date().setDate(today.getDate() - 7);\r\n const endDateRevenue = new Date().setDate(today.getDate());\r\n\r\n const paramsLastSevenDayRevenue = new URLSearchParams([\r\n ['startdate', convertDateToString(new Date(startDateRevenue))],\r\n ['enddate', convertDateToString(new Date(endDateRevenue))],\r\n ['targetCustomerId', publisher.id.toString()],\r\n ]);\r\n\r\n const processAdidRevenueResponse = getAdIdRevenue(\r\n [\r\n ['publisher', publisher.id!.toString()],\r\n ['adrevenue', item.adId.toString()],\r\n ],\r\n paramsLastSevenDayRevenue\r\n )\r\n .then((fetchedRevenue) => {\r\n if (isNaN(fetchedRevenue)) {\r\n fetchedRevenue = 0;\r\n }\r\n onBlockAdsRevenueChanged(fetchedRevenue, index);\r\n })\r\n .catch((e) => {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityLoadRevenueAdDataFailed,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n });\r\n\r\n handleAPIRequestsAndResponses.push(processAdidRevenueResponse);\r\n\r\n const startDateDetails = startDate ? startDate : new Date(new Date().setDate(today.getDate() - 1));\r\n const endDateDetails = endDate ? endDate : new Date(new Date().setDate(today.getDate()));\r\n\r\n const paramsAdDetails = new URLSearchParams([\r\n ['startdate', convertDateToString(startDateDetails)],\r\n ['enddate', convertDateToString(endDateDetails)],\r\n ['targetCustomerId', publisher.id.toString()],\r\n ]);\r\n const processAdidDetailsRequest = getAdIdDetails(\r\n [\r\n ['account', item.accountId!.toString()],\r\n ['addetails', item.adId.toString()],\r\n ],\r\n paramsAdDetails\r\n )\r\n .then((fetchedAdDetails) => {\r\n onBlockAdsListingsChanged(fetchedAdDetails, index);\r\n })\r\n .catch((e) => {\r\n const apiErrorObj = e as ApiError;\r\n if (apiErrorObj && apiErrorObj.code === 401) {\r\n Log.info(apiErrorObj.message);\r\n onAuthLogout();\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityLoadListingAdDataFailed,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n });\r\n\r\n handleAPIRequestsAndResponses.push(processAdidDetailsRequest);\r\n } else if (publisher && publisher.id && item.adId && adPerfData) {\r\n onBlockAdsListingsChanged({ adListingItems: [], listingsCount: 0, adListingSelectedPage: 0 }, index);\r\n onBlockAdsRevenueChanged(item.revenue ? item.revenue : 0, index);\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityInvalidState,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n });\r\n\r\n await Promise.all(handleAPIRequestsAndResponses);\r\n onLoadingChanged(false);\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { getAppStore, LifeCycleStatus, onLoadingChanged, onNotificationChanged, onSavingChanged } from '../../../../../@data';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport messages from '../../AdReview/AdCreativePage.messages';\r\nimport { onBlockAdsDataChanged, onBlockAdsItemStatusChanged } from '../actions';\r\nimport { deactivateBlockedAds, getBlockSummaryData } from '../services/AdBlockService';\r\nimport { createAdBlock } from '../services/AdCreativeService';\r\nimport { BlockAdsData } from '../store/schema/models/BlockAdsData';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onBlockAdsItemStatusChanged, async (msg) => {\r\n const { publisher, userContext } = getAppStore();\r\n const status = msg.status;\r\n\r\n let notification: INotificationBarItem = {};\r\n\r\n if (publisher && publisher.id && userContext) {\r\n const body: BlockAdsData = new BlockAdsData();\r\n body.channelId = msg.data.channelId;\r\n body.channelName = msg.data.channelName;\r\n body.adId = msg.data.adId;\r\n body.adTitle = msg.data.adTitle;\r\n body.advertiserAccountId = msg.data.advertiserAccountId;\r\n body.reason = msg.data.reason;\r\n body.reasonCategory = msg.data.reasonCategory;\r\n body.modifiedBy = userContext.id.toString();\r\n body.modifiedDateTime = new Date(Date.now()).toISOString();\r\n body.startDate = null;\r\n body.endDate = null;\r\n body.isEnabled = true;\r\n body.pastRevenue = msg.data.pastRevenue;\r\n body.allImages = msg.data.allImages;\r\n\r\n const params = new URLSearchParams([['targetCustomerId', publisher.id.toString()]]);\r\n\r\n onSavingChanged(true);\r\n onLoadingChanged(true);\r\n try {\r\n let result;\r\n if (status === LifeCycleStatus.Active) {\r\n result = await createAdBlock([body], params);\r\n } else if (status === LifeCycleStatus.Inactive) {\r\n result = await deactivateBlockedAds(\r\n [\r\n ['channel', msg.data.channelId!.toString()],\r\n ['adid', msg.data.adId!.toString()],\r\n ],\r\n params\r\n );\r\n }\r\n\r\n if (result) {\r\n const active = getStore().active;\r\n const blockSummaryParams = new URLSearchParams([['targetCustomerId', publisher.id.toString()]]);\r\n let blockSummaryData: BlockAdsData[] = [];\r\n if (active.selectedAccount) {\r\n if (active.selectedAccount === -1) {\r\n blockSummaryData = await getBlockSummaryData([['publisher', publisher.id!.toString()]], blockSummaryParams);\r\n // } else if (active.selectedAdUnit && active.selectedAdUnit !== -1) {\r\n // blockSummaryData = await getBlockSummaryData([['adunit', active.selectedAdUnit.toString()]], blockSummaryParams);\r\n } else {\r\n blockSummaryData = await getBlockSummaryData([['account', active.selectedAccount.toString()]], blockSummaryParams);\r\n }\r\n }\r\n blockSummaryData.forEach((d) => (d.isEnabled ? (d.status = LifeCycleStatus.Active) : (d.status = LifeCycleStatus.Inactive)));\r\n onBlockAdsDataChanged(blockSummaryData);\r\n }\r\n notification = {\r\n textMessageDescriptor: messages.adqualityUpdatedBlockedAdsStatusSuccess,\r\n intlMessageValues: { ID: msg.data.adId },\r\n messageBarType: MessageBarType.success,\r\n };\r\n\r\n onNotificationChanged(notification);\r\n } catch (e) {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityUpdateBlockedAdsStatusFailed,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } finally {\r\n onLoadingChanged(false);\r\n onSavingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityInvalidState,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { AdSource } from '../../../../../@data';\r\nimport { onBlockAdsSubmitted, onMSANBlockAdsSubmitted, onSAMBlockAdsSubmitted } from '../actions';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onBlockAdsSubmitted, async (msg) => {\r\n const { active } = getStore();\r\n\r\n if (active.selectedAdSource === AdSource.Microsoft) {\r\n onMSANBlockAdsSubmitted();\r\n } else {\r\n onSAMBlockAdsSubmitted();\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { getAppStore, onNotificationChanged, onSavingChanged } from '../../../../../@data';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport { validateSchema } from '../../../../../utils';\r\nimport messages from '../../AdReview/AdCreativePage.messages';\r\nimport {\r\n onAdCreativeAdPerfDataChanged,\r\n onAdCreativeBlockPanelChanged,\r\n onBlockImagesErrorChanged,\r\n onBlockImagesSubmitted,\r\n onBlockedContextChanged,\r\n onBlockedImagesContextChanged,\r\n} from '../actions';\r\nimport { createImageBlock } from '../services/AdCreativeService';\r\nimport { blockItemErrorModel } from '../store/schema/BlockItemErrorModel';\r\nimport { BlockImagessData } from '../store/schema/models';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onBlockImagesSubmitted, async (msg) => {\r\n const { publisher, userContext } = getAppStore();\r\n const { blockAdsPage, blockedImagesContext, active } = getStore();\r\n\r\n let notification: INotificationBarItem = {};\r\n\r\n if (publisher && publisher.id && userContext) {\r\n blockAdsPage.adPerfBlockAdsData.forEach(async (item, value) => {\r\n const body: BlockImagessData = new BlockImagessData();\r\n body.adId = item.adId;\r\n body.adTitle = item.adTitle;\r\n body.adUnitId = item.adUnitId;\r\n body.images = item.blockedImages;\r\n body.blockReason = blockAdsPage.blockReason;\r\n body.blockReasonComment = blockAdsPage.blockDetails;\r\n body.blockedBy = userContext.id;\r\n body.blockSource = 1;\r\n\r\n const params = new URLSearchParams([['targetCustomerId', publisher.id!.toString()]]);\r\n\r\n try {\r\n await validateSchema(blockItemErrorModel(), blockAdsPage);\r\n onBlockImagesErrorChanged();\r\n } catch (e) {\r\n onBlockImagesErrorChanged(e);\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityBlockImagesMissingFields,\r\n intlMessageValues: { count: Object.keys(e).length },\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n return;\r\n }\r\n\r\n onSavingChanged(true);\r\n try {\r\n await createImageBlock(body, params);\r\n\r\n const reportedImages = blockedImagesContext ? blockedImagesContext : [];\r\n if (item.blockedImages) {\r\n item.blockedImages.forEach((blockImage) => {\r\n const imageReportDataTuple = { adId: item.adId, imageUrl: blockImage };\r\n reportedImages.push(JSON.stringify(imageReportDataTuple));\r\n });\r\n if (active && active.adPerfData) {\r\n const filteredAds = active.adPerfData;\r\n filteredAds.forEach((ad) => {\r\n ad.blockedAdIdImages = reportedImages;\r\n // ad.imagesContext = [];\r\n // if (ad.images) {\r\n // ad.images.forEach((image) => {\r\n // const imageMetadata: ImageMetaData = { imageUrl: image, isBlocked: false };\r\n // const imageReportDataTuple = { adId: ad.adId, imageUrl: processImage(image) };\r\n // if (reportedImages.includes(JSON.stringify(imageReportDataTuple))) {\r\n // imageMetadata.isBlocked = true;\r\n // }\r\n // ad.imagesContext!.push(imageMetadata);\r\n // });\r\n // }\r\n });\r\n onAdCreativeAdPerfDataChanged(filteredAds);\r\n onBlockedImagesContextChanged(reportedImages);\r\n }\r\n }\r\n onBlockedContextChanged(publisher.id!);\r\n\r\n notification = {\r\n textMessageDescriptor: messages.adqualityBlockImagesSuccess,\r\n messageBarType: MessageBarType.success,\r\n };\r\n onNotificationChanged(notification);\r\n } catch (e) {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityBlockImagesFailed,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } finally {\r\n onAdCreativeBlockPanelChanged(false);\r\n onSavingChanged(false);\r\n }\r\n });\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityInvalidState,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { AdSource, onNotificationChanged } from '../../../../../@data';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport messages from '../../AdReview/AdCreativePage.messages';\r\nimport { onBlockedAdsExportClicked } from '../actions';\r\nimport { exportCSV } from '../services/utility/utility';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onBlockedAdsExportClicked, async (msg) => {\r\n let notification: INotificationBarItem = {};\r\n const adSource = getStore().active.selectedAdSource;\r\n const columns = getStore().columns;\r\n\r\n if (adSource === AdSource.Microsoft) {\r\n const blockSummaryForCSVFromTable = getStore().active.blockSummaryData;\r\n if (blockSummaryForCSVFromTable && columns) {\r\n exportCSV(blockSummaryForCSVFromTable, 'publisher_ad_blocks.csv', columns);\r\n\r\n notification = {\r\n textMessageDescriptor: messages.adqualityBlockedAdsDataDownloadSuccess,\r\n messageBarType: MessageBarType.success,\r\n };\r\n onNotificationChanged(notification);\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityNoDataToDownload,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n } else {\r\n const blockSummaryForCSVFromTable = getStore().active.samBlockSummaryData;\r\n if (blockSummaryForCSVFromTable && columns) {\r\n exportCSV(blockSummaryForCSVFromTable, 'publisher_auction_ad_blocks.csv', columns);\r\n\r\n notification = {\r\n textMessageDescriptor: messages.adqualityBlockedAdsDataDownloadSuccess,\r\n messageBarType: MessageBarType.success,\r\n };\r\n onNotificationChanged(notification);\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityNoDataToDownload,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { onNotificationChanged } from '../../../../../@data';\r\nimport messages from '../../AdReview/AdCreativePage.messages';\r\nimport { onBlockedAdsContextChanged, onBlockedContextChanged } from '../actions';\r\nimport { getBlockImagesData } from '../services/AdBlockService';\r\nimport { getBlockedAdContext } from '../services/AdCreativeService';\r\n\r\norchestrator(onBlockedContextChanged, async (msg) => {\r\n try {\r\n const blockedAdContext = await getBlockedAdContext(msg.publisherId);\r\n blockedAdContext.mapAdIdImages = new Map<number, string[]>();\r\n const blockedImageSummary = await getBlockImagesData(msg.publisherId);\r\n blockedImageSummary.forEach((element) => {\r\n if (blockedAdContext.mapAdIdImages) {\r\n if (blockedAdContext.mapAdIdImages.has(element.adId!)) {\r\n blockedAdContext.mapAdIdImages.get(element.adId!)!.push(element.image!);\r\n } else {\r\n blockedAdContext.mapAdIdImages.set(element.adId!, [element.image!]);\r\n }\r\n }\r\n });\r\n onBlockedAdsContextChanged(blockedAdContext);\r\n } catch (e) {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityDownloadAdContextFailed,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { getAppStore, onLoadingChanged, onNotificationChanged } from '../../../../../@data';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport messages from '../../AdReview/AdCreativePage.messages';\r\nimport { onBlockedImagesExportClicked } from '../actions';\r\nimport { getBlockImagesData } from '../services/AdBlockService';\r\nimport { exportCSV } from '../services/utility/utility';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onBlockedImagesExportClicked, async (msg) => {\r\n const { publisher, userContext } = getAppStore();\r\n\r\n let notification: INotificationBarItem = {};\r\n\r\n if (publisher && publisher.id && userContext) {\r\n onLoadingChanged(true);\r\n try {\r\n const blockImagesSummary = await getBlockImagesData(publisher.id);\r\n const columns = getStore().columns;\r\n if (columns) {\r\n exportCSV(blockImagesSummary, 'publisher_ad_image_blocks.csv', columns);\r\n }\r\n\r\n notification = {\r\n textMessageDescriptor: messages.adqualityDownloadBlockedImagesSuccess,\r\n messageBarType: MessageBarType.success,\r\n };\r\n onNotificationChanged(notification);\r\n } catch (e) {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityDownloadBlockedImagesFailed,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityInvalidState,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { AdSource, LifeCycleStatus, getAppStore, onLoadingChanged, onNotificationChanged } from '../../../../../@data';\r\nimport { adQualityLocales } from '../../../../../config/locale';\r\nimport messages from '../../AdReview/AdCreativePage.messages';\r\nimport { onBlockAdsDataChanged, onRefreshBlockSummary, onSAMBlockAdsDataChanged } from '../actions';\r\nimport { getBlockSummaryData, getSAMBlockSummaryData } from '../services/AdBlockService';\r\nimport { BlockAdsData, SAMBlockSummaryData } from '../store/schema/models';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onRefreshBlockSummary, async (msg) => {\r\n const { publisher } = getAppStore();\r\n const { active } = getStore();\r\n if (publisher && publisher.id) {\r\n try {\r\n onLoadingChanged(true);\r\n const adSource = active.selectedAdSource;\r\n\r\n let blockSummaryParams = new URLSearchParams([\r\n ['targetCustomerId', publisher.id.toString()],\r\n ['creativeagglevel', 'listingid'],\r\n ['adtypes', 'TA,PA'],\r\n ['adSources', 'PS,AIM'],\r\n ]);\r\n if (adSource === AdSource.Microsoft) {\r\n onBlockAdsDataChanged([]);\r\n let blockSummaryData: BlockAdsData[] = [];\r\n\r\n if (active.selectedAccount) {\r\n if (active.selectedAccount === -1) {\r\n blockSummaryData = await getBlockSummaryData([['publisher', publisher.id!.toString()]], blockSummaryParams);\r\n // } else if (active.selectedAdUnit && active.selectedAdUnit !== -1) {\r\n // adPerfData = await getAdPerfData([['adunit', active.selectedAdUnit.toString()]], params);\r\n // blockSummaryData = await getBlockSummaryData([['adunit', active.selectedAdUnit.toString()]], blockSummaryParams);\r\n } else {\r\n blockSummaryData = await getBlockSummaryData([['account', active.selectedAccount.toString()]], blockSummaryParams);\r\n }\r\n }\r\n blockSummaryData.forEach((d) => (d.isEnabled ? (d.status = LifeCycleStatus.Active) : (d.status = LifeCycleStatus.Inactive)));\r\n\r\n if (active.blockSummaryStartDate) {\r\n blockSummaryData = blockSummaryData.filter(\r\n (blockSummary) =>\r\n blockSummary.modifiedDateTime &&\r\n active.blockSummaryStartDate &&\r\n new Date(blockSummary.modifiedDateTime) >= active.blockSummaryStartDate\r\n );\r\n }\r\n if (active.blockSummaryEndDate) {\r\n blockSummaryData = blockSummaryData.filter(\r\n (blockSummary) =>\r\n blockSummary.modifiedDateTime &&\r\n active.blockSummaryEndDate &&\r\n new Date(blockSummary.modifiedDateTime) <= active.blockSummaryEndDate\r\n );\r\n }\r\n onBlockAdsDataChanged(blockSummaryData);\r\n } else {\r\n onSAMBlockAdsDataChanged([]);\r\n let blockSummaryData: SAMBlockSummaryData[] = [];\r\n\r\n blockSummaryParams = new URLSearchParams([\r\n ['targetCustomerId', publisher.id.toString()],\r\n ['NumImages', 2],\r\n ]);\r\n\r\n if (active.selectedMarket) {\r\n blockSummaryData = await getSAMBlockSummaryData([['publisher', publisher.id!.toString()]], blockSummaryParams);\r\n if (active.selectedBlockedMarketId !== undefined) {\r\n if (active.selectedBlockedMarketId === 0) {\r\n blockSummaryData = blockSummaryData.filter((blockSummary) => blockSummary.locale === 'global');\r\n } else {\r\n blockSummaryData = blockSummaryData.filter(\r\n (blockSummary) =>\r\n blockSummary.locale === 'global' || blockSummary.locale === adQualityLocales[active.selectedBlockedMarketId!]\r\n );\r\n }\r\n }\r\n if (active.blockSummaryStartDate) {\r\n blockSummaryData = blockSummaryData.filter(\r\n (blockSummary) =>\r\n blockSummary.modifiedDateTime &&\r\n active.blockSummaryStartDate &&\r\n new Date(blockSummary.modifiedDateTime) >= active.blockSummaryStartDate\r\n );\r\n }\r\n if (active.blockSummaryEndDate) {\r\n blockSummaryData = blockSummaryData.filter(\r\n (blockSummary) =>\r\n blockSummary.modifiedDateTime &&\r\n active.blockSummaryEndDate &&\r\n new Date(blockSummary.modifiedDateTime) <= active.blockSummaryEndDate\r\n );\r\n }\r\n onSAMBlockAdsDataChanged(blockSummaryData);\r\n }\r\n }\r\n } catch (e) {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adCreativeServiceLoadEntityFailed,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.adqualityInvalidState,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { FilterType, IFilterDetails } from '../../../../../components/GridFilter/GridFilter.types';\r\nimport { IIdNamePair } from '../../../../../components/MultiSelectPicker';\r\nimport { AdQualityFilterNames, IConditionValue } from './schema';\r\nimport { getStore } from './store';\r\n\r\nexport function getInitialFilterList(): IFilterDetails[] {\r\n const filterListValues: IFilterDetails[] = [];\r\n\r\n const filterListType = [AdQualityFilterNames.AccountName];\r\n\r\n const filterTextType = [\r\n AdQualityFilterNames.CreativeAdId,\r\n AdQualityFilterNames.Advertiser,\r\n AdQualityFilterNames.AdvertiserId,\r\n AdQualityFilterNames.AdvertiserAccountId,\r\n AdQualityFilterNames.AdId,\r\n AdQualityFilterNames.AdTitle,\r\n AdQualityFilterNames.AdURL,\r\n AdQualityFilterNames.LongHeadline,\r\n AdQualityFilterNames.ShortHeadline,\r\n ];\r\n\r\n filterListType.forEach((elem: string) => {\r\n const v = getStore().filters.raw?.[elem];\r\n if (!v?.values) {\r\n return;\r\n }\r\n const arr: IIdNamePair[] = v.values.filter((item: IIdNamePair) => {\r\n return item.isSelected;\r\n });\r\n\r\n arr.forEach((e: IIdNamePair, index: number) => {\r\n const item: IFilterDetails = {\r\n filterId: `filterList-${index}`,\r\n columnName: undefined,\r\n customFunction: undefined,\r\n filterCondition: '',\r\n filterName: elem,\r\n filterOptions: undefined,\r\n filterText: e.name,\r\n filterType: FilterType.string,\r\n includeNulls: undefined,\r\n showNullsCheckboxLabel: undefined,\r\n };\r\n filterListValues.push(item);\r\n });\r\n });\r\n\r\n filterTextType.forEach((elem: string) => {\r\n const v = getStore().filters.raw?.[elem];\r\n if (!v?.conditions) {\r\n return;\r\n }\r\n const arr: IConditionValue<string>[] = v.conditions.filter((item: IConditionValue<string>) => {\r\n return item.isApplied;\r\n });\r\n\r\n arr.forEach((e: IConditionValue<string>, index: number) => {\r\n const item: IFilterDetails = {\r\n filterId: `filterText-${index}`,\r\n columnName: 'id',\r\n customFunction: undefined,\r\n filterCondition: e.condition,\r\n filterName: elem,\r\n filterOptions: undefined,\r\n filterText: e.value,\r\n filterType: FilterType.string,\r\n includeNulls: undefined,\r\n showNullsCheckboxLabel: undefined,\r\n };\r\n filterListValues.push(item);\r\n });\r\n });\r\n\r\n return filterListValues;\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n selectAll: {\r\n id: 'listFilter.selectAll',\r\n defaultMessage: 'Select all',\r\n },\r\n deselectAll: {\r\n id: 'listFilter.deselectAll',\r\n defaultMessage: 'Deselect all',\r\n },\r\n});\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterSpacing, IPubcenterTheme } from '../../../../theme';\r\nimport { IListFilterClassNames } from './ListFilter.types';\r\n\r\nexport const getClassNames = (): IListFilterClassNames => {\r\n const theme = (getTheme() as unknown) as IPubcenterTheme;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return mergeStyleSets({\r\n content: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n },\r\n buttonSection: {\r\n marginLeft: 'auto',\r\n },\r\n checkBoxRow: {\r\n marginTop: spacing.size10,\r\n marginBottom: spacing.size10,\r\n },\r\n });\r\n};\r\n","import { Checkbox, Link, mergeStyleSets } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { injectIntlAndObserver } from '../../../utils';\r\nimport { FormSection } from '../../Form';\r\nimport { IIdNamePair } from '../../MultiSelectPicker';\r\nimport messages from './ListFilter.messages';\r\nimport { getClassNames } from './ListFilter.styles';\r\nimport { IListFilterProps } from './ListFilter.types';\r\n\r\nexport const ListFilter = injectIntlAndObserver(function ListFilterComponent(props: IListFilterProps): JSX.Element {\r\n const { formatMessage } = props.intl;\r\n const { root, content, checkBoxRow, buttonSection } = mergeStyleSets(getClassNames());\r\n const { selectAll, deselectAll } = messages;\r\n const { heading, list, onSelect, onSelectAll, onDeselectAll } = props;\r\n\r\n const areAllElementsSelected = (): boolean => {\r\n const lst: IIdNamePair[] = list ?? [];\r\n return lst?.every((elem: IIdNamePair) => {\r\n return elem.isSelected;\r\n });\r\n };\r\n\r\n const hasSelectedElements = (): boolean => {\r\n const lst: IIdNamePair[] = list ?? [];\r\n return lst?.some((elem: IIdNamePair) => {\r\n return elem.isSelected;\r\n });\r\n };\r\n\r\n return (\r\n <div className={root}>\r\n <FormSection formWidth={300} title={heading} expanded={hasSelectedElements()} rightChevron>\r\n <div className={content}>\r\n <div>\r\n {list?.map((elemList: IIdNamePair, index: number) => {\r\n return (\r\n <React.Fragment key={index}>\r\n <div className={checkBoxRow}>\r\n <Checkbox\r\n label={elemList.name}\r\n checked={!!elemList.isSelected}\r\n onChange={(_, value) => {\r\n if (heading && onSelect) {\r\n return onSelect(heading, elemList, !!value);\r\n }\r\n }}\r\n />\r\n </div>\r\n </React.Fragment>\r\n );\r\n })}\r\n </div>\r\n <div className={buttonSection}>\r\n <Link\r\n onClick={() => {\r\n if (heading && onSelectAll && onDeselectAll) {\r\n return !areAllElementsSelected() ? onSelectAll(heading) : onDeselectAll(heading);\r\n }\r\n }}\r\n >\r\n {!areAllElementsSelected() ? formatMessage(selectAll) : formatMessage(deselectAll)}\r\n </Link>\r\n </div>\r\n </div>\r\n </FormSection>\r\n </div>\r\n );\r\n});\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { IIdNamePair } from '../../../../../../components/MultiSelectPicker';\r\nimport { IConditionValue } from '../../../@data/store/schema';\r\nimport { getStore } from '../../../@data/store/store';\r\n\r\nexport const onAddRawElementToList = mutatorAction(\r\n 'onAddRawElementToList',\r\n function onAddRawElement(heading: string, item: IConditionValue<string>) {\r\n const activeFilters = getStore().filters.active?.[heading];\r\n activeFilters.conditions.push(item);\r\n }\r\n);\r\n\r\nexport const onSelectChanged = mutatorAction('onSelectChanged', function onSelect(heading: string, item: IIdNamePair, value: boolean) {\r\n const elemList: IIdNamePair[] = getStore().filters.active?.[heading]?.values;\r\n if (item && elemList) {\r\n const index: number = elemList.findIndex((e: { id: number }) => e.id === item.id);\r\n elemList[index].isSelected = value;\r\n }\r\n});\r\n\r\nexport const onSelectAllChanged = mutatorAction('onSelectAllChanged', function onSelectAll(heading: string) {\r\n getStore().filters.active?.[heading].values.forEach((elemList: IIdNamePair) => {\r\n elemList.isSelected = true;\r\n });\r\n});\r\n\r\nexport const onDeselectAllChanged = mutatorAction('onDeselectAllChanged', function onDeselectAll(heading: string) {\r\n getStore().filters.active?.[heading].values.forEach((elemList: IIdNamePair) => {\r\n elemList.isSelected = false;\r\n });\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n contains: {\r\n id: 'textFilter.filterConditionString.contains',\r\n defaultMessage: 'contains',\r\n },\r\n doesNotContain: {\r\n id: 'textFilter.filterConditionString.doesNotContain',\r\n defaultMessage: 'does not contain',\r\n },\r\n beginsWith: {\r\n id: 'textFilter.filterConditionString.beginsWith',\r\n defaultMessage: 'begins with',\r\n },\r\n endsWith: {\r\n id: 'textFilter.filterConditionString.endsWith',\r\n defaultMessage: 'ends with',\r\n },\r\n equals: {\r\n id: 'textFilter.filterConditionString.equals',\r\n defaultMessage: 'equals',\r\n },\r\n doesNotEqual: {\r\n id: 'textFilter.filterConditionString.doesNotEqual',\r\n defaultMessage: 'does not equal',\r\n },\r\n inputValue: {\r\n id: 'textFilter.filterCondition.inputValue',\r\n defaultMessage: 'Filter Value',\r\n },\r\n addMore: {\r\n id: 'textFilter.addition.addMore',\r\n defaultMessage: 'Add More',\r\n },\r\n selectFilter: {\r\n id: 'textFilter.selectFilter',\r\n defaultMessage: 'Select Filter',\r\n },\r\n});\r\n","import { Dropdown, IDropdownOption, TextField } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport { FilterCondition } from '../../../@data/store/schema/enums/FilterCondition';\r\nimport { FormItem } from '../../Form';\r\nimport messages from './TextFilter.messages';\r\nimport { ITextFilterProps } from './TextFilter.types';\r\n\r\nexport const TextFilter = injectIntl(function TextFilterComponent(props: ITextFilterProps): JSX.Element {\r\n const { formatMessage } = props.intl;\r\n const { contains, doesNotContain, beginsWith, equals, doesNotEqual, selectFilter, inputValue } = messages;\r\n const { condition, value, index, heading, onSelectFunc, onChangeFunc } = props;\r\n\r\n const simpleStringFilterTypeOptions: IDropdownOption[] = [\r\n { key: FilterCondition.Equals, text: formatMessage(equals) },\r\n { key: FilterCondition.DoesNotEqual, text: formatMessage(doesNotEqual) },\r\n ];\r\n\r\n const allStringFilterTypeOptions: IDropdownOption[] = [\r\n { key: FilterCondition.Contains, text: formatMessage(contains) },\r\n { key: FilterCondition.DoesNotContain, text: formatMessage(doesNotContain) },\r\n { key: FilterCondition.BeginsWith, text: formatMessage(beginsWith) },\r\n { key: FilterCondition.Equals, text: formatMessage(equals) },\r\n { key: FilterCondition.DoesNotEqual, text: formatMessage(doesNotEqual) },\r\n ];\r\n\r\n const isSimpleFilter = (name: string) => {\r\n return name.includes('Id');\r\n };\r\n\r\n const optionType = isSimpleFilter(heading) ? simpleStringFilterTypeOptions : allStringFilterTypeOptions;\r\n\r\n return (\r\n <div>\r\n <React.Fragment key={'activePair' + index}>\r\n <FormItem formWidth={300}>\r\n <Dropdown\r\n placeholder={formatMessage(selectFilter)}\r\n defaultSelectedKey={condition}\r\n options={optionType}\r\n onChange={(_, val) => {\r\n if (val) {\r\n onSelectFunc(heading, val, index);\r\n }\r\n }}\r\n />\r\n </FormItem>\r\n <FormItem formWidth={300}>\r\n <TextField\r\n placeholder={formatMessage(inputValue)}\r\n defaultValue={value}\r\n onChange={(_, val) => {\r\n onChangeFunc(heading, val || '', index);\r\n }}\r\n />\r\n </FormItem>\r\n </React.Fragment>\r\n </div>\r\n );\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n contains: {\r\n id: 'textFilter.filterConditionString.contains',\r\n defaultMessage: 'contains',\r\n },\r\n doesNotContain: {\r\n id: 'textFilter.filterConditionString.doesNotContain',\r\n defaultMessage: 'does not contain',\r\n },\r\n beginsWith: {\r\n id: 'textFilter.filterConditionString.beginsWith',\r\n defaultMessage: 'begins with',\r\n },\r\n endsWith: {\r\n id: 'textFilter.filterConditionString.endsWith',\r\n defaultMessage: 'ends with',\r\n },\r\n equals: {\r\n id: 'textFilter.filterConditionString.equals',\r\n defaultMessage: 'equals',\r\n },\r\n doesNotEqual: {\r\n id: 'textFilter.filterConditionString.doesNotEqual',\r\n defaultMessage: 'does not equal',\r\n },\r\n inputValue: {\r\n id: 'textFilter.filterCondition.inputValue',\r\n defaultMessage: 'Filter Value',\r\n },\r\n addMore: {\r\n id: 'textFilter.addition.addMore',\r\n defaultMessage: 'Add More',\r\n },\r\n selectFilter: {\r\n id: 'textFilter.selectFilter',\r\n defaultMessage: 'Select Filter',\r\n },\r\n});\r\n","import { mergeStyleSets } from '@fluentui/react';\r\nimport { IMultiTextFiltersClassNames } from './MultiTextFilters.types';\r\n\r\nexport const getClassNames = (): IMultiTextFiltersClassNames => {\r\n return mergeStyleSets({\r\n root: {},\r\n });\r\n};\r\n","import { IDropdownOption, Link, mergeStyleSets } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { FilterCondition } from '../../../../../@data/store/schema/enums/FilterCondition';\r\nimport { TextFilter } from '../../../../../components/Filters/TextFilter/TextFilter';\r\nimport { FormSection } from '../../../../../components/Form';\r\nimport { injectIntlAndObserver } from '../../../../../utils';\r\nimport { onDropdownValueChanged, onTextBoxValueChanged } from '../../@data/mutatorActions';\r\nimport { IConditionValue } from '../../@data/store/schema';\r\nimport messages from './MultiTextFilters.messages';\r\nimport { getClassNames } from './MultiTextFilters.styles';\r\nimport { IMultiTextFiltersProps } from './MultiTextFilters.types';\r\n\r\nexport const MultiTextFilters = injectIntlAndObserver<IMultiTextFiltersProps>(function MultiTextFiltersComponent(\r\n props: IMultiTextFiltersProps\r\n): JSX.Element {\r\n const { formatMessage } = props.intl;\r\n const { addMore } = messages;\r\n const { root } = mergeStyleSets(getClassNames());\r\n const { conditions = [] } = props;\r\n\r\n const isLastPairCompleted = (): boolean => {\r\n const lastCondition = conditions[conditions.length - 1].condition !== undefined;\r\n const lastValue = conditions[conditions.length - 1].value !== '';\r\n return lastCondition && lastValue;\r\n };\r\n\r\n const hasElements = (): boolean => {\r\n return conditions.some((pair: IConditionValue<string>) => {\r\n return pair.condition && pair.value !== '';\r\n });\r\n };\r\n\r\n const onSelectHandle = (heading: string, value: IDropdownOption<FilterCondition>, index: number) => {\r\n onDropdownValueChanged(heading, value, index);\r\n };\r\n\r\n const onChangeHandle = (heading: string, value: string, index: number) => {\r\n onTextBoxValueChanged(heading, value, index);\r\n };\r\n\r\n return (\r\n <div className={root}>\r\n <FormSection formWidth={300} title={props.heading} expanded={hasElements()} rightChevron>\r\n {conditions.map((pair, index: number) => (\r\n <React.Fragment key={index}>\r\n <TextFilter\r\n condition={pair.condition}\r\n value={pair.value}\r\n index={index}\r\n heading={props.heading}\r\n onSelectFunc={onSelectHandle}\r\n onChangeFunc={onChangeHandle}\r\n />\r\n </React.Fragment>\r\n ))}\r\n <Link\r\n onClick={() => {\r\n return props.onAddMoreClick!(props.heading);\r\n }}\r\n disabled={!isLastPairCompleted()}\r\n >\r\n {formatMessage(addMore)}\r\n </Link>\r\n </FormSection>\r\n </div>\r\n );\r\n});\r\n","import { mergeStyleSets } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport { AdSource } from '../../../../@data';\r\nimport { ListFilter } from '../../../../components/Filters/ListFilter/ListFilter';\r\nimport { IIdNamePair } from '../../../../components/MultiSelectPicker';\r\nimport { AdQualityFilterNames, IConditionValue } from '../@data/store/schema';\r\nimport { onAddRawElementToList, onDeselectAllChanged, onSelectAllChanged, onSelectChanged } from './@data/mutatorActions';\r\nimport { getClassNames } from './AdQualityFilters.styles';\r\nimport { IAdQualityFiltersProps } from './AdQualityFilters.types';\r\nimport { MultiTextFilters } from './MultiTextFilters/MultiTextFilters';\r\n\r\nexport const AdQualityFilters = injectIntl<IAdQualityFiltersProps>(function AdQualityFiltersComponent(\r\n props: IAdQualityFiltersProps\r\n): JSX.Element | null {\r\n const { root } = mergeStyleSets(getClassNames());\r\n const { active } = props.filtersItems;\r\n const adSource = props.adSource;\r\n const { shouldShowHeadlines } = props;\r\n\r\n const filtersToRender = {\r\n [AdSource.Microsoft]: [\r\n AdQualityFilterNames.AccountName,\r\n AdQualityFilterNames.Advertiser,\r\n AdQualityFilterNames.AdvertiserId,\r\n AdQualityFilterNames.AdvertiserAccountId,\r\n AdQualityFilterNames.AdId,\r\n AdQualityFilterNames.AdTitle,\r\n AdQualityFilterNames.AdURL,\r\n ...(shouldShowHeadlines ? [AdQualityFilterNames.LongHeadline] : []),\r\n ...(shouldShowHeadlines ? [AdQualityFilterNames.ShortHeadline] : []),\r\n ],\r\n [AdSource.Auction]: [\r\n AdQualityFilterNames.CreativeAdId,\r\n AdQualityFilterNames.Advertiser,\r\n AdQualityFilterNames.AdTitle,\r\n AdQualityFilterNames.AdProviders,\r\n AdQualityFilterNames.Markets,\r\n ],\r\n [AdSource.XandrAuction]: [\r\n AdQualityFilterNames.CreativeAdId,\r\n AdQualityFilterNames.Advertiser,\r\n AdQualityFilterNames.AdTitle,\r\n AdQualityFilterNames.AdProviders,\r\n AdQualityFilterNames.Markets,\r\n ],\r\n };\r\n\r\n if (!adSource) {\r\n return null;\r\n }\r\n const filters = filtersToRender[adSource] || [];\r\n\r\n const addTempConditionPair = (heading: string): void => {\r\n const newItem: IConditionValue<string> = { condition: undefined, value: '' };\r\n onAddRawElementToList(heading, newItem);\r\n };\r\n\r\n const onSelectHandle = (heading: string, item: IIdNamePair, value: boolean) => {\r\n onSelectChanged(heading, item, value);\r\n };\r\n\r\n const onSelectAllHandle = (heading: string) => {\r\n onSelectAllChanged(heading);\r\n };\r\n\r\n const onDeselectAllHandle = (heading: string) => {\r\n onDeselectAllChanged(heading);\r\n };\r\n\r\n if (!active) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className={root}>\r\n {filters.map((filter: AdQualityFilterNames) => {\r\n switch (filter) {\r\n case AdQualityFilterNames.AccountName:\r\n return (\r\n <ListFilter\r\n heading={AdQualityFilterNames.AccountName}\r\n list={active?.[AdQualityFilterNames.AccountName]?.values}\r\n onSelect={onSelectHandle}\r\n onSelectAll={onSelectAllHandle}\r\n onDeselectAll={onDeselectAllHandle}\r\n />\r\n );\r\n case AdQualityFilterNames.AdProviders:\r\n return (\r\n <ListFilter\r\n heading={AdQualityFilterNames.AdProviders}\r\n list={active?.[AdQualityFilterNames.AdProviders]?.values}\r\n onSelect={onSelectHandle}\r\n onSelectAll={onSelectAllHandle}\r\n onDeselectAll={onDeselectAllHandle}\r\n />\r\n );\r\n case AdQualityFilterNames.Markets:\r\n return (\r\n <ListFilter\r\n heading={AdQualityFilterNames.Markets}\r\n list={active?.Markets?.values}\r\n onSelect={onSelectHandle}\r\n onSelectAll={onSelectAllHandle}\r\n onDeselectAll={onDeselectAllHandle}\r\n />\r\n );\r\n default:\r\n return <MultiTextFilters heading={filter} conditions={active?.[filter]?.conditions} onAddMoreClick={addTempConditionPair} />;\r\n }\r\n })}\r\n </div>\r\n );\r\n});\r\n","import { mergeStyleSets } from '@fluentui/react';\r\nimport { IAdQualityFiltersClassNames } from './AdQualityFilters.types';\r\n\r\nexport const getClassNames = (): IAdQualityFiltersClassNames => {\r\n return mergeStyleSets({\r\n root: {},\r\n });\r\n};\r\n","import { IButtonStyles } from '@fluentui/react';\r\nimport { IPubcenterPalette, IPubcenterSpacing } from '../../../../../theme';\r\nimport { IAdCreativePageStyleProps, IAdCreativePageStyles } from './AdCreativePage.types';\r\n\r\nexport const getStyles = (props: IAdCreativePageStyleProps): IAdCreativePageStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n\r\n return {\r\n root: {\r\n display: 'flex',\r\n height: 'inherit',\r\n flexDirection: 'column',\r\n flex: 1,\r\n },\r\n adSourceField: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-end',\r\n },\r\n adSourceFields: {\r\n display: 'flex',\r\n borderTop: '1px solid #EFF6FC',\r\n borderBottom: '1px solid #EFF6FC',\r\n minHeight: spacing.size96,\r\n },\r\n adReview: {\r\n marginTop: spacing.size8,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flex: 1,\r\n },\r\n filterFields: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-end',\r\n },\r\n searchBoxItem: {\r\n marginTop: '29px',\r\n width: '466px',\r\n },\r\n descriptionCheckbox: {\r\n marginTop: '4px',\r\n float: 'right',\r\n },\r\n selectedClose: {\r\n display: 'block',\r\n height: spacing.size44,\r\n textAlign: 'center',\r\n lineHeight: spacing.size44,\r\n cursor: 'pointer',\r\n },\r\n cancelIcon: {\r\n marginTop: spacing.size4,\r\n marginLeft: -spacing.size8,\r\n },\r\n applyButton: {\r\n marginLeft: spacing.size8,\r\n marginRight: spacing.size8,\r\n marginBottom: spacing.size16,\r\n marginTop: '29px',\r\n },\r\n blockAdChannelButton: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n },\r\n imageList: {\r\n overflow: 'hidden',\r\n fontSize: 0,\r\n position: 'relative',\r\n },\r\n imageListTitle: {\r\n textAlign: 'center',\r\n outline: 'none',\r\n position: 'relative',\r\n float: 'left',\r\n background: theme.palette.neutralLighter,\r\n selectors: {\r\n 'focus:after': {\r\n content: '',\r\n position: 'absolute',\r\n left: 2,\r\n right: 2,\r\n top: 2,\r\n bottom: 2,\r\n boxSizing: 'border-box',\r\n border: `1px solid ${theme.palette.white}`,\r\n },\r\n },\r\n },\r\n imageListSizer: {\r\n paddingBottom: '100%',\r\n },\r\n imageListPadder: {\r\n position: 'absolute',\r\n left: 2,\r\n top: 2,\r\n right: 2,\r\n bottom: 2,\r\n },\r\n imageListLabel: {\r\n background: 'rgba(0, 0, 0, 0.3)',\r\n color: '#FFFFFF',\r\n position: 'absolute',\r\n padding: 10,\r\n bottom: 0,\r\n left: 0,\r\n width: '100%',\r\n fontSize: theme.fonts.small.fontSize,\r\n boxSizing: 'border-box',\r\n },\r\n imageListImage: {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n width: '100%',\r\n height: '100%',\r\n },\r\n adBlockPanelListingBox: {\r\n minHeight: '200px',\r\n alignItems: 'center',\r\n display: 'flex',\r\n border: 'black',\r\n borderWidth: '1px',\r\n borderStyle: 'solid',\r\n },\r\n adBlockPanelListingPaginatedBox: {\r\n overflow: 'hidden',\r\n minHeight: '150px',\r\n margin: '4px',\r\n },\r\n adBlockPanelListingPaginatedLeftItems: {\r\n float: 'left',\r\n maxWidth: '70%',\r\n },\r\n adBlockPanelListingPaginatedRightItems: {\r\n float: 'right',\r\n maxWidth: '30%',\r\n },\r\n adBlockPanelListingLightText: {\r\n fontWeight: 'normal',\r\n fontSize: '80%',\r\n },\r\n adBlockPanelListingCenterLightText: {\r\n fontWeight: 'normal',\r\n fontSize: '80%',\r\n textAlign: 'center',\r\n },\r\n adBlockPanelListingLoadingBox: {\r\n display: 'block',\r\n width: '100%',\r\n },\r\n adBlockPanelListingNoneBox: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n width: '100%',\r\n },\r\n panelButton: {\r\n display: 'flex',\r\n selectors: {\r\n '.ms-Button': {\r\n marginRight: spacing.size8,\r\n },\r\n },\r\n },\r\n subComponentStyles: {\r\n pivot: {\r\n itemContainer: {\r\n display: 'flex',\r\n height: 'inherit',\r\n flexDirection: 'column',\r\n flex: 1,\r\n },\r\n },\r\n formItem: {\r\n root: {\r\n marginLeft: spacing.size8,\r\n marginRight: spacing.size8,\r\n width: 'auto',\r\n },\r\n },\r\n formSection: {\r\n root: {\r\n width: 'auto',\r\n },\r\n content: {\r\n marginTop: '10px',\r\n },\r\n },\r\n searchBox: {\r\n root: {\r\n marginTop: 'auto',\r\n marginBottom: 'auto',\r\n },\r\n },\r\n filterPanel: {\r\n commands: {\r\n background: palette.white,\r\n },\r\n main: {\r\n width: spacing.size480,\r\n position: 'absolute',\r\n },\r\n header: {\r\n marginBottom: spacing.size24,\r\n },\r\n content: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n },\r\n footer: {\r\n borderTopStyle: 'solid',\r\n borderColor: theme.palette.neutralLight,\r\n borderTopWidth: 1,\r\n background: palette.white,\r\n },\r\n },\r\n },\r\n };\r\n};\r\n\r\nexport const iconButtonStyles: IButtonStyles = {\r\n root: {\r\n backgroundColor: '#C7E0F4',\r\n marginRight: '8px',\r\n },\r\n};\r\n","import {\r\n Checkbox,\r\n classNamesFunction,\r\n ComboBox,\r\n DatePicker,\r\n DefaultButton,\r\n DirectionalHint,\r\n Dropdown,\r\n FocusZone,\r\n getTheme,\r\n IColumn,\r\n IComboBoxOption,\r\n Icon,\r\n IDropdownOption,\r\n IProcessedStyleSet,\r\n IRectangle,\r\n Label,\r\n Link,\r\n List,\r\n mergeStyles,\r\n MessageBarType,\r\n Panel,\r\n PanelType,\r\n Pivot,\r\n PivotItem,\r\n PrimaryButton,\r\n SearchBox,\r\n Spinner,\r\n TeachingBubble,\r\n TextField,\r\n} from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { AdSource, getAppStore, LayoutMode, LifeCycleStatus, onLayoutChanged, onNotificationChanged } from '../../../../@data';\r\nimport { FilterCondition } from '../../../../@data/store/schema/enums/FilterCondition';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { DataGrid, DataGridSelectionMode, IDataGrid, IDataGridCommandBarProps } from '../../../../components/DataGrid';\r\nimport { DayPickerStrings } from '../../../../components/DateTimePicker/DateTimePicker.types';\r\nimport { FormItem, FormSection, FormState } from '../../../../components/Form';\r\nimport { FilterType } from '../../../../components/GridFilter/GridFilter.types';\r\nimport { IIdNamePair } from '../../../../components/MultiSelectPicker';\r\nimport { adProvidersToNames } from '../../../../config/adProviders';\r\nimport { adQualityLocales } from '../../../../config/locale';\r\nimport { xandrAdProvidersToNames } from '../../../../config/xandrAdProviders';\r\nimport { NO_VALUE_PLACEHOLDER } from '../../../../constants/AppConstants';\r\nimport { LOCALE_LANGUAGE_MAPPING } from '../../../../globalization';\r\nimport { DetailPage } from '../../../../layout/DetailPage/DetailPage';\r\nimport { CommandBarActions, IDataGridColumn, IFilterItem } from '../../../../layout/GridPageV2';\r\nimport { Pagination } from '../../../../layout/GridPageV2/components/Pagination';\r\nimport { CSVHelper, injectIntlWithObserver, IRouterWithIntl } from '../../../../utils';\r\nimport { isButtonPressKey } from '../../../../utils/AccessibilityUtils';\r\nimport {\r\n onAdCreativePageInitialized,\r\n onAdDescriptionChanged,\r\n onAdListingPageSelection,\r\n onBlockAdInitialized,\r\n onBlockAdsAdPerfDataCleared,\r\n onBlockAdsBlockDetailsChanged,\r\n onBlockAdsBlockedImagesChanged,\r\n onBlockAdsBlockReasonChanged,\r\n onBlockAdsImagesChanged,\r\n onBlockAdsItemStatusChanged,\r\n onBlockAdsReasonLevelsChanged,\r\n onBlockAdsSelectedBlockRequestSourceChanged,\r\n onBlockAdsSelectedMarketChanged,\r\n onBlockAdsSubmitted,\r\n onBlockedAdsExportClicked,\r\n onBlockedImagesExportClicked,\r\n onBlockImageAdsChanged,\r\n onBlockImagesSubmitted,\r\n onBlockSummaryEndDateChanged,\r\n onBlockSummaryStartDateChanged,\r\n onFilterPanelHide,\r\n onFilterPanelShown,\r\n onRefreshBlockSummary,\r\n onSAMBlockAdsItemStatusChanged,\r\n onSAMBlockSummaryViewImagesClicked,\r\n onTeachingBubbleEndDateStatusChanged,\r\n onTeachingBubbleStartDateStatusChanged,\r\n} from '../@data/actions';\r\nimport {\r\n onAdCreativeAccountChanged,\r\n onAdCreativeBlockedMarketChanged,\r\n onAdCreativeBlockPanelChanged,\r\n onAdCreativeEndDateChanged,\r\n onAdCreativeExportClicked,\r\n onAdCreativeRefreshDataChanged,\r\n onAdCreativeSearchBoxValueChanged,\r\n onAdCreativeStartDateChanged,\r\n onAdQualityPanelApplyButtonClicked,\r\n onAdSourceChanged,\r\n} from '../@data/actions/onAdCreativeChanged';\r\nimport {\r\n onActiveFilterValuesChanged,\r\n onAdCreativeInitialAdProvidersChanged,\r\n onAdCreativeInitialMarketsChanged,\r\n onClearAll,\r\n onDeleteTextCondition,\r\n onListValueChanged,\r\n} from '../@data/mutatorActions';\r\nimport {\r\n blockDatatoAdPerfMapper,\r\n compareImages,\r\n extractPlacement,\r\n isAllImagesViewOnly,\r\n isImageBlockable,\r\n isImageBlocked,\r\n processImagesLink,\r\n samBlockSummaryToAdPerfMapper,\r\n toHttpsLink,\r\n} from '../@data/services/utility/utility';\r\nimport { getInitialFilterList } from '../@data/store/adQualitySelectors';\r\nimport { IAdListingSample } from '../@data/store/schema';\r\nimport { AdPerformanceData, BlockAdsData, BlockItemType, SAMBlockSummaryData } from '../@data/store/schema/models';\r\nimport { AdPerformanceBlockData } from '../@data/store/schema/models/AdPerformanceBlockData';\r\nimport { getStore } from '../@data/store/store';\r\nimport { AdQualityFilters } from '../AdQualityFilters/AdQualityFilters';\r\nimport messages from './AdCreativePage.messages';\r\nimport { getStyles } from './AdCreativePage.styles';\r\nimport { IAdCreativePageStyleProps, IAdCreativePageStyles, IFilterPanelProps } from './AdCreativePage.types';\r\nimport noImage from './noImageAvailable.svg';\r\n\r\nconst getClassNames = classNamesFunction<IAdCreativePageStyleProps, IAdCreativePageStyles>();\r\nconst ROWS_PER_PAGE = 10000;\r\nconst MAX_ROW_HEIGHT = 200;\r\nconst DEFAULT_MARKET_ID = 1033;\r\nconst HEADLINE_ENABLE_DATE = new Date(\r\n window.location.href.includes('pubcenternext-staging') || window.location.href.includes('next.pubcenter') ? '2024-08-20' : '2024-08-02'\r\n);\r\n\r\nexport const AdCreativePage = injectIntlWithObserver(\r\n class AdCreativePageComponent extends React.Component<IRouterWithIntl> {\r\n private _datagrid = React.createRef<IDataGrid>();\r\n private _classNames: IProcessedStyleSet<IAdCreativePageStyles>;\r\n private _columnCount: number;\r\n private _columnWidth: number;\r\n private _rowHeight: number;\r\n\r\n private _filterItems: IFilterItem[] = [\r\n { columnName: 'name', filterName: this.props.intl.formatMessage(messages.accountName), filterType: FilterType.string },\r\n ];\r\n\r\n public componentDidMount() {\r\n const publisherId = getAppStore().publisher!.id;\r\n onLayoutChanged(LayoutMode.Default);\r\n onAdCreativePageInitialized(publisherId);\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { formatMessage } = this.props.intl;\r\n const theme = getTheme();\r\n this._classNames = getClassNames(getStyles, { theme });\r\n\r\n return (\r\n <Pivot\r\n aria-label={formatMessage(messages.adReview)}\r\n linkSize=\"large\"\r\n styles={this._classNames.subComponentStyles.pivot}\r\n className={this._classNames.root}\r\n onLinkClick={(item) => {\r\n if (item && item.props.headerText === formatMessage(messages.adReview)) {\r\n onAdCreativeRefreshDataChanged();\r\n } else {\r\n if (getStore().active.selectedAdSource === AdSource.XandrAuction) {\r\n const val: IComboBoxOption = {\r\n key: AdSource.Auction,\r\n text: formatMessage(messages.auction),\r\n ariaLabel: formatMessage(messages.auction),\r\n };\r\n onAdSourceChanged(val);\r\n }\r\n }\r\n }}\r\n >\r\n <PivotItem headerText={formatMessage(messages.adReview)} className={this._classNames.adReview} itemKey={'adCreative'}>\r\n {this._filterFields()}\r\n {this._adPerfDataGrid()}\r\n <Panel\r\n isOpen={getStore().panelIsOpen}\r\n type={PanelType.medium}\r\n onDismiss={() => {\r\n onAdCreativeBlockPanelChanged(false);\r\n onLayoutChanged(LayoutMode.Default);\r\n }}\r\n closeButtonAriaLabel={formatMessage(AppMessages.close)}\r\n >\r\n {getStore().panelItemType === BlockItemType.Ads && this._blockAds(FormState.InPageCreate)}\r\n {getStore().panelItemType === BlockItemType.Images && this._blockImages(FormState.InPageCreate)}\r\n </Panel>\r\n </PivotItem>\r\n <PivotItem headerText={formatMessage(messages.blockSummary)} itemKey={'blockSummary'} className={this._classNames.adReview}>\r\n {this._blockSummaryPageFields()}\r\n {getStore().active.selectedAdSource === AdSource.Auction && this._SAMBlockSummaryDataGrid()}\r\n {getStore().active.selectedAdSource === AdSource.Microsoft && this._blockSummaryDataGrid()}\r\n\r\n <Panel\r\n isOpen={getStore().panelIsOpen}\r\n type={PanelType.medium}\r\n onDismiss={() => {\r\n onAdCreativeBlockPanelChanged(false);\r\n onLayoutChanged(LayoutMode.Default);\r\n }}\r\n closeButtonAriaLabel={formatMessage(AppMessages.close)}\r\n >\r\n {getStore().panelItemType === BlockItemType.Images && this._blockImages(FormState.InPageEdit)}\r\n {getStore().panelItemType === BlockItemType.Ads && this._blockAds(FormState.InPageEdit)}\r\n </Panel>\r\n </PivotItem>\r\n </Pivot>\r\n );\r\n }\r\n\r\n private _blockSummaryPageFields = (): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const store = getStore();\r\n const appStore = getAppStore();\r\n const adSourceOptions: IDropdownOption[] = [\r\n {\r\n key: AdSource.Microsoft,\r\n text: formatMessage(messages.microsoft),\r\n ariaLabel: formatMessage(messages.microsoft),\r\n },\r\n {\r\n key: AdSource.Auction,\r\n text: formatMessage(messages.auction),\r\n ariaLabel: formatMessage(messages.auction),\r\n },\r\n ];\r\n return (\r\n <>\r\n <div className={this._classNames.adSourceField}>\r\n <FormItem styles={this._classNames.subComponentStyles.formItem}>\r\n <ComboBox\r\n useComboBoxAsMenuWidth={true}\r\n autoComplete=\"on\"\r\n placeholder={formatMessage(messages.adSourceCombo)}\r\n ariaLabel={formatMessage(messages.adSourceCombo)}\r\n label={formatMessage(messages.adSourceCombo)}\r\n options={adSourceOptions}\r\n required={true}\r\n onChange={(_, value) => {\r\n onAdSourceChanged(value);\r\n }}\r\n selectedKey={store.active.selectedAdSource}\r\n />\r\n </FormItem>\r\n </div>\r\n <div className={this._classNames.filterFields}>\r\n <FormItem styles={this._classNames.subComponentStyles.formItem}>\r\n <ComboBox\r\n useComboBoxAsMenuWidth={true}\r\n autoComplete=\"on\"\r\n placeholder={formatMessage(messages.accountsCombo)}\r\n ariaLabel={formatMessage(messages.accountsCombo)}\r\n label={formatMessage(messages.accountsCombo)}\r\n options={this._createDropDown(store.active.accounts)}\r\n required={true}\r\n onChange={(_, value) => onAdCreativeAccountChanged(value)}\r\n selectedKey={store.active.selectedAccount}\r\n disabled={store.active.selectedAdSource ? store.active.selectedAdSource === AdSource.Auction : false}\r\n tabIndex={store.active.selectedAdSource && store.active.selectedAdSource === AdSource.Auction ? -1 : undefined}\r\n />\r\n </FormItem>\r\n <FormItem styles={this._classNames.subComponentStyles.formItem}>\r\n <ComboBox\r\n useComboBoxAsMenuWidth={false}\r\n autoComplete=\"on\"\r\n placeholder={formatMessage(messages.marketsCombo)}\r\n ariaLabel={formatMessage(messages.marketsCombo)}\r\n label={formatMessage(messages.marketsCombo)}\r\n options={this._createLocaleOptions(true)}\r\n required={true}\r\n selectedKey={store.active.selectedBlockedMarketId}\r\n onChange={(_, value) => onAdCreativeBlockedMarketChanged(value)}\r\n disabled={store.active.selectedAdSource ? store.active.selectedAdSource === AdSource.Microsoft : false}\r\n tabIndex={store.active.selectedAdSource && store.active.selectedAdSource === AdSource.Microsoft ? -1 : undefined}\r\n />\r\n </FormItem>\r\n <FormItem styles={this._classNames.subComponentStyles.formItem}>\r\n <DatePicker\r\n strings={DayPickerStrings}\r\n allowTextInput={true}\r\n placeholder={formatMessage(messages.startDatePlaceHolder)}\r\n ariaLabel={formatMessage(messages.startDate)}\r\n label={formatMessage(messages.startDate)}\r\n value={store.active.blockSummaryStartDate}\r\n onSelectDate={(value) => onBlockSummaryStartDateChanged(value!)}\r\n maxDate={store.active.blockSummaryEndDate !== undefined ? store.active.blockSummaryEndDate : new Date(Date.now())}\r\n />\r\n </FormItem>\r\n <FormItem styles={this._classNames.subComponentStyles.formItem}>\r\n <span\r\n className={this._classNames.selectedClose}\r\n role=\"button\"\r\n tabIndex={0}\r\n onClick={() => onBlockSummaryStartDateChanged()}\r\n onKeyDown={(ev) => {\r\n if (isButtonPressKey(ev.key)) {\r\n onBlockSummaryStartDateChanged();\r\n }\r\n }}\r\n aria-label={formatMessage(messages.clearStartDateSelAriaLabel)}\r\n >\r\n <Icon className={this._classNames.cancelIcon} iconName=\"Cancel\" />\r\n </span>\r\n </FormItem>\r\n <FormItem styles={this._classNames.subComponentStyles.formItem}>\r\n <DatePicker\r\n strings={DayPickerStrings}\r\n allowTextInput={true}\r\n placeholder={formatMessage(messages.endDatePlaceHolder)}\r\n ariaLabel={formatMessage(messages.endDatePlaceHolder)}\r\n maxDate={new Date(Date.now() + 24 * 60 * 60 * 1000)}\r\n minDate={store.active.blockSummaryStartDate}\r\n label={formatMessage(messages.endDate)}\r\n value={store.active.blockSummaryEndDate}\r\n onSelectDate={(value) => onBlockSummaryEndDateChanged(value!)}\r\n />\r\n </FormItem>\r\n <FormItem styles={this._classNames.subComponentStyles.formItem}>\r\n <span\r\n className={this._classNames.selectedClose}\r\n role=\"button\"\r\n tabIndex={0}\r\n onClick={() => {\r\n onBlockSummaryEndDateChanged();\r\n }}\r\n onKeyDown={(ev) => {\r\n if (isButtonPressKey(ev.key)) {\r\n onBlockSummaryEndDateChanged();\r\n }\r\n }}\r\n aria-label={formatMessage(messages.clearEndDateSelAriaLabel)}\r\n >\r\n <Icon className={this._classNames.cancelIcon} iconName=\"Cancel\" />\r\n </span>\r\n </FormItem>\r\n <PrimaryButton\r\n text={formatMessage(messages.applyFilters)}\r\n onClick={() => onRefreshBlockSummary()}\r\n disabled={appStore.loading}\r\n className={this._classNames.applyButton}\r\n ariaDescription={formatMessage(messages.applyFiltersAriaDesc)}\r\n />\r\n </div>\r\n </>\r\n );\r\n };\r\n\r\n private _renderAdProviderOptions = (providersToNames: Object): IIdNamePair[] => {\r\n const adSourceOptions: IDropdownOption[] = [];\r\n\r\n Object.keys(providersToNames).forEach((adProvider) => {\r\n // to exclude Bing/MSAN\r\n if (adProvider !== '483' && adProvider !== '548' && adProvider !== '4') {\r\n adSourceOptions!.push({\r\n key: parseInt(adProvider, 10),\r\n text: providersToNames[adProvider],\r\n ariaLabel: providersToNames[adProvider],\r\n });\r\n }\r\n });\r\n\r\n adSourceOptions.sort((a, b) => {\r\n const firstValue = a.text;\r\n const secondValue = b.text;\r\n\r\n return firstValue.toLowerCase() > secondValue.toLowerCase() ? 1 : -1;\r\n });\r\n\r\n const adProviders: IIdNamePair[] = [...adSourceOptions].map((item) => ({\r\n id: parseInt(item.key.toString(), 10),\r\n name: item.text,\r\n isSelected: true,\r\n }));\r\n\r\n adSourceOptions.unshift({\r\n key: 0,\r\n text: 'All',\r\n ariaLabel: 'All',\r\n });\r\n\r\n return adProviders;\r\n };\r\n\r\n private _blockSummaryDataGrid = (): JSX.Element => {\r\n const store = getStore();\r\n const { formatMessage } = this.props.intl;\r\n\r\n const _gridDefaultColumns: IDataGridColumn[] = [\r\n { columnName: 'adTitle', friendlyName: 'Ad title', isVisible: true, headerCSV: 'Ad_Title', isExportColumn: true },\r\n { columnName: 'channelName', friendlyName: 'Channel', isVisible: true, headerCSV: 'Channel', isExportColumn: true },\r\n { columnName: 'accountName', friendlyName: 'Account', isVisible: true, headerCSV: 'Account', isExportColumn: false },\r\n { columnName: 'allImages', friendlyName: 'Ad images', isVisible: true, headerCSV: 'Ad_images', isExportColumn: false },\r\n { columnName: 'advertiserName', friendlyName: 'Advertiser', isVisible: true, headerCSV: 'Advertiser', isExportColumn: true },\r\n { columnName: 'adId', friendlyName: 'Ad id', isVisible: true, headerCSV: 'Ad_Id', isExportColumn: true },\r\n {\r\n columnName: 'reasonCategory',\r\n friendlyName: 'Reason category',\r\n isVisible: false,\r\n headerCSV: 'Reason_Category',\r\n isExportColumn: false,\r\n },\r\n {\r\n columnName: 'blockReasonMainCategory',\r\n friendlyName: 'Block category',\r\n isVisible: false,\r\n headerCSV: 'Block Category',\r\n isExportColumn: true,\r\n },\r\n {\r\n columnName: 'blockReasonSubCategory',\r\n friendlyName: 'Sub category',\r\n isVisible: false,\r\n headerCSV: 'Sub Category',\r\n isExportColumn: true,\r\n },\r\n {\r\n columnName: 'reason',\r\n friendlyName: 'Reason',\r\n isVisible: true,\r\n headerCSV: 'Reason',\r\n isExportColumn: true,\r\n exportFunction: CSVHelper.populateNull,\r\n },\r\n {\r\n columnName: 'blockRequestSource',\r\n friendlyName: 'Block request source',\r\n isVisible: true,\r\n headerCSV: 'Block request source',\r\n isExportColumn: true,\r\n exportFunction: CSVHelper.getBlockRequestSource,\r\n },\r\n {\r\n columnName: 'pastRevenue',\r\n friendlyName: 'Revenue impact',\r\n isVisible: true,\r\n headerCSV: 'Revenue_Impact_(7-day)',\r\n isExportColumn: true,\r\n exportFunction: CSVHelper.getRevenue,\r\n },\r\n {\r\n columnName: 'modifiedDateTime',\r\n friendlyName: 'Modified time (UTC)',\r\n isVisible: true,\r\n headerCSV: 'Modified_Date',\r\n isExportColumn: true,\r\n exportFunction: CSVHelper.extractDate,\r\n },\r\n { columnName: 'modifiedByName', friendlyName: 'Modified by', isVisible: true, headerCSV: 'Modified_By', isExportColumn: true },\r\n {\r\n columnName: 'isEnabled',\r\n friendlyName: 'Blocking status',\r\n isVisible: true,\r\n headerCSV: 'Blocking_status',\r\n isExportColumn: true,\r\n exportFunction: CSVHelper.getBlockingStatus,\r\n },\r\n ];\r\n\r\n const _gridImageDefaultColumns: IDataGridColumn[] = [\r\n { columnName: 'adId', friendlyName: 'Ad Id', isVisible: false, headerCSV: 'Ad_Id', isExportColumn: true },\r\n { columnName: 'adTitle', friendlyName: 'Ad title', isVisible: true, headerCSV: 'Ad_Title', isExportColumn: true },\r\n { columnName: 'image', friendlyName: 'Image Url', isVisible: false, headerCSV: 'Image_Url', isExportColumn: true },\r\n { columnName: 'adUnitId', friendlyName: 'Ad Unit Id', isVisible: false, headerCSV: 'Adunit_Id', isExportColumn: true },\r\n {\r\n columnName: 'blockReason',\r\n friendlyName: 'Reason',\r\n isVisible: true,\r\n headerCSV: 'Reason',\r\n isExportColumn: true,\r\n exportFunction: CSVHelper.populateNull,\r\n },\r\n {\r\n columnName: 'blockReasonComment',\r\n friendlyName: 'Reason Comment',\r\n isVisible: false,\r\n headerCSV: 'Reason_Comment',\r\n isExportColumn: true,\r\n },\r\n { columnName: 'reportedByName', friendlyName: 'Modified by', isVisible: true, headerCSV: 'Modified_By', isExportColumn: true },\r\n {\r\n columnName: 'modifiedDateTime',\r\n friendlyName: 'Modified time (UTC)',\r\n isVisible: true,\r\n headerCSV: 'Modified_Date',\r\n isExportColumn: true,\r\n exportFunction: CSVHelper.extractDate,\r\n },\r\n ];\r\n const _commandBarProps: IDataGridCommandBarProps = {\r\n items: [\r\n {\r\n key: 'ExportImageBlock',\r\n name: formatMessage(messages.exportImageBlocks),\r\n iconProps: {\r\n iconName: 'Export',\r\n },\r\n selectionModes: [DataGridSelectionMode.None, DataGridSelectionMode.Single, DataGridSelectionMode.Multiple],\r\n onClick: () => {\r\n onBlockedImagesExportClicked(_gridImageDefaultColumns);\r\n },\r\n },\r\n {\r\n key: 'ExportAdBlock',\r\n name: formatMessage(messages.exportGrid),\r\n iconProps: {\r\n iconName: 'Export',\r\n },\r\n selectionModes: [DataGridSelectionMode.None, DataGridSelectionMode.Single, DataGridSelectionMode.Multiple],\r\n onClick: () => {\r\n onBlockedAdsExportClicked(_gridDefaultColumns);\r\n },\r\n },\r\n {\r\n key: 'Activate',\r\n name: formatMessage(messages.enableBlocking),\r\n iconProps: {\r\n iconName: 'ActivateOrders',\r\n },\r\n selectionModes: [DataGridSelectionMode.Single],\r\n selectionStatus: LifeCycleStatus.Inactive,\r\n onClick: () => {\r\n const items = this._getBlockDataSelectionItems();\r\n if (items && items[0]) {\r\n onBlockAdsItemStatusChanged(items[0], LifeCycleStatus.Active);\r\n }\r\n },\r\n },\r\n {\r\n key: 'Deactivate',\r\n name: formatMessage(messages.disableBlocking),\r\n iconProps: {\r\n iconName: 'DeactivateOrders',\r\n },\r\n onClick: () => {\r\n const items = this._getBlockDataSelectionItems();\r\n if (items && items[0]) {\r\n onBlockAdsItemStatusChanged(items[0], LifeCycleStatus.Inactive);\r\n }\r\n },\r\n selectionModes: [DataGridSelectionMode.Single],\r\n selectionStatus: LifeCycleStatus.Active,\r\n },\r\n {\r\n key: 'Edit',\r\n name: formatMessage(messages.editBlockReason),\r\n iconProps: {\r\n iconName: 'Edit',\r\n },\r\n onClick: () => {\r\n const items = this._getBlockDataSelectionItems();\r\n\r\n if (items && items[0]) {\r\n const mappedItems = blockDatatoAdPerfMapper(items);\r\n onBlockAdInitialized(mappedItems);\r\n }\r\n\r\n onAdCreativeBlockPanelChanged(true, BlockItemType.Ads);\r\n },\r\n selectionModes: [DataGridSelectionMode.Single],\r\n selectionStatus: LifeCycleStatus.Active,\r\n },\r\n ],\r\n };\r\n\r\n return (\r\n <DataGrid\r\n componentRef={this._datagrid}\r\n intl={this.props.intl}\r\n commandBarProps={_commandBarProps}\r\n detailListProps={{\r\n items: store.active.blockSummaryData ? store.active.blockSummaryData : [],\r\n columns: _gridDefaultColumns,\r\n onRenderItemColumn: (data: BlockAdsData, index: number, column: IColumn) =>\r\n this._renderBlockSummaryItemColumn(data, index, column),\r\n }}\r\n sortByColumn={{\r\n columnKeyToSortBy: 'modifiedDateTime',\r\n isSortedDescending: true,\r\n }}\r\n ariaLabel={formatMessage(messages.blockSummaryMSGridAriaLabel)}\r\n // notReadyProps={\r\n // !appStore.loading && store.active.blockSummaryData\r\n // ? store.active.blockSummaryData.length === 0\r\n // ? notReadyProps\r\n // : undefined\r\n // : undefined\r\n // }\r\n />\r\n );\r\n };\r\n\r\n private _SAMBlockSummaryDataGrid = (): JSX.Element => {\r\n const store = getStore();\r\n const { formatMessage } = this.props.intl;\r\n\r\n const _gridDefaultColumns: IDataGridColumn[] = [\r\n { columnName: 'adTitle', friendlyName: 'Ad title', headerCSV: 'Ad_Title', isVisible: true, isExportColumn: true },\r\n { columnName: 'adProvider', friendlyName: 'Ad provider', headerCSV: 'Ad_Provider', isVisible: true, isExportColumn: true },\r\n { columnName: 'advertiser', friendlyName: 'Advertiser', headerCSV: 'Advertiser', isVisible: true, isExportColumn: true },\r\n { columnName: 'allImages', friendlyName: 'Ad images', headerCSV: 'Ad_Images', isVisible: true, isExportColumn: false },\r\n { columnName: 'creativeAdId', friendlyName: 'Ad id', headerCSV: 'Ad_id', isVisible: true, isExportColumn: true },\r\n { columnName: 'blockReasonCategory', friendlyName: 'Reason', headerCSV: 'Reason_Category', isVisible: true, isExportColumn: false },\r\n {\r\n columnName: 'blockReasonMainCategory',\r\n friendlyName: 'Block category',\r\n isVisible: false,\r\n headerCSV: 'Block Category',\r\n isExportColumn: true,\r\n },\r\n {\r\n columnName: 'blockReasonSubCategory',\r\n friendlyName: 'Sub category',\r\n isVisible: false,\r\n headerCSV: 'Sub Category',\r\n isExportColumn: true,\r\n },\r\n {\r\n columnName: 'blockReasonComment',\r\n friendlyName: 'blockReasonComment',\r\n headerCSV: 'Reason',\r\n isVisible: false,\r\n isExportColumn: true,\r\n exportFunction: CSVHelper.populateNull,\r\n },\r\n {\r\n columnName: 'blockRequestSource',\r\n friendlyName: 'Block request source',\r\n headerCSV: 'Block request source',\r\n isVisible: true,\r\n isExportColumn: true,\r\n exportFunction: CSVHelper.getBlockRequestSource,\r\n },\r\n { columnName: 'locale', friendlyName: 'Blocked market', headerCSV: 'Blocked_Market', isVisible: true, isExportColumn: true },\r\n {\r\n columnName: 'modifiedDateTime',\r\n friendlyName: 'Modified time',\r\n headerCSV: 'Modified_Date',\r\n isVisible: true,\r\n isExportColumn: true,\r\n exportFunction: CSVHelper.extractDate,\r\n },\r\n { columnName: 'reportedByName', friendlyName: 'Modified by', headerCSV: 'Modified_By', isVisible: true, isExportColumn: true },\r\n {\r\n columnName: 'filterStatus',\r\n friendlyName: 'Blocking status',\r\n isVisible: true,\r\n headerCSV: 'Blocking_status',\r\n isExportColumn: true,\r\n },\r\n ];\r\n\r\n const _commandBarProps: IDataGridCommandBarProps = {\r\n items: [\r\n {\r\n key: 'ExportAdBlock',\r\n name: formatMessage(messages.exportGrid),\r\n iconProps: {\r\n iconName: 'Export',\r\n },\r\n selectionModes: [DataGridSelectionMode.None, DataGridSelectionMode.Single, DataGridSelectionMode.Multiple],\r\n onClick: () => {\r\n onBlockedAdsExportClicked(_gridDefaultColumns);\r\n },\r\n },\r\n {\r\n key: 'Activate',\r\n name: formatMessage(messages.enableBlocking),\r\n iconProps: {\r\n iconName: 'ActivateOrders',\r\n },\r\n selectionModes: [DataGridSelectionMode.Single],\r\n selectionStatus: LifeCycleStatus.Inactive,\r\n onClick: () => {\r\n const items = this._getSAMBlockDataSelectionItems();\r\n if (items && items[0]) {\r\n onSAMBlockAdsItemStatusChanged(items[0], LifeCycleStatus.Active);\r\n }\r\n },\r\n },\r\n {\r\n key: 'Deactivate',\r\n name: formatMessage(messages.disableBlocking),\r\n iconProps: {\r\n iconName: 'DeactivateOrders',\r\n },\r\n onClick: () => {\r\n const items = this._getSAMBlockDataSelectionItems();\r\n if (items && items[0]) {\r\n onSAMBlockAdsItemStatusChanged(items[0], LifeCycleStatus.Inactive);\r\n }\r\n },\r\n selectionModes: [DataGridSelectionMode.Single],\r\n selectionStatus: LifeCycleStatus.Active,\r\n },\r\n {\r\n key: 'Edit',\r\n name: formatMessage(messages.editBlockReason),\r\n iconProps: {\r\n iconName: 'Edit',\r\n },\r\n selectionModes: [DataGridSelectionMode.Single],\r\n selectionStatus: LifeCycleStatus.Active,\r\n onClick: () => {\r\n const items = this._getSAMBlockDataSelectionItems();\r\n\r\n if (items && items[0]) {\r\n const mappedItems = samBlockSummaryToAdPerfMapper(items);\r\n onBlockAdInitialized(mappedItems);\r\n }\r\n onAdCreativeBlockPanelChanged(true, BlockItemType.Ads);\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return (\r\n <DataGrid\r\n componentRef={this._datagrid}\r\n intl={this.props.intl}\r\n commandBarProps={_commandBarProps}\r\n detailListProps={{\r\n items: store.active.samBlockSummaryData ? store.active.samBlockSummaryData : [],\r\n columns: _gridDefaultColumns,\r\n onRenderItemColumn: (item: SAMBlockSummaryData, index: number, column: IColumn) =>\r\n this._renderSAMBlockSummaryItemColumn(item, index, column),\r\n }}\r\n sortByColumn={{\r\n columnKeyToSortBy: 'modifiedDateTime',\r\n isSortedDescending: true,\r\n }}\r\n ariaLabel={formatMessage(messages.blockSummaryAuctionGridAriaLabel)}\r\n />\r\n );\r\n };\r\n\r\n private _filterFields = (): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const store = getStore();\r\n const appStore = getAppStore();\r\n const adSourceOptions: IDropdownOption[] = [\r\n {\r\n key: AdSource.Microsoft,\r\n text: formatMessage(messages.microsoft),\r\n ariaLabel: formatMessage(messages.microsoft),\r\n },\r\n {\r\n key: AdSource.Auction,\r\n text: formatMessage(messages.auction),\r\n ariaLabel: formatMessage(messages.auction),\r\n },\r\n {\r\n key: AdSource.XandrAuction,\r\n text: formatMessage(messages.xandrAuction),\r\n ariaLabel: formatMessage(messages.xandrAuction),\r\n },\r\n ];\r\n\r\n const auctionAdProviders = this._renderAdProviderOptions(adProvidersToNames);\r\n const xandrAuctionAdProviders = this._renderAdProviderOptions(xandrAdProvidersToNames);\r\n\r\n const auctionMarkets: IIdNamePair[] = [...this._createLocaleOptions()].map((item) => ({\r\n id: parseInt(item.key.toString(), 10),\r\n name: item.text,\r\n isSelected: item.key === DEFAULT_MARKET_ID,\r\n }));\r\n const last3Months = new Date();\r\n last3Months.setMonth(last3Months.getMonth() - 3);\r\n\r\n return (\r\n <>\r\n <div className={this._classNames.adSourceFields}>\r\n {\r\n // Ad Source\r\n }\r\n <FormItem styles={this._classNames.subComponentStyles.formItem}>\r\n <ComboBox\r\n useComboBoxAsMenuWidth={true}\r\n autoComplete=\"on\"\r\n placeholder={formatMessage(messages.adSourceCombo)}\r\n ariaLabel={formatMessage(messages.adSourceCombo)}\r\n label={formatMessage(messages.adSourceCombo)}\r\n options={adSourceOptions}\r\n required={true}\r\n onChange={(_, value) => {\r\n onAdSourceChanged(value);\r\n if (value !== undefined && value.text === 'Auction') {\r\n onAdCreativeInitialAdProvidersChanged(auctionAdProviders);\r\n } else if (value !== undefined && value.text === 'Xandr Auction') {\r\n onAdCreativeInitialAdProvidersChanged(xandrAuctionAdProviders);\r\n }\r\n onAdCreativeInitialMarketsChanged(auctionMarkets);\r\n onClearAll();\r\n }}\r\n selectedKey={store.active.selectedAdSource}\r\n />\r\n </FormItem>\r\n {\r\n // Start Date\r\n store.active.selectedAdSource !== AdSource.XandrAuction && (\r\n <FormItem styles={this._classNames.subComponentStyles.formItem}>\r\n <DatePicker\r\n id={'startDatePicker'}\r\n isRequired={true}\r\n strings={DayPickerStrings}\r\n allowTextInput={true}\r\n placeholder={formatMessage(messages.startDatePlaceHolder)}\r\n ariaLabel={formatMessage(messages.startDate)}\r\n label={formatMessage(messages.startDate)}\r\n value={store.active.startDate}\r\n onSelectDate={(value) => onAdCreativeStartDateChanged(value!)}\r\n maxDate={store.active.endDate}\r\n minDate={last3Months}\r\n />\r\n </FormItem>\r\n )\r\n }\r\n {\r\n // End date\r\n store.active.selectedAdSource !== AdSource.XandrAuction && (\r\n <FormItem styles={this._classNames.subComponentStyles.formItem}>\r\n <DatePicker\r\n id={'endDatePicker'}\r\n isRequired={true}\r\n strings={DayPickerStrings}\r\n allowTextInput={true}\r\n placeholder={formatMessage(messages.endDatePlaceHolder)}\r\n ariaLabel={formatMessage(messages.endDatePlaceHolder)}\r\n maxDate={new Date(Date.now() + 24 * 60 * 60 * 1000)}\r\n minDate={store.active.startDate}\r\n label={formatMessage(messages.endDate)}\r\n value={store.active.endDate}\r\n onSelectDate={(value) => onAdCreativeEndDateChanged(value!)}\r\n />\r\n </FormItem>\r\n )\r\n }\r\n {\r\n // SearchBox\r\n }\r\n <div className={this._classNames.searchBoxItem}>\r\n <SearchBox\r\n styles={this._classNames.subComponentStyles.searchBox}\r\n placeholder={'Search'}\r\n defaultValue={store.active.searchBoxValue}\r\n onChanged={(value: string) => {\r\n onAdCreativeSearchBoxValueChanged(value);\r\n }}\r\n onSearch={(value: string) => {\r\n onAdCreativeSearchBoxValueChanged(value);\r\n onAdCreativeRefreshDataChanged();\r\n }}\r\n />\r\n\r\n {store.active.selectedAdSource === AdSource.Microsoft && (\r\n <Checkbox\r\n checked={store.adDescription}\r\n className={this._classNames.descriptionCheckbox}\r\n onChange={(_, value) => onAdDescriptionChanged(!!value)}\r\n label={formatMessage(messages.adDescriptionCheckboxLabel)}\r\n boxSide=\"end\"\r\n />\r\n )}\r\n </div>\r\n\r\n {\r\n // Apply\r\n }\r\n <PrimaryButton\r\n text={formatMessage(messages.applyFilters)}\r\n onClick={() => {\r\n onAdCreativeRefreshDataChanged();\r\n }}\r\n disabled={appStore.loading}\r\n className={this._classNames.applyButton}\r\n ariaDescription={formatMessage(messages.applyFiltersAriaDesc)}\r\n />\r\n\r\n {this._renderFilterPanel(store.filterPanel)}\r\n\r\n {store.teachingBubbleEndDate ? (\r\n <TeachingBubble\r\n target={'#endDatePicker'}\r\n calloutProps={{ directionalHint: DirectionalHint.bottomLeftEdge }}\r\n hasSmallHeadline={true}\r\n hasCloseIcon={true}\r\n closeButtonAriaLabel={formatMessage(AppMessages.close)}\r\n onDismiss={() => {\r\n onTeachingBubbleEndDateStatusChanged(false);\r\n }}\r\n headline={formatMessage(messages.queryTimeoutWarningHeaderLabel)}\r\n >\r\n {formatMessage(messages.queryTimeoutWarningDescriptionLabel)}\r\n </TeachingBubble>\r\n ) : null}\r\n\r\n {store.teachingBubbleStartDate ? (\r\n <TeachingBubble\r\n target={'#startDatePicker'}\r\n calloutProps={{ directionalHint: DirectionalHint.bottomLeftEdge }}\r\n hasSmallHeadline={true}\r\n hasCloseIcon={true}\r\n closeButtonAriaLabel={formatMessage(AppMessages.close)}\r\n onDismiss={() => {\r\n onTeachingBubbleStartDateStatusChanged(false);\r\n }}\r\n headline={formatMessage(messages.queryTimeoutWarningHeaderLabel)}\r\n >\r\n {formatMessage(messages.queryTimeoutWarningDescriptionLabel)}\r\n </TeachingBubble>\r\n ) : null}\r\n </div>\r\n </>\r\n );\r\n };\r\n\r\n private _adPerfDataGrid = (): JSX.Element => {\r\n const store = getStore();\r\n const selectedAdSource = store.active.selectedAdSource;\r\n const { formatMessage } = this.props.intl;\r\n const _gridDefaultColumns: IDataGridColumn[] = [\r\n {\r\n columnName: 'status',\r\n friendlyName: 'Status',\r\n isVisible: selectedAdSource === AdSource.Auction || selectedAdSource === AdSource.XandrAuction,\r\n headerCSV: 'Status',\r\n isExportColumn: selectedAdSource === AdSource.Auction || selectedAdSource === AdSource.XandrAuction,\r\n exportFunction: CSVHelper.getStatus,\r\n },\r\n {\r\n columnName: 'adSource',\r\n friendlyName: 'Ad provider',\r\n isVisible: true,\r\n headerCSV: 'Ad_Provider',\r\n isExportColumn: selectedAdSource === AdSource.Microsoft,\r\n exportFunction: () => '\"Microsoft\"',\r\n },\r\n {\r\n columnName: 'adProvider',\r\n friendlyName: 'Ad provider',\r\n isVisible: false,\r\n headerCSV: 'Ad_Provider',\r\n isExportColumn: selectedAdSource === AdSource.Auction || selectedAdSource === AdSource.XandrAuction,\r\n exportFunction: selectedAdSource === AdSource.Auction ? CSVHelper.getAdProvider : CSVHelper.getXandrAdProvider,\r\n },\r\n {\r\n columnName: 'adId',\r\n friendlyName: 'Ad id',\r\n isVisible: selectedAdSource === AdSource.Microsoft,\r\n headerCSV: 'Ad_Id',\r\n isExportColumn: selectedAdSource === AdSource.Microsoft,\r\n },\r\n {\r\n columnName: 'adDomain',\r\n friendlyName: 'Ad domain',\r\n isVisible: false,\r\n headerCSV: 'Ad_Domain',\r\n isExportColumn: false,\r\n },\r\n {\r\n columnName: 'uniqueCreativeAdId',\r\n friendlyName: 'Creative ad id',\r\n isVisible: selectedAdSource === AdSource.Auction || selectedAdSource === AdSource.XandrAuction,\r\n headerCSV: 'Creative_Ad_Id',\r\n isExportColumn: selectedAdSource === AdSource.Auction || selectedAdSource === AdSource.XandrAuction,\r\n },\r\n { columnName: 'advertiserName', friendlyName: 'Advertiser', isVisible: true, headerCSV: 'Advertiser', isExportColumn: true },\r\n {\r\n columnName: 'advertiserId',\r\n friendlyName: 'Advertiser id',\r\n isVisible: selectedAdSource === AdSource.Microsoft,\r\n headerCSV: 'Advertiser_customer_id',\r\n isExportColumn: selectedAdSource === AdSource.Microsoft,\r\n },\r\n {\r\n columnName: 'advertiserAccountId',\r\n friendlyName: 'Advertiser account id',\r\n isVisible: selectedAdSource === AdSource.Microsoft,\r\n headerCSV: 'Advertiser_account_id',\r\n isExportColumn: selectedAdSource === AdSource.Microsoft,\r\n },\r\n {\r\n columnName: 'accountName',\r\n friendlyName: 'Account name',\r\n isVisible: selectedAdSource === AdSource.Microsoft && store.active.selectedAccount === -1,\r\n },\r\n { columnName: 'adTitle', friendlyName: 'Ad title', isVisible: true, headerCSV: 'Ad_Title', isExportColumn: true },\r\n {\r\n columnName: 'adURL',\r\n friendlyName: 'Ad URL',\r\n isVisible: selectedAdSource === AdSource.Microsoft || selectedAdSource === AdSource.XandrAuction,\r\n headerCSV: 'Ad_Url',\r\n isExportColumn: selectedAdSource === AdSource.Microsoft || selectedAdSource === AdSource.XandrAuction,\r\n },\r\n {\r\n columnName: 'longHeadline',\r\n friendlyName: 'Long Headline',\r\n isVisible: selectedAdSource === AdSource.Microsoft && !!(store.active.startDate && store.active.startDate > HEADLINE_ENABLE_DATE),\r\n headerCSV: 'Long Headline',\r\n isExportColumn:\r\n selectedAdSource === AdSource.Microsoft && !!(store.active.startDate && store.active.startDate > HEADLINE_ENABLE_DATE),\r\n },\r\n {\r\n columnName: 'shortHeadline',\r\n friendlyName: 'Short Headline',\r\n isVisible: selectedAdSource === AdSource.Microsoft && !!(store.active.startDate && store.active.startDate > HEADLINE_ENABLE_DATE),\r\n headerCSV: 'Short Headline',\r\n isExportColumn:\r\n selectedAdSource === AdSource.Microsoft && !!(store.active.startDate && store.active.startDate > HEADLINE_ENABLE_DATE),\r\n },\r\n {\r\n columnName: 'adDestUrl',\r\n friendlyName: 'Ad landing page',\r\n isVisible: false,\r\n headerCSV: 'Ad_Landing_Page',\r\n isExportColumn: selectedAdSource === AdSource.Microsoft,\r\n },\r\n { columnName: 'images', friendlyName: 'Ad images', isVisible: true },\r\n {\r\n columnName: 'adUnitName',\r\n friendlyName: 'Placement',\r\n isVisible: selectedAdSource === AdSource.Microsoft || selectedAdSource === AdSource.Auction,\r\n headerCSV: selectedAdSource === AdSource.Microsoft ? 'Ad_Unit' : 'Placement',\r\n isExportColumn: selectedAdSource === AdSource.Microsoft || selectedAdSource === AdSource.Auction,\r\n exportFunction: selectedAdSource === AdSource.Microsoft ? undefined : CSVHelper.getPlacement,\r\n },\r\n {\r\n columnName: 'adImpressions',\r\n friendlyName: 'Impressions',\r\n isVisible: selectedAdSource !== AdSource.XandrAuction,\r\n headerCSV: 'Impressions',\r\n isExportColumn: selectedAdSource !== AdSource.XandrAuction,\r\n },\r\n {\r\n columnName: 'revenue',\r\n friendlyName: 'Revenue',\r\n isVisible: false,\r\n headerCSV: 'Revenue',\r\n isExportColumn: selectedAdSource === AdSource.Microsoft,\r\n exportFunction: CSVHelper.getRevenue,\r\n },\r\n ];\r\n\r\n const _commandBarProps: IDataGridCommandBarProps = {\r\n items: [\r\n {\r\n id: 'addFilterButton',\r\n key: CommandBarActions.addFilter,\r\n name: formatMessage(AppMessages.addFilter),\r\n iconProps: {\r\n iconName: 'Filter',\r\n },\r\n onClick: () => {\r\n const filterPanel: IFilterPanelProps = {\r\n titleLabel: formatMessage(AppMessages.filters),\r\n descriptionLabel: formatMessage(AppMessages.filtersDescription),\r\n };\r\n onActiveFilterValuesChanged(getStore().filters.raw!);\r\n onFilterPanelShown(filterPanel);\r\n },\r\n selectionModes: [DataGridSelectionMode.None, DataGridSelectionMode.Single, DataGridSelectionMode.Multiple],\r\n },\r\n {\r\n key: 'ExportAdPerf',\r\n name: formatMessage(AppMessages.download),\r\n iconProps: {\r\n iconName: 'Download',\r\n },\r\n selectionModes: [DataGridSelectionMode.None, DataGridSelectionMode.Single, DataGridSelectionMode.Multiple],\r\n onClick: () => {\r\n onAdCreativeExportClicked(_gridDefaultColumns);\r\n },\r\n ariaLabel: formatMessage(messages.exportGrid),\r\n },\r\n {\r\n key: 'blockAds',\r\n name: formatMessage(messages.blockAdsMenuButtonLabel),\r\n iconProps: {\r\n iconName: 'StatusCircleBlock',\r\n },\r\n selectionStatus: selectedAdSource === AdSource.Auction ? LifeCycleStatus.Active : undefined,\r\n selectionModes: [DataGridSelectionMode.Single, DataGridSelectionMode.Multiple],\r\n onClick: () => {\r\n const items = this._getSelectionItems();\r\n if (items && items.length > 30) {\r\n onNotificationChanged({\r\n text: messages.blockErrorMessage.defaultMessage,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } else {\r\n onBlockAdsAdPerfDataCleared();\r\n if (items) {\r\n onBlockAdInitialized(items);\r\n }\r\n onAdCreativeBlockPanelChanged(true, BlockItemType.Ads);\r\n }\r\n },\r\n },\r\n ],\r\n };\r\n if (selectedAdSource === AdSource.Microsoft) {\r\n _commandBarProps.items.push({\r\n key: 'blockImages',\r\n name: formatMessage(messages.blockImagesMenuButtonLabel),\r\n iconProps: {\r\n iconName: 'StatusCircleBlock',\r\n },\r\n\r\n selectionModes: [DataGridSelectionMode.Single],\r\n onClick: () => {\r\n const items = this._getSelectionItems();\r\n\r\n if (items) {\r\n onBlockAdInitialized(items, true);\r\n }\r\n\r\n onAdCreativeBlockPanelChanged(true, BlockItemType.Images);\r\n },\r\n });\r\n }\r\n return (\r\n <>\r\n <DataGrid\r\n componentRef={this._datagrid}\r\n intl={this.props.intl}\r\n commandBarProps={_commandBarProps}\r\n detailListProps={{\r\n items: store.active.adPerfData ? store.active.adPerfData : [],\r\n columns: _gridDefaultColumns,\r\n onRenderItemColumn: (item: AdPerformanceData, index: number, column: IColumn) =>\r\n this._renderAdCreativeItemColumn(item, index, column),\r\n }}\r\n // filterProps={_filterProps}\r\n sortByColumn={{\r\n columnKeyToSortBy: 'adImpressions',\r\n isSortedDescending: true,\r\n }}\r\n ariaLabel={formatMessage(messages.adReviewGridAriaLabel)}\r\n dataGridfilterProps={{\r\n filterItems: this._filterItems,\r\n onFilterMenuCalloutClose: function (): void {\r\n throw new Error('Function not implemented.');\r\n },\r\n onClearAll: () => onClearAll(),\r\n onDeleteTextCondition: (heading: string, filterCondition: FilterCondition, val: string) =>\r\n onDeleteTextCondition(heading, filterCondition, val),\r\n onListValueChanged: (heading: string, val: string) => onListValueChanged(heading, val),\r\n initialFilterListValues: getInitialFilterList(),\r\n showClearAll: true,\r\n hideCallout: true,\r\n }}\r\n searchResultsVisible={true}\r\n />\r\n </>\r\n );\r\n };\r\n\r\n private _renderFilterPanel = (filterPanel?: IFilterPanelProps): JSX.Element | null => {\r\n if (!filterPanel) {\r\n return null;\r\n }\r\n const classNames = getClassNames(getStyles, { theme: getTheme() });\r\n const store = getStore();\r\n const appStore = getAppStore();\r\n const selectedAdSource = store.active.selectedAdSource;\r\n\r\n return (\r\n <Panel\r\n isOpen={true}\r\n type={PanelType.smallFixedFar}\r\n isLightDismiss\r\n onDismiss={() => onFilterPanelHide()}\r\n headerText={filterPanel.titleLabel}\r\n closeButtonAriaLabel={this.props.intl.formatMessage(AppMessages.panelCloseButtonAriaDesc)}\r\n styles={classNames.subComponentStyles.filterPanel}\r\n isFooterAtBottom={true}\r\n onRenderFooterContent={() => {\r\n return (\r\n <div className={classNames.panelButton}>\r\n <PrimaryButton\r\n onClick={() => {\r\n onAdQualityPanelApplyButtonClicked();\r\n }}\r\n text={this.props.intl.formatMessage(AppMessages.updateFilters)}\r\n ariaDescription={this.props.intl.formatMessage(messages.filterPanelApplyButtonAriaDesc)}\r\n disabled={appStore.loading}\r\n />\r\n <DefaultButton onClick={() => onFilterPanelHide()} text={this.props.intl.formatMessage(AppMessages.cancel)} />\r\n </div>\r\n );\r\n }}\r\n >\r\n <AdQualityFilters\r\n adSource={selectedAdSource}\r\n listFilters={store.active.accounts}\r\n filtersItems={store.filters}\r\n shouldShowHeadlines={\r\n selectedAdSource === AdSource.Microsoft && !!(store.active.startDate && store.active.startDate > HEADLINE_ENABLE_DATE)\r\n }\r\n />\r\n </Panel>\r\n );\r\n };\r\n\r\n private _blockImages = (mode: FormState): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const store = getStore();\r\n const reasonCategory: IDropdownOption[] = [\r\n {\r\n key: formatMessage(messages.imageNotRelevant),\r\n text: formatMessage(messages.imageNotRelevant),\r\n ariaLabel: formatMessage(messages.imageNotRelevant),\r\n },\r\n {\r\n key: formatMessage(messages.lowQualityImage),\r\n text: formatMessage(messages.lowQualityImage),\r\n ariaLabel: formatMessage(messages.lowQualityImage),\r\n },\r\n {\r\n key: formatMessage(messages.offensiveImage),\r\n text: formatMessage(messages.offensiveImage),\r\n ariaLabel: formatMessage(messages.offensiveImage),\r\n },\r\n {\r\n key: formatMessage(messages.policyIssue),\r\n text: formatMessage(messages.policyIssue),\r\n ariaLabel: formatMessage(messages.policyIssue),\r\n },\r\n ];\r\n const isViewOnly = isAllImagesViewOnly(\r\n store.blockAdsPage.adPerfBlockAdsData[0].images ? store.blockAdsPage.adPerfBlockAdsData[0].images : undefined,\r\n store.blockAdsPage.adPerfBlockAdsData[0].adType,\r\n store.blockAdsPage.adPerfBlockAdsData[0].adSource\r\n );\r\n return (\r\n <DetailPage\r\n titleLabel={\r\n mode === FormState.InPageCreate && !isViewOnly ? formatMessage(messages.blockImages) : formatMessage(messages.viewImages)\r\n }\r\n helpId={'pop_PCv4_blockAd'}\r\n submitLabel={\r\n mode === FormState.InPageCreate && !isViewOnly ? formatMessage(messages.blockImages) : formatMessage(messages.viewImages)\r\n }\r\n onSubmit={() => {\r\n onBlockImagesSubmitted();\r\n }}\r\n onCancel={() => {\r\n onAdCreativeBlockPanelChanged(false);\r\n onLayoutChanged(LayoutMode.Default);\r\n }}\r\n saving={getAppStore().saving}\r\n pageMode={mode}\r\n hideSubmitButton={mode !== FormState.InPageCreate || isViewOnly}\r\n >\r\n {isViewOnly && <div>{formatMessage(messages.viewImagesDescription)}</div>}\r\n <FocusZone>\r\n <List\r\n className={this._classNames.imageList}\r\n items={store.blockAdsPage.adPerfBlockAdsData[0].images ? store.blockAdsPage.adPerfBlockAdsData[0].images : [noImage]}\r\n renderedWindowsAhead={4}\r\n getItemCountForPage={this._getItemCountForPage}\r\n getPageHeight={this._getPageHeight}\r\n onRenderCell={this._onRenderImage}\r\n />\r\n </FocusZone>\r\n {!isViewOnly && (\r\n <>\r\n <FormItem>\r\n <Dropdown\r\n label={formatMessage(messages.blockReason)}\r\n ariaLabel={formatMessage(messages.blockReason)}\r\n options={reasonCategory}\r\n required={true}\r\n errorMessage={store.errors.blockReason}\r\n onChange={(_, value) => onBlockAdsBlockReasonChanged(value!)}\r\n />\r\n </FormItem>\r\n <FormItem formWidth={440}>\r\n <TextField\r\n multiline\r\n autoAdjustHeight\r\n label={formatMessage(messages.additionalDetials)}\r\n ariaLabel={formatMessage(messages.additionalDetials)}\r\n errorMessage={store.errors.blockDetails || store.errors.blockedImages}\r\n onChange={(_, value) => onBlockAdsBlockDetailsChanged(value)}\r\n />\r\n </FormItem>\r\n </>\r\n )}\r\n </DetailPage>\r\n );\r\n };\r\n\r\n private _getCurrentlySelectedListingPageItem(item: AdPerformanceBlockData): IAdListingSample {\r\n // Make sure the listing data exists for the requested page. Return empty if it does not exist.\r\n if (item.adListingsData && item.adListingsData.adListingItems) {\r\n const listingSample =\r\n item.adListingsData.adListingItems[\r\n (item.adListingsData.adListingSelectedPage ? item.adListingsData.adListingSelectedPage : 1) - 1\r\n ];\r\n return listingSample ? listingSample : {};\r\n }\r\n return {};\r\n }\r\n\r\n private _blockAds = (mode: FormState): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const store = getStore();\r\n\r\n const reasonsCategoriesL1: IDropdownOption[] = [\r\n {\r\n key: formatMessage(messages.disallowedContent),\r\n text: formatMessage(messages.disallowedContent),\r\n ariaLabel: formatMessage(messages.disallowedContent),\r\n },\r\n {\r\n key: formatMessage(messages.legalPrivacyAndSecurity),\r\n text: formatMessage(messages.legalPrivacyAndSecurity),\r\n ariaLabel: formatMessage(messages.legalPrivacyAndSecurity),\r\n },\r\n {\r\n key: formatMessage(messages.mediaFormats),\r\n text: formatMessage(messages.mediaFormats),\r\n ariaLabel: formatMessage(messages.mediaFormats),\r\n },\r\n {\r\n key: formatMessage(messages.relevanceAndQuality),\r\n text: formatMessage(messages.relevanceAndQuality),\r\n ariaLabel: formatMessage(messages.relevanceAndQuality),\r\n },\r\n {\r\n key: formatMessage(messages.restrictedCategories),\r\n text: formatMessage(messages.restrictedCategories),\r\n ariaLabel: formatMessage(messages.restrictedCategories),\r\n },\r\n {\r\n key: formatMessage(messages.textGuidelines),\r\n text: formatMessage(messages.textGuidelines),\r\n ariaLabel: formatMessage(messages.textGuidelines),\r\n },\r\n ];\r\n\r\n let isGeminiAd = false;\r\n isGeminiAd = store.blockAdsPage.adPerfBlockAdsData.some((item) => item.adProvider === 'Gemini');\r\n\r\n const adDestUrls: string[] = [];\r\n store.blockAdsPage.adPerfBlockAdsData.forEach((item) => {\r\n adDestUrls.push(item.adDestUrl ? item.adDestUrl : item.adURL ? toHttpsLink(item.adURL) : '');\r\n });\r\n\r\n return (\r\n <DetailPage\r\n titleLabel={formatMessage(messages.blockAds)}\r\n helpId={'pop_PCv4_blockAd'}\r\n submitLabel={formatMessage(messages.blockAds)}\r\n onSubmit={() => {\r\n onBlockAdsSubmitted();\r\n }}\r\n onCancel={() => {\r\n onAdCreativeBlockPanelChanged(false);\r\n onLayoutChanged(LayoutMode.Default);\r\n }}\r\n saving={getAppStore().saving}\r\n pageMode={mode}\r\n >\r\n <FormItem styles={this._classNames.subComponentStyles.formItem}>\r\n <Label>{formatMessage(messages.AdId, { count: store.blockAdsPage.adPerfBlockAdsData.length })}</Label>\r\n {store.blockAdsPage.adPerfBlockAdsData.map((item, index) => (\r\n <FormSection\r\n key={index}\r\n expanded={true}\r\n title={formatMessage(\r\n messages.auctionBlockAdIdLabel,\r\n item.uniqueCreativeAdId ? { uniqueCreativeAdId: item.uniqueCreativeAdId } : { uniqueCreativeAdId: item.adId }\r\n )}\r\n styles={this._classNames.subComponentStyles.formSection}\r\n >\r\n <Label>{formatMessage(messages.blockAdTitle)}</Label>\r\n {item.adTitle ? item.adTitle : ''}\r\n\r\n {store.active.selectedAdSource === AdSource.Auction && (\r\n <FormItem formWidth={440}>\r\n <Label>{formatMessage(messages.auctionAdSourceCombo)}</Label>\r\n {item.adProvider}\r\n </FormItem>\r\n )}\r\n {store.active.selectedAdSource === AdSource.Microsoft && (\r\n <FormItem formWidth={440}>\r\n <Label id=\"blockadUrlLabel\">{formatMessage(messages.blockAdURL)}</Label>\r\n <Link href={adDestUrls[index]} target=\"_blank\" aria-labelledby=\"blockadUrlLabel\">\r\n {item.adURL ? item.adURL : ''}\r\n </Link>\r\n <Label id=\"adAccountName\">{formatMessage(messages.accountName)}</Label>\r\n {item.accountName ? item.accountName : ''}\r\n </FormItem>\r\n )}\r\n {store.active.selectedAdSource === AdSource.Microsoft && (\r\n <FormItem>\r\n <Label>{formatMessage(messages.pastRevenue)}</Label>\r\n <div>{'$' + (item.revenue ? item.revenue.toFixed(2) : '0.0')}</div>\r\n </FormItem>\r\n )}\r\n\r\n {store.active.selectedAdSource === AdSource.Microsoft && (\r\n <FormItem formWidth={440}>\r\n <div className={this._classNames.adBlockPanelListingBox}>\r\n {item.adListingsData && item.adListingsData.adListingItems && item.adListingsData.adListingItems.length > 1 && (\r\n <div>\r\n <div className={this._classNames.adBlockPanelListingPaginatedBox}>\r\n <div className={this._classNames.adBlockPanelListingPaginatedLeftItems}>\r\n <Label>{formatMessage(messages.altAdTitleListings)}</Label>\r\n <div className={this._classNames.adBlockPanelListingLightText}>\r\n {this._getCurrentlySelectedListingPageItem(item).adTitle}\r\n </div>\r\n <Label>{formatMessage(messages.altAdUrlListings)}</Label>\r\n <Link\r\n className={this._classNames.adBlockPanelListingLightText}\r\n href={toHttpsLink(this._getCurrentlySelectedListingPageItem(item).adDestUrl as string)}\r\n >\r\n {this._getCurrentlySelectedListingPageItem(item).adUrl}\r\n </Link>\r\n </div>\r\n <div className={this._classNames.adBlockPanelListingPaginatedRightItems}>\r\n <Label>{formatMessage(messages.altAdImageListings)}</Label>\r\n <img\r\n src={this._getCurrentlySelectedListingPageItem(item).adImage}\r\n width={90}\r\n height={90}\r\n alt={noImage}\r\n style={{ margin: '2px' }}\r\n />\r\n </div>\r\n </div>\r\n <Pagination\r\n intl={this.props.intl}\r\n currentPageNumber={item.adListingsData ? item.adListingsData.adListingSelectedPage : 1}\r\n totalPageCount={\r\n item.adListingsData && item.adListingsData.adListingItems ? item.adListingsData.adListingItems.length : 1\r\n }\r\n onPageChange={(page) => {\r\n onAdListingPageSelection(page, index);\r\n }}\r\n />\r\n </div>\r\n )}\r\n {!item.adListingsData && (\r\n <div className={this._classNames.adBlockPanelListingLoadingBox}>\r\n <Label className={this._classNames.adBlockPanelListingCenterLightText}>\r\n {formatMessage(messages.loadingAltAdCreativeListings)}\r\n </Label>\r\n <Spinner />\r\n </div>\r\n )}\r\n {item.adListingsData &&\r\n !(item.adListingsData && item.adListingsData.adListingItems && item.adListingsData.adListingItems.length > 1) && (\r\n <div className={this._classNames.adBlockPanelListingNoneBox}>\r\n <Label className={this._classNames.adBlockPanelListingLightText}>\r\n {formatMessage(messages.noAltAdCreativeListings)}\r\n </Label>\r\n </div>\r\n )}\r\n </div>\r\n </FormItem>\r\n )}\r\n </FormSection>\r\n ))}\r\n </FormItem>\r\n <FormItem>\r\n <Dropdown\r\n dropdownWidth={500}\r\n label={formatMessage(messages.blockRequestSource)}\r\n ariaLabel={formatMessage(messages.blockRequestSource)}\r\n options={this._createBlockRequestSourcesDropdown(getStore().active.blockRequestSourceData!)}\r\n onChange={(_, value) => {\r\n onBlockAdsSelectedBlockRequestSourceChanged(value!);\r\n }}\r\n required={true}\r\n errorMessage={store.errors.selectedMarket}\r\n />\r\n </FormItem>\r\n {store.active.selectedAdSource !== AdSource.Microsoft && (\r\n <FormItem>\r\n <Dropdown\r\n dropdownWidth={500}\r\n label={formatMessage(messages.selectMarket)}\r\n ariaLabel={formatMessage(messages.selectMarket)}\r\n options={this._createBlockingMarketsDropdown(store.active.selectedMarket!)}\r\n onChange={(_, value) => onBlockAdsSelectedMarketChanged(value!)}\r\n required={true}\r\n errorMessage={store.errors.selectedMarket}\r\n />\r\n </FormItem>\r\n )}\r\n {store.active.selectedAdSource === AdSource.Microsoft && (\r\n <FormItem>\r\n <Dropdown\r\n dropdownWidth={500}\r\n label={formatMessage(messages.selectChannel)}\r\n ariaLabel={formatMessage(messages.selectChannel)}\r\n options={[{ key: 'Default', text: 'Default', ariaLabel: 'Default' }]}\r\n required={true}\r\n disabled={true}\r\n placeholder={'Default'}\r\n errorMessage={store.errors.selectChannel}\r\n />\r\n </FormItem>\r\n )}\r\n <FormItem>\r\n <Dropdown\r\n dropdownWidth={300}\r\n label={formatMessage(messages.blockReasonCategory)}\r\n ariaLabel={formatMessage(messages.blockReasonCategory)}\r\n options={reasonsCategoriesL1}\r\n required={true}\r\n errorMessage={store.errors.blockReason}\r\n onChange={(_, value, index) => onBlockAdsReasonLevelsChanged(value!, formatMessage, index!)}\r\n />\r\n </FormItem>\r\n {store.blockAdsPage.blockReasonL1 && (\r\n <FormItem>\r\n <Dropdown\r\n dropdownWidth={300}\r\n label={formatMessage(messages.blockReason)}\r\n ariaLabel={formatMessage(messages.blockReason)}\r\n options={store.blockAdsPage.blockReasonsL2 ? store.blockAdsPage.blockReasonsL2 : []}\r\n required={true}\r\n defaultSelectedKey={0}\r\n errorMessage={store.errors.blockReason}\r\n onChange={(_, value) => onBlockAdsBlockReasonChanged(value!)}\r\n />\r\n </FormItem>\r\n )}\r\n <FormItem formWidth={440}>\r\n <TextField\r\n multiline\r\n autoAdjustHeight\r\n label={formatMessage(messages.additionalDetials)}\r\n ariaLabel={formatMessage(messages.additionalDetials)}\r\n onChange={(_, value) => onBlockAdsBlockDetailsChanged(value)}\r\n />\r\n </FormItem>\r\n {/* TODO: remove gemini-specific messaging once SAMRTB begins honoring adblocks for Gemini */}\r\n {isGeminiAd && (\r\n <Label>\r\n <div style={{ color: 'red' }}>{formatMessage(messages.verizonMediaWarningLabel)}</div>\r\n </Label>\r\n )}\r\n </DetailPage>\r\n );\r\n };\r\n\r\n private _getSelectionItems() {\r\n if (this._datagrid.current) {\r\n const currentSelection = this._datagrid.current.getSelection();\r\n const selectedIndices = currentSelection.getSelectedIndices();\r\n const items = currentSelection.getItems();\r\n const selectedItems: AdPerformanceData[] = [];\r\n const sameAds = new Set();\r\n selectedIndices.map((selectedIndex) => {\r\n const adData = items[selectedIndex] as AdPerformanceData;\r\n\r\n if (\r\n adData.adId &&\r\n adData.accountId &&\r\n !sameAds.has(adData.adId.toString() + NO_VALUE_PLACEHOLDER + adData.accountId.toString())\r\n ) {\r\n selectedItems.push(items[selectedIndex] as AdPerformanceData);\r\n sameAds.add(adData.adId.toString() + NO_VALUE_PLACEHOLDER + adData.accountId.toString());\r\n } else if (!adData.adId && adData.uniqueCreativeAdId) {\r\n selectedItems.push(items[selectedIndex] as AdPerformanceData);\r\n }\r\n return undefined;\r\n });\r\n return selectedItems;\r\n }\r\n return null;\r\n }\r\n\r\n private _getBlockDataSelectionItems() {\r\n if (this._datagrid.current) {\r\n const currentSelection = this._datagrid.current.getSelection();\r\n const selectedIndices = currentSelection.getSelectedIndices();\r\n const items = currentSelection.getItems();\r\n\r\n const selectedItems: BlockAdsData[] = [];\r\n selectedIndices.map((selectedIndex) => selectedItems.push(items[selectedIndex] as BlockAdsData));\r\n\r\n return selectedItems;\r\n }\r\n return null;\r\n }\r\n\r\n private _getSAMBlockDataSelectionItems() {\r\n if (this._datagrid.current) {\r\n const currentSelection = this._datagrid.current.getSelection();\r\n const selectedIndices = currentSelection.getSelectedIndices();\r\n const items = currentSelection.getItems();\r\n\r\n const selectedItems: SAMBlockSummaryData[] = [];\r\n selectedIndices.map((selectedIndex) => selectedItems.push(items[selectedIndex] as SAMBlockSummaryData));\r\n\r\n return selectedItems;\r\n }\r\n return null;\r\n }\r\n\r\n private _renderSAMBlockSummaryItemColumn(item: SAMBlockSummaryData, index: number, column: IColumn): JSX.Element {\r\n // tslint:disable-next-line: no-string-literal\r\n const imageList = item['allAdImages'] ? item['allAdImages'] : [];\r\n const imageElements: JSX.Element[] = [];\r\n for (let i = 0; i < Math.min(imageList.length, 2); i++) {\r\n if (imageList[i] !== '') {\r\n imageElements.push(\r\n <a href={imageList[i]} target=\"_blank\" rel=\"noopener noreferrer\">\r\n <img key={i} src={imageList[i]} width={90} height={90} alt={'Not available'} style={{ margin: '2px' }} />\r\n </a>\r\n );\r\n }\r\n }\r\n imageElements.push(\r\n <Link\r\n onClick={async () => {\r\n if (item.creativeAdId) {\r\n onSAMBlockSummaryViewImagesClicked(item);\r\n }\r\n }}\r\n >\r\n {this.props.intl.formatMessage(messages.allImages)}\r\n </Link>\r\n );\r\n\r\n // tslint:disable-next-line: no-string-literal\r\n const reasonDetails: string = item['blockReasonComment'] ? item['blockReasonComment'] : 'null';\r\n const fieldContent = item[column.fieldName as keyof SAMBlockSummaryData];\r\n\r\n switch (column.key) {\r\n case 'blockReasonCategory':\r\n return (\r\n <>\r\n <div>\r\n <b>Block Category: </b>\r\n {item.blockReasonMainCategory}\r\n </div>\r\n <div>\r\n <b>Sub Category: </b>\r\n {item.blockReasonSubCategory}\r\n </div>\r\n <br />\r\n <div>\r\n <b>Details: </b>\r\n {reasonDetails}\r\n </div>\r\n </>\r\n );\r\n case 'blockRequestSource':\r\n return (\r\n <span>\r\n {item.blockRequestSourceId! === 0 ? 'N/A' : getStore().active.blockRequestSourceData?.get(item.blockRequestSourceId!)}\r\n </span>\r\n );\r\n case 'sevenDayRevenueImpact':\r\n return <span>{'$' + (fieldContent as number).toFixed(2)}</span>;\r\n case 'modifiedDateTime':\r\n return <span>{(fieldContent as string).substring(0, 10)}</span>;\r\n case 'allImages':\r\n return <span key={index}>{imageElements}</span>;\r\n\r\n default:\r\n return <span>{fieldContent}</span>;\r\n }\r\n }\r\n\r\n private _renderBlockSummaryItemColumn(item: BlockAdsData, index: number, column: IColumn): JSX.Element {\r\n // tslint:disable-next-line: no-string-literal\r\n const imgs: string = item['allImages'] ? item['allImages'] : '';\r\n const imageList = imgs.split('___');\r\n const imageElements: JSX.Element[] = [];\r\n for (let i = 0; i < imageList.length; i++) {\r\n if (i < 2) {\r\n if (imageList[i] !== '') {\r\n imageElements.push(\r\n <a href={imageList[i]} target=\"_blank\" rel=\"noopener noreferrer\">\r\n <img key={i} src={imageList[i]} width={90} height={90} alt={'Not available'} style={{ margin: '2px' }} />\r\n </a>\r\n );\r\n }\r\n } else {\r\n imageElements.push(\r\n <Link\r\n key={i}\r\n onClick={() => {\r\n onAdCreativeBlockPanelChanged(true, BlockItemType.Images);\r\n onBlockImageAdsChanged([{ apiPath: item.apiPath, className: item.className, blockedImages: [], adId: item.adId }]);\r\n onBlockAdsImagesChanged(imageList, 0, false);\r\n }}\r\n >\r\n {this.props.intl.formatMessage(messages.moreImages, { imageListLength: imageList.length - i })}\r\n </Link>\r\n );\r\n break;\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: no-string-literal\r\n const reasonDetails: string = item['reason'] ? item['reason'] : 'null';\r\n\r\n // tslint:disable-next-line: no-string-literal\r\n const isEnabled: string = item['isEnabled'] === true ? 'Applied' : 'Disabled';\r\n\r\n const fieldContent = item[column.fieldName as keyof BlockAdsData];\r\n\r\n switch (column.key) {\r\n case 'reason':\r\n return (\r\n <>\r\n <div>\r\n <b>Block Category: </b>\r\n {item.blockReasonMainCategory}\r\n </div>\r\n <div>\r\n <b>Sub Category: </b>\r\n {item.blockReasonSubCategory}\r\n </div>\r\n <br />\r\n <div>\r\n <b>Details: </b>\r\n {reasonDetails}\r\n </div>\r\n </>\r\n );\r\n case 'blockRequestSource':\r\n return (\r\n <span>\r\n {item.blockRequestSourceId! === 0 ? 'N/A' : getStore().active.blockRequestSourceData?.get(item.blockRequestSourceId!)}\r\n </span>\r\n );\r\n case 'isEnabled':\r\n return <span key={index}>{isEnabled}</span>;\r\n case 'pastRevenue':\r\n return <span>{'$' + (fieldContent as number).toFixed(2)}</span>;\r\n case 'modifiedDateTime':\r\n return <span>{(fieldContent as string).substring(0, 10)}</span>;\r\n case 'allImages':\r\n return <span key={index}>{imageElements}</span>;\r\n\r\n default:\r\n return <span>{fieldContent}</span>;\r\n }\r\n }\r\n\r\n private _renderAdCreativeItemColumn(item: AdPerformanceData, index: number, column: IColumn): JSX.Element {\r\n // const blockedImagesContext = getStore().blockedAdsContext!.mapAdIdImages!;\r\n // tslint:disable-next-line: no-string-literal\r\n const isAuctionData = item['uniqueCreativeAdId'] !== undefined && item['uniqueCreativeAdId'] !== '';\r\n // tslint:disable-next-line: no-string-literal\r\n const imgs: string[] = item['images'] ? item['images'] : [];\r\n const imageList = processImagesLink(imgs, noImage, isAuctionData);\r\n const imageElements: JSX.Element[] = [];\r\n for (let i = 0; i < imageList.length; i++) {\r\n if (i < 2) {\r\n let isBlocked = false;\r\n\r\n const imageReportDataTuple = { adId: item.adId, imageUrl: imageList[i] };\r\n if (\r\n (item.blockedAdIdImages && item.blockedAdIdImages.includes(JSON.stringify(imageReportDataTuple))) ||\r\n (!isAuctionData && item.blockedImages && compareImages(item.blockedImages, imageList[i]))\r\n ) {\r\n isBlocked = true;\r\n }\r\n\r\n imageElements.push(\r\n <span key={'spanOuter' + i}>\r\n <div\r\n key={'divOuter' + i}\r\n className={mergeStyles({\r\n position: 'absolute',\r\n top: i * 98 + 0,\r\n left: 0,\r\n width: '90px',\r\n height: '90px',\r\n marginLeft: '14px',\r\n marginTop: '12px',\r\n borderRadius: 4,\r\n backgroundColor: 'rgba(92, 86, 86, 0.534)',\r\n })}\r\n style={{ display: isBlocked ? 'block' : 'none' }}\r\n >\r\n <div\r\n key={'blockedtext' + i}\r\n className={mergeStyles({\r\n color: 'white',\r\n marginTop: '37px',\r\n marginLeft: '22px',\r\n })}\r\n style={{ display: isBlocked ? 'block' : 'none' }}\r\n >\r\n BLOCKED\r\n </div>\r\n </div>\r\n <a href={imageList[i]} target=\"_blank\" rel=\"noopener noreferrer\">\r\n <img\r\n key={'AdCreativeImageCompressed' + i}\r\n src={imageList[i]}\r\n width={90}\r\n height={90}\r\n alt={noImage}\r\n style={{ margin: '2px' }}\r\n />\r\n </a>\r\n </span>\r\n );\r\n } else {\r\n imageElements.push(\r\n <Link\r\n key={i}\r\n onClick={() => {\r\n onAdCreativeBlockPanelChanged(true, BlockItemType.Images);\r\n onBlockImageAdsChanged([item], isAuctionData);\r\n onBlockAdsImagesChanged(item.images, 0, true, isAuctionData);\r\n }}\r\n >\r\n {this.props.intl.formatMessage(messages.moreImages, { imageListLength: imageList.length - i })}\r\n </Link>\r\n );\r\n break;\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: no-string-literal\r\n let adProvider = '',\r\n placement = '';\r\n const adProviderEnum = item['adProvider'];\r\n if (adProviderEnum && getStore().active.selectedAdSource === AdSource.Auction) {\r\n adProvider = adProvidersToNames[adProviderEnum];\r\n placement = extractPlacement(item);\r\n } else if (adProviderEnum && getStore().active.selectedAdSource === AdSource.XandrAuction) {\r\n adProvider = xandrAdProvidersToNames[adProviderEnum];\r\n placement = item['locale'];\r\n } else {\r\n adProvider = 'Microsoft';\r\n placement = item['adUnitName']!;\r\n }\r\n const fieldContent = item[column.fieldName as keyof AdPerformanceData];\r\n // tslint:disable-next-line: no-string-literal\r\n const adUrl = item['adURL'] ? item['adURL'] : '';\r\n // tslint:disable-next-line: no-string-literal\r\n const destUrl = item['adDestUrl'] ? item['adDestUrl'] : item['adURL'] ? item['adURL'] : '';\r\n // tslint:disable-next-line: no-string-literal\r\n const status = item['status'] && item['status'] === LifeCycleStatus.Inactive ? 'BLOCKED' : '';\r\n switch (column.key) {\r\n case 'status':\r\n return (\r\n <span\r\n className={mergeStyles({\r\n color: 'red',\r\n width: '25px',\r\n })}\r\n >\r\n {status}\r\n </span>\r\n );\r\n case 'adURL':\r\n // To Do: update it with destination Url\r\n return (\r\n <Link href={toHttpsLink(destUrl as string)} target=\"_blank\">\r\n {(adUrl as string).substring(0, 80)}\r\n </Link>\r\n );\r\n case 'images':\r\n return <span key={index}>{imageElements}</span>;\r\n case 'adSource':\r\n return <span>{adProvider}</span>;\r\n case 'adUnitName':\r\n return (\r\n <span\r\n // className={mergeStyles({\r\n // display: 'inline-block',\r\n // width: '10em',\r\n // overflow: 'hidden',\r\n // textOverflow: 'ellipsis',\r\n // })}\r\n >\r\n {placement}\r\n </span>\r\n );\r\n case 'revenue':\r\n return <span>{'$' + Math.round((fieldContent as number) * 100) / 100}</span>;\r\n default:\r\n return <span>{fieldContent}</span>;\r\n }\r\n }\r\n\r\n private _getItemCountForPage = (itemIndex: number, surfaceRect: IRectangle): number => {\r\n if (itemIndex === 0) {\r\n this._columnCount = Math.ceil(surfaceRect.width / MAX_ROW_HEIGHT);\r\n this._columnWidth = Math.floor(surfaceRect.width / this._columnCount);\r\n this._rowHeight = this._columnWidth;\r\n }\r\n\r\n return this._columnCount * ROWS_PER_PAGE;\r\n };\r\n private _getPageHeight = (): number => {\r\n return this._rowHeight * ROWS_PER_PAGE;\r\n };\r\n\r\n private _onRenderImage = (item: string, index: number): JSX.Element => {\r\n const store = getStore();\r\n return (\r\n <div\r\n className={this._classNames.imageListTitle}\r\n data-is-focusable={true}\r\n style={{\r\n width: 100 / this._columnCount + '%',\r\n }}\r\n >\r\n <div className={this._classNames.imageListSizer}>\r\n <div className={this._classNames.imageListPadder}>\r\n <a href={item} target=\"_blank\" rel=\"noopener noreferrer\">\r\n <img src={item} alt={noImage} className={this._classNames.imageListImage} />\r\n </a>\r\n {!isImageBlockable(\r\n item,\r\n store.blockAdsPage.adPerfBlockAdsData[0].adType,\r\n store.blockAdsPage.adPerfBlockAdsData[0].adSource\r\n ) && (\r\n <span className={this._classNames.imageListLabel}>\r\n {this.props.intl.formatMessage(messages.viewOnlyImageLabel, { itemNumber: index + 1 })}\r\n </span>\r\n )}\r\n {isImageBlocked(\r\n item,\r\n store.blockAdsPage.adPerfBlockAdsData[0].adId!,\r\n store.blockedImagesContext,\r\n store.blockedAdsContext\r\n ) && <span className={this._classNames.imageListLabel}>{this.props.intl.formatMessage(messages.blockedLabel)}</span>}\r\n {isImageBlockable(item, store.blockAdsPage.adPerfBlockAdsData[0].adType, store.blockAdsPage.adPerfBlockAdsData[0].adSource) &&\r\n !isImageBlocked(\r\n item,\r\n store.blockAdsPage.adPerfBlockAdsData[0].adId!,\r\n store.blockedImagesContext,\r\n store.blockedAdsContext\r\n ) && (\r\n <Checkbox\r\n className={this._classNames.imageListLabel}\r\n onChange={(_, value) => onBlockAdsBlockedImagesChanged(item, value)}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n private _createDropDown(accounts?: IIdNamePair[]): IComboBoxOption[] {\r\n const accountList: IComboBoxOption[] = [];\r\n\r\n if (accounts) {\r\n accounts.forEach((account) => {\r\n accountList!.push({\r\n key: account.id,\r\n text: account.name,\r\n ariaLabel: account.name,\r\n });\r\n });\r\n }\r\n accountList.sort((a, b) => {\r\n const firstValue = a.text;\r\n const secondValue = b.text;\r\n\r\n return firstValue.toLowerCase() > secondValue.toLowerCase() ? 1 : -1;\r\n });\r\n\r\n accountList.unshift({\r\n key: -1,\r\n text: 'All',\r\n ariaLabel: 'All',\r\n });\r\n return accountList;\r\n }\r\n\r\n private _createLocaleOptions(addAll?: boolean): IComboBoxOption[] {\r\n const availableLocales: IComboBoxOption[] = [];\r\n const LOCALE = LOCALE_LANGUAGE_MAPPING[getAppStore().locale];\r\n\r\n if (addAll) {\r\n availableLocales.push({\r\n key: 0,\r\n text: 'All',\r\n ariaLabel: 'All',\r\n });\r\n }\r\n\r\n Object.keys(adQualityLocales).forEach((adQualityLocale) => {\r\n availableLocales!.push({\r\n key: parseInt(adQualityLocale, 10),\r\n text: LOCALE[adQualityLocale],\r\n ariaLabel: LOCALE[adQualityLocale],\r\n });\r\n });\r\n\r\n availableLocales.sort((a, b) => {\r\n const firstValue = a.text;\r\n const secondValue = b.text;\r\n\r\n return firstValue.toLowerCase() > secondValue.toLowerCase() ? 1 : -1;\r\n });\r\n return availableLocales;\r\n }\r\n\r\n private _createBlockingMarketsDropdown(selectedMarket: string): IComboBoxOption[] {\r\n // TODO: re-enable market/locale-based blocking when SAMRTB begins enforcing them\r\n // const { formatMessage } = this.props.intl;\r\n const availableMarkets: IComboBoxOption[] = [];\r\n\r\n availableMarkets!.push(\r\n {\r\n key: 'All',\r\n text: 'All',\r\n ariaLabel: 'All',\r\n } /* ,\r\n {\r\n key: selectedMarket,\r\n text: formatMessage(LocaleMessages[selectedMarket]),\r\n ariaLabel: formatMessage(LocaleMessages[selectedMarket]),\r\n }\r\n */\r\n );\r\n\r\n return availableMarkets;\r\n }\r\n\r\n private _createBlockRequestSourcesDropdown(data: Map<number, string>): IDropdownOption[] {\r\n const blockRequestSources: IDropdownOption[] = [];\r\n data.forEach((blockRequestSourceName: string, blockRequestSourceId: number) => {\r\n blockRequestSources.push({\r\n key: blockRequestSourceId,\r\n text: blockRequestSourceName,\r\n ariaLabel: blockRequestSourceName,\r\n });\r\n });\r\n\r\n return blockRequestSources;\r\n }\r\n }\r\n);\r\n","import * as React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { Route, RouteComponentProps } from 'react-router-dom';\r\nimport { RouteName } from '../@data';\r\nimport { onCurrentRouteChanged } from '../@data/actions';\r\nimport './@data/mutators';\r\nimport './@data/orchestrators';\r\nimport { AdCreativePage } from './AdReview/AdCreativePage';\r\n\r\nexport const AdQualityPage = injectIntl(function AdQualityPageComponent(props: RouteComponentProps & InjectedIntlProps): JSX.Element {\r\n React.useEffect(() => {\r\n onCurrentRouteChanged(RouteName.adquality, props.intl.formatMessage);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <React.Fragment>\r\n <Route exact path={`${props.match.url}`} component={AdCreativePage} />\r\n </React.Fragment>\r\n );\r\n});\r\n","import { useEffect, useState } from 'react';\r\n\r\nexport enum InventoryPageTabs {\r\n Sites = 'sites',\r\n Apps = 'apps',\r\n}\r\n\r\ntype UseEntityTypeManage = ({\r\n isFeatureEnabled,\r\n}: {\r\n isFeatureEnabled?: boolean;\r\n}) => {\r\n activeSubTab: InventoryPageTabs;\r\n setActiveSubTab: (tab: InventoryPageTabs) => void;\r\n};\r\n\r\nexport const useEntityTypeManage: UseEntityTypeManage = ({ isFeatureEnabled }) => {\r\n const [activeSubTab, setActiveSubTab] = useState<InventoryPageTabs>(InventoryPageTabs.Sites);\r\n\r\n useEffect(() => {\r\n if (window.location.search.includes('view=app')) {\r\n setActiveSubTab(InventoryPageTabs.Apps);\r\n }\r\n }, []);\r\n\r\n return {\r\n activeSubTab: isFeatureEnabled ? activeSubTab : InventoryPageTabs.Sites,\r\n setActiveSubTab,\r\n };\r\n};\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n sites: {\r\n id: 'app.components.EntityTypeSwitch.sites',\r\n defaultMessage: 'Sites',\r\n },\r\n apps: {\r\n id: 'app.components.EntityTypeSwitch.apps',\r\n defaultMessage: 'Apps',\r\n },\r\n});\r\n","import { Divider, FluentProvider, Tab, TabList, makeStyles, webLightTheme } from '@fluentui/react-components';\r\nimport React from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport { InventoryPageTabs } from '../../hooks/useEntityTypeManage';\r\nimport messages from './messages';\r\n\r\nconst useStyles = makeStyles({\r\n root: {\r\n alignItems: 'flex-start',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'flex-start',\r\n rowGap: '20px',\r\n marginLeft: '-0.8rem',\r\n },\r\n divider: {\r\n width: 'calc(100% + 4rem)',\r\n marginLeft: '-2rem',\r\n marginBottom: '1.25rem',\r\n },\r\n spacer: {\r\n marginTop: '32px',\r\n },\r\n});\r\n\r\nconst EntityTypeSwitch = ({\r\n intl: { formatMessage },\r\n onTabSelect,\r\n selectedValue,\r\n siteTabLabel = '',\r\n appTabLabel = '',\r\n isFeatureEnabled = false,\r\n}) => {\r\n const styles = useStyles();\r\n const onTabSelected = (e, data) => onTabSelect(data.value as InventoryPageTabs);\r\n\r\n if (!isFeatureEnabled) {\r\n return <div className={styles.spacer} />;\r\n }\r\n\r\n return (\r\n <FluentProvider theme={webLightTheme}>\r\n <div className={styles.root}>\r\n <TabList selectedValue={selectedValue} onTabSelect={onTabSelected}>\r\n <Tab value={InventoryPageTabs.Sites}>{siteTabLabel || formatMessage(messages.sites)}</Tab>\r\n <Tab value={InventoryPageTabs.Apps}>{appTabLabel || formatMessage(messages.apps)}</Tab>\r\n </TabList>\r\n </div>\r\n <Divider className={styles.divider} />\r\n </FluentProvider>\r\n );\r\n};\r\n\r\nexport default injectIntl(EntityTypeSwitch);\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n create: {\r\n id: 'adunit.create',\r\n defaultMessage: 'Create Ad Unit',\r\n },\r\n notFound: {\r\n id: 'adunit.notFound',\r\n defaultMessage: 'No adunits found for this account, create one.',\r\n },\r\n deactivateTitle: {\r\n id: 'adunit.deactivateTitle',\r\n defaultMessage: 'Do you want to deactivate ad unit(s)?',\r\n },\r\n name: {\r\n id: 'adunit.name',\r\n defaultMessage: 'Ad unit name',\r\n },\r\n pending: {\r\n id: 'adunit.pending',\r\n defaultMessage: 'Pending',\r\n },\r\n id: {\r\n id: 'adunit.id',\r\n defaultMessage: 'Ad unit ID',\r\n },\r\n channelNames: {\r\n id: 'adunit.channelNames',\r\n defaultMessage: 'Channel names',\r\n },\r\n adUnits: {\r\n id: 'adunit',\r\n defaultMessage: 'Ad units',\r\n },\r\n accountName: {\r\n id: 'accountName',\r\n defaultMessage: 'Account name',\r\n },\r\n accountId: {\r\n id: 'accountId',\r\n defaultMessage: 'Account ID',\r\n },\r\n propertyId: {\r\n id: 'propertyId',\r\n defaultMessage: 'Property ID',\r\n },\r\n siteId: {\r\n id: 'siteId',\r\n defaultMessage: 'Site ID',\r\n },\r\n propertyUrl: {\r\n id: 'propertyUrl',\r\n defaultMessage: 'Website URL',\r\n },\r\n adUnitCreationDate: {\r\n id: 'adUnitCreationDate',\r\n defaultMessage: 'Creation date',\r\n },\r\n higherMonetization: {\r\n id: 'higherMonetization',\r\n defaultMessage: 'Enable mediation',\r\n },\r\n higherMonetizationEnabled: {\r\n id: 'higherMonetizationEnabled',\r\n defaultMessage: 'Enabled',\r\n },\r\n higherMonetizationNotSetup: {\r\n id: 'higherMonetizationNotSetup',\r\n defaultMessage: 'Not setup',\r\n },\r\n businessModel: {\r\n id: 'businessModel',\r\n defaultMessage: 'Business model',\r\n },\r\n marketClassification: {\r\n id: 'marketClassification',\r\n defaultMessage: 'Market Classification',\r\n },\r\n ownedAndOperatedCore: {\r\n id: 'marketClassification.ownedAndOperatedCore',\r\n defaultMessage: 'OwnedAndOperatedCore',\r\n },\r\n ownedAndOperated: {\r\n id: 'marketClassification.ownedAndOperated',\r\n defaultMessage: 'OwnedAndOperated',\r\n },\r\n syndicated: {\r\n id: 'marketClassification.syndicated',\r\n defaultMessage: 'Syndicated',\r\n },\r\n type: {\r\n id: 'adUnit.type',\r\n defaultMessage: 'Ad unit type',\r\n },\r\n format: {\r\n id: 'adUnit.format',\r\n defaultMessage: 'Ad format',\r\n },\r\n servingStatus: {\r\n id: 'adUnit.servingStatus',\r\n defaultMessage: 'Serving Status',\r\n },\r\n actions: {\r\n id: 'adUnit.actions',\r\n defaultMessage: 'Actions',\r\n },\r\n selectTier: {\r\n id: 'marketClassification.selectTier',\r\n defaultMessage: 'SelectTier',\r\n },\r\n sponsored: {\r\n id: 'marketClassification.sponsored',\r\n defaultMessage: 'Sponsored',\r\n },\r\n sponsoredEnhanced: {\r\n id: 'marketClassification.sponsoredEnhanced',\r\n defaultMessage: 'SponsoredEnhanced',\r\n },\r\n mediationCardNoConnectionHeader: {\r\n id: 'mediationCard.mediationCardNoConnectionHeader',\r\n defaultMessage: 'Enable mediation',\r\n },\r\n mediationCardNoConnectionDesc: {\r\n id: 'mediationCard.mediationCardNoConnectionDesc',\r\n defaultMessage: `Connect your ad unit to Google demand and ensure you are getting the highest bid possible for your ad inventory. We'll only serve our ads if we can deliver a higher payment compared to Google.`,\r\n },\r\n mediationCardNoConnectionC2A: {\r\n id: 'mediationCard.mediationCardNoConnectionC2A',\r\n defaultMessage: 'Set up now',\r\n },\r\n mediationCardConnectedHeader: {\r\n id: 'mediationCard.mediationCardConnectedHeader',\r\n defaultMessage: 'Mediation is enabled',\r\n },\r\n mediationCardConnectedDesc: {\r\n id: 'mediationCard.mediationCardNoConnectionDesc',\r\n defaultMessage:\r\n 'You are generating higher monetization fot this ad unit. If you would like to disable mediation, please go to click on edit mediation below',\r\n },\r\n mediationCardConnectedC2A: {\r\n id: 'mediationCard.mediationCardConnectedC2A',\r\n defaultMessage: 'Edit mediation',\r\n },\r\n changeName: {\r\n id: 'mediationCard.changeName',\r\n defaultMessage: 'Edit name',\r\n },\r\n changeTemplate: {\r\n id: 'mediationCard.changeTemplate',\r\n defaultMessage: 'Edit template',\r\n },\r\n zeroAdUnitsTitle: {\r\n id: 'adunitGrid.zeroAdUnitsTitle',\r\n defaultMessage: 'No ad units yet',\r\n },\r\n zeroAdUnitsDescription: {\r\n id: 'adunitGrid.description',\r\n defaultMessage: 'You haven’t created any ad unit yet',\r\n },\r\n zeroAdUnitsCallToAction: {\r\n id: 'adunitGrid.callToAction',\r\n defaultMessage: `Create Ad Unit`,\r\n },\r\n noPublisherSelected: {\r\n id: 'adunitGrid.noPublisherSelected',\r\n defaultMessage: 'A publisher and account isn’t selected yet. To start managing ad units, search for a publisher and choose account..',\r\n },\r\n prepareAdUnitsGrid: {\r\n id: 'adunits.grid.loading.text',\r\n defaultMessage: 'Fetching Ad Units Data...',\r\n },\r\n nativeAdOnboardingMsg: {\r\n id: 'adunits.grid.tython.nativeAd.onBoarding',\r\n defaultMessage:\r\n \"We've streamlined the settings for native ads, making it easier to create ad units and earn with your website. {learnMore}\",\r\n },\r\n learnMore: {\r\n id: 'adunits.grid.tython.nativeAd.onBoarding.learnMore',\r\n defaultMessage: 'Learn more',\r\n },\r\n saveAdunitFailed: {\r\n id: 'adunits.grid.saveAdunitFailed',\r\n defaultMessage: 'Save ad unit failed, please see notification center for error details',\r\n },\r\n adUnitInvalidId: {\r\n id: 'adunits.adUnitInvalidId',\r\n defaultMessage: 'Adunit has invalid id {id}',\r\n },\r\n adunitMediationUpdateStatusFailed: {\r\n id: 'adunits.adunitMediationUpdateStatusFailed',\r\n defaultMessage: \"Failed to update adUnits' mediation status. Please try again!\",\r\n },\r\n adunitDetailsFailedToLoad: {\r\n id: 'adunits.adunitDetailsFailedToLoad',\r\n defaultMessage: 'Failed to load adunit details, please try again!',\r\n },\r\n adunitTemplateFailedToLoad: {\r\n id: 'adunits.adunitTemplateFailedToLoad',\r\n defaultMessage: 'Failed to load adunit template',\r\n },\r\n failedToLoadAdunits: {\r\n id: 'adunits.failedToLoadAdunits',\r\n defaultMessage: 'Failed to load adunits',\r\n },\r\n failedToLoadAdunitsMediationStatus: {\r\n id: 'adunits.failedToLoadAdunitsMediationStatus',\r\n defaultMessage: 'Failed to load adunits mediation status',\r\n },\r\n failedToLoadAdunit: {\r\n id: 'adunits.failedToLoadAdunit',\r\n defaultMessage: 'Failed to load adunit',\r\n },\r\n failedToFetchAdSenseAdunit: {\r\n id: 'adunits.failedToFetchAdSenseAdunit',\r\n defaultMessage: \"Failed to fetch connected adSense's adUnit. Please connect and try again!\",\r\n },\r\n noConnectionWithAdSense: {\r\n id: 'adunits.noConnectionWithAdSense',\r\n defaultMessage: 'No connection with AdSense. Please connect and try again!',\r\n },\r\n editedAdunitSuccess: {\r\n id: 'adunit.editedAdunitSuccess',\r\n defaultMessage: 'Edited adunit {id} success',\r\n },\r\n adunitNameInvalid: {\r\n id: 'adunit.adunitNameInvalid',\r\n defaultMessage: 'Please enter valid name',\r\n },\r\n createAdunitFailed: {\r\n id: 'adunit.createAdunitFailed',\r\n defaultMessage: 'Create ad unit failed, please try again later.',\r\n },\r\n createAdunitInvalidState: {\r\n id: 'adunit.createAdunitInvalidState',\r\n defaultMessage: 'You have arrived in an invalid state, please report.',\r\n },\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n title: {\r\n id: 'adunitCallout.label',\r\n defaultMessage: 'Update adunit name',\r\n },\r\n});\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterSpacing } from '../../../../../../../theme';\r\n\r\nexport interface IAdUnitCalloutClassNames {\r\n calloutStyles: string;\r\n textFieldContainer: string;\r\n spinnerStyles: string;\r\n buttonsContainer: string;\r\n}\r\n\r\nexport const getClassNames = (): IAdUnitCalloutClassNames => {\r\n const theme = getTheme();\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return mergeStyleSets({\r\n calloutStyles: {\r\n padding: spacing.size16\r\n },\r\n textFieldContainer: {\r\n position: 'relative'\r\n },\r\n spinnerStyles: {\r\n position: 'absolute',\r\n top: spacing.size36,\r\n right: spacing.size8,\r\n },\r\n buttonsContainer: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n marginTop: spacing.size10\r\n },\r\n });\r\n};\r\n","import { Callout, DefaultButton, PrimaryButton, Spinner, TextField } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { useEffect, useState } from 'react';\r\nimport { getAppStore } from '../../../../../../@data';\r\nimport AppMessages from '../../../../../../App.messages';\r\nimport { IRouterWithIntl, injectIntlAndObserver } from '../../../../../../utils';\r\nimport { getAdunitStore } from '../../../@data';\r\nimport { onAdUnitNameUpdate, onAdunitNameChanged, onFetchAdUnitName } from '../../../@data/actions';\r\nimport messages from '../../ManagePage.messages';\r\nimport callOutMessages from './AdUnitNameCallout.messages';\r\nimport { getClassNames } from './AdUnitNameCallout.styles';\r\n\r\ninterface IAdUnitCallout extends IRouterWithIntl {\r\n visibleCallOut: number;\r\n setVisibleCallOut: (id: number) => void;\r\n}\r\n\r\nexport const AdUnitCallout = injectIntlAndObserver(function AdUnitCalloutComponent(props: IAdUnitCallout) {\r\n const { calloutStyles, textFieldContainer, spinnerStyles, buttonsContainer } = getClassNames();\r\n const { intl, visibleCallOut, setVisibleCallOut } = props;\r\n const { formatMessage } = intl;\r\n const { publisher, account } = getAppStore();\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState<string>();\r\n\r\n useEffect(() => {\r\n if (visibleCallOut !== 0 && publisher && account) {\r\n onFetchAdUnitName(publisher.id, account.id, visibleCallOut.toString(), setIsLoading);\r\n }\r\n return () => setErrorMessage('');\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [visibleCallOut]);\r\n\r\n return visibleCallOut !== 0 ? (\r\n <Callout\r\n ariaLabelledBy={formatMessage(callOutMessages.title)}\r\n role=\"dialog\"\r\n gapSpace={0}\r\n target={`#adunitCallout-${visibleCallOut}`}\r\n styles={{ root: calloutStyles }}\r\n onDismiss={() => setVisibleCallOut(0)}\r\n setInitialFocus\r\n >\r\n <>\r\n <div className={textFieldContainer}>\r\n <TextField\r\n label={formatMessage(messages.name)}\r\n required={true}\r\n errorMessage={errorMessage}\r\n value={getAdunitStore().active.name}\r\n disabled={isLoading}\r\n onChange={(_, value) => onAdunitNameChanged(value)}\r\n />\r\n {isLoading && <Spinner styles={{ root: spinnerStyles }} />}\r\n </div>\r\n <div className={buttonsContainer}>\r\n <PrimaryButton\r\n text={formatMessage(AppMessages.save)}\r\n disabled={isLoading}\r\n onClick={() => onAdUnitNameUpdate(formatMessage, setIsLoading, setErrorMessage, setVisibleCallOut)}\r\n />\r\n <DefaultButton text={formatMessage(AppMessages.cancel)} onClick={() => setVisibleCallOut(0)} />\r\n </div>\r\n </>\r\n </Callout>\r\n ) : (\r\n <></>\r\n );\r\n});\r\n","import { History } from 'history';\r\nimport { action } from 'satcheljs';\r\nimport { FormState } from '../../../../../../../../components/Form';\r\n\r\nexport const onScriptPageInitialized = action('onScriptPageInitialized', (publisherId: string, adunitId: string) => ({\r\n publisherId,\r\n adunitId,\r\n}));\r\n\r\nexport const onScriptChanged = action('onScriptChanged', (script: string | null) => ({ script }));\r\n\r\nexport const onCopyScriptIconChanged = action('onCopyScriptIconChanged', (iconName: string) => ({ iconName }));\r\n\r\nexport const onCopyCodeIconChanged = action('onCopyCodeIconChanged', (iconName: string) => ({ iconName }));\r\n\r\nexport const onScriptPageSubmitted = action('onScriptPageSubmitted', (mode: FormState, routeHistory: History, onSubmit?: () => void) => ({\r\n mode,\r\n routeHistory,\r\n onSubmit,\r\n}));\r\n\r\nexport const onScriptPageFormCleared = action('onScriptPageFormCleared');\r\n","import { FormState } from './FormState';\r\n\r\nconst { Create, View, Edit, InPageCreate, InPageView, InPageEdit, MultiStepCreation, MultiStepEdit } = FormState;\r\n\r\nexport function isEditing(formState: FormState): boolean {\r\n return [Edit, InPageEdit, MultiStepEdit].includes(formState);\r\n}\r\n\r\nexport function isCreating(formState: FormState): boolean {\r\n return [Create, InPageCreate, MultiStepCreation].includes(formState);\r\n}\r\n\r\nexport function isViewing(formState: FormState): boolean {\r\n return [View, InPageView].includes(formState);\r\n}\r\n\r\nexport function isInPageForm(formState: FormState): boolean {\r\n return [InPageCreate, InPageView, InPageEdit].includes(formState);\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n noCodeFound: {\r\n id: 'nativeAd.scriptPage.noCodeFound',\r\n defaultMessage: 'No code found',\r\n },\r\n setUpTemplate: {\r\n id: 'nativeAd.scriptPage.setUpTemplate',\r\n defaultMessage: 'Set up template',\r\n },\r\n noScriptDesc: {\r\n id: 'nativeAd.scriptPage.noScriptDesc',\r\n defaultMessage: `Seems like you haven't configured template for this ad unit yet, click on the button to set it up first.`,\r\n },\r\n});\r\n","import { FontWeights, getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubCenterFonts, IPubcenterSpacing } from '../../../../../../../theme';\r\nimport { INoScriptPageClassNames } from './NoScriptPage.types';\r\n\r\nexport const getClassNames = (): INoScriptPageClassNames => {\r\n const theme = getTheme();\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const fonts = theme.fonts as IPubCenterFonts;\r\n\r\n return mergeStyleSets({\r\n root: {\r\n textAlign: 'center',\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n transform: `translate(-50%, -50%)`,\r\n },\r\n title: {\r\n margin: `${spacing.size16} 0`,\r\n fontWeight: FontWeights.regular,\r\n color: theme.palette.neutralSecondary,\r\n fontSize: '26px',\r\n },\r\n description: {\r\n marginBottom: spacing.size16,\r\n color: theme.palette.neutralSecondary,\r\n fontSize: fonts.size16.fontSize,\r\n lineHeight: fonts.size16.lineHeight,\r\n },\r\n });\r\n};\r\n","import { DefaultButton } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport { getAppStore } from '../../../../../../@data';\r\nimport { FormState } from '../../../../../../components/Form';\r\nimport { RouteName } from '../../../../@data';\r\nimport { createReturnUrl } from '../../../../@data/services/AdManagementService';\r\nimport NoCodeFound from '../../resources/NoCodeFound.svg';\r\nimport messages from './NoScriptPage.messages';\r\nimport { getClassNames } from './NoScriptPage.styles';\r\nimport { INoScriptPageProps } from './NoScriptPage.types';\r\n\r\nexport const NoScriptPage = injectIntl(function NoScriptPageComponent(props: INoScriptPageProps) {\r\n const { publisher, account } = getAppStore();\r\n const { formatMessage } = props.intl;\r\n const { root, title, description } = getClassNames();\r\n const setupTemplateRedirectionFromPanel = () => {\r\n const returnUrl = createReturnUrl(RouteName.adunit, publisher?.id, account?.id, props.adunitId.toString(), FormState.MultiStepEdit, 2);\r\n props.history.push(returnUrl);\r\n };\r\n\r\n const setupTemplateRedirectionInPageView = () => props.goToStep?.(2);\r\n\r\n return (\r\n <div className={root}>\r\n <img src={NoCodeFound} alt={formatMessage(messages.noCodeFound)} />\r\n <h2 className={title}>{formatMessage(messages.noCodeFound)}</h2>\r\n <p className={description}>{formatMessage(messages.noScriptDesc)}</p>\r\n <DefaultButton\r\n text={formatMessage(messages.setUpTemplate)}\r\n onClick={\r\n props.mode === FormState.MultiStepCreation || props.mode === FormState.MultiStepEdit\r\n ? setupTemplateRedirectionInPageView\r\n : setupTemplateRedirectionFromPanel\r\n }\r\n />\r\n </div>\r\n );\r\n});\r\n","import { createStore } from 'satcheljs';\r\nimport { IScriptPageState } from './schema/IScriptPageState';\r\n\r\nexport const getScriptPageStore = createStore<IScriptPageState>('ScriptPageState', {\r\n script: '',\r\n copyScriptIcon: 'Copy',\r\n copyCodeIcon: 'Copy',\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { onCopyCodeIconChanged, onCopyScriptIconChanged, onScriptChanged, onScriptPageFormCleared } from '../actions/onScriptPageActions';\r\nimport { getScriptPageStore } from '../store/store';\r\n\r\nmutator(onScriptChanged, (msg) => {\r\n getScriptPageStore().script = msg.script;\r\n});\r\n\r\nmutator(onCopyScriptIconChanged, (msg) => {\r\n getScriptPageStore().copyScriptIcon = msg.iconName;\r\n});\r\n\r\nmutator(onCopyCodeIconChanged, (msg) => {\r\n getScriptPageStore().copyCodeIcon = msg.iconName;\r\n});\r\n\r\nmutator(onScriptPageFormCleared, () => {\r\n getScriptPageStore().script = '';\r\n});\r\n","import { Model } from '..';\r\n\r\nexport class AdunitServingScript extends Model {\r\n public apiPath = undefined;\r\n public className = 'servingScript';\r\n public script: string;\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n title: {\r\n id: 'nativeAd.scriptPage.title',\r\n defaultMessage: 'Almost there! Time to place the code',\r\n },\r\n tips: {\r\n id: 'nativeAd.scriptPage.tips',\r\n defaultMessage: `Make sure you place the ad inside your feed. You can place it in between the content of your feed, or where the feed begins or ends. However, don’t place the ad in the sidebar as this can negatively affect performance. The container you place your ad in should have variable height. Fixed height containers might result in distorted ads.`,\r\n },\r\n subTitle1: {\r\n id: 'nativeAd.scriptPage.subTitle1',\r\n defaultMessage: 'Load the following script in your header tag',\r\n },\r\n scriptPlacementInfo: {\r\n id: 'nativeAd.scriptPage.scriptPlacementInfo',\r\n defaultMessage:\r\n 'As of July 5, 2023, we launched a new version of our ad code. You will need to replace both the header script and ad code with the below if you placed them before July 5, 2023.',\r\n },\r\n subTitle2: {\r\n id: 'nativeAd.scriptPage.subTitle2',\r\n defaultMessage: 'Place the following code in your webpage where you want to render the ads.',\r\n },\r\n copyCodeButton: {\r\n id: 'nativeAd.scriptPage.copyCodeButton',\r\n defaultMessage: 'Copy code snippet',\r\n },\r\n copyScriptImageAlt: {\r\n id: 'nativeAd.scriptPage.copyScriptImageAlt',\r\n defaultMessage: 'Paste this code snippet inside head tag of your webpage.',\r\n },\r\n scriptCodePasteGuideline: {\r\n id: 'nativeAd.scriptPage.scriptCodePasteGuideline',\r\n defaultMessage: 'Click to copy script and paste it inside head tag of your webpage.',\r\n },\r\n copyCodeButtonDescription: {\r\n id: 'nativeAd.scriptPage.copyCodeButtonDescription',\r\n defaultMessage: 'Click to copy ad code and paste it in between your feed, to render in-feed ad.',\r\n },\r\n doneButtonLabel: {\r\n id: 'nativeAd.scriptPage.doneButtonLabel',\r\n defaultMessage: `I'm done`,\r\n },\r\n backButtonLabel: {\r\n id: 'nativeAd.scriptPage.backButtonLabel',\r\n defaultMessage: 'Back',\r\n },\r\n failedToFetchScript: {\r\n id: 'nativeAd.scriptPage.failedToFetchScript',\r\n defaultMessage: 'Failed to fetch script',\r\n },\r\n inValidStateInScriptPage: {\r\n id: 'nativeAd.scriptPage.inValidStateScriptPage',\r\n defaultMessage: 'You have arrived in an invalid state, please report.',\r\n },\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { AdUnit, ApiError, ApiErrorCodes, Publisher, getAppStore, getEntity, onNotificationChanged } from '../../../../../../../../@data';\r\nimport { AdunitServingScript } from '../../../../../../../../@data/store/schema/models/AdunitServingScript';\r\nimport messages from '../../ScriptPage.messages';\r\nimport { onScriptChanged, onScriptPageInitialized } from '../actions/onScriptPageActions';\r\n\r\norchestrator(onScriptPageInitialized, async (msg) => {\r\n const publisherId = parseInt(msg.publisherId, 10);\r\n const adunitId = parseInt(msg.adunitId, 10);\r\n const { userContext } = getAppStore();\r\n\r\n if (!isNaN(publisherId) && !isNaN(adunitId)) {\r\n const publisher = new Publisher(publisherId);\r\n const adunit = new AdUnit(adunitId);\r\n\r\n try {\r\n const script = (await getEntity([publisher, adunit], userContext, AdunitServingScript)).toString();\r\n onScriptChanged(script);\r\n } catch (e) {\r\n const errorObj = JSON.parse((e as ApiError).message);\r\n if (errorObj && errorObj[0].code === ApiErrorCodes.AdUnitDoesNotHaveTemplate) {\r\n onScriptChanged(null);\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.failedToFetchScript,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n }\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.inValidStateInScriptPage,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { getAppStore, onNavigateBack } from '../../../../../../../../@data';\r\nimport { FormState } from '../../../../../../../../components/Form';\r\nimport { RouteName } from '../../../../../../@data';\r\nimport { createReturnUrl } from '../../../../../../@data/services/AdManagementService';\r\nimport { onScriptPageFormCleared, onScriptPageSubmitted } from '../actions/onScriptPageActions';\r\n\r\norchestrator(onScriptPageSubmitted, (msg) => {\r\n const { publisher, account } = getAppStore();\r\n\r\n if (msg.mode !== FormState.InPageView) {\r\n const returnUrl = createReturnUrl(RouteName.adunit, publisher!.id, account!.id);\r\n onNavigateBack(msg.routeHistory, returnUrl);\r\n }\r\n\r\n onScriptPageFormCleared();\r\n if (msg.onSubmit) {\r\n msg.onSubmit();\r\n }\r\n});\r\n","import { classNamesFunction, FontWeights, getTheme } from '@fluentui/react';\r\nimport { IPubcenterPalette, IPubcenterSpacing } from '../../../../../../../theme';\r\nimport { IScriptPageStyleProps, IScriptPageStyles } from './ScriptPage.types';\r\n\r\nexport const getStyles = (props?: IScriptPageStyleProps): IScriptPageStyles => {\r\n const theme = getTheme();\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const pageWidth = spacing.size896;\r\n\r\n return {\r\n root: {\r\n marginRight: spacing.size32,\r\n maxWidth: pageWidth,\r\n },\r\n title: {\r\n marginBottom: spacing.size16,\r\n fontSize: theme.fonts.mediumPlus.fontSize,\r\n fontWeight: FontWeights.semibold,\r\n lineHeight: '22px',\r\n },\r\n tipsText: {\r\n fontSize: theme.fonts.medium.fontSize,\r\n lineHeight: spacing.size20,\r\n margin: `${spacing.size16} 0`,\r\n },\r\n scriptWithImage: {\r\n display: 'flex',\r\n gap: spacing.size16,\r\n },\r\n scriptSectionLeft: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '-webkit-fill-available',\r\n },\r\n messageBar: {\r\n marginBottom: spacing.size12,\r\n },\r\n scriptBox: {\r\n borderColor: palette.neutralLight,\r\n borderStyle: 'solid',\r\n borderWidth: '1px',\r\n padding: spacing.size12,\r\n marginBottom: spacing.size16,\r\n },\r\n scriptHolder: {\r\n display: 'block',\r\n whiteSpace: 'pre-wrap',\r\n wordBreak: 'break-all',\r\n backgroundColor: palette.neutralLighter,\r\n minHeight: spacing.size16,\r\n maxHeight: spacing.size146,\r\n padding: spacing.size12,\r\n marginBottom: spacing.size12,\r\n overflow: 'auto',\r\n color: palette.black,\r\n lineHeight: spacing.size16,\r\n fontSize: theme.fonts.small.fontSize,\r\n },\r\n };\r\n};\r\n\r\nconst _getClassNames = classNamesFunction<IScriptPageStyleProps, IScriptPageStyles>();\r\n\r\nexport const getClassNames = (props?: IScriptPageStyleProps) => _getClassNames(getStyles, props);\r\n","import { DefaultButton } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { setTimeout } from 'timers';\r\nimport { Log } from '../../../../../../../logging/src';\r\nimport { getAppStore } from '../../../../../../@data';\r\nimport { FormTitle } from '../../../../../../components/Form';\r\nimport { isInPageForm } from '../../../../../../components/Form/FormState/formUtils';\r\nimport { COPY_BUTTON_TIMEOUT } from '../../../../../../constants/AppConstants';\r\nimport { injectIntlWithObserver } from '../../../../../../utils';\r\nimport { getAdunitStore } from '../../../@data';\r\nimport scriptPlacementImage from '../../resources/scriptPlacement.png';\r\nimport { NoScriptPage } from '../NoScriptPage/NoScriptPage';\r\nimport { onCopyCodeIconChanged, onCopyScriptIconChanged, onScriptPageInitialized } from './@data/actions/onScriptPageActions';\r\nimport './@data/mutators/scriptChanged';\r\nimport './@data/orchestrators';\r\nimport { getScriptPageStore } from './@data/store/store';\r\nimport messages from './ScriptPage.messages';\r\nimport { getClassNames } from './ScriptPage.styles';\r\nimport { IScriptPageProps } from './ScriptPage.types';\r\n\r\n/**\r\n *\r\n * TODO: we should not dependent on API to provide this script, going forward we need move the script\r\n * generation logic to UI side and reduce the load time for script generation.\r\n * Track this here https://msasg.visualstudio.com/Bing_Ads/_workitems/edit/7434728\r\n */\r\nconst adUnitSnippetSerializer = ({\r\n originalScript,\r\n adUnitId,\r\n}: {\r\n originalScript?: string;\r\n adUnitId?: string | number;\r\n}): string | boolean => {\r\n // Extracting the adUnitId from the input string or from props\r\n const adUnitIdMatch = originalScript ? originalScript.match(/adUnitId:\\s*\"(.*?)\"/)?.[1] : adUnitId ? adUnitId.toString() : '';\r\n\r\n if (!adUnitIdMatch) {\r\n Log.error(`Invalid props, ${originalScript}, ${adUnitId}`);\r\n return false;\r\n }\r\n\r\n const output = `\r\n<div id=\"${adUnitIdMatch}\"></div>\r\n<script>\r\n window.msAdsQueue.push(function(){\r\n window.mmnow.render({\r\n adUnitId: ${adUnitIdMatch},\r\n elementId: ${adUnitIdMatch}\r\n });\r\n });\r\n</script>\r\n `;\r\n return output.trim();\r\n};\r\n\r\nexport const NativeAdScriptPage = injectIntlWithObserver(function ScriptPage(props: IScriptPageProps) {\r\n const { formatMessage } = props.intl;\r\n const classNames = getClassNames();\r\n const appStore = getAppStore();\r\n const { script: scriptRaw, copyScriptIcon, copyCodeIcon } = getScriptPageStore();\r\n // In case of mode=FormState.InPageView, adunitId should be passed as a prop\r\n const adunitId = props.match.params.id || props.adunitId || getAdunitStore().active.id?.toString();\r\n let publisherId = props.match.params.publisherId;\r\n // In case publisherId is not extracted from route, fetch it from appStore\r\n if (!publisherId && appStore.publisher) {\r\n publisherId = appStore.publisher?.id;\r\n }\r\n\r\n const script = React.useMemo(() => scriptRaw?.replace('$SITE_ID', props.siteId?.toString?.() ?? 'unknown'), [scriptRaw, props.siteId]);\r\n const shouldManualTriggerInitialization = React.useMemo(() => props.shouldRenderComponent && publisherId && adunitId && !scriptRaw, [\r\n props.shouldRenderComponent,\r\n publisherId,\r\n adunitId,\r\n scriptRaw,\r\n ]);\r\n // We might have to update this script splitting logic whenever script changes\r\n const headerScript = script?.substring(0, script.indexOf('<div'));\r\n const adRenderingCode = ((script?.substring(script.indexOf('<div')) &&\r\n adUnitSnippetSerializer({ originalScript: script, adUnitId: adunitId })) ||\r\n '') as string;\r\n\r\n const onCopyScriptClicked = (text: string) => {\r\n navigator.clipboard.writeText(text);\r\n // This change of icon will indicate the user that script copy was successful\r\n onCopyScriptIconChanged('Accept');\r\n // After 3000ms we change the icon back to 'Copy'\r\n setTimeout(() => onCopyScriptIconChanged('Copy'), COPY_BUTTON_TIMEOUT);\r\n };\r\n\r\n const onCopyCodeClicked = (text: string) => {\r\n // Replace narrow no-break space with empty space\r\n navigator.clipboard.writeText(text.replace(/\\u202F/g, ' '));\r\n onCopyCodeIconChanged('Accept');\r\n setTimeout(() => onCopyCodeIconChanged('Copy'), COPY_BUTTON_TIMEOUT);\r\n };\r\n\r\n useEffect(() => {\r\n if (publisherId && adunitId && adunitId !== 'undefined') {\r\n onScriptPageInitialized(publisherId, adunitId);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (shouldManualTriggerInitialization) {\r\n onScriptPageInitialized(publisherId!, adunitId!);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [shouldManualTriggerInitialization]);\r\n\r\n // This useEffect will focus on the 'Finish' button when the component is rendered\r\n useEffect(() => {\r\n if (script && props.shouldRenderComponent) {\r\n const buttons = document.querySelectorAll('button');\r\n buttons.forEach((button) => {\r\n if (button.innerText === 'Finish') {\r\n button.focus();\r\n }\r\n });\r\n }\r\n }, [props.shouldRenderComponent, script]); // The empty dependency array ensures this runs only once, when the component mounts.\r\n\r\n if (props.shouldRenderComponent !== undefined && !props.shouldRenderComponent) {\r\n return null;\r\n }\r\n\r\n return script === null || script === undefined ? (\r\n <NoScriptPage {...props} mode={props.mode} adunitId={parseInt(adunitId!, 10)} />\r\n ) : (\r\n <div className={classNames.root}>\r\n {isInPageForm(props.mode) && <FormTitle title={formatMessage(messages.title)} intl={props.intl} noHelpPopup={true} />}\r\n <p className={classNames.tipsText}>{formatMessage(messages.tips)}</p>\r\n <h2 className={classNames.title}>{formatMessage(messages.subTitle1)}</h2>\r\n <div className={classNames.scriptWithImage}>\r\n <div className={classNames.scriptSectionLeft}>\r\n <div className={classNames.scriptBox}>\r\n <code className={classNames.scriptHolder}>{headerScript}</code>\r\n <DefaultButton\r\n text={formatMessage(messages.copyCodeButton)}\r\n iconProps={{ iconName: copyScriptIcon }}\r\n onClick={() => onCopyScriptClicked(headerScript!)}\r\n ariaDescription={formatMessage(messages.scriptCodePasteGuideline)}\r\n />\r\n </div>\r\n </div>\r\n <img src={scriptPlacementImage} alt={formatMessage(messages.copyScriptImageAlt)} width={285} height={178} />\r\n </div>\r\n <h2 className={classNames.title}>{formatMessage(messages.subTitle2)}</h2>\r\n <div className={classNames.scriptBox}>\r\n <code className={classNames.scriptHolder}>{adRenderingCode}</code>\r\n <DefaultButton\r\n text={formatMessage(messages.copyCodeButton)}\r\n iconProps={{ iconName: copyCodeIcon }}\r\n onClick={() => onCopyCodeClicked(adRenderingCode!)}\r\n ariaDescription={formatMessage(messages.copyCodeButtonDescription)}\r\n />\r\n </div>\r\n </div>\r\n );\r\n});\r\n","import { Panel, PanelType } from '@fluentui/react';\r\nimport React from 'react';\r\nimport AppMessages from '../../../../../../App.messages';\r\nimport { FormState } from '../../../../../../components/Form';\r\nimport { IRouterWithIntl, injectIntlAndObserver } from '../../../../../../utils';\r\nimport { getAdunitStore } from '../../../@data';\r\nimport { onPanelOpenChanged } from '../../../@data/actions';\r\nimport { onScriptPageFormCleared } from '../../../TythonAdunit/components/ScriptPage/@data/actions/onScriptPageActions';\r\nimport { NativeAdScriptPage } from '../../../TythonAdunit/components/ScriptPage/ScriptPage';\r\n\r\nexport interface ICodePanelProps extends IRouterWithIntl {}\r\n\r\nexport const CodePanel = injectIntlAndObserver(function CodePanelComponent(props: ICodePanelProps) {\r\n const { isPanelOpen, scriptProps } = getAdunitStore();\r\n\r\n return (\r\n <Panel\r\n isOpen={isPanelOpen}\r\n type={PanelType.custom}\r\n customWidth={'900px'}\r\n onDismiss={() => {\r\n onPanelOpenChanged(false);\r\n onScriptPageFormCleared();\r\n }}\r\n isLightDismiss\r\n closeButtonAriaLabel={props.intl.formatMessage(AppMessages.close)}\r\n >\r\n <NativeAdScriptPage\r\n {...props}\r\n mode={FormState.InPageView}\r\n adunitId={scriptProps?.adunitId?.toString()}\r\n onSubmit={() => onPanelOpenChanged(false)}\r\n onCancel={() => onPanelOpenChanged(false)}\r\n siteId={scriptProps?.propertyId!}\r\n />\r\n </Panel>\r\n );\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n adunitId: {\r\n id: 'adunit.id',\r\n defaultMessage: 'Ad unit ID',\r\n },\r\n uploadBoostTemplate: {\r\n id: 'upload.message',\r\n defaultMessage: 'Upload Configuration File',\r\n },\r\n downloadTemplate: {\r\n id: 'download.template',\r\n defaultMessage: 'Download Current Template',\r\n },\r\n adunitType: {\r\n id: 'adunit.type',\r\n defaultMessage: 'Ad unit type',\r\n },\r\n marketPlaceOptionCore: {\r\n id: 'marketeplace.core',\r\n defaultMessage: 'Owned and Operated(Core)',\r\n },\r\n marketPlaceOptionRest: {\r\n id: 'marketeplace.rest',\r\n defaultMessage: 'Owned and Operated(Rest)',\r\n },\r\n marketPlaceOptionSyndicated: {\r\n id: 'marketeplace.syndicated',\r\n defaultMessage: 'Syndicated',\r\n },\r\n marketPlaceOptionSelectTier: {\r\n id: 'marketplace.selectTier',\r\n defaultMessage: 'Select Tier',\r\n },\r\n marketPlaceOptionsSponsored: {\r\n id: 'marketplace.sponsored',\r\n defaultMessage: 'Sponsored',\r\n },\r\n marketPlaceOptionsSponsoredEnhanced: {\r\n id: 'marketplace.sponsoredEnhanced',\r\n defaultMessage: 'Sponsored Enhanced',\r\n },\r\n adunitNameLabel: {\r\n id: 'adunitName.label',\r\n defaultMessage: 'Ad unit name',\r\n },\r\n adunitIdLabel: {\r\n id: 'adunit.id',\r\n defaultMessage: 'Ad unit ID',\r\n },\r\n marketplaceLabel: {\r\n id: 'marketpalce.label',\r\n defaultMessage: 'Marketplace classfication',\r\n },\r\n businessModelLabel: {\r\n id: 'businessmodel.label',\r\n defaultMessage: 'Business model',\r\n },\r\n businessModelLevel2AriaLabel: {\r\n id: 'businessmodel.level2Arialabel',\r\n defaultMessage: 'Business model level 2',\r\n },\r\n distributionPartnerCodesLabel: {\r\n id: 'distributionPartnerCodes.label',\r\n defaultMessage: 'Search Distribution Partner Codes',\r\n },\r\n distributionPartnerCodesLabelDescription: {\r\n id: 'distributionPartnerCodesDescription.label',\r\n defaultMessage: 'Please list the Distribution Partner Codes above, with one code per line',\r\n },\r\n distributionPartnerCodesTextfieldPlaceholder: {\r\n id: 'distributionPartnerCodes.textfield.placeholder',\r\n defaultMessage: 'ExamplePC01\\nExamplePC02\\nExamplePC03',\r\n },\r\n createPageTitle: {\r\n id: 'create.page.title',\r\n defaultMessage: 'Create ad unit',\r\n },\r\n editPageTitle: {\r\n id: 'edit.page.title',\r\n defaultMessage: 'Edit ad unit',\r\n },\r\n updateAdUnit: {\r\n id: 'adunit.updateAdunit',\r\n defaultMessage: 'Update ad unit',\r\n },\r\n continueAdUnit: {\r\n id: 'adunit.continueAdunit',\r\n defaultMessage: 'Continue',\r\n },\r\n cancelAdUnit: {\r\n id: 'adunit.cancelAdUnit',\r\n defaultMessage: 'Cancel',\r\n },\r\n previousStepAdUnit: {\r\n id: 'adunit.previousStepAdUnit',\r\n defaultMessage: 'Previous',\r\n },\r\n channelTitle: {\r\n id: 'channel.title',\r\n defaultMessage: 'Channels',\r\n },\r\n propertySectionTitle: {\r\n id: 'property.sectionTitle',\r\n defaultMessage: 'Properties (optional)',\r\n },\r\n advOptionTitle: {\r\n id: 'advOption.title',\r\n defaultMessage: 'Advanced Options',\r\n },\r\n createChannelButton: {\r\n id: 'create.channel.button',\r\n defaultMessage: 'Create Channel',\r\n },\r\n channelPickerAriaDesc: {\r\n id: 'channelPickerAriaDesc',\r\n defaultMessage: 'Select channels to add the ad unit',\r\n },\r\n servingTierTitle: {\r\n id: 'servingTier.title',\r\n defaultMessage: 'Serving Tier',\r\n },\r\n servingTierOptionLowcost: {\r\n id: 'servingTier.option.lowcost',\r\n defaultMessage: 'Low Cost',\r\n },\r\n publisherGroupConfigLabel: {\r\n id: 'publisherGroupConfig.label',\r\n defaultMessage: 'Publisher Group configuration',\r\n },\r\n publisherGroupConfigOptionDefaultPlus: {\r\n id: 'publisherGroupConfig.option.defaultPlus',\r\n defaultMessage: 'Default+',\r\n },\r\n publisherGroupConfigOptionDefault: {\r\n id: 'publisherGroupConfig.option.default',\r\n defaultMessage: 'Default',\r\n },\r\n publisherGroupConfigOptionGeneralist: {\r\n id: 'publisherGroupConfig.option.Generalist',\r\n defaultMessage: 'Generalist',\r\n },\r\n publisherGroupConfigOptionYieldOptimizer: {\r\n id: 'publisherGroupConfig.option.yieldOptimizer',\r\n defaultMessage: 'Yield Optimizer',\r\n },\r\n publisherGroupConfigOptionYieldMaximizer: {\r\n id: 'publisherGroupConfig.option.yieldMaximizer',\r\n defaultMessage: 'Yield Maximizer',\r\n },\r\n publisherGroupConfigOptionBingandYahoo: {\r\n id: 'publisherGroupConfig.option.BingandYahoo',\r\n defaultMessage: 'Bing/Yahoo O&O',\r\n },\r\n publisherGroupConfigOptionLowQualityDistribution: {\r\n id: 'publisherGroupConfig.option.LowQualityDistribution',\r\n defaultMessage: 'Low quality Distribution traffic',\r\n },\r\n publisherGroupConfigOptionMediumQualityDistribution: {\r\n id: 'publisherGroupConfig.option.MediumQualityDistribution',\r\n defaultMessage: 'Medium quality Distribution traffic',\r\n },\r\n publisherGroupConfigOptionHighQualityDistribution: {\r\n id: 'publisherGroupConfig.option.HighQualityDistribution',\r\n defaultMessage: 'High quality Distribution traffic',\r\n },\r\n privateMarketplaceLabel: {\r\n id: 'privateMarketplace.label',\r\n defaultMessage: 'Enable Private Marketplace',\r\n },\r\n privateMarketplaceTextfieldLabel: {\r\n id: 'privateMarketplace.textfield.label',\r\n defaultMessage: 'Private Marketplace IDs',\r\n },\r\n privateMarketplaceTextfieldPlaceholder: {\r\n id: 'privateMarketplace.textfield.placeholder',\r\n defaultMessage: 'Example ID 1, enter one per line',\r\n },\r\n promotionRadioOptionLabel: {\r\n id: 'promotionOption.radio.label',\r\n defaultMessage: 'Sponsored Product Ads Stores',\r\n },\r\n promotionOptionTextfieldLabel: {\r\n id: 'promotionOption.textfield.label',\r\n defaultMessage: 'Store IDs',\r\n },\r\n promotionOptionTextfieldPlaceholder: {\r\n id: 'promotionOption.textfield.placeholder',\r\n defaultMessage: 'Example Store ID 1, enter one per line',\r\n },\r\n boostRadioOptionLabel: {\r\n id: 'boostOption.radio.label',\r\n defaultMessage: 'Boost Advertiser Accounts',\r\n },\r\n boostOptionTextfieldLabel: {\r\n id: 'boostOption.textfield.label',\r\n defaultMessage: 'Advertiser Account IDs',\r\n },\r\n boostOptionTextfieldPlaceholder: {\r\n id: 'boostOption.textfield.placeholder',\r\n defaultMessage: 'Example Account ID 1, enter one per line',\r\n },\r\n propertyName: {\r\n id: 'property.name',\r\n defaultMessage: 'Property name',\r\n },\r\n propertyButton: {\r\n id: 'property.add',\r\n defaultMessage: 'Add property',\r\n },\r\n siteButton: {\r\n id: 'site.add',\r\n defaultMessage: 'Add site',\r\n },\r\n site: {\r\n id: 'site',\r\n defaultMessage: 'Site',\r\n },\r\n websiteUrl: {\r\n id: 'property.url',\r\n defaultMessage: 'Website URL',\r\n },\r\n propertyId: {\r\n id: 'property.id',\r\n defaultMessage: 'Property ID',\r\n },\r\n propertyDefaultOptionText: {\r\n id: 'property.defaultOptionText',\r\n defaultMessage: 'Type ID or URL to select the site',\r\n },\r\n propertyDefaultNotFound: {\r\n id: 'property.defaultNotFound',\r\n defaultMessage: 'No property found, create new property before select',\r\n },\r\n siteDefaultNotFound: {\r\n id: 'site.defaultNotFound',\r\n defaultMessage: 'No site found, create new site before select',\r\n },\r\n createPropertyButtonLabel: {\r\n id: 'property.CreateButtonLabel',\r\n defaultMessage: 'Create property',\r\n },\r\n propertySearchPlaceholder: {\r\n id: 'property.SearchPlaceholder',\r\n defaultMessage: 'Search properties by ID or URL',\r\n },\r\n businessModelLevel1DefaultOptionText: {\r\n id: 'businessmodel.Level1DefaultOptionText',\r\n defaultMessage: 'Select level 1 (optional)',\r\n },\r\n businessModelLevel2DefaultOptionText: {\r\n id: 'businessmodel.Level2DefaultOptionText',\r\n defaultMessage: 'Select level 2 (optional)',\r\n },\r\n propertyPickerEmptyOptionLabel: {\r\n id: 'propertyPicker.EmptyOptionLabel',\r\n defaultMessage: 'Select a property',\r\n },\r\n createPropButtonAriaDesc: {\r\n id: 'propertyPicker.createButtonAriaDesc',\r\n defaultMessage: 'Click this button to create property within this page',\r\n },\r\n propertyOptionsAriaLabel: {\r\n id: 'propertyPicker.OptionsAriaLabel',\r\n defaultMessage: 'Property search results',\r\n },\r\n propertyPickerSearchBoxAriaDesc: {\r\n id: 'propertyPickerSearchBoxAriaDesc',\r\n defaultMessage: 'Click enter to view all properties',\r\n },\r\n propertyPickerItemSelectedAnnounceMsg: {\r\n id: 'propertyPickerItemSelectedAnnounceMsg',\r\n defaultMessage: 'Property selected',\r\n },\r\n createAdunit: {\r\n id: 'createAdunit',\r\n defaultMessage: 'Create new ad unit',\r\n },\r\n newAudienceAd: {\r\n id: 'newAudienceAd',\r\n defaultMessage: 'New audience ad',\r\n },\r\n nativeAdOptionLabel: {\r\n id: 'nativeAdOptionLabel',\r\n defaultMessage: 'Native/Audience ad \\n\\n Match the look of your site and fit in between posts and listings.',\r\n },\r\n searchAdOptionLabel: {\r\n id: 'searchAdOptionLabel',\r\n defaultMessage: 'Search ad \\n\\n Coming soon',\r\n },\r\n otherAdOptionLabel: {\r\n id: 'otherAdOptionLabel',\r\n defaultMessage: 'Other ad \\n\\n Coming soon',\r\n },\r\n nativeAdDesc: {\r\n id: 'nativeAdDesc',\r\n defaultMessage: 'Match the look of your site and fit in between posts and listings.',\r\n },\r\n seeExample: {\r\n id: 'seeExample',\r\n defaultMessage: 'See example',\r\n },\r\n comingSoon: {\r\n id: 'comingSoon',\r\n defaultMessage: 'Coming soon',\r\n },\r\n templatePanelTitle: {\r\n id: 'templatePanelTitle',\r\n defaultMessage: 'Choose a template and style to match the feeds on your page',\r\n },\r\n\r\n mediationHeader: {\r\n id: 'mediationSetupMessages.mediationHeader',\r\n defaultMessage: 'Mediation set up',\r\n },\r\n mediationDescription: {\r\n id: 'mediationSetupMessages.mediationDescription',\r\n defaultMessage: `Connect your Google accounts to ensure you are getting the highest bid possible for your ad inventory. We'll only serve our ads if we predict we can deliver a higher payment compared to Google.`,\r\n },\r\n mediationToggleLabel: {\r\n id: 'mediationSetupMessages.mediationToggleLabel',\r\n defaultMessage: 'Enable mediation',\r\n },\r\n nativeAd: {\r\n id: 'nativeAdAccordionCheckboxLabel',\r\n defaultMessage: 'Native Ad',\r\n },\r\n nativeAdSubContent: {\r\n id: 'nativeAdAccordionSubContent',\r\n defaultMessage: 'Match the look of your site and fit in between posts and listings',\r\n },\r\n displayAd: {\r\n id: 'displayAdAccordionCheckboxLabel',\r\n defaultMessage: 'Display Ad',\r\n },\r\n displayAdSubContent: {\r\n id: 'displayAdAccordionSubContent',\r\n defaultMessage: 'Simple image ads that fit in between posts and listings',\r\n },\r\n nativeAdConfigLabel: {\r\n id: 'nativeAd.configuration.label',\r\n defaultMessage: 'Native ad configuration',\r\n },\r\n nativeAdConfigLabelFont: {\r\n id: 'nativeAd.configuration.font.label',\r\n defaultMessage: 'Font',\r\n },\r\n nativeAdConfigLabelTitleColor: {\r\n id: 'nativeAd.configuration.titleColor.label',\r\n defaultMessage: 'Title Color',\r\n },\r\n nativeAdConfigLabelBackgroundColor: {\r\n id: 'nativeAd.configuration.backgroundColor.label',\r\n defaultMessage: 'Background Color',\r\n },\r\n nativeAdConfigLabelButtonBackgroundColor: {\r\n id: 'nativeAd.configuration.buttonBackgroundColor.label',\r\n defaultMessage: 'Button Background Color',\r\n },\r\n nativeAdConfigMsgBarContent: {\r\n id: 'nativeAd.configuration.messageBar.content',\r\n defaultMessage: 'Ads might look different from the preview shown.',\r\n },\r\n displayAdMsgBarContent: {\r\n id: 'displayAd.configuration.messageBar.content',\r\n defaultMessage:\r\n 'Smart auto-sizing will adapt to your site’s container, and so the actual ads served might look slightly different from the examples shown. For smart auto-sizing to work,{displayAdMsgBarLink}',\r\n },\r\n displayAdMsgBarLink: {\r\n id: 'displayAd.configuration.messageBar.link',\r\n defaultMessage: 'ensure you have properly defined your container sizes',\r\n },\r\n adPreview: {\r\n id: 'adType.preview.title',\r\n defaultMessage: 'Ad Preview',\r\n },\r\n adPreviewHorizontal: {\r\n id: 'adType.preview.title',\r\n defaultMessage: 'Ad Preview container size horizontal',\r\n },\r\n adPreviewVertical: {\r\n id: 'adType.preview.title',\r\n defaultMessage: 'Ad preview container size vertical',\r\n },\r\n adPreviewContainerSize: {\r\n id: 'adType.preview.container.size.label',\r\n defaultMessage: 'Container size',\r\n },\r\n warningAdUnitTypeNotSelected: {\r\n id: 'adType.warning.notSelected',\r\n defaultMessage: 'At least one ad unit type should be selected.',\r\n },\r\n warningAdUnitTypeNotFullySelected: {\r\n id: 'adType.warning.notFullySelected',\r\n defaultMessage: 'Selecting fewer ad types may reduce monetization.',\r\n },\r\n saveAndGetCode: {\r\n id: 'tython.adunit.create.submit.label',\r\n defaultMessage: 'Save and get code',\r\n },\r\n finishAdUnitCreation: {\r\n id: 'tython.adunit.create.submit.aftercode',\r\n defaultMessage: 'Finish',\r\n },\r\n comingSoonMsg: {\r\n id: 'tython.adunit.create.type.display.intro.msg',\r\n defaultMessage: 'Coming Soon',\r\n },\r\n selectDisplayAdLayout: {\r\n id: 'tython.adunit.create.type.display.layout.selection',\r\n defaultMessage: 'Pick a layout for your display ad',\r\n },\r\n displayAdPreviewHeadline: {\r\n id: 'tython.adunit.create.type.display.preview.headline',\r\n defaultMessage: 'Lorem ipsum dolor sit amet',\r\n },\r\n displayAdPreviewTextContent: {\r\n id: 'tython.adunit.create.type.display.preview.text.content',\r\n defaultMessage:\r\n 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',\r\n },\r\n displayAdPreviewLearnMoreButton: {\r\n id: 'tython.adunit.create.type.display.preview.learnMore.button',\r\n defaultMessage: 'Learn more',\r\n },\r\n displayAdPreviewExamplePrimaryTitle: {\r\n id: 'tython.adunit.create.type.display.preview.primary.title',\r\n defaultMessage: 'Example 1',\r\n },\r\n displayAdPreviewExampleSecondaryTitle: {\r\n id: 'tython.adunit.create.type.display.preview.secondary.title',\r\n defaultMessage: 'Example 2',\r\n },\r\n displayAdPreviewExampleTertiaryTitle: {\r\n id: 'tython.adunit.create.type.display.preview.tertiary.title',\r\n defaultMessage: 'Example 3',\r\n },\r\n nativeAdPreviewPreviewTitle: {\r\n id: 'tython.adunit.create.type.native.preview.title',\r\n defaultMessage: 'Flowers for all occasions',\r\n },\r\n nativeAdPreviewPreviewUrl: {\r\n id: 'tython.adunit.create.type.native.preview.url',\r\n defaultMessage: 'example.com',\r\n },\r\n createAdUnitSuccessNotification: {\r\n id: 'tython.adunit.create.success.notification',\r\n defaultMessage: 'Created new adunit {adunitId} success',\r\n },\r\n editAdUnitSuccessNotification: {\r\n id: 'tython.adunit.edit.success.notification',\r\n defaultMessage: 'Updated adunit {adunitId} success',\r\n },\r\n duplicatedSiteCreationErrorToastNotification: {\r\n id: 'tython.adunit.create.duplicated.site.error.toast.notification',\r\n defaultMessage: 'Invalid site creation, duplicated name or url',\r\n },\r\n failedLoadAdUnitNotification: {\r\n id: 'tython.adunit.load.failed.notification',\r\n defaultMessage: 'We’re unable to load your ad unit. Please try again later.',\r\n },\r\n displayAdHorizontal: {\r\n id: 'tython.adunit.display.horizontal',\r\n defaultMessage: 'Horizontal',\r\n },\r\n displayAdSqaure: {\r\n id: 'tython.adunit.display.square',\r\n defaultMessage: 'Square',\r\n },\r\n displayAdVertical: {\r\n id: 'tython.adunit.display.vertical',\r\n defaultMessage: 'Vertical',\r\n },\r\n settingUpAdunitMediationSuccess: {\r\n id: 'tython.adunit.settingUpAdunitMediationSuccess',\r\n defaultMessage: 'Setting up adunit mediation completed successfully',\r\n },\r\n removingAdunitMediationSuccess: {\r\n id: 'tython.adunit.removingAdunitMediationSuccess',\r\n defaultMessage: 'Removing adunit mediation completed successfully',\r\n },\r\n updateAdunitFailed: {\r\n id: 'tython.adunit.updateAdunitFailed',\r\n defaultMessage: 'Update ad unit failed, please try again later.',\r\n },\r\n loadTythonAdunitFailed: {\r\n id: 'tython.adunit.loadTythonAdunitFailed',\r\n defaultMessage: 'Load ad units failed, please try again later.',\r\n },\r\n settingUpAdunitMediationFailed: {\r\n id: 'tython.adunit.settingUpAdunitMediationFailed',\r\n defaultMessage: 'Setting up adunit mediation failed',\r\n },\r\n removingAdunitMediationFailed: {\r\n id: 'tython.adunit.removingAdunitMediationFailed',\r\n defaultMessage: 'Removing adunit mediation failed',\r\n },\r\n createPropertyFromAdunitFailed: {\r\n id: 'tython.adunit.createPropertyFromAdunitFailed',\r\n defaultMessage: 'Create properties failed, please try again later.',\r\n },\r\n createSitePanelAccessibilityAnnouncement: {\r\n id: 'tython.adunit.createSitePanelAccessibilityAnnouncement',\r\n defaultMessage: 'at Dialog - Create site panel',\r\n },\r\n panelCloseButtonAriaLabel: {\r\n id: 'tython.adunit.panelCloseButtonAriaLabel',\r\n defaultMessage: 'Close',\r\n },\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { action } from 'mobx';\r\nimport {\r\n Account,\r\n AdUnit,\r\n deleteEntity,\r\n LifeCycleStatus,\r\n listEntity,\r\n onNotificationChanged,\r\n postEntity,\r\n Publisher,\r\n putEntity,\r\n showSuccessToastNotification,\r\n TythonAdUnit,\r\n UserContext,\r\n} from '../../../../../@data';\r\nimport {\r\n AdSenseAdUnitStatus,\r\n AdSenseConnectAdUnit,\r\n AdSenseDisconnectAdUnit,\r\n AdSenseUpdateAdUnitStatus,\r\n} from '../../../../../@data/store/schema/models/AdSenseAdUnitStatus';\r\nimport messages from '../../TythonAdunit/CreateAdunit/messages';\r\nimport { onAdunitMediationUpdateEnd, onAdunitMediationUpdateStart } from '../actions';\r\nimport { onAdSenseMediationChanged, setAdUnitsData } from '../mutatorActions';\r\nimport { getAdunitStore } from '../store/store';\r\n\r\nexport const fetchAdunitById = async (publisher: Publisher, id: string, userContext?: UserContext): Promise<AdUnit> => {\r\n const list = await listEntity(\r\n [publisher],\r\n userContext,\r\n AdUnit,\r\n new URLSearchParams([\r\n ['type', 'Search'],\r\n ['ids', id],\r\n ['details', 'true'],\r\n ])\r\n );\r\n\r\n if (!list || !list.length) {\r\n throw Error('Cannot find adunit Id');\r\n }\r\n\r\n return list[0];\r\n};\r\n\r\nexport const fetchAdunitMediationStatus = async (publisher: Publisher, account: Account, id: string): Promise<AdSenseAdUnitStatus[]> => {\r\n const urlParams = new URLSearchParams();\r\n urlParams.append('routeSuffix', 'api/mediation/admanager/getAdUnitMediationStatus');\r\n const request: AdSenseAdUnitStatus = {\r\n apiPath: 'preauth/mediation',\r\n className: 'getAdUnitMediationStatus',\r\n pubcenterAdUnitIds: [Number.parseInt(id, 10)],\r\n };\r\n\r\n const adUnitNotConnectedStatus: AdSenseAdUnitStatus = {\r\n apiPath: 'preauth/mediation',\r\n className: 'getAdUnitMediationStatus',\r\n mediationStatus: false,\r\n };\r\n\r\n try {\r\n // Set the type as any because the PUT operation in ApiService only\r\n // returns singular item and this request for AdUnits mediation status returns array\r\n // TODO: this call shouldn't be put call\r\n // TODO: put operation should support array of objects as a response\r\n // tslint:disable-next-line: no-any\r\n const response = (await putEntity([], request, undefined, AdSenseAdUnitStatus, urlParams)) as any;\r\n\r\n if (!response) {\r\n return [adUnitNotConnectedStatus];\r\n }\r\n\r\n return response;\r\n } catch {\r\n return [adUnitNotConnectedStatus];\r\n }\r\n};\r\n\r\nexport const updateAdUnitGrid = (id: number, isMediated: boolean, shouldAvoidAdUnitViewState?: boolean) => {\r\n const adUnitsRawData = getAdunitStore().adUnitsRaw.data;\r\n const adunit = adUnitsRawData?.find((adUnit) => adUnit.id === id);\r\n\r\n !shouldAvoidAdUnitViewState && onAdSenseMediationChanged(isMediated);\r\n if (adunit?.id) {\r\n action(() => {\r\n adunit!.mediatedWithAdSense = {\r\n apiPath: 'preauth/mediation',\r\n className: 'getAdUnitMediationStatus',\r\n mediationStatus: isMediated,\r\n };\r\n })();\r\n const data = adUnitsRawData!.map((adUnit) => (adUnit.id === adunit?.id ? adunit! : adUnit));\r\n setAdUnitsData(data);\r\n }\r\n};\r\n\r\nexport const enableAdunitMediationStatus = async (publisher: Publisher, account: Account, ids: number[]): Promise<AdSenseAdUnitStatus> => {\r\n const request: AdSenseConnectAdUnit = {\r\n apiPath: 'preauth/mediation',\r\n className: 'pubcenterAdUnitsIds',\r\n pubcenterAdUnitIds: ids,\r\n };\r\n\r\n const urlParamsConnect = new URLSearchParams();\r\n urlParamsConnect.append('routeSuffix', 'api/mediation/admanager/setupAdUnitMediation');\r\n\r\n const adUnitNotConnectedStatus: AdSenseAdUnitStatus = {\r\n apiPath: 'preauth/mediation',\r\n className: 'getAdUnitMediationStatus',\r\n mediationStatus: false,\r\n };\r\n const urlParamsNotConnected = new URLSearchParams();\r\n urlParamsNotConnected.append('routeSuffix', 'api/mediation/admanager/getAdUnitMediationStatus');\r\n\r\n onAdunitMediationUpdateStart(ids);\r\n\r\n try {\r\n const response = (await postEntity([], AdSenseConnectAdUnit, request, undefined, urlParamsConnect, undefined)) as AdSenseConnectAdUnit;\r\n onAdunitMediationUpdateEnd(ids);\r\n\r\n if (!response) {\r\n onNotificationChanged({ messageBarType: MessageBarType.error, textMessageDescriptor: messages.settingUpAdunitMediationFailed });\r\n return adUnitNotConnectedStatus;\r\n } else {\r\n showSuccessToastNotification({ textMessageDescriptor: messages.settingUpAdunitMediationSuccess });\r\n updateAdUnitGrid(ids[0], true);\r\n }\r\n\r\n return response;\r\n } catch {\r\n onAdunitMediationUpdateEnd(ids);\r\n\r\n return adUnitNotConnectedStatus;\r\n }\r\n};\r\n\r\nexport const disableAdunitMediationStatus = async (\r\n publisher: Publisher,\r\n account: Account,\r\n ids: number[]\r\n): Promise<AdSenseAdUnitStatus[]> => {\r\n const request: AdSenseDisconnectAdUnit = {\r\n apiPath: 'preauth/mediation',\r\n className: 'pubcenterAdUnitsIds',\r\n pubcenterAdUnitIds: ids,\r\n };\r\n\r\n try {\r\n onAdunitMediationUpdateStart(ids);\r\n const urlParams = new URLSearchParams();\r\n urlParams.append('routeSuffix', 'api/mediation/admanager/decommissionAdUnitMediation');\r\n const list = (await deleteEntity([], AdSenseDisconnectAdUnit, undefined, urlParams, undefined, request)) as AdSenseDisconnectAdUnit[];\r\n onAdunitMediationUpdateEnd(ids);\r\n if (!list || !list.length) {\r\n onNotificationChanged({ messageBarType: MessageBarType.error, textMessageDescriptor: messages.removingAdunitMediationFailed });\r\n return [];\r\n } else {\r\n showSuccessToastNotification({ textMessageDescriptor: messages.removingAdunitMediationSuccess });\r\n updateAdUnitGrid(ids[0], false);\r\n }\r\n\r\n return list;\r\n } catch {\r\n onAdunitMediationUpdateEnd(ids);\r\n\r\n return [];\r\n }\r\n};\r\n\r\nexport const updateAdunitMediationStatus = async (\r\n publisher: Publisher,\r\n account: Account,\r\n adunits: (AdUnit | TythonAdUnit)[],\r\n state: LifeCycleStatus\r\n): Promise<AdSenseAdUnitStatus> => {\r\n const operation = state === LifeCycleStatus.Active ? 'true' : 'false';\r\n\r\n const adUnitOriginalStatus: AdSenseAdUnitStatus = {\r\n apiPath: 'preauth/mediation',\r\n className: 'getAdUnitMediationStatus',\r\n mediationStatus: false,\r\n };\r\n\r\n const request: AdSenseUpdateAdUnitStatus = {\r\n apiPath: 'preauth/mediation',\r\n className: 'pubcenterAdUnitsIds',\r\n pubcenterAdUnitIds: adunits.map((adunit) => adunit.id),\r\n };\r\n\r\n try {\r\n const params = new URLSearchParams();\r\n params.append('routeSuffix', `api/mediation/admanager/adunits/updateStatus?activate=${operation}`);\r\n const response = await putEntity([], request, undefined, AdSenseUpdateAdUnitStatus, params, undefined);\r\n\r\n if (!response) {\r\n return adUnitOriginalStatus;\r\n }\r\n\r\n return response;\r\n } catch {\r\n return adUnitOriginalStatus;\r\n }\r\n};\r\n","import { IDropdownOption } from '@fluentui/react';\r\nimport { AdUnit, isTythonSelfServeUser } from '../../../../../@data';\r\nimport AppMessages from '../../../../../App.messages';\r\nimport { FilterType, IFilterDetails } from '../../../../../components/GridFilter/GridFilter.types';\r\nimport { IFilterItem } from '../../../../../layout/GridPageV2';\r\nimport messages from '../ManagePage.messages';\r\n\r\nexport function getFilterItems(formatMessage, isAppItems = false): IFilterItem[] {\r\n const nonTythonFilters: IFilterItem[] = [\r\n { columnName: 'id', filterName: formatMessage(messages.id), filterType: FilterType.relational },\r\n {\r\n columnName: 'status',\r\n filterName: formatMessage(AppMessages.status),\r\n filterType: FilterType.custom,\r\n filterOptions: [\r\n { key: 'Active', text: formatMessage(AppMessages.statusActive) },\r\n { key: 'Inactive', text: formatMessage(AppMessages.statusInactive) },\r\n ] as IDropdownOption[],\r\n },\r\n { columnName: 'propertyUrl', filterName: formatMessage(messages.propertyUrl), filterType: FilterType.string },\r\n {\r\n columnName: 'propertyId',\r\n filterName: formatMessage(messages.propertyId),\r\n filterType: FilterType.relational,\r\n },\r\n { columnName: 'creationDate', filterName: formatMessage(messages.adUnitCreationDate), filterType: FilterType.date },\r\n { columnName: 'taxonomy', filterName: formatMessage(messages.businessModel), filterType: FilterType.string },\r\n {\r\n columnName: 'marketClassification',\r\n filterName: formatMessage(messages.marketClassification),\r\n filterType: FilterType.custom,\r\n filterOptions: [\r\n { key: 'OwnedAndOperatedCore', text: formatMessage(messages.ownedAndOperatedCore) },\r\n { key: 'OwnedAndOperated', text: formatMessage(messages.ownedAndOperated) },\r\n { key: 'Syndicated', text: formatMessage(messages.syndicated) },\r\n { key: 'Sponsored', text: formatMessage(messages.sponsored) },\r\n { key: 'SponsoredEnhanced', text: formatMessage(messages.sponsoredEnhanced) },\r\n ] as IDropdownOption[],\r\n },\r\n ];\r\n\r\n let tythonFilters: IFilterItem[] = [\r\n { columnName: 'id', filterName: formatMessage(messages.id), filterType: FilterType.relational },\r\n { columnName: 'name', filterName: formatMessage(messages.name), filterType: FilterType.string },\r\n {\r\n columnName: 'status',\r\n filterName: formatMessage(AppMessages.status),\r\n filterType: FilterType.custom,\r\n filterOptions: [\r\n { key: 'Active', text: formatMessage(AppMessages.statusActive) },\r\n { key: 'Inactive', text: formatMessage(AppMessages.statusInactive) },\r\n ] as IDropdownOption[],\r\n },\r\n { columnName: 'propertyUrl', filterName: formatMessage(messages.propertyUrl), filterType: FilterType.string },\r\n {\r\n columnName: 'mediatedWithAdSense',\r\n filterName: formatMessage(messages.higherMonetization),\r\n filterType: FilterType.custom,\r\n filterOptions: [\r\n { key: 'true', text: formatMessage(AppMessages.on) },\r\n { key: 'false', text: formatMessage(AppMessages.off) },\r\n ] as IDropdownOption[],\r\n customFunction: (dataRow: AdUnit, filterDetails: IFilterDetails) => {\r\n if (dataRow.mediatedWithAdSense.mediationStatus?.toString() === filterDetails.filterCondition) {\r\n return true;\r\n }\r\n return false;\r\n },\r\n },\r\n ];\r\n\r\n if (isAppItems) {\r\n tythonFilters = tythonFilters.filter((f) => !['mediatedWithAdSense', 'propertyUrl'].includes(f.columnName!));\r\n }\r\n\r\n return isTythonSelfServeUser() ? tythonFilters : nonTythonFilters;\r\n}\r\n","import { PrimaryButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { AdUnit, Model, getAccessPermission, getAppStore, isTythonSelfServeUser } from '../../../../../@data';\r\nimport { hasCreateAccess } from '../../../../../@data/services/UserRoleService';\r\nimport {\r\n CommandBarActions,\r\n Direction,\r\n GridSelectionMode,\r\n IBuildCommandBarProps,\r\n IGridPageCommandBarItemProps,\r\n} from '../../../../../layout/GridPageV2';\r\nimport { getTythonAdUnitCreatePageRoute } from '../../../../../utils/routeUtils';\r\nimport { getAdunitStore } from '../../@data';\r\nimport { updateAdUnitMediationStatus } from '../../@data/actions';\r\nimport { disableAdunitMediationStatus } from '../../@data/services/AdunitService';\r\nimport messages from '../ManagePage.messages';\r\nimport { getFilterItems } from './getFilterItems';\r\n\r\nexport function getCommandBarItems(formatMessage, history, match, isWindowExtraSmallSize): IBuildCommandBarProps<Model> | undefined {\r\n const { publisher, account } = getAppStore();\r\n const {\r\n adUnitsRaw: { data, isLoading },\r\n mediationUpdatePool,\r\n } = getAdunitStore();\r\n\r\n const nonTythonItems: IBuildCommandBarProps<Model> | undefined =\r\n (data && data.length !== 0 && publisher && account) || isLoading\r\n ? {\r\n includeActions: [CommandBarActions.custom],\r\n includeFarActions: [\r\n CommandBarActions.searchBox,\r\n CommandBarActions.addFilter,\r\n CommandBarActions.edit,\r\n CommandBarActions.activate,\r\n CommandBarActions.deactivate,\r\n CommandBarActions.delete,\r\n CommandBarActions.download,\r\n CommandBarActions.modifyColumns,\r\n CommandBarActions.duplicate,\r\n CommandBarActions.export,\r\n CommandBarActions.upload,\r\n ],\r\n getCustomCommandBarItems: () => {\r\n const accessPermission = getAccessPermission(AdUnit);\r\n\r\n const commandBarItems: IGridPageCommandBarItemProps[] = [\r\n {\r\n key: 'new',\r\n placement: { direction: Direction.before },\r\n commandBarButtonAs: () => (\r\n <PrimaryButton\r\n iconProps={{ iconName: 'Add' }}\r\n text={isWindowExtraSmallSize ? '' : formatMessage(messages.create)}\r\n onClick={() => {\r\n history.push(`${match.url}/create`);\r\n }}\r\n disabled={\r\n (data === undefined && publisher === undefined && account === undefined) ||\r\n account?.id === 0 ||\r\n isLoading ||\r\n !hasCreateAccess(accessPermission)\r\n }\r\n />\r\n ),\r\n selectionModes: [GridSelectionMode.None],\r\n },\r\n ];\r\n\r\n return commandBarItems;\r\n },\r\n filterItems: getFilterItems(formatMessage),\r\n }\r\n : undefined;\r\n\r\n const tythonItems: IBuildCommandBarProps<Model> | undefined =\r\n (data && data.length !== 0) || isLoading\r\n ? {\r\n primaryButtonUrl: getTythonAdUnitCreatePageRoute(),\r\n primaryButtonLabel: messages.create,\r\n includeActions: [CommandBarActions.new],\r\n includeFarActions: [\r\n CommandBarActions.searchBox,\r\n CommandBarActions.addFilter,\r\n CommandBarActions.edit,\r\n CommandBarActions.activate,\r\n CommandBarActions.deactivate,\r\n CommandBarActions.code,\r\n CommandBarActions.delete,\r\n CommandBarActions.download,\r\n CommandBarActions.modifyColumns,\r\n ].filter((item) =>\r\n mediationUpdatePool.length\r\n ? ![CommandBarActions.edit, CommandBarActions.deactivate, CommandBarActions.delete].includes(item)\r\n : item\r\n ),\r\n onPreDeleteItems: async (items: Model[]) => {\r\n const deletedItem = items[0] as AdUnit;\r\n if (publisher && account && deletedItem && deletedItem?.mediatedWithAdSense?.mediationStatus === true) {\r\n await disableAdunitMediationStatus(publisher, account, [deletedItem.id]);\r\n }\r\n },\r\n onItemsStatusChanged: (adunits, status) => updateAdUnitMediationStatus(adunits as AdUnit[], status),\r\n filterItems: getFilterItems(formatMessage),\r\n }\r\n : undefined;\r\n\r\n return isTythonSelfServeUser() ? tythonItems : nonTythonItems;\r\n}\r\n","import { DirectionalHint, HoverCard, HoverCardType, ICalloutProps, Icon } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { getClassNames } from '../GridV2.styles';\r\n\r\ninterface IHeaderInfoCalloutProps {\r\n placement?: DirectionalHint;\r\n calloutContent: JSX.Element | null;\r\n width?: number;\r\n hoverCardStyles?: React.CSSProperties;\r\n calloutProps?: ICalloutProps;\r\n}\r\n\r\nexport const HeaderInfoCallout = (headerInfo: IHeaderInfoCalloutProps) => {\r\n const {\r\n placement = DirectionalHint.bottomCenter,\r\n calloutContent,\r\n width = 490,\r\n hoverCardStyles = { width: width, padding: '18px' },\r\n calloutProps = {\r\n isBeakVisible: true,\r\n },\r\n } = headerInfo;\r\n const { columnHeaderCallout, columnHeaderIcon } = getClassNames();\r\n\r\n return (props, defaultRender) => {\r\n if (!defaultRender || !props) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className={columnHeaderCallout}>\r\n {defaultRender?.(props)}\r\n\r\n <HoverCard\r\n style={hoverCardStyles}\r\n plainCardProps={{\r\n directionalHint: placement,\r\n calloutProps: calloutProps,\r\n onRenderPlainCard: () => calloutContent,\r\n }}\r\n type={HoverCardType.plain}\r\n sticky={true}\r\n >\r\n <Icon className={columnHeaderIcon} title=\"clarityTourIcon\" iconName={'info'} />\r\n </HoverCard>\r\n </div>\r\n );\r\n };\r\n};\r\n","import { classNamesFunction } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../../../theme';\r\nimport { IManagePageStyleProps, IManagePageStyles } from './ManagePage.types';\r\n\r\nexport const getStyles = (props: IManagePageStyleProps): IManagePageStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { fonts, spacing, palette } = theme;\r\n\r\n return {\r\n gridContainer: {\r\n marginLeft: spacing.size32,\r\n marginTop: spacing.size32,\r\n marginRight: spacing.size32,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: 'inherit',\r\n flex: 1,\r\n },\r\n loadingGrid: {\r\n margin: 'auto',\r\n },\r\n title: {\r\n ...fonts.size20,\r\n },\r\n hoverCardHost: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n actionButtonsContainer: {\r\n display: 'flex',\r\n gap: '12px',\r\n height: '100%',\r\n },\r\n monetizationUnderline: {\r\n borderBottom: `1px dotted ${palette.themePrimary}`,\r\n width: 'fit-content',\r\n '&:focus, &:hover': {\r\n textDecoration: 'underline',\r\n display: 'block',\r\n border: '1px solid #A9A9A9',\r\n },\r\n },\r\n mediationHelpIcon: {\r\n color: palette.themePrimary,\r\n padding: `0px ${spacing.size8} px`,\r\n cursor: 'pointer',\r\n },\r\n onBoardingMsg: {\r\n background: palette.themeLighterAlt,\r\n },\r\n };\r\n};\r\n\r\nexport const getClassNames = classNamesFunction<IManagePageStyleProps, IManagePageStyles>();\r\n","import {\r\n CommandBarButton,\r\n DirectionalHint,\r\n HoverCard,\r\n HoverCardType,\r\n IContextualMenuItem,\r\n IProcessedStyleSet,\r\n Link,\r\n Shimmer,\r\n getTheme,\r\n} from '@fluentui/react';\r\nimport React from 'react';\r\nimport {\r\n AdUnit,\r\n LifeCycleStatus,\r\n PopupType,\r\n ServingStatus,\r\n ServingStatusLabel,\r\n getAccessPermission,\r\n getAppStore,\r\n isTythonSelfServeUser,\r\n} from '../../../../../@data';\r\nimport { hasDeleteAccess, hasUpdateAccess } from '../../../../../@data/services/UserRoleService';\r\nimport AppMessages from '../../../../../App.messages';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { IGridV2Column } from '../../../../../layout/GridPageV2';\r\nimport { setDialogType } from '../../../../../layout/GridPageV2/@data/mutatorActions';\r\nimport { HeaderInfoCallout } from '../../../../../layout/GridPageV2/components/HeaderInfoCallout';\r\nimport { RouteName } from '../../../@data';\r\nimport { createReturnUrl } from '../../../@data/services/AdManagementService';\r\nimport { getGoogleAdSenseStore } from '../../../Account/Settings/components/GoogleConnector/@data';\r\nimport adManagementMessages from '../../../AdManagement.messages';\r\nimport { getGridPropertyStore } from '../../../Property/Manage/__data__/store/store';\r\nimport { getAdunitStore, isPartnerCodeEnabled } from '../../@data';\r\nimport { onPanelOpenChanged } from '../../@data/actions';\r\nimport messages from '../ManagePage.messages';\r\nimport { getClassNames, getStyles } from '../ManagePage.styles';\r\nimport { IManagePageStyles } from '../ManagePage.types';\r\n\r\nlet FormatMessage;\r\nlet Styles: IProcessedStyleSet<IManagePageStyles>;\r\nlet History;\r\n\r\nconst editRouter = (item: AdUnit, step?: number, showExtraBtns?: boolean) => {\r\n const { publisher, account } = getAppStore();\r\n const returnUrl = createReturnUrl(RouteName.adunit, publisher!.id, account!.id, item.id, FormState.MultiStepEdit, step, showExtraBtns);\r\n History.push(returnUrl);\r\n};\r\n\r\nconst getCallOutContent = (item: AdUnit): JSX.Element => {\r\n const isMediated = item?.mediatedWithAdSense?.mediationStatus;\r\n const header = isMediated ? messages.mediationCardConnectedHeader : messages.mediationCardNoConnectionHeader;\r\n const description = isMediated ? messages.mediationCardConnectedDesc : messages.mediationCardNoConnectionDesc;\r\n const callToActionLabel = isMediated ? messages.mediationCardConnectedC2A : messages.mediationCardNoConnectionC2A;\r\n\r\n return (\r\n <>\r\n <h3 className={Styles.title}>{FormatMessage(header)}</h3>\r\n <p>{FormatMessage(description)}</p>\r\n <Link onClick={() => editRouter(item, 0, true)}>{FormatMessage(callToActionLabel)}</Link>\r\n </>\r\n );\r\n};\r\n\r\nconst getServingStatusLabel = (servingStatus: ServingStatus, formatMessage) => {\r\n const servingStatusType = Object.keys(ServingStatus)[Object.values(ServingStatus).indexOf(servingStatus)];\r\n return servingStatusType ? formatMessage(adManagementMessages[ServingStatusLabel[servingStatusType]]) : '';\r\n};\r\n\r\nexport function getGridColumns(\r\n formatMessage,\r\n routeHistory,\r\n isWindowRegularSize,\r\n setAdUnitCallout,\r\n isFetchingAdUnitStatus,\r\n isFetchingPropertyStatus,\r\n propertyServingConfigs\r\n): IGridV2Column[] {\r\n FormatMessage = formatMessage;\r\n History = routeHistory;\r\n\r\n const { publisher, account } = getAppStore();\r\n const classNames = getClassNames(getStyles, { theme: getTheme() });\r\n const isAdSenseConnected = getGoogleAdSenseStore().active.isMediationEnabled;\r\n Styles = classNames;\r\n\r\n const commonColumns: IGridV2Column[] = [\r\n {\r\n columnOrder: 2,\r\n key: 'name',\r\n fieldName: 'name',\r\n name: formatMessage(messages.name),\r\n minWidth: 100,\r\n maxWidth: 125,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n suppressSorting: false,\r\n },\r\n {\r\n columnOrder: 3,\r\n key: 'id',\r\n fieldName: 'id',\r\n name: formatMessage(messages.id),\r\n minWidth: 100,\r\n maxWidth: 100,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n },\r\n {\r\n columnOrder: 4,\r\n key: 'status',\r\n name: formatMessage(messages.servingStatus),\r\n minWidth: 100,\r\n maxWidth: 100,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n onRender: (item: AdUnit) => {\r\n if (isTythonSelfServeUser()) {\r\n if (item.status === LifeCycleStatus.Inactive) {\r\n return getServingStatusLabel(ServingStatus.NotServing, formatMessage);\r\n }\r\n\r\n const servingStatus = getGridPropertyStore()?.servingConfigs?.find((config) => item.propertyId === config.propertyId)\r\n ?.servingStatus;\r\n\r\n return getGridPropertyStore().isFetchingPropertyStatus && servingStatus === undefined ? (\r\n <Shimmer styles={{ root: { display: 'flex', alignItems: 'center', height: '100%' }, shimmerWrapper: { height: '7px' } }} />\r\n ) : (\r\n getServingStatusLabel(ServingStatus[servingStatus!], formatMessage)\r\n );\r\n } else {\r\n return item.status;\r\n }\r\n },\r\n },\r\n {\r\n columnOrder: 5,\r\n key: 'propertyUrl',\r\n fieldName: 'propertyUrl',\r\n name: formatMessage(messages.propertyUrl),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 7,\r\n key: 'creationDate',\r\n fieldName: 'creationDate',\r\n name: formatMessage(messages.adUnitCreationDate),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 10,\r\n key: 'actions',\r\n name: formatMessage(messages.actions),\r\n minWidth: 220,\r\n maxWidth: 220,\r\n isPadded: true,\r\n isSearchable: true,\r\n isVisible: true,\r\n suppressSorting: true,\r\n onRender: (item: AdUnit) => {\r\n const accessPermission = getAccessPermission(item);\r\n\r\n const nonTythonEditAdUnitOptions: IContextualMenuItem[] = [\r\n {\r\n key: 'name',\r\n text: formatMessage(messages.changeName),\r\n onClick: () => setAdUnitCallout(item.id),\r\n },\r\n ];\r\n\r\n const editAdUnitOptions = isTythonSelfServeUser() ? undefined : { items: nonTythonEditAdUnitOptions };\r\n\r\n const editButtonOnClick = isTythonSelfServeUser()\r\n ? () => History.push(createReturnUrl(RouteName.adunit, publisher?.id, account?.id, item.id, FormState.Edit))\r\n : undefined;\r\n\r\n return (\r\n <div className={classNames.actionButtonsContainer}>\r\n <CommandBarButton\r\n id={`adunitCallout-${item.id}`}\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'edit' }}\r\n ariaLabel={formatMessage(AppMessages.edit)}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.edit) : ''}\r\n menuProps={editAdUnitOptions}\r\n disabled={!hasUpdateAccess(accessPermission) || getAdunitStore().mediationUpdatePool.includes(item.id)}\r\n onClick={editButtonOnClick}\r\n />\r\n {isTythonSelfServeUser() && item.propertyId !== undefined && (\r\n <CommandBarButton\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'PasteAsCode' }}\r\n ariaLabel={formatMessage(AppMessages.code)}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.code) : ''}\r\n onClick={() => onPanelOpenChanged(true, item.propertyId, item.id)}\r\n />\r\n )}\r\n <CommandBarButton\r\n data-test-id={`grid-delete-action-${item.id}`}\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'Delete' }}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.delete) : ''}\r\n onClick={() => setDialogType(PopupType.DeleteConfirmation)}\r\n disabled={!hasDeleteAccess(accessPermission) || getAdunitStore().mediationUpdatePool.includes(item.id)}\r\n />\r\n </div>\r\n );\r\n },\r\n },\r\n ];\r\n\r\n const tythonColumns: IGridV2Column[] = [\r\n {\r\n columnOrder: 9,\r\n key: 'monetization',\r\n fieldName: 'monetization',\r\n name: formatMessage(messages.higherMonetization),\r\n minWidth: 175,\r\n maxWidth: 175,\r\n suppressSorting: true,\r\n isSearchable: true,\r\n isVisible: isAdSenseConnected,\r\n isShowingDisabled: !isAdSenseConnected,\r\n onRenderHeader: HeaderInfoCallout({\r\n calloutContent: (\r\n <div>\r\n <span className={classNames.title}>{formatMessage(messages.mediationCardNoConnectionHeader)}</span>\r\n <p>{formatMessage(messages.mediationCardNoConnectionDesc)}</p>\r\n </div>\r\n ),\r\n }),\r\n onRender: (item: AdUnit) => {\r\n return getAdunitStore().isFetchingAdUnitStatus && item.mediatedWithAdSense === undefined ? (\r\n <Shimmer styles={{ root: { display: 'flex', alignItems: 'center', height: '100%' }, shimmerWrapper: { height: '7px' } }} />\r\n ) : (\r\n <HoverCard\r\n style={{\r\n width: 360,\r\n padding: '0px 15px 20px 15px',\r\n }}\r\n plainCardProps={{\r\n directionalHint: DirectionalHint.leftTopEdge,\r\n calloutProps: {\r\n isBeakVisible: true,\r\n },\r\n onRenderPlainCard: () => getCallOutContent(item),\r\n }}\r\n instantOpenOnClick\r\n type={HoverCardType.plain}\r\n hidden={getAdunitStore().mediationUpdatePool.includes(item.id)}\r\n trapFocus\r\n setInitialFocus\r\n tabIndex={0}\r\n className={classNames.monetizationUnderline}\r\n >\r\n <div className={classNames.monetizationUnderline} tabIndex={0}>\r\n {getAdunitStore().mediationUpdatePool.includes(item.id)\r\n ? formatMessage(messages.pending)\r\n : item?.mediatedWithAdSense?.mediationStatus\r\n ? formatMessage(messages.higherMonetizationEnabled)\r\n : formatMessage(messages.higherMonetizationNotSetup)}\r\n </div>\r\n </HoverCard>\r\n );\r\n },\r\n },\r\n ];\r\n\r\n const nonTythonColumns: IGridV2Column[] = [\r\n {\r\n columnOrder: 0,\r\n key: 'accountName',\r\n fieldName: 'accountName',\r\n name: formatMessage(messages.accountName),\r\n minWidth: 100,\r\n maxWidth: 100,\r\n isVisible: false,\r\n isExportable: true,\r\n isResizable: true,\r\n isSearchable: true,\r\n },\r\n {\r\n columnOrder: 1,\r\n key: 'accountId',\r\n fieldName: 'accountId',\r\n name: formatMessage(messages.accountId),\r\n minWidth: 100,\r\n maxWidth: 100,\r\n isVisible: false,\r\n isExportable: true,\r\n isResizable: true,\r\n isSearchable: true,\r\n },\r\n {\r\n columnOrder: 6,\r\n key: 'propertyId',\r\n fieldName: 'propertyId',\r\n name: formatMessage(messages.propertyId),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: false,\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 4.5,\r\n key: 'partnerCodes',\r\n fieldName: 'partnerCodes',\r\n name: formatMessage(AppMessages.partnerCodes),\r\n minWidth: 100,\r\n maxWidth: 150,\r\n isVisible: isPartnerCodeEnabled(publisher?.id.toString()),\r\n isExportable: true,\r\n isResizable: true,\r\n isSearchable: true,\r\n onRender: (item: AdUnit) => {\r\n if (Array.isArray(item.partnerCodes)) {\r\n return item.partnerCodes.join(', ');\r\n } else {\r\n return item.partnerCodes;\r\n }\r\n },\r\n },\r\n {\r\n columnOrder: 8,\r\n key: 'taxonomy',\r\n fieldName: 'taxonomy',\r\n name: formatMessage(messages.businessModel),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: false,\r\n isExportable: true,\r\n },\r\n ];\r\n\r\n return [...commonColumns, ...(isTythonSelfServeUser() ? tythonColumns : nonTythonColumns)];\r\n}\r\n","import * as React from 'react';\r\nimport { useEffect, useState } from 'react';\r\nimport { AdUnit, InventoryPlatformType, getAppStore } from '../../../../@data';\r\nimport { isTythonSelfServeUser } from '../../../../@data/utils/checkUserType';\r\nimport { FormState } from '../../../../components/Form';\r\nimport { ZeroResults } from '../../../../components/ZeroResults/ZeroResults';\r\nimport { useWindowSize } from '../../../../hooks';\r\nimport { getStore as getWindowSizeStore } from '../../../../hooks/useWindowSize/store/store';\r\nimport { GridPageLayout } from '../../../../layout/GridPageLayout/GridPageLayout';\r\nimport { IGridV2Column } from '../../../../layout/GridPageV2';\r\nimport { GridV2 } from '../../../../layout/GridPageV2/GridV2';\r\nimport { IRouterWithIntl, injectIntlAndObserver } from '../../../../utils/ReactUtils';\r\nimport { RouteName } from '../../@data';\r\nimport { createReturnUrl } from '../../@data/services/AdManagementService';\r\nimport { getGridPropertyStore } from '../../Property/Manage/__data__/store/store';\r\nimport { getAdunitStore } from '../@data';\r\nimport { onManagePageInitialized } from '../@data/actions/onManagePageInitialized';\r\nimport { setAdUnitsData } from '../@data/mutatorActions';\r\nimport messages from './ManagePage.messages';\r\nimport { AdUnitCallout } from './components/AdUnitNameCallout/AdUnitNameCallout';\r\nimport { CodePanel } from './components/CodePanel/CodePanel';\r\nimport { getCommandBarItems } from './utils/getCommandBarItems';\r\nimport { getGridColumns } from './utils/getGridColumns';\r\n\r\nexport interface IManagePageProps extends IRouterWithIntl {\r\n withParentLayout?: boolean;\r\n abortDataFetch?: boolean;\r\n}\r\n\r\nconst { windowStoreSerializer } = useWindowSize();\r\n\r\nexport const ManagePage = injectIntlAndObserver((props: IManagePageProps) => {\r\n const { history, match, withParentLayout, abortDataFetch } = props;\r\n const tythonUser = isTythonSelfServeUser();\r\n const { publisher, account } = getAppStore();\r\n const { adUnitsRaw } = getAdunitStore();\r\n const { formatMessage } = props.intl;\r\n const { isWindowRegularSize, isWindowExtraSmallSize } = windowStoreSerializer(getWindowSizeStore());\r\n const [visibleCallOut, setVisibleCallOut] = useState<number>(0);\r\n const gridDefaultColumns: IGridV2Column[] = getGridColumns(\r\n formatMessage,\r\n history,\r\n isWindowRegularSize,\r\n setVisibleCallOut,\r\n getAdunitStore().isFetchingAdUnitStatus,\r\n getGridPropertyStore().isFetchingPropertyStatus,\r\n undefined // Added this for tython manage page that will enable in future\r\n );\r\n\r\n const NoResultComponent = (\r\n <ZeroResults\r\n showDefaultImage\r\n title={tythonUser || (!tythonUser && !!publisher && !!account) ? formatMessage(messages.zeroAdUnitsTitle) : undefined}\r\n description={formatMessage(\r\n tythonUser || (!tythonUser && publisher && account) ? messages.zeroAdUnitsDescription : messages.noPublisherSelected\r\n )}\r\n buttonText={formatMessage(messages.zeroAdUnitsCallToAction)}\r\n onButtonClick={\r\n tythonUser || (!tythonUser && !!publisher && !!account)\r\n ? () => {\r\n const returnUrl = createReturnUrl(\r\n RouteName.adunit,\r\n publisher!.id,\r\n account!.id,\r\n undefined,\r\n isTythonSelfServeUser() ? FormState.MultiStepCreation : FormState.Create\r\n );\r\n history.push(returnUrl);\r\n }\r\n : undefined\r\n }\r\n />\r\n );\r\n\r\n useEffect(() => {\r\n if (abortDataFetch) {\r\n return;\r\n }\r\n onManagePageInitialized();\r\n // eslint-disable-next-line\r\n }, [publisher, account]);\r\n\r\n const adUnitsGridReady = tythonUser ? !adUnitsRaw.isLoading && !getGridPropertyStore().isFetchingPropertyStatus : !adUnitsRaw.isLoading;\r\n const adUnitsGridData = publisher && account ? adUnitsRaw.data || [] : [];\r\n const pageContent = (\r\n <>\r\n <GridV2\r\n history={history}\r\n location={props.location}\r\n match={match}\r\n entity={AdUnit}\r\n pageTitle={{ title: formatMessage(messages.adUnits), helpId: 'pop_PCv4_AdUnits' }}\r\n commandBarProps={getCommandBarItems(formatMessage, history, match, isWindowExtraSmallSize)}\r\n isGridReady={adUnitsGridReady}\r\n isDataLoading={adUnitsRaw.isFetchingData}\r\n dataGridProps={{\r\n gridV2Columns: gridDefaultColumns,\r\n data: tythonUser\r\n ? adUnitsGridData.filter((adunit) =>\r\n getGridPropertyStore()?.servingConfigs?.find(\r\n (config) => config.propertyId === adunit.propertyId && config.inventoryPlatformType !== InventoryPlatformType.UWP\r\n )\r\n )\r\n : adUnitsGridData,\r\n setData: setAdUnitsData,\r\n shimmerLines: 10,\r\n renderZeroItemsComponent: NoResultComponent,\r\n noEntityFound: messages.notFound,\r\n }}\r\n paginationProps={{\r\n shouldGridHandlePagination: true,\r\n }}\r\n />\r\n <>{isTythonSelfServeUser() && <CodePanel {...props} />}</>\r\n <AdUnitCallout {...props} visibleCallOut={visibleCallOut} setVisibleCallOut={setVisibleCallOut} />\r\n </>\r\n );\r\n\r\n return withParentLayout ? <>{pageContent}</> : <GridPageLayout>{pageContent}</GridPageLayout>;\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n appAdunitCodePanelTitle: {\r\n id: 'appAdunit.codePanelTitle',\r\n defaultMessage: 'Ad unit code template',\r\n },\r\n appAdunitManagePageGridTitle: {\r\n id: 'appAdunit.managePageGridTitle',\r\n defaultMessage: 'App ad units',\r\n },\r\n zeroAdUnitsTitle: {\r\n id: 'appAdunit.zeroAdUnitsTitle',\r\n defaultMessage: 'No ad units found by apps',\r\n },\r\n zeroAdUnitsDescription: {\r\n id: 'appAdunit.zeroAdUnitsDescription',\r\n defaultMessage: 'Create an app ad unit to start monetizing your app',\r\n },\r\n zeroAdUnitsCallToAction: {\r\n id: 'appAdunit.zeroAdUnitsCallToAction',\r\n defaultMessage: 'Create an App Ad Unit',\r\n },\r\n gridColumnTitleAppName: {\r\n id: 'appAdunit.gridColumnTitleAppName',\r\n defaultMessage: 'App Name',\r\n },\r\n gridColumnTitleAppId: {\r\n id: 'appAdunit.gridColumnTitleAppId',\r\n defaultMessage: 'App ID',\r\n },\r\n gridColumnTitleConnectedApp: {\r\n id: 'appAdunit.gridColumnTitleConnectedApp',\r\n defaultMessage: 'App connected',\r\n },\r\n gridColumnTitleAdUnitPlatform: {\r\n id: 'appAdunit.gridColumnTitleAdUnitPlatform',\r\n defaultMessage: 'Ad unit platform',\r\n },\r\n gridColumnTitleAppAdUnitStatus: {\r\n id: 'appAdunit.gridColumnTitleAppAdUnitStatus',\r\n defaultMessage: 'Status',\r\n },\r\n gridColumnTitleIssues: {\r\n id: 'appAdunit.gridColumnTitleIssues',\r\n defaultMessage: 'Issues',\r\n },\r\n gridColumnTitleActions: {\r\n id: 'appAdunit.gridColumnTitleActions',\r\n defaultMessage: 'Actions',\r\n },\r\n gridCreateButtonLabel: {\r\n id: 'appAdunit.gridCreateButtonLabel',\r\n defaultMessage: 'Create App Ad Unit',\r\n },\r\n propertyInventoryTypeLabelUWP: {\r\n id: 'appAdunit.propertyInventoryTypeLabelUWP',\r\n defaultMessage: 'Windows UWP',\r\n },\r\n siteTabLabel: {\r\n id: 'appAdunit.siteTabLabel',\r\n defaultMessage: 'By sites',\r\n },\r\n appTabLabel: {\r\n id: 'appAdunit.appTabLabel',\r\n defaultMessage: 'By apps',\r\n },\r\n});\r\n","import { makeStyles, shorthands, tokens } from '@fluentui/react-components';\r\n\r\nexport const useAppAdUnitCodePanelStyles = makeStyles({\r\n textArea: {\r\n width: '100%',\r\n height: '236px',\r\n '> textarea': {\r\n maxHeight: '100%',\r\n },\r\n },\r\n textAreaWrapper: {\r\n ':hover': {\r\n '> button': {\r\n zIndex: 100,\r\n },\r\n },\r\n position: 'relative',\r\n ...shorthands.padding(tokens.spacingVerticalM),\r\n },\r\n codeBlocOnlyTextWrapper: {\r\n width: '600px',\r\n },\r\n copyButton: {\r\n position: 'absolute',\r\n right: tokens.spacingHorizontalXXL,\r\n top: tokens.spacingVerticalXXL,\r\n },\r\n additionalCodeArea: {\r\n height: '300px',\r\n },\r\n});\r\n","import {\r\n Button,\r\n Card,\r\n DrawerBody,\r\n DrawerHeader,\r\n DrawerHeaderTitle,\r\n FluentProvider,\r\n OverlayDrawer,\r\n Textarea,\r\n mergeClasses,\r\n webLightTheme,\r\n} from '@fluentui/react-components';\r\nimport { Checkmark16Regular, Copy16Regular, Dismiss24Regular } from '@fluentui/react-icons';\r\nimport React, { useState } from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport { AdUnit, getAppStore } from '../../../../../@data';\r\nimport messages from '../messages';\r\nimport { useAppAdUnitCodePanelStyles } from '../styles';\r\nimport { AppAdUnitCodePanelType, UseAppAdUnitCodePanel } from '../types';\r\n\r\nexport const useAppAdUnitCodePanel: UseAppAdUnitCodePanel = (renderCodeBlockOnly = false) => {\r\n const [isPanelOpen, setIsPanelOpen] = useState(false);\r\n const [codeContent, setCodeContent] = useState('');\r\n const [adunitCode, setAdunitCode] = useState('');\r\n const [configCode, setConfigCode] = useState('');\r\n const { publisher } = getAppStore();\r\n const onPanelTrigger = (open: boolean, item?: AdUnit) => {\r\n setIsPanelOpen(open);\r\n const codeForAdUnit = `<!-- MainPage.xaml -->\r\n <Page\r\n ...\r\n xmlns:adSdk=\"using:Microsoft.AdSdk.Uwp\">\r\n\r\n <!-- Placement Code is required! -->\r\n <adSdk:AdControl x:Name=\"NativeAdControl\" PlacementCode=\"adunit_${item?.id}\" Width=\"300\" Height=\"250\" CornerRadius=\"15\" Background=\"Transparent\"/>\r\n </Page>`;\r\n const codeForConfig = `/* MainPage.xaml.cs */\r\n using Microsoft.AdSdk.Uwp;\r\n\r\n public sealed partial class MainPage : Page\r\n {\r\n public MainPage()\r\n {\r\n NativeAdControl.SdkConfiguration = SdkConfigFactory.Create(\r\n callback: (SdkConfigurationOptions options) =>\r\n {\r\n options.PublisherCode = \"publisher_${publisher?.id}\";\r\n options.MemberId = \"14163\";\r\n });\r\n }\r\n }`;\r\n if (item) {\r\n setCodeContent(`${codeForAdUnit}\\n${codeForConfig}`.replace(/\\u202F/g, ' '));\r\n setAdunitCode(codeForAdUnit.replace(/\\u202F/g, ' '));\r\n setConfigCode(codeForConfig.replace(/\\u202F/g, ' '));\r\n }\r\n };\r\n\r\n return {\r\n isPanelOpen,\r\n codeContent,\r\n onPanelTrigger,\r\n renderCodeBlockOnly,\r\n adunitCode,\r\n configCode,\r\n };\r\n};\r\n\r\nconst AppAdUnitCodePanel: AppAdUnitCodePanelType = ({\r\n intl: { formatMessage },\r\n isPanelOpen,\r\n onPanelTrigger,\r\n codeContent,\r\n renderCodeBlockOnly = false,\r\n adunitCode,\r\n configCode,\r\n}) => {\r\n const classNames = useAppAdUnitCodePanelStyles();\r\n const [isContentCopied, setIsContentCopied] = useState(false);\r\n\r\n const onCopy = () => {\r\n navigator.clipboard.writeText(codeContent);\r\n setIsContentCopied(true);\r\n };\r\n\r\n const codeBlock = (\r\n <Card\r\n className={mergeClasses(classNames.textAreaWrapper, renderCodeBlockOnly ? classNames.codeBlocOnlyTextWrapper : '')}\r\n appearance=\"outline\"\r\n onMouseLeave={() => setIsContentCopied(false)}\r\n >\r\n <Button\r\n className={classNames.copyButton}\r\n icon={isContentCopied ? <Checkmark16Regular /> : <Copy16Regular />}\r\n onClick={() => onCopy()}\r\n />\r\n <Textarea resize=\"none\" appearance=\"filled-darker\" size=\"medium\" className={classNames.textArea} value={adunitCode} />\r\n <Textarea\r\n resize=\"none\"\r\n appearance=\"filled-darker\"\r\n size=\"medium\"\r\n className={mergeClasses(classNames.textArea, classNames.additionalCodeArea)}\r\n value={configCode}\r\n />\r\n </Card>\r\n );\r\n\r\n if (renderCodeBlockOnly) {\r\n return isPanelOpen ? codeBlock : <></>;\r\n }\r\n\r\n return (\r\n <FluentProvider theme={webLightTheme}>\r\n <OverlayDrawer position=\"end\" size=\"medium\" open={isPanelOpen} onOpenChange={(_, { open }) => onPanelTrigger(open)}>\r\n <DrawerHeader>\r\n <DrawerHeaderTitle\r\n action={<Button appearance=\"subtle\" aria-label=\"Close\" icon={<Dismiss24Regular />} onClick={() => onPanelTrigger(false)} />}\r\n >\r\n {formatMessage(messages.appAdunitCodePanelTitle)}\r\n </DrawerHeaderTitle>\r\n </DrawerHeader>\r\n <DrawerBody>{codeBlock}</DrawerBody>\r\n </OverlayDrawer>\r\n </FluentProvider>\r\n );\r\n};\r\n\r\nexport default injectIntl(AppAdUnitCodePanel);\r\n","import { CommandBarButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport {\r\n AdUnit,\r\n InventoryPlatformType,\r\n Model,\r\n PopupType,\r\n getAccessPermission,\r\n getAppStore,\r\n isTythonSelfServeUser,\r\n} from '../../../../../@data';\r\nimport { hasDeleteAccess, hasUpdateAccess } from '../../../../../@data/services/UserRoleService';\r\nimport AppMessages from '../../../../../App.messages';\r\nimport { ZeroResults } from '../../../../../components/ZeroResults/ZeroResults';\r\nimport { CommandBarActions, IBuildCommandBarProps, IGridV2Column } from '../../../../../layout/GridPageV2';\r\nimport { setDialogType } from '../../../../../layout/GridPageV2/@data/mutatorActions';\r\nimport { getTythonAppAdunitCreationRoute, getTythonAppAdunitEditionRoute } from '../../../../../utils/routeUtils';\r\nimport { getAdunitStore } from '../../../Adunit/@data';\r\nimport { setAdUnitsData } from '../../../Adunit/@data/mutatorActions';\r\nimport { getFilterItems } from '../../../Adunit/Manage/utils/getFilterItems';\r\nimport { getGridPropertyStore } from '../../../Property/Manage/__data__/store/store';\r\nimport messages from '../messages';\r\nimport { UseAppAdsGridType } from '../types';\r\n\r\nconst InventoryPlatformTypeLabel = {\r\n [InventoryPlatformType.UWP]: messages.propertyInventoryTypeLabelUWP,\r\n};\r\n\r\n// @ts-ignore TODO: fix types\r\nconst useAppAdsGrid: UseAppAdsGridType = ({ formatMessage, history, onPanelTrigger }) => {\r\n const { publisher, account } = getAppStore();\r\n const { adUnitsRaw } = getAdunitStore();\r\n const adUnitsGridData = publisher && account ? adUnitsRaw.data || [] : [];\r\n\r\n const NoResultComponent = (\r\n <ZeroResults\r\n showDefaultImage\r\n title={formatMessage(messages.zeroAdUnitsTitle)}\r\n description={formatMessage(messages.zeroAdUnitsDescription)}\r\n buttonText={formatMessage(messages.zeroAdUnitsCallToAction)}\r\n onButtonClick={() => history.push(getTythonAppAdunitCreationRoute())}\r\n />\r\n );\r\n\r\n const columns: IGridV2Column[] = [\r\n {\r\n columnOrder: 2,\r\n key: 'name',\r\n fieldName: 'name',\r\n name: formatMessage(messages.gridColumnTitleAppName),\r\n minWidth: 100,\r\n maxWidth: 125,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n suppressSorting: false,\r\n },\r\n {\r\n columnOrder: 3,\r\n key: 'id',\r\n fieldName: 'id',\r\n name: formatMessage(messages.gridColumnTitleAppId),\r\n minWidth: 100,\r\n maxWidth: 100,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n },\r\n {\r\n columnOrder: 4,\r\n key: 'connectedApp',\r\n fieldName: 'connectedApp',\r\n name: formatMessage(messages.gridColumnTitleConnectedApp),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n onRender: (item: AdUnit) => {\r\n const servingConfig = getGridPropertyStore()?.servingConfigs?.find((config) => item.propertyId === config.propertyId);\r\n return servingConfig?.name;\r\n },\r\n exportFunction: (item: AdUnit) => {\r\n const servingConfig = getGridPropertyStore()?.servingConfigs?.find((config) => item.propertyId === config.propertyId);\r\n return servingConfig?.name;\r\n },\r\n },\r\n {\r\n columnOrder: 5,\r\n key: 'platform',\r\n fieldName: 'platform',\r\n name: formatMessage(messages.gridColumnTitleAdUnitPlatform),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n onRender: (item: AdUnit) => {\r\n const servingConfig = getGridPropertyStore()?.servingConfigs?.find((config) => item.propertyId === config.propertyId);\r\n return formatMessage(InventoryPlatformTypeLabel[servingConfig?.inventoryPlatformType!]);\r\n },\r\n exportFunction: (item: AdUnit) => {\r\n const servingConfig = getGridPropertyStore()?.servingConfigs?.find((config) => item.propertyId === config.propertyId);\r\n return formatMessage(InventoryPlatformTypeLabel[servingConfig?.inventoryPlatformType!]);\r\n },\r\n },\r\n {\r\n columnOrder: 6,\r\n key: 'status',\r\n fieldName: 'status',\r\n name: formatMessage(messages.gridColumnTitleAppAdUnitStatus),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 8,\r\n key: 'actions',\r\n name: formatMessage(messages.gridColumnTitleActions),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: true,\r\n isExportable: false,\r\n onRender: (item: AdUnit) => {\r\n const accessPermission = getAccessPermission(item);\r\n\r\n const editAdUnitOptions = undefined;\r\n\r\n const editButtonOnClick = () => history.push(`${getTythonAppAdunitEditionRoute(item.id)}`);\r\n const isWindowRegularSize = true; // TODO: revisit responsive\r\n return (\r\n <div>\r\n <CommandBarButton\r\n id={`appAdunitCallout-${item.id}`}\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'edit' }}\r\n ariaLabel={formatMessage(AppMessages.edit)}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.edit) : ''}\r\n menuProps={editAdUnitOptions}\r\n disabled={!hasUpdateAccess(accessPermission)}\r\n onClick={editButtonOnClick}\r\n />\r\n <CommandBarButton\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'PasteAsCode' }}\r\n ariaLabel={formatMessage(AppMessages.code)}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.code) : ''}\r\n onClick={() => onPanelTrigger(true, item)}\r\n />\r\n <CommandBarButton\r\n data-test-id={`grid-delete-action-${item.id}`}\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'Delete' }}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.delete) : ''}\r\n onClick={() => setDialogType(PopupType.DeleteConfirmation)}\r\n disabled={!hasDeleteAccess(accessPermission)}\r\n />\r\n </div>\r\n );\r\n },\r\n },\r\n ];\r\n\r\n const dataGridProps = {\r\n gridV2Columns: columns,\r\n shimmerLines: 10,\r\n renderZeroItemsComponent: NoResultComponent,\r\n setData: setAdUnitsData,\r\n data: isTythonSelfServeUser()\r\n ? adUnitsGridData.filter((adunit) =>\r\n getGridPropertyStore()?.servingConfigs?.find(\r\n (config) => config.propertyId === adunit.propertyId && config.inventoryPlatformType === InventoryPlatformType.UWP\r\n )\r\n )\r\n : adUnitsGridData,\r\n };\r\n\r\n const commandBarItems: IBuildCommandBarProps<Model> = {\r\n primaryButtonUrl: getTythonAppAdunitCreationRoute(),\r\n primaryButtonLabel: messages.gridCreateButtonLabel,\r\n includeActions: [CommandBarActions.new],\r\n includeFarActions: [\r\n CommandBarActions.searchBox,\r\n CommandBarActions.addFilter,\r\n CommandBarActions.code,\r\n CommandBarActions.download,\r\n CommandBarActions.modifyColumns,\r\n ],\r\n filterItems: getFilterItems(formatMessage, true),\r\n };\r\n\r\n return {\r\n dataGridProps,\r\n commandBarItems,\r\n };\r\n};\r\n\r\nexport default useAppAdsGrid;\r\n","import React from 'react';\r\nimport { AdUnit, isTythonSelfServeUser } from '../../../../@data';\r\nimport { GridV2 } from '../../../../layout/GridPageV2';\r\nimport { injectRouterAndIntlWithObserver } from '../../../../utils';\r\nimport { getAdunitStore } from '../../Adunit/@data';\r\nimport { getGridPropertyStore } from '../../Property/Manage/__data__/store/store';\r\nimport { AppAdsManagePageType } from '../Manage/types';\r\nimport AppAdUnitCodePanel, { useAppAdUnitCodePanel } from './hooks/useAppAdUnitCodePanel';\r\nimport useAppAdsGrid from './hooks/useAppAdsGrid';\r\nimport messages from './messages';\r\n\r\nconst AppAdsManagePage: AppAdsManagePageType = ({ intl: { formatMessage }, match, history, location }) => {\r\n const { adUnitsRaw } = getAdunitStore();\r\n const adUnitPanelProps = useAppAdUnitCodePanel();\r\n const { dataGridProps, commandBarItems } = useAppAdsGrid({ formatMessage, history, onPanelTrigger: adUnitPanelProps.onPanelTrigger });\r\n const adUnitsGridReady = isTythonSelfServeUser()\r\n ? !adUnitsRaw.isLoading && !getGridPropertyStore().isFetchingPropertyStatus\r\n : !adUnitsRaw.isLoading;\r\n\r\n return (\r\n <div>\r\n <AppAdUnitCodePanel {...adUnitPanelProps} />\r\n <GridV2\r\n history={history}\r\n location={location}\r\n match={match}\r\n entity={AdUnit}\r\n pageTitle={{ title: formatMessage(messages.appAdunitManagePageGridTitle), helpId: 'pop_PCv4_AdUnits' }}\r\n isGridReady={adUnitsGridReady}\r\n dataGridProps={dataGridProps}\r\n commandBarProps={commandBarItems}\r\n paginationProps={{\r\n shouldGridHandlePagination: true,\r\n }}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default injectRouterAndIntlWithObserver(AppAdsManagePage);\r\n","import React, { useEffect } from 'react';\r\nimport { getAppStore } from '../../../../@data';\r\nimport EntityTypeSwitch from '../../../../components/EntityTypeSwitch';\r\nimport { InventoryPageTabs, useEntityTypeManage } from '../../../../hooks/useEntityTypeManage';\r\nimport { getStore as getWindowsAppFeatureFlagStore } from '../../../../hooks/useWindowsAppFeatureFlag/store/store';\r\nimport { GridPageLayout } from '../../../../layout/GridPageLayout/GridPageLayout';\r\nimport { injectRouterWithIntl } from '../../../../utils';\r\nimport { onManagePageInitialized } from '../../Adunit/@data/actions';\r\nimport { ManagePage } from '../../Adunit/Manage/ManagePage';\r\nimport AppAdsManagePage from './AppAdsManagePage';\r\nimport messages from './messages';\r\n\r\nexport const TythonAppManagePage = injectRouterWithIntl(({ history, match, location, intl: { formatMessage } }) => {\r\n const { isFeatureEnabled } = getWindowsAppFeatureFlagStore();\r\n const { activeSubTab, setActiveSubTab } = useEntityTypeManage({ isFeatureEnabled });\r\n const SiteAdsManageView = <ManagePage withParentLayout history={history} match={match} location={location} abortDataFetch />;\r\n const AppAdsManageView = <AppAdsManagePage />;\r\n const { publisher, account } = getAppStore();\r\n\r\n useEffect(() => {\r\n if (publisher && account) {\r\n onManagePageInitialized();\r\n }\r\n }, [publisher, account]);\r\n\r\n return (\r\n <GridPageLayout withSubHeader>\r\n <EntityTypeSwitch\r\n selectedValue={activeSubTab}\r\n onTabSelect={setActiveSubTab}\r\n siteTabLabel={formatMessage(messages.siteTabLabel)}\r\n appTabLabel={formatMessage(messages.appTabLabel)}\r\n isFeatureEnabled={isFeatureEnabled}\r\n />\r\n {activeSubTab === InventoryPageTabs.Sites ? SiteAdsManageView : <></>}\r\n {activeSubTab === InventoryPageTabs.Apps ? AppAdsManageView : <></>}\r\n </GridPageLayout>\r\n );\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { AdUnit } from '../../../../../@data';\r\nimport { mergeTypeWithObject } from '../../../../../utils';\r\nimport { onAdunitChanged, onAdunitErrorChanged, onAdunitMediationUpdateEnd, onAdunitMediationUpdateStart, onRawChanged } from '../actions/';\r\nimport { getAdunitStore } from '../store/store';\r\n\r\nmutator(onRawChanged, (msg) => {\r\n getAdunitStore().raw = mergeTypeWithObject(new AdUnit(), msg.value);\r\n});\r\n\r\nmutator(onAdunitChanged, (msg) => {\r\n getAdunitStore().active = msg.adunit;\r\n});\r\n\r\nmutator(onAdunitErrorChanged, (msg) => {\r\n getAdunitStore().errors = msg.values || {};\r\n});\r\n\r\nmutator(onAdunitMediationUpdateStart, (msg) => {\r\n getAdunitStore().mediationUpdatePool = [...getAdunitStore().mediationUpdatePool, ...msg.ids];\r\n});\r\n\r\nmutator(onAdunitMediationUpdateEnd, (msg) => {\r\n getAdunitStore().mediationUpdatePool = getAdunitStore().mediationUpdatePool.filter((id) => !msg.ids.includes(id));\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { AdUnitMarketClassification, AdUnitServingTier, PublisherGroupConfig } from '../../../../../@data';\r\nimport {\r\n onAdUnitFormSubmittable,\r\n onAdunitChannelListChanged,\r\n onAdunitIdChanged,\r\n onAdunitNameChanged,\r\n onAdunitPropertyListChanged,\r\n onAdunitTypeChanged,\r\n onAssociatedPropertyChanged,\r\n onBusinessModelChanged,\r\n onChannelsChanged,\r\n onCreatePropertyPanelOpenChanged,\r\n onDistributionPartnerCodesChanged,\r\n onFormCleared,\r\n onImpressionFeedbackSignalChanged,\r\n onMarketplaceChanged,\r\n onPubGroupConfigChanged,\r\n onServingTierChanged,\r\n onStoreIdsChanged,\r\n} from '../actions';\r\nimport { getAdunitStore } from '../store/store';\r\n\r\nmutator(onAdunitIdChanged, (msg) => {\r\n getAdunitStore().active.id = msg.value;\r\n});\r\n\r\nmutator(onAdunitNameChanged, (msg) => {\r\n getAdunitStore().active.name = msg.value;\r\n});\r\n\r\nmutator(onAdunitTypeChanged, (msg) => {\r\n getAdunitStore().active.adUnitType = msg.value;\r\n});\r\n\r\nmutator(onMarketplaceChanged, (msg) => {\r\n getAdunitStore().active.marketClassification = msg.value.key as AdUnitMarketClassification;\r\n});\r\n\r\nmutator(onBusinessModelChanged, (msg) => {\r\n if (msg.value) {\r\n getAdunitStore().active.businessModel = parseInt(msg.value.key.toString(), 10);\r\n }\r\n});\r\n\r\nmutator(onChannelsChanged, (msg) => {\r\n getAdunitStore().active.channelsSelected = msg.values;\r\n});\r\n\r\nmutator(onAdunitChannelListChanged, (msg) => {\r\n getAdunitStore().active.channels = msg.values;\r\n});\r\n\r\nmutator(onAssociatedPropertyChanged, (msg) => {\r\n getAdunitStore().active.propertySelected = msg.value;\r\n});\r\n\r\nmutator(onAdunitPropertyListChanged, (msg) => {\r\n getAdunitStore().active.properties = msg.values;\r\n});\r\n\r\nmutator(onCreatePropertyPanelOpenChanged, (msg) => {\r\n getAdunitStore().active.createPropertyPanelOpen = msg.isOpen;\r\n});\r\n\r\nmutator(onServingTierChanged, (msg) => {\r\n if (msg.value) {\r\n getAdunitStore().active.servingTier = msg.value.key as AdUnitServingTier;\r\n }\r\n});\r\n\r\nmutator(onAdUnitFormSubmittable, (msg) => {\r\n getAdunitStore().isSubmittable = msg.isSubmittable;\r\n});\r\n\r\nmutator(onPubGroupConfigChanged, (msg) => {\r\n if (msg.value) {\r\n getAdunitStore().active.publisherGroupConfig = msg.value.key as PublisherGroupConfig;\r\n }\r\n});\r\n\r\nmutator(onStoreIdsChanged, (msg) => {\r\n getAdunitStore().active.storeIds = msg.values;\r\n});\r\n\r\nmutator(onFormCleared, () => {\r\n getAdunitStore().active = {};\r\n getAdunitStore().template = undefined;\r\n});\r\n\r\nmutator(onDistributionPartnerCodesChanged, (msg) => {\r\n if (msg.value) {\r\n getAdunitStore().active.distributionPartnerCodes = msg.value;\r\n }\r\n});\r\n\r\nmutator(onImpressionFeedbackSignalChanged, (msg) => {\r\n getAdunitStore().active.isImpressionFeedbackRequired = !!msg.value;\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { onPanelOpenChanged } from '../actions';\r\nimport { getAdunitStore } from '../store/store';\r\n\r\nmutator(onPanelOpenChanged, (msg) => {\r\n getAdunitStore().isPanelOpen = msg.isPanelOpen;\r\n getAdunitStore().scriptProps = { propertyId: msg.activePropertyId!, adunitId: msg.activeAdUnitId! };\r\n});\r\n","import { when } from 'mobx';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { getAppStore } from '../../../../../@data';\r\nimport { onPopupOpenChanged, showErrorToastNotification } from '../../../../../@data/mutatorActions';\r\nimport { AdSenseOAuthStatus } from '../../../../../@data/store/schema/enums/AdSenseOAuthStatus';\r\nimport { PopupType } from '../../../../../@data/store/schema/enums/PopupType';\r\nimport { getGoogleAdSenseStore } from '../../../Account/Settings/components/GoogleConnector/@data';\r\nimport { onInitializeGoogleAccount } from '../../../Account/Settings/components/GoogleConnector/@data/actions';\r\nimport messages from '../../Manage/ManagePage.messages';\r\nimport { fetchAdUnitMediationStatus } from '../actions';\r\nimport { onAdSenseMediationToggleChanged } from '../mutatorActions';\r\nimport { fetchAdunitMediationStatus } from '../services/AdunitService';\r\n\r\norchestrator(fetchAdUnitMediationStatus, async ({ adUnitId, showLoadingSpinner = false, showNotifications = true }) => {\r\n const { publisher, account } = getAppStore();\r\n\r\n if (publisher && account) {\r\n let adSenseConnectionState = AdSenseOAuthStatus.Success.toString();\r\n\r\n onInitializeGoogleAccount(false);\r\n await when(() => {\r\n const { active: googleAdSense } = getGoogleAdSenseStore();\r\n\r\n if (!!googleAdSense.connectionStatus) {\r\n adSenseConnectionState = googleAdSense.connectionStatus;\r\n }\r\n\r\n return !!googleAdSense.connectionStatus;\r\n });\r\n\r\n if (adSenseConnectionState === AdSenseOAuthStatus.None.toString() && showNotifications) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.noConnectionWithAdSense });\r\n return;\r\n }\r\n\r\n try {\r\n const list = await fetchAdunitMediationStatus(publisher, account, adUnitId);\r\n\r\n if (list[0].mediationStatus) {\r\n onAdSenseMediationToggleChanged(true);\r\n } else {\r\n onAdSenseMediationToggleChanged(false);\r\n if (showNotifications) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.failedToFetchAdSenseAdunit });\r\n }\r\n }\r\n } catch (error) {\r\n onAdSenseMediationToggleChanged(false);\r\n if (showNotifications) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.failedToFetchAdSenseAdunit });\r\n }\r\n Log.error(`Error while fetching connected adSense's adUnit: ${error}`);\r\n } finally {\r\n if (showLoadingSpinner) {\r\n onPopupOpenChanged(PopupType.None);\r\n }\r\n }\r\n } else {\r\n onAdSenseMediationToggleChanged(false);\r\n showErrorToastNotification({ textMessageDescriptor: messages.failedToFetchAdSenseAdunit });\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Account, getAppStore, Publisher, showErrorToastNotification } from '../../../../../@data';\r\nimport { setPublisherAndAccountContext } from '../../../@data/services/AdManagementService';\r\nimport messages from '../../Manage/ManagePage.messages';\r\nimport { onAdunitChanged, onAdunitErrorChanged, onFetchAdUnitName, onRawChanged } from '../actions';\r\nimport { fetchAdunitById } from '../services/AdunitService';\r\nimport { IAdunitViewModel } from '../store/schema';\r\n\r\norchestrator(onFetchAdUnitName, async ({ publisherId, accountId, entityId, setIsLoading }) => {\r\n const { userContext } = getAppStore();\r\n const viewModel: IAdunitViewModel = {};\r\n const parsedPublisherId = parseInt(publisherId, 10);\r\n const parsedAccountId = parseInt(accountId, 10);\r\n\r\n if (!isNaN(parsedPublisherId) && !isNaN(parsedAccountId) && entityId) {\r\n const publisher = new Publisher(parsedPublisherId);\r\n const account = new Account(parsedAccountId);\r\n\r\n try {\r\n setPublisherAndAccountContext(publisher, account);\r\n onAdunitErrorChanged();\r\n setIsLoading(true);\r\n const raw = await fetchAdunitById(publisher, entityId, userContext);\r\n\r\n viewModel.id = raw.id;\r\n viewModel.name = String(raw.name);\r\n\r\n onRawChanged(raw);\r\n onAdunitChanged(viewModel);\r\n } catch (e) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.failedToLoadAdunit });\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n } else {\r\n showErrorToastNotification({ textMessageDescriptor: messages.failedToLoadAdunit });\r\n }\r\n});\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { NativeAdTemplate } from '../../../../../@data';\r\nimport { getAdunitStore } from '../store/store';\r\n\r\nexport const setTemplate = mutatorAction('setTemplate', (template: NativeAdTemplate) => {\r\n getAdunitStore().template = template;\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { AdUnit, getAppStore, listEntity, NativeAdTemplate, onLoadingChanged, showErrorToastNotification } from '../../../../../@data';\r\nimport messages from '../../Manage/ManagePage.messages';\r\nimport { onFetchAdUnitTemplate } from '../actions';\r\nimport { setTemplate } from '../mutatorActions/setAdUnitTemplate';\r\n\r\norchestrator(onFetchAdUnitTemplate, async ({ entityId }) => {\r\n const { publisher, account, userContext } = getAppStore();\r\n\r\n if (publisher && account && entityId) {\r\n const adUnit = new AdUnit(entityId);\r\n onLoadingChanged(true);\r\n\r\n try {\r\n const template = await listEntity([publisher, adUnit], userContext, NativeAdTemplate);\r\n if (template.length !== 0) {\r\n const adUnitid = +(entityId ?? 0);\r\n template[0].adUnitId = adUnitid;\r\n setTemplate(template[0]);\r\n }\r\n } catch (e) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.adunitTemplateFailedToLoad });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n showErrorToastNotification({ textMessageDescriptor: messages.adunitTemplateFailedToLoad });\r\n }\r\n});\r\n","import { action, orchestrator } from 'satcheljs';\r\nimport { getAppStore, isTythonSelfServeUser } from '../../../../../@data';\r\nimport { fetchPropertiesServingConfigs } from '../../../AdBlock/@data/services';\r\nimport { setPropertiesFetching, setPropertiesServingConfigs } from '../../Manage/__data__/mutatorActions';\r\n\r\nexport const loadPropertiesServingConfigs = action('loadPropertiesServingConfigs');\r\n\r\norchestrator(loadPropertiesServingConfigs, async () => {\r\n const { publisher } = getAppStore();\r\n\r\n if (publisher && isTythonSelfServeUser()) {\r\n setPropertiesFetching(true);\r\n const propertyServingConfig = await fetchPropertiesServingConfigs(publisher);\r\n setPropertiesServingConfigs(propertyServingConfig);\r\n setPropertiesFetching(false);\r\n }\r\n});\r\n","import { action, orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { Property, getAppStore, listEntity, showErrorToastNotification } from '../../../../../@data';\r\nimport { setLoading, setPropertyData } from '../../Manage/__data__/mutatorActions';\r\nimport messages from '../../Property.messages';\r\nimport { loadPropertiesServingConfigs } from './loadPropertyServingConfigs';\r\n\r\nexport const fetchPropertiesDataAction = action('fetchPropertiesDataAction');\r\n\r\norchestrator(fetchPropertiesDataAction, async () => {\r\n try {\r\n const { publisher, userContext } = getAppStore();\r\n if (!publisher) {\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n const data = await listEntity([publisher], userContext, Property);\r\n setPropertyData(data);\r\n loadPropertiesServingConfigs();\r\n } catch (error) {\r\n Log.error(error);\r\n showErrorToastNotification({ textMessageDescriptor: messages.failedToLoadSites });\r\n } finally {\r\n setLoading(false);\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { AdUnit, getAppStore, isTythonSelfServeUser, listEntity, putEntity, showErrorToastNotification } from '../../../../../@data';\r\nimport { AdSenseOAuthStatus } from '../../../../../@data/store/schema/enums/AdSenseOAuthStatus';\r\nimport { AdSenseAdUnitStatus } from '../../../../../@data/store/schema/models/AdSenseAdUnitStatus';\r\nimport { getGoogleAdSenseStore } from '../../../Account/Settings/components/GoogleConnector/@data';\r\nimport { loadPropertiesServingConfigs } from '../../../Property/@data/orchestrators';\r\nimport messages from '../../Manage/ManagePage.messages';\r\nimport { fetchAdUnitsDataAction } from '../actions';\r\nimport { setAdUnitsData, setAdUnitsDataFetching, setAdUnitsLoading, setAdUnitsMediationFetching } from '../mutatorActions';\r\nimport { getAdunitStore } from '../store/store';\r\n\r\norchestrator(fetchAdUnitsDataAction, async () => {\r\n try {\r\n const { publisher, userContext, account } = getAppStore();\r\n const { adUnitsRaw } = getAdunitStore();\r\n\r\n if (!publisher) {\r\n return;\r\n }\r\n\r\n if (publisher && account) {\r\n // make a get request\r\n setAdUnitsDataFetching(true);\r\n if (adUnitsRaw.data === undefined || adUnitsRaw.data.length === 0) {\r\n setAdUnitsLoading(true);\r\n }\r\n const params = new URLSearchParams([['extendedInfo', 'true']]);\r\n const data = await listEntity([publisher, account], userContext, AdUnit, params);\r\n data.forEach((adUnit) => {\r\n if (!!adUnit.creationDate) {\r\n adUnit.creationDate = new Date(adUnit.creationDate).toISOString();\r\n }\r\n });\r\n if (!!adUnitsRaw.data?.[0]?.mediatedWithAdSense) {\r\n data?.forEach((adUnit) => {\r\n const adUnitStatus = adUnitsRaw.data?.find((item) => item.id === Number(adUnit.id))?.mediatedWithAdSense;\r\n if (adUnitStatus) {\r\n adUnit.mediatedWithAdSense = adUnitStatus;\r\n }\r\n });\r\n }\r\n data.sort((a, b) => {\r\n if (a.creationDate && b.creationDate) {\r\n return new Date(b.creationDate).getTime() - new Date(a.creationDate).getTime();\r\n }\r\n return 0;\r\n });\r\n setAdUnitsData(data);\r\n\r\n // Fetch adunit serving configs\r\n if (isTythonSelfServeUser()) {\r\n // We need property serving config to derive final adunit serving status\r\n loadPropertiesServingConfigs();\r\n }\r\n\r\n const { active } = getGoogleAdSenseStore();\r\n\r\n try {\r\n if (active.connectionStatus === AdSenseOAuthStatus.Success && active.isMediationEnabled) {\r\n setAdUnitsMediationFetching(true);\r\n const adUnitIds = data?.map((item) => item.id.toString()) as string[];\r\n if (adUnitIds && adUnitIds.length !== 0) {\r\n const request: AdSenseAdUnitStatus = {\r\n apiPath: 'preauth/mediation',\r\n className: 'getAdUnitMediationStatus',\r\n pubcenterAdUnitIds: adUnitIds.map((id) => Number.parseInt(id, 10)),\r\n };\r\n\r\n const urlParams = new URLSearchParams();\r\n urlParams.append('routeSuffix', 'api/mediation/admanager/getAdUnitMediationStatus');\r\n // Set the type as any because the PUT operation in ApiService only\r\n // returns singular item and this request for AdUnits mediation status returns array\r\n // TODO: this call shouldn't be put call\r\n // TODO: put operation should support array of objects as a response\r\n // tslint:disable-next-line: no-any\r\n const response = (await putEntity([], request, undefined, AdSenseAdUnitStatus, urlParams)) as any;\r\n\r\n if (response) {\r\n data?.forEach((adUnit) => {\r\n const adUnitStatus = response.find((pubcenterAdUnitId) => pubcenterAdUnitId.pubcenterAdUnitId === Number(adUnit.id));\r\n if (adUnitStatus) {\r\n adUnit.mediatedWithAdSense = adUnitStatus;\r\n }\r\n });\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n Log.error(error);\r\n data?.forEach((adUnit) => {\r\n adUnit.mediatedWithAdSense = {\r\n apiPath: 'preauth/mediation',\r\n className: 'getAdUnitMediationStatus',\r\n mediationStatus: false,\r\n };\r\n });\r\n showErrorToastNotification({ textMessageDescriptor: messages.failedToLoadAdunitsMediationStatus });\r\n }\r\n\r\n setAdUnitsData(data);\r\n // set the response data in adUnitsRaw.data\r\n }\r\n } catch (error) {\r\n Log.error(error);\r\n showErrorToastNotification({ textMessageDescriptor: messages.failedToLoadAdunits });\r\n } finally {\r\n setAdUnitsLoading(false);\r\n setAdUnitsMediationFetching(false);\r\n setAdUnitsDataFetching(false);\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { onFormCancelled, onFormCleared } from '../actions';\r\n\r\norchestrator(onFormCancelled, () => {\r\n onFormCleared();\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport {\r\n Account,\r\n AdUnit,\r\n AdUnitMarketClassification,\r\n AdUnitType,\r\n Channel,\r\n getAppStore,\r\n listEntity,\r\n NativeAdTemplate,\r\n onLoadingChanged,\r\n onNotificationChanged,\r\n Property,\r\n Publisher,\r\n PublisherGroupConfig,\r\n showErrorToastNotification,\r\n} from '../../../../../@data';\r\nimport { getAdUnitTaxonomyValues } from '../../../../../@data/services/MetadataService';\r\nimport { isTythonSelfServeUser } from '../../../../../@data/utils/checkUserType';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { IIdNamePair } from '../../../../../components/MultiSelectPicker';\r\nimport { setPublisherAndAccountContext } from '../../../@data/services/AdManagementService';\r\nimport messages from '../../Manage/ManagePage.messages';\r\nimport { onAdunitChanged, onAdunitErrorChanged, onFormInitialized, onRawChanged } from '../actions';\r\nimport { onAdunitEnablePrivateMarketplaceChanged } from '../mutatorActions';\r\nimport { fetchAdunitById, fetchAdunitMediationStatus } from '../services/AdunitService';\r\nimport { IAdunitViewModel } from '../store/schema';\r\n\r\norchestrator(onFormInitialized, async ({ mode, publisherId, accountId, entityId, showLoadingSpinner = true }) => {\r\n const { userContext } = getAppStore();\r\n\r\n const viewModel: IAdunitViewModel = {\r\n channels: [],\r\n marketClassification: AdUnitMarketClassification.Syndicated,\r\n publisherGroupConfig: PublisherGroupConfig.DefaultPlus,\r\n };\r\n\r\n const parsedPublisherId = parseInt(publisherId, 10);\r\n const parsedAccountId = parseInt(accountId, 10);\r\n const tythonRole = isTythonSelfServeUser();\r\n\r\n if (!isNaN(parsedPublisherId) && !isNaN(parsedAccountId)) {\r\n const publisher = new Publisher(parsedPublisherId);\r\n let account = new Account(parsedAccountId);\r\n\r\n try {\r\n setPublisherAndAccountContext(publisher, account);\r\n\r\n onAdunitErrorChanged();\r\n if (showLoadingSpinner) {\r\n onLoadingChanged(true);\r\n }\r\n\r\n if (mode !== FormState.Edit && mode !== FormState.InPageEdit) {\r\n let response;\r\n\r\n if (tythonRole) {\r\n response = await Promise.all([listEntity([publisher], userContext, Property)]);\r\n viewModel.properties = response[0];\r\n viewModel.adUnitType = AdUnitType.Native;\r\n } else {\r\n response = await Promise.all([\r\n listEntity([publisher, account], userContext, Channel),\r\n listEntity([publisher], userContext, Property),\r\n ]);\r\n viewModel.channels = response[0] ? response[0].map((f) => ({ id: f.id, name: f.name } as IIdNamePair)) : [];\r\n viewModel.properties = response[1];\r\n }\r\n }\r\n\r\n viewModel.adUnitTaxonomyValues = await getAdUnitTaxonomyValues();\r\n\r\n if (\r\n (mode === FormState.Edit ||\r\n mode === FormState.InPageEdit ||\r\n mode === FormState.MultiStepCreation ||\r\n mode === FormState.MultiStepEdit) &&\r\n entityId\r\n ) {\r\n const raw = await fetchAdunitById(publisher, entityId, userContext);\r\n\r\n account = new Account(raw.accountId);\r\n\r\n let response;\r\n\r\n if (tythonRole) {\r\n response = await Promise.all([\r\n listEntity([publisher], userContext, Property),\r\n fetchAdunitMediationStatus(publisher, account, entityId),\r\n ]);\r\n\r\n viewModel.properties = response[0];\r\n viewModel.adUnitType = AdUnitType.Native;\r\n viewModel.adSenseMediationToggle = response[1][0].mediationStatus;\r\n viewModel.adSenseMediationStatus = response[1][0].mediationStatus;\r\n } else {\r\n const adUnit = new AdUnit(entityId);\r\n\r\n response = await Promise.all([\r\n listEntity([publisher, account], userContext, Channel),\r\n listEntity([publisher], userContext, Property),\r\n ]);\r\n\r\n try {\r\n const isBoost = sessionStorage.getItem('IsBoostPublisher');\r\n if (isBoost === 'true') {\r\n const template = await listEntity([publisher, adUnit], userContext, NativeAdTemplate);\r\n if (template && template.length > 0) {\r\n const adUnitid = +(entityId ?? 0);\r\n template[0].adUnitId = adUnitid;\r\n viewModel.BoostTemplate = template[0];\r\n }\r\n }\r\n } catch (e) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.adunitTemplateFailedToLoad });\r\n }\r\n\r\n viewModel.channels = response[0] ? response[0].map((f) => ({ id: f.id, name: f.name } as IIdNamePair)) : [];\r\n viewModel.channelsSelected = raw.channelIds ? viewModel.channels?.filter((c) => raw.channelIds.includes(c.id)) : [];\r\n viewModel.properties = response[1];\r\n }\r\n\r\n const enablePrivateMarketplace = raw.storeIds ? raw.storeIds.length !== 0 : false;\r\n\r\n viewModel.id = raw.id;\r\n viewModel.name = String(raw.name);\r\n viewModel.marketClassification = raw.classification ? raw.classification.marketClassification : undefined;\r\n viewModel.existingFinancialClassification = raw.classification ? raw.classification.financialClassification : undefined;\r\n\r\n viewModel.businessModel = raw.attributes ? raw.attributes.Taxonomy : undefined;\r\n viewModel.isImpressionFeedbackRequired = !!raw.requireImpressionFeedbackForBillableTraffic;\r\n\r\n viewModel.publisherGroupConfig = raw.publisherGroupConfiguration;\r\n viewModel.servingTier = raw.servingCostTier;\r\n\r\n if (raw.partnerCodes) {\r\n viewModel.distributionPartnerCodes = raw.partnerCodes.join('\\n');\r\n }\r\n\r\n viewModel.propertySelected = raw.propertyId ? viewModel.properties?.filter((p) => p.id === raw.propertyId)[0] : undefined;\r\n\r\n if (raw.storeIds) {\r\n viewModel.storeIds = raw.storeIds.join('\\n');\r\n }\r\n\r\n onRawChanged(raw);\r\n onAdunitEnablePrivateMarketplaceChanged(enablePrivateMarketplace);\r\n } else {\r\n onRawChanged();\r\n onAdunitEnablePrivateMarketplaceChanged(false);\r\n }\r\n\r\n onAdunitChanged(viewModel);\r\n } catch (e) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.adunitDetailsFailedToLoad });\r\n } finally {\r\n if (showLoadingSpinner) {\r\n onLoadingChanged(false);\r\n }\r\n }\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.createAdunitInvalidState,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { IBreadcrumbStyleProps, IBreadcrumbStyles, IStyle, IStyleFunctionOrObject, ITheme } from '@fluentui/react';\r\nimport { ReactElement } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { FormState, IFormEditParams } from '../../components/Form';\r\nimport { IFormTitleStyleProps, IFormTitleStyles } from '../../components/Form/FormTitle';\r\nimport { StepperDirection } from '../../components/Stepper/Stepper.types';\r\nimport { IRouterWithIntl } from '../../utils';\r\n\r\nexport enum StepState {\r\n Empty,\r\n Dirty\r\n}\r\n\r\nexport interface IStepperStep {\r\n name: string;\r\n helpId?: string;\r\n component: ReactElement;\r\n nextBtnLbl?: string;\r\n previousBtnLbl?: string;\r\n submitButtonDisabled?: boolean;\r\n allowFreeNavigation?: boolean;\r\n freeNavigationErrorMessage?: string;\r\n hideStep?: boolean;\r\n isNextDisabled?: boolean;\r\n isStepDirty?: boolean;\r\n extraButtons?: ReactElement[];\r\n /** In case we need some additional actions for next/previous buttons prior to changing current step */\r\n onNext?: (action: () => void, stepState: StepState) => void;\r\n onPrevious?: () => void;\r\n title?:string\r\n}\r\n\r\nexport interface IDetailPageWithStepperProps extends InjectedIntlProps, IRouterWithIntl<IFormEditParams> {\r\n process: string,\r\n steps: IStepperStep[],\r\n pageMode: FormState;\r\n backToBase: () => void,\r\n openStep?: number,\r\n direction?: StepperDirection,\r\n styles?: Partial<IDetailPageWithStepperStyles>;\r\n}\r\n\r\nexport interface IDetailPageWithStepperStyleProps {\r\n theme: ITheme;\r\n pageMode?: FormState;\r\n direction?: StepperDirection,\r\n}\r\n\r\nexport interface IDetailPageWithStepperStyles {\r\n root: IStyle;\r\n navBackButton?: IStyle;\r\n scrollablePanel?: IStyle;\r\n content?: IStyle;\r\n buttons?: IStyle;\r\n subComponentStyles: {\r\n formTitle?: IStyleFunctionOrObject<IFormTitleStyleProps, IFormTitleStyles>;\r\n breadcrumb?: IStyleFunctionOrObject<IBreadcrumbStyleProps, IBreadcrumbStyles>;\r\n };\r\n mainContainer?: IStyle;\r\n leftPane?: IStyle;\r\n rightPane?: IStyle;\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n adunitId: {\r\n id: 'adunit.id',\r\n defaultMessage: 'Ad unit ID',\r\n },\r\n uploadBoostTemplate: {\r\n id: 'upload.message',\r\n defaultMessage: 'Upload Configuration File',\r\n },\r\n downloadTemplate: {\r\n id: 'download.template',\r\n defaultMessage: 'Download Current Template',\r\n },\r\n adunitType: {\r\n id: 'adunit.type',\r\n defaultMessage: 'Ad unit type',\r\n },\r\n marketPlaceOptionCore: {\r\n id: 'marketeplace.core',\r\n defaultMessage: 'Owned and Operated(Core)',\r\n },\r\n marketPlaceOptionRest: {\r\n id: 'marketeplace.rest',\r\n defaultMessage: 'Owned and Operated(Rest)',\r\n },\r\n marketPlaceOptionSyndicated: {\r\n id: 'marketeplace.syndicated',\r\n defaultMessage: 'Syndicated',\r\n },\r\n marketPlaceOptionSelectTier: {\r\n id: 'marketplace.selectTier',\r\n defaultMessage: 'Select Tier',\r\n },\r\n marketPlaceOptionsSponsored: {\r\n id: 'marketplace.sponsored',\r\n defaultMessage: 'Sponsored',\r\n },\r\n marketPlaceOptionsSponsoredEnhanced: {\r\n id: 'marketplace.sponsoredEnhanced',\r\n defaultMessage: 'Sponsored Enhanced',\r\n },\r\n adunitNameLabel: {\r\n id: 'adunitName.label',\r\n defaultMessage: 'Ad unit name',\r\n },\r\n adunitIdLabel: {\r\n id: 'adunit.id',\r\n defaultMessage: 'Ad unit ID',\r\n },\r\n marketplaceLabel: {\r\n id: 'marketpalce.label',\r\n defaultMessage: 'Marketplace classfication',\r\n },\r\n businessModelLabel: {\r\n id: 'businessmodel.label',\r\n defaultMessage: 'Business model',\r\n },\r\n businessModelLevel2AriaLabel: {\r\n id: 'businessmodel.level2Arialabel',\r\n defaultMessage: 'Business model level 2',\r\n },\r\n distributionPartnerCodesLabel: {\r\n id: 'distributionPartnerCodes.label',\r\n defaultMessage: 'Search Distribution Partner Codes',\r\n },\r\n distributionPartnerCodesLabelDescription: {\r\n id: 'distributionPartnerCodesDescription.label',\r\n defaultMessage: 'Please list the Distribution Partner Codes above, with one code per line',\r\n },\r\n distributionPartnerCodesTextfieldPlaceholder: {\r\n id: 'distributionPartnerCodes.textfield.placeholder',\r\n defaultMessage: 'ExamplePC01\\nExamplePC02\\nExamplePC03',\r\n },\r\n createPageTitle: {\r\n id: 'create.page.title',\r\n defaultMessage: 'Create ad unit',\r\n },\r\n editPageTitle: {\r\n id: 'edit.page.title',\r\n defaultMessage: 'Edit ad unit',\r\n },\r\n updateAdUnit: {\r\n id: 'adunit.updateAdunit',\r\n defaultMessage: 'Update ad unit',\r\n },\r\n continueAdUnit: {\r\n id: 'adunit.continueAdunit',\r\n defaultMessage: 'Continue',\r\n },\r\n cancelAdUnit: {\r\n id: 'adunit.cancelAdUnit',\r\n defaultMessage: 'Cancel',\r\n },\r\n previousStepAdUnit: {\r\n id: 'adunit.previousStepAdUnit',\r\n defaultMessage: 'Previous',\r\n },\r\n channelTitle: {\r\n id: 'channel.title',\r\n defaultMessage: 'Channels',\r\n },\r\n propertySectionTitle: {\r\n id: 'property.sectionTitle',\r\n defaultMessage: 'Properties (optional)',\r\n },\r\n advOptionTitle: {\r\n id: 'advOption.title',\r\n defaultMessage: 'Advanced Options',\r\n },\r\n createChannelButton: {\r\n id: 'create.channel.button',\r\n defaultMessage: 'Create Channel',\r\n },\r\n channelPickerAriaDesc: {\r\n id: 'channelPickerAriaDesc',\r\n defaultMessage: 'Select channels to add the ad unit',\r\n },\r\n servingTierTitle: {\r\n id: 'servingTier.title',\r\n defaultMessage: 'Serving Tier',\r\n },\r\n servingTierOptionLowcost: {\r\n id: 'servingTier.option.lowcost',\r\n defaultMessage: 'Low Cost',\r\n },\r\n publisherGroupConfigLabel: {\r\n id: 'publisherGroupConfig.label',\r\n defaultMessage: 'Publisher Group configuration',\r\n },\r\n publisherGroupConfigOptionDefaultPlus: {\r\n id: 'publisherGroupConfig.option.defaultPlus',\r\n defaultMessage: 'Default+',\r\n },\r\n publisherGroupConfigOptionDefault: {\r\n id: 'publisherGroupConfig.option.default',\r\n defaultMessage: 'Default',\r\n },\r\n publisherGroupConfigOptionGeneralist: {\r\n id: 'publisherGroupConfig.option.Generalist',\r\n defaultMessage: 'Generalist',\r\n },\r\n publisherGroupConfigOptionYieldOptimizer: {\r\n id: 'publisherGroupConfig.option.yieldOptimizer',\r\n defaultMessage: 'Yield Optimizer',\r\n },\r\n publisherGroupConfigOptionYieldMaximizer: {\r\n id: 'publisherGroupConfig.option.yieldMaximizer',\r\n defaultMessage: 'Yield Maximizer',\r\n },\r\n publisherGroupConfigOptionBingandYahoo: {\r\n id: 'publisherGroupConfig.option.BingandYahoo',\r\n defaultMessage: 'Bing/Yahoo O&O',\r\n },\r\n publisherGroupConfigOptionLowQualityDistribution: {\r\n id: 'publisherGroupConfig.option.LowQualityDistribution',\r\n defaultMessage: 'Low quality Distribution traffic',\r\n },\r\n publisherGroupConfigOptionMediumQualityDistribution: {\r\n id: 'publisherGroupConfig.option.MediumQualityDistribution',\r\n defaultMessage: 'Medium quality Distribution traffic',\r\n },\r\n publisherGroupConfigOptionHighQualityDistribution: {\r\n id: 'publisherGroupConfig.option.HighQualityDistribution',\r\n defaultMessage: 'High quality Distribution traffic',\r\n },\r\n privateMarketplaceLabel: {\r\n id: 'privateMarketplace.label',\r\n defaultMessage: 'Enable Private Marketplace',\r\n },\r\n privateMarketplaceTextfieldLabel: {\r\n id: 'privateMarketplace.textfield.label',\r\n defaultMessage: 'Private Marketplace IDs',\r\n },\r\n privateMarketplaceTextfieldPlaceholder: {\r\n id: 'privateMarketplace.textfield.placeholder',\r\n defaultMessage: 'Example ID 1, enter one per line',\r\n },\r\n promotionRadioOptionLabel: {\r\n id: 'promotionOption.radio.label',\r\n defaultMessage: 'Sponsored Product Ads Stores',\r\n },\r\n promotionOptionTextfieldLabel: {\r\n id: 'promotionOption.textfield.label',\r\n defaultMessage: 'Store IDs',\r\n },\r\n promotionOptionTextfieldPlaceholder: {\r\n id: 'promotionOption.textfield.placeholder',\r\n defaultMessage: 'Example Store ID 1, enter one per line',\r\n },\r\n boostRadioOptionLabel: {\r\n id: 'boostOption.radio.label',\r\n defaultMessage: 'Boost Advertiser Accounts',\r\n },\r\n boostOptionTextfieldLabel: {\r\n id: 'boostOption.textfield.label',\r\n defaultMessage: 'Advertiser Account IDs',\r\n },\r\n boostOptionTextfieldPlaceholder: {\r\n id: 'boostOption.textfield.placeholder',\r\n defaultMessage: 'Example Account ID 1, enter one per line',\r\n },\r\n propertyName: {\r\n id: 'property.name',\r\n defaultMessage: 'Property name',\r\n },\r\n propertyButton: {\r\n id: 'property.add',\r\n defaultMessage: 'Add property',\r\n },\r\n siteButton: {\r\n id: 'site.add',\r\n defaultMessage: 'Add site',\r\n },\r\n site: {\r\n id: 'site',\r\n defaultMessage: 'Site',\r\n },\r\n websiteUrl: {\r\n id: 'property.url',\r\n defaultMessage: 'Website URL',\r\n },\r\n propertyId: {\r\n id: 'property.id',\r\n defaultMessage: 'Property ID',\r\n },\r\n propertyDefaultOptionText: {\r\n id: 'property.defaultOptionText',\r\n defaultMessage: 'Type ID or URL to select the site',\r\n },\r\n propertyDefaultNotFound: {\r\n id: 'property.defaultNotFound',\r\n defaultMessage: 'No property found, create new property before select',\r\n },\r\n siteDefaultNotFound: {\r\n id: 'site.defaultNotFound',\r\n defaultMessage: 'No site found, create new site before select',\r\n },\r\n createPropertyButtonLabel: {\r\n id: 'property.CreateButtonLabel',\r\n defaultMessage: 'Create property',\r\n },\r\n propertySearchPlaceholder: {\r\n id: 'property.SearchPlaceholder',\r\n defaultMessage: 'Search properties by ID or URL',\r\n },\r\n businessModelLevel1DefaultOptionText: {\r\n id: 'businessmodel.Level1DefaultOptionText',\r\n defaultMessage: 'Select level 1 (optional)',\r\n },\r\n businessModelLevel2DefaultOptionText: {\r\n id: 'businessmodel.Level2DefaultOptionText',\r\n defaultMessage: 'Select level 2 (optional)',\r\n },\r\n propertyPickerEmptyOptionLabel: {\r\n id: 'propertyPicker.EmptyOptionLabel',\r\n defaultMessage: 'Select a property',\r\n },\r\n createPropButtonAriaDesc: {\r\n id: 'propertyPicker.createButtonAriaDesc',\r\n defaultMessage: 'Click this button to create property within this page',\r\n },\r\n propertyOptionsAriaLabel: {\r\n id: 'propertyPicker.OptionsAriaLabel',\r\n defaultMessage: 'Property search results',\r\n },\r\n propertyPickerSearchBoxAriaDesc: {\r\n id: 'propertyPickerSearchBoxAriaDesc',\r\n defaultMessage: 'Click enter to view all properties',\r\n },\r\n propertyPickerItemSelectedAnnounceMsg: {\r\n id: 'propertyPickerItemSelectedAnnounceMsg',\r\n defaultMessage: 'Property selected',\r\n },\r\n createAdunit: {\r\n id: 'createAdunit',\r\n defaultMessage: 'Create new ad unit',\r\n },\r\n newAudienceAd: {\r\n id: 'newAudienceAd',\r\n defaultMessage: 'New audience ad',\r\n },\r\n nativeAdOptionLabel: {\r\n id: 'nativeAdOptionLabel',\r\n defaultMessage: 'Native/Audience ad \\n\\n Match the look of your site and fit in between posts and listings.',\r\n },\r\n searchAdOptionLabel: {\r\n id: 'searchAdOptionLabel',\r\n defaultMessage: 'Search ad \\n\\n Coming soon',\r\n },\r\n otherAdOptionLabel: {\r\n id: 'otherAdOptionLabel',\r\n defaultMessage: 'Other ad \\n\\n Coming soon',\r\n },\r\n nativeAdDesc: {\r\n id: 'nativeAdDesc',\r\n defaultMessage: 'Match the look of your site and fit in between posts and listings.',\r\n },\r\n seeExample: {\r\n id: 'seeExample',\r\n defaultMessage: 'See example',\r\n },\r\n comingSoon: {\r\n id: 'comingSoon',\r\n defaultMessage: 'Coming soon',\r\n },\r\n templatePanelTitle: {\r\n id: 'templatePanelTitle',\r\n defaultMessage: 'Choose a template and style to match the feeds on your page',\r\n },\r\n\r\n mediationHeader: {\r\n id: 'mediationSetupMessages.mediationHeader',\r\n defaultMessage: 'Mediation set up',\r\n },\r\n mediationDescription: {\r\n id: 'mediationSetupMessages.mediationDescription',\r\n defaultMessage: `Connect your Google accounts to ensure you are getting the highest bid possible for your ad inventory. We'll only serve our ads if we predict we can deliver a higher payment compared to Google.`,\r\n },\r\n mediationToggleLabel: {\r\n id: 'mediationSetupMessages.mediationToggleLabel',\r\n defaultMessage: 'Enable mediation',\r\n },\r\n nativeAd: {\r\n id: 'nativeAdAccordionCheckboxLabel',\r\n defaultMessage: 'Native Ad',\r\n },\r\n nativeAdSubContent: {\r\n id: 'nativeAdAccordionSubContent',\r\n defaultMessage: 'Match the look of your site and fit in between posts and listings',\r\n },\r\n displayAd: {\r\n id: 'displayAdAccordionCheckboxLabel',\r\n defaultMessage: 'Display Ad',\r\n },\r\n displayAdSubContent: {\r\n id: 'displayAdAccordionSubContent',\r\n defaultMessage: 'Simple image ads that fit in between posts and listings',\r\n },\r\n nativeAdConfigLabel: {\r\n id: 'nativeAd.configuration.label',\r\n defaultMessage: 'Native ad configuration',\r\n },\r\n nativeAdConfigLabelFont: {\r\n id: 'nativeAd.configuration.font.label',\r\n defaultMessage: 'Font',\r\n },\r\n nativeAdConfigLabelTitleColor: {\r\n id: 'nativeAd.configuration.titleColor.label',\r\n defaultMessage: 'Title Color',\r\n },\r\n nativeAdConfigLabelBackgroundColor: {\r\n id: 'nativeAd.configuration.backgroundColor.label',\r\n defaultMessage: 'Background Color',\r\n },\r\n nativeAdConfigLabelButtonBackgroundColor: {\r\n id: 'nativeAd.configuration.buttonBackgroundColor.label',\r\n defaultMessage: 'Button Background Color',\r\n },\r\n nativeAdConfigMsgBarContent: {\r\n id: 'nativeAd.configuration.messageBar.content',\r\n defaultMessage: 'Ads might look different from the preview shown.',\r\n },\r\n displayAdMsgBarContent: {\r\n id: 'displayAd.configuration.messageBar.content',\r\n defaultMessage:\r\n 'Smart auto-sizing will adapt to your site’s container, and so the actual ads served might look slightly different from the examples shown. For smart auto-sizing to work, {displayAdMsgBarLink}',\r\n },\r\n displayAdMsgBarLink: {\r\n id: 'displayAd.configuration.messageBar.link',\r\n defaultMessage: 'ensure you have properly defined your container sizes',\r\n },\r\n adPreview: {\r\n id: 'adType.preview.title',\r\n defaultMessage: 'Ad Preview',\r\n },\r\n adPreviewContainerSize: {\r\n id: 'adType.preview.container.size.label',\r\n defaultMessage: 'Container size',\r\n },\r\n warningAdUnitTypeNotSelected: {\r\n id: 'adType.warning.notSelected',\r\n defaultMessage: 'At least one ad unit type should be selected.',\r\n },\r\n warningAdUnitTypeNotFullySelected: {\r\n id: 'adType.warning.notFullySelected',\r\n defaultMessage: 'Selecting fewer ad types may reduce monetization.',\r\n },\r\n saveAndGetCode: {\r\n id: 'tython.adunit.create.submit.label',\r\n defaultMessage: 'Save and get code',\r\n },\r\n finishAdUnitCreation: {\r\n id: 'tython.adunit.create.submit.aftercode',\r\n defaultMessage: 'Finish',\r\n },\r\n comingSoonMsg: {\r\n id: 'tython.adunit.create.type.display.intro.msg',\r\n defaultMessage: 'Coming Soon',\r\n },\r\n selectDisplayAdLayout: {\r\n id: 'tython.adunit.create.type.display.layout.selection',\r\n defaultMessage: 'Pick a layout for your display ad',\r\n },\r\n displayAdPreviewHeadline: {\r\n id: 'tython.adunit.create.type.display.preview.headline',\r\n defaultMessage: 'Lorem ipsum dolor sit amet',\r\n },\r\n displayAdPreviewTextContent: {\r\n id: 'tython.adunit.create.type.display.preview.text.content',\r\n defaultMessage:\r\n 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',\r\n },\r\n displayAdPreviewLearnMoreButton: {\r\n id: 'tython.adunit.create.type.display.preview.learnMore.button',\r\n defaultMessage: 'LEARN MORE',\r\n },\r\n displayAdPreviewExamplePrimaryTitle: {\r\n id: 'tython.adunit.create.type.display.preview.primary.title',\r\n defaultMessage: 'Example 1',\r\n },\r\n displayAdPreviewExampleSecondaryTitle: {\r\n id: 'tython.adunit.create.type.display.preview.secondary.title',\r\n defaultMessage: 'Example 2',\r\n },\r\n displayAdPreviewExampleTertiaryTitle: {\r\n id: 'tython.adunit.create.type.display.preview.tertiary.title',\r\n defaultMessage: 'Example 3',\r\n },\r\n requiredFeedbackSignalsLabel: {\r\n id: 'requiredFeedbackSignals.label',\r\n defaultMessage: 'Required feedback signals',\r\n },\r\n requiredImpressionFeedbackSignalOptionLabel: {\r\n id: 'requiredImpressionFeedbackSignalOption.radio.label',\r\n defaultMessage: 'Impression feedback (usually required for native ads and not search ads)',\r\n },\r\n defaultAdUnitName: {\r\n id: 'tython.default.adUnit.name',\r\n defaultMessage: 'Ad unit {number}',\r\n },\r\n adunitErrorInForm: {\r\n id: 'tython.adunits.adunitErrorInForm',\r\n defaultMessage: 'Adunit - You have {count} errors in the form, please fix them to continue.',\r\n },\r\n createdAdunitSuccess: {\r\n id: 'tython.adunits.createdAdunitSuccess',\r\n defaultMessage: 'Created new adunit {id} success',\r\n },\r\n editedAdunitSuccess: {\r\n id: 'tython.adunits.editedAdunitSuccess',\r\n defaultMessage: 'Edited adunit {id} success',\r\n },\r\n loadPropertyFailedInAdunit: {\r\n id: 'tython.adunit.loadPropertyFailedInAdunit',\r\n defaultMessage: 'Load property failed, please try again later.',\r\n },\r\n});\r\n","import { string } from 'yup';\r\nimport { StringListTransformerYupType } from '../../../../utils/validation';\r\n\r\nconst alphaNumericRegex = /^[a-zA-Z0-9]+$/;\r\nconst minStrLength = 4;\r\nconst maxStrLength = 10;\r\n\r\nexport const PartnerCodesValidationSchema = new StringListTransformerYupType()\r\n .of(\r\n string()\r\n .matches(alphaNumericRegex, 'Partner Code should be alphanumeric')\r\n .min(minStrLength, `Partner Code should be at least ${minStrLength} characters long`)\r\n .max(maxStrLength, `Partner Code should be no more than ${maxStrLength} characters long`)\r\n )\r\n .test('is-unique', 'Partner Codes should be unique', function (partnerCodeList) {\r\n if (!partnerCodeList) {\r\n return true;\r\n }\r\n\r\n // Check if the list has any duplicates. Eg: ['PC1', 'pC1'] is not valid.\r\n const partnerCodesWithoutDuplicates = new Set(\r\n partnerCodeList.map(item => item.toLowerCase()));\r\n\r\n return partnerCodesWithoutDuplicates.size === partnerCodeList.length;\r\n });\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport {\r\n AdUnit,\r\n AdUnitMarketClassification,\r\n AdUnitRPSGuarantee,\r\n AdUnitType,\r\n ApiError,\r\n getAppStore,\r\n IAdUnitClassification,\r\n IAdUnitFinancialClassification,\r\n NativeAdTemplate,\r\n onNavigateBack,\r\n onNotificationChanged,\r\n onSavingChanged,\r\n postEntity,\r\n putEntity,\r\n showErrorToastNotification,\r\n showSuccessToastNotification,\r\n} from '../../../../../@data';\r\nimport { isTythonSelfServeUser } from '../../../../../@data/utils/checkUserType';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport { StepState } from '../../../../../layout/DetailPageWithStepper/DetailPageWithStepper.types';\r\nimport { stringToList, validateSchema } from '../../../../../utils';\r\nimport { RouteName } from '../../../@data';\r\nimport { createReturnUrl } from '../../../@data/services/AdManagementService';\r\nimport messages from '../../Create/CreateAdunit.messages';\r\nimport { onAdunitErrorChanged, onAdunitIdChanged, onFormCleared, onFormSubmitted, onPanelOpenChanged } from '../actions';\r\nimport { setAdUnitsData } from '../mutatorActions';\r\nimport { disableAdunitMediationStatus, enableAdunitMediationStatus } from '../services/AdunitService';\r\nimport { adunitErrorModel } from '../store/schema/AdunitErrorModel';\r\nimport { getAdunitStore } from '../store/store';\r\n\r\norchestrator(onFormSubmitted, async (msg) => {\r\n const { publisher, userContext, account } = getAppStore();\r\n const { active, raw, template } = getAdunitStore();\r\n\r\n let notification: INotificationBarItem = {};\r\n\r\n if (publisher && account && raw) {\r\n const body: AdUnit = {\r\n ...raw,\r\n id: active.id,\r\n name: active.name,\r\n };\r\n\r\n try {\r\n await validateSchema(adunitErrorModel(), active);\r\n onAdunitErrorChanged();\r\n } catch (e) {\r\n Log.error(e);\r\n onAdunitErrorChanged(e);\r\n showErrorToastNotification({\r\n textMessageDescriptor: messages.adunitErrorInForm,\r\n intlMessageValues: { count: Object.keys(e).length },\r\n });\r\n\r\n return;\r\n }\r\n\r\n onSavingChanged(true);\r\n\r\n const classification: IAdUnitClassification = {\r\n marketClassification: active.marketClassification ? active.marketClassification : AdUnitMarketClassification.Syndicated,\r\n financialClassification: active.existingFinancialClassification\r\n ? active.existingFinancialClassification\r\n : ({\r\n rpsGuarantee: AdUnitRPSGuarantee.None,\r\n } as IAdUnitFinancialClassification),\r\n };\r\n\r\n body.accountId = account ? account.id : 0;\r\n body.adUnitType = AdUnitType.Search;\r\n body.classification = classification;\r\n body.attributes = active.businessModel && active.businessModel !== 0 ? { Taxonomy: active.businessModel } : undefined;\r\n body.channelIds = active.channelsSelected ? active.channelsSelected.map((m) => m.id) : [];\r\n body.publisherGroupConfiguration = active.publisherGroupConfig;\r\n body.servingCostTier = active.servingTier;\r\n body.partnerCodes = stringToList(active.distributionPartnerCodes);\r\n body.propertyId = active.propertySelected ? active.propertySelected.id : undefined;\r\n body.requireImpressionFeedbackForBillableTraffic = !!active.isImpressionFeedbackRequired;\r\n\r\n body.storeIds = active.storeIds\r\n ? active.storeIds\r\n .split('\\n')\r\n .filter((i) => i !== '')\r\n .map((id) => +id)\r\n : [];\r\n\r\n try {\r\n let entity: AdUnit | undefined;\r\n\r\n if (\r\n msg.mode === FormState.Edit ||\r\n msg.mode === FormState.InPageEdit ||\r\n msg.mode === FormState.MultiStepEdit ||\r\n (msg.mode === FormState.MultiStepCreation && msg.stepState === StepState.Dirty)\r\n ) {\r\n // while adunit is being edited when all accounts is set in manage page\r\n body.accountId = raw.accountId;\r\n entity = await putEntity([publisher], body, userContext, AdUnit, new URLSearchParams([['type', 'Search']]));\r\n showSuccessToastNotification({ textMessageDescriptor: messages.editedAdunitSuccess, intlMessageValues: { id: entity.id } });\r\n\r\n if (entity) {\r\n const adUnitsGrid = getAdunitStore().adUnitsRaw.data;\r\n const propertyUrl = adUnitsGrid?.find((adUnit) => adUnit.id === entity?.id)?.propertyUrl;\r\n entity.propertyUrl = propertyUrl;\r\n }\r\n\r\n const adUnitsRawData = getAdunitStore().adUnitsRaw.data;\r\n if (adUnitsRawData && entity) {\r\n const data = adUnitsRawData.map((adUnit) => (adUnit.id === entity?.id ? entity! : adUnit));\r\n setAdUnitsData(data);\r\n }\r\n\r\n try {\r\n const isBoost = sessionStorage.getItem('IsBoostPublisher');\r\n if (template && isBoost === 'true' && JSON.stringify(template) !== JSON.stringify(active.BoostTemplate)) {\r\n entity.className = new AdUnit().className;\r\n template.className = new NativeAdTemplate().className;\r\n await putEntity([publisher, entity], template, userContext, NativeAdTemplate);\r\n }\r\n } catch (e) {\r\n Log.error(e);\r\n const apiErrorObj = e as ApiError;\r\n const errMsg = apiErrorObj.message;\r\n notification = {\r\n text: `Boost Template Upload Failed for adunit \"${entity.id} , caught an error \"${errMsg}\"`,\r\n messageBarType: MessageBarType.error,\r\n };\r\n }\r\n } else {\r\n entity = await postEntity([publisher], AdUnit, body, userContext, new URLSearchParams([['type', 'Search']]));\r\n\r\n if (entity && entity.id) {\r\n onAdunitIdChanged(entity.id);\r\n }\r\n showSuccessToastNotification({ textMessageDescriptor: messages.createdAdunitSuccess, intlMessageValues: { id: entity.id } });\r\n\r\n try {\r\n if (template) {\r\n entity.className = new AdUnit().className;\r\n template.className = new NativeAdTemplate().className;\r\n await postEntity([publisher, entity], NativeAdTemplate, template, userContext);\r\n }\r\n } catch (e) {\r\n Log.error(e);\r\n const apiErrorObj = e as ApiError;\r\n const errMsg = apiErrorObj.message;\r\n notification = {\r\n text: `Boost Template Upload Failed for adunit \"${entity.id}, caught an error \"${errMsg}\"`,\r\n messageBarType: MessageBarType.error,\r\n };\r\n onNotificationChanged(notification);\r\n }\r\n }\r\n\r\n onPanelOpenChanged(false, body.propertyId, entity.id);\r\n\r\n const returnUrl = createReturnUrl(\r\n RouteName.adunit,\r\n String(publisher.id),\r\n String(account.id),\r\n String(entity.id),\r\n isTythonSelfServeUser() ? msg.mode : undefined\r\n );\r\n // return to manage page if the adunit creation isn't multi-step process (for tython users only)\r\n onNavigateBack(msg.routeHistory, returnUrl);\r\n if (!isTythonSelfServeUser()) {\r\n onFormCleared();\r\n }\r\n\r\n if (active.adSenseMediationStatus !== active.adSenseMediationToggle && msg.shouldHandleMediation) {\r\n if (active.adSenseMediationToggle) {\r\n enableAdunitMediationStatus(publisher, account, [active?.id!]);\r\n } else {\r\n disableAdunitMediationStatus(publisher, account, [active?.id!]);\r\n }\r\n }\r\n\r\n // proceed to the next step in the creation process (for tython users only)\r\n if (msg.onSubmit) {\r\n msg.onSubmit();\r\n }\r\n } catch (e) {\r\n Log.error(e);\r\n const apiErrorObj = e as ApiError;\r\n let errMsg = apiErrorObj.message;\r\n errMsg = errMsg.substring(errMsg.indexOf(`{\"errors\":`));\r\n notification = {\r\n text: errMsg.includes('InvalidPartnerCodes')\r\n ? 'One of the Search Distribution Partner Codes is already associated with another adunit'\r\n : `Submitting the adunit form \"${FormState[msg.mode]}\" caught an error \"${errMsg}\"`,\r\n messageBarType: MessageBarType.error,\r\n };\r\n onNotificationChanged(notification);\r\n } finally {\r\n onSavingChanged(false);\r\n }\r\n } else {\r\n notification = {\r\n text: `Adunit form \"${FormState[msg.mode]}\" is invalid id ${active.id}`,\r\n messageBarType: MessageBarType.warning,\r\n };\r\n onNotificationChanged(notification);\r\n }\r\n});\r\n","import { mixed, number, object, string } from 'yup';\r\nimport { AdUnitType, IdNamePairErrorModel } from '../../../../../../@data/store/schema';\r\nimport { PartnerCodesValidationSchema } from '../../../../../../@data/store/schema/viewmodels/PartnerCodesValidationModel';\r\nimport { isTythonSelfServeUser } from '../../../../../../@data/utils/checkUserType';\r\nimport { ArrayObservableSchemaYupType, StringListSchemaYupType } from '../../../../../../utils/validation';\r\nimport { IAdunitViewModel } from './IAdunitViewModel';\r\n\r\nexport function adunitErrorModel() {\r\n return object<IAdunitViewModel>().shape({\r\n name: string().trim().required(),\r\n channelsSelected: new ArrayObservableSchemaYupType().of(IdNamePairErrorModel),\r\n storeIds: new StringListSchemaYupType().of(number().integer()),\r\n distributionPartnerCodes: PartnerCodesValidationSchema,\r\n propertySelected: isTythonSelfServeUser() ? string().required() : string(),\r\n adUnitType: isTythonSelfServeUser() ? mixed<AdUnitType>().required() : string()\r\n });\r\n}\r\n","import { when } from 'mobx';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { getAppStore, isTythonSelfServeUser } from '../../../../../@data';\r\nimport { AdSenseOAuthStatus } from '../../../../../@data/store/schema/enums/AdSenseOAuthStatus';\r\nimport { getGoogleAdSenseStore } from '../../../Account/Settings/components/GoogleConnector/@data';\r\nimport { onInitializeGoogleAccount as fetchAdSenseAccount } from '../../../Account/Settings/components/GoogleConnector/@data/actions';\r\nimport { fetchAdUnitsDataAction } from '../actions';\r\nimport { onManagePageInitialized } from '../actions/onManagePageInitialized';\r\nimport { setAdUnitsLoading } from '../mutatorActions';\r\nimport { getAdunitStore } from '../store/store';\r\n\r\norchestrator(onManagePageInitialized, async () => {\r\n const { publisher, account, userContext } = getAppStore();\r\n const { active } = getGoogleAdSenseStore();\r\n const {\r\n adUnitsRaw: { data },\r\n } = getAdunitStore();\r\n\r\n if (publisher && account && userContext) {\r\n if (data === undefined || data.length === 0) {\r\n setAdUnitsLoading(true);\r\n }\r\n\r\n if (isTythonSelfServeUser()) {\r\n fetchAdSenseAccount(false, false);\r\n await when(() => {\r\n const { active: googleAdSenseActive } = getGoogleAdSenseStore();\r\n return !!googleAdSenseActive.connectionStatus;\r\n });\r\n }\r\n fetchAdUnitsDataAction();\r\n\r\n await when(() => {\r\n const { adUnitsRaw } = getAdunitStore();\r\n if (adUnitsRaw.data !== undefined) {\r\n setAdUnitsLoading(false);\r\n return true;\r\n }\r\n return false;\r\n });\r\n\r\n if (isTythonSelfServeUser() && active.connectionStatus === AdSenseOAuthStatus.Success) {\r\n // wait when data inside adUnitRaw is set with the new response data\r\n await when(() => {\r\n const { adUnitsRaw } = getAdunitStore();\r\n return !!adUnitsRaw.data?.[0]?.mediatedWithAdSense;\r\n });\r\n }\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { getAppStore, showErrorToastNotification } from '../../../../../@data';\r\nimport messages from '../../Manage/ManagePage.messages';\r\nimport { updateAdUnitMediationStatus } from '../actions';\r\nimport { updateAdunitMediationStatus } from '../services/AdunitService';\r\n\r\norchestrator(updateAdUnitMediationStatus, async ({ adUnits, state }) => {\r\n const { publisher, account } = getAppStore();\r\n\r\n if (publisher && account) {\r\n try {\r\n await updateAdunitMediationStatus(publisher, account, adUnits, state);\r\n } catch (error) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.adunitMediationUpdateStatusFailed });\r\n Log.error(`Error while updating adUnits' mediation status: ${error}`);\r\n }\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { AdUnit, ApiError, getAppStore, putEntity, showErrorToastNotification, showSuccessToastNotification } from '../../../../../@data';\r\nimport messages from '../../Manage/ManagePage.messages';\r\nimport { onAdUnitNameUpdate } from '../actions';\r\nimport { setAdUnitsData } from '../mutatorActions';\r\nimport { getAdunitStore } from '../store/store';\r\n\r\norchestrator(onAdUnitNameUpdate, async ({ formatMessage, setIsLoading, setErrorMessage, setVisibleCallOut }) => {\r\n const { publisher, userContext, account } = getAppStore();\r\n const { active, raw } = getAdunitStore();\r\n\r\n if (active.name?.trim().length === 0) {\r\n setErrorMessage(formatMessage(messages.adunitNameInvalid));\r\n return;\r\n }\r\n\r\n if (publisher && account && raw) {\r\n const body: AdUnit = {\r\n ...raw,\r\n id: active.id,\r\n name: active.name,\r\n };\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n let entity: AdUnit | undefined;\r\n\r\n // while adunit is being edited when all accounts is set in manage page\r\n body.accountId = raw.accountId;\r\n entity = await putEntity([publisher], body, userContext, AdUnit, new URLSearchParams([['type', 'Search']]));\r\n\r\n showSuccessToastNotification({ textMessageDescriptor: messages.editedAdunitSuccess, intlMessageValues: { id: entity.id } });\r\n\r\n let adUnitsRawData = [...(getAdunitStore().adUnitsRaw.data || [])];\r\n if (adUnitsRawData && entity) {\r\n adUnitsRawData = adUnitsRawData.map((adUnit) => {\r\n const adUnitData = { ...adUnit };\r\n if (adUnitData.id === entity?.id) {\r\n adUnitData.name = entity?.name;\r\n return adUnitData;\r\n } else {\r\n return adUnit;\r\n }\r\n });\r\n setAdUnitsData(adUnitsRawData);\r\n }\r\n } catch (e) {\r\n Log.error(e);\r\n const apiErrorObj = e as ApiError;\r\n let errMsg = apiErrorObj.message;\r\n errMsg = errMsg.substring(errMsg.indexOf(`{\"errors\":`));\r\n showErrorToastNotification({ text: `Update adunit name caught an error \"${errMsg}\"` });\r\n } finally {\r\n setIsLoading(false);\r\n setVisibleCallOut(0);\r\n }\r\n } else {\r\n showErrorToastNotification({ textMessageDescriptor: messages.adUnitInvalidId, intlMessageValues: { id: active.id } });\r\n setVisibleCallOut(0);\r\n }\r\n});\r\n","import { IPropertyPickerStyleProps, IPropertyPickerStyles } from './PropertyPicker.types';\r\n\r\nexport const getStyles = (props: IPropertyPickerStyleProps): IPropertyPickerStyles => {\r\n const { theme } = props;\r\n\r\n return {\r\n searchBox: {\r\n width: 342,\r\n marginTop: theme.spacing.s1,\r\n },\r\n list: {\r\n flex: 1,\r\n overflowY: 'auto',\r\n },\r\n listItem: {\r\n padding: theme.spacing.s1,\r\n selectors: {\r\n '&:focus, &:hover': {\r\n backgroundColor: theme.palette.neutralLight,\r\n },\r\n },\r\n },\r\n listItemLabel: [\r\n theme.fonts.medium,\r\n {\r\n flex: 1,\r\n textOverflow: 'ellipsis',\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n },\r\n ],\r\n };\r\n};\r\n","/* eslint-disable jsx-a11y/interactive-supports-focus */\r\nimport {\r\n ActionButton,\r\n Announced,\r\n Callout,\r\n classNamesFunction,\r\n DirectionalHint,\r\n FocusZone,\r\n FocusZoneDirection,\r\n getTheme,\r\n IProcessedStyleSet,\r\n SearchBox\r\n} from '@fluentui/react';\r\nimport React from 'react';\r\nimport { isButtonPressKey } from '../../utils/AccessibilityUtils';\r\nimport { getScreenReaderTextStyles } from '../../utils/GlobalStyleUtils';\r\nimport { getStyles } from './PropertyPicker.styles';\r\nimport { IPropertyPickerItem, IPropertyPickerProps, IPropertyPickerStyleProps, IPropertyPickerStyles } from './PropertyPicker.types';\r\n\r\ninterface IPropertyPickerState {\r\n filteredItems: IPropertyPickerItem[];\r\n isCalloutVisible: boolean;\r\n announceItemSelected: boolean;\r\n}\r\n\r\nconst getClassNames = classNamesFunction<IPropertyPickerStyleProps, IPropertyPickerStyles>();\r\n\r\nexport class PropertyPicker extends React.Component<IPropertyPickerProps, IPropertyPickerState> {\r\n private _classNames: IProcessedStyleSet<IPropertyPickerStyles>;\r\n\r\n constructor(props: IPropertyPickerProps) {\r\n super(props);\r\n\r\n this.state = {\r\n filteredItems: props.items,\r\n isCalloutVisible: false,\r\n announceItemSelected: false,\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: IPropertyPickerProps) {\r\n if (prevProps.items !== this.props.items) {\r\n this.setState({\r\n filteredItems: this.props.items,\r\n });\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const theme = getTheme();\r\n this._classNames = getClassNames(getStyles, { theme });\r\n const {\r\n createButtonLabel,\r\n onCreateButtonClick,\r\n isCreateButtonDisabled,\r\n searchBoxPlaceholder,\r\n onListItemClicked,\r\n propertyOptionsAriaLabel,\r\n createButtonAriaDescription,\r\n searchBoxAriaDescription,\r\n itemSelectedAnnounceMessage,\r\n } = this.props;\r\n\r\n const listItems: JSX.Element[] = [];\r\n\r\n // add empty item to allow deselecting a selected property\r\n listItems.push(\r\n <div\r\n className={this._classNames.listItem}\r\n key={0}\r\n onClick={() => {\r\n onListItemClicked(undefined);\r\n this.setState({ isCalloutVisible: false });\r\n }}\r\n onKeyDown={(ev) => {\r\n if (isButtonPressKey(ev.key)) {\r\n onListItemClicked(undefined);\r\n this.setState({ isCalloutVisible: false });\r\n }\r\n }}\r\n role=\"option\"\r\n aria-selected={false}\r\n data-is-focusable={true}\r\n >\r\n {this.props.emptyOptionLabel ? this.props.emptyOptionLabel : ''}\r\n </div>\r\n );\r\n\r\n this.state.filteredItems.forEach((item: IPropertyPickerItem, index: number) => {\r\n listItems.push(\r\n <div\r\n className={this._classNames.listItem}\r\n key={item.id}\r\n onClick={() => {\r\n onListItemClicked(item);\r\n this.setState({ isCalloutVisible: false, announceItemSelected: true });\r\n }}\r\n onKeyDown={(ev) => {\r\n if (isButtonPressKey(ev.key)) {\r\n onListItemClicked(item);\r\n this.setState({ isCalloutVisible: false, announceItemSelected: true });\r\n }\r\n }}\r\n role=\"option\"\r\n aria-selected={false}\r\n data-is-focusable={true}\r\n data-item-index={index}\r\n >\r\n <span className={this._classNames.listItemLabel}>{item.id + ' - (' + item.url + ')'}</span>\r\n </div>\r\n );\r\n });\r\n\r\n return (\r\n <>\r\n {this.state.announceItemSelected && <Announced message={itemSelectedAnnounceMessage} aria-live=\"assertive\" />}\r\n <ActionButton\r\n iconProps={{ iconName: 'add' }}\r\n onClick={onCreateButtonClick}\r\n disabled={isCreateButtonDisabled}\r\n ariaDescription={createButtonAriaDescription}\r\n >\r\n {createButtonLabel}\r\n </ActionButton>\r\n\r\n <div id={'searchBox'} className={this._classNames.searchBox}>\r\n <SearchBox\r\n placeholder={searchBoxPlaceholder}\r\n underlined={true}\r\n onChange={(_, filter: string) => this._onCallSuggestionsChanged(filter)}\r\n onSearch={() => this.setState({ isCalloutVisible: true })}\r\n aria-describedby={'searchBoxAriaDesc'}\r\n />\r\n </div>\r\n {this.state.isCalloutVisible ? (\r\n <Callout\r\n target={'#searchBox'}\r\n directionalHint={DirectionalHint.bottomLeftEdge}\r\n gapSpace={0}\r\n isBeakVisible={false}\r\n calloutWidth={400}\r\n preventDismissOnScroll={true}\r\n setInitialFocus={true}\r\n onDismiss={() => this.setState({ isCalloutVisible: false })}\r\n onKeyDown={(ev: React.KeyboardEvent<HTMLDivElement>) => {\r\n // Earlier clicking tab was taking focus out of context and hence breaking the navigation order\r\n // Dismissing the callout makes sure that it will focus on the next active element in the tab order.\r\n if (ev.key === 'Tab' || (ev.shiftKey && ev.key === 'Tab')) {\r\n this.setState({ isCalloutVisible: false });\r\n }\r\n }}\r\n >\r\n <FocusZone\r\n direction={FocusZoneDirection.vertical}\r\n isCircularNavigation={true}\r\n role=\"listbox\"\r\n aria-labelledby={'propertyOptionsAriaLabel'}\r\n >\r\n {listItems}\r\n </FocusZone>\r\n </Callout>\r\n ) : null}\r\n <span id=\"propertyOptionsAriaLabel\" style={getScreenReaderTextStyles()}>\r\n {propertyOptionsAriaLabel}\r\n </span>\r\n <span id=\"searchBoxAriaDesc\" style={getScreenReaderTextStyles()}>\r\n {searchBoxAriaDescription}\r\n </span>\r\n </>\r\n );\r\n }\r\n\r\n private _onCallSuggestionsChanged = (filter: string) => {\r\n const filteredItems = this.props.items.filter((p) => {\r\n const idUrlString = p.id.toString() + p.url.toLocaleLowerCase();\r\n return idUrlString.indexOf(filter.toLocaleLowerCase()) !== -1;\r\n });\r\n\r\n this.setState({ filteredItems: filteredItems });\r\n };\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n adUnitSiteLoading: {\r\n id: 'tython.adunit.site.isLoading',\r\n defaultMessage: 'Loading...',\r\n },\r\n});\r\n","import { IPropertySitePickerStyleProps, IPropertySitePickerStyles } from './PropertySitePicker.types';\r\n\r\nexport const getStyles = (props: IPropertySitePickerStyleProps): IPropertySitePickerStyles => {\r\n const { theme } = props;\r\n\r\n return {\r\n searchBox: {\r\n width: 440,\r\n height: 32,\r\n marginTop: theme.spacing.s1,\r\n borderRadius: '2px',\r\n textDecorationColor: theme.palette.green,\r\n },\r\n list: {\r\n flex: 1,\r\n overflowY: 'auto',\r\n },\r\n listItem: {\r\n padding: theme.spacing.s1,\r\n selectors: {\r\n '&:focus, &:hover': {\r\n backgroundColor: theme.palette.neutralLight,\r\n },\r\n },\r\n },\r\n listItemLabel: [\r\n theme.fonts.medium,\r\n {\r\n flex: 1,\r\n textOverflow: 'ellipsis',\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n },\r\n ],\r\n searchContent: [\r\n {\r\n icon: {\r\n display: 'none',\r\n },\r\n iconContainer: {\r\n display: 'none',\r\n },\r\n field: {\r\n padding: '0px 4px',\r\n },\r\n },\r\n ],\r\n };\r\n};\r\n","/* eslint-disable jsx-a11y/interactive-supports-focus */\r\nimport {\r\n Announced,\r\n Callout,\r\n classNamesFunction,\r\n DirectionalHint,\r\n FocusZone,\r\n FocusZoneDirection,\r\n getTheme,\r\n IProcessedStyleSet,\r\n Label,\r\n SearchBox,\r\n} from '@fluentui/react';\r\nimport React from 'react';\r\nimport { getScreenReaderTextStyles } from '../../utils/GlobalStyleUtils';\r\nimport messages from './PropertySitePicker.messages';\r\nimport { getStyles } from './PropertySitePicker.styles';\r\nimport {\r\n IPropertySitePickerItem,\r\n IPropertySitePickerProps,\r\n IPropertySitePickerStyleProps,\r\n IPropertySitePickerStyles,\r\n} from './PropertySitePicker.types';\r\ninterface IPropertySitePickerState {\r\n searchText: string;\r\n filteredItems: IPropertySitePickerItem[];\r\n isCalloutVisible: boolean;\r\n announceItemSelected: boolean;\r\n}\r\n\r\nconst getClassNames = classNamesFunction<IPropertySitePickerStyleProps, IPropertySitePickerStyles>();\r\n\r\nexport class PropertySitePicker extends React.Component<IPropertySitePickerProps, IPropertySitePickerState> {\r\n private _classNames: IProcessedStyleSet<IPropertySitePickerStyles>;\r\n\r\n constructor(props: IPropertySitePickerProps) {\r\n super(props);\r\n\r\n this.state = {\r\n searchText: '',\r\n filteredItems: props.items,\r\n isCalloutVisible: false,\r\n announceItemSelected: false,\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: IPropertySitePickerProps) {\r\n if (prevProps.items !== this.props.items) {\r\n this.setState({\r\n filteredItems: this.props.items,\r\n });\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const theme = getTheme();\r\n this._classNames = getClassNames(getStyles, { theme });\r\n const {\r\n title,\r\n searchBoxPlaceholder,\r\n onListItemClicked,\r\n propertyOptionsAriaLabel,\r\n searchBoxAriaDescription,\r\n itemSelectedAnnounceMessage,\r\n isLoading,\r\n isDisabled,\r\n clearSearchOnSelect,\r\n formatMessage,\r\n } = this.props;\r\n const { searchText, filteredItems, isCalloutVisible, announceItemSelected } = this.state;\r\n\r\n const listItems: JSX.Element[] = [];\r\n\r\n listItems.push(\r\n <div\r\n className={this._classNames.listItem}\r\n key={0}\r\n onClick={() => {\r\n onListItemClicked(undefined);\r\n this.setState({ isCalloutVisible: false });\r\n }}\r\n onKeyDown={(ev) => {\r\n if (ev.key === 'Enter' || ev.key === ' ') {\r\n onListItemClicked(undefined);\r\n this.setState({ isCalloutVisible: false });\r\n }\r\n }}\r\n role=\"option\"\r\n aria-selected={false}\r\n data-is-focusable={true}\r\n >\r\n {this.props.emptyOptionLabel ? this.props.emptyOptionLabel : ''}\r\n </div>\r\n );\r\n\r\n filteredItems.forEach((item: IPropertySitePickerItem, index: number) => {\r\n listItems.push(\r\n <div\r\n className={this._classNames.listItem}\r\n key={item.id}\r\n onClick={() => {\r\n onListItemClicked(item);\r\n this.setState({\r\n isCalloutVisible: false,\r\n announceItemSelected: true,\r\n searchText: clearSearchOnSelect ? '' : searchText,\r\n });\r\n }}\r\n onKeyDown={(ev) => {\r\n if (ev.key === 'Enter' || ev.key === ' ') {\r\n onListItemClicked(item);\r\n this.setState({\r\n isCalloutVisible: false,\r\n announceItemSelected: true,\r\n searchText: clearSearchOnSelect ? '' : searchText,\r\n });\r\n }\r\n }}\r\n // eslint-disable-next-line jsx-a11y/role-has-required-aria-props\r\n role=\"option\"\r\n // TODO: add i18n\r\n aria-label={`${item.id + ' - (' + item.url + ')'} ${searchBoxPlaceholder?.includes(`${item.id}`) ? 'selected' : 'not selected'}`}\r\n data-is-focusable={true}\r\n data-item-index={index}\r\n >\r\n <span className={this._classNames.listItemLabel}>{item.id + ' - (' + item.url + ')'}</span>\r\n </div>\r\n );\r\n });\r\n\r\n return (\r\n <>\r\n {announceItemSelected && <Announced message={itemSelectedAnnounceMessage} aria-live=\"assertive\" />}\r\n\r\n <div id={'searchBox'} className={this._classNames.searchBox}>\r\n <Label required={true}>{title}</Label>\r\n <SearchBox\r\n styles={{\r\n iconContainer: {\r\n display: 'none',\r\n },\r\n field: {\r\n padding: '0px 4px',\r\n },\r\n }}\r\n value={searchText}\r\n placeholder={isLoading ? formatMessage(messages.adUnitSiteLoading) : searchBoxPlaceholder}\r\n required={true}\r\n underlined={false}\r\n onChange={(_, filter: string) => {\r\n this.setState({ searchText: filter });\r\n this._onCallSuggestionsChanged(filter);\r\n }}\r\n onSearch={() => this.setState({ isCalloutVisible: true })}\r\n aria-describedby={'searchBoxAriaDesc'}\r\n onClick={() => {\r\n this.setState({ isCalloutVisible: true });\r\n }}\r\n disabled={isLoading || isDisabled}\r\n ariaLabel={title}\r\n />\r\n </div>\r\n {isCalloutVisible ? (\r\n <Callout\r\n target={'#searchBox'}\r\n directionalHint={DirectionalHint.bottomLeftEdge}\r\n gapSpace={0}\r\n isBeakVisible={false}\r\n calloutWidth={400}\r\n preventDismissOnScroll={true}\r\n setInitialFocus={true}\r\n styles={{ root: { marginTop: '32px' } }}\r\n onDismiss={() => this.setState({ isCalloutVisible: false })}\r\n onKeyDown={(ev: React.KeyboardEvent<HTMLDivElement>) => {\r\n if (ev.key === 'Tab' || (ev.shiftKey && ev.key === 'Tab')) {\r\n this.setState({ isCalloutVisible: false });\r\n }\r\n }}\r\n >\r\n <FocusZone\r\n direction={FocusZoneDirection.vertical}\r\n isCircularNavigation={true}\r\n role=\"listbox\"\r\n aria-labelledby={'propertyOptionsAriaLabel'}\r\n >\r\n {listItems}\r\n </FocusZone>\r\n </Callout>\r\n ) : null}\r\n <span id=\"propertyOptionsAriaLabel\" style={getScreenReaderTextStyles()}>\r\n {propertyOptionsAriaLabel}\r\n </span>\r\n <span id=\"searchBoxAriaDesc\" style={getScreenReaderTextStyles()}>\r\n {searchBoxAriaDescription}\r\n </span>\r\n </>\r\n );\r\n }\r\n\r\n private _onCallSuggestionsChanged = (filter: string) => {\r\n const filteredItems = this.props.items.filter((p) => {\r\n const idUrlString = p.id.toString() + p.url.toLocaleLowerCase();\r\n return idUrlString.indexOf(filter.toLocaleLowerCase()) !== -1;\r\n });\r\n\r\n this.setState({ filteredItems: filteredItems });\r\n };\r\n}\r\n","import { createStore } from 'satcheljs';\r\nimport { IPropertyViewState } from './schema/IPropertyViewState';\r\n\r\nexport const getCreatePropertyStore = createStore<IPropertyViewState>('CreatePropertyState', {\r\n active: {},\r\n errors: {},\r\n isSubmittable: false,\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n propertyId: {\r\n id: 'admanagement.property.propertyId',\r\n defaultMessage: 'Property ID',\r\n },\r\n});\r\n","import { TextField } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { FormItem } from '../../../../../../components/Form';\r\nimport { injectIntlAndObserver } from '../../../../../../utils';\r\nimport messages from './messages';\r\n\r\nexport interface IPropertyIdFieldProps {\r\n id?: number;\r\n}\r\n\r\nconst PropertyIdField = injectIntlAndObserver<InjectedIntlProps & IPropertyIdFieldProps>(({ intl: { formatMessage }, id }) => {\r\n if (id === undefined) {\r\n return null;\r\n }\r\n\r\n return (\r\n <FormItem>\r\n <TextField label={formatMessage(messages.propertyId)} required={true} disabled={true} value={String(id)} />\r\n </FormItem>\r\n );\r\n});\r\n\r\nexport default PropertyIdField;\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { IStringDictionary, Property } from '../../../../../../@data';\r\nimport { mergeTypeWithObject } from '../../../../../../utils';\r\nimport { IClarityParams } from '../../../Manage/components/ClarityPanel/types';\r\nimport { IPropertyViewModel } from '../store/schema';\r\nimport { getCreatePropertyStore } from '../store/store';\r\n\r\nexport const onRawChanged = mutatorAction('onRawChanged', (property?: Property) => {\r\n getCreatePropertyStore().raw = mergeTypeWithObject(new Property(), property);\r\n});\r\n\r\nexport const onPropertyChanged = mutatorAction('onPropertyChanged', (property: IPropertyViewModel) => {\r\n getCreatePropertyStore().active = property;\r\n});\r\n\r\nexport const onPropertyErrorChanged = mutatorAction('onPropertyErrorChanged', (values?: IStringDictionary) => {\r\n const store = getCreatePropertyStore();\r\n if (!store.errors.name && !store.errors.url && !store.errors.approvalStatus && !store.errors.approvalStatusComments && !!values) {\r\n getCreatePropertyStore().errors = values;\r\n } else if (\r\n !!getCreatePropertyStore().errors.name ||\r\n !!getCreatePropertyStore().errors.url ||\r\n !!getCreatePropertyStore().errors.approvalStatus ||\r\n !!getCreatePropertyStore().errors.approvalStatusComments\r\n ) {\r\n getCreatePropertyStore().errors = values || {};\r\n }\r\n});\r\n\r\nexport const onFormCleared = mutatorAction('onFormCleared', () => {\r\n getCreatePropertyStore().active = {};\r\n});\r\n\r\nexport const onFormSubmittable = mutatorAction('onFormSubmittable', (isSubmittable: boolean) => {\r\n getCreatePropertyStore().isSubmittable = isSubmittable;\r\n});\r\n\r\nexport const onIdChanged = mutatorAction('onIdChanged', (id: number) => {\r\n getCreatePropertyStore().active.id = id;\r\n});\r\n\r\nexport const onNameChanged = mutatorAction('onNameChanged', (name: string) => {\r\n getCreatePropertyStore().active.name = name;\r\n});\r\n\r\nexport const onUrlChanged = mutatorAction('onUrlChanged', (url: string) => {\r\n getCreatePropertyStore().active.url = url.trim();\r\n});\r\n\r\nexport const onClarityChanged = mutatorAction('onClarityChanged', (clarity: IClarityParams) => {\r\n getCreatePropertyStore().active.clarity = clarity;\r\n});\r\n\r\nexport const onClarityIdChanged = mutatorAction('onClarityIdChanged', (id?: string) => {\r\n const clarity = getCreatePropertyStore().active.clarity;\r\n if (clarity !== undefined) {\r\n clarity.clarityId = id?.trim();\r\n }\r\n});\r\n\r\nexport const onEditClarityId = mutatorAction('onEditClarityId', (edit: boolean) => {\r\n const clarity = getCreatePropertyStore().active.clarity;\r\n if (clarity) {\r\n clarity.clarityEdit = edit;\r\n }\r\n});\r\n\r\nexport const onSettingClarityErrorMessage = mutatorAction('onSettingClarityErrorMessage', (error: string) => {\r\n const store = getCreatePropertyStore();\r\n store.errors.clarity = error;\r\n const clarity = store.active.clarity;\r\n if (clarity) {\r\n clarity.clarityErrorMessage = error;\r\n }\r\n});\r\n","import { UserRoleEntity, userRoleKey } from '../../../../../../../@data/services/UserRoleService';\r\nimport { Property as PropertyAccessPermissions } from '../../../../../../../@data/store/schema/userrolemodels/Property';\r\n\r\nexport function GetPropertyAccessPermission(): PropertyAccessPermissions | null {\r\n const userRoles = localStorage.getItem(userRoleKey);\r\n if (userRoles === null) {\r\n return null;\r\n }\r\n const userRolesJSON = JSON.parse(userRoles);\r\n\r\n for (const value in userRolesJSON) {\r\n if (value === UserRoleEntity.Property) {\r\n return JSON.parse(userRolesJSON[value]);\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n","import { hasUpdateAccess } from '../../../../../../../@data/services/UserRoleService';\r\nimport { FormState } from '../../../../../../../components/Form';\r\n\r\nexport function IsDisabled(mode: FormState, permission: number): boolean {\r\n if (mode === FormState.Create || mode === FormState.InPageCreate) {\r\n return false;\r\n }\r\n\r\n return !hasUpdateAccess(permission);\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n inputPropertyName: {\r\n id: 'admanagement.property.inputPropertyName',\r\n defaultMessage: 'Property name',\r\n },\r\n inputSiteName: {\r\n id: 'admanagement.site.inputSiteName',\r\n defaultMessage: 'Site name',\r\n },\r\n propertyNameLength: {\r\n id: 'admanagement.property.propertyNameLength',\r\n defaultMessage: 'Maximum of 35 characters',\r\n },\r\n});\r\n","import { TextField } from '@fluentui/react';\r\nimport React, { useEffect, useRef } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { isTythonSelfServeUser } from '../../../../../../@data';\r\nimport { completeAccess } from '../../../../../../@data/services/UserRoleService';\r\nimport AppMessages from '../../../../../../App.messages';\r\nimport { FormItem, FormState } from '../../../../../../components/Form';\r\nimport { PROPERTY_NAME_INPUT } from '../../../../../../constants/DataTestIdConstants';\r\nimport { injectIntlAndObserver } from '../../../../../../utils';\r\nimport { onNameChanged } from '../../__data__/mutatorActions';\r\nimport { getCreatePropertyStore } from '../../__data__/store/store';\r\nimport { GetPropertyAccessPermission } from '../../variations/CreateNonTythonProperty/utils/GetPropertyAccessPermissions';\r\nimport { IsDisabled } from '../../variations/CreateNonTythonProperty/utils/IsFieldDisabled';\r\nimport messages from './messages';\r\n\r\nexport interface IPropertyNameInputFieldProps {\r\n mode: FormState;\r\n}\r\n\r\nconst PropertyNameInputField = injectIntlAndObserver<InjectedIntlProps & IPropertyNameInputFieldProps>(\r\n ({ intl: { formatMessage }, mode }) => {\r\n const {\r\n active: { name },\r\n errors: { name: error },\r\n } = getCreatePropertyStore();\r\n const propertyAccessPermissions = GetPropertyAccessPermission();\r\n const accessLevel = propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.name;\r\n const inputRef = useRef(null);\r\n\r\n useEffect(() => {\r\n if (inputRef.current === null) {\r\n return;\r\n }\r\n const container = document.getElementById('propertyId') as HTMLElement;\r\n const label = container.getElementsByClassName('ms-Label')[0] as HTMLElement;\r\n if (label) {\r\n label.title = formatMessage(AppMessages.required);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [inputRef.current]);\r\n\r\n return (\r\n <FormItem id=\"propertyId\">\r\n <TextField\r\n label={formatMessage(isTythonSelfServeUser() ? messages.inputSiteName : messages.inputPropertyName)}\r\n componentRef={inputRef}\r\n required={true}\r\n aria-required={true}\r\n errorMessage={error}\r\n value={name}\r\n placeholder={formatMessage(messages.propertyNameLength)}\r\n onChange={(_, value) => onNameChanged(value!)}\r\n disabled={IsDisabled(mode, accessLevel)}\r\n data-test-id={PROPERTY_NAME_INPUT}\r\n />\r\n </FormItem>\r\n );\r\n }\r\n);\r\n\r\nexport default PropertyNameInputField;\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n websiteUrl: {\r\n id: 'admanagement.property.websiteUrl',\r\n defaultMessage: 'Website URL',\r\n },\r\n siteUrl: {\r\n id: 'admanagement.property.siteUrl',\r\n defaultMessage: 'Site Domain',\r\n },\r\n websiteUrlExample: {\r\n id: 'admanagement.property.websiteUrlExample',\r\n defaultMessage: 'Enter your Site Domain. ex: www.website.com',\r\n },\r\n websiteUrlInvalidMsg: {\r\n id: 'admanagement.property.websiteUrlInvalidMsg',\r\n defaultMessage: 'Invalid domain',\r\n },\r\n});\r\n","import { TextField } from '@fluentui/react';\r\nimport React, { useEffect, useRef } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { isTythonSelfServeUser } from '../../../../../../@data';\r\nimport AppMessages from '../../../../../../App.messages';\r\nimport { FormItem, FormState } from '../../../../../../components/Form';\r\nimport { PROPERTY_DOMAIN_INPUT } from '../../../../../../constants/DataTestIdConstants';\r\nimport { StepState } from '../../../../../../layout/DetailPageWithStepper/DetailPageWithStepper.types';\r\nimport { injectIntlAndObserver } from '../../../../../../utils';\r\nimport { onPropertyErrorChanged, onUrlChanged } from '../../__data__/mutatorActions';\r\nimport { getCreatePropertyStore } from '../../__data__/store/store';\r\nimport messages from './messages';\r\n\r\nexport interface IPropertyUrlInputFieldProps {\r\n mode: FormState;\r\n stepState?: StepState;\r\n}\r\n\r\nconst PropertyUrlInputField = injectIntlAndObserver<InjectedIntlProps & IPropertyUrlInputFieldProps>(\r\n ({ intl: { formatMessage }, mode, stepState }) => {\r\n const {\r\n active: { url },\r\n errors,\r\n } = getCreatePropertyStore();\r\n const { url: error } = errors;\r\n const inputRef = useRef(null);\r\n const pattern = new RegExp(/^(?!https?:\\/\\/)(?!.*\\/)[\\w.-]+\\.[\\w-]{2,}$/i);\r\n const prefixStyle = { prefix: { padding: '0px 5px' }, field: { padding: '0px 2px' } };\r\n\r\n useEffect(() => {\r\n if (inputRef.current === null) {\r\n return;\r\n }\r\n const container = document.getElementById('propertyUrl') as HTMLElement;\r\n const label = container.getElementsByClassName('ms-Label')[0] as HTMLElement;\r\n if (label) {\r\n label.title = formatMessage(AppMessages.required);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [inputRef.current]);\r\n\r\n return (\r\n <FormItem id=\"propertyUrl\">\r\n <TextField\r\n label={formatMessage(isTythonSelfServeUser() ? messages.siteUrl : messages.websiteUrl)}\r\n required={true}\r\n errorMessage={error}\r\n value={url}\r\n disabled={\r\n [FormState.Edit, FormState.MultiStepEdit].includes(mode) ||\r\n (stepState === StepState.Dirty && mode === FormState.MultiStepCreation)\r\n }\r\n placeholder={formatMessage(messages.websiteUrlExample)}\r\n onChange={(_, value) => {\r\n onUrlChanged(value!);\r\n if (value) {\r\n onPropertyErrorChanged({\r\n ...errors,\r\n url: pattern.test(value) ? undefined : formatMessage(messages.websiteUrlInvalidMsg),\r\n });\r\n }\r\n }}\r\n componentRef={inputRef}\r\n prefix=\"https://\"\r\n styles={prefixStyle}\r\n data-test-id={PROPERTY_DOMAIN_INPUT}\r\n />\r\n </FormItem>\r\n );\r\n }\r\n);\r\n\r\nexport default PropertyUrlInputField;\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n createPageTitle: {\r\n id: 'admanagement.property.createTitle',\r\n defaultMessage: 'Create property',\r\n },\r\n createSitePageTitle: {\r\n id: 'admanagement.site.createTitle',\r\n defaultMessage: 'Create site',\r\n },\r\n editPageTitle: {\r\n id: 'admanagement.property.editTitle',\r\n defaultMessage: 'Update property',\r\n },\r\n editSitePageTitle: {\r\n id: 'admanagement.site.editTitle',\r\n defaultMessage: 'Update site',\r\n },\r\n});\r\n","import { ClarityType, isTythonSelfServeUser, onNavigateBack } from '../../../../../@data';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { RouteName } from '../../../@data';\r\nimport { createReturnUrl } from '../../../@data/services/AdManagementService';\r\nimport { onFormCleared } from '../__data__/mutatorActions';\r\nimport { IPropertyViewModel } from '../__data__/store/schema';\r\nimport messages from '../variations/CreateNonTythonProperty/messages';\r\n\r\nconst useDetailsPageButtonsStatus = (history, mode, onSubmit, onCancel, formatMessage) => {\r\n const isTythonUser = isTythonSelfServeUser();\r\n\r\n const titleLabel =\r\n mode === FormState.Edit\r\n ? formatMessage(isTythonUser ? messages.editSitePageTitle : messages.editPageTitle)\r\n : formatMessage(isTythonUser ? messages.createSitePageTitle : messages.createPageTitle);\r\n\r\n const submitLabel =\r\n mode === FormState.Edit\r\n ? formatMessage(isTythonUser ? messages.editSitePageTitle : messages.editPageTitle)\r\n : formatMessage(isTythonUser ? messages.createSitePageTitle : messages.createPageTitle);\r\n\r\n const isSubmitButtonDisabled = (active): boolean => {\r\n if (!active.name || !active.url || active.approvalStatus === undefined) {\r\n return true;\r\n }\r\n\r\n /* For tython users selecting clarity type is mandatory*/\r\n if (isTythonUser) {\r\n return !(\r\n (active.tythonClarity?.connectingClarityApprovalTython && active.tythonClarity?.clarityType === ClarityType.Behavioral) ||\r\n active.tythonClarity?.clarityType === ClarityType.Fraud\r\n );\r\n }\r\n\r\n return false;\r\n };\r\n\r\n const onHandleSubmit = (active: IPropertyViewModel): void => {\r\n if (onSubmit) {\r\n onSubmit({\r\n url: active?.url as string,\r\n name: active?.name as string,\r\n clarityType: active?.clarity?.clarityType,\r\n clarityId: active?.clarity?.clarityId,\r\n });\r\n return;\r\n }\r\n };\r\n\r\n const onHandleCancel = (publisherId?: string, accountId?: string): void => {\r\n onFormCleared();\r\n\r\n if (onCancel) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n if (mode !== FormState.InPageCreate) {\r\n // return to manage page\r\n const returnUrl = createReturnUrl(isTythonUser ? RouteName.inventory : RouteName.property, publisherId, accountId);\r\n onNavigateBack(history, returnUrl);\r\n }\r\n };\r\n\r\n return {\r\n titleLabel,\r\n submitLabel,\r\n isSubmitButtonDisabled,\r\n onHandleSubmit,\r\n onHandleCancel,\r\n };\r\n};\r\n\r\nexport default useDetailsPageButtonsStatus;\r\n","import { Property, Publisher, UserContext, listEntity } from '../../../../../@data';\r\n\r\nexport const fetchPropertyById = async (\r\n publisher: Publisher,\r\n id: string,\r\n userContext?: UserContext,\r\n updateLoadingStatus?: (isLoading: boolean) => void\r\n): Promise<Property> => {\r\n updateLoadingStatus?.(true);\r\n const list = await listEntity(\r\n [publisher],\r\n userContext,\r\n Property,\r\n new URLSearchParams([\r\n ['type', 'Search'],\r\n ['ids', id],\r\n ])\r\n );\r\n\r\n if (!list || !list.length) {\r\n throw Error('Cannot find property Id');\r\n }\r\n updateLoadingStatus?.(false);\r\n return list[0];\r\n};\r\n","import { action, orchestrator } from 'satcheljs';\r\n\r\nimport {\r\n AdUnit,\r\n ClarityStatus,\r\n PropertyApprovalStatus,\r\n Publisher,\r\n getAppStore,\r\n listEntity,\r\n onLoadingChanged,\r\n showErrorToastNotification,\r\n} from '../../../../../../../../@data';\r\nimport { FormState } from '../../../../../../../../components/Form';\r\nimport { IHierarchicalPickerItem } from '../../../../../../../../components/HierarchicalMultiSelectPicker';\r\nimport { fetchPropertyById } from '../../../../../@data/services/PropertyService';\r\nimport PropertyMessages from '../../../../../Property.messages';\r\nimport { onPropertyChanged, onPropertyErrorChanged, onRawChanged } from '../../../../__data__/mutatorActions';\r\nimport { IPropertyViewModel } from '../../../../__data__/store/schema';\r\n\r\nexport const onFormInitialized = action(\r\n 'onFormInitialized',\r\n (mode: FormState, publisherId: string, accountId?: string, entityId?: string) => ({\r\n mode,\r\n publisherId,\r\n accountId,\r\n entityId,\r\n })\r\n);\r\n\r\norchestrator(onFormInitialized, async (msg) => {\r\n const { userContext } = getAppStore();\r\n\r\n const property: IPropertyViewModel = {};\r\n property.clarity = {};\r\n\r\n const publisherId = parseInt(msg.publisherId, 10);\r\n if (!isNaN(publisherId)) {\r\n const publisher = new Publisher(publisherId);\r\n try {\r\n onPropertyErrorChanged();\r\n onLoadingChanged(true);\r\n\r\n if (msg.mode === FormState.Edit && msg.entityId) {\r\n const rawProperty = await fetchPropertyById(publisher, msg.entityId, userContext);\r\n property.id = rawProperty.id;\r\n property.name = String(rawProperty.name);\r\n property.url = rawProperty.url;\r\n property.approvalStatusComments = rawProperty.approvalStatusComments;\r\n property.approvalStatus = rawProperty.approvalStatus;\r\n\r\n const adunits = await listEntity([publisher], userContext, AdUnit, new URLSearchParams([['extendedInfo', 'true']]));\r\n property.adunits = adunits.map(\r\n (a) => ({ id: a.id, name: a.name, parentId: a.accountId, parentName: a.accountName } as IHierarchicalPickerItem)\r\n );\r\n\r\n property.adunitsSelected = rawProperty.associatedAdUnitIds\r\n ? property.adunits.filter((f) => f.id && rawProperty.associatedAdUnitIds!.includes(f.id))\r\n : [];\r\n\r\n property.clarity.clarityId = rawProperty.clarityProjectId;\r\n property.clarity.originalClarityId = rawProperty.clarityProjectId;\r\n if (rawProperty.clarityStatus) {\r\n const status: ClarityStatus = ClarityStatus[rawProperty.clarityStatus];\r\n property.clarity.clarityLinkingEnabled = status === ClarityStatus.NotConnected ? false : true;\r\n property.clarity.clarityStatus = status || ClarityStatus.Approved;\r\n property.clarity.clarityEdit = status === ClarityStatus.Approved || status === undefined ? false : true;\r\n }\r\n\r\n onRawChanged(rawProperty);\r\n } else {\r\n onRawChanged();\r\n property.approvalStatus = PropertyApprovalStatus.Approved;\r\n }\r\n onPropertyChanged(property);\r\n } catch (e) {\r\n showErrorToastNotification({ textMessageDescriptor: PropertyMessages.propertyLoadError });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n showErrorToastNotification({\r\n textMessageDescriptor: PropertyMessages.invalidState,\r\n });\r\n }\r\n});\r\n","import { action, orchestrator } from 'satcheljs';\r\n\r\nimport { Log } from '../../../../../../../../../logging/src';\r\nimport {\r\n ApiError,\r\n NotificationLabel,\r\n NotificationSeverity,\r\n Property,\r\n getAppStore,\r\n listEntity,\r\n onNavigateBack,\r\n onNotificationCardAdded,\r\n onSavingChanged,\r\n postEntity,\r\n putEntity,\r\n showErrorToastNotification,\r\n showSuccessToastNotification,\r\n} from '../../../../../../../../@data';\r\nimport notificationMessages from '../../../../../../../../NotificationsPanel.Types.messages';\r\nimport { FormState } from '../../../../../../../../components/Form';\r\nimport { validateSchema } from '../../../../../../../../utils';\r\nimport { RouteName } from '../../../../../../@data';\r\nimport { createReturnUrl } from '../../../../../../@data/services/AdManagementService';\r\nimport { getAdunitStore } from '../../../../../../Adunit/@data';\r\nimport { onAdunitPropertyListChanged } from '../../../../../../Adunit/@data/actions';\r\nimport { fetchPropertyById } from '../../../../../@data/services/PropertyService';\r\nimport { getGridPropertyStore } from '../../../../../Manage/__data__/store/store';\r\nimport PropertyMessages from '../../../../../Property.messages';\r\nimport { onFormCleared, onIdChanged, onPropertyErrorChanged, onSettingClarityErrorMessage } from '../../../../__data__/mutatorActions';\r\nimport { nonTythonPropertyErrorModel } from '../../../../__data__/store/schema';\r\nimport { getCreatePropertyStore } from '../../../../__data__/store/store';\r\n\r\nexport const onFormSubmitted = action('onFormSubmitted', (mode: FormState, routeHistory?, onSubmit?: () => void) => ({\r\n mode,\r\n routeHistory,\r\n onSubmit,\r\n}));\r\n\r\n/**\r\n * 1) Set Loading to true\r\n * 2) Submit API call to Submit Data to Store\r\n * 3) Check errors, if any, send action to notification that error exists\r\n * 4) Clear the form\r\n * 5) Navigate back to property list\r\n */\r\norchestrator(onFormSubmitted, async ({ mode, routeHistory, onSubmit }) => {\r\n const { publisher, account, userContext } = getAppStore();\r\n const { active, raw } = getCreatePropertyStore();\r\n\r\n if (publisher && raw) {\r\n const body: Property = {\r\n ...raw,\r\n id: active.id,\r\n name: active.name,\r\n };\r\n\r\n onSavingChanged(true);\r\n\r\n try {\r\n let properties = getGridPropertyStore().data;\r\n\r\n if (properties === undefined || properties.length === 0) {\r\n properties = await listEntity([publisher], userContext, Property);\r\n }\r\n\r\n await validateSchema(nonTythonPropertyErrorModel(active, mode === FormState.Edit, properties), active);\r\n onPropertyErrorChanged();\r\n } catch (e) {\r\n onSavingChanged(false);\r\n onPropertyErrorChanged(e);\r\n showErrorToastNotification({\r\n textMessageDescriptor: PropertyMessages.propertyFormError,\r\n intlMessageValues: { errorCount: Object.keys(e).length },\r\n });\r\n return;\r\n }\r\n\r\n if (publisher.id) {\r\n body.publisherId = publisher.id;\r\n }\r\n\r\n if (active.approvalStatus) {\r\n body.approvalStatus = active.approvalStatus;\r\n }\r\n\r\n if (active.url) {\r\n body.url = active.url;\r\n }\r\n\r\n body.enableMicrosoftClarity = active.clarity?.clarityLinkingEnabled;\r\n if (active.clarity?.clarityId) {\r\n body.clarityProjectId = active.clarity.clarityId;\r\n }\r\n\r\n body.approvalStatusComments = active.approvalStatusComments ? active.approvalStatusComments : '';\r\n body.associatedAdUnitIds = active.adunitsSelected ? active.adunitsSelected.map((a) => a.id!) : [];\r\n\r\n try {\r\n let entity: Property | undefined;\r\n\r\n if (mode === FormState.Edit) {\r\n entity = await putEntity([publisher], body, userContext, Property);\r\n showSuccessToastNotification({\r\n textMessageDescriptor: PropertyMessages.propertyEditSuccess,\r\n intlMessageValues: { entityId: entity.id },\r\n });\r\n } else {\r\n entity = await postEntity([publisher], Property, body, userContext);\r\n if (entity && entity.id) {\r\n onIdChanged(entity.id);\r\n\r\n if (mode === FormState.InPageCreate) {\r\n const adunitStore = getAdunitStore();\r\n\r\n const property = await fetchPropertyById(publisher, entity.id + '', userContext);\r\n const adunitPropertyList = [] as Property[];\r\n\r\n if (adunitStore.active.properties) {\r\n adunitPropertyList.push(...adunitStore.active.properties);\r\n }\r\n adunitPropertyList.push(property);\r\n onAdunitPropertyListChanged(adunitPropertyList);\r\n }\r\n }\r\n showSuccessToastNotification({\r\n textMessageDescriptor: PropertyMessages.propertyCreateSuccess,\r\n intlMessageValues: { entityId: entity.id },\r\n });\r\n }\r\n\r\n if (mode !== FormState.InPageCreate) {\r\n const returnUrl = createReturnUrl(\r\n RouteName.property,\r\n String(publisher.id),\r\n (account && String(account.id)) || undefined,\r\n String(entity.id),\r\n mode\r\n );\r\n if (routeHistory) {\r\n onNavigateBack(routeHistory, returnUrl);\r\n }\r\n }\r\n\r\n onFormCleared();\r\n onSubmit?.();\r\n } catch (e) {\r\n const getClarityErrorMessage = (e: ApiError) => {\r\n if (e.code === 404) {\r\n return 'Clarity project ID does not exist';\r\n } else {\r\n return e.message.split(`description\":\"`)[1].split(`\"`)[0];\r\n }\r\n };\r\n\r\n Log.error(e);\r\n const apiErrorObj = e as ApiError;\r\n if (apiErrorObj.code === 404) {\r\n onSettingClarityErrorMessage(getClarityErrorMessage(apiErrorObj));\r\n } else {\r\n onSettingClarityErrorMessage(getClarityErrorMessage(apiErrorObj));\r\n }\r\n\r\n onNotificationCardAdded({\r\n // tslint:disable-next-line: no-any\r\n severity: NotificationSeverity.Error,\r\n titleMessageDescriptor: notificationMessages.PropertyEditFailedNotificationTitle,\r\n contentMessageDescriptor: notificationMessages.PropertyEditFailedNotificationContent,\r\n notificationLabel: NotificationLabel.PropertyEditFailedNotification,\r\n });\r\n } finally {\r\n onSavingChanged(false);\r\n }\r\n } else {\r\n showErrorToastNotification({\r\n textMessageDescriptor: PropertyMessages.invalidForm,\r\n intlMessageValues: { formOperation: FormState[mode], entityId: active.id },\r\n });\r\n }\r\n});\r\n","import { mixed, object, string } from 'yup';\r\nimport { Property, PropertyApprovalStatus } from '../../../../../../../@data';\r\nimport { IPropertyViewModel } from './IPropertyViewModel';\r\n\r\nexport function nonTythonPropertyErrorModel(form: IPropertyViewModel, isEditMode: boolean, properties: Property[] = []) {\r\n return object<IPropertyViewModel>().shape({\r\n name: string().trim().required() && string().max(35).duplicateName(properties, form),\r\n url: string().trim().domain().required() && string().trim().duplicateDomain(properties, isEditMode, form),\r\n approvalStatusComments: string(),\r\n approvalStatus: mixed()\r\n .oneOf([\r\n PropertyApprovalStatus.Approved,\r\n PropertyApprovalStatus.AutoApproved,\r\n PropertyApprovalStatus.Rejected,\r\n PropertyApprovalStatus.UnderManualReview,\r\n ])\r\n .required(),\r\n });\r\n}\r\n\r\nexport function tythonPropertyErrorModel(form: IPropertyViewModel, isEditMode: boolean, properties: Property[] = []) {\r\n return object<IPropertyViewModel>().shape({\r\n name: string().trim().required() && string().max(35).duplicateName(properties, form),\r\n url:\r\n string().trim().domain().required() &&\r\n string()\r\n .trim()\r\n .duplicateDomain(properties, isEditMode, form)\r\n .test('url', 'Invalid domain name', (value) => new RegExp(/^(?!https?:\\/\\/)(?!.*\\/)[\\w.-]+\\.[\\w-]{2,}$/i).test(value)),\r\n });\r\n}\r\n","import { action, orchestrator } from 'satcheljs';\r\nimport { AdUnit, Publisher, getAppStore, listEntity, onLoadingChanged, showErrorToastNotification } from '../../../../../../../../@data';\r\nimport { FormState } from '../../../../../../../../components/Form';\r\nimport { IHierarchicalPickerItem } from '../../../../../../../../components/HierarchicalMultiSelectPicker';\r\nimport PropertyMessages from '../../../../../Property.messages';\r\nimport { onPropertyChanged } from '../../../../__data__/mutatorActions';\r\nimport { IPropertyViewModel } from '../../../../__data__/store/schema';\r\nimport { getCreatePropertyStore } from '../../../../__data__/store/store';\r\n\r\nexport const loadAttachedAdUnits = action(\r\n 'loadAttachedAdUnits',\r\n (mode: FormState, publisherId: string, accountId?: string, entityId?: string) => ({\r\n mode,\r\n publisherId,\r\n accountId,\r\n entityId,\r\n })\r\n);\r\n\r\norchestrator(loadAttachedAdUnits, async (msg) => {\r\n const { active, raw } = getCreatePropertyStore();\r\n const { userContext } = getAppStore();\r\n const publisherId = parseInt(msg.publisherId, 10);\r\n\r\n if (!isNaN(publisherId)) {\r\n try {\r\n const property: IPropertyViewModel = { ...active };\r\n\r\n onLoadingChanged(true);\r\n\r\n const publisher = new Publisher(publisherId);\r\n const adunits = await listEntity([publisher], userContext, AdUnit, new URLSearchParams([['extendedInfo', 'true']]));\r\n property.adunits = adunits.map(\r\n (a) => ({ id: a.id, name: a.name, parentId: a.accountId, parentName: a.accountName } as IHierarchicalPickerItem)\r\n );\r\n\r\n if (msg.mode === FormState.Edit && msg.entityId) {\r\n property.adunitsSelected = raw?.associatedAdUnitIds\r\n ? property.adunits.filter((f) => f.id && raw.associatedAdUnitIds!.includes(f.id))\r\n : [];\r\n }\r\n\r\n onPropertyChanged(property);\r\n } catch (e) {\r\n showErrorToastNotification({ textMessageDescriptor: PropertyMessages.adUnitsFetchFailed });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n showErrorToastNotification({ textMessageDescriptor: PropertyMessages.adUnitsFetchFailed });\r\n }\r\n});\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { PropertyApprovalStatus } from '../../../../../../../../@data';\r\nimport { IHierarchicalPickerItem } from '../../../../../../../../components/HierarchicalMultiSelectPicker';\r\nimport { getCreatePropertyStore } from '../../../../__data__/store/store';\r\n\r\nexport const onApprovalStatusChanged = mutatorAction('onApprovalStatusChanged', (status: PropertyApprovalStatus) => {\r\n getCreatePropertyStore().active.approvalStatus = status;\r\n});\r\n\r\nexport const onApprovalStatusCommentsChanged = mutatorAction('onApprovalStatusCommentsChanged', (comments: string) => {\r\n getCreatePropertyStore().active.approvalStatusComments = comments;\r\n});\r\n\r\nexport const onAttachedAdunitsChanged = mutatorAction('onAttachedAdunitsChanged', (adunits: IHierarchicalPickerItem[]) => {\r\n getCreatePropertyStore().active.adunitsSelected = adunits;\r\n});\r\n\r\nexport const onEnableClarityToggleChanged = mutatorAction('onEnableClarityToggleChanged', (enabled: boolean) => {\r\n const store = getCreatePropertyStore();\r\n const clarity = store.active.clarity;\r\n if (clarity) {\r\n clarity.clarityLinkingEnabled = enabled;\r\n if (enabled === false) {\r\n clarity.clarityId = '';\r\n } else {\r\n clarity.clarityId = clarity.originalClarityId?.trim();\r\n }\r\n }\r\n});\r\n","import { action, orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../../logging/src';\r\nimport {\r\n Property,\r\n Publisher,\r\n PublisherTier,\r\n getAppStore,\r\n getEntity,\r\n isTythonSelfServeUser,\r\n listEntity,\r\n showErrorToastNotification,\r\n} from '../../../../../../@data';\r\nimport { fetchPropertiesServingConfigs } from '../../../../AdBlock/@data/services';\r\nimport PropertyMessages from '../../../Property.messages';\r\nimport { setFetchingData, setLoading, setPropertiesFetching, setPropertiesServingConfigs, setPropertyData } from '../mutatorActions';\r\nimport { getGridPropertyStore } from '../store/store';\r\n\r\nexport const onManagePageInitialized = action('onManagePageInitialized');\r\n\r\norchestrator(onManagePageInitialized, async () => {\r\n try {\r\n const { publisher, userContext } = getAppStore();\r\n const properties = getGridPropertyStore().data;\r\n\r\n if (publisher && userContext) {\r\n if (properties === undefined || properties.length === 0) {\r\n setLoading(true);\r\n }\r\n setFetchingData(true);\r\n setPropertiesFetching(true);\r\n\r\n const data = await listEntity([publisher], userContext, Property);\r\n\r\n let publisherFullInfo = {} as Publisher;\r\n if (!isTythonSelfServeUser()) {\r\n publisherFullInfo = await getEntity<Publisher>([publisher], userContext);\r\n }\r\n\r\n // Check for self serve user or publisher service level if publisher is being searched from Internal UI\r\n // This is because only self serve publishers have property serving configs that need to be fetched\r\n if ((isTythonSelfServeUser() || publisherFullInfo.publisherTier === PublisherTier.SelfServe3rdParty) && data.length > 0) {\r\n const propertyServingConfig = await fetchPropertiesServingConfigs(publisher);\r\n data.forEach((property) => {\r\n const propertyServingConfigForProperty = propertyServingConfig.find((config) => config.propertyId === property.id);\r\n if (propertyServingConfigForProperty) {\r\n property.servingConfig = propertyServingConfigForProperty;\r\n }\r\n });\r\n setPropertiesServingConfigs(propertyServingConfig);\r\n }\r\n\r\n setPropertyData(data.sort((a, b) => b.id - a.id));\r\n setLoading(false);\r\n }\r\n } catch (error) {\r\n Log.error(error);\r\n showErrorToastNotification({ textMessageDescriptor: PropertyMessages.propertiesFetchFailed });\r\n } finally {\r\n setLoading(false);\r\n setFetchingData(false);\r\n setPropertiesFetching(false);\r\n }\r\n});\r\n","import { ITheme } from '@fluentui/react';\r\nimport { ClarityStatus } from '../../../../../../@data';\r\n\r\nexport interface IClarityParams {\r\n clarityId?: string;\r\n originalClarityId?: string;\r\n clarityLinkingEnabled?: boolean;\r\n clarityErrorMessage?: string;\r\n clarityEdit?: boolean;\r\n clarityStatus?: ClarityStatus;\r\n}\r\n\r\nexport interface IClarityPanelStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\nexport interface IClarityPanelStyle {\r\n panelButton?: string;\r\n panelDescriptor?: string;\r\n panelAgreement?: string;\r\n panelPendingResendButton?: string;\r\n}\r\n\r\nexport enum ClarityErrors {\r\n ClarityProjectNotLinked = 'ClarityProjectNotLinked',\r\n ClarityProjectUnlinkingFailed = 'ClarityProjectUnlinkingFailed',\r\n}\r\n","import { action, orchestrator } from 'satcheljs';\r\nimport {\r\n ApiError,\r\n ClarityStatus,\r\n Property,\r\n getAppStore,\r\n onLoadingChanged,\r\n patchEntity,\r\n showErrorToastNotification,\r\n showSuccessToastNotification,\r\n} from '../../../../../../@data';\r\nimport { UpdateClarityProject } from '../../../../../../@data/store/schema/models/UpdateClarityProject';\r\nimport { onSettingClarityErrorMessage } from '../../../Create/__data__/mutatorActions';\r\nimport { getCreatePropertyStore } from '../../../Create/__data__/store/store';\r\nimport PropertyMessages from '../../../Property.messages';\r\nimport { ClarityErrors } from '../../components/ClarityPanel/types';\r\nimport { setClarityPanelVisibility, setPropertyData } from '../mutatorActions';\r\nimport { getGridPropertyStore } from '../store/store';\r\n\r\nexport const onClarityUpdate = action('onClarityUpdate');\r\n\r\norchestrator(onClarityUpdate, async () => {\r\n const { publisher, userContext } = getAppStore();\r\n const {\r\n active: { clarity },\r\n } = getCreatePropertyStore();\r\n const { data, selectedPropertyId: propertyId } = getGridPropertyStore();\r\n\r\n if (publisher && propertyId) {\r\n try {\r\n onLoadingChanged(true);\r\n\r\n const body: UpdateClarityProject = {\r\n apiPath: undefined,\r\n className: 'updateClarityProject',\r\n propertyId: propertyId.toString(),\r\n clarityProjectId: clarity?.clarityId,\r\n enableMicrosoftClarity: clarity?.clarityLinkingEnabled,\r\n };\r\n\r\n await patchEntity([publisher, new Property()], UpdateClarityProject, body, userContext);\r\n\r\n if (data) {\r\n const updatedProperty = { ...data.find((property) => property.id.toString() === propertyId) };\r\n\r\n if (updatedProperty) {\r\n if (clarity?.clarityLinkingEnabled === true) {\r\n showSuccessToastNotification({\r\n textMessageDescriptor: PropertyMessages.clarityLinkSuccess,\r\n });\r\n updatedProperty.clarityStatus = ClarityStatus.Pending;\r\n updatedProperty.clarityProjectId = clarity?.clarityId;\r\n } else {\r\n showSuccessToastNotification({\r\n textMessageDescriptor: PropertyMessages.clarityUnlinkSuccess,\r\n });\r\n updatedProperty.clarityProjectId = undefined;\r\n updatedProperty.clarityStatus = ClarityStatus.NotConnected;\r\n }\r\n }\r\n\r\n const updatedProperties: Property[] = data.map((property) => {\r\n if (property.id.toString() === propertyId) {\r\n return updatedProperty as Property;\r\n } else {\r\n return property as Property;\r\n }\r\n });\r\n\r\n setPropertyData(updatedProperties);\r\n setClarityPanelVisibility(false);\r\n }\r\n } catch (e) {\r\n const apiErrorObj = e as ApiError;\r\n if (apiErrorObj && apiErrorObj.code === 404) {\r\n onSettingClarityErrorMessage(JSON.parse(apiErrorObj.message)[0].description);\r\n } else if (apiErrorObj && apiErrorObj.code === 400) {\r\n const error = ClarityErrors[JSON.parse(apiErrorObj.message)[0].code];\r\n if (error === ClarityErrors.ClarityProjectNotLinked || error === ClarityErrors.ClarityProjectUnlinkingFailed) {\r\n showErrorToastNotification({ text: JSON.parse(apiErrorObj.message)[0].description });\r\n setClarityPanelVisibility(false);\r\n } else {\r\n onSettingClarityErrorMessage(JSON.parse(apiErrorObj.message)[0].description);\r\n }\r\n } else {\r\n // Add check for link or unlink request\r\n showErrorToastNotification({\r\n textMessageDescriptor: PropertyMessages.clarityLinkFailed,\r\n intlMessageValues: { projectId: clarity?.clarityId },\r\n });\r\n }\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n showErrorToastNotification({ textMessageDescriptor: PropertyMessages.invalidState });\r\n }\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n linkingNote: {\r\n id: 'property.clarity.linkingNote',\r\n defaultMessage: '{status}. Click {here} to resend the request again.',\r\n },\r\n cancelledStatus: {\r\n id: 'property.clarity.cancelledStatus',\r\n defaultMessage: 'Request was cancelled',\r\n },\r\n pendingStatus: {\r\n id: 'property.clarity.pendingStatus',\r\n defaultMessage: 'Pending Approval',\r\n },\r\n declinedStatus: {\r\n id: 'property.clarity.declinedStatus',\r\n defaultMessage: 'Request was declined',\r\n },\r\n expiredStatus: {\r\n id: 'property.clarity.expiredStatus',\r\n defaultMessage: 'Request was expired',\r\n },\r\n});\r\n","import { FontWeights, getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubCenterFonts, IPubcenterPalette, IPubcenterSpacing } from '../../../../../../../../../../../theme';\r\n\r\nexport interface IInputFieldStyle {\r\n note?: string;\r\n}\r\n\r\nexport const getClassNames = (): IInputFieldStyle => {\r\n const theme = getTheme();\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const fonts = theme.fonts as IPubCenterFonts;\r\n\r\n return mergeStyleSets({\r\n note: {\r\n width: 'inherit',\r\n display: 'flex',\r\n alignItems: 'center',\r\n backgroundColor: palette.neutralLighterAlt,\r\n fontSize: fonts.size12.fontSize,\r\n fontWeight: FontWeights.light,\r\n margin: `${spacing.size12} 0`,\r\n padding: `${spacing.size12} ${spacing.size6}`,\r\n },\r\n });\r\n};\r\n","import { IconButton, Link, TextField } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { FormattedMessage, InjectedIntlProps } from 'react-intl';\r\nimport { ClarityStatus } from '../../../../../../../../../../@data';\r\nimport AppMessages from '../../../../../../../../../../App.messages';\r\nimport { FormItem } from '../../../../../../../../../../components/Form';\r\nimport { useWindowSize } from '../../../../../../../../../../hooks';\r\nimport { getStore } from '../../../../../../../../../../hooks/useWindowSize/store/store';\r\nimport { injectIntlAndObserver } from '../../../../../../../../../../utils';\r\nimport { onClarityUpdate } from '../../../../../../../Manage/__data__/orchestrators';\r\nimport { IClarityParams } from '../../../../../../../Manage/components/ClarityPanel/types';\r\nimport { onClarityIdChanged, onEditClarityId } from '../../../../../../__data__/mutatorActions';\r\nimport { onResendClarityLink } from '../../../../../../__data__/orchestrators';\r\nimport { getCreatePropertyStore } from '../../../../../../__data__/store/store';\r\nimport messages from './messages';\r\nimport { getClassNames } from './styles';\r\n\r\ninterface IClarityInputFieldProps {\r\n configs?: IClarityParams;\r\n isShownInPanel?: boolean;\r\n}\r\n\r\nconst { windowStoreSerializer } = useWindowSize();\r\n\r\nconst ClarityInputField = injectIntlAndObserver<InjectedIntlProps & IClarityInputFieldProps>(\r\n ({ intl, configs, isShownInPanel = false }) => {\r\n const {\r\n originalClarityId: existingId,\r\n clarityId: id,\r\n clarityStatus: status,\r\n clarityEdit: isEditable,\r\n clarityErrorMessage: error = '',\r\n clarityLinkingEnabled,\r\n } = configs || {};\r\n\r\n const { formatMessage } = intl;\r\n const { note } = getClassNames();\r\n const { isWindowSmallSize } = windowStoreSerializer(getStore());\r\n const { active } = getCreatePropertyStore();\r\n\r\n const shouldShowNote: boolean =\r\n status === ClarityStatus.Pending ||\r\n status === ClarityStatus.Declined ||\r\n status === ClarityStatus.Expired ||\r\n status === ClarityStatus.Cancelled;\r\n\r\n const getLinkStatusNote = (): string => {\r\n switch (status) {\r\n case ClarityStatus.Pending:\r\n return formatMessage(messages.pendingStatus);\r\n case ClarityStatus.Declined:\r\n return formatMessage(messages.declinedStatus);\r\n case ClarityStatus.Cancelled:\r\n return formatMessage(messages.cancelledStatus);\r\n case ClarityStatus.Expired:\r\n return formatMessage(messages.expiredStatus);\r\n default:\r\n return '';\r\n }\r\n };\r\n\r\n return (\r\n <FormItem formWidth={isWindowSmallSize ? 324 : 440}>\r\n <TextField\r\n iconProps={{\r\n iconName: status === ClarityStatus.Approved ? 'Cancel' : '',\r\n style: {\r\n pointerEvents: 'auto',\r\n cursor: 'pointer',\r\n },\r\n onClick: () => onEditClarityId(!isEditable),\r\n }}\r\n required={true}\r\n value={id}\r\n errorMessage={error}\r\n onChange={(_, value) => onClarityIdChanged(value)}\r\n />\r\n {existingId === id && shouldShowNote && (\r\n <div className={note}>\r\n <IconButton iconProps={{ iconName: 'Info' }} />\r\n <FormattedMessage\r\n {...messages.linkingNote}\r\n values={{\r\n here: (\r\n <Link\r\n onClick={() =>\r\n isShownInPanel ? onClarityUpdate() : onResendClarityLink(active.id?.toString()!, existingId!, clarityLinkingEnabled)\r\n }\r\n >\r\n {formatMessage(AppMessages.here)}\r\n </Link>\r\n ),\r\n status: getLinkStatusNote(),\r\n }}\r\n />\r\n </div>\r\n )}\r\n </FormItem>\r\n );\r\n }\r\n);\r\n\r\nexport default ClarityInputField;\r\n","import { IconButton, Link } from '@fluentui/react';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport { CLARITY_WEB_APP } from '../../../../../../../../../../constants/AppConstants';\r\nimport { IClarityParams } from '../../../../../../../Manage/components/ClarityPanel/types';\r\nimport { onClarityIdChanged, onEditClarityId } from '../../../../../../__data__/mutatorActions';\r\n\r\ninterface IConnectedClarityFieldProps {\r\n configs?: IClarityParams;\r\n}\r\n\r\nconst ConnectedClarityField = observer(({ configs }: IConnectedClarityFieldProps) => {\r\n const { originalClarityId: existingId, clarityId: id, clarityEdit: isEditable } = configs || {};\r\n\r\n return (\r\n <>\r\n {id && (\r\n <Link href={CLARITY_WEB_APP.replace('{id}', id)} target=\"_blank\" rel=\"noreferrer noopener\">\r\n {id}\r\n </Link>\r\n )}\r\n <IconButton\r\n iconProps={{ iconName: 'Edit' }}\r\n onClick={() => {\r\n onEditClarityId(!isEditable);\r\n if (existingId) {\r\n onClarityIdChanged(existingId);\r\n }\r\n }}\r\n />\r\n </>\r\n );\r\n});\r\n\r\nexport default ConnectedClarityField;\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n clarityProjectDetails: {\r\n id: 'admanagement.property.clarityProjectDetails',\r\n defaultMessage: 'Clarity project details',\r\n },\r\n enableMicrosoftClarity: {\r\n id: 'property.clarity.enableMicrosoftClarity',\r\n defaultMessage: 'Enable Clarity',\r\n },\r\n clarityProjectId: {\r\n id: 'property.clarity.existingClarityProjectLabel',\r\n defaultMessage: 'Clarity Project ID',\r\n },\r\n clarityProjectResendButton: {\r\n id: 'property.clarity.clarityProjectResendButton',\r\n defaultMessage: 'Resend',\r\n },\r\n});\r\n","import { Toggle } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { ClarityStatus, getAppStore, onHelpInfoCalloutOpened, onHelpInfoChanged } from '../../../../../../../../@data';\r\nimport { completeAccess, hasReadAccess } from '../../../../../../../../@data/services/UserRoleService';\r\nimport { FormItem, FormSection, FormState } from '../../../../../../../../components/Form';\r\nimport { FormLabel } from '../../../../../../../../components/Form/FormLabel';\r\nimport { injectIntlAndObserver } from '../../../../../../../../utils';\r\nimport { IClarityParams } from '../../../../../Manage/components/ClarityPanel/types';\r\nimport { onEnableClarityToggleChanged } from '../../__data__/mutatorActions';\r\nimport { GetPropertyAccessPermission } from '../../utils/GetPropertyAccessPermissions';\r\nimport { IsDisabled } from '../../utils/IsFieldDisabled';\r\nimport ClarityInputField from './components/ClarityInputField';\r\nimport ConnectedClarityField from './components/ConnectedClarityField';\r\nimport messages from './messages';\r\n\r\ninterface IClarityInputFieldProps {\r\n mode: FormState;\r\n clarityConfigs: IClarityParams | undefined;\r\n isShownInPanel?: boolean;\r\n}\r\n\r\nconst ClaritySection = injectIntlAndObserver<InjectedIntlProps & IClarityInputFieldProps>(\r\n ({ intl, mode, clarityConfigs, isShownInPanel = false }) => {\r\n const { helpInfo, locale } = getAppStore();\r\n\r\n const { formatMessage } = intl;\r\n\r\n const propertyAccessPermissions = GetPropertyAccessPermission();\r\n const accessLevel = propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.clarity;\r\n\r\n if (!hasReadAccess(accessLevel)) {\r\n return null;\r\n }\r\n\r\n const showToggle = mode === FormState.Edit && hasReadAccess(accessLevel) && clarityConfigs?.clarityStatus;\r\n const showInput = mode !== FormState.Edit || clarityConfigs?.clarityStatus !== ClarityStatus.Approved || clarityConfigs?.clarityEdit;\r\n\r\n const getLabel = (): JSX.Element => {\r\n return (\r\n <FormLabel\r\n id={'clarityProjectId'}\r\n labelContent={formatMessage(messages.clarityProjectId)}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_EnableMSClarity', locale)}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n intl={intl}\r\n />\r\n );\r\n };\r\n\r\n const getClaritySection = () => {\r\n return (\r\n <>\r\n {showToggle && (\r\n <FormItem>\r\n <Toggle\r\n inlineLabel={true}\r\n label={formatMessage(messages.enableMicrosoftClarity)}\r\n checked={clarityConfigs?.clarityLinkingEnabled}\r\n onChange={(_, value) => onEnableClarityToggleChanged(value || false)}\r\n disabled={IsDisabled(mode, accessLevel)}\r\n />\r\n </FormItem>\r\n )}\r\n\r\n {(clarityConfigs?.clarityLinkingEnabled || mode !== FormState.Edit) && (\r\n <>\r\n {getLabel()}\r\n {showInput ? (\r\n <ClarityInputField configs={clarityConfigs} isShownInPanel={isShownInPanel} />\r\n ) : (\r\n <ConnectedClarityField configs={clarityConfigs} />\r\n )}\r\n </>\r\n )}\r\n </>\r\n );\r\n };\r\n\r\n return isShownInPanel ? (\r\n getClaritySection()\r\n ) : (\r\n <FormSection title={formatMessage(messages.clarityProjectDetails)} hasBorderBottom={false}>\r\n {getClaritySection()}\r\n </FormSection>\r\n );\r\n }\r\n);\r\n\r\nexport default ClaritySection;\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n approvalStatus: {\r\n id: 'admanagement.property.approvalStatus',\r\n defaultMessage: 'Approval status',\r\n },\r\n approved: {\r\n id: 'admanagement.property.approved',\r\n defaultMessage: 'Approved',\r\n },\r\n autoApproved: {\r\n id: 'admanagement.property.autoApproved',\r\n defaultMessage: 'Auto-approved',\r\n },\r\n rejected: {\r\n id: 'admanagement.property.rejected',\r\n defaultMessage: 'Rejected',\r\n },\r\n manualreview: {\r\n id: 'admanagement.property.manualreview',\r\n defaultMessage: 'Under manual review',\r\n },\r\n});\r\n","import { IDropdownOption } from '@fluentui/react';\r\nimport { PropertyApprovalStatus } from '../../../../../../../../../@data';\r\nimport messages from '../messages';\r\n\r\nexport function GetApprovalStatusOptions(formatMessage): IDropdownOption[] {\r\n return [\r\n { key: PropertyApprovalStatus.Approved, text: formatMessage(messages.approved), ariaLabel: formatMessage(messages.approved) },\r\n {\r\n key: PropertyApprovalStatus.AutoApproved,\r\n text: formatMessage(messages.autoApproved),\r\n ariaLabel: formatMessage(messages.autoApproved),\r\n },\r\n { key: PropertyApprovalStatus.Rejected, text: formatMessage(messages.rejected), ariaLabel: formatMessage(messages.rejected) },\r\n {\r\n key: PropertyApprovalStatus.UnderManualReview,\r\n text: formatMessage(messages.manualreview),\r\n ariaLabel: formatMessage(messages.manualreview),\r\n },\r\n ];\r\n}\r\n","import { Dropdown } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { PropertyApprovalStatus } from '../../../../../../../../@data';\r\nimport { completeAccess, hasReadAccess } from '../../../../../../../../@data/services/UserRoleService';\r\nimport { FormItem, FormState } from '../../../../../../../../components/Form';\r\nimport { injectIntlAndObserver } from '../../../../../../../../utils';\r\nimport { getCreatePropertyStore } from '../../../../__data__/store/store';\r\nimport { onApprovalStatusChanged } from '../../__data__/mutatorActions';\r\nimport { GetPropertyAccessPermission } from '../../utils/GetPropertyAccessPermissions';\r\nimport { IsDisabled } from '../../utils/IsFieldDisabled';\r\nimport messages from './messages';\r\nimport { GetApprovalStatusOptions } from './utils/GetApprovalStatusOptions';\r\n\r\nexport interface IPropertyApprovalStateFieldProps {\r\n mode: FormState;\r\n}\r\n\r\nconst PropertyApprovalStateField = injectIntlAndObserver<InjectedIntlProps & IPropertyApprovalStateFieldProps>(\r\n ({ intl: { formatMessage }, mode }): JSX.Element | null => {\r\n const { active, errors } = getCreatePropertyStore();\r\n const propertyAccessPermissions = GetPropertyAccessPermission();\r\n const accessLevel = propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.approvalStatus;\r\n\r\n if (!hasReadAccess(accessLevel)) {\r\n return null;\r\n }\r\n\r\n return (\r\n <FormItem>\r\n <Dropdown\r\n label={formatMessage(messages.approvalStatus)}\r\n required={true}\r\n defaultSelectedKey={active.approvalStatus}\r\n selectedKey={active.approvalStatus}\r\n errorMessage={errors.approvalStatus}\r\n options={GetApprovalStatusOptions(formatMessage)}\r\n onChange={(_, value) => onApprovalStatusChanged(value?.key as PropertyApprovalStatus)}\r\n disabled={IsDisabled(mode, accessLevel)}\r\n />\r\n </FormItem>\r\n );\r\n }\r\n);\r\n\r\nexport default PropertyApprovalStateField;\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n notes: {\r\n id: 'admanagement.property.notes',\r\n defaultMessage: 'Notes',\r\n },\r\n});\r\n","import { TextField } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { completeAccess, hasReadAccess } from '../../../../../../../../@data/services/UserRoleService';\r\nimport { FormItem, FormState } from '../../../../../../../../components/Form';\r\nimport { injectIntlAndObserver } from '../../../../../../../../utils';\r\nimport { getCreatePropertyStore } from '../../../../__data__/store/store';\r\nimport { onApprovalStatusCommentsChanged } from '../../__data__/mutatorActions';\r\nimport { GetPropertyAccessPermission } from '../../utils/GetPropertyAccessPermissions';\r\nimport { IsDisabled } from '../../utils/IsFieldDisabled';\r\nimport messages from './messages';\r\n\r\nexport interface IPropertyApprovalStatusInputFieldProps {\r\n mode: FormState;\r\n}\r\n\r\nconst PropertyApprovalStatusInputField = injectIntlAndObserver<InjectedIntlProps & IPropertyApprovalStatusInputFieldProps>(\r\n ({ intl: { formatMessage }, mode }) => {\r\n const { active, errors } = getCreatePropertyStore();\r\n const propertyAccessPermissions = GetPropertyAccessPermission();\r\n const accessLevel = propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.notes;\r\n\r\n if (!hasReadAccess(accessLevel)) {\r\n return null;\r\n }\r\n\r\n return (\r\n <FormItem>\r\n <TextField\r\n label={formatMessage(messages.notes)}\r\n required={false}\r\n errorMessage={errors.approvalStatusComments}\r\n multiline={true}\r\n value={active.approvalStatusComments}\r\n onChange={(_, value) => onApprovalStatusCommentsChanged(value || '')}\r\n disabled={IsDisabled(mode, accessLevel)}\r\n />\r\n </FormItem>\r\n );\r\n }\r\n);\r\n\r\nexport default PropertyApprovalStatusInputField;\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n pickerAriaDescription: {\r\n id: 'hierarchicalMultiSelectPicker.pickerAriaDescription',\r\n defaultMessage: 'Select items using the hierarchical multi-selection picker'\r\n },\r\n createButtonAriaDesc: {\r\n id: 'hierarchicalMultiSelectPicker.createButtonAriaDesc',\r\n defaultMessage: 'Click this button to {createElement} within this page'\r\n },\r\n addAllAriaDescription: {\r\n id: 'hierarchicalMultiSelectPicker.addAllAriaDescription',\r\n defaultMessage: 'Click this button to select all items of group {groupName}'\r\n },\r\n removeAllAriaDescription: {\r\n id: 'hierarchicalMultiSelectPicker.removeAllAriaDescription',\r\n defaultMessage: 'Click to remove all selected items'\r\n },\r\n addIconAriaLabel: {\r\n id: 'hierarchicalMultiSelectPicker.addIconAriaLabel',\r\n defaultMessage: 'Add item'\r\n },\r\n removeIconAriaLabel: {\r\n id: 'hierarchicalMultiSelectPicker.removeIconAriaLabel',\r\n defaultMessage: 'Remove item'\r\n },\r\n expandGroupAriaLabel: {\r\n id: 'hierarchicalMultiSelectPicker.expandGroupAriaLabel',\r\n defaultMessage: 'Expand group'\r\n },\r\n selectedListAriaLabel: {\r\n id: 'hierarchicalMultiSelectPicker.selectedListAriaLabel',\r\n defaultMessage: 'List of selected items grouped by group name'\r\n }\r\n});","import {\r\n ActionButton,\r\n BaseComponent,\r\n classNamesFunction,\r\n css,\r\n DelayedRender,\r\n FocusZone,\r\n FocusZoneDirection,\r\n getId,\r\n Icon,\r\n IGroup,\r\n IProcessedStyleSet,\r\n Label,\r\n Link,\r\n nullRender,\r\n SearchBox,\r\n VerticalDivider,\r\n} from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport AppMessages from '../../App.messages';\r\nimport { isButtonPressKey } from '../../utils/AccessibilityUtils';\r\nimport { getScreenReaderTextStyles } from '../../utils/GlobalStyleUtils';\r\nimport messages from './HierarchicalMultiSelectPicker.messages';\r\nimport {\r\n IHierarchicalMultiSelectPickerProps,\r\n IHierarchicalMultiSelectPickerStyleProps,\r\n IHierarchicalMultiSelectPickerStyles,\r\n IHierarchicalPickerItem,\r\n} from './HierarchicalMultiSelectPicker.types';\r\n\r\nconst getClassNames = classNamesFunction<IHierarchicalMultiSelectPickerStyleProps, IHierarchicalMultiSelectPickerStyles>();\r\n\r\nexport interface IHierarchicalMultiSelectPickerState {\r\n filteredItems: IHierarchicalPickerItem[];\r\n subItems: IHierarchicalPickerItem[];\r\n selectedItems: IHierarchicalPickerItem[];\r\n expandedGroup?: IGroup;\r\n}\r\n\r\nexport class HierarchicalMultiSelectPickerBase extends BaseComponent<\r\n IHierarchicalMultiSelectPickerProps,\r\n IHierarchicalMultiSelectPickerState\r\n> {\r\n private _id: string;\r\n private _classNames: IProcessedStyleSet<IHierarchicalMultiSelectPickerStyles>;\r\n\r\n constructor(props: IHierarchicalMultiSelectPickerProps) {\r\n super(props);\r\n\r\n this._id = props.id || getId('HierarchicalMultiSelectPicker');\r\n\r\n const allItems = this.props.items;\r\n const selectedItems = this._getIntersection(allItems, this.props.initialSelectedItems || []);\r\n selectedItems.forEach((item) => {\r\n if (item && item.id) {\r\n allItems.find((i) => i.id === item.id)!.isSelected = true;\r\n }\r\n });\r\n\r\n this.state = {\r\n filteredItems: [...allItems],\r\n subItems: [],\r\n selectedItems: selectedItems,\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: IHierarchicalMultiSelectPickerProps) {\r\n let initialSelectedItems = this.state.selectedItems;\r\n\r\n if (this.props.initialSelectedItems !== prevProps.initialSelectedItems) {\r\n initialSelectedItems = this.props.initialSelectedItems || [];\r\n }\r\n\r\n if (this.props.items !== prevProps.items || this.props.initialSelectedItems !== prevProps.initialSelectedItems) {\r\n const intersectedSelectedItems = this._getIntersection(initialSelectedItems, this.props.items);\r\n const availableItems = [...this.props.items];\r\n\r\n intersectedSelectedItems.forEach((item) => {\r\n availableItems.find((i) => i.id === item.id)!.isSelected = true;\r\n });\r\n\r\n this.setState({\r\n filteredItems: [...this.props.items],\r\n selectedItems: intersectedSelectedItems,\r\n });\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n styles,\r\n theme,\r\n errorMessage,\r\n label,\r\n onRenderLabel = this._onRenderLabel,\r\n enableCreateButton,\r\n createButtonLabel,\r\n onCreateButtonClick,\r\n disabled,\r\n intl,\r\n } = this.props;\r\n this._classNames = getClassNames(styles, { theme: theme!, hasErrorMessage: !!errorMessage });\r\n\r\n return (\r\n <div className={this._classNames.root}>\r\n {onRenderLabel(this.props, this._onRenderLabel)}\r\n {enableCreateButton && (\r\n <ActionButton\r\n iconProps={{ iconName: 'add' }}\r\n onClick={onCreateButtonClick}\r\n disabled={disabled}\r\n ariaDescription={intl.formatMessage(messages.createButtonAriaDesc, { createElement: createButtonLabel })}\r\n >\r\n {createButtonLabel}\r\n </ActionButton>\r\n )}\r\n <div\r\n className={this._classNames.picker}\r\n role=\"form\"\r\n {...(label ? { 'aria-labelledy': 'hierarchicalMultiSelectPickerLabel' } : {})}\r\n aria-describedby=\"hierarchicalPickerAriaDescription\"\r\n >\r\n {this._renderItemsPane()}\r\n {this._renderSelectedItemsPane()}\r\n </div>\r\n {errorMessage && (\r\n <div role=\"alert\">\r\n <DelayedRender>\r\n <p className={this._classNames.errorMessage}>\r\n <span data-automation-id=\"error-message\">{errorMessage}</span>\r\n </p>\r\n </DelayedRender>\r\n </div>\r\n )}\r\n\r\n <span id=\"hierarchicalPickerAriaDescription\" style={getScreenReaderTextStyles()}>\r\n {intl.formatMessage(messages.pickerAriaDescription)}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n private _onRenderLabel = (props: IHierarchicalMultiSelectPickerProps): JSX.Element | null => {\r\n const { label, required } = props;\r\n\r\n if (label) {\r\n return (\r\n <Label id=\"hierarchicalMultiSelectPickerLabel\" required={required} htmlFor={this._id}>\r\n {props.label}\r\n </Label>\r\n );\r\n }\r\n\r\n return null;\r\n };\r\n\r\n private _renderItemsPane = (): JSX.Element => {\r\n const { searchBoxPlaceHolder, initialSearchBoxPlaceHolder, disabled } = this.props;\r\n const { expandedGroup } = this.state;\r\n const _searchBoxPlaceHolder = expandedGroup || !initialSearchBoxPlaceHolder ? searchBoxPlaceHolder : initialSearchBoxPlaceHolder;\r\n\r\n return (\r\n <div className={css(this._classNames.itemsPane, disabled ? this._classNames.disabledPanel : '')}>\r\n <SearchBox\r\n styles={this._classNames.subComponentStyles.search}\r\n underlined={true}\r\n placeholder={_searchBoxPlaceHolder}\r\n onChange={(_, value: string) => this._onSearchChange(value)}\r\n ariaLabel={_searchBoxPlaceHolder}\r\n />\r\n\r\n <div className={this._classNames.subPane} role=\"tree\">\r\n {this._renderGroupsPane()}\r\n <VerticalDivider />\r\n {this._renderSubItemsPane()}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n private _renderGroupsPane = (): JSX.Element => {\r\n const { onFilteredItemsLabel, disabled } = this.props;\r\n const { filteredItems, expandedGroup } = this.state;\r\n const groups = this._createGroups(filteredItems);\r\n\r\n return (\r\n <div className={this._classNames.subItemsPane} role=\"presentation\">\r\n <span className={css(this._classNames.header, this._classNames.headerLabel)}>{onFilteredItemsLabel(groups.length)}</span>\r\n <FocusZone className={this._classNames.list} isCircularNavigation={true} direction={FocusZoneDirection.vertical}>\r\n {groups.map((group: IGroup, index: number) => (\r\n <div\r\n className={css(\r\n this._classNames.listItem,\r\n expandedGroup && expandedGroup.name === group.name ? this._classNames.disabledListItem : ''\r\n )}\r\n id={`hierarchicalPickerGroup-${index}`}\r\n key={`hierarchicalPickerGroup-${index}`}\r\n role=\"treeitem\"\r\n aria-expanded={expandedGroup && expandedGroup.name === group.name ? true : false}\r\n aria-selected={expandedGroup && expandedGroup.name === group.name ? true : false}\r\n tabIndex={disabled ? -1 : 0}\r\n onClick={!disabled ? this._onGroupExpandedClick : undefined}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key) && !disabled && this._onGroupExpandedClick(ev)}\r\n data-list-index={index}\r\n data-is-focusable={disabled || (expandedGroup && expandedGroup.name === group.name) ? false : true}\r\n >\r\n <span className={this._classNames.listItemLabel}>{group.name}</span>\r\n <Icon\r\n iconName={'ChevronRight'}\r\n styles={this._classNames.subComponentStyles.iconButton}\r\n aria-label={this.props.intl.formatMessage(messages.expandGroupAriaLabel)}\r\n />\r\n </div>\r\n ))}\r\n </FocusZone>\r\n </div>\r\n );\r\n };\r\n\r\n private _renderSubItemsPane = (): JSX.Element => {\r\n const { subItems, expandedGroup } = this.state;\r\n const { disabled, intl } = this.props;\r\n\r\n let renderAddAll = nullRender();\r\n if (subItems.length > 0) {\r\n renderAddAll = (\r\n <>\r\n <Link className={this._classNames.textButton} onClick={this._onAddAll} disabled={disabled} aria-describedby=\"addAllAriaDesc\">\r\n {intl.formatMessage(AppMessages.addAll)}{' '}\r\n </Link>\r\n\r\n <span id=\"addAllAriaDesc\" style={getScreenReaderTextStyles()}>\r\n {intl.formatMessage(messages.addAllAriaDescription, { groupName: expandedGroup ? expandedGroup.name : '' })}\r\n </span>\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <div className={this._classNames.subItemsPane} role=\"presentation\">\r\n <div className={this._classNames.header}>\r\n <span className={this._classNames.headerLabel}>{this.props.onSubItemsLabel(subItems.length)}</span>\r\n {renderAddAll}\r\n </div>\r\n <FocusZone className={this._classNames.list} role=\"group\" direction={FocusZoneDirection.vertical} isCircularNavigation={true}>\r\n {subItems.map((item: IHierarchicalPickerItem, index: number) => (\r\n <div\r\n className={css(this._classNames.listItem, item.isSelected ? this._classNames.disabledListItem : '')}\r\n id={`hierarchicalPickerItem-${index}`}\r\n key={`hierarchicalPickerItem-${index}`}\r\n role=\"treeitem\"\r\n aria-selected={item.isSelected}\r\n tabIndex={!disabled ? 0 : -1}\r\n onClick={!disabled && !item.isSelected ? this._onItemAddedClick : undefined}\r\n onKeyDown={(ev) => {\r\n if (isButtonPressKey(ev.key) && !disabled && !item.isSelected) {\r\n this._onItemAddedClick(ev);\r\n }\r\n }}\r\n data-list-index={index}\r\n data-is-focusable={!disabled && !item.isSelected}\r\n >\r\n <span className={this._classNames.listItemLabel}>{item.name}</span>\r\n {!item.isSelected ? (\r\n <Icon\r\n iconName={'Add'}\r\n aria-label={intl.formatMessage(messages.addIconAriaLabel)}\r\n styles={this._classNames.subComponentStyles.iconButton}\r\n />\r\n ) : null}\r\n </div>\r\n ))}\r\n </FocusZone>\r\n </div>\r\n );\r\n };\r\n\r\n private _renderSelectedItemsPane = (): JSX.Element => {\r\n const { selectedItems } = this.state;\r\n const { onSelectedItemsLabel, disabled, intl } = this.props;\r\n const selectedCount = selectedItems.length;\r\n\r\n let renderRemoveAll = nullRender();\r\n if (selectedCount > 0) {\r\n renderRemoveAll = (\r\n <>\r\n <Link\r\n className={this._classNames.textButton}\r\n onClick={this._onRemoveAll}\r\n disabled={disabled}\r\n aria-describedby=\"removeAllAriaDesc\"\r\n >\r\n {intl.formatMessage(AppMessages.removeAll)}\r\n </Link>\r\n\r\n <span id=\"removeAllAriaDesc\" style={getScreenReaderTextStyles()}>\r\n {intl.formatMessage(messages.removeAllAriaDescription)}\r\n </span>\r\n </>\r\n );\r\n }\r\n const groups = this._createGroups(selectedItems);\r\n\r\n return (\r\n <div className={css(this._classNames.itemsPane, disabled ? this._classNames.disabledPanel : '')} role=\"presentation\">\r\n <span className={css(this._classNames.header, this._classNames.headerLabel)}>{onSelectedItemsLabel(selectedCount)}</span>\r\n {renderRemoveAll}\r\n\r\n <FocusZone\r\n className={this._classNames.list}\r\n role=\"listbox\"\r\n aria-label={intl.formatMessage(messages.selectedListAriaLabel)}\r\n direction={FocusZoneDirection.vertical}\r\n isCircularNavigation={true}\r\n >\r\n {groups.map((group: IGroup) => {\r\n const groupSubItems = selectedItems.slice(group.startIndex, group.startIndex + group.count);\r\n return (\r\n <>\r\n <span className={this._classNames.groupHeader}>\r\n {group.name}\r\n <Icon role=\"presentation\" className={this._classNames.groupHeaderIcon} iconName={'ChevronRight'} />\r\n </span>\r\n\r\n {groupSubItems.map((item: IHierarchicalPickerItem, index: number) => (\r\n <div\r\n className={css(this._classNames.listItem, this._classNames.selectedPaneItem)}\r\n id={`hierarchicalPickerSelItem-${index}`}\r\n role=\"option\"\r\n aria-selected={true}\r\n tabIndex={!disabled ? 0 : -1}\r\n onClick={!disabled ? this._onItemRemovedClick : undefined}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key) && !disabled && this._onItemRemovedClick(ev)}\r\n data-list-index={index}\r\n data-is-focusable={!disabled}\r\n >\r\n <span className={this._classNames.listItemLabel}>{item.name}</span>\r\n <Icon\r\n iconName={'remove'}\r\n styles={this._classNames.subComponentStyles.iconButton}\r\n aria-label={intl.formatMessage(messages.removeIconAriaLabel)}\r\n />\r\n </div>\r\n ))}\r\n </>\r\n );\r\n })}\r\n </FocusZone>\r\n </div>\r\n );\r\n };\r\n\r\n private _onGroupExpandedClick = (ev: React.MouseEvent<HTMLDivElement> | React.KeyboardEvent<HTMLDivElement>): void => {\r\n const filteredItems = [...this.state.filteredItems];\r\n const groups = this._createGroups(filteredItems);\r\n\r\n const index = this._getIndexOfItemAtElement(ev);\r\n\r\n if (index !== undefined) {\r\n const group = groups[index];\r\n const subItems = filteredItems.slice(group.startIndex, group.startIndex + group.count);\r\n\r\n this.setState({\r\n subItems: subItems,\r\n expandedGroup: group,\r\n });\r\n }\r\n };\r\n\r\n private _onItemAddedClick = (ev: React.MouseEvent<HTMLDivElement> | React.KeyboardEvent<HTMLDivElement>): void => {\r\n const subItems = [...this.state.subItems];\r\n const filteredItems = [...this.state.filteredItems];\r\n\r\n const index = this._getIndexOfItemAtElement(ev);\r\n\r\n if (index !== undefined) {\r\n const item = subItems[index];\r\n item.isSelected = true;\r\n const selectedItems = [...this.state.selectedItems, item];\r\n\r\n filteredItems.forEach((i) => {\r\n if (i.id === item.id) {\r\n i.isSelected = true;\r\n }\r\n });\r\n\r\n this.setState({\r\n filteredItems: filteredItems,\r\n subItems: subItems,\r\n selectedItems: selectedItems,\r\n });\r\n\r\n if (this.props.onSelectedItems) {\r\n this.props.onSelectedItems(selectedItems);\r\n }\r\n }\r\n };\r\n\r\n private _onItemRemovedClick = (ev: React.MouseEvent<HTMLDivElement> | React.KeyboardEvent<HTMLDivElement>): void => {\r\n const selectedItems = [...this.state.selectedItems];\r\n const filteredItems = [...this.state.filteredItems];\r\n const subItems = [...this.state.subItems];\r\n\r\n const index = this._getIndexOfItemAtElement(ev);\r\n\r\n if (index !== undefined) {\r\n const item = selectedItems[index];\r\n const remainingSelectedItems = selectedItems.filter((i) => i !== item);\r\n\r\n filteredItems.forEach((i) => {\r\n if (i.id === item.id) {\r\n i.isSelected = false;\r\n }\r\n });\r\n\r\n subItems.forEach((i) => {\r\n if (i.id === item.id) {\r\n i.isSelected = false;\r\n }\r\n });\r\n\r\n this.setState({\r\n selectedItems: remainingSelectedItems,\r\n subItems: subItems,\r\n filteredItems: filteredItems,\r\n });\r\n\r\n if (this.props.onSelectedItems) {\r\n this.props.onSelectedItems(remainingSelectedItems);\r\n }\r\n }\r\n };\r\n\r\n private _getIndexOfItemAtElement(ev: React.MouseEvent<HTMLDivElement> | React.KeyboardEvent<HTMLDivElement>): number | undefined {\r\n const el = ev.currentTarget as HTMLDivElement;\r\n\r\n if (el.getAttribute('data-list-index')) {\r\n const index = Number(el.getAttribute('data-list-index'));\r\n return index;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private _onSearchChange = (query: string): void => {\r\n const queryName = query.toLocaleLowerCase();\r\n const allItems = this.props.items;\r\n let subItems: IHierarchicalPickerItem[] = [];\r\n\r\n const { expandedGroup } = this.state;\r\n if (expandedGroup) {\r\n allItems.sort((a, b) => (a.parentName && b.parentName && a.parentName.toLowerCase() < b.parentName.toLowerCase() ? -1 : 1));\r\n subItems = allItems.slice(expandedGroup.startIndex, expandedGroup.startIndex + expandedGroup.count);\r\n }\r\n\r\n this.setState({\r\n filteredItems: allItems.filter((item) => {\r\n const name = item.parentName;\r\n return name!.toString().toLocaleLowerCase().indexOf(queryName) !== -1;\r\n }),\r\n subItems: subItems.filter((item) => {\r\n const name = item.name;\r\n return name!.toString().toLocaleLowerCase().indexOf(queryName) !== -1;\r\n }),\r\n });\r\n };\r\n\r\n private _getIntersection = (collectionA: IHierarchicalPickerItem[], collectionB: IHierarchicalPickerItem[]) => {\r\n return collectionA.filter((selectedItem) => collectionB.some((item) => selectedItem.id === item.id));\r\n };\r\n\r\n private _onRemoveAll = (ev: React.MouseEvent<HTMLElement>): void => {\r\n const filterItems = [...this.state.filteredItems];\r\n const subItems = [...this.state.subItems];\r\n filterItems.map((item) => (item.isSelected = false));\r\n subItems.map((item) => (item.isSelected = false));\r\n\r\n // reset items isSelected props on removeAll clicked;\r\n this.props.items.map((item) => (item.isSelected = false));\r\n\r\n this.setState({\r\n selectedItems: [],\r\n subItems: subItems,\r\n filteredItems: filterItems,\r\n });\r\n\r\n if (this.props.onSelectedItems) {\r\n this.props.onSelectedItems([]);\r\n }\r\n };\r\n\r\n private _onAddAll = (): void => {\r\n const selectedItems = [...this.state.selectedItems];\r\n const filteredItems = [...this.state.filteredItems];\r\n const subItems = [...this.state.subItems];\r\n\r\n subItems.forEach((item) => {\r\n if (!item.isSelected) {\r\n selectedItems.push(item);\r\n }\r\n item.isSelected = true;\r\n });\r\n\r\n selectedItems.forEach((item) => {\r\n filteredItems.find((i) => i.id === item.id)!.isSelected = true;\r\n });\r\n\r\n this.setState({\r\n selectedItems: selectedItems,\r\n subItems: subItems,\r\n filteredItems: filteredItems,\r\n });\r\n\r\n if (this.props.onSelectedItems) {\r\n this.props.onSelectedItems(selectedItems);\r\n }\r\n };\r\n\r\n private _createGroups = (items: IHierarchicalPickerItem[]): IGroup[] => {\r\n items.sort((a, b) => (a.parentName && b.parentName && a.parentName.toLowerCase() < b.parentName.toLowerCase() ? -1 : 1));\r\n\r\n const groups = items.reduce((current: IGroup[], item: IHierarchicalPickerItem, index: number) => {\r\n const currentGroup = current[current.length - 1];\r\n if (item.parentId) {\r\n const itemColumnValue = item.parentId.toString();\r\n\r\n if (!currentGroup || currentGroup.key !== itemColumnValue) {\r\n current.push({\r\n key: itemColumnValue,\r\n name: item.parentName || '',\r\n startIndex: index,\r\n count: 1,\r\n level: 0,\r\n });\r\n } else {\r\n currentGroup.count++;\r\n }\r\n }\r\n return current;\r\n }, [] as IGroup[]);\r\n return groups;\r\n };\r\n}\r\n","import { AnimationClassNames, FontWeights } from '@fluentui/react';\r\nimport { IHierarchicalMultiSelectPickerStyleProps, IHierarchicalMultiSelectPickerStyles } from '.';\r\nimport { IPubcenterSpacing } from '../../../theme';\r\n\r\nexport const getStyles = (props: IHierarchicalMultiSelectPickerStyleProps): IHierarchicalMultiSelectPickerStyles => {\r\n const { theme, height, hasErrorMessage } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const defaultHeight = 260;\r\n const { semanticColors } = theme;\r\n\r\n return {\r\n root: ['ms-HierarchicalMultiSelectPicker'],\r\n picker: {\r\n height: height || defaultHeight,\r\n display: 'flex',\r\n flexDirection: 'row',\r\n marginTop: spacing.size8,\r\n width: 860,\r\n },\r\n itemsPane: [\r\n {\r\n display: 'flex',\r\n flex: 1,\r\n flexDirection: 'column',\r\n overflow: 'hidden',\r\n borderWidth: 1,\r\n borderStyle: 'solid',\r\n borderColor: theme.palette.neutralTertiary,\r\n selectors: {\r\n ':first-child': {\r\n marginRight: spacing.size16,\r\n flex: 2,\r\n },\r\n },\r\n },\r\n hasErrorMessage && {\r\n borderColor: semanticColors.errorText,\r\n selectors: {\r\n '&:focus, &:hover': {\r\n borderColor: semanticColors.errorText,\r\n },\r\n },\r\n },\r\n ],\r\n subPane: [\r\n {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n overflowY: 'auto',\r\n height: '-webkit-fill-available',\r\n },\r\n ],\r\n subItemsPane: [\r\n {\r\n display: 'flex',\r\n flex: 1,\r\n flexDirection: 'column',\r\n overflow: 'hidden',\r\n },\r\n ],\r\n header: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'space-between',\r\n marginTop: spacing.size8,\r\n marginBottom: spacing.size8,\r\n },\r\n headerLabel: [\r\n 'ms-font-m',\r\n {\r\n fontWeight: FontWeights.semibold,\r\n marginLeft: spacing.size8,\r\n },\r\n ],\r\n textButton: {\r\n display: 'flex',\r\n alignSelf: 'flex-end',\r\n marginRight: spacing.size8,\r\n },\r\n errorMessage: [\r\n 'ms-HierarchicalMultiSelectPicker-errorMessage',\r\n AnimationClassNames.slideDownIn20,\r\n theme.fonts.small,\r\n {\r\n color: semanticColors.errorText,\r\n margin: 0,\r\n paddingTop: 5,\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n ],\r\n list: {\r\n flex: 1,\r\n overflowY: 'auto',\r\n },\r\n disabledPanel: {\r\n backgroundColor: theme.palette.neutralLighter,\r\n },\r\n listItem: {\r\n display: 'flex',\r\n paddingLeft: spacing.size8,\r\n paddingRight: spacing.size8,\r\n height: spacing.size36,\r\n lineHeight: spacing.size36,\r\n cursor: 'pointer',\r\n selectors: {\r\n ':hover': {\r\n backgroundColor: theme.palette.neutralLighter,\r\n },\r\n },\r\n },\r\n disabledListItem: {\r\n backgroundColor: theme.palette.neutralLight,\r\n },\r\n listItemLabel: [\r\n 'ms-font-m',\r\n {\r\n flex: 1,\r\n textOverflow: 'ellipsis',\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n },\r\n ],\r\n headerTitle: [\r\n theme.fonts.medium,\r\n {\r\n padding: '10px 0',\r\n fontWeight: FontWeights.semibold,\r\n marginLeft: spacing.size8,\r\n },\r\n ],\r\n groupHeader: [\r\n 'ms-font-m',\r\n {\r\n display: 'flex',\r\n alignItems: 'center',\r\n marginTop: spacing.size8,\r\n marginLeft: spacing.size4,\r\n color: theme.palette.neutralSecondary,\r\n },\r\n ],\r\n groupHeaderIcon: {\r\n marginLeft: spacing.size4,\r\n },\r\n selectedPaneItem: {\r\n paddingLeft: spacing.size16,\r\n },\r\n subComponentStyles: {\r\n search: {\r\n root: {\r\n height: spacing.size48,\r\n },\r\n },\r\n iconButton: {\r\n root: [\r\n 'ms-font-m',\r\n {\r\n color: theme.palette.themePrimary,\r\n },\r\n ],\r\n },\r\n },\r\n };\r\n};\r\n","import { styled } from '@fluentui/react';\r\nimport { HierarchicalMultiSelectPickerBase } from './HierarchicalMultiSelectPicker.base';\r\nimport { getStyles } from './HierarchicalMultiSelectPicker.styles';\r\n\r\nexport const HierarchicalMultiSelectPicker = styled(HierarchicalMultiSelectPickerBase, getStyles, undefined, {\r\n scope: 'HierarchicalMultiSelectPicker',\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n attachedAdUnits: {\r\n id: 'admanagement.property.attachedAdUnits',\r\n defaultMessage: 'Attached Ad units',\r\n },\r\n searchBoxPlaceHolder: {\r\n id: 'admanagement.property.searchBoxPlaceHolder',\r\n defaultMessage: 'Search ad unit or account by name',\r\n },\r\n initialSearchBoxPlaceHolder: {\r\n id: 'admanagement.property.initialSearchBoxPlaceHolder',\r\n defaultMessage: 'Search account by name',\r\n },\r\n adUnitPickerAccountsCountLabel: {\r\n id: 'admanagement.property.adUnitPicker.AccountsCountLabel',\r\n defaultMessage: 'Accounts: {count}',\r\n },\r\n adUnitPickerAdUnitsCountLabel: {\r\n id: 'admanagement.property.adUnitPicker.AdUnitsCountLabel',\r\n defaultMessage: 'Ad units: {count}',\r\n },\r\n});\r\n","import React, { useEffect, useState } from 'react';\r\nimport { completeAccess, hasReadAccess } from '../../../../../../../../@data/services/UserRoleService';\r\nimport AppMessages from '../../../../../../../../App.messages';\r\nimport { FormItem, FormSection, FormState, IFormEditParams } from '../../../../../../../../components/Form';\r\nimport { HierarchicalMultiSelectPicker } from '../../../../../../../../components/HierarchicalMultiSelectPicker';\r\nimport { IRouterWithIntl, injectIntlWithObserver } from '../../../../../../../../utils';\r\nimport { getCreatePropertyStore } from '../../../../__data__/store/store';\r\nimport { onAttachedAdunitsChanged } from '../../__data__/mutatorActions';\r\nimport { loadAttachedAdUnits } from '../../__data__/orchestrators';\r\nimport { GetPropertyAccessPermission } from '../../utils/GetPropertyAccessPermissions';\r\nimport { IsDisabled } from '../../utils/IsFieldDisabled';\r\nimport messages from './messages';\r\n\r\nexport interface IPropertyAttachedAdUnitsFieldProps {\r\n mode: FormState;\r\n}\r\n\r\nconst PropertyAttachedAdUnitsField = injectIntlWithObserver<IRouterWithIntl<IFormEditParams> & IPropertyAttachedAdUnitsFieldProps>(\r\n ({ intl, mode, match }) => {\r\n const { formatMessage } = intl;\r\n const { active } = getCreatePropertyStore();\r\n const propertyAccessPermissions = GetPropertyAccessPermission();\r\n const accessLevel = propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.attachedAdUnits;\r\n const { publisherId, accountId, id: entityId } = match.params;\r\n const [isExpanded, setExpanded] = useState(false);\r\n\r\n if (!hasReadAccess(accessLevel)) {\r\n return null;\r\n }\r\n\r\n useEffect(() => {\r\n if (isExpanded && publisherId && active.adunits === undefined) {\r\n loadAttachedAdUnits(mode, publisherId, accountId, entityId);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [publisherId, entityId, isExpanded, active.adunits]);\r\n\r\n return (\r\n <FormSection title={formatMessage(messages.attachedAdUnits)} hasBorderBottom={false} sectionStateChange={setExpanded}>\r\n <FormItem>\r\n <HierarchicalMultiSelectPicker\r\n items={active.adunits || []}\r\n searchBoxPlaceHolder={formatMessage(messages.searchBoxPlaceHolder)}\r\n initialSearchBoxPlaceHolder={formatMessage(messages.initialSearchBoxPlaceHolder)}\r\n onFilteredItemsLabel={(count: number) => formatMessage(messages.adUnitPickerAccountsCountLabel, { count: count })}\r\n onSelectedItemsLabel={(count: number) => formatMessage(AppMessages.multiSelectPickerSelectedItemsLabel, { count: count })}\r\n onSubItemsLabel={(count) => formatMessage(messages.adUnitPickerAdUnitsCountLabel, { count: count })}\r\n onSelectedItems={(items) => onAttachedAdunitsChanged(items)}\r\n initialSelectedItems={active.adunitsSelected}\r\n intl={intl}\r\n disabled={IsDisabled(mode, accessLevel)}\r\n />\r\n </FormItem>\r\n </FormSection>\r\n );\r\n }\r\n);\r\n\r\nexport default PropertyAttachedAdUnitsField;\r\n","import * as React from 'react';\r\nimport { useEffect, useState } from 'react';\r\nimport { getAppStore } from '../../../../../../@data';\r\n\r\nimport { DetailPage } from '../../../../../../layout/DetailPage/DetailPage';\r\nimport { injectIntlWithObserver } from '../../../../../../utils/ReactUtils';\r\nimport { getCreatePropertyStore } from '../../__data__/store/store';\r\nimport PropertyIdField from '../../components/PropertyIdField';\r\nimport PropertyNameInputField from '../../components/PropertyNameInputField';\r\nimport PropertyUrlInputField from '../../components/PropertyUrlInputField';\r\nimport useDetailsPageButtonsStatus from '../../utils/useDetailsPageButtonsStatus';\r\nimport { onFormInitialized, onFormSubmitted } from './__data__/orchestrators';\r\nimport ClaritySection from './components/ClarityFormSection';\r\nimport PropertyApprovalStateField from './components/PropertyApprovalStateField';\r\nimport PropertyApprovalStatusInputField from './components/PropertyApprovalStatusInputField';\r\nimport PropertyAttachedAdUnitsField from './components/PropertyAttachedAdUnitsField';\r\nimport { ICreatePropertyProps, IFormInitializationState } from './types';\r\n\r\nexport const CreateProperty = injectIntlWithObserver<ICreatePropertyProps & IFormInitializationState>((props) => {\r\n const {\r\n match,\r\n mode,\r\n intl: { formatMessage },\r\n history,\r\n onSubmit,\r\n onCancel,\r\n isInPanel,\r\n saving: savingProp,\r\n } = props;\r\n const { saving, loading } = getAppStore();\r\n const { active } = getCreatePropertyStore();\r\n const { publisherId, accountId, id: entityId } = match.params;\r\n\r\n const [activePropertyId, setActivePropertyId] = useState(entityId);\r\n const { titleLabel, submitLabel, onHandleCancel, isSubmitButtonDisabled } = useDetailsPageButtonsStatus(\r\n history,\r\n mode,\r\n onSubmit,\r\n onCancel,\r\n formatMessage\r\n );\r\n\r\n useEffect(() => {\r\n if (activePropertyId !== entityId) {\r\n setActivePropertyId(entityId);\r\n if (publisherId) {\r\n onFormInitialized(mode, publisherId, accountId, entityId);\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [entityId]);\r\n\r\n useEffect(() => {\r\n if (publisherId) {\r\n onFormInitialized(mode, publisherId, accountId, entityId);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <DetailPage\r\n titleLabel={titleLabel}\r\n helpId={'pop_PCv4_PropertiesCreate'}\r\n submitLabel={submitLabel}\r\n onCancel={() => onHandleCancel(publisherId, accountId)}\r\n onSubmit={() => onFormSubmitted(mode, history, onSubmit)}\r\n onNavClick={() => onHandleCancel(publisherId, accountId)}\r\n saving={saving || savingProp}\r\n loading={loading}\r\n pageMode={mode}\r\n hasFormTitle\r\n submitButtonDisabled={isSubmitButtonDisabled(active)}\r\n additionalHeightBoundary={isInPanel}\r\n >\r\n <PropertyNameInputField mode={mode} />\r\n <PropertyIdField id={active.id} />\r\n <PropertyUrlInputField mode={mode} />\r\n <PropertyApprovalStateField mode={mode} />\r\n <ClaritySection mode={mode} clarityConfigs={active.clarity} />\r\n <PropertyAttachedAdUnitsField {...props} mode={mode} />\r\n <PropertyApprovalStatusInputField mode={mode} />\r\n </DetailPage>\r\n );\r\n});\r\n","// Copy of NativeAdTemplate with nessesary edits for boost user experience\r\n// tslint:disable: max-line-length\r\n\r\nimport { Model } from './Model';\r\nimport { Asset, RenderingConfig } from './NativeAdTemplate';\r\n\r\nexport class NativeAdTemplateBoost extends Model {\r\n public apiPath = undefined;\r\n public className = 'templates';\r\n\r\n public type: TemplateTypeNumber;\r\n public adUnitId: number;\r\n public numberOfAds: number;\r\n public assets: Asset[];\r\n public renderingConfig: RenderingConfig;\r\n}\r\n\r\nexport enum TemplateTypeNumber {\r\n Custom = 0,\r\n ImageAbove = 1,\r\n ImageOnSide = 2,\r\n TitleAbove = 3,\r\n TextOnly = 4,\r\n TextOnImage = 5,\r\n}\r\n","// Approximate to the closest prefixed unit\r\nconst BYTE_UNITS = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\r\nexport function convertSizeToReadableUnits(numberOfBytes): string {\r\n const exponent = Math.min(Math.floor(Math.log(numberOfBytes) / Math.log(1024)), BYTE_UNITS.length - 1);\r\n\r\n const approx = numberOfBytes / 1024 ** exponent;\r\n const output = exponent === 0 ? `${numberOfBytes}B` : `${approx.toFixed(0)} ${BYTE_UNITS[exponent]}`;\r\n return output;\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n nonCSVFileUploadError: {\r\n id: 'boost.nonCSVFileUploadError',\r\n defaultMessage: 'File upload failed. Please upload only CSV file.',\r\n },\r\n uploadSizeLimitError: {\r\n id: 'boost.uploadSizeLimitError',\r\n defaultMessage: \"File size can't exceed {limit}. Please upload a smaller file.\",\r\n },\r\n uploadError: {\r\n id: 'boost.uploadError',\r\n defaultMessage: \"The file didn't upload. Please upload it again.\",\r\n },\r\n downloadTemplate: {\r\n id: 'boost.template',\r\n defaultMessage: 'Download Current Template',\r\n },\r\n uploadFile: {\r\n id: 'boost.uploadFile',\r\n defaultMessage: 'Upload file',\r\n },\r\n errorMessage: {\r\n id: 'boost.errorMessage',\r\n defaultMessage: 'Incorrect JSON, fix JSON and then replace the file',\r\n },\r\n});\r\n","import { getTheme, ITheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../../../../../theme';\r\nimport { flexWithAlignCenter, flexWithJustifyBetween } from '../../../../../../utils/GlobalStyleUtils';\r\n\r\nexport interface IBoostTemplateUploadStyleProps {\r\n theme: ITheme;\r\n isError?: boolean;\r\n}\r\n\r\ntype StyleProperties =\r\n | 'fileUploadContainerStyle'\r\n | 'fileUploadLabelStyle'\r\n | 'fileUploadDescriptionStyle'\r\n | 'fileInputStyle'\r\n | 'uploadStatusStyle'\r\n | 'errorStyle'\r\n | 'progressContainerStyle'\r\n | 'actionContainerStyle'\r\n | 'fileUploadedStyle'\r\n | 'csvTemplateLinkStyle';\r\ntype BoostTemplateUploadStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: IBoostTemplateUploadStyleProps): BoostTemplateUploadStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { spacing, palette, fonts } = theme;\r\n\r\n return mergeStyleSets({\r\n fileUploadContainerStyle: {\r\n ...flexWithAlignCenter,\r\n justifyContent: 'center',\r\n flexDirection: 'column',\r\n background: palette.neutralLighterAlt,\r\n border: `1px dashed ${props.isError ? palette.red : palette.neutralQuaternaryAlt}`,\r\n padding: spacing.size24,\r\n marginBottom: spacing.size2,\r\n borderRadius: spacing.size4,\r\n },\r\n fileInputStyle: {\r\n display: 'none',\r\n },\r\n fileUploadLabelStyle: {\r\n color: palette.highContrastPrimary,\r\n cursor: 'pointer',\r\n },\r\n csvTemplateLinkStyle: {\r\n color: palette.highContrastLink,\r\n },\r\n fileUploadDescriptionStyle: {\r\n ...fonts.size12,\r\n marginTop: spacing.size4,\r\n opacity: '0.8',\r\n },\r\n fileUploadedStyle: {\r\n ...flexWithJustifyBetween,\r\n width: '100%',\r\n },\r\n uploadStatusStyle: {\r\n ...fonts.size12,\r\n opacity: 0.8,\r\n marginTop: spacing.size8,\r\n },\r\n actionContainerStyle: {\r\n display: 'flex',\r\n gap: spacing.size12,\r\n },\r\n errorStyle: {\r\n color: palette.red,\r\n },\r\n progressContainerStyle: {\r\n flexGrow: 1,\r\n marginRight: spacing.size12,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): BoostTemplateUploadStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { IconButton, MessageBarType, ProgressIndicator } from '@fluentui/react';\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { NativeAdTemplate, onNotificationChanged } from '../../../../../../@data';\r\nimport { NativeAdTemplateBoost, TemplateTypeNumber } from '../../../../../../@data/store/schema/models/NativeAdTemplateBoost';\r\nimport AppMessages from '../../../../../../App.messages';\r\nimport { injectIntlAndObserver } from '../../../../../../utils';\r\nimport { convertSizeToReadableUnits } from '../../../../../../utils/UnitsUtils';\r\nimport { getAdunitStore } from '../../../@data';\r\nimport messages from './BoostJsonFileUpload.messages';\r\nimport { getClassNames } from './BoostJsonFileUpload.styles';\r\n\r\nconst ACCEPTED_FILE_EXTENSION = '.JSON';\r\nconst JSON_FILE_TYPE = 'text/JSON';\r\nexport interface IBoostJsonFileUpload {\r\n adUnitId?: string;\r\n onNewFileUpload: (file: NativeAdTemplate) => void;\r\n onReplaceFile?: (file: NativeAdTemplate) => void;\r\n existingDomains?: string[];\r\n}\r\n\r\nexport interface IFileUploadStats {\r\n name?: string;\r\n type?: string;\r\n size?: number;\r\n readableSize?: string;\r\n successCount?: number;\r\n failureCount?: number;\r\n conflictCount?: number;\r\n}\r\n\r\nenum FileOperation {\r\n NewUpload,\r\n Append,\r\n Replace,\r\n}\r\n\r\nexport const LAST_FILE_UPLOAD_INFO_KEY = 'lastFileUploadInfo';\r\n\r\nexport const BoostJsonFileUpload = injectIntlAndObserver(\r\n ({ adUnitId, intl, onNewFileUpload, onReplaceFile }: IBoostJsonFileUpload & InjectedIntlProps) => {\r\n const {\r\n active: { BoostTemplate },\r\n } = getAdunitStore();\r\n\r\n const { formatMessage } = intl;\r\n const [isUploadInProgress, setIsUploadInProgress] = useState(false);\r\n const [fileUploadError, setFileUploadError] = useState<string | null>(null);\r\n const [fileUploadStats, setFileUploadStats] = useState<IFileUploadStats | null>(null);\r\n const [template, setTemplate] = useState<NativeAdTemplate | undefined>(BoostTemplate);\r\n\r\n const fileReader = useRef(new FileReader());\r\n let fileOperation: FileOperation;\r\n\r\n const {\r\n fileInputStyle,\r\n fileUploadContainerStyle,\r\n fileUploadLabelStyle,\r\n fileUploadedStyle,\r\n errorStyle,\r\n progressContainerStyle,\r\n actionContainerStyle,\r\n } = getClassNames({\r\n isError: !!fileUploadError,\r\n });\r\n\r\n function getFileUploadStorageKey() {\r\n return 'boostAdUnitTemplateJsonFile';\r\n }\r\n\r\n function handleReplaceFile(event) {\r\n fileOperation = FileOperation.Replace;\r\n return handleFileUpload(event);\r\n }\r\n\r\n function handleNewFileUpload(event) {\r\n fileOperation = FileOperation.NewUpload;\r\n return handleFileUpload(event);\r\n }\r\n\r\n function boostFileValidation(JsonObject) {\r\n return (\r\n JsonObject.type !== undefined &&\r\n JsonObject.numberOfAds !== undefined &&\r\n JsonObject.assets !== undefined &&\r\n JsonObject.renderingConfig !== undefined\r\n );\r\n }\r\n\r\n function handleFileUpload(event) {\r\n setFileUploadError(null);\r\n const file = event.target.files[0] as File;\r\n const { size, name, type } = file || {};\r\n\r\n setFileUploadStats({ readableSize: convertSizeToReadableUnits(size), size, name, type });\r\n\r\n const readerInstance = fileReader.current;\r\n\r\n readerInstance.onloadstart = () => setIsUploadInProgress(true);\r\n readerInstance.onloadend = () => {\r\n const { result } = readerInstance;\r\n if (typeof result !== 'string') {\r\n const errorMessage = formatMessage(messages.errorMessage);\r\n const errorDiv = document.createElement('div');\r\n errorDiv.innerHTML = errorMessage;\r\n document.body.appendChild(errorDiv);\r\n onNotificationChanged({ text: errorMessage, messageBarType: MessageBarType.error });\r\n setFileUploadError(formatMessage(messages.uploadError));\r\n return;\r\n }\r\n\r\n try {\r\n const JsonObject: NativeAdTemplate = JSON.parse(result);\r\n if (!boostFileValidation(JsonObject)) {\r\n // setFileUploadStats({ name: 'ERROR: Incorrect Format' });\r\n setFileUploadError(formatMessage(messages.uploadError));\r\n return;\r\n }\r\n\r\n if (fileOperation === FileOperation.Replace && fileUploadStats) {\r\n onReplaceFile?.(JsonObject);\r\n } else {\r\n onNewFileUpload(JsonObject);\r\n }\r\n setTemplate(JsonObject);\r\n } catch (e) {\r\n const errorMessage = formatMessage(messages.errorMessage);\r\n setFileUploadError(formatMessage(messages.uploadError));\r\n onNotificationChanged({ text: errorMessage, messageBarType: MessageBarType.error });\r\n }\r\n\r\n setFileUploadStats((prevValue) => ({\r\n ...prevValue,\r\n }));\r\n };\r\n\r\n readerInstance.readAsText(file, JSON_FILE_TYPE);\r\n }\r\n\r\n function isNoFileUploadedYet() {\r\n return !isUploadInProgress && !fileUploadStats && template === undefined;\r\n }\r\n\r\n function shouldShowFileDetails(): boolean {\r\n return !!fileUploadStats && !isUploadInProgress;\r\n }\r\n\r\n function cancelUpload() {\r\n fileReader.current.abort();\r\n setIsUploadInProgress(false);\r\n }\r\n\r\n function renderUploadInProgressSection() {\r\n const { name } = fileUploadStats || {};\r\n if (!isUploadInProgress || !name) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className={fileUploadedStyle}>\r\n <div className={progressContainerStyle}>\r\n <div className=\"fileNameStyle\">{name}</div>\r\n <ProgressIndicator />\r\n </div>\r\n <div className=\"closeContainerStyle\">\r\n <IconButton iconProps={{ iconName: 'Cancel' }} onClick={cancelUpload} />\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n function renderFileUploadedSection() {\r\n if (!fileUploadStats) {\r\n return null;\r\n }\r\n\r\n const { name, readableSize } = fileUploadStats;\r\n return (\r\n <div className={fileUploadedStyle}>\r\n <div>\r\n <div className=\"fileName\">\r\n {name} ({readableSize})\r\n </div>\r\n </div>\r\n <div className={actionContainerStyle}>\r\n <label className={fileUploadLabelStyle} tabIndex={0}>\r\n <input type=\"file\" className={fileInputStyle} accept={ACCEPTED_FILE_EXTENSION} onChange={handleReplaceFile} />\r\n {formatMessage(AppMessages.replace)}\r\n </label>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n function renderNoFileUploadedSection() {\r\n return (\r\n <label className={fileUploadLabelStyle} tabIndex={0}>\r\n <input type=\"file\" className={fileInputStyle} accept={ACCEPTED_FILE_EXTENSION} onChange={handleNewFileUpload} />\r\n {formatMessage(messages.uploadFile)}\r\n </label>\r\n );\r\n }\r\n\r\n const handleDownload = async () => {\r\n // Code to download file goes here...\r\n if (template !== undefined) {\r\n const jsonLink = document.createElement('a');\r\n // Need logic to turn the string into number\r\n const ParsedBoostTemplate: NativeAdTemplateBoost = JSON.parse(JSON.stringify(template));\r\n ParsedBoostTemplate.type = TemplateTypeNumber[template.type as keyof typeof TemplateTypeNumber];\r\n jsonLink.setAttribute(\r\n 'download',\r\n ParsedBoostTemplate.name ? ParsedBoostTemplate.name.toString() + '.JSON' : 'CurrentTemplate.JSON'\r\n );\r\n const dataStr = 'data:text/json;charset=utf-8,' + encodeURIComponent(JSON.stringify(ParsedBoostTemplate));\r\n jsonLink.setAttribute('href', dataStr);\r\n document.body.appendChild(jsonLink);\r\n jsonLink.click();\r\n document.body.removeChild(jsonLink);\r\n } else {\r\n alert('No template found');\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (fileUploadStats && !fileUploadError) {\r\n sessionStorage.setItem(getFileUploadStorageKey(), JSON.stringify(fileUploadStats));\r\n setIsUploadInProgress(false);\r\n }\r\n }, [fileUploadStats, fileUploadError]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (template === undefined) {\r\n setFileUploadStats(null);\r\n }\r\n };\r\n // eslint-disable-next-line\r\n }, []);\r\n\r\n return (\r\n <>\r\n <div className={fileUploadContainerStyle}>\r\n {isUploadInProgress && renderUploadInProgressSection()}\r\n {shouldShowFileDetails() && renderFileUploadedSection()}\r\n {isNoFileUploadedYet() && renderNoFileUploadedSection()}\r\n {fileUploadStats === null && template && (\r\n <div className={fileUploadedStyle} tabIndex={0}>\r\n <label className={fileUploadLabelStyle} onClick={handleDownload}>\r\n {formatMessage(messages.downloadTemplate)}\r\n </label>\r\n <div className={actionContainerStyle}>\r\n <label className={fileUploadLabelStyle} tabIndex={0}>\r\n <input type=\"file\" className={fileInputStyle} accept={ACCEPTED_FILE_EXTENSION} onChange={handleReplaceFile} />\r\n {formatMessage(AppMessages.replace)}\r\n </label>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n {fileUploadError && <div className={errorStyle}>{fileUploadError}</div>}\r\n </>\r\n );\r\n }\r\n);\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport const mediationPopupMessages = defineMessages({\r\n title: {\r\n id: 'mediationPopupMessages.title',\r\n defaultMessage: 'Are you sure you want to opt out of mediation?',\r\n },\r\n description: {\r\n id: 'mediationPopupMessages.description',\r\n defaultMessage: 'Mediation will help boost your revenue for each ad placement.',\r\n },\r\n turnOff: {\r\n id: 'mediationPopupMessages.turnOff',\r\n defaultMessage: 'Turn off',\r\n },\r\n});\r\n","import React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { getAppStore } from '../../../../../../@data';\r\nimport { onPopupOpenChanged } from '../../../../../../@data/mutatorActions';\r\nimport { PopupType } from '../../../../../../@data/store/schema/enums/PopupType';\r\nimport messages from '../../../../../../App.messages';\r\nimport { PopupCard } from '../../../../../../components/Popup';\r\nimport { injectIntlAndObserver } from '../../../../../../utils';\r\nimport { onAdSenseMediationToggleChanged } from '../../../@data/mutatorActions';\r\n\r\nimport { mediationPopupMessages } from './DisablingMediationPopup.messages';\r\n\r\nexport interface IOptOutMediationPopupProps extends InjectedIntlProps {}\r\n\r\nexport const OptOutMediationPopup = injectIntlAndObserver(function DisablingMediationComponent({\r\n intl: { formatMessage },\r\n}: IOptOutMediationPopupProps): JSX.Element {\r\n const { openedPopup } = getAppStore();\r\n\r\n return (\r\n <PopupCard\r\n isShown={openedPopup === PopupType.AdUnitOptOut}\r\n popUpTitle={formatMessage(mediationPopupMessages.title)}\r\n popUpDescription={formatMessage(mediationPopupMessages.description)}\r\n primaryButtonAriaLabel={formatMessage(mediationPopupMessages.turnOff)}\r\n secondaryButtonAriaLabel={formatMessage(messages.cancel)}\r\n onPopupDismiss={() => {\r\n onPopupOpenChanged(PopupType.None);\r\n onAdSenseMediationToggleChanged(true);\r\n }}\r\n onPrimaryButtonClick={() => {\r\n onPopupOpenChanged(PopupType.None);\r\n onAdSenseMediationToggleChanged(false);\r\n }}\r\n onSecondaryButtonClick={() => {\r\n onPopupOpenChanged(PopupType.None);\r\n onAdSenseMediationToggleChanged(true);\r\n }}\r\n />\r\n );\r\n});\r\n","export const DEFAULT_AD_PREVIEW_FONT = 'Arial';\r\nexport const DEFAULT_AD_PREVIEW_BACKGROUND_COLOR = '#ffffff';\r\nexport const DEFAULT_AD_PREVIEW_BUTTON_BACKGROUND_COLOR = '#ffffff';\r\nexport const DEFAULT_AD_PREVIEW_TITLE_BACKGROUND_COLOR = '#3a474e';\r\n\r\nexport enum TythonAdTypes {\r\n Native = 'Native',\r\n Display = 'Display',\r\n}\r\n\r\nexport enum TythonAdUnitDisplayAdTypeLayout {\r\n Horizontal = 'Horizontal',\r\n Square = 'Square',\r\n Vertical = 'Vertical',\r\n}\r\n\r\nexport type TythonAdUnitDisplayAdTypeLayoutKey = keyof typeof TythonAdUnitDisplayAdTypeLayout;\r\n\r\nexport const TythonAdUnitDisplayAdTypeLayoutLabel: { [key in TythonAdUnitDisplayAdTypeLayoutKey]: string } = {\r\n Horizontal: 'displayAdHorizontal',\r\n Square: 'displayAdSqaure',\r\n Vertical: 'displayAdVertical',\r\n};\r\n","import { IProcessedStyleSet, getTheme } from '@fluentui/react';\r\nimport { useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { IAdUnitTypeSelectorProps } from '.';\r\nimport { usePreloadSVGImages } from '../../../../../../hooks';\r\nimport { getClassNames } from '../../../Create/CreateAdunit';\r\nimport { getStyles } from '../../../Create/CreateAdunit.styles';\r\nimport { ICreateAdunitStyles } from '../../../Create/CreateAdunit.types';\r\nimport { TythonAdTypes, TythonAdUnitDisplayAdTypeLayout } from '../../CreateAdunit/constants';\r\nimport HorizontalBottomAdPreview from '../../resources/HorizontalBottomAdPreview.svg';\r\nimport HorizontalUpperAdPreview from '../../resources/HorizontalUpperAdPreview.svg';\r\nimport SquareBottomAdPreview from '../../resources/SquareBottomAdPreview.svg';\r\nimport SquareLeftAdPreview from '../../resources/SquareLeftAdPreview.svg';\r\nimport VerticalBottomAdPreview from '../../resources/VerticalBottomAdPreview.svg';\r\nimport VerticalLeftAdPreview from '../../resources/VerticalLeftAdPreview.svg';\r\nimport { IAdPreviewConfig } from './PreviewComponent';\r\n\r\ntype UseAdUnitTypeSelector = ({\r\n adTypes,\r\n nativeProperties,\r\n onChange,\r\n}: IAdUnitTypeSelectorProps) => {\r\n classNames: IProcessedStyleSet<ICreateAdunitStyles>;\r\n isSdkLoaded: boolean;\r\n adPreviewConfig: IAdPreviewConfig;\r\n isNativeAdActive: boolean;\r\n isDisplayAdActive: boolean;\r\n shouldRenderNoSelectionMsg: boolean;\r\n shouldRenderFewerSelectionMsg: boolean;\r\n displayAdLayout: TythonAdUnitDisplayAdTypeLayout;\r\n onDisaplayAdLayoutChange: (layout: TythonAdUnitDisplayAdTypeLayout) => void;\r\n onAdPreviewConfigChange: (key: keyof IAdPreviewConfig, value?: string) => void;\r\n onToggleNativeAd: (active: boolean) => void;\r\n onToggleDisplayAd: (active: boolean) => void;\r\n onToggleAdType: (active: boolean, type: TythonAdTypes) => void;\r\n};\r\n\r\nexport const DEFAULT_AD_PREVIEW_HEIGHT = 250;\r\nconst DEFAULT_AD_PREVIEW_WIDTH = 500;\r\nconst NUMERIC_FIELDS = ['adHeight', 'adWidth'];\r\n\r\nconst theme = getTheme();\r\n\r\nconst useAdUnitTypeSelector: UseAdUnitTypeSelector = ({ adTypes = [], nativeProperties, onChange }) => {\r\n const { fontFamily, background, buttonBackground, titleColor } = nativeProperties ?? {};\r\n const [isSdkLoaded, setSdkLoaded] = useState<boolean>(false);\r\n const [adDimensions, setAdDimensions] = useState<[number, number]>([DEFAULT_AD_PREVIEW_HEIGHT, DEFAULT_AD_PREVIEW_WIDTH]);\r\n const [displayAdLayout, setDisplayAdLayout] = useState<TythonAdUnitDisplayAdTypeLayout>(TythonAdUnitDisplayAdTypeLayout.Horizontal);\r\n\r\n const imageList = [\r\n HorizontalUpperAdPreview,\r\n VerticalLeftAdPreview,\r\n SquareLeftAdPreview,\r\n HorizontalBottomAdPreview,\r\n SquareBottomAdPreview,\r\n VerticalBottomAdPreview,\r\n ];\r\n usePreloadSVGImages(imageList);\r\n\r\n const classNames = getClassNames(getStyles, {\r\n theme,\r\n adPreviewHeight: adDimensions[0],\r\n adPreviewWidth: adDimensions[1],\r\n });\r\n\r\n const adPreviewConfig = useMemo(\r\n () => ({\r\n adHeight: adDimensions[0],\r\n adWidth: adDimensions[1],\r\n fontFamily: fontFamily,\r\n background: background,\r\n buttonBackground: buttonBackground,\r\n titleColor: titleColor,\r\n }),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [adDimensions, nativeProperties]\r\n );\r\n\r\n const [isNativeAdActive, isDisplayAdActive, shouldRenderNoSelectionMsg, shouldRenderFewerSelectionMsg] = useMemo(\r\n () => [\r\n adTypes?.includes(TythonAdTypes.Native),\r\n adTypes?.includes(TythonAdTypes.Display),\r\n adTypes ? adTypes.length === 0 : false,\r\n adTypes ? adTypes.length === 1 : false,\r\n ],\r\n [adTypes]\r\n );\r\n\r\n const onAdPreviewConfigChange = (key: keyof IAdPreviewConfig, value: string) => {\r\n switch (key) {\r\n case 'adHeight': {\r\n setAdDimensions([Number(value), adDimensions[1]]);\r\n break;\r\n }\r\n\r\n case 'adWidth': {\r\n setAdDimensions([adDimensions[0], Number(value)]);\r\n break;\r\n }\r\n\r\n default: {\r\n const { adHeight, adWidth, ...nativePropertyConfigs } = adPreviewConfig;\r\n onChange({ nativeProperties: { ...nativePropertyConfigs, [key]: NUMERIC_FIELDS.includes(key) ? Number(value) : value } });\r\n }\r\n }\r\n };\r\n\r\n const onToggleAdType = useCallback(\r\n (active: boolean, type: TythonAdTypes) => {\r\n if (active) {\r\n onChange({ adTypes: Array.from(new Set([...adTypes, type])) });\r\n } else {\r\n onChange({ adTypes: adTypes.filter((currentType) => currentType !== type) });\r\n }\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [adTypes]\r\n );\r\n\r\n // load ad preview SDK at parent level to cache the script\r\n useEffect(() => {\r\n const script = document.createElement('script');\r\n script.src = 'https://adsdk.microsoft.com/ad-preview/sdk.js';\r\n script.async = true;\r\n script.crossOrigin = 'anonymous';\r\n\r\n script.onload = () => {\r\n setSdkLoaded(true);\r\n };\r\n\r\n document.head.appendChild(script);\r\n\r\n // Cleanup function to remove the script when component unmounts\r\n return () => {\r\n document.head.removeChild(script);\r\n };\r\n }, []);\r\n\r\n /**\r\n * pre-load svg when component mounts\r\n * TODO: move this to a common hook\r\n */\r\n\r\n // useEffect(() => {\r\n // const imageList = [\r\n // HorizontalUpperAdPreview,\r\n // VerticalLeftAdPreview,\r\n // SquareLeftAdPreview,\r\n // HorizontalBottomAdPreview,\r\n // SquareBottomAdPreview,\r\n // VerticalBottomAdPreview,\r\n // ];\r\n // const preloadContainer = document.createElement('div');\r\n // preloadContainer.style.display = 'none';\r\n\r\n // imageList.forEach((imageSrc) => {\r\n // const img = new Image();\r\n // img.src = imageSrc;\r\n // img.width = 0;\r\n // img.height = 0;\r\n // preloadContainer.appendChild(img);\r\n // });\r\n\r\n // document.body.appendChild(preloadContainer);\r\n\r\n // return () => {\r\n // // Cleanup to remove the preloaded images when not needed\r\n // document.body.removeChild(preloadContainer);\r\n // };\r\n // }, []);\r\n\r\n return {\r\n isSdkLoaded,\r\n classNames,\r\n adPreviewConfig,\r\n isNativeAdActive,\r\n isDisplayAdActive,\r\n shouldRenderNoSelectionMsg,\r\n shouldRenderFewerSelectionMsg,\r\n displayAdLayout,\r\n onDisaplayAdLayoutChange: setDisplayAdLayout,\r\n onToggleAdType,\r\n onAdPreviewConfigChange,\r\n onToggleDisplayAd: (active) => onToggleAdType(active, TythonAdTypes.Display),\r\n onToggleNativeAd: (active) => onToggleAdType(active, TythonAdTypes.Native),\r\n };\r\n};\r\n\r\nexport default useAdUnitTypeSelector;\r\n","import { ITheme } from '@fluentui/react';\r\nimport { FontWeights } from '@fluentui/theme';\r\nimport { BreakPoints, IPubCenterFonts, IPubcenterBoxShadow, IPubcenterPalette, IPubcenterSpacing } from '../../../../../theme';\r\nimport { TythonAdUnitDisplayAdTypeLayout } from '../TythonAdunit/CreateAdunit/constants';\r\nimport { DEFAULT_AD_PREVIEW_HEIGHT } from '../TythonAdunit/components/AdUnitTypeSelector/useAdUnitTypeSelector';\r\nimport { ICreateAdunitStyleProps, ICreateAdunitStyles } from './CreateAdunit.types';\r\n\r\nexport const getStyles = (props: ICreateAdunitStyleProps): ICreateAdunitStyles => {\r\n const { theme, adPreviewHeight, displayAdLayout } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const fonts = theme.fonts as IPubCenterFonts;\r\n const { ResponsiveSmall } = BreakPoints;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const boxShadow = (theme as ITheme & { boxShadow: IPubcenterBoxShadow }).boxShadow;\r\n const [isDisplayAdHorizontal, isDisplayAdSquare, isDisplayVertical] = [\r\n displayAdLayout === TythonAdUnitDisplayAdTypeLayout.Horizontal,\r\n displayAdLayout === TythonAdUnitDisplayAdTypeLayout.Square,\r\n displayAdLayout === TythonAdUnitDisplayAdTypeLayout.Vertical,\r\n ];\r\n return {\r\n root: {\r\n marginTop: theme.spacing.m,\r\n marginLeft: theme.spacing.m,\r\n },\r\n title: [\r\n 'ms-font-xl',\r\n {\r\n display: 'flex',\r\n marginBottom: theme.spacing.l1,\r\n },\r\n ],\r\n adtypesTitle: {\r\n display: 'flex',\r\n },\r\n channelTitle: {\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n marginTop: spacing.size12,\r\n marginBottom: spacing.size16,\r\n },\r\n button: {\r\n background: 'none',\r\n border: 'none',\r\n height: '28px',\r\n fontSize: '14px',\r\n color: '#0078D4',\r\n\r\n cursor: 'pointer',\r\n position: 'relative',\r\n top: '38px',\r\n borderRadius: '2px',\r\n marginLeft: spacing.size4,\r\n boxSizing: 'border-box',\r\n selectors: {\r\n ':focus': {\r\n outline: `2px solid ${palette.themePrimary}`,\r\n },\r\n },\r\n },\r\n businessModel: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n },\r\n businessModelLevel2Dropdown: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n position: 'relative',\r\n margin: '28.5px 0 0 21px',\r\n },\r\n dropdown: {\r\n width: '220px',\r\n },\r\n combobox: {\r\n width: '400px',\r\n },\r\n multiSelectPicker: {\r\n marginBottom: theme.spacing.s1,\r\n },\r\n propertySection: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginLeft: spacing.size16,\r\n },\r\n siteSection: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n marginBottom: 50,\r\n },\r\n fileUploadLabelStyle: {\r\n color: palette.themePrimary,\r\n cursor: 'pointer',\r\n float: 'right',\r\n marginLeft: 'auto',\r\n },\r\n boostUploadDiv: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n boostUploadOuter: {\r\n marginBottom: '0px',\r\n paddingBottom: '0px',\r\n },\r\n advanceOptionTextfieldLabel: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n formAction: {\r\n marginTop: theme.spacing.l1,\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n },\r\n propertyDetails: {\r\n paddingTop: spacing.size12,\r\n },\r\n adTypeContainer: {\r\n marginTop: spacing.size48,\r\n },\r\n subComponentStyles: {\r\n servingTierChoiceGroup: {\r\n flexContainer: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'flex-start',\r\n selectors: {\r\n '.ms-ChoiceField': {\r\n marginRight: theme.spacing.m,\r\n },\r\n },\r\n },\r\n },\r\n formSection: {\r\n root: {\r\n borderBottomWidth: 0,\r\n },\r\n },\r\n checkbox: {\r\n root: {\r\n marginBottom: theme.spacing.s1,\r\n },\r\n },\r\n adTypeChoiceGroupOption: {\r\n root: {\r\n margin: `0 ${spacing.size16} ${spacing.size16} 0`,\r\n borderRadius: '5px',\r\n height: 'auto',\r\n [ResponsiveSmall]: {\r\n width: '100%',\r\n },\r\n },\r\n choiceFieldWrapper: {\r\n [ResponsiveSmall]: {\r\n width: '100%',\r\n },\r\n },\r\n labelWrapper: {\r\n height: 'fit-content',\r\n margin: `${spacing.size16} 0`,\r\n lineHeight: 'normal',\r\n },\r\n },\r\n textBox: {\r\n root: {\r\n width: spacing.size96,\r\n },\r\n prefix: {\r\n padding: 0,\r\n background: 'none',\r\n },\r\n errorMessage: {\r\n width: spacing.size128,\r\n },\r\n },\r\n },\r\n mediationHeader: [\r\n 'ms-fontWeight-semibold',\r\n {\r\n ...fonts.size20,\r\n },\r\n ],\r\n mediationToggle: {\r\n display: 'flex',\r\n alignItems: 'baseline',\r\n gap: spacing.size16,\r\n fontWeight: fonts.size14Medium.fontWeight,\r\n },\r\n adunitTypeAccordionWrapper: {\r\n width: `calc(100% - ${spacing.size48})`,\r\n position: 'relative',\r\n '.ms-Overlay': {\r\n userSelect: 'none', // Standard syntax\r\n WebkitUserSelect: 'none', // Chrome, Safari, and Opera\r\n MozUserSelect: 'none', // Firefox\r\n msUserSelect: 'none', // IE 10+\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n zIndex: 2,\r\n fontSize: '20px',\r\n backgroundColor: 'rgba(228, 227, 226, 0.5)',\r\n fontWeight: 700,\r\n color: palette.neutralSecondaryAltWhiteContrast,\r\n position: 'absolute',\r\n width: '100%',\r\n borderRadius: spacing.size12,\r\n },\r\n },\r\n adunitTypeAccordionCheckboxLabel: {\r\n 'ms-checkbox-text': {\r\n fontSize: spacing.size18,\r\n },\r\n },\r\n adunitTypeWarningMsgBar: {\r\n width: `calc(100% - ${spacing.size48})`,\r\n },\r\n adunitTypeAccordionContentWrapper: {\r\n width: '100%',\r\n '.nativeAdType': {\r\n minHeight: (adPreviewHeight ?? DEFAULT_AD_PREVIEW_HEIGHT) + 146,\r\n },\r\n [ResponsiveSmall]: {\r\n flexDirection: 'column',\r\n },\r\n },\r\n adunitTypeLeftSection: {\r\n borderRight: `${spacing.size1} solid ${palette.neutralLight}`,\r\n padding: `${spacing.size24} ${spacing.size46}`,\r\n width: spacing.size480,\r\n [ResponsiveSmall]: {\r\n width: `calc(100% - ${spacing.size92})`,\r\n },\r\n },\r\n adunitTypeRightSection: {\r\n padding: `${spacing.size24} ${spacing.size46}`,\r\n [ResponsiveSmall]: {\r\n width: `calc(100% - ${spacing.size92})`,\r\n borderTop: `${spacing.size1} solid ${palette.neutralLight}`,\r\n },\r\n },\r\n previewSDKWrapper: {\r\n [ResponsiveSmall]: {\r\n maxWidth: '100%',\r\n overflowX: 'auto',\r\n },\r\n '& > div > div[data-template=\"horizontal\"]': {\r\n boxShadow: boxShadow.soft,\r\n },\r\n },\r\n adunitTypeFormTitlePrimary: {\r\n fontSize: spacing.size16,\r\n fontWeight: 600,\r\n color: palette.black,\r\n marginBottom: spacing.size12,\r\n },\r\n boldFieldTitle: {\r\n lineHeight: spacing.size20,\r\n fontSize: spacing.size14,\r\n fontWeight: FontWeights.semibold,\r\n marginRight: spacing.size2,\r\n },\r\n horizontalSelectionWrapper: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n marginTop: spacing.size12,\r\n },\r\n infoMsgBar: {\r\n backgroundColor: palette.themeLighterAlt,\r\n '.ms-MessageBar-content': { alignItems: 'center' },\r\n },\r\n expandIcon: {\r\n paddingLeft: spacing.size4,\r\n },\r\n newPropertyPanelHeader: {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n padding: '5px 5px 0px 0px',\r\n },\r\n adPreviewWrapper: {\r\n overflowY: 'auto',\r\n width: '100%',\r\n },\r\n mediationDescriptionWrapper: {\r\n [ResponsiveSmall]: {\r\n width: spacing.size320,\r\n },\r\n },\r\n adunitTypeDisplayAdPreviewHead: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'space-between',\r\n '>span': {\r\n marginBottom: 0,\r\n [ResponsiveSmall]: {\r\n marginBottom: spacing.size6,\r\n },\r\n },\r\n },\r\n adunitTypeDisplayAdPreviewHeadButtons: {\r\n textAlign: 'right',\r\n [ResponsiveSmall]: {\r\n textAlign: 'left',\r\n },\r\n marginBottom: spacing.size18,\r\n '.ms-Pivot--tabs': {\r\n '.ms-Pivot-linkContent': {\r\n padding: `0px ${spacing.size12}`,\r\n },\r\n '.ms-Button': {\r\n border: `1px solid ${palette.neutralLight}`,\r\n height: spacing.size36,\r\n },\r\n '.ms-Button:nth-child(2)': {\r\n borderLeft: 'none',\r\n borderRight: 'none',\r\n },\r\n '.is-selected': {\r\n fontWeight: 600,\r\n },\r\n },\r\n },\r\n adunitTypeDisplayAdPreviewContainer: {},\r\n adunitTypeDisplayAdPreviewLayoutWrapper: {\r\n overflowX: 'auto',\r\n paddingBottom: spacing.size12,\r\n display: 'flex',\r\n flexDirection: isDisplayAdHorizontal ? 'column' : 'row',\r\n gap: spacing.size12,\r\n img: {\r\n boxShadow: boxShadow.soft,\r\n display: 'block',\r\n ...(isDisplayAdHorizontal ? { width: spacing.size600 } : {}),\r\n ...(isDisplayAdSquare ? { width: spacing.size250 } : {}),\r\n ...(isDisplayVertical ? { width: spacing.size160 } : {}),\r\n },\r\n ...(isDisplayAdSquare || isDisplayVertical\r\n ? {\r\n '> div:nth-child(1)': {\r\n marginRight: spacing.size12,\r\n },\r\n '> div:nth-child(2)': {\r\n marginRight: spacing.size12,\r\n },\r\n }\r\n : {}),\r\n },\r\n /**\r\n * the last vertical ad preview has different border width, adding\r\n * this class to override the nested img width.\r\n */\r\n verticalAdPreviewBottomWrapper: {\r\n width: `${spacing.size159} !important`,\r\n },\r\n displayAdPreviewExampleTitle: {\r\n fontWeight: 600,\r\n marginBottom: spacing.size6,\r\n },\r\n };\r\n};\r\n","import {\r\n Checkbox,\r\n ChoiceGroup,\r\n classNamesFunction,\r\n Dropdown,\r\n getTheme,\r\n IChoiceGroupOption,\r\n IconButton,\r\n IDropdownOption,\r\n IProcessedStyleSet,\r\n Label,\r\n Panel,\r\n PanelType,\r\n Stack,\r\n TextField,\r\n Toggle,\r\n} from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { Log } from '../../../../../logging/src/Log';\r\nimport {\r\n AdUnitMarketClassification,\r\n AdUnitServingTier,\r\n getAppStore,\r\n NativeAdTemplate,\r\n onHelpInfoCalloutOpened,\r\n onHelpInfoChanged,\r\n onNavigateBack,\r\n PrivateMarketplace,\r\n PublisherGroupConfig,\r\n PublisherTier,\r\n} from '../../../../@data';\r\nimport { onPopupOpenChanged } from '../../../../@data/mutatorActions';\r\nimport { completeAccess, hasReadAccess, hasUpdateAccess, UserRoleEntity, userRoleKey } from '../../../../@data/services/UserRoleService';\r\nimport { AdSenseOAuthStatus } from '../../../../@data/store/schema/enums/AdSenseOAuthStatus';\r\nimport { PopupType } from '../../../../@data/store/schema/enums/PopupType';\r\nimport { AdUnit as AdUnitAccessPermissions } from '../../../../@data/store/schema/userrolemodels/AdUnit';\r\nimport { Property as PropertyAccessPermissions } from '../../../../@data/store/schema/userrolemodels/Property';\r\nimport { isTythonSelfServeUser } from '../../../../@data/utils/checkUserType';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { FormItem, FormSection, FormState } from '../../../../components/Form';\r\nimport { FormLabel } from '../../../../components/Form/FormLabel';\r\nimport { isCreating, isEditing } from '../../../../components/Form/FormState/formUtils';\r\nimport { MultiSelectPicker } from '../../../../components/MultiSelectPicker/MultiSelectPicker';\r\nimport { DetailPage } from '../../../../layout/DetailPage/DetailPage';\r\nimport { StepState } from '../../../../layout/DetailPageWithStepper/DetailPageWithStepper.types';\r\nimport { PropertyPicker } from '../../../../layout/PropertyPicker/PropertyPicker';\r\nimport { IPropertyPickerItem } from '../../../../layout/PropertyPicker/PropertyPicker.types';\r\nimport { PropertySitePicker } from '../../../../layout/PropertySitePicker/PropertySitePicker';\r\nimport { injectIntlWithObserver } from '../../../../utils/ReactUtils';\r\nimport { getAdManagementStore, RouteName } from '../../@data';\r\nimport { onPanelOpenChanged } from '../../@data/actions';\r\nimport { createReturnUrl } from '../../@data/services/AdManagementService';\r\nimport { getGoogleAdSenseStore } from '../../Account/Settings/components/GoogleConnector/@data';\r\nimport { CreateProperty } from '../../Property/Create/variations/CreateNonTythonProperty';\r\nimport propertyMessages from '../../Property/Create/variations/CreateNonTythonProperty/messages';\r\nimport { getAdunitStore, isPartnerCodeEnabled } from '../@data';\r\nimport {\r\n onAdunitNameChanged,\r\n onAssociatedPropertyChanged,\r\n onBusinessModelChanged,\r\n onChannelsChanged,\r\n onCreatePropertyPanelOpenChanged,\r\n onDistributionPartnerCodesChanged,\r\n onFormCancelled,\r\n onFormInitialized,\r\n onFormSubmitted,\r\n onImpressionFeedbackSignalChanged,\r\n onMarketplaceChanged,\r\n onPubGroupConfigChanged,\r\n onServingTierChanged,\r\n onStoreIdsChanged,\r\n} from '../@data/actions';\r\nimport { onAdSenseMediationToggleChanged, onAdunitPrivateMarketplaceChanged } from '../@data/mutatorActions';\r\nimport { setTemplate } from '../@data/mutatorActions/setAdUnitTemplate';\r\nimport { BoostJsonFileUpload } from './components/BoostTemplateUploader/BoostJsonFileUpload';\r\nimport { OptOutMediationPopup } from './components/DisablingMediationPopup';\r\nimport messages from './CreateAdunit.messages';\r\nimport { getStyles } from './CreateAdunit.styles';\r\nimport { ICreateAdunitProps, ICreateAdunitStyleProps, ICreateAdunitStyles, IFormInitializationState } from './CreateAdunit.types';\r\n\r\nexport const getClassNames = classNamesFunction<ICreateAdunitStyleProps, ICreateAdunitStyles>();\r\nexport const CreateAdunit = injectIntlWithObserver(\r\n class CreateAdunitPage extends React.Component<ICreateAdunitProps, IFormInitializationState> {\r\n private _classNames: IProcessedStyleSet<ICreateAdunitStyles>;\r\n private _tythonUser = isTythonSelfServeUser();\r\n\r\n constructor(props: ICreateAdunitProps) {\r\n super(props);\r\n this.state = {\r\n initializeForm: true,\r\n downloadTemplateMounted: false,\r\n };\r\n }\r\n public async componentDidMount() {\r\n const appStore = getAppStore();\r\n const params = this.props.match.params;\r\n const { privateMarketplace } = getAdunitStore();\r\n\r\n // Adunit id should be passed as props, if not present in route, incase of InPage modes\r\n const entityId = params.id || this.props.adunitId;\r\n this.setState({ id: entityId, privateMarketPlaceCheck: privateMarketplace });\r\n\r\n if (params.publisherId && params.accountId) {\r\n onFormInitialized(this.props.mode, params.publisherId, params.accountId, entityId);\r\n } else if (appStore.publisher && appStore.account) {\r\n onFormInitialized(this.props.mode, appStore.publisher.id, appStore.account.id, entityId);\r\n }\r\n }\r\n\r\n public async componentDidUpdate(prevProps, prevState) {\r\n const { active } = getAdunitStore();\r\n\r\n if (active.BoostTemplate && prevState.privateMarketPlaceCheck !== PrivateMarketplace.Boost) {\r\n this.setState({ privateMarketPlaceCheck: PrivateMarketplace.Boost });\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const theme = getTheme();\r\n this._classNames = getClassNames(getStyles, { theme });\r\n const { mode, stepState } = this.props;\r\n const { saving, loading } = getAppStore();\r\n\r\n const { formatMessage } = this.props.intl;\r\n const publisherId = this.props.match.params.publisherId;\r\n const accountId = this.props.match.params.accountId || '0';\r\n\r\n const store = getAdunitStore();\r\n const { helpInfo, locale } = getAppStore();\r\n const { active } = getGoogleAdSenseStore();\r\n\r\n const marketPlaceDropdownOptions: IDropdownOption[] = [\r\n {\r\n key: AdUnitMarketClassification.OwnedAndOperatedCore,\r\n text: formatMessage(messages.marketPlaceOptionCore),\r\n ariaLabel: formatMessage(messages.marketPlaceOptionCore),\r\n title: '',\r\n },\r\n {\r\n key: AdUnitMarketClassification.OwnedAndOperated,\r\n text: formatMessage(messages.marketPlaceOptionRest),\r\n ariaLabel: formatMessage(messages.marketPlaceOptionRest),\r\n title: '',\r\n },\r\n {\r\n key: AdUnitMarketClassification.Syndicated,\r\n text: formatMessage(messages.marketPlaceOptionSyndicated),\r\n ariaLabel: formatMessage(messages.marketPlaceOptionSyndicated),\r\n title: '',\r\n },\r\n {\r\n key: AdUnitMarketClassification.Sponsored,\r\n text: formatMessage(messages.marketPlaceOptionsSponsored),\r\n ariaLabel: formatMessage(messages.marketPlaceOptionsSponsored),\r\n title: '',\r\n },\r\n {\r\n key: AdUnitMarketClassification.SponsoredEnhanced,\r\n text: formatMessage(messages.marketPlaceOptionsSponsoredEnhanced),\r\n ariaLabel: formatMessage(messages.marketPlaceOptionsSponsoredEnhanced),\r\n title: '',\r\n },\r\n {\r\n key: AdUnitMarketClassification.SelectTier,\r\n text: formatMessage(messages.marketPlaceOptionSelectTier),\r\n ariaLabel: formatMessage(messages.marketPlaceOptionSelectTier),\r\n title: '',\r\n },\r\n ];\r\n\r\n const businessModelDropdownOptions: IDropdownOption[] = [\r\n { key: 0, text: formatMessage(messages.businessModelLevel1DefaultOptionText), title: '' },\r\n ];\r\n if (store.active.adUnitTaxonomyValues) {\r\n store.active.adUnitTaxonomyValues\r\n .filter((a) => !a.parentValue)\r\n .forEach((a) =>\r\n businessModelDropdownOptions.push({ key: a.key, text: a.displayName, ariaLabel: a.displayName, title: '' } as IDropdownOption)\r\n );\r\n }\r\n\r\n let businessModelLevel1Key = 0,\r\n businessModelLevel2Key = 0;\r\n if (store.active.businessModel && store.active.adUnitTaxonomyValues) {\r\n const selectedBusinessModel = store.active.adUnitTaxonomyValues.filter((a) => a.key === store.active.businessModel)[0];\r\n if (selectedBusinessModel) {\r\n if (selectedBusinessModel.parentValue) {\r\n businessModelLevel2Key = selectedBusinessModel.key;\r\n\r\n const parentBusinessModel = store.active.adUnitTaxonomyValues.filter((a) => a.value === selectedBusinessModel.parentValue)[0];\r\n businessModelLevel1Key = parentBusinessModel.key;\r\n } else {\r\n businessModelLevel1Key = selectedBusinessModel.key;\r\n }\r\n } else {\r\n Log.write('selectedBusinessModel cannot be found or API failed to fetch adunit taxonomy values');\r\n }\r\n } else {\r\n Log.write('adunit taxonomy is null');\r\n }\r\n\r\n const adunitAccessPermissions = this._getAdUnitAccessPermission();\r\n const propertyAccessPermissions = this._getPropertyAccessPermission();\r\n\r\n const addProperty = () => {\r\n onPanelOpenChanged(true);\r\n onCreatePropertyPanelOpenChanged(true);\r\n };\r\n\r\n const isValidPublisherForFeedbackSignals = () => {\r\n const publisherTier = getAppStore().publisher?.publisherTier;\r\n Log.write('PublisherTier: ' + publisherTier);\r\n\r\n if (\r\n publisherTier === PublisherTier.InternalPremium ||\r\n publisherTier === PublisherTier.ManagedPremium ||\r\n publisherTier === PublisherTier.SelfServe1stPartyBoost\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const renderAdunitDetails = () => (\r\n <>\r\n {/** Ad unit name */}\r\n <FormItem formWidth={440}>\r\n <TextField\r\n label={formatMessage(messages.adunitNameLabel)}\r\n required={true}\r\n errorMessage={store.errors.name}\r\n value={store.active.name}\r\n onChange={(_, value) => onAdunitNameChanged(value)}\r\n disabled={this._isDisabled(mode, adunitAccessPermissions === null ? completeAccess : adunitAccessPermissions.name)}\r\n />\r\n </FormItem>\r\n {/** Ad unit id */}\r\n {(isEditing(mode) || (isCreating(mode) && stepState === StepState.Dirty)) && (\r\n <FormItem formWidth={440}>\r\n <TextField label={formatMessage(messages.adunitId)} required={true} disabled={true} value={String(store.active.id ?? '')} />\r\n </FormItem>\r\n )}\r\n {/** Ad unit site id + site url */}\r\n {this._tythonUser &&\r\n hasReadAccess(propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.websiteURL) &&\r\n (isEditing(mode) || (isCreating(mode) && stepState === StepState.Dirty)) && (\r\n <FormItem formWidth={440}>\r\n <TextField\r\n label={formatMessage(messages.site)}\r\n required={true}\r\n disabled={true}\r\n value={\r\n loading\r\n ? ''\r\n : store.active.propertySelected\r\n ? store.active.propertySelected.id + ' - ' + store.active.propertySelected.url\r\n : formatMessage(messages.siteDefaultNotFound)\r\n }\r\n />\r\n </FormItem>\r\n )}\r\n {/** Ad unit marketplace */}\r\n {hasReadAccess(adunitAccessPermissions === null ? completeAccess : adunitAccessPermissions.markeplaceClassification) && (\r\n <FormItem>\r\n <Dropdown\r\n label={formatMessage(messages.marketplaceLabel)}\r\n required={true}\r\n options={marketPlaceDropdownOptions}\r\n defaultSelectedKey={store.active.marketClassification}\r\n onChange={(_, value) => onMarketplaceChanged(value!)}\r\n disabled={this._isDisabled(\r\n mode,\r\n adunitAccessPermissions === null ? completeAccess : adunitAccessPermissions.markeplaceClassification\r\n )}\r\n />\r\n </FormItem>\r\n )}\r\n {/** Ad unit business model */}\r\n {hasReadAccess(adunitAccessPermissions === null ? completeAccess : adunitAccessPermissions.businessModel) && (\r\n <div className={this._classNames.businessModel}>\r\n <FormItem formWidth={241}>\r\n <Dropdown\r\n label={formatMessage(messages.businessModelLabel)}\r\n options={businessModelDropdownOptions}\r\n defaultSelectedKey={businessModelLevel1Key}\r\n onChange={(_, value) => onBusinessModelChanged(value)}\r\n disabled={this._isDisabled(\r\n mode,\r\n adunitAccessPermissions === null ? completeAccess : adunitAccessPermissions.businessModel\r\n )}\r\n />\r\n </FormItem>\r\n <FormItem formWidth={241}>\r\n <div className={this._classNames.businessModelLevel2Dropdown}>\r\n <Dropdown\r\n className={this._classNames.dropdown}\r\n ariaLabel={formatMessage(messages.businessModelLevel2AriaLabel)}\r\n options={this._fetchBusinessModelLevel2Options(businessModelLevel1Key)}\r\n defaultSelectedKey={businessModelLevel2Key}\r\n onChange={(_, value) => {\r\n if (value && value.key !== 0) {\r\n onBusinessModelChanged(value);\r\n }\r\n }}\r\n disabled={\r\n this._isDisabled(mode, adunitAccessPermissions === null ? completeAccess : adunitAccessPermissions.businessModel) ||\r\n !store.active.businessModel\r\n }\r\n />\r\n </div>\r\n </FormItem>\r\n </div>\r\n )}\r\n\r\n {isValidPublisherForFeedbackSignals() && (\r\n <FormItem formWidth={480}>\r\n <FormLabel\r\n id=\"requiredFeedbackSignalsRadioLabel\"\r\n labelContent={formatMessage(messages.requiredFeedbackSignalsLabel)}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_AdUnitsFeedbackSignals', locale)}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n intl={this.props.intl}\r\n />\r\n <Checkbox\r\n id={formatMessage(messages.requiredImpressionFeedbackSignalOptionLabel)}\r\n aria-label={formatMessage(messages.requiredImpressionFeedbackSignalOptionLabel)}\r\n label={formatMessage(messages.requiredImpressionFeedbackSignalOptionLabel)}\r\n checked={!!store.active.isImpressionFeedbackRequired}\r\n onChange={(_, value) => onImpressionFeedbackSignalChanged(value)}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n />\r\n </FormItem>\r\n )}\r\n\r\n {/** Ad unit Search Distribution Partner Codes */}\r\n {isPartnerCodeEnabled(publisherId) &&\r\n hasReadAccess(adunitAccessPermissions === null ? completeAccess : adunitAccessPermissions.distributionPartnerCodes) && (\r\n <FormItem formWidth={440}>\r\n <div className={this._classNames.distributionPartnerCodes}>\r\n <TextField\r\n errorMessage={store.errors.distributionPartnerCodes}\r\n multiline={true}\r\n placeholder={formatMessage(messages.distributionPartnerCodesTextfieldPlaceholder)}\r\n description={formatMessage(messages.distributionPartnerCodesLabelDescription)}\r\n aria-labelledby=\"distributionPartnerCodesLabel\"\r\n onRenderLabel={() => {\r\n return (\r\n <FormLabel\r\n id=\"distributionPartnerCodesLabel\"\r\n labelContent={formatMessage(messages.distributionPartnerCodesLabel)}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_SearchDistributionPartner', locale)}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n intl={this.props.intl}\r\n />\r\n );\r\n }}\r\n value={store.active.distributionPartnerCodes}\r\n onChange={(_, value) => onDistributionPartnerCodesChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n adunitAccessPermissions === null ? completeAccess : adunitAccessPermissions.distributionPartnerCodes\r\n )}\r\n />\r\n </div>\r\n </FormItem>\r\n )}\r\n {/** Ad unit channel */}\r\n {hasReadAccess(adunitAccessPermissions === null ? completeAccess : adunitAccessPermissions.channelList) && (\r\n <FormSection title={formatMessage(messages.channelTitle)} styles={this._classNames.subComponentStyles.formSection}>\r\n {this._channelList(adunitAccessPermissions)}\r\n </FormSection>\r\n )}\r\n {/** Ad unit property */}\r\n {/* tslint:disable-next-line: max-line-length */}\r\n {!this._tythonUser && hasReadAccess(propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.websiteURL) && (\r\n <FormSection title={formatMessage(messages.propertySectionTitle)} styles={this._classNames.subComponentStyles.formSection}>\r\n {this._propertyPicker(adunitAccessPermissions)}\r\n </FormSection>\r\n )}\r\n {/** Ad unit site for Tython */}\r\n {this._tythonUser &&\r\n (isCreating(mode) || stepState === StepState.Empty) &&\r\n hasReadAccess(propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.websiteURL) &&\r\n !store.active.id && (\r\n <FormItem formWidth={550}>\r\n <div className={this._classNames.siteSection}>\r\n {this._propertySitePicker(adunitAccessPermissions)}\r\n <button onClick={addProperty} className={this._classNames.button}>\r\n {formatMessage(messages.siteButton)}\r\n </button>\r\n </div>\r\n </FormItem>\r\n )}\r\n {/** Ad unit advanced options */}\r\n {hasReadAccess(adunitAccessPermissions === null ? completeAccess : adunitAccessPermissions.servingTier) && (\r\n <FormSection title={formatMessage(messages.advOptionTitle)} styles={this._classNames.subComponentStyles.formSection}>\r\n {this._advancedOptions(adunitAccessPermissions)}\r\n </FormSection>\r\n )}\r\n {/** Ad unit property panel */}\r\n {hasReadAccess(propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.websiteURL) &&\r\n this._renderPropertyPanel(store.isPanelOpen)}\r\n {/** Ad unit type choice group */}\r\n {/* TODO: remove tython components */}\r\n {/* {this._tythonUser && isCreating(mode) && store.active.adUnitType && (\r\n <div className={this._classNames.adTypeContainer}>\r\n <ChoiceGroup\r\n label={formatMessage(messages.adunitType)}\r\n options={renderAdTypeOptions(formatMessage, this._classNames.subComponentStyles.adTypeChoiceGroupOption)}\r\n required={true}\r\n selectedKey={store.active.adUnitType}\r\n onChange={(_, option: IChoiceGroupOption) => {\r\n onAdunitTypeChanged(option.key as AdUnitType);\r\n }}\r\n />\r\n </div>\r\n )} */}\r\n {/* {this._tythonUser && <AdUnitTypeSelector />} */}\r\n {/** Ad unit mediation toggle */}\r\n {this._tythonUser && active.connectionStatus === AdSenseOAuthStatus.Success && active.isMediationEnabled === true && (\r\n <>\r\n <OptOutMediationPopup />\r\n <div className={this._classNames.mediationHeader}>{formatMessage(messages.mediationHeader)}</div>\r\n <div>\r\n <p>{formatMessage(messages.mediationDescription)}</p>\r\n </div>\r\n <div className={this._classNames.mediationToggle}>\r\n <p>{formatMessage(messages.mediationToggleLabel)}</p>\r\n <Toggle\r\n ariaLabel={formatMessage(messages.mediationToggleLabel)}\r\n checked={store.active.adSenseMediationToggle === true}\r\n title=\"mediationToggle\"\r\n onChange={(_, state) => {\r\n onAdSenseMediationToggleChanged(state || false);\r\n\r\n if (store.active.adSenseMediationStatus === true && state === false) {\r\n onPopupOpenChanged(PopupType.AdUnitOptOut);\r\n }\r\n }}\r\n />\r\n </div>\r\n </>\r\n )}\r\n </>\r\n );\r\n\r\n return mode !== FormState.MultiStepCreation && mode !== FormState.MultiStepEdit ? (\r\n <DetailPage\r\n titleLabel={formatMessage(isEditing(mode) ? messages.editPageTitle : messages.createPageTitle)}\r\n helpId={'pop_PCv4_AdUnitsCreate'}\r\n submitLabel={this._getSubmitLabel(mode)}\r\n onSubmit={() => this._onSubmit(publisherId, accountId)}\r\n onCancel={() => this._onCancel(publisherId, accountId)}\r\n onNavClick={() => this._onCancel(publisherId, accountId)}\r\n saving={saving}\r\n loading={loading}\r\n pageMode={mode}\r\n >\r\n {renderAdunitDetails()}\r\n </DetailPage>\r\n ) : (\r\n renderAdunitDetails()\r\n );\r\n }\r\n\r\n /**\r\n *\tTakes a boolean, and return a Panel component\r\n *\t@param isPanelOpen second input\r\n *\t@returns Property Panel component\r\n */\r\n\r\n private _renderPropertyPanel = (isPanelOpen?: boolean | null): JSX.Element => {\r\n const store = getAdunitStore();\r\n const { formatMessage } = this.props.intl;\r\n return (\r\n <Panel\r\n isOpen={getAdManagementStore().panelIsOpen}\r\n type={PanelType.medium}\r\n customWidth={store.active.createPropertyPanelOpen ? '500px' : '700px'}\r\n onDismiss={() => {\r\n onPanelOpenChanged(false);\r\n if (store.active.createPropertyPanelOpen) {\r\n onCreatePropertyPanelOpenChanged(false);\r\n }\r\n }}\r\n onRenderNavigation={() => (\r\n <div className={this._classNames.newPropertyPanelHeader} role=\"navigation\">\r\n <IconButton\r\n iconProps={{ iconName: 'Cancel' }}\r\n aria-label={formatMessage(AppMessages.close)}\r\n onClick={() => {\r\n onPanelOpenChanged(false);\r\n if (store.active.createPropertyPanelOpen) {\r\n onCreatePropertyPanelOpenChanged(false);\r\n }\r\n }}\r\n />\r\n </div>\r\n )}\r\n headerText={formatMessage(propertyMessages.createPageTitle)}\r\n headerTextProps={{ hidden: true }}\r\n >\r\n {store.active.createPropertyPanelOpen && (\r\n <CreateProperty\r\n {...this.props}\r\n mode={FormState.InPageCreate}\r\n onCancel={() => {\r\n onPanelOpenChanged(false);\r\n if (store.active.createPropertyPanelOpen) {\r\n onCreatePropertyPanelOpenChanged(false);\r\n }\r\n }}\r\n onSubmit={() => {\r\n onPanelOpenChanged(false);\r\n onCreatePropertyPanelOpenChanged(false);\r\n }}\r\n />\r\n )}\r\n </Panel>\r\n );\r\n };\r\n\r\n /**\r\n *\tTakes an access permission and return a channel MultiSelectPicker component\r\n *\t@param adUnitAccessPermissions input to _channelList\r\n *\t@returns channel MultiSelectPicker component\r\n */\r\n\r\n private _channelList = (adunitAccessPermissions: AdUnitAccessPermissions | null): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const store = getAdunitStore();\r\n const selectedChannels = store.active.channelsSelected;\r\n return (\r\n <MultiSelectPicker\r\n className={this._classNames.multiSelectPicker}\r\n intl={this.props.intl}\r\n required={true}\r\n ariaDescription={formatMessage(messages.channelPickerAriaDesc)}\r\n errorMessage={store.errors.channelsSelected}\r\n items={store.active.channels || []}\r\n onSelectedItems={(items) => onChannelsChanged(items)}\r\n initialSelectedItems={selectedChannels}\r\n enableCreateButton={this.props.mode !== FormState.InPageCreate}\r\n createButtonLabel={formatMessage(AppMessages.createChannel)}\r\n onCreateButtonClick={() => onPanelOpenChanged(true)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n adunitAccessPermissions === null ? completeAccess : adunitAccessPermissions.channelList\r\n )}\r\n />\r\n );\r\n };\r\n\r\n /**\r\n *\tTakes an access permission and return a site PropertySitePicker component\r\n *\t@param adUnitAccessPermissions input to _propertySitePicker\r\n *\t@returns site PropertySitePicker component\r\n */\r\n\r\n private _propertySitePicker = (adUnitAccessPermissions: AdUnitAccessPermissions | null): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const store = getAdunitStore();\r\n const properties = store.active.properties\r\n ? store.active.properties.map((p) => ({ id: p.id, url: p.url } as IPropertyPickerItem))\r\n : [];\r\n\r\n return (\r\n <PropertySitePicker\r\n title={formatMessage(messages.site)}\r\n items={properties}\r\n searchBoxPlaceholder={\r\n store.active.propertySelected\r\n ? store.active.propertySelected.id + ' - ' + store.active.propertySelected.url\r\n : formatMessage(messages.propertyDefaultOptionText)\r\n }\r\n propertyOptionsAriaLabel={formatMessage(messages.propertyOptionsAriaLabel)}\r\n onCreateButtonClick={() => {\r\n onPanelOpenChanged(true);\r\n onCreatePropertyPanelOpenChanged(true);\r\n }}\r\n onListItemClicked={(item) => {\r\n if (item && store.active.properties) {\r\n const selectedProperty = store.active.properties.filter((p) => p.id === item.id)[0];\r\n onAssociatedPropertyChanged(selectedProperty);\r\n } else {\r\n onAssociatedPropertyChanged(undefined);\r\n }\r\n }}\r\n emptyOptionLabel={formatMessage(messages.propertyPickerEmptyOptionLabel)}\r\n searchBoxAriaDescription={formatMessage(messages.propertyPickerSearchBoxAriaDesc)}\r\n itemSelectedAnnounceMessage={formatMessage(messages.propertyPickerItemSelectedAnnounceMsg)}\r\n formatMessage={formatMessage}\r\n />\r\n );\r\n };\r\n\r\n /**\r\n *\tTakes an access permission and return a site PropertyPicker component\r\n *\t@param adUnitAccessPermissions input to _propertyPicker\r\n *\t@returns property PropertyPicker component\r\n */\r\n\r\n private _propertyPicker = (adUnitAccessPermissions: AdUnitAccessPermissions | null): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const store = getAdunitStore();\r\n const properties = store.active.properties\r\n ? store.active.properties.map((p) => ({ id: p.id, url: p.url } as IPropertyPickerItem))\r\n : [];\r\n\r\n return (\r\n <div className={this._classNames.propertySection}>\r\n <PropertyPicker\r\n items={properties}\r\n searchBoxPlaceholder={formatMessage(messages.propertySearchPlaceholder)}\r\n isCreateButtonDisabled={this.props.mode === FormState.InPageCreate}\r\n createButtonLabel={formatMessage(messages.createPropertyButtonLabel)}\r\n propertyOptionsAriaLabel={formatMessage(messages.propertyOptionsAriaLabel)}\r\n onCreateButtonClick={() => {\r\n onPanelOpenChanged(true);\r\n onCreatePropertyPanelOpenChanged(true);\r\n }}\r\n onListItemClicked={(item) => {\r\n if (item && store.active.properties) {\r\n const selectedProperty = store.active.properties.filter((p) => p.id === item.id)[0];\r\n onAssociatedPropertyChanged(selectedProperty);\r\n } else {\r\n onAssociatedPropertyChanged(undefined);\r\n }\r\n }}\r\n emptyOptionLabel={formatMessage(messages.propertyPickerEmptyOptionLabel)}\r\n createButtonAriaDescription={formatMessage(messages.createPropButtonAriaDesc)}\r\n searchBoxAriaDescription={formatMessage(messages.propertyPickerSearchBoxAriaDesc)}\r\n itemSelectedAnnounceMessage={formatMessage(messages.propertyPickerItemSelectedAnnounceMsg)}\r\n />\r\n\r\n {store.active.propertySelected && (\r\n <div className={this._classNames.propertyDetails}>\r\n <FormItem>\r\n <Label aria-label={formatMessage(messages.propertyName)}>{formatMessage(messages.propertyName)}</Label>\r\n {store.active.propertySelected!.name}\r\n </FormItem>\r\n <FormItem>\r\n <Label>{formatMessage(messages.websiteUrl)}</Label>\r\n {store.active.propertySelected.url}\r\n </FormItem>\r\n <FormItem>\r\n <Label>{formatMessage(messages.propertyId)}</Label>\r\n {store.active.propertySelected.id}\r\n </FormItem>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n /**\r\n *\tTakes an access permission and return advance options section\r\n *\t@param adUnitAccessPermissions input to _advancedOptions\r\n *\t@returns advance options section\r\n */\r\n\r\n private _advancedOptions = (adunitAccessPermissions: AdUnitAccessPermissions | null): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const store = getAdunitStore();\r\n const { helpInfo, locale } = getAppStore();\r\n const ChoiceGroupOption: IChoiceGroupOption[] = [\r\n {\r\n key: AdUnitServingTier.Default,\r\n text: formatMessage(AppMessages.default),\r\n ariaLabel: formatMessage(AppMessages.default),\r\n },\r\n {\r\n key: AdUnitServingTier.lowCost,\r\n text: formatMessage(messages.servingTierOptionLowcost),\r\n ariaLabel: formatMessage(messages.servingTierOptionLowcost),\r\n },\r\n ];\r\n const isBoost = sessionStorage.getItem('IsBoostPublisher');\r\n\r\n const handlePrivateMarketPlace = (\r\n ev: React.FormEvent<HTMLElement | HTMLInputElement> | undefined,\r\n checked: boolean | undefined,\r\n type: PrivateMarketplace\r\n ) => {\r\n if (!checked) {\r\n onAdunitPrivateMarketplaceChanged(undefined);\r\n this.setState({ privateMarketPlaceCheck: undefined });\r\n } else {\r\n if (type === PrivateMarketplace.InHouse) {\r\n this.setState({ privateMarketPlaceCheck: PrivateMarketplace.InHouse });\r\n } else {\r\n this.setState({ privateMarketPlaceCheck: PrivateMarketplace.Boost });\r\n }\r\n onAdunitPrivateMarketplaceChanged(type);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n {hasReadAccess(adunitAccessPermissions === null ? completeAccess : adunitAccessPermissions.servingTier) && (\r\n <FormItem>\r\n <FormLabel\r\n id=\"servingTierTitle\"\r\n labelContent={formatMessage(messages.servingTierTitle)}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_AdUnitsTier', locale)}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n intl={this.props.intl}\r\n disableHeading\r\n disableAriaLevel\r\n />\r\n <ChoiceGroup\r\n options={ChoiceGroupOption}\r\n ariaLabelledBy={'servingTierTitle'}\r\n styles={this._classNames.subComponentStyles.servingTierChoiceGroup}\r\n onChange={(_, value) => onServingTierChanged(value!)}\r\n selectedKey={store.active.servingTier ?? AdUnitServingTier.Default}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n adunitAccessPermissions === null ? completeAccess : adunitAccessPermissions.servingTier\r\n )}\r\n />\r\n </FormItem>\r\n )}\r\n <FormItem>\r\n <Dropdown\r\n label={formatMessage(messages.publisherGroupConfigLabel)}\r\n ariaLabel={formatMessage(messages.publisherGroupConfigLabel)}\r\n defaultSelectedKey={store.active.publisherGroupConfig}\r\n onChange={(_, value) => onPubGroupConfigChanged(value)}\r\n options={[\r\n {\r\n key: PublisherGroupConfig.DefaultPlus,\r\n text: formatMessage(messages.publisherGroupConfigOptionDefaultPlus),\r\n ariaLabel: formatMessage(messages.publisherGroupConfigOptionDefaultPlus),\r\n },\r\n {\r\n key: PublisherGroupConfig.Default,\r\n text: formatMessage(messages.publisherGroupConfigOptionDefault),\r\n ariaLabel: formatMessage(messages.publisherGroupConfigOptionDefault),\r\n },\r\n {\r\n key: PublisherGroupConfig.Generalist,\r\n text: formatMessage(messages.publisherGroupConfigOptionGeneralist),\r\n ariaLabel: formatMessage(messages.publisherGroupConfigOptionGeneralist),\r\n },\r\n {\r\n key: PublisherGroupConfig.YieldOptimize,\r\n text: formatMessage(messages.publisherGroupConfigOptionYieldOptimizer),\r\n ariaLabel: formatMessage(messages.publisherGroupConfigOptionYieldOptimizer),\r\n },\r\n {\r\n key: PublisherGroupConfig.YieldMaximize,\r\n text: formatMessage(messages.publisherGroupConfigOptionYieldMaximizer),\r\n ariaLabel: formatMessage(messages.publisherGroupConfigOptionYieldMaximizer),\r\n },\r\n {\r\n key: PublisherGroupConfig.BingYahooOAndO,\r\n text: formatMessage(messages.publisherGroupConfigOptionBingandYahoo),\r\n ariaLabel: formatMessage(messages.publisherGroupConfigOptionBingandYahoo),\r\n },\r\n {\r\n key: PublisherGroupConfig.LowQualityDistribution,\r\n text: formatMessage(messages.publisherGroupConfigOptionLowQualityDistribution),\r\n ariaLabel: formatMessage(messages.publisherGroupConfigOptionLowQualityDistribution),\r\n },\r\n {\r\n key: PublisherGroupConfig.MediumQualityDistribution,\r\n text: formatMessage(messages.publisherGroupConfigOptionMediumQualityDistribution),\r\n ariaLabel: formatMessage(messages.publisherGroupConfigOptionMediumQualityDistribution),\r\n },\r\n {\r\n key: PublisherGroupConfig.HighQualityDistribution,\r\n text: formatMessage(messages.publisherGroupConfigOptionHighQualityDistribution),\r\n ariaLabel: formatMessage(messages.publisherGroupConfigOptionHighQualityDistribution),\r\n },\r\n ]}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n adunitAccessPermissions === null ? completeAccess : adunitAccessPermissions.publisherGroupConfig\r\n )}\r\n />\r\n </FormItem>\r\n {hasReadAccess(adunitAccessPermissions === null ? completeAccess : adunitAccessPermissions.inhousePromotions) && (\r\n <FormItem formWidth={440}>\r\n <FormLabel\r\n id=\"privateMarketplaceRadioLabel\"\r\n labelContent={formatMessage(messages.privateMarketplaceLabel)}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_AdUnitsPromotions', locale)}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n intl={this.props.intl}\r\n disableHeading\r\n disableAriaLevel\r\n />\r\n <Stack tokens={{ childrenGap: 10 }}>\r\n <Checkbox\r\n id={formatMessage(messages.promotionRadioOptionLabel)}\r\n aria-label={formatMessage(messages.promotionRadioOptionLabel)}\r\n ariaLabelledBy={'privateMarketplaceRadioLabel'}\r\n label={formatMessage(messages.promotionRadioOptionLabel)}\r\n checked={this.state.privateMarketPlaceCheck === PrivateMarketplace.InHouse}\r\n onChange={(ev, checked) => handlePrivateMarketPlace(ev, checked, PrivateMarketplace.InHouse)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n adunitAccessPermissions === null ? completeAccess : adunitAccessPermissions.inhousePromotions\r\n )}\r\n styles={{ checkbox: { borderRadius: '100%' } }}\r\n />\r\n <Checkbox\r\n id={formatMessage(messages.boostRadioOptionLabel)}\r\n aria-label={formatMessage(messages.promotionRadioOptionLabel)}\r\n ariaLabelledBy={'privateMarketplaceRadioLabel'}\r\n label={formatMessage(messages.boostRadioOptionLabel)}\r\n checked={this.state.privateMarketPlaceCheck === PrivateMarketplace.Boost}\r\n onChange={(ev, checked) => handlePrivateMarketPlace(ev, checked, PrivateMarketplace.Boost)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n adunitAccessPermissions === null ? completeAccess : adunitAccessPermissions.inhousePromotions\r\n )}\r\n styles={{ checkbox: { borderRadius: '100%' } }}\r\n />\r\n </Stack>\r\n {store.enablePrivateMarketplace && (\r\n <FormItem formWidth={440}>\r\n <TextField\r\n multiline\r\n autoAdjustHeight\r\n placeholder={formatMessage(this._getAdvertisersWhitelistTextFieldPlaceholder())}\r\n ariaLabel={formatMessage(this._getAdvertisersWhitelistTextFieldPlaceholder())}\r\n errorMessage={store.errors.storeIds}\r\n onRenderLabel={this._onRenderAdvertiserWhitelistLabel}\r\n value={store.active.storeIds}\r\n onChange={(_, value) => onStoreIdsChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n adunitAccessPermissions === null ? completeAccess : adunitAccessPermissions.inhousePromotions\r\n )}\r\n />\r\n </FormItem>\r\n )}\r\n\r\n {this.state.privateMarketPlaceCheck === PrivateMarketplace.Boost && isBoost === 'true' && (\r\n <div className={this._classNames.boostUploadOuter}>\r\n <div className={this._classNames.boostUploadDiv}>\r\n <p>{this.props.intl.formatMessage(messages.uploadBoostTemplate)}</p>\r\n </div>\r\n <BoostJsonFileUpload\r\n {...this.props}\r\n adUnitId={this.props.match.params.id || this.props.adunitId}\r\n onNewFileUpload={(file: NativeAdTemplate) => setTemplate(file)}\r\n onReplaceFile={(file: NativeAdTemplate) => setTemplate(file)}\r\n />\r\n </div>\r\n )}\r\n </FormItem>\r\n )}\r\n </>\r\n );\r\n };\r\n\r\n private _fetchBusinessModelLevel2Options = (businessModelLevel1Key?: number) => {\r\n const dropdownoptions: IDropdownOption[] = [\r\n { key: 0, text: this.props.intl.formatMessage(messages.businessModelLevel2DefaultOptionText) },\r\n ];\r\n const { adUnitTaxonomyValues } = getAdunitStore().active;\r\n if (adUnitTaxonomyValues && businessModelLevel1Key) {\r\n const level1BusinessModel = adUnitTaxonomyValues.filter((a) => a.key === businessModelLevel1Key)[0];\r\n const businessModelLevel2Values = adUnitTaxonomyValues.filter((a) => a.parentValue === level1BusinessModel.value);\r\n businessModelLevel2Values.forEach((a) =>\r\n dropdownoptions.push({ key: a.key, text: a.displayName, ariaLabel: a.displayName } as IDropdownOption)\r\n );\r\n }\r\n\r\n return dropdownoptions;\r\n };\r\n private _getAdvertisersWhitelistTextFieldLabel = () => {\r\n const store = getAdunitStore();\r\n return store.privateMarketplace === PrivateMarketplace.InHouse\r\n ? messages.promotionOptionTextfieldLabel\r\n : store.privateMarketplace === PrivateMarketplace.Boost\r\n ? messages.boostOptionTextfieldLabel\r\n : messages.privateMarketplaceTextfieldLabel;\r\n };\r\n private _getAdvertisersWhitelistTextFieldPlaceholder = () => {\r\n const store = getAdunitStore();\r\n return store.privateMarketplace === PrivateMarketplace.InHouse\r\n ? messages.promotionOptionTextfieldPlaceholder\r\n : store.privateMarketplace === PrivateMarketplace.Boost\r\n ? messages.boostOptionTextfieldPlaceholder\r\n : messages.privateMarketplaceTextfieldPlaceholder;\r\n };\r\n private _onRenderAdvertiserWhitelistLabel = (): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const { helpInfo, locale } = getAppStore();\r\n return (\r\n <FormLabel\r\n id=\"promotionsInputLabel\"\r\n labelContent={formatMessage(this._getAdvertisersWhitelistTextFieldLabel())}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_AdUnitsPromotions', locale)}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n intl={this.props.intl}\r\n />\r\n );\r\n };\r\n\r\n private _onSubmit = (publisherId?: string, accountId?: string): void => {\r\n this.setState({ initializeForm: false });\r\n onFormSubmitted(this.props.mode, this.props.history);\r\n Log.debug('Ad Unit form submitted');\r\n };\r\n\r\n private _onCancel = (publisherId?: string, accountId?: string): void => {\r\n const { mode, onCancel } = this.props;\r\n this.setState({ initializeForm: false });\r\n onFormCancelled();\r\n\r\n if (mode !== FormState.InPageCreate && mode !== FormState.InPageEdit) {\r\n // return to manage page\r\n const returnUrl = createReturnUrl(RouteName.adunit, publisherId, accountId);\r\n onNavigateBack(this.props.history, returnUrl);\r\n }\r\n if (onCancel) {\r\n onCancel();\r\n }\r\n Log.debug('Ad Unit form cancelled');\r\n };\r\n\r\n private _getAdUnitAccessPermission(): AdUnitAccessPermissions | null {\r\n const userRoles = localStorage.getItem(userRoleKey);\r\n if (userRoles === null) {\r\n return null;\r\n }\r\n const userRolesJSON = JSON.parse(userRoles);\r\n\r\n for (const value in userRolesJSON) {\r\n if (value === UserRoleEntity.AdUnit) {\r\n return JSON.parse(userRolesJSON[value]);\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _getPropertyAccessPermission(): PropertyAccessPermissions | null {\r\n const userRoles = localStorage.getItem(userRoleKey);\r\n if (userRoles === null) {\r\n return null;\r\n }\r\n const userRolesJSON = JSON.parse(userRoles);\r\n\r\n for (const value in userRolesJSON) {\r\n if (value === UserRoleEntity.Property) {\r\n return JSON.parse(userRolesJSON[value]);\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n *\tTakes FormState and returns correct label for tython or non-tython user\r\n *\t@param mode input to _getSubmitLabel\r\n *\t@returns label depending on mode (Create || Edit) && (tython user)\r\n */\r\n\r\n private _getSubmitLabel(mode: FormState): string {\r\n const { formatMessage } = this.props.intl;\r\n let submitButtonLabel: ReactIntl.FormattedMessage.MessageDescriptor;\r\n\r\n if (mode === FormState.Edit || mode === FormState.InPageEdit) {\r\n submitButtonLabel = messages.updateAdUnit;\r\n } else {\r\n if (this._tythonUser) {\r\n submitButtonLabel = messages.continueAdUnit;\r\n } else {\r\n submitButtonLabel = messages.createPageTitle;\r\n }\r\n }\r\n\r\n return formatMessage(submitButtonLabel);\r\n }\r\n\r\n private _isDisabled(mode: FormState, permission: number): boolean {\r\n if (mode === FormState.Create || mode === FormState.InPageCreate) {\r\n return false;\r\n }\r\n\r\n return !hasUpdateAccess(permission);\r\n }\r\n }\r\n);\r\n","import { ITheme } from '@fluentui/react';\r\nimport { FontWeights } from '@fluentui/theme';\r\nimport { BreakPoints, IPubCenterFonts, IPubcenterBoxShadow, IPubcenterPalette, IPubcenterSpacing } from '../../../../../../theme';\r\nimport { ICreateAdunitStyleProps, ICreateAdunitStyles } from '../../Create/CreateAdunit.types';\r\nimport { DEFAULT_AD_PREVIEW_HEIGHT } from '../components/AdUnitTypeSelector/useAdUnitTypeSelector';\r\nimport { TythonAdUnitDisplayAdTypeLayout } from './constants';\r\n\r\nexport const getStyles = (props: ICreateAdunitStyleProps): ICreateAdunitStyles => {\r\n const { theme, adPreviewHeight, displayAdLayout } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const fonts = theme.fonts as IPubCenterFonts;\r\n const { ResponsiveSmall } = BreakPoints;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const boxShadow = (theme as ITheme & { boxShadow: IPubcenterBoxShadow }).boxShadow;\r\n const [isDisplayAdHorizontal, isDisplayAdSquare, isDisplayVertical] = [\r\n displayAdLayout === TythonAdUnitDisplayAdTypeLayout.Horizontal,\r\n displayAdLayout === TythonAdUnitDisplayAdTypeLayout.Square,\r\n displayAdLayout === TythonAdUnitDisplayAdTypeLayout.Vertical,\r\n ];\r\n return {\r\n root: {\r\n marginTop: theme.spacing.m,\r\n marginLeft: theme.spacing.m,\r\n },\r\n title: [\r\n 'ms-font-xl',\r\n {\r\n display: 'flex',\r\n marginBottom: theme.spacing.l1,\r\n },\r\n ],\r\n adtypesTitle: {\r\n display: 'flex',\r\n },\r\n channelTitle: {\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n marginTop: spacing.size12,\r\n marginBottom: spacing.size16,\r\n },\r\n button: {\r\n background: 'none',\r\n border: 'none',\r\n height: '28px',\r\n fontSize: '14px',\r\n color: '#0078D4',\r\n\r\n cursor: 'pointer',\r\n position: 'relative',\r\n top: '38px',\r\n borderRadius: '2px',\r\n marginLeft: spacing.size4,\r\n boxSizing: 'border-box',\r\n selectors: {\r\n ':focus': {\r\n outline: `2px solid ${palette.themePrimary}`,\r\n },\r\n },\r\n },\r\n businessModel: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n },\r\n businessModelLevel2Dropdown: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n position: 'relative',\r\n margin: '28.5px 0 0 21px',\r\n },\r\n dropdown: {\r\n width: '220px',\r\n },\r\n combobox: {\r\n width: '400px',\r\n },\r\n multiSelectPicker: {\r\n marginBottom: theme.spacing.s1,\r\n },\r\n propertySection: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginLeft: spacing.size16,\r\n },\r\n siteSection: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n marginBottom: 50,\r\n },\r\n fileUploadLabelStyle: {\r\n color: palette.themePrimary,\r\n cursor: 'pointer',\r\n float: 'right',\r\n marginLeft: 'auto',\r\n },\r\n boostUploadDiv: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n boostUploadOuter: {\r\n marginBottom: '0px',\r\n paddingBottom: '0px',\r\n },\r\n advanceOptionTextfieldLabel: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n formAction: {\r\n marginTop: theme.spacing.l1,\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n },\r\n propertyDetails: {\r\n paddingTop: spacing.size12,\r\n },\r\n adTypeContainer: {\r\n marginTop: spacing.size48,\r\n },\r\n subComponentStyles: {\r\n servingTierChoiceGroup: {\r\n flexContainer: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'flex-start',\r\n selectors: {\r\n '.ms-ChoiceField': {\r\n marginRight: theme.spacing.m,\r\n },\r\n },\r\n },\r\n },\r\n formSection: {\r\n root: {\r\n borderBottomWidth: 0,\r\n },\r\n },\r\n checkbox: {\r\n root: {\r\n marginBottom: theme.spacing.s1,\r\n },\r\n },\r\n adTypeChoiceGroupOption: {\r\n root: {\r\n margin: `0 ${spacing.size16} ${spacing.size16} 0`,\r\n borderRadius: '5px',\r\n height: 'auto',\r\n [ResponsiveSmall]: {\r\n width: '100%',\r\n },\r\n },\r\n choiceFieldWrapper: {\r\n [ResponsiveSmall]: {\r\n width: '100%',\r\n },\r\n },\r\n labelWrapper: {\r\n height: 'fit-content',\r\n margin: `${spacing.size16} 0`,\r\n lineHeight: 'normal',\r\n },\r\n },\r\n textBox: {\r\n root: {\r\n width: spacing.size96,\r\n },\r\n prefix: {\r\n padding: 0,\r\n background: 'none',\r\n },\r\n errorMessage: {\r\n width: spacing.size128,\r\n },\r\n },\r\n },\r\n mediationHeader: [\r\n 'ms-fontWeight-semibold',\r\n {\r\n ...fonts.size20,\r\n },\r\n ],\r\n mediationToggle: {\r\n display: 'flex',\r\n alignItems: 'baseline',\r\n gap: spacing.size16,\r\n fontWeight: fonts.size14Medium.fontWeight,\r\n },\r\n adunitTypeAccordionWrapper: {\r\n width: `calc(100% - ${spacing.size48})`,\r\n position: 'relative',\r\n '.ms-Overlay': {\r\n userSelect: 'none', // Standard syntax\r\n WebkitUserSelect: 'none', // Chrome, Safari, and Opera\r\n MozUserSelect: 'none', // Firefox\r\n msUserSelect: 'none', // IE 10+\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n zIndex: 2,\r\n fontSize: '20px',\r\n backgroundColor: 'rgba(228, 227, 226, 0.5)',\r\n fontWeight: 700,\r\n color: palette.neutralSecondaryAltWhiteContrast,\r\n position: 'absolute',\r\n width: '100%',\r\n borderRadius: spacing.size12,\r\n },\r\n },\r\n adunitTypeAccordionCheckboxLabel: {\r\n 'ms-checkbox-text': {\r\n fontSize: spacing.size18,\r\n },\r\n },\r\n adunitTypeWarningMsgBar: {\r\n width: `calc(100% - ${spacing.size48})`,\r\n },\r\n adunitTypeAccordionContentWrapper: {\r\n width: '100%',\r\n '.nativeAdType': {\r\n minHeight: (adPreviewHeight ?? DEFAULT_AD_PREVIEW_HEIGHT) + 146,\r\n },\r\n [ResponsiveSmall]: {\r\n flexDirection: 'column',\r\n },\r\n },\r\n adunitTypeLeftSection: {\r\n borderRight: `${spacing.size1} solid ${palette.neutralLight}`,\r\n padding: `${spacing.size24} ${spacing.size46}`,\r\n width: spacing.size480,\r\n [ResponsiveSmall]: {\r\n width: `calc(100% - ${spacing.size92})`,\r\n },\r\n },\r\n adunitTypeRightSection: {\r\n padding: `${spacing.size24} ${spacing.size46}`,\r\n [ResponsiveSmall]: {\r\n width: `calc(100% - ${spacing.size92})`,\r\n borderTop: `${spacing.size1} solid ${palette.neutralLight}`,\r\n },\r\n },\r\n previewSDKWrapper: {\r\n [ResponsiveSmall]: {\r\n maxWidth: '100%',\r\n overflowX: 'auto',\r\n },\r\n '& > div > div[data-template=\"horizontal\"]': {\r\n boxShadow: boxShadow.soft,\r\n },\r\n },\r\n adunitTypeFormTitlePrimary: {\r\n fontSize: spacing.size16,\r\n fontWeight: 600,\r\n color: palette.black,\r\n marginBottom: spacing.size12,\r\n },\r\n boldFieldTitle: {\r\n lineHeight: spacing.size20,\r\n fontSize: spacing.size14,\r\n fontWeight: FontWeights.semibold,\r\n marginRight: spacing.size2,\r\n },\r\n horizontalSelectionWrapper: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n marginTop: spacing.size12,\r\n },\r\n infoMsgBar: {\r\n backgroundColor: palette.themeLighterAlt,\r\n '.ms-MessageBar-content': { alignItems: 'center' },\r\n },\r\n expandIcon: {\r\n paddingLeft: spacing.size4,\r\n },\r\n newPropertyPanelHeader: {\r\n background: 'transparent',\r\n right: '0px',\r\n position: 'fixed',\r\n ':focus': {\r\n border: '1px solid black',\r\n },\r\n },\r\n adPreviewWrapper: {\r\n overflowY: 'auto',\r\n width: '100%',\r\n },\r\n mediationDescriptionWrapper: {\r\n [ResponsiveSmall]: {\r\n width: spacing.size320,\r\n },\r\n },\r\n adunitTypeDisplayAdPreviewHead: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'space-between',\r\n '>span': {\r\n marginBottom: 0,\r\n [ResponsiveSmall]: {\r\n marginBottom: spacing.size6,\r\n },\r\n },\r\n },\r\n adunitTypeDisplayAdPreviewHeadButtons: {\r\n textAlign: 'right',\r\n [ResponsiveSmall]: {\r\n textAlign: 'left',\r\n },\r\n marginBottom: spacing.size18,\r\n '.ms-Pivot--tabs': {\r\n '.ms-Pivot-linkContent': {\r\n padding: `0px ${spacing.size12}`,\r\n },\r\n '.ms-Button': {\r\n border: `1px solid ${palette.neutralLight}`,\r\n height: spacing.size36,\r\n },\r\n '.ms-Button:nth-child(2)': {\r\n borderLeft: 'none',\r\n borderRight: 'none',\r\n },\r\n '.is-selected': {\r\n fontWeight: 600,\r\n },\r\n },\r\n },\r\n adunitTypeDisplayAdPreviewContainer: {},\r\n adunitTypeDisplayAdPreviewLayoutWrapper: {\r\n overflowX: 'auto',\r\n paddingBottom: spacing.size12,\r\n display: 'flex',\r\n flexDirection: isDisplayAdHorizontal ? 'column' : 'row',\r\n gap: spacing.size12,\r\n img: {\r\n boxShadow: boxShadow.soft,\r\n display: 'block',\r\n ...(isDisplayAdHorizontal ? { width: spacing.size600 } : {}),\r\n ...(isDisplayAdSquare ? { width: spacing.size250 } : {}),\r\n ...(isDisplayVertical ? { width: spacing.size160 } : {}),\r\n },\r\n ...(isDisplayAdSquare || isDisplayVertical\r\n ? {\r\n '> div:nth-child(1)': {\r\n marginRight: spacing.size12,\r\n },\r\n '> div:nth-child(2)': {\r\n marginRight: spacing.size12,\r\n },\r\n }\r\n : {}),\r\n },\r\n /**\r\n * the last vertical ad preview has different border width, adding\r\n * this class to override the nested img width.\r\n */\r\n verticalAdPreviewBottomWrapper: {\r\n width: `${spacing.size159} !important`,\r\n },\r\n displayAdPreviewExampleTitle: {\r\n fontWeight: 600,\r\n marginBottom: spacing.size6,\r\n },\r\n };\r\n};\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport const mediationPopupMessages = defineMessages({\r\n title: {\r\n id: 'mediationPopupMessages.title',\r\n defaultMessage: 'Are you sure you want to opt out of mediation?',\r\n },\r\n description: {\r\n id: 'mediationPopupMessages.description',\r\n defaultMessage: 'Mediation will help boost your revenue for each ad placement.',\r\n },\r\n turnOff: {\r\n id: 'mediationPopupMessages.turnOff',\r\n defaultMessage: 'Turn off',\r\n },\r\n});\r\n","import React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport messages from '../../../../../../../App.messages';\r\nimport { PopupCard } from '../../../../../../../components/Popup';\r\nimport { mediationPopupMessages } from './DisablingMediationPopup.messages';\r\n\r\nexport interface IOptOutMediationPopupProps extends InjectedIntlProps {\r\n popupProps: {\r\n isShown: boolean;\r\n onDismiss: () => void;\r\n onPrimaryClick: () => void;\r\n onSecondaryClick: () => void;\r\n };\r\n}\r\n\r\nexport const OptOutMediationPopup = injectIntl(function DisablingMediationComponent({\r\n intl: { formatMessage },\r\n popupProps,\r\n}: IOptOutMediationPopupProps): JSX.Element {\r\n return (\r\n <PopupCard\r\n isShown={popupProps.isShown}\r\n popUpTitle={formatMessage(mediationPopupMessages.title)}\r\n popUpDescription={formatMessage(mediationPopupMessages.description)}\r\n primaryButtonAriaLabel={formatMessage(mediationPopupMessages.turnOff)}\r\n secondaryButtonAriaLabel={formatMessage(messages.cancel)}\r\n onPopupDismiss={() => popupProps.onDismiss()}\r\n onPrimaryButtonClick={() => popupProps.onPrimaryClick()}\r\n onSecondaryButtonClick={() => popupProps.onSecondaryClick()}\r\n />\r\n );\r\n});\r\n","import { getTheme, Spinner, Toggle } from '@fluentui/react';\r\nimport React, { useState } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { injectIntlAndObserver } from '../../../../../../utils';\r\nimport { getClassNames } from '../../../Create/CreateAdunit';\r\nimport messages from '../../CreateAdunit/messages';\r\nimport { getStyles } from '../../CreateAdunit/styles';\r\nimport { ITythonAdUnit } from '../../CreateAdunit/types';\r\nimport { OptOutMediationPopup } from './DisablingMediationPopup';\r\n\r\nexport interface IAdUnitMediationSelectorProps {\r\n activeAdunit?: ITythonAdUnit;\r\n shouldRenderComponent: boolean;\r\n toggleIsLoading: boolean;\r\n onAdunitMediationChange: (active: boolean) => void;\r\n}\r\n\r\nconst AdUnitMediationSelector = injectIntlAndObserver(function DisablingMediationComponent({\r\n intl: { formatMessage },\r\n activeAdunit,\r\n shouldRenderComponent,\r\n toggleIsLoading,\r\n onAdunitMediationChange,\r\n}: IAdUnitMediationSelectorProps & InjectedIntlProps): JSX.Element | null {\r\n const [shouldRenderMediationOptOutPopUp, setShouldRenderMediationOptOutPopUp] = useState(false);\r\n\r\n const theme = getTheme();\r\n const classNames = getClassNames(getStyles, { theme });\r\n\r\n if (!shouldRenderComponent) {\r\n return null;\r\n }\r\n\r\n const popupProps = {\r\n isShown: shouldRenderMediationOptOutPopUp,\r\n onDismiss: () => setShouldRenderMediationOptOutPopUp(false),\r\n onPrimaryClick: () => {\r\n onAdunitMediationChange(false);\r\n setShouldRenderMediationOptOutPopUp(false);\r\n },\r\n onSecondaryClick: () => setShouldRenderMediationOptOutPopUp(false),\r\n };\r\n\r\n return (\r\n <>\r\n <OptOutMediationPopup popupProps={popupProps} />\r\n <div className={classNames.mediationHeader}>{formatMessage(messages.mediationHeader)}</div>\r\n <div>\r\n <p className={classNames.mediationDescriptionWrapper}>{formatMessage(messages.mediationDescription)}</p>\r\n </div>\r\n <div className={classNames.mediationToggle}>\r\n <p>{formatMessage(messages.mediationToggleLabel)}</p>\r\n {toggleIsLoading ? (\r\n <Spinner />\r\n ) : (\r\n <Toggle\r\n ariaLabel={formatMessage(messages.mediationToggleLabel)}\r\n checked={activeAdunit?.mediationEnabled === true}\r\n title=\"mediationToggle\"\r\n onChange={(_, state) => {\r\n if (!state) {\r\n setShouldRenderMediationOptOutPopUp(true);\r\n } else {\r\n onAdunitMediationChange(state);\r\n }\r\n }}\r\n />\r\n )}\r\n </div>\r\n </>\r\n );\r\n});\r\n\r\nexport default AdUnitMediationSelector;\r\n","import { TextField } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { FormItem } from '../../../../../../components/Form';\r\nimport { useWindowSize } from '../../../../../../hooks';\r\nimport { getStore } from '../../../../../../hooks/useWindowSize/store/store';\r\nimport { injectIntlAndObserver } from '../../../../../../utils';\r\nimport messages from '../../CreateAdunit/messages';\r\n\r\nexport interface IAdUnitNameInputFieldProps {\r\n errorMsg?: string;\r\n value?: string;\r\n onChange: (_, value: string) => void;\r\n disabled: boolean;\r\n shouldRenderComponent: boolean;\r\n}\r\n\r\nconst { windowStoreSerializer } = useWindowSize();\r\n\r\nconst AdUnitNameInputField = injectIntlAndObserver<InjectedIntlProps & IAdUnitNameInputFieldProps>(\r\n ({ intl: { formatMessage }, errorMsg, value, onChange, disabled, shouldRenderComponent }) => {\r\n const { isWindowSmallSize } = windowStoreSerializer(getStore());\r\n\r\n if (!shouldRenderComponent) {\r\n return null;\r\n }\r\n return (\r\n <FormItem formWidth={isWindowSmallSize ? 324 : 440}>\r\n <TextField\r\n label={formatMessage(messages.adunitNameLabel)}\r\n required={true}\r\n errorMessage={errorMsg}\r\n value={value}\r\n onChange={onChange}\r\n disabled={disabled}\r\n data-test-id=\"adunit-name-input\"\r\n />\r\n </FormItem>\r\n );\r\n }\r\n);\r\n\r\nexport default AdUnitNameInputField;\r\n","export interface IStepperProps {\r\n labelArray: string[];\r\n currentStep: number;\r\n direction?: StepperDirection,\r\n styleProps?: string;\r\n goToStep?: (step: number) => void;\r\n updateStep?: (step: number) => void;\r\n isStepMarked?: (step: number) => boolean;\r\n}\r\n\r\nexport interface IStepperStyleProps {\r\n direction?: StepperDirection;\r\n}\r\n\r\nexport interface IStepperStyles {\r\n stepWrapper?: string;\r\n}\r\n\r\nexport enum StepperDirection {\r\n Vertical,\r\n Horizontal\r\n}\r\n","import { FontWeights, getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../theme';\r\nimport { IStepClassNames, IStepStyleProps } from './Step.types';\r\nimport { StepperDirection } from './Stepper.types';\r\n\r\nexport const getStyles = (props: IStepStyleProps): IStepClassNames => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { fonts, spacing, palette } = theme;\r\n const weight = FontWeights;\r\n\r\n const circleAbstract = {\r\n marginTop: spacing.size6,\r\n width: spacing.size18,\r\n height: spacing.size18,\r\n borderRadius: '50%',\r\n lineHeight: spacing.size18,\r\n position: 'relative',\r\n textAlign: 'center',\r\n borderWidth: spacing.size2,\r\n borderStyle: 'solid',\r\n }\r\n\r\n const verticalStepStyles = {\r\n stepBlock: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n border: 0,\r\n padding: 0,\r\n background: 'transparent'\r\n },\r\n stepTitle: {\r\n fontSize: fonts.size10,\r\n cursor: 'pointer'\r\n },\r\n stepTitleSelected: {\r\n fontWeight: weight.semibold,\r\n },\r\n circleWrapper: {\r\n position: 'relative',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'baseline',\r\n gap: spacing.size10,\r\n },\r\n circleLabel: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 5\r\n },\r\n circle: {\r\n ...circleAbstract,\r\n color: 'transparent',\r\n backgroundColor: 'transparent',\r\n borderColor: palette.neutralLight,\r\n },\r\n circleSelected: {\r\n ...circleAbstract,\r\n color: palette.themeLight,\r\n backgroundColor: palette.themeLight,\r\n borderColor: palette.themeLight,\r\n },\r\n circleMarked: {\r\n ...circleAbstract,\r\n color: palette.white,\r\n backgroundColor: palette.themePrimary,\r\n borderColor: palette.themePrimary,\r\n },\r\n barStyle: {\r\n width: spacing.size2,\r\n height: '25px',\r\n margin: `${spacing.size8} auto`,\r\n backgroundColor: palette.neutralQuaternaryAlt,\r\n },\r\n }\r\n\r\n const horizontalStepStyles = {\r\n stepBlock: {\r\n marginTop: spacing.size24,\r\n border: 0,\r\n padding: 0,\r\n background: 'transparent'\r\n },\r\n stepTitle: {\r\n fontSize: fonts.size10,\r\n marginTop: spacing.size12,\r\n textAlign: 'center'\r\n },\r\n stepTitleSelected: {\r\n fontWeight: weight.semibold,\r\n },\r\n circleWrapper: {\r\n padding: '0px 115px',\r\n position: 'relative',\r\n },\r\n circleLabel: {},\r\n circle: {\r\n ...circleAbstract,\r\n color: palette.white,\r\n backgroundColor: palette.white,\r\n borderColor: palette.neutralLight,\r\n },\r\n circleSelected: {\r\n ...circleAbstract,\r\n color: palette.themeLight,\r\n backgroundColor: palette.themeLight,\r\n borderColor: palette.themeLight,\r\n },\r\n circleMarked: {\r\n ...circleAbstract,\r\n color: palette.white,\r\n backgroundColor: palette.themePrimary,\r\n borderColor: palette.themePrimary,\r\n fontSize: fonts.size10,\r\n },\r\n barStyle: {\r\n content: '',\r\n width: '80%',\r\n height: '2px',\r\n position: 'absolute',\r\n backgroundColor: palette.neutralQuaternaryAlt,\r\n margin: 'auto',\r\n top: 0,\r\n bottom: 0,\r\n left: '150px',\r\n },\r\n };\r\n\r\n return mergeStyleSets(props.direction === StepperDirection.Horizontal ? horizontalStepStyles: verticalStepStyles );\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): IStepClassNames {\r\n return getStyles({ direction: StepperDirection.Horizontal, theme: getTheme(), ...props });\r\n}","import { Icon, mergeStyleSets } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport { getClassNames } from './Step.style';\r\nimport { IStepProps } from './Step.types';\r\nimport { StepperDirection } from './Stepper.types';\r\n\r\nexport const Step = injectIntl<IStepProps>(function StepComponent({\r\n label,\r\n styleProps,\r\n index,\r\n totalSteps,\r\n updateStep,\r\n goToStep,\r\n isSelected,\r\n isMarked,\r\n isLastChild,\r\n direction,\r\n}) {\r\n const {\r\n stepBlock,\r\n circleWrapper,\r\n barStyle,\r\n circle,\r\n circleSelected,\r\n circleMarked,\r\n circleLabel,\r\n stepTitle,\r\n stepTitleSelected,\r\n } = mergeStyleSets(getClassNames({ direction }), styleProps);\r\n\r\n const updateStepClick = (e) => {\r\n updateStep?.(e);\r\n goToStep?.(index);\r\n };\r\n\r\n const getAriaLabel = () => {\r\n return `${label} - step ${index + 1} of ${totalSteps}, ${isMarked ? 'completed' : 'uncompleted'}`;\r\n };\r\n\r\n return (\r\n <button className={stepBlock} role=\"presentation\" onClick={updateStepClick} aria-label={getAriaLabel()}>\r\n <div className={circleWrapper}>\r\n <div className={direction === StepperDirection.Vertical ? circleLabel : ''}>\r\n <Icon className={isSelected ? circleSelected : isMarked ? circleMarked : circle} iconName=\"CheckMark\" />\r\n <div className={isLastChild ? '' : barStyle} />\r\n </div>\r\n {direction === StepperDirection.Vertical && <div className={`${stepTitle} ${isSelected && stepTitleSelected}`}>{label}</div>}\r\n </div>\r\n {direction === StepperDirection.Horizontal && <div className={`${stepTitle} ${isSelected && stepTitleSelected}`}>{label}</div>}\r\n </button>\r\n );\r\n});\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterSpacing, IPubcenterTheme } from '../../../theme';\r\nimport { flexWithCenter } from '../../utils/GlobalStyleUtils';\r\nimport { IStepperStyleProps, IStepperStyles, StepperDirection } from './Stepper.types';\r\n\r\nexport const getStyles = (props: IStepperStyleProps): IStepperStyles => {\r\n const theme = (getTheme() as unknown) as IPubcenterTheme;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n const verticalStepStyles = {\r\n stepWrapper: {\r\n display: 'flex',\r\n flexDirection: 'column'\r\n },\r\n }\r\n\r\n const horizontalStepStyles = {\r\n stepWrapper: {\r\n ...flexWithCenter,\r\n marginBottom: spacing.size20,\r\n marginLeft: spacing.size12,\r\n },\r\n }\r\n\r\n return mergeStyleSets(props.direction === StepperDirection.Horizontal ? horizontalStepStyles : verticalStepStyles);\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ direction: StepperDirection.Horizontal, ...props });\r\n}\r\n","import { mergeStyleSets } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport { Step } from './Step';\r\nimport { getClassNames } from './Stepper.style';\r\nimport { IStepperProps, StepperDirection } from './Stepper.types';\r\n\r\nexport const Stepper = injectIntl<IStepperProps>(function StepperComponent({\r\n direction = StepperDirection.Horizontal,\r\n labelArray,\r\n currentStep,\r\n styleProps,\r\n goToStep,\r\n updateStep,\r\n isStepMarked,\r\n}) {\r\n const { stepWrapper } = mergeStyleSets(getClassNames({ direction }), styleProps);\r\n\r\n return (\r\n <div className={stepWrapper} role=\"navigation\" aria-label=\"Stepper\">\r\n {labelArray.map((item, index) => (\r\n <Step\r\n key={index}\r\n label={item}\r\n direction={direction}\r\n goToStep={goToStep}\r\n updateStep={updateStep}\r\n index={index}\r\n isSelected={currentStep === index + 1}\r\n totalSteps={labelArray.length}\r\n isMarked={isStepMarked ? isStepMarked?.(index) : currentStep >= index + 1}\r\n isLastChild={index === labelArray.length - 1}\r\n />\r\n ))}\r\n </div>\r\n );\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n backButtonAriaDesc: {\r\n id: 'detailPageWithStepper.backButtonAriaDesc',\r\n defaultMessage: 'Click to go back to manage page'\r\n },\r\n breadcrumbAriaLabel: {\r\n id: 'detailPageWithStepper.breadcrumbAriaLabel',\r\n defaultMessage: 'Bread crumb showing the heirarchy of subpages'\r\n },\r\n stepperGoToFutureStepError: {\r\n id: 'detailPageWithStepper.stepperGoToFutureStepError',\r\n defaultMessage: 'Can not move directly to this step'\r\n }\r\n});","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { BreakPoints, IPubcenterTheme } from '../../../theme';\r\nimport { StepperDirection } from '../../components/Stepper/Stepper.types';\r\nimport { IDetailPageWithStepperStyleProps, IDetailPageWithStepperStyles } from './DetailPageWithStepper.types';\r\n\r\nconst STEPPER_CONTAINER_WIDTH = 270;\r\n\r\nexport const getStyles = (props: IDetailPageWithStepperStyleProps): IDetailPageWithStepperStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { fonts, spacing, palette } = theme;\r\n const direction = props.direction;\r\n const { ResponsiveSmall, ResponsiveMedium } = BreakPoints;\r\n\r\n return mergeStyleSets({\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n overflowY: 'auto',\r\n flex: '1',\r\n },\r\n navBackButton: [\r\n 'ms-navBackButton',\r\n {\r\n display: 'flex',\r\n backgroundColor: palette.neutralLighter,\r\n height: spacing.size44,\r\n alignItems: 'center',\r\n },\r\n ],\r\n mainContainer: {\r\n display: 'flex',\r\n flex: '1',\r\n flexDirection: direction === StepperDirection.Horizontal ? 'column' : 'row',\r\n alignItems: direction === StepperDirection.Horizontal ? 'center' : 'stretch',\r\n [ResponsiveMedium]: {\r\n display: 'block',\r\n },\r\n [ResponsiveSmall]: {\r\n display: 'block',\r\n },\r\n },\r\n leftPane: {\r\n display: 'flex',\r\n font: fonts.size14,\r\n textAlign: 'center',\r\n backgroundColor: palette.neutralLighterAlt,\r\n padding: `${spacing.size32} ${spacing.size48} ${spacing.size32} ${spacing.size24}`,\r\n minWidth: 'max-content',\r\n maxWidth: STEPPER_CONTAINER_WIDTH,\r\n [ResponsiveMedium]: {\r\n backgroundColor: 'transparent',\r\n },\r\n [ResponsiveSmall]: {\r\n backgroundColor: 'transparent',\r\n },\r\n },\r\n rightPane: {\r\n flexGrow: '1',\r\n },\r\n scrollablePanel: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n overflowY: 'auto',\r\n height: '90%',\r\n maxHeight: '75vh',\r\n width: '100%',\r\n marginBottom: spacing.size12,\r\n [ResponsiveMedium]: {\r\n maxHeight: 'none',\r\n },\r\n [ResponsiveSmall]: {\r\n maxHeight: 'none',\r\n },\r\n },\r\n content: {\r\n marginLeft: spacing.size48,\r\n position: 'relative',\r\n height: 'inherit',\r\n marginRight: '3rem',\r\n },\r\n buttons: {\r\n borderTop: `1px solid ${palette.neutralLight}`,\r\n position: 'static',\r\n bottom: '0',\r\n display: 'flex',\r\n padding: `${spacing.size16} 0 ${spacing.size16} ${spacing.size48}`,\r\n selectors: {\r\n '.ms-Button': {\r\n marginRight: spacing.size8,\r\n },\r\n },\r\n },\r\n subComponentStyles: {\r\n formTitle: {\r\n root: {\r\n marginLeft: spacing.size48,\r\n marginTop: spacing.size32,\r\n marginBottom: spacing.size24,\r\n },\r\n },\r\n breadcrumb: {\r\n root: {\r\n margin: 0,\r\n alignItems: 'center',\r\n },\r\n item: {\r\n lineHeight: '22px',\r\n fontSize: fonts.mediumPlus?.fontSize,\r\n color: theme.palette.neutralPrimary,\r\n },\r\n chevron: {\r\n lineHeight: '22px',\r\n color: palette.neutralPrimary,\r\n },\r\n },\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): IDetailPageWithStepperStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport const leavePagePopupMessages = defineMessages({\r\n title: {\r\n id: 'leavePagePopupMessages.title',\r\n defaultMessage: 'Are you sure to leave this page?',\r\n },\r\n description: {\r\n id: 'leavePagePopupMessages.description',\r\n defaultMessage: 'You haven’t finished the entire set up yet. Changes you made may not be saved.',\r\n },\r\n stayOnPage: {\r\n id: 'leavePagePopupMessages.submit',\r\n defaultMessage: 'Stay on page',\r\n },\r\n leavePage: {\r\n id: 'leavePagePopupMessages.cancel',\r\n defaultMessage: 'Leave page',\r\n },\r\n});\r\n","import React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { getAppStore } from '../../../@data';\r\nimport { onPopupOpenChanged } from '../../../@data/mutatorActions';\r\nimport { PopupType } from '../../../@data/store/schema/enums/PopupType';\r\nimport { PopupCard } from '../../../components/Popup';\r\nimport { injectIntlAndObserver } from '../../../utils';\r\nimport { leavePagePopupMessages } from './LeavePagePopup.messages';\r\n\r\nexport interface ILeavePagePopupProps extends InjectedIntlProps {\r\n onSubmit?: () => void;\r\n}\r\n\r\nexport const LeavePagePopup = injectIntlAndObserver(function LeavePagePopupComponent({\r\n onSubmit,\r\n intl: { formatMessage },\r\n}: ILeavePagePopupProps): JSX.Element {\r\n const { openedPopup } = getAppStore();\r\n\r\n return (\r\n <PopupCard\r\n isShown={PopupType.Leaving === openedPopup}\r\n popUpTitle={formatMessage(leavePagePopupMessages.title)}\r\n popUpDescription={formatMessage(leavePagePopupMessages.description)}\r\n primaryButtonAriaLabel={formatMessage(leavePagePopupMessages.stayOnPage)}\r\n secondaryButtonAriaLabel={formatMessage(leavePagePopupMessages.leavePage)}\r\n onPopupDismiss={() => {\r\n onPopupOpenChanged(PopupType.None);\r\n }}\r\n onPrimaryButtonClick={async () => {\r\n onPopupOpenChanged(PopupType.None);\r\n }}\r\n onSecondaryButtonClick={() => {\r\n onSubmit?.();\r\n onPopupOpenChanged(PopupType.None);\r\n }}\r\n />\r\n );\r\n});\r\n","import { IBreadcrumbItem } from '@fluentui/react';\r\nimport { useEffect, useState } from 'react';\r\nimport { onPopupOpenChanged, showInfoToastNotification } from '../../../@data/mutatorActions';\r\nimport { PopupType } from '../../../@data/store/schema/enums/PopupType';\r\nimport { FormState } from '../../../components/Form';\r\nimport { IStepperStep, StepState } from '../DetailPageWithStepper.types';\r\n\r\nexport const useStepperLogic = (\r\n pageMode: FormState,\r\n process: string,\r\n steps: IStepperStep[],\r\n startAt: number,\r\n backToBase: () => void,\r\n goToErrorMessage: string\r\n) => {\r\n const [currentStep, setCurrentStep] = useState(startAt);\r\n const [stepsState, setStepState] = useState(Array(steps.length).fill(StepState.Empty));\r\n\r\n const updateStepState = (step: number) => {\r\n setStepState((prevState) => {\r\n const newState = prevState;\r\n newState[step] = StepState.Dirty;\r\n return newState;\r\n });\r\n };\r\n\r\n const reset = () => {\r\n setCurrentStep(0);\r\n setStepState(Array(steps.length).fill(StepState.Empty));\r\n };\r\n\r\n const nextStep = () => {\r\n const stepUpdater = () => {\r\n if (currentStep + 1 === steps.length) {\r\n reset();\r\n return;\r\n }\r\n\r\n setCurrentStep((prevStep) => (prevStep >= steps.length - 1 ? prevStep : prevStep + 1));\r\n updateStepState(currentStep);\r\n };\r\n\r\n if (steps[currentStep].onNext) {\r\n steps[currentStep].onNext?.(stepUpdater, stepsState[currentStep]);\r\n } else {\r\n stepUpdater();\r\n }\r\n };\r\n\r\n const previousStep = () => {\r\n if (currentStep - 1 === -1) {\r\n backToBase();\r\n return;\r\n }\r\n\r\n setCurrentStep((prevStep) => (prevStep <= 0 ? prevStep : prevStep - 1));\r\n updateStepState(currentStep);\r\n };\r\n\r\n const navigateBack = () => {\r\n onPopupOpenChanged(PopupType.Leaving);\r\n };\r\n\r\n const goToStep = (step: number) => {\r\n if (\r\n steps[step].allowFreeNavigation === false ||\r\n (!steps[step].allowFreeNavigation && stepsState[step] === StepState.Empty) ||\r\n (pageMode === FormState.MultiStepCreation && stepsState[step] === StepState.Empty)\r\n ) {\r\n showInfoToastNotification({ text: steps[step].freeNavigationErrorMessage || goToErrorMessage });\r\n return;\r\n }\r\n\r\n setCurrentStep(step);\r\n updateStepState(step);\r\n };\r\n\r\n const getStepperTitle = (): string[] => steps.map((step) => step.name);\r\n\r\n const getBreadCrumpTitle = (): IBreadcrumbItem[] => [\r\n {\r\n key: '1',\r\n text: process,\r\n },\r\n {\r\n key: '2',\r\n text: steps[currentStep].name,\r\n },\r\n ];\r\n\r\n useEffect(() => {\r\n const url = new URL(window.location.href);\r\n url.searchParams.set('step', currentStep.toString());\r\n window.history.replaceState('', '', url.toString());\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [currentStep]);\r\n\r\n useEffect(() => {\r\n setStepState(\r\n Array(steps.length)\r\n .fill(StepState.Dirty)\r\n .map((stepState, index) => {\r\n if (steps[index].isStepDirty === false) {\r\n stepState = StepState.Empty;\r\n }\r\n return stepState;\r\n })\r\n );\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [pageMode, steps]);\r\n\r\n return {\r\n currentStep,\r\n step: steps[currentStep],\r\n state: stepsState[currentStep],\r\n stepsState,\r\n goToStep,\r\n nextStep,\r\n previousStep,\r\n navigateBack,\r\n getStepperTitle: getStepperTitle(),\r\n getBreadCrumpTitle: getBreadCrumpTitle(),\r\n };\r\n};\r\n","import {\r\n ActionButton,\r\n Breadcrumb,\r\n DefaultButton,\r\n getId,\r\n IBreadcrumbData,\r\n mergeStyleSets,\r\n Overlay,\r\n PrimaryButton,\r\n Spinner,\r\n} from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { getAppStore, LayoutMode, onHelpInfoCalloutOpened, onHelpInfoChanged, onLayoutChanged } from '../../@data';\r\nimport AppMessages from '../../App.messages';\r\nimport { FormTitle } from '../../components/Form';\r\nimport { isInPageForm } from '../../components/Form/FormState/formUtils';\r\nimport { Main } from '../../components/Main/Main';\r\nimport { Stepper } from '../../components/Stepper/Stepper';\r\nimport { StepperDirection } from '../../components/Stepper/Stepper.types';\r\nimport { injectIntlAndObserver } from '../../utils';\r\nimport messages from './DetailPageWithStepper.messages';\r\nimport { getClassNames } from './DetailPageWithStepper.styles';\r\nimport { IDetailPageWithStepperProps, StepState } from './DetailPageWithStepper.types';\r\nimport { LeavePagePopup } from './LeavePagePopup';\r\nimport { useStepperLogic } from './utils/useStepperLogic';\r\n\r\n/**\r\n * DetailPageWithStepper is a layout component which is to be used when a form is displayed\r\n * with submit, cancel buttons and Stepper. And the page should have a title and a help icon.\r\n */\r\nexport const DetailPageWithStepper = injectIntlAndObserver(function DetailsPageWithStepperComponent(props: IDetailPageWithStepperProps) {\r\n const searchParams = new URLSearchParams(props.location.search);\r\n const showExtraBtns = searchParams.get('showExtraBtns');\r\n\r\n const { formatMessage } = props.intl;\r\n const { helpInfo, locale } = getAppStore();\r\n const formTitleId = getId('formTitle');\r\n const { process, pageMode, styles, steps, openStep, backToBase, direction = StepperDirection.Vertical } = props;\r\n const { root, navBackButton, scrollablePanel, buttons, content, subComponentStyles, mainContainer, leftPane, rightPane } = mergeStyleSets(\r\n getClassNames({ pageMode, direction }),\r\n styles\r\n );\r\n const {\r\n currentStep,\r\n state,\r\n stepsState,\r\n goToStep,\r\n nextStep,\r\n previousStep,\r\n navigateBack,\r\n getStepperTitle,\r\n getBreadCrumpTitle,\r\n } = useStepperLogic(pageMode, process, steps, openStep || 0, backToBase, formatMessage(messages.stepperGoToFutureStepError));\r\n\r\n const { saving, loading } = getAppStore();\r\n const showOverlay = saving || loading;\r\n\r\n const getSubmitLabel = (idx: number): string => {\r\n const label = idx === steps.length - 1 ? AppMessages.finish : AppMessages.continue;\r\n return props.steps[idx].nextBtnLbl || formatMessage(label);\r\n };\r\n\r\n const getCancelLabel = (idx: number): string => {\r\n const label = idx === 0 ? AppMessages.cancel : AppMessages.previous;\r\n return props.steps[idx].previousBtnLbl || formatMessage(label);\r\n };\r\n\r\n useEffect(() => {\r\n if (!isInPageForm(pageMode)) {\r\n onLayoutChanged(LayoutMode.ContentOnly);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <div className={root}>\r\n {!isInPageForm(pageMode) && (\r\n <div className={navBackButton}>\r\n {showOverlay && <Overlay />}\r\n <ActionButton\r\n id=\"backButton\"\r\n iconProps={{\r\n iconName: 'Back',\r\n }}\r\n onClick={() => navigateBack()}\r\n ariaDescription={formatMessage(messages.backButtonAriaDesc)}\r\n >\r\n {formatMessage(AppMessages.back)}\r\n </ActionButton>\r\n <Breadcrumb\r\n items={getBreadCrumpTitle}\r\n onReduceData={(data: IBreadcrumbData) => {\r\n return undefined;\r\n }}\r\n ariaLabel={formatMessage(messages.breadcrumbAriaLabel)}\r\n styles={subComponentStyles.breadcrumb}\r\n />\r\n </div>\r\n )}\r\n\r\n <div className={mainContainer}>\r\n {steps && (\r\n <div className={leftPane}>\r\n <Stepper\r\n direction={direction}\r\n labelArray={getStepperTitle}\r\n currentStep={currentStep! + 1}\r\n goToStep={goToStep}\r\n isStepMarked={(step) => stepsState[step] === StepState.Dirty}\r\n />\r\n </div>\r\n )}\r\n\r\n <div className={rightPane}>\r\n <Main className={scrollablePanel}>\r\n {showOverlay && <Overlay />}\r\n {steps[currentStep].name || steps[currentStep].title ? (\r\n <FormTitle\r\n id={formTitleId}\r\n title={steps[currentStep].title || steps[currentStep].name}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened(steps[currentStep].helpId || '', locale) || undefined}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n styles={subComponentStyles.formTitle}\r\n intl={props.intl}\r\n noHelpPopup={steps[currentStep].helpId !== undefined ? false : true}\r\n />\r\n ) : null}\r\n\r\n <div role=\"form\" aria-labelledby={formTitleId} className={content}>\r\n {React.cloneElement(steps[currentStep].component, { stepState: state, goToStep: goToStep, ...props })}\r\n {showOverlay && <Overlay />}\r\n </div>\r\n </Main>\r\n <div className={buttons}>\r\n {!steps[currentStep].submitButtonDisabled && (\r\n <PrimaryButton\r\n id=\"primaryButton\"\r\n text={getSubmitLabel(currentStep)}\r\n onClick={() => {\r\n nextStep();\r\n }}\r\n disabled={saving || steps[currentStep].isNextDisabled}\r\n />\r\n )}\r\n\r\n <DefaultButton\r\n id=\"defaultButton\"\r\n text={getCancelLabel(currentStep)}\r\n onClick={previousStep}\r\n disabled={saving}\r\n ariaDescription={formatMessage(messages.backButtonAriaDesc)}\r\n />\r\n\r\n {showExtraBtns && steps[currentStep].extraButtons}\r\n\r\n {saving && <Spinner label={formatMessage(AppMessages.saving)} labelPosition={'right'} />}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <LeavePagePopup onSubmit={() => props.backToBase()} />\r\n </div>\r\n );\r\n});\r\n","import { Property, showErrorToastNotification } from '../../../../../../../@data';\r\nimport { validateSchema } from '../../../../../../../utils';\r\nimport PropertyMessages from '../../../../Property.messages';\r\nimport { onPropertyErrorChanged } from '../../../__data__/mutatorActions';\r\nimport { IPropertyViewModel, tythonPropertyErrorModel } from '../../../__data__/store/schema';\r\nimport { getCreatePropertyStore } from '../../../__data__/store/store';\r\n\r\nexport const isFormValid = async (\r\n properties: Property[],\r\n isEditMode: boolean,\r\n active: IPropertyViewModel = getCreatePropertyStore().active\r\n): Promise<boolean> => {\r\n try {\r\n await validateSchema(tythonPropertyErrorModel(active, isEditMode, properties), active);\r\n onPropertyErrorChanged();\r\n return true;\r\n } catch (e) {\r\n onPropertyErrorChanged(e);\r\n showErrorToastNotification({\r\n textMessageDescriptor: PropertyMessages.propertyFormError,\r\n intlMessageValues: { errorCount: Object.keys(e).length },\r\n });\r\n return false;\r\n }\r\n};\r\n","import { action, orchestrator } from 'satcheljs';\r\n\r\nimport { Log } from '../../../../../../../../../logging/src';\r\nimport {\r\n ApiError,\r\n ClarityType,\r\n NotificationLabel,\r\n NotificationSeverity,\r\n Property,\r\n PropertyApprovalStatus,\r\n getAppStore,\r\n listEntity,\r\n onNavigateBack,\r\n onNotificationCardAdded,\r\n onSavingChanged,\r\n postEntity,\r\n putEntity,\r\n showErrorToastNotification,\r\n showSuccessToastNotification,\r\n} from '../../../../../../../../@data';\r\nimport notificationMessages from '../../../../../../../../NotificationsPanel.Types.messages';\r\nimport { FormState } from '../../../../../../../../components/Form';\r\nimport { StepState } from '../../../../../../../../layout/DetailPageWithStepper/DetailPageWithStepper.types';\r\nimport { RouteName } from '../../../../../../@data';\r\nimport { createReturnUrl } from '../../../../../../@data/services/AdManagementService';\r\nimport { getGridPropertyStore } from '../../../../../Manage/__data__/store/store';\r\nimport PropertyMessages from '../../../../../Property.messages';\r\nimport { onIdChanged, onSettingClarityErrorMessage } from '../../../../__data__/mutatorActions';\r\nimport { getCreatePropertyStore } from '../../../../__data__/store/store';\r\nimport { isFormValid } from '../../utils/validateForm';\r\n\r\nexport const onFormSubmitted = action(\r\n 'onFormSubmitted',\r\n (mode: FormState, routeHistory?, onSubmit?: () => void, stepState?: StepState) => ({\r\n mode,\r\n routeHistory,\r\n onSubmit,\r\n stepState,\r\n })\r\n);\r\n\r\n/**\r\n * 1) Set Loading to true\r\n * 2) Submit API call to Submit Data to Store\r\n * 3) Check errors, if any, send action to notification that error exists\r\n * 4) Clear the form\r\n * 5) Navigate back to property list\r\n */\r\norchestrator(onFormSubmitted, async (msg) => {\r\n const { publisher, userContext } = getAppStore();\r\n const { active, raw } = getCreatePropertyStore();\r\n\r\n if (publisher && raw) {\r\n const body: Property = {\r\n ...raw,\r\n id: active.id,\r\n name: active.name,\r\n approvalStatus: PropertyApprovalStatus.Approved,\r\n approvalStatusComments: '',\r\n associatedAdUnitIds: [],\r\n };\r\n\r\n onSavingChanged(true);\r\n\r\n const properties = getGridPropertyStore().data || (await listEntity([publisher], userContext, Property));\r\n const isEditOperation =\r\n msg.mode === FormState.MultiStepEdit || (msg.mode === FormState.MultiStepCreation && msg.stepState === StepState.Dirty);\r\n\r\n const isValid = await isFormValid(properties, isEditOperation, active);\r\n if (!isValid) {\r\n onSavingChanged(false);\r\n return;\r\n }\r\n\r\n if (publisher.id) {\r\n body.publisherId = publisher.id;\r\n }\r\n\r\n if (active.url) {\r\n body.url = active.url;\r\n }\r\n\r\n if (active.clarity) {\r\n if (active.clarity.clarityType !== ClarityType.None) {\r\n body.clarityType = active.clarity.clarityType;\r\n } else {\r\n body.clarityProjectIdForTython = active.clarity.clarityId;\r\n }\r\n }\r\n\r\n try {\r\n let property: Property | undefined;\r\n\r\n if (isEditOperation) {\r\n property = await putEntity([publisher], body, userContext, Property);\r\n showSuccessToastNotification({\r\n textMessageDescriptor: PropertyMessages.propertyEditSuccess,\r\n intlMessageValues: { entityId: property.id },\r\n });\r\n } else {\r\n property = await postEntity([publisher], Property, body, userContext);\r\n if (property && property.id) {\r\n onIdChanged(property.id);\r\n }\r\n showSuccessToastNotification({\r\n textMessageDescriptor: PropertyMessages.propertyCreateSuccess,\r\n intlMessageValues: { entityId: property.id },\r\n });\r\n if (active.clarity?.clarityType === ClarityType.None) {\r\n showSuccessToastNotification({\r\n textMessageDescriptor: PropertyMessages.clarityRequestSuccess,\r\n });\r\n }\r\n }\r\n\r\n if (msg.mode !== FormState.InPageCreate) {\r\n // return to manage page\r\n const returnUrl = createReturnUrl(RouteName.property, String(publisher.id), undefined, String(property.id), msg.mode);\r\n onNavigateBack(msg.routeHistory, returnUrl);\r\n }\r\n\r\n msg.onSubmit?.();\r\n } catch (e) {\r\n const getClarityErrorMessage = (e: ApiError) => {\r\n if (e.code === 404) {\r\n return 'Clarity project ID does not exist';\r\n } else {\r\n return e.message.split(`description\":\"`)[1].split(`\"`)[0];\r\n }\r\n };\r\n\r\n Log.error(e);\r\n const apiErrorObj = e as ApiError;\r\n if (apiErrorObj.code === 404) {\r\n onSettingClarityErrorMessage(getClarityErrorMessage(apiErrorObj));\r\n } else if (apiErrorObj.code === 500) {\r\n showErrorToastNotification({ textMessageDescriptor: notificationMessages.PropertyEditFailedNotificationContent });\r\n } else {\r\n onSettingClarityErrorMessage(getClarityErrorMessage(apiErrorObj));\r\n }\r\n\r\n onNotificationCardAdded({\r\n // tslint:disable-next-line: no-any\r\n severity: NotificationSeverity.Error,\r\n titleMessageDescriptor: notificationMessages.PropertyEditFailedNotificationTitle,\r\n contentMessageDescriptor: notificationMessages.PropertyEditFailedNotificationContent,\r\n notificationLabel: NotificationLabel.PropertyEditFailedNotification,\r\n });\r\n } finally {\r\n onSavingChanged(false);\r\n }\r\n } else {\r\n showErrorToastNotification({\r\n textMessageDescriptor: PropertyMessages.invalidForm,\r\n intlMessageValues: { formOperation: FormState[msg.mode], entityId: active.id },\r\n });\r\n }\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n adsText: {\r\n id: 'adsText.adsTxt',\r\n defaultMessage: `Ads.txt`,\r\n },\r\n adsTextExplanation: {\r\n id: 'adsText.explanation',\r\n defaultMessage: `As a {appName} publisher, you’re required to declare that {appName} is an authorized seller for your advertising inventory by including your publisher ID in your ads.txt file. Please note that each site you register with {appName} must have an ads.txt file that adheres to these guidelines.`,\r\n },\r\n adsTextObligation: {\r\n id: 'adsText.AdsTextObligation',\r\n defaultMessage:\r\n 'As a {appName} publisher, you’re required to declare that {appName} is an authorized seller by including your publisher ID in your ads.txt file. Each site you register with your {appName} account must have an ads.txt file added to the root directory. The root directory refers to the folder or directory immediately following the top-level domain of your website (e.g., contoso.com/ads.txt).',\r\n },\r\n createAdsTxtStepTitle: {\r\n id: 'adsText.createAdsTxtStepTitle',\r\n defaultMessage: 'Create an ads.txt file',\r\n },\r\n addpubCenterToFileStepTitle: {\r\n id: 'adsText.addpubCenterToFileStepTitle',\r\n defaultMessage: 'Add {appName} to an existing ads.txt file',\r\n },\r\n copyCodeButton: {\r\n id: 'adsText.copyCodeButton',\r\n defaultMessage: 'Copy',\r\n },\r\n stepOne: {\r\n id: 'adsText.stepOne',\r\n defaultMessage: `Step 1`,\r\n },\r\n stepTwo: {\r\n id: 'adsText.stepTwo',\r\n defaultMessage: 'Step 2',\r\n },\r\n stepThree: {\r\n id: 'adsText.stepThree',\r\n defaultMessage: 'Step 3',\r\n },\r\n downloadFilePrefix: {\r\n id: 'adsText.downloadFilePrefix',\r\n defaultMessage: 'Download an ',\r\n },\r\n downloadFile: {\r\n id: 'adsText.downloadFile',\r\n defaultMessage: 'ads.txt file.',\r\n },\r\n addingFileToRootDirectoryStep: {\r\n id: 'adsText.addingFileToRootDirectory',\r\n defaultMessage:\r\n 'Upload your ads.txt file to the root directory of your site. The root directory refers to the folder or directory immediately following the top level domain of your website (e.g. contoso.com/ads.txt).',\r\n },\r\n verifyingFileStep: {\r\n id: 'adsText.verifyingFileStep',\r\n defaultMessage:\r\n 'Check if the content of the file is displayed when you access the ads.txt URL (https://example.com/ads.txt) using a web browser. If you can view the file content in the browser, it’s likely that {appName} will be able to locate it successfully.',\r\n },\r\n addpubCenterToFileStep: {\r\n id: 'adsText.addpubCenterToFileStep',\r\n defaultMessage: 'Find your existing ads.txt and copy paste the following records',\r\n },\r\n});\r\n","import { FontWeights, IStyle, IStyleFunctionOrObject, ITheme, classNamesFunction, getTheme } from '@fluentui/react';\r\nimport { BreakPoints, IPubcenterPalette, IPubcenterSpacing } from '../../../../../../../../../theme';\r\nimport { IFormSectionStyleProps, IFormSectionStyles } from '../../../../../../../../components/Form';\r\nimport { flexWithAlignCenter, flexWithJustifyBetween } from '../../../../../../../../utils/GlobalStyleUtils';\r\n\r\nexport interface IAdsTextStyleProps {\r\n theme: ITheme;\r\n}\r\nexport interface IAdsTextStyles {\r\n container: IStyle;\r\n scriptBox: IStyle;\r\n scriptHolder: IStyle;\r\n stepHeader: IStyle;\r\n subComponentStyles: {\r\n formSection?: IStyleFunctionOrObject<IFormSectionStyleProps, IFormSectionStyles>;\r\n };\r\n fileUploadContainerStyle: IStyle;\r\n fileUploadedStyle: IStyle;\r\n actionContainerStyle: IStyle;\r\n fileUploadLabelStyle: IStyle;\r\n poolImage: IStyle;\r\n}\r\n\r\nexport const getStyles = (props: IAdsTextStyleProps): IAdsTextStyles => {\r\n const theme = getTheme();\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const { ResponsiveMedium } = BreakPoints;\r\n\r\n return {\r\n container: {\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n '& > :first-child': {\r\n flex: '3 1 75%',\r\n },\r\n },\r\n poolImage: {\r\n [ResponsiveMedium]: {\r\n display: 'none',\r\n },\r\n },\r\n subComponentStyles: {\r\n formSection: {\r\n root: {\r\n width: 'inherit',\r\n borderTop: 'none',\r\n borderBottom: 'none',\r\n },\r\n },\r\n },\r\n scriptBox: {\r\n borderColor: palette.neutralLight,\r\n borderStyle: 'solid',\r\n borderWidth: '1px',\r\n padding: spacing.size12,\r\n marginBottom: spacing.size16,\r\n },\r\n scriptHolder: {\r\n display: 'block',\r\n whiteSpace: 'pre-wrap',\r\n wordBreak: 'break-all',\r\n backgroundColor: palette.neutralLighter,\r\n minHeight: spacing.size16,\r\n maxHeight: spacing.size128,\r\n padding: spacing.size12,\r\n marginBottom: spacing.size12,\r\n overflow: 'auto',\r\n color: palette.black,\r\n lineHeight: spacing.size16,\r\n fontSize: theme.fonts.small.fontSize,\r\n },\r\n stepHeader: {\r\n fontWeight: FontWeights.semibold,\r\n display: 'inline-block',\r\n margin: `${spacing.size10} 0px`,\r\n },\r\n fileUploadContainerStyle: {\r\n ...flexWithAlignCenter,\r\n justifyContent: 'center',\r\n flexDirection: 'column',\r\n background: palette.neutralLighterAlt,\r\n border: `1px dashed ${palette.neutralQuaternaryAlt}`,\r\n padding: spacing.size24,\r\n marginBottom: spacing.size2,\r\n borderRadius: spacing.size4,\r\n },\r\n fileUploadedStyle: {\r\n ...flexWithJustifyBetween,\r\n width: '100%',\r\n '& > :first-child': {\r\n ...flexWithAlignCenter,\r\n gap: spacing.size8,\r\n },\r\n },\r\n actionContainerStyle: {\r\n display: 'flex',\r\n gap: spacing.size12,\r\n },\r\n fileUploadLabelStyle: {\r\n color: palette.highContrastPrimary,\r\n cursor: 'pointer',\r\n },\r\n };\r\n};\r\n\r\nexport const getClassNames = classNamesFunction<IAdsTextStyleProps, IAdsTextStyles>();\r\n","import { DefaultButton, Image, Link, getTheme } from '@fluentui/react';\r\nimport React, { useState } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { getAppStore } from '../../../../../../../../@data';\r\nimport AppMessages from '../../../../../../../../App.messages';\r\nimport { FormSection } from '../../../../../../../../components/Form';\r\nimport { APP_NAME_NEW, COPY_BUTTON_TIMEOUT } from '../../../../../../../../constants/AppConstants';\r\nimport { injectIntlWithObserver } from '../../../../../../../../utils';\r\nimport fileIcon from '../../resources/fileIcon.svg';\r\nimport fishpool from '../../resources/fishpool.svg';\r\nimport messages from './messages';\r\nimport { getClassNames, getStyles } from './styles';\r\n\r\nexport interface IAdsTextPageProps extends InjectedIntlProps {}\r\n\r\nexport const AdsTextPage = injectIntlWithObserver(function AdsTextPageComponent(props: IAdsTextPageProps) {\r\n const { formatMessage } = props.intl;\r\n const { publisher } = getAppStore();\r\n const {\r\n container,\r\n scriptBox,\r\n scriptHolder,\r\n stepHeader,\r\n subComponentStyles,\r\n fileUploadContainerStyle,\r\n fileUploadedStyle,\r\n actionContainerStyle,\r\n fileUploadLabelStyle,\r\n poolImage,\r\n } = getClassNames(getStyles, { theme: getTheme() });\r\n const [copyScriptIcon, onCopyScriptIconChanged] = useState('Copy');\r\n\r\n const content = `appnexus.com, 14163, RESELLER \\nmonetizenow.microsoft.com, ${publisher?.id}, DIRECT`;\r\n const file = new Blob([content], { type: 'text/plain' });\r\n\r\n const onCopyScriptClicked = (text: string) => {\r\n navigator.clipboard.writeText(text);\r\n // This change of icon will indicate the user that script copy was successful\r\n onCopyScriptIconChanged('Accept');\r\n // After 3000ms we change the icon back to 'Copy'\r\n setTimeout(() => onCopyScriptIconChanged('Copy'), COPY_BUTTON_TIMEOUT);\r\n };\r\n\r\n return (\r\n <div className={container}>\r\n <div>\r\n <p>{formatMessage(messages.adsTextExplanation, { appName: APP_NAME_NEW })}</p>\r\n <FormSection styles={subComponentStyles.formSection} title={formatMessage(messages.createAdsTxtStepTitle)}>\r\n <label className={stepHeader}>{formatMessage(messages.stepOne)}</label>\r\n <div className={fileUploadContainerStyle}>\r\n <div className={fileUploadedStyle}>\r\n <div>\r\n <Image src={fileIcon} alt={formatMessage(messages.adsText)} />\r\n {formatMessage(messages.adsText)}\r\n </div>\r\n <div className={actionContainerStyle}>\r\n <label className={fileUploadLabelStyle} tabIndex={0}>\r\n <Link href={URL?.createObjectURL?.(file)} download=\"ads.txt\">\r\n {formatMessage(AppMessages.download)}\r\n </Link>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <label className={stepHeader}>{formatMessage(messages.stepTwo)}</label>\r\n <p>{formatMessage(messages.addingFileToRootDirectoryStep)}</p>\r\n <label className={stepHeader}>{formatMessage(messages.stepThree)}</label>\r\n <p>{formatMessage(messages.verifyingFileStep, { appName: APP_NAME_NEW })}</p>\r\n </FormSection>\r\n <FormSection\r\n styles={subComponentStyles.formSection}\r\n title={formatMessage(messages.addpubCenterToFileStepTitle, { appName: APP_NAME_NEW })}\r\n >\r\n <label className={stepHeader}>{formatMessage(messages.stepOne)}</label>\r\n <p>{formatMessage(messages.addpubCenterToFileStep)}</p>\r\n <div className={scriptBox}>\r\n <code className={scriptHolder}>\r\n <span>{content}</span>\r\n </code>\r\n <DefaultButton\r\n text={formatMessage(messages.copyCodeButton)}\r\n iconProps={{ iconName: copyScriptIcon }}\r\n onClick={() => onCopyScriptClicked(content)}\r\n />\r\n </div>\r\n <label className={stepHeader}>{formatMessage(messages.stepTwo)}</label>\r\n <p>{formatMessage(messages.addingFileToRootDirectoryStep)}</p>\r\n </FormSection>\r\n </div>\r\n <Image className={poolImage} src={fishpool} imageFit={1} alt={formatMessage(messages.adsText)} />\r\n </div>\r\n );\r\n});\r\n","import { action, orchestrator } from 'satcheljs';\r\n\r\nimport {\r\n ClarityStatus,\r\n ClarityType,\r\n Publisher,\r\n getAppStore,\r\n listEntity,\r\n onLoadingChanged,\r\n showErrorToastNotification,\r\n} from '../../../../../../../../@data';\r\nimport { PropertyServingConfigs } from '../../../../../../../../@data/store/schema/models/ServingConfigs';\r\nimport { FormState } from '../../../../../../../../components/Form';\r\nimport { fetchPropertyById } from '../../../../../@data/services/PropertyService';\r\nimport PropertyMessages from '../../../../../Property.messages';\r\nimport { onPropertyChanged, onPropertyErrorChanged, onRawChanged } from '../../../../__data__/mutatorActions';\r\nimport { IPropertyViewModel } from '../../../../__data__/store/schema';\r\n\r\nexport const onFormInitialized = action(\r\n 'onFormInitialized',\r\n (mode: FormState, publisherId: string, accountId?: string, entityId?: string) => ({\r\n mode,\r\n publisherId,\r\n accountId,\r\n entityId,\r\n })\r\n);\r\n\r\norchestrator(onFormInitialized, async (msg) => {\r\n const { userContext } = getAppStore();\r\n\r\n const property: IPropertyViewModel = {};\r\n property.clarity = {};\r\n\r\n const publisherId = parseInt(msg.publisherId, 10);\r\n if (!isNaN(publisherId)) {\r\n const publisher = new Publisher(publisherId);\r\n try {\r\n onPropertyErrorChanged();\r\n onLoadingChanged(true);\r\n\r\n if (\r\n (msg.mode === FormState.Edit || msg.mode === FormState.MultiStepEdit || msg.mode === FormState.MultiStepCreation) &&\r\n msg.entityId\r\n ) {\r\n const rawProperty = await fetchPropertyById(publisher, msg.entityId, userContext);\r\n property.id = rawProperty.id;\r\n property.name = String(rawProperty.name);\r\n property.url = rawProperty.url;\r\n property.approvalStatus = rawProperty.approvalStatus;\r\n\r\n const propertyConfigs = await listEntity([publisher], userContext, PropertyServingConfigs);\r\n propertyConfigs?.forEach((p) => {\r\n if (p.propertyId.toString() === msg.entityId && p.clarityConfig?.clarityId) {\r\n if (p.clarityConfig?.clarityType && ClarityType[p.clarityConfig?.clarityType] !== ClarityType.None) {\r\n const type: ClarityType = ClarityType[p.clarityConfig?.clarityType];\r\n property.clarity = {\r\n originalClarityType: type,\r\n clarityType: type,\r\n approvalBehavioralOption: type === ClarityType.Behavioral,\r\n clarityStatus: p.clarityConfig.clarityStatus ? ClarityStatus[p.clarityConfig.clarityStatus] : ClarityStatus.NotConnected,\r\n };\r\n } else {\r\n property.clarity = {\r\n originalClarityType: ClarityType.None,\r\n clarityType: ClarityType.None,\r\n clarityStatus: p.clarityConfig.clarityStatus ? ClarityStatus[p.clarityConfig.clarityStatus] : ClarityStatus.NotConnected,\r\n clarityId: p.clarityConfig.clarityId,\r\n originalClarityId: p.clarityConfig.clarityId,\r\n approvalBehavioralOption: false,\r\n };\r\n }\r\n }\r\n });\r\n\r\n onRawChanged(rawProperty);\r\n } else {\r\n onRawChanged();\r\n }\r\n onPropertyChanged(property);\r\n onLoadingChanged(false);\r\n } catch (e) {\r\n showErrorToastNotification({ textMessageDescriptor: PropertyMessages.propertyLoadError });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n showErrorToastNotification({ textMessageDescriptor: PropertyMessages.invalidState });\r\n }\r\n});\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { ClarityType } from '../../../../../../../../@data';\r\nimport { getCreatePropertyStore } from '../../../../__data__/store/store';\r\n\r\nexport const onClarityTypeChanged = mutatorAction('onClarityTypeChanged', (type?: ClarityType) => {\r\n const clarity = getCreatePropertyStore().active.clarity;\r\n if (clarity !== undefined) {\r\n if (type !== ClarityType.Behavioral && clarity.originalClarityType !== ClarityType.Behavioral) {\r\n clarity.approvalBehavioralOption = false;\r\n }\r\n if (type !== ClarityType.None) {\r\n // If option changed from existing to other, clear the clarity id to not send it and confuse the API\r\n clarity.clarityId = '';\r\n }\r\n clarity.clarityType = type;\r\n }\r\n});\r\n\r\nexport const onApprovalBehavioralTC = mutatorAction('onApprovalBehavioralTC', (isApproved: boolean) => {\r\n const clarity = getCreatePropertyStore().active.clarity;\r\n if (clarity !== undefined) {\r\n clarity.approvalBehavioralOption = isApproved;\r\n }\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n microsoftClarity: {\r\n id: 'clarity.microsoftClarity',\r\n defaultMessage: 'Microsoft Clarity',\r\n },\r\n microsoftClarityTC: {\r\n id: 'clarity.microsoftClarityTC',\r\n defaultMessage: 'I’ve reviewed the {privacy} and agree to grant Microsoft permission to collect and use this data.',\r\n },\r\n microsoftClarityPrivacy: {\r\n id: 'clarity.microsoftClarityPrivacy',\r\n defaultMessage: 'privacy statement',\r\n },\r\n microsoftClarityInformation: {\r\n id: 'clarity.microsoftClarityTermsOfUse',\r\n defaultMessage:\r\n 'Microsoft Clarity can help provide insights into your site’s performance and better protect you from fraudulent activity. ',\r\n },\r\n microsoftClarityTermsOfUse: {\r\n id: 'clarity.microsoftClarityTermsOfUse',\r\n defaultMessage: 'Learn more about Clarity.',\r\n },\r\n advancedOptionHeader: {\r\n id: 'clarity.advancedOptionHeader',\r\n defaultMessage: 'Clarity – Advanced insights & behavioral analytics',\r\n },\r\n advancedOptionDesc: {\r\n id: 'clarity.advancedOptionDesc',\r\n defaultMessage:\r\n 'Clarity - Advanced insights and behavioral analytics provides behavior-focused insights into how people interact with your website. With instant heat maps and session recordings, you can identify the most engaging sections on your sites and measure visitor scrolling behavior that can turn site analytics into opportunities.',\r\n },\r\n advancedOptionApproval: {\r\n id: 'clarity.advancedOptionApproval',\r\n defaultMessage: 'Clarity Advanced privacy statement approval ',\r\n },\r\n basicOptionHeader: {\r\n id: 'clarity.basicOptionHeader',\r\n defaultMessage: 'Clarity – Basic Insights',\r\n },\r\n basicOptionDesc: {\r\n id: 'clarity.basicOptionDesc',\r\n defaultMessage:\r\n 'Clarity - Basic Insights provides fraud detection and leverages data collected from your website to identify and mitigate potential threats to your account.',\r\n },\r\n existingClarityOptionHeader: {\r\n id: 'clarity.existingClarityOptionHeader',\r\n defaultMessage: 'I have an existing Clarity project',\r\n },\r\n existingClarityOptionDesc: {\r\n id: 'clarity.existingClarityOptionDesc',\r\n defaultMessage: `You can find it in the project URL from the browser. {br}\r\n Example: https://clarity.microsoft.com/projects/view/â€projectidâ€/ {br}\r\n Project linking can be completed once the admin of Clarity project approves this linking by clicking on “Approve†from their email.`,\r\n },\r\n advantageOneHeader: {\r\n id: 'clarity.advantageOneHeader',\r\n defaultMessage: 'Powerful insights',\r\n },\r\n advantageOneDesc: {\r\n id: 'clarity.advantageOneDesc',\r\n defaultMessage: 'Quickly discover where users get frustrated and turn these problems into opportunities.',\r\n },\r\n advantageTwoHeader: {\r\n id: 'clarity.advantageTwoHeader',\r\n defaultMessage: 'Instant heatmaps',\r\n },\r\n advantageTwoDesc: {\r\n id: 'clarity.advantageTwoDesc',\r\n defaultMessage:\r\n 'Quickly view which areas on your page drive the most engagement and how far your visitors scroll with Clarity instant heatmaps.',\r\n },\r\n advantageThreeHeader: {\r\n id: 'clarity.advantageThreeHeader',\r\n defaultMessage: 'Session recordings',\r\n },\r\n advantageThreeDesc: {\r\n id: 'clarity.advantageThreeDesc',\r\n defaultMessage: `Go beyond the numbers. View what's working on your site, learn what needs to be fixed, and test new ideas`,\r\n },\r\n recommendationTag: {\r\n id: 'clarity.recommendationTag',\r\n defaultMessage: 'RECOMMENDED',\r\n },\r\n sidePanelPending: {\r\n id: 'property.sidePanelPending',\r\n defaultMessage: 'Pending Approval. Click continue to resubmit the request.',\r\n },\r\n sidePanelDeclined: {\r\n id: 'property.sidePanelDeclined',\r\n defaultMessage: 'Request was declined. Click continue to resubmit the request.',\r\n },\r\n sidePanelExpired: {\r\n id: 'property.sidePanelExpired',\r\n defaultMessage: 'Request was expired. Click continue to resubmit the request.',\r\n },\r\n sidePanelCancelled: {\r\n id: 'property.sidePanelCancelled',\r\n defaultMessage: 'Request was cancelled. Click continue to resubmit the request.',\r\n },\r\n clarityId: {\r\n id: 'property.clarityId',\r\n defaultMessage: 'Clarity Project id',\r\n },\r\n});\r\n","import { FontWeights, IStyle, ITheme, classNamesFunction, getTheme } from '@fluentui/react';\r\nimport { BreakPoints, IPubCenterFonts, IPubcenterPalette, IPubcenterSpacing } from '../../../../../../../../../../../theme';\r\n\r\nexport interface IClarityOptionsStyleProps {\r\n theme: ITheme;\r\n}\r\nexport interface IClarityOptionsStyle {\r\n wrapper: IStyle;\r\n wrapperTitle: IStyle;\r\n section: IStyle;\r\n sectionDetails: IStyle;\r\n disabledSection: IStyle;\r\n sectionSelector: IStyle;\r\n title: IStyle;\r\n desc: IStyle;\r\n advantageWrapper: IStyle;\r\n advantageSection: IStyle;\r\n toggle: IStyle;\r\n imageWrapper: IStyle;\r\n recommendationTag: IStyle;\r\n advantageHeader: IStyle;\r\n panelPending: IStyle;\r\n panelProjectIdApprovedSection: IStyle;\r\n errorMessage: IStyle;\r\n}\r\n\r\nexport const getStyles = (props: IClarityOptionsStyleProps): IClarityOptionsStyle => {\r\n const theme = getTheme();\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const fonts = theme.fonts as IPubCenterFonts;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const { ResponsiveSmall, ResponsiveMedium } = BreakPoints;\r\n\r\n return {\r\n wrapper: {\r\n display: 'flex',\r\n gap: spacing.size16,\r\n marginTop: spacing.size24,\r\n flexDirection: 'column',\r\n position: 'relative',\r\n transition: 'all 0.3s ease - in -out',\r\n },\r\n wrapperTitle: {\r\n fontWeight: FontWeights.semibold,\r\n selectors: {\r\n '::after': {\r\n marginLeft: spacing.size6,\r\n content: \"'*'\",\r\n color: 'red',\r\n },\r\n },\r\n },\r\n section: {\r\n display: 'grid',\r\n gridTemplateColumns: 'auto 10fr',\r\n gap: spacing.size6,\r\n border: `1px solid ${palette.neutralLight}`,\r\n position: 'relative',\r\n [ResponsiveMedium]: {\r\n gridTemplateColumns: '1fr',\r\n },\r\n [ResponsiveSmall]: {\r\n gridTemplateColumns: '1fr',\r\n },\r\n },\r\n sectionDetails: {\r\n padding: `${spacing.size24} ${spacing.size16}`,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'space-between',\r\n },\r\n disabledSection: {\r\n background: 'rgb(243, 242, 241, 0.4)',\r\n position: 'absolute',\r\n width: '100%',\r\n height: '100%',\r\n zIndex: '999',\r\n cursor: 'not-allowed',\r\n },\r\n sectionSelector: {\r\n position: 'absolute',\r\n zIndex: '998',\r\n left: spacing.size16,\r\n },\r\n title: {\r\n ...fonts.size18,\r\n fontWeight: FontWeights.semibold,\r\n marginBlockStart: '0.5em',\r\n marginBlockEnd: '0.25em',\r\n },\r\n desc: {\r\n ...fonts.size14,\r\n color: palette.disabledGray,\r\n overflowWrap: 'anywhere',\r\n },\r\n advantageWrapper: {\r\n display: 'grid',\r\n gridTemplateColumns: '1fr 1fr 1fr',\r\n gap: spacing.size8,\r\n marginTop: spacing.size16,\r\n [ResponsiveSmall]: {\r\n gridTemplateColumns: '1fr',\r\n },\r\n },\r\n advantageHeader: {\r\n display: 'flex',\r\n alignItems: 'baseline',\r\n gap: spacing.size8,\r\n [ResponsiveSmall]: {\r\n gap: 0,\r\n flexDirection: 'column',\r\n '& :nth-child(2)': {\r\n marginBlockStart: '0',\r\n marginBlockEnd: '0.75em',\r\n },\r\n },\r\n },\r\n advantageSection: {\r\n backgroundColor: palette.neutralLighter,\r\n width: 'fit-content',\r\n padding: spacing.size8,\r\n display: 'flex',\r\n gap: spacing.size8,\r\n '& :nth-child(2)': {\r\n '& :first-child': {\r\n fontWeight: FontWeights.semibold,\r\n marginBlockStart: '0',\r\n marginBlockEnd: '0.25em',\r\n },\r\n },\r\n },\r\n toggle: {\r\n marginTop: spacing.size8,\r\n },\r\n imageWrapper: {\r\n width: '260px',\r\n backgroundColor: '#F5F8FA',\r\n cursor: 'pointer',\r\n [ResponsiveMedium]: {\r\n width: '100%',\r\n height: '180px',\r\n },\r\n [ResponsiveSmall]: {\r\n width: '100%',\r\n height: '180px',\r\n },\r\n },\r\n recommendationTag: {\r\n backgroundColor: palette.success,\r\n color: palette.green,\r\n width: 'fit-content',\r\n borderRadius: spacing.size4,\r\n padding: spacing.size6,\r\n },\r\n panelPending: {\r\n display: 'flex',\r\n gap: spacing.size6,\r\n alignItems: 'center',\r\n backgroundColor: palette.messageBarError,\r\n margin: `${spacing.size12} 0 ${spacing.size12} 0`,\r\n padding: `${spacing.size12} ${spacing.size12}`,\r\n },\r\n panelProjectIdApprovedSection: {\r\n display: 'flex',\r\n gap: spacing.size8,\r\n alignItems: 'center',\r\n margin: `${spacing.size8} 0 ${spacing.size4} 0`,\r\n },\r\n errorMessage: {\r\n fontSize: fonts.size12.fontSize,\r\n color: 'rgb(164, 38, 44)',\r\n },\r\n };\r\n};\r\n\r\nexport const getClassNames = classNamesFunction<IClarityOptionsStyleProps, IClarityOptionsStyle>();\r\n","import { Checkbox, ChoiceGroup, Icon, IconButton, Image, Link, TextField, getTheme } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { FormattedMessage, InjectedIntlProps } from 'react-intl';\r\nimport { ClarityStatus, ClarityType } from '../../../../../../../../../../@data';\r\nimport AppMessages from '../../../../../../../../../../App.messages';\r\nimport { CLARITY_HOME_WEB_APP, CLARITY_PRIVACY_STATEMENT, CLARITY_WEB_APP } from '../../../../../../../../../../constants/AppConstants';\r\nimport {\r\n CLARITY_BASIC_RADIO_BUTTON,\r\n CLARITY_BEHAVIORAL_RADIO_BUTTON,\r\n CLARITY_EXISTING_RADIO_BUTTON,\r\n} from '../../../../../../../../../../constants/DataTestIdConstants';\r\nimport { useWindowSize } from '../../../../../../../../../../hooks';\r\nimport { getStore as getWindowStore } from '../../../../../../../../../../hooks/useWindowSize/store/store';\r\nimport { StepState } from '../../../../../../../../../../layout/DetailPageWithStepper/DetailPageWithStepper.types';\r\nimport { IRouterWithIntl, injectIntlAndObserver } from '../../../../../../../../../../utils';\r\nimport { onClarityIdChanged, onEditClarityId } from '../../../../../../__data__/mutatorActions';\r\nimport { getCreatePropertyStore } from '../../../../../../__data__/store/store';\r\nimport { onApprovalBehavioralTC, onClarityTypeChanged } from '../../../../__data__/mutatorActions';\r\nimport messages from './messages';\r\nimport codeFree from './resources/codeFree.svg';\r\nimport existingClarity from './resources/existingClarity.svg';\r\nimport richBehavior from './resources/richBehavior.svg';\r\nimport { getClassNames, getStyles } from './styles';\r\nexport interface IClarityOptionsProps extends IRouterWithIntl {\r\n stepState?: StepState;\r\n}\r\n\r\nconst { windowStoreSerializer } = useWindowSize();\r\n\r\nexport const ClarityOptions = injectIntlAndObserver<InjectedIntlProps & IClarityOptionsProps>((props: IClarityOptionsProps) => {\r\n const { intl } = props;\r\n const { formatMessage } = intl;\r\n const {\r\n active: { clarity },\r\n } = getCreatePropertyStore();\r\n const {\r\n clarityType,\r\n approvalBehavioralOption,\r\n clarityId,\r\n clarityEdit,\r\n originalClarityType,\r\n originalClarityId,\r\n clarityStatus,\r\n clarityErrorMessage,\r\n } = clarity || {};\r\n const chosenType = clarityType !== undefined ? clarityType.toString() : '';\r\n const isChosen = approvalBehavioralOption || false;\r\n\r\n const {\r\n wrapper,\r\n wrapperTitle,\r\n section,\r\n sectionDetails,\r\n disabledSection,\r\n sectionSelector,\r\n title,\r\n desc,\r\n toggle,\r\n advantageWrapper,\r\n advantageSection,\r\n imageWrapper,\r\n recommendationTag,\r\n advantageHeader,\r\n panelPending,\r\n panelProjectIdApprovedSection,\r\n errorMessage,\r\n } = getClassNames(getStyles, {\r\n theme: getTheme(),\r\n });\r\n const checkMark = <span>✓</span>;\r\n const { isWindowRegularSize } = windowStoreSerializer(getWindowStore());\r\n\r\n const getAdvantage = (header: string, description: string) => {\r\n return (\r\n <div className={advantageSection}>\r\n {checkMark}\r\n <div>\r\n <p>{header}</p>\r\n <span>{description}</span>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const getChoiceImage = (imgSrc: string, imgAlt: FormattedMessage.MessageDescriptor, onClick: (e) => void) => {\r\n return isWindowRegularSize ? (\r\n <Image className={imageWrapper} onClick={onClick} src={imgSrc} imageFit={1} alt={formatMessage(imgAlt)} />\r\n ) : (\r\n <div />\r\n );\r\n };\r\n\r\n const getInformationMessage = (status?: ClarityStatus) => {\r\n switch (status) {\r\n case ClarityStatus.Pending:\r\n return messages.sidePanelPending;\r\n case ClarityStatus.Declined:\r\n return messages.sidePanelDeclined;\r\n case ClarityStatus.Expired:\r\n return messages.sidePanelExpired;\r\n case ClarityStatus.Cancelled:\r\n return messages.sidePanelCancelled;\r\n default:\r\n return messages.sidePanelPending;\r\n }\r\n };\r\n\r\n const onOptionClick = (e, value) => {\r\n if (props.stepState === StepState.Dirty && clarityType === value) {\r\n return;\r\n }\r\n if (clarityType === value) {\r\n onClarityTypeChanged(undefined);\r\n } else {\r\n onClarityTypeChanged(value);\r\n }\r\n\r\n e.preventDefault();\r\n };\r\n\r\n return (\r\n <div className={wrapper}>\r\n <span className={wrapperTitle} title={formatMessage(AppMessages.required)}>\r\n {formatMessage(messages.microsoftClarity)}\r\n </span>\r\n <span>\r\n {formatMessage(messages.microsoftClarityInformation)}\r\n <Link href={CLARITY_HOME_WEB_APP} target=\"_blank\" rel=\"noreferrer noopener\" underline>\r\n {formatMessage(messages.microsoftClarityTermsOfUse)}\r\n </Link>\r\n </span>\r\n <div className={section}>\r\n {(originalClarityType === ClarityType.None || originalClarityType === ClarityType.Fraud) && <div className={disabledSection} />}\r\n\r\n <ChoiceGroup\r\n ariaLabelledBy={formatMessage(messages.advancedOptionHeader)}\r\n selectedKey={chosenType}\r\n className={sectionSelector}\r\n options={[\r\n {\r\n key: '1',\r\n text: '',\r\n ariaLabel: formatMessage(messages.advancedOptionHeader),\r\n onClick: (e) => onOptionClick(e, ClarityType.Behavioral),\r\n onKeyDown: (e) => e.key === 'Enter' && onOptionClick(e, ClarityType.Behavioral),\r\n },\r\n ]}\r\n disabled={originalClarityType === ClarityType.None || originalClarityType === ClarityType.Fraud}\r\n data-test-id={CLARITY_BEHAVIORAL_RADIO_BUTTON}\r\n />\r\n\r\n {getChoiceImage(\r\n richBehavior,\r\n messages.advancedOptionHeader,\r\n (e) => originalClarityType !== ClarityType.None && onOptionClick(e, ClarityType.Behavioral)\r\n )}\r\n <div className={sectionDetails}>\r\n <div>\r\n <div className={advantageHeader}>\r\n <p className={title}>{formatMessage(messages.advancedOptionHeader)}</p>\r\n <p className={recommendationTag}>{formatMessage(messages.recommendationTag)}</p>\r\n </div>\r\n <span className={desc}>{formatMessage(messages.advancedOptionDesc)}</span>\r\n </div>\r\n <div className={advantageWrapper}>\r\n {getAdvantage(formatMessage(messages.advantageOneHeader), formatMessage(messages.advantageOneDesc))}\r\n {getAdvantage(formatMessage(messages.advantageTwoHeader), formatMessage(messages.advantageTwoDesc))}\r\n {getAdvantage(formatMessage(messages.advantageThreeHeader), formatMessage(messages.advantageThreeDesc))}\r\n </div>\r\n {chosenType === ClarityType.Behavioral.toString() && (\r\n <Checkbox\r\n checked={isChosen}\r\n className={toggle}\r\n onChange={(_, state) => onApprovalBehavioralTC(state || false)}\r\n title={formatMessage(messages.advancedOptionApproval)}\r\n aria-hidden={true}\r\n disabled={originalClarityType === ClarityType.Behavioral}\r\n onRenderLabel={() => (\r\n <FormattedMessage\r\n {...messages.microsoftClarityTC}\r\n values={{\r\n privacy: (\r\n <Link href={CLARITY_PRIVACY_STATEMENT} target=\"_blank\" rel=\"noreferrer noopener\" underline>\r\n {formatMessage(messages.microsoftClarityPrivacy)}\r\n </Link>\r\n ),\r\n }}\r\n />\r\n )}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n <div className={section}>\r\n {(originalClarityType === ClarityType.None || originalClarityType === ClarityType.Behavioral) && (\r\n <div className={disabledSection} />\r\n )}\r\n\r\n <ChoiceGroup\r\n ariaLabelledBy={formatMessage(messages.basicOptionHeader)}\r\n selectedKey={chosenType}\r\n className={sectionSelector}\r\n options={[{ key: '0', text: '', ariaLabel: formatMessage(messages.basicOptionHeader) }]}\r\n onClick={(e) => onOptionClick(e, ClarityType.Fraud)}\r\n onKeyDown={(e) => e.key === 'Enter' && onOptionClick(e, ClarityType.Fraud)}\r\n disabled={originalClarityType === ClarityType.Behavioral || originalClarityType === ClarityType.None}\r\n data-test-id={CLARITY_BASIC_RADIO_BUTTON}\r\n />\r\n {getChoiceImage(\r\n codeFree,\r\n messages.basicOptionHeader,\r\n (e) =>\r\n originalClarityType !== ClarityType.Behavioral &&\r\n originalClarityType !== ClarityType.None &&\r\n onOptionClick(e, ClarityType.Fraud)\r\n )}\r\n <div className={sectionDetails}>\r\n <div>\r\n <p className={title}>{formatMessage(messages.basicOptionHeader)}</p>\r\n <span className={desc}>{formatMessage(messages.basicOptionDesc)}</span>\r\n </div>\r\n <div className={advantageWrapper}>\r\n {getAdvantage(formatMessage(messages.advantageOneHeader), formatMessage(messages.advantageOneDesc))}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className={section}>\r\n <ChoiceGroup\r\n ariaLabelledBy={formatMessage(messages.existingClarityOptionHeader)}\r\n selectedKey={chosenType}\r\n className={sectionSelector}\r\n options={[{ key: '2', text: '', ariaLabel: formatMessage(messages.existingClarityOptionHeader) }]}\r\n onClick={(e) => onOptionClick(e, ClarityType.None)}\r\n onKeyDown={(e) => e.key === 'Enter' && onOptionClick(e, ClarityType.None)}\r\n data-test-id={CLARITY_EXISTING_RADIO_BUTTON}\r\n />\r\n {getChoiceImage(existingClarity, messages.existingClarityOptionHeader, (e) => onOptionClick(e, ClarityType.None))}\r\n <div className={sectionDetails}>\r\n <div>\r\n <p className={title}>{formatMessage(messages.existingClarityOptionHeader)}</p>\r\n <span className={desc}>\r\n <FormattedMessage {...messages.existingClarityOptionDesc} values={{ br: <br /> }} />\r\n </span>\r\n </div>\r\n <div>\r\n {originalClarityId === undefined || clarityEdit ? (\r\n <div className={panelProjectIdApprovedSection}>\r\n <TextField\r\n iconProps={{\r\n iconName: clarityEdit ? 'Cancel' : '',\r\n style: {\r\n pointerEvents: 'auto',\r\n cursor: 'pointer',\r\n },\r\n onClick: (e) => {\r\n onEditClarityId(!clarityEdit);\r\n if (originalClarityId) {\r\n onClarityIdChanged(originalClarityId);\r\n }\r\n },\r\n }}\r\n ariaLabel={formatMessage(messages.clarityId)}\r\n disabled={chosenType !== ClarityType.None.toString()}\r\n errorMessage={clarityErrorMessage}\r\n value={clarityId}\r\n onClick={(e) => e.stopPropagation()}\r\n onChange={(_, value: string) => onClarityIdChanged(value)}\r\n />\r\n </div>\r\n ) : (\r\n <>\r\n <div className={panelProjectIdApprovedSection}>\r\n {clarityStatus === ClarityStatus.Approved ? (\r\n <Link href={CLARITY_WEB_APP.replace('{id}', originalClarityId)} target=\"_blank\" rel=\"noreferrer noopener\">\r\n {originalClarityId}\r\n </Link>\r\n ) : (\r\n <>\r\n <span>{originalClarityId}</span>\r\n </>\r\n )}\r\n <IconButton iconProps={{ iconName: 'Edit' }} onClick={() => onEditClarityId(!clarityEdit)} />\r\n </div>\r\n {clarityErrorMessage !== undefined && <span className={errorMessage}>{clarityErrorMessage}</span>}\r\n </>\r\n )}\r\n {clarityStatus !== ClarityStatus.Approved && !!originalClarityId && (\r\n <div className={panelPending}>\r\n <Icon iconName={'Info'} aria-label={formatMessage(AppMessages.infoLabel)} />\r\n {formatMessage(getInformationMessage(clarityStatus))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n});\r\n","import * as React from 'react';\r\nimport { useEffect, useState } from 'react';\r\nimport { IFormEditParams, IFormStateProps } from '../../../../../../../../components/Form';\r\nimport { StepState } from '../../../../../../../../layout/DetailPageWithStepper/DetailPageWithStepper.types';\r\nimport { IRouterWithIntl, injectIntlWithObserver } from '../../../../../../../../utils/ReactUtils';\r\nimport { getCreatePropertyStore } from '../../../../__data__/store/store';\r\nimport PropertyIdField from '../../../../components/PropertyIdField';\r\nimport PropertyNameInputField from '../../../../components/PropertyNameInputField';\r\nimport PropertyUrlInputField from '../../../../components/PropertyUrlInputField';\r\nimport { onFormInitialized } from '../../__data__/orchestrators';\r\nimport { ClarityOptions } from './components/ClarityOptions';\r\n\r\nexport interface IFormInitializationState {\r\n initializeForm?: boolean;\r\n id?: string;\r\n}\r\n\r\nexport interface ICreatePropertyProps extends IRouterWithIntl<IFormEditParams>, IFormStateProps {\r\n stepState?: StepState;\r\n}\r\n\r\nexport const CreateProperty = injectIntlWithObserver<ICreatePropertyProps & IFormInitializationState>((props) => {\r\n const { match, mode, stepState } = props;\r\n const { publisherId, accountId, id: entityId } = match.params;\r\n const { active } = getCreatePropertyStore();\r\n const [activePropertyId, setActivePropertyId] = useState(entityId);\r\n\r\n useEffect(() => {\r\n if (activePropertyId === entityId || publisherId === undefined) {\r\n return;\r\n }\r\n setActivePropertyId(entityId);\r\n onFormInitialized(mode, publisherId, accountId, entityId);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [entityId]);\r\n\r\n useEffect(() => {\r\n if (publisherId === undefined) {\r\n return;\r\n }\r\n onFormInitialized(mode, publisherId, accountId, entityId);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <>\r\n <PropertyNameInputField mode={mode} />\r\n <PropertyIdField id={active.id} />\r\n <PropertyUrlInputField mode={mode} stepState={stepState} />\r\n <ClarityOptions {...props} stepState={stepState} />\r\n </>\r\n );\r\n});\r\n","import { History } from 'history';\r\nimport { action } from 'satcheljs';\r\nimport { FormState } from '../../../../../../../../../../components/Form';\r\n\r\nexport const onScriptPageInitialized = action('onScriptPageInitialized', (publisherId: string, propertyId: string) => ({\r\n publisherId,\r\n propertyId,\r\n}));\r\n\r\nexport const onScriptPageSubmitted = action('onScriptPageSubmitted', (mode: FormState, routeHistory: History, onSubmit?: () => void) => ({\r\n mode,\r\n routeHistory,\r\n onSubmit,\r\n}));\r\n\r\nexport const onFormCleared = action('onFormCleared');\r\n\r\nexport const onClarityProjectChanged = action('onClarityProjectChanged', (id: string) => ({ id }));\r\n\r\nexport const onCopyScriptIconChanged = action('onCopyScriptIconChanged', (iconName: string) => ({ iconName }));\r\n","import { createStore } from 'satcheljs';\r\nexport interface IScriptPageState {\r\n copyScriptIcon: string;\r\n clarityProjectId: string;\r\n}\r\n\r\nexport const getPropertyScriptPageStore = createStore<IScriptPageState>('PropertyScriptPageState', {\r\n copyScriptIcon: 'Copy',\r\n clarityProjectId: '',\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { onClarityProjectChanged, onCopyScriptIconChanged, onFormCleared } from '../actions/onScriptPageActions';\r\nimport { getPropertyScriptPageStore } from '../store/store';\r\n\r\nmutator(onCopyScriptIconChanged, (msg) => {\r\n getPropertyScriptPageStore().copyScriptIcon = msg.iconName;\r\n});\r\n\r\nmutator(onFormCleared, () => {\r\n getPropertyScriptPageStore().clarityProjectId = '';\r\n});\r\n\r\nmutator(onClarityProjectChanged, (msg) => {\r\n getPropertyScriptPageStore().clarityProjectId = msg.id;\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n title: {\r\n id: 'scriptPage.title',\r\n defaultMessage: 'Finish creating your site by placing the code in your header tag.',\r\n },\r\n tips: {\r\n id: 'scriptPage.tips',\r\n defaultMessage: `Make sure that you insert the ad inside your feed. You can choose to place it in your feed's content or at the beginning or end of your feed. Avoid placing the ad in the sidebar, as it may negatively impact performance. The container you use to place your ad should have a variable height, as fixed height containers may cause the ad to appear distorted.`,\r\n },\r\n subTitle: {\r\n id: 'scriptPage.subTitle',\r\n defaultMessage: 'Load the following script in your header tag',\r\n },\r\n copyCodeButton: {\r\n id: 'scriptPage.copyCodeButton',\r\n defaultMessage: 'Copy code snippet',\r\n },\r\n microsoftClarity: {\r\n id: 'scriptPage.microsoftClarity',\r\n defaultMessage: 'Microsoft Clarity',\r\n },\r\n microsoftConnectedClarity: {\r\n id: 'scriptPage.microsoftConnectedClarity',\r\n defaultMessage: 'Your Clarity project ID is: {projectId}. To get the analytical data please visit ',\r\n },\r\n microsoftClarityConnectedAccountNotice: {\r\n id: 'scriptPage.microsoftClarityConnectedAccountNotice',\r\n defaultMessage: 'Note: Please use same MSA account to log in.',\r\n },\r\n microsoftClarityEmailSentNotice: {\r\n id: 'scriptPage.microsoftClarityEmailSentNotice',\r\n defaultMessage: 'Email sent, please go check and approve the connection of the Clarity project.',\r\n },\r\n scriptPageInvalidState: {\r\n id: 'scriptPage.scriptPageInvalidState',\r\n defaultMessage: 'You have arrived in an invalid state, please report.',\r\n },\r\n scriptPageFailedToLoadClarityProject: {\r\n id: 'scriptPage.scriptPageFailedToLoadClarityProject',\r\n defaultMessage: 'Failed to fetch clarity project',\r\n },\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { getAppStore, listEntity, onLoadingChanged, onNotificationChanged, Publisher } from '../../../../../../../../../../@data';\r\nimport { PropertyServingConfigs } from '../../../../../../../../../../@data/store/schema/models/ServingConfigs';\r\nimport messages from '../../messages';\r\nimport { onClarityProjectChanged, onScriptPageInitialized } from '../actions/onScriptPageActions';\r\n\r\norchestrator(onScriptPageInitialized, async (msg) => {\r\n const publisherId = parseInt(msg.publisherId, 10);\r\n const propertyId = parseInt(msg.propertyId, 10);\r\n const { userContext } = getAppStore();\r\n\r\n if (!isNaN(publisherId) && !isNaN(propertyId)) {\r\n const publisher = new Publisher(publisherId);\r\n onLoadingChanged(true);\r\n\r\n try {\r\n const propertiesServingConfigs = await listEntity([publisher], userContext, PropertyServingConfigs);\r\n const propertyConfig = propertiesServingConfigs.find((config) => config.propertyId === propertyId);\r\n onClarityProjectChanged(propertyConfig?.clarityConfig?.clarityId || '');\r\n } catch (e) {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.scriptPageFailedToLoadClarityProject,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.scriptPageInvalidState,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { getAppStore, isTythonSelfServeUser, onNavigateBack } from '../../../../../../../../../../@data';\r\nimport { getTythonInventoryPage } from '../../../../../../../../../../utils/routeUtils';\r\nimport { RouteName } from '../../../../../../../../@data';\r\nimport { createReturnUrl } from '../../../../../../../../@data/services/AdManagementService';\r\nimport { onFormCleared, onScriptPageSubmitted } from '../actions/onScriptPageActions';\r\n\r\norchestrator(onScriptPageSubmitted, (msg) => {\r\n const { publisher } = getAppStore();\r\n\r\n const returnUrl = createReturnUrl(RouteName.property, publisher!.id, undefined);\r\n onNavigateBack(msg.routeHistory, isTythonSelfServeUser() ? getTythonInventoryPage() : returnUrl);\r\n\r\n onFormCleared();\r\n if (msg.onSubmit) {\r\n msg.onSubmit();\r\n }\r\n});\r\n","import { FontWeights, getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { BreakPoints, IPubCenterFonts, IPubcenterPalette, IPubcenterSpacing } from '../../../../../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../../../../../types';\r\n\r\ntype StyleProperties =\r\n | 'root'\r\n | 'title'\r\n | 'tipsText'\r\n | 'scriptWithImage'\r\n | 'scriptSectionLeft'\r\n | 'messageBar'\r\n | 'scriptBox'\r\n | 'scriptHolder'\r\n | 'clarityContainer'\r\n | 'claritySection'\r\n | 'claritySectionTitle'\r\n | 'panelPending'\r\n | 'panelPendingText';\r\n\r\ntype ScriptStyles = Record<StyleProperties, string>;\r\n\r\nexport interface IScriptStylesProps extends ICommonStyleProps {\r\n isShownInPanel?: boolean;\r\n}\r\n\r\nexport const getStyles = (props?: IScriptStylesProps): ScriptStyles => {\r\n const theme = getTheme();\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const fonts = theme.fonts as IPubCenterFonts;\r\n const { ResponsiveMedium, ResponsiveExtraSmall, ResponsiveSmall } = BreakPoints;\r\n\r\n return mergeStyleSets({\r\n root: {\r\n marginRight: spacing.size32,\r\n display: 'grid',\r\n gridTemplateColumns: `${props?.isShownInPanel ? '1f' : '2fr 1fr'}`,\r\n gap: spacing.size40,\r\n [ResponsiveMedium]: {\r\n gridTemplateColumns: '1fr',\r\n },\r\n [ResponsiveSmall]: {\r\n gridTemplateColumns: '1fr',\r\n },\r\n [ResponsiveExtraSmall]: {\r\n gridTemplateColumns: '1fr',\r\n },\r\n },\r\n title: {\r\n marginBottom: spacing.size16,\r\n fontSize: theme.fonts.mediumPlus.fontSize,\r\n fontWeight: FontWeights.semibold,\r\n lineHeight: '22px',\r\n },\r\n tipsText: {\r\n fontSize: theme.fonts.medium.fontSize,\r\n lineHeight: spacing.size20,\r\n margin: `${spacing.size16} 0`,\r\n },\r\n scriptWithImage: {\r\n display: 'flex',\r\n gap: spacing.size16,\r\n [ResponsiveSmall]: {\r\n flexDirection: 'column-reverse',\r\n alignItems: 'center',\r\n },\r\n [ResponsiveExtraSmall]: {\r\n flexDirection: 'column-reverse',\r\n alignItems: 'center',\r\n },\r\n },\r\n scriptSectionLeft: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '-webkit-fill-available',\r\n },\r\n messageBar: {\r\n marginBottom: spacing.size12,\r\n backgroundColor: theme.palette.themeLighterAlt,\r\n },\r\n scriptBox: {\r\n borderColor: palette.neutralLight,\r\n borderStyle: 'solid',\r\n borderWidth: '1px',\r\n padding: spacing.size12,\r\n marginBottom: spacing.size16,\r\n },\r\n scriptHolder: {\r\n display: 'block',\r\n whiteSpace: 'pre-wrap',\r\n wordBreak: 'break-all',\r\n backgroundColor: palette.neutralLighter,\r\n minHeight: spacing.size16,\r\n maxHeight: spacing.size128,\r\n padding: spacing.size12,\r\n marginBottom: spacing.size12,\r\n overflow: 'auto',\r\n color: palette.black,\r\n lineHeight: spacing.size16,\r\n fontSize: theme.fonts.small.fontSize,\r\n },\r\n clarityContainer: {\r\n border: `1px solid ${palette.neutralLight}`,\r\n borderRadius: 10,\r\n height: 'fit-content',\r\n },\r\n claritySection: {\r\n padding: spacing.size32,\r\n },\r\n claritySectionTitle: {\r\n ...fonts.size20,\r\n },\r\n panelPending: {\r\n width: 'inherit',\r\n display: 'flex',\r\n alignItems: 'center',\r\n backgroundColor: theme.palette.neutralLighterAlt,\r\n fontSize: theme.fonts.small.fontSize,\r\n fontWeight: FontWeights.light,\r\n marginTop: spacing.size12,\r\n marginButtom: spacing.size6,\r\n paddingTop: spacing.size12,\r\n paddingBottom: spacing.size12,\r\n paddingRight: spacing.size6,\r\n paddingLeft: spacing.size6,\r\n },\r\n panelPendingText: {\r\n backgroundColor: theme.palette.neutralLighterAlt,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<IScriptStyles>(props?: IScriptStyles): ScriptStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { DefaultButton, IconButton, Link } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { setTimeout } from 'timers';\r\nimport { ClarityStatus, getAppStore } from '../../../../../../../../@data';\r\nimport AppMessages from '../../../../../../../../App.messages';\r\nimport { FormTitle, IFormEditParams } from '../../../../../../../../components/Form';\r\nimport { CLARITY_WEB_APP, COPY_BUTTON_TIMEOUT } from '../../../../../../../../constants/AppConstants';\r\nimport { IRouterWithIntl, injectIntlWithObserver } from '../../../../../../../../utils';\r\nimport { getCreatePropertyStore } from '../../../../__data__/store/store';\r\nimport clarityLogo from '../../resources/clarityLogo.svg';\r\nimport scriptPlacementImage from '../../resources/scriptPlacement.png';\r\nimport { onCopyScriptIconChanged, onScriptPageInitialized } from './@data/actions/onScriptPageActions';\r\nimport './@data/mutators/scriptChanged';\r\nimport './@data/orchestrators';\r\nimport { getPropertyScriptPageStore } from './@data/store/store';\r\nimport messages from './messages';\r\nimport { getClassNames } from './styles';\r\n\r\nexport interface IScriptPageProps extends IRouterWithIntl<IFormEditParams> {\r\n siteId?: string;\r\n clarityStatus?: ClarityStatus;\r\n isShownInPanel?: boolean;\r\n}\r\n\r\nexport const PropertyScriptPage = injectIntlWithObserver(function ScriptPage(props: IScriptPageProps) {\r\n const { formatMessage } = props.intl;\r\n const classNames = getClassNames({ isShownInPanel: props.isShownInPanel || false });\r\n const appStore = getAppStore();\r\n const { copyScriptIcon, clarityProjectId } = getPropertyScriptPageStore();\r\n const { active } = getCreatePropertyStore();\r\n\r\n let publisherId = props.match.params.publisherId;\r\n const propertyId = props.isShownInPanel ? props.siteId : props.match.params.id;\r\n\r\n // In case publisherId is not extracted from route, fetch it from appStore\r\n if (!publisherId && appStore.publisher) {\r\n publisherId = appStore.publisher?.id;\r\n }\r\n\r\n const HEADER_SCRIPT = `<script>window.msAdsQueue = window.msAdsQueue || [];</script>\r\n <script async src=\"https://adsdk.microsoft.com/mmnow/sdk.js?siteId=${propertyId}&publisherId=${publisherId}\" crossorigin=\"anonymous\"></script>`;\r\n\r\n const onCopyScriptClicked = (text: string) => {\r\n navigator.clipboard.writeText(text);\r\n // This change of icon will indicate the user that script copy was successful\r\n onCopyScriptIconChanged('Accept');\r\n // After 3000ms we change the icon back to 'Copy'\r\n setTimeout(() => onCopyScriptIconChanged('Copy'), COPY_BUTTON_TIMEOUT);\r\n };\r\n\r\n useEffect(() => {\r\n if (publisherId && propertyId) {\r\n onScriptPageInitialized(publisherId, propertyId);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <div className={classNames.root}>\r\n <div>\r\n <FormTitle title={formatMessage(messages.title)} intl={props.intl} noHelpPopup={true} />\r\n <p className={classNames.tipsText}>{formatMessage(messages.tips)}</p>\r\n <h2 className={classNames.title}>{formatMessage(messages.subTitle)}</h2>\r\n <div className={classNames.scriptWithImage}>\r\n <div className={classNames.scriptSectionLeft}>\r\n <div className={classNames.scriptBox}>\r\n <code className={classNames.scriptHolder}>{HEADER_SCRIPT}</code>\r\n <DefaultButton\r\n text={formatMessage(messages.copyCodeButton)}\r\n iconProps={{ iconName: copyScriptIcon }}\r\n onClick={() => onCopyScriptClicked(HEADER_SCRIPT!)}\r\n />\r\n </div>\r\n </div>\r\n <img src={scriptPlacementImage} alt={formatMessage(messages.tips)} width={285} height={178} />\r\n </div>\r\n </div>\r\n {clarityProjectId && (\r\n <div className={classNames.clarityContainer}>\r\n <div className={classNames.claritySection}>\r\n <img src={clarityLogo} alt={'clarityLogo'} />\r\n <p role=\"heading\" className={classNames.claritySectionTitle} aria-level={6}>\r\n {formatMessage(messages.microsoftClarity)}\r\n </p>\r\n <span>\r\n {formatMessage(messages.microsoftConnectedClarity).replace('{projectId}', clarityProjectId)}\r\n <Link href={CLARITY_WEB_APP.replace('{id}', clarityProjectId)} target=\"_blank\" rel=\"noreferrer noopener\">\r\n {formatMessage(AppMessages.here)}\r\n </Link>\r\n </span>\r\n <br />\r\n <span>{formatMessage(messages.microsoftClarityConnectedAccountNotice)}</span>\r\n </div>\r\n {(active.clarity?.clarityStatus === ClarityStatus.Pending || props.clarityStatus === ClarityStatus.Pending) && (\r\n <div className={classNames.panelPending}>\r\n <div>\r\n <IconButton iconProps={{ iconName: 'Info' }} />\r\n </div>\r\n <div className={classNames.panelPendingText}>{formatMessage(messages.microsoftClarityEmailSentNotice)}</div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n processNameCreate: {\r\n id: 'siteCreationProcess.processNameCreate',\r\n defaultMessage: 'Create site',\r\n },\r\n processNameEdit: {\r\n id: 'siteCreationProcess.processNameEdit',\r\n defaultMessage: 'Edit site',\r\n },\r\n CreateSiteStep: {\r\n id: 'siteCreationProcess.CreateSiteStep',\r\n defaultMessage: 'Site details',\r\n },\r\n AdsTxtCreationStep: {\r\n id: 'siteCreationProcess.AdsTxtCreationStep',\r\n defaultMessage: 'Ads.txt creation',\r\n },\r\n GetCodeAndFinishStep: {\r\n id: 'siteCreationProcess.GetCodeAndFinishStep',\r\n defaultMessage: 'Get code',\r\n },\r\n createPropertyBtnLbl: {\r\n id: 'siteCreationProcess.createPropertyBtnLbl',\r\n defaultMessage: 'Create Property',\r\n },\r\n createPropertySuccessNotification: {\r\n id: 'siteCreationProcess.createPropertySuccessNotification',\r\n defaultMessage: 'You’ve successfully created a new property {entityId}',\r\n },\r\n clarityProjectDoesNotExistNotification: {\r\n id: 'siteCreationProcess.clarityProjectDoesNotExistNotification',\r\n defaultMessage: 'Clarity project ID does not exist',\r\n },\r\n createPropertyFailedNotification: {\r\n id: 'siteCreationProcess.createPropertyFailedNotification',\r\n defaultMessage: 'Create properties failed, please try again later.',\r\n },\r\n});\r\n","import * as React from 'react';\r\nimport { useEffect, useState } from 'react';\r\nimport { ClarityType, getAppStore, onNavigateBack } from '../../../../../../@data';\r\nimport { FormState, IFormEditParams } from '../../../../../../components/Form';\r\nimport { DetailPage } from '../../../../../../layout/DetailPage/DetailPage';\r\nimport { DetailPageWithStepper } from '../../../../../../layout/DetailPageWithStepper/DetailPageWithStepper';\r\nimport { IStepperStep } from '../../../../../../layout/DetailPageWithStepper/DetailPageWithStepper.types';\r\nimport { IRouterWithIntl, injectIntlWithObserver } from '../../../../../../utils';\r\nimport { getTythonInventoryPage } from '../../../../../../utils/routeUtils';\r\nimport { onFormCleared } from '../../__data__/mutatorActions';\r\nimport { IClarityParams } from '../../__data__/store/schema';\r\nimport { getCreatePropertyStore } from '../../__data__/store/store';\r\nimport useDetailsPageButtonsStatus from '../../utils/useDetailsPageButtonsStatus';\r\nimport { onFormSubmitted } from './__data__/orchestrators/formSubmitted';\r\nimport { AdsTextPage } from './components/AdsTextPage';\r\nimport { CreateProperty } from './components/CreateProperty';\r\nimport { PropertyScriptPage } from './components/ScriptPage';\r\nimport { onScriptPageSubmitted } from './components/ScriptPage/@data/actions/onScriptPageActions';\r\nimport messages from './messages';\r\n\r\ninterface ICreateTythonPropertyProps extends IRouterWithIntl<IFormEditParams> {\r\n mode: FormState;\r\n startStep?: number;\r\n onSubmit?: ({ name, url, clarity }: { name: string; url: string; clarity: IClarityParams }) => void;\r\n saving?: boolean;\r\n onCancel?: () => void;\r\n}\r\n\r\nexport const CreateTythonProperty = injectIntlWithObserver((props: ICreateTythonPropertyProps) => {\r\n const { id: propertyId, publisherId, accountId } = props.match.params;\r\n const searchParams = new URLSearchParams(props.location.search);\r\n const step = searchParams.get('step');\r\n const { formatMessage } = props.intl;\r\n const { active: activeProperty } = getCreatePropertyStore();\r\n const { name, url, clarity } = activeProperty;\r\n const { clarityType, clarityId, approvalBehavioralOption } = clarity || { clarityType: undefined };\r\n const { titleLabel, submitLabel, onHandleSubmit, onHandleCancel } = useDetailsPageButtonsStatus(\r\n props.history,\r\n props.mode,\r\n props.onSubmit,\r\n props.onCancel,\r\n formatMessage\r\n );\r\n const { saving, loading } = getAppStore();\r\n const [isPropertyFormSubmittable, onPropertyFormSubmittable] = useState<boolean>(false);\r\n\r\n // Evaluates whether the submit button for the CreateProperty (First step) is enabled or disabled by checking\r\n // 1 - Property name\r\n // 2 - Property URL\r\n // 3 - Clarity option is advanced and user approved T&C of linking clarity OR Clarity option is basic\r\n useEffect(() => {\r\n if (\r\n name &&\r\n url &&\r\n name?.length !== 0 &&\r\n url?.length !== 0 &&\r\n ((clarityType === ClarityType.Behavioral && approvalBehavioralOption === true) ||\r\n clarityType === ClarityType.Fraud ||\r\n (clarityType === ClarityType.None && !!clarityId && clarityId?.length !== 0))\r\n ) {\r\n onPropertyFormSubmittable(true);\r\n } else {\r\n onPropertyFormSubmittable(false);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [name, url, approvalBehavioralOption, clarityType, clarityId]);\r\n\r\n const clearStores = () => {\r\n onFormCleared();\r\n };\r\n\r\n const steps: IStepperStep[] = [\r\n {\r\n name: formatMessage(messages.CreateSiteStep),\r\n component: <CreateProperty {...props} />,\r\n helpId: 'pop_PCv4_PropertiesCreate',\r\n isNextDisabled: !isPropertyFormSubmittable,\r\n isStepDirty: propertyId !== undefined,\r\n onNext: (action, stepState) => onFormSubmitted(props.mode, props.history, action, stepState),\r\n },\r\n {\r\n name: formatMessage(messages.AdsTxtCreationStep),\r\n isStepDirty: propertyId !== undefined,\r\n component: <AdsTextPage {...props} />,\r\n },\r\n {\r\n name: formatMessage(messages.GetCodeAndFinishStep),\r\n component: <PropertyScriptPage {...props} />,\r\n isStepDirty: propertyId !== undefined,\r\n onNext: (action, _) => {\r\n clearStores();\r\n onScriptPageSubmitted(props.mode, props.history, action);\r\n },\r\n },\r\n ];\r\n\r\n return props.mode === FormState.InPageCreate ? (\r\n <DetailPage\r\n titleLabel={titleLabel}\r\n helpId={'pop_PCv4_PropertiesCreate'}\r\n submitLabel={submitLabel}\r\n onCancel={() => onHandleCancel(publisherId, accountId)}\r\n onSubmit={() => onHandleSubmit(activeProperty)}\r\n onNavClick={() => onHandleCancel(publisherId, accountId)}\r\n saving={saving || props.saving}\r\n loading={loading}\r\n pageMode={props.mode}\r\n hasFormTitle\r\n submitButtonDisabled={!isPropertyFormSubmittable}\r\n additionalHeightBoundary={true}\r\n >\r\n <CreateProperty {...props} />\r\n </DetailPage>\r\n ) : (\r\n <DetailPageWithStepper\r\n process={\r\n props.mode === FormState.MultiStepCreation ? formatMessage(messages.processNameCreate) : formatMessage(messages.processNameEdit)\r\n }\r\n openStep={(step && Number(step)) || 0}\r\n steps={steps.filter((stepToBeFiltered) => !stepToBeFiltered.hideStep)}\r\n pageMode={props.mode}\r\n backToBase={() => {\r\n clearStores();\r\n onNavigateBack(props.history, getTythonInventoryPage());\r\n }}\r\n {...props}\r\n />\r\n );\r\n});\r\n","import { Announced, IconButton, Panel, PanelType, getTheme } from '@fluentui/react';\r\nimport React, { useEffect } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\nimport { ClarityType } from '../../../../../../@data';\r\nimport AppMessages from '../../../../../../App.messages';\r\nimport { FormItem, FormState } from '../../../../../../components/Form';\r\nimport { useWindowSize } from '../../../../../../hooks';\r\nimport { getStore } from '../../../../../../hooks/useWindowSize/store/store';\r\nimport { IPropertyPickerItem } from '../../../../../../layout/PropertyPicker/PropertyPicker.types';\r\nimport { PropertySitePicker } from '../../../../../../layout/PropertySitePicker/PropertySitePicker';\r\nimport { IPropertySitePickerItem } from '../../../../../../layout/PropertySitePicker/PropertySitePicker.types';\r\nimport { injectIntlAndObserver } from '../../../../../../utils';\r\nimport propertyMessages from '../../../../Property/Create/variations/CreateNonTythonProperty/messages';\r\nimport { CreateTythonProperty } from '../../../../Property/Create/variations/CreateTythonProperty';\r\nimport { getClassNames } from '../../../Create/CreateAdunit';\r\nimport messages from '../../CreateAdunit/messages';\r\nimport { getStyles } from '../../CreateAdunit/styles';\r\n\r\nexport interface IAdUnitSiteSelectorProps {\r\n options: IPropertyPickerItem[];\r\n onAddSiteClick: () => void;\r\n searchBoxPlaceholder: string;\r\n onSiteChange: (item?: IPropertySitePickerItem) => void;\r\n isPropertyPanelActive: boolean;\r\n onCloseNewPropertyPanel: () => void;\r\n onCreatingNewProperty: ({\r\n name,\r\n url,\r\n clarityType,\r\n clarityId,\r\n }: {\r\n name: string;\r\n url: string;\r\n clarityType?: ClarityType;\r\n clarityId?: string;\r\n }) => void;\r\n isLoading?: boolean;\r\n isSaving?: boolean;\r\n isDisabled?: boolean;\r\n shouldRenderComponent: boolean;\r\n}\r\n\r\nconst { windowStoreSerializer } = useWindowSize();\r\n\r\nconst AdUnitSiteSelector = injectIntlAndObserver<InjectedIntlProps & IAdUnitSiteSelectorProps & RouteComponentProps>(\r\n ({\r\n intl: { formatMessage },\r\n onCloseNewPropertyPanel,\r\n isPropertyPanelActive,\r\n options,\r\n searchBoxPlaceholder,\r\n onSiteChange,\r\n onAddSiteClick,\r\n onCreatingNewProperty,\r\n isLoading,\r\n isSaving,\r\n isDisabled,\r\n shouldRenderComponent,\r\n ...routeProps\r\n }) => {\r\n const { isWindowSmallSize } = windowStoreSerializer(getStore());\r\n\r\n const theme = getTheme();\r\n const classNames = getClassNames(getStyles, { theme });\r\n\r\n /**\r\n * we passed type = custom to Panel component, by default this will not focus to close button\r\n * when panel expanded, based on a11y requirement we need to focus to close button when panel expanded\r\n * so added this useEffect to focus to close button when panel expanded\r\n */\r\n useEffect(() => {\r\n if (isPropertyPanelActive) {\r\n // Adding a small delay to ensure the element is available\r\n const timer = setTimeout(() => {\r\n const closeButton = document.getElementById('adunit-site-panel-close-button');\r\n if (closeButton) {\r\n closeButton.focus();\r\n }\r\n }, 0); // Delay is set to 0, but it ensures it runs after the DOM update\r\n\r\n // Cleanup the timeout if the component unmounts\r\n return () => clearTimeout(timer);\r\n }\r\n }, [isPropertyPanelActive]);\r\n\r\n return shouldRenderComponent ? (\r\n <>\r\n <FormItem formWidth={isWindowSmallSize ? 328 : 546}>\r\n <div className={classNames.siteSection}>\r\n <PropertySitePicker\r\n title={formatMessage(messages.site)}\r\n items={options}\r\n searchBoxPlaceholder={searchBoxPlaceholder}\r\n propertyOptionsAriaLabel={formatMessage(messages.propertyOptionsAriaLabel)}\r\n onListItemClicked={onSiteChange}\r\n emptyOptionLabel={formatMessage(messages.propertyPickerEmptyOptionLabel)}\r\n searchBoxAriaDescription={formatMessage(messages.propertyPickerSearchBoxAriaDesc)}\r\n itemSelectedAnnounceMessage={formatMessage(messages.propertyPickerItemSelectedAnnounceMsg)}\r\n isLoading={isLoading}\r\n isDisabled={isDisabled}\r\n clearSearchOnSelect\r\n formatMessage={formatMessage}\r\n />\r\n {!isDisabled && (\r\n <button onClick={onAddSiteClick} className={classNames.button}>\r\n {formatMessage(messages.siteButton)}\r\n </button>\r\n )}\r\n </div>\r\n <Panel\r\n isOpen={isPropertyPanelActive}\r\n type={PanelType.custom}\r\n onDismiss={onCloseNewPropertyPanel}\r\n onRenderNavigation={() => (\r\n <IconButton\r\n className={classNames.newPropertyPanelHeader}\r\n iconProps={{ iconName: 'Cancel' }}\r\n aria-label={formatMessage(AppMessages.close)}\r\n onClick={onCloseNewPropertyPanel}\r\n id=\"adunit-site-panel-close-button\"\r\n />\r\n )}\r\n headerText={formatMessage(propertyMessages.createSitePageTitle)}\r\n headerTextProps={{ hidden: true }}\r\n closeButtonAriaLabel={formatMessage(messages.panelCloseButtonAriaLabel)}\r\n >\r\n <Announced message={formatMessage(messages.createSitePanelAccessibilityAnnouncement)} />\r\n {isPropertyPanelActive && (\r\n <CreateTythonProperty\r\n {...routeProps}\r\n onSubmit={onCreatingNewProperty}\r\n mode={FormState.InPageCreate}\r\n saving={isSaving}\r\n onCancel={onCloseNewPropertyPanel}\r\n />\r\n )}\r\n </Panel>\r\n </FormItem>\r\n </>\r\n ) : null;\r\n }\r\n);\r\n\r\nexport default AdUnitSiteSelector;\r\n","import { IStyle, ITheme } from '@fluentui/react';\r\nimport { IPubcenterPalette, IPubcenterSpacing } from '../../../theme';\r\n\r\nexport interface IAccordionStyleProps {\r\n theme: ITheme;\r\n isExpanded: boolean;\r\n isActive: boolean;\r\n}\r\n\r\nexport interface IAccordionStyles {\r\n accordionControlWrapper: IStyle;\r\n accordionToggleCheckboxLabel: IStyle;\r\n accordionContentWrapper: IStyle;\r\n accordionChevron: IStyle;\r\n subContentText: IStyle;\r\n}\r\n\r\nexport const getStyles = (props: IAccordionStyleProps): IAccordionStyles => {\r\n const { theme, isExpanded } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n\r\n return {\r\n accordionControlWrapper: {\r\n borderTopLeftRadius: spacing.size12,\r\n borderTopRightRadius: spacing.size12,\r\n border: `${spacing.size1} solid ${palette.neutralLight}`,\r\n padding: `${spacing.size16} ${spacing.size18}`,\r\n ...(!isExpanded && { borderBottomWidth: 0 }),\r\n '&:hover': {\r\n '.triggerIcon': {\r\n fontWeight: 'bold',\r\n },\r\n },\r\n },\r\n accordionToggleCheckboxLabel: {\r\n '.ms-Checkbox-text': {\r\n fontSize: spacing.size18,\r\n fontWeight: 600,\r\n },\r\n },\r\n accordionContentWrapper: {\r\n borderBottomLeftRadius: spacing.size12,\r\n borderBottomRightRadius: spacing.size12,\r\n border: `${spacing.size1} solid ${palette.neutralLight}`,\r\n padding: `${spacing.size16}`,\r\n borderTopWidth: 0,\r\n ...(!isExpanded && { paddingTop: 0 }),\r\n ...(isExpanded && { padding: 0 }),\r\n },\r\n accordionChevron: {\r\n cursor: 'pointer',\r\n padding: `${spacing.size10} ${spacing.size10} ${spacing.size10} ${spacing.size46}`,\r\n margin: `-${spacing.size10} -${spacing.size10} -${spacing.size10} -${spacing.size46}`,\r\n background: 'transparent',\r\n },\r\n subContentText: { color: palette.neutralTertiaryWhiteContrast, marginLeft: spacing.size30 },\r\n };\r\n};\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n accordionCheckBoxArialLabelChecked: {\r\n id: 'accordion.checkbox.arial.checked',\r\n defaultMessage: 'Toggle checkbox to uncheck and collapse accordion for {title}',\r\n },\r\n accordionCheckBoxArialLabelUnchecked: {\r\n id: 'accordion.checkbox.arial.unchecked',\r\n defaultMessage: 'Toggle checkbox to enable and expand accordion for {title}',\r\n },\r\n});\r\n","import { Checkbox, classNamesFunction, css, getTheme, Icon, Overlay, Stack, StackItem, Text } from '@fluentui/react';\r\nimport { useBoolean } from '@fluentui/react-hooks';\r\nimport React, { useEffect } from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { isButtonPressKey } from '../../utils/AccessibilityUtils';\r\nimport { getStyles, IAccordionStyleProps, IAccordionStyles } from './Accordion.styles';\r\nimport messages from './messages';\r\n\r\ninterface IAccordionProps {\r\n isActive: boolean;\r\n onToggle: (active: boolean) => void;\r\n id: string;\r\n label: string;\r\n children: React.ReactNode;\r\n subContent?: string;\r\n wrapperClassName: string;\r\n disableMsg?: string;\r\n defaultExpanded?: boolean;\r\n}\r\n\r\nconst Accordion = injectIntl<InjectedIntlProps & IAccordionProps>(\r\n ({ isActive, onToggle, id, label, children, subContent, wrapperClassName, disableMsg, defaultExpanded, intl: { formatMessage } }) => {\r\n const theme = getTheme();\r\n const getClassNames = classNamesFunction<IAccordionStyleProps, IAccordionStyles>();\r\n const [isExpanded, { toggle: toggleExpand, setFalse: collapseAccordion, setTrue: expandAccordion }] = useBoolean(isActive);\r\n const classNames = getClassNames(getStyles, { theme, isExpanded, isActive });\r\n const onChange = (ev?: React.FormEvent<HTMLElement | HTMLInputElement>, checked?: boolean): void => {\r\n onToggle(!!checked);\r\n if (checked) {\r\n expandAccordion();\r\n } else {\r\n collapseAccordion();\r\n }\r\n };\r\n\r\n /**\r\n * If defaultExpanded is true, expand the accordion\r\n */\r\n useEffect(() => {\r\n if (defaultExpanded) {\r\n expandAccordion();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <div className={wrapperClassName} tabIndex={0} aria-label={label + ' ' + (subContent ?? '')}>\r\n {disableMsg && <Overlay className={wrapperClassName}>{disableMsg}</Overlay>}\r\n <Stack enableScopedSelectors horizontal horizontalAlign=\"space-between\" className={classNames.accordionControlWrapper}>\r\n <StackItem>\r\n <Checkbox\r\n className={classNames.accordionToggleCheckboxLabel}\r\n id={`accordion-${id}`}\r\n checked={isActive}\r\n label={label}\r\n onChange={onChange}\r\n disabled={!!disableMsg}\r\n ariaLabel={formatMessage(\r\n isActive ? messages.accordionCheckBoxArialLabelChecked : messages.accordionCheckBoxArialLabelUnchecked,\r\n { title: label }\r\n )}\r\n />\r\n </StackItem>\r\n <StackItem>\r\n <Icon\r\n onClick={toggleExpand}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key) && toggleExpand()}\r\n iconName={isExpanded ? 'ChevronUpMed' : 'ChevronDownMed'}\r\n aria-label={isExpanded ? 'Expanded' : 'Collapsed'}\r\n className={css(classNames.accordionChevron, 'triggerIcon')}\r\n tabIndex={0}\r\n />\r\n </StackItem>\r\n </Stack>\r\n <Stack enableScopedSelectors horizontal className={classNames.accordionContentWrapper}>\r\n {isExpanded && children}\r\n {!isExpanded && <Text className={classNames.subContentText}>{subContent}</Text>}\r\n </Stack>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nexport default Accordion;\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n themeColors: {\r\n id: 'colorPicker.themeColors',\r\n defaultMessage: 'Theme Colors',\r\n },\r\n customColor: {\r\n id: 'colorPicker.customColor',\r\n defaultMessage: 'Custom Color',\r\n },\r\n colorPicker: {\r\n id: 'colorPicker.colorPicker',\r\n defaultMessage: 'Pick a color',\r\n },\r\n});\r\n","import { FontWeights, getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterPalette, IPubcenterSpacing } from '../../../theme';\r\nimport { IColorPickerClassNames, IColorPickerStyleProps } from './ColorPicker.types';\r\n\r\nexport const getClassNames = (props: IColorPickerStyleProps): IColorPickerClassNames => {\r\n const theme = getTheme();\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n\r\n return mergeStyleSets({\r\n root: {\r\n display: 'flex',\r\n padding: `3px ${spacing.size8}`,\r\n cursor: 'pointer',\r\n backgroundColor: palette.white,\r\n border: `1px solid`,\r\n borderColor: 'transparent',\r\n selectors: {\r\n ':hover': {\r\n backgroundColor: palette.neutralLighter,\r\n },\r\n '&:pressed': {\r\n backgroundColor: palette.neutralLight,\r\n },\r\n '&:focus': {\r\n borderRadius: '2px',\r\n borderColor: palette.neutralSecondary,\r\n },\r\n },\r\n },\r\n container: {\r\n display: 'relative',\r\n },\r\n iconContainer: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginRight: spacing.size8,\r\n },\r\n bucketIcon: {\r\n fontSize: theme.fonts.xLarge.fontSize,\r\n color: palette.neutralPrimary,\r\n },\r\n chevronIcon: {\r\n color: palette.neutralPrimary,\r\n fontSize: theme.fonts.small.fontSize,\r\n alignContent: 'center',\r\n width: spacing.size12,\r\n paddingTop: spacing.size8,\r\n },\r\n colorIcon: {\r\n borderWidth: '0.5px',\r\n borderStyle: 'solid',\r\n borderColor: palette.neutralQuaternaryAlt,\r\n height: spacing.size4,\r\n backgroundColor: props.colorSelected,\r\n marginTop: spacing.size2,\r\n },\r\n boldFieldTitle: {\r\n lineHeight: spacing.size20,\r\n fontSize: theme.fonts.medium.fontSize,\r\n fontWeight: FontWeights.semibold,\r\n color: palette.neutralPrimary,\r\n },\r\n swatchColorPickerCallout: {\r\n padding: spacing.size12,\r\n width: 'fit-content',\r\n backgroundColor: palette.white,\r\n gap: spacing.size8,\r\n position: 'absolute',\r\n boxShadow: '0px 1.2px 3.6px rgba(0,0,0.1), 0px 6.4px 14.4px rgba(0,0,0.13)',\r\n },\r\n });\r\n};\r\n","import { IColorCellProps } from '@fluentui/react';\r\n\r\nexport const swatchColors: IColorCellProps[] = [\r\n { id: 'a', label: 'Soft peach', color: '#f8ece9' },\r\n { id: 'b', label: 'Early dawn', color: '#fdf8e8' },\r\n { id: 'c', label: 'White smoke', color: '#f0f7ef' },\r\n { id: 'd', label: 'Porcelain', color: '#e8effd' },\r\n { id: 'e', label: 'Amour', color: '#f4ecf7' },\r\n { id: 'f', label: 'White', color: '#ffffff' },\r\n { id: 'g', label: 'Pale rose', color: '#edc9c4' },\r\n { id: 'h', label: 'Pale peach', color: '#f9e9b8' },\r\n { id: 'i', label: 'Beryl green', color: '#cee5cb' },\r\n { id: 'j', label: 'Light blue', color: '#cad9f9' },\r\n { id: 'k', label: 'Pink flare', color: '#dbbfe4' },\r\n { id: 'l', label: 'Light grey', color: '#dddddd' },\r\n { id: 'm', label: 'Faded red', color: '#ca5040' },\r\n { id: 'n', label: 'Light orange', color: '#eab73e' },\r\n { id: 'o', label: 'Dull green', color: '#67ad5b' },\r\n { id: 'p', label: 'Soft blue', color: '#5383ec' },\r\n { id: 'q', label: 'Warm purple', color: '#9031aa' },\r\n { id: 'r', label: 'Grey', color: '#777777' },\r\n { id: 's', label: 'Brownish red', color: '#ab3d2b' },\r\n { id: 't', label: 'Orange', color: '#e08731' },\r\n { id: 'u', label: 'Green', color: '#326f3e' },\r\n { id: 'v', label: 'Blue', color: '#3555bf' },\r\n { id: 'w', label: 'Purple', color: '#612194' },\r\n { id: 'x', label: 'Black', color: '#3a474e' },\r\n];\r\n\r\nexport const defaultColor = '#ffffff';\r\n\r\nexport const getColorByHex = (hex: string): IColorCellProps | undefined => {\r\n return swatchColors.find((color) => color.color === hex.toLocaleLowerCase());\r\n};\r\n","import {\r\n Callout,\r\n DirectionalHint,\r\n FocusZone,\r\n FocusZoneTabbableElements,\r\n getId,\r\n Icon,\r\n MaskedTextField,\r\n SwatchColorPicker,\r\n} from '@fluentui/react';\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport { isButtonPressKey } from '../../utils/AccessibilityUtils';\r\nimport messages from './ColorPicker.messages';\r\nimport { getClassNames } from './ColorPicker.styles';\r\nimport { IColorPickerProps } from './ColorPicker.types';\r\nimport { defaultColor, getColorByHex, swatchColors } from './swatchColors';\r\n\r\nconst HEX_COLOR_PREFIX = 'Hex ';\r\nconst HEX_CHARACTER_REGEX = /[0-9a-fA-F]/;\r\nconst HEX_MASK_REGEX = /(Hex )*(_)*/g;\r\n\r\nexport const ColorPicker = injectIntl(function ColorPickerComponent(props: IColorPickerProps): JSX.Element {\r\n const [color, setColor] = useState(props.selectedColor || props.defaultColor || defaultColor);\r\n const [calloutVisible, setCalloutVisible] = useState(false);\r\n const [customColor, setCustomColor] = useState(\r\n swatchColors.find((swatchColor) => swatchColor.color === props.selectedColor) ? undefined : props.selectedColor\r\n );\r\n const [buttonId] = useState(getId('colorPicker'));\r\n const colorPickerButtonRef = useRef<HTMLButtonElement>(null);\r\n const classNames = getClassNames({ colorSelected: customColor ?? color });\r\n const { formatMessage } = props.intl;\r\n\r\n function handleColorChanged(_color: string) {\r\n setColor(_color);\r\n setCalloutVisible(false);\r\n setCustomColor(undefined);\r\n\r\n props.onChange?.(_color);\r\n }\r\n function handleHexCodeFieldChanged(ev) {\r\n const hexValue = ev.target.value.replaceAll(HEX_MASK_REGEX, '');\r\n if (hexValue !== '#') {\r\n setCustomColor(hexValue);\r\n setColor(color || defaultColor);\r\n props.onChange?.(hexValue);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (props.selectedColor && props.controlled) {\r\n setColor(props.selectedColor);\r\n }\r\n }, [props.selectedColor, props.controlled]);\r\n\r\n const onCalloutDismiss = () => {\r\n setCalloutVisible(false);\r\n colorPickerButtonRef?.current?.focus();\r\n };\r\n return (\r\n <div className={classNames.container}>\r\n <button\r\n type=\"button\"\r\n title={\r\n formatMessage(messages.colorPicker) +\r\n (props.colorType ? ` for ${props.colorType}` : '') +\r\n ` selected: ${color || customColor || ''}`\r\n }\r\n id={buttonId}\r\n className={classNames.root}\r\n onClick={() => setCalloutVisible(true)}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key) && setCalloutVisible(true)}\r\n ref={colorPickerButtonRef}\r\n >\r\n <div className={classNames.iconContainer}>\r\n <Icon iconName=\"BucketColor\" className={classNames.bucketIcon} />\r\n <div className={classNames.colorIcon} />\r\n </div>\r\n <Icon iconName=\"ChevronDown\" className={classNames.chevronIcon} />\r\n </button>\r\n {calloutVisible && (\r\n <Callout\r\n className={`${classNames.swatchColorPickerCallout} ms-Fabric--isFocusVisible`}\r\n target={`#${buttonId}`}\r\n role=\"dialog\"\r\n onDismiss={onCalloutDismiss}\r\n isBeakVisible={false}\r\n setInitialFocus={true}\r\n directionalHint={DirectionalHint.bottomRightEdge}\r\n ariaLabel=\"Color picker\"\r\n >\r\n <label className={classNames.boldFieldTitle}>{formatMessage(messages.themeColors)}</label>\r\n <FocusZone handleTabKey={FocusZoneTabbableElements.all} isCircularNavigation defaultTabbableElement={'#swatchColorPicker-b-1'}>\r\n <SwatchColorPicker\r\n colorCells={swatchColors}\r\n columnCount={6}\r\n cellShape={'circle'}\r\n defaultSelectedId={customColor ? undefined : getColorByHex(color)?.id || getColorByHex(defaultColor)?.id}\r\n onChange={(_, id, _color) => handleColorChanged(_color || defaultColor)}\r\n id=\"swatchColorPicker\"\r\n doNotContainWithinFocusZone\r\n />\r\n <MaskedTextField\r\n label={formatMessage(messages.customColor)}\r\n mask={`${HEX_COLOR_PREFIX}#******`}\r\n value={customColor}\r\n maskFormat={{ '*': HEX_CHARACTER_REGEX }}\r\n onBlur={handleHexCodeFieldChanged}\r\n onKeyUp={(ev) => isButtonPressKey(ev.key) && handleHexCodeFieldChanged(ev)}\r\n />\r\n </FocusZone>\r\n </Callout>\r\n )}\r\n </div>\r\n );\r\n});\r\n","import { IDropdownOption } from '@fluentui/react';\r\n\r\nexport const fontOptions: IDropdownOption[] = [\r\n { key: 'Arial', text: 'Arial' },\r\n { key: 'Arial Black', text: 'Arial Black' },\r\n { key: 'Calibri', text: 'Calibri' },\r\n { key: 'Calibri Light', text: 'Calibri Light' },\r\n { key: 'Cambria', text: 'Cambria' },\r\n { key: 'Comic Sans MS', text: 'Comic Sans MS' },\r\n { key: 'Courier New', text: 'Courier New' },\r\n { key: 'Garamond', text: 'Garamond' },\r\n { key: 'Georgia', text: 'Georgia' },\r\n { key: 'Helvetica', text: 'Helvetica' },\r\n { key: 'Impact', text: 'Impact' },\r\n // Removing these fonts temporarily, as they are not being reflected in UI\r\n // { key: 'Lato', text: 'Lato' },\r\n // { key: 'Open Sans', text: 'Open Sans' },\r\n // { key: 'Poppins', text: 'Poppins' },\r\n // { key: 'Roboto', text: 'Roboto' },\r\n // { key: 'Raleway', text: 'Raleway' },\r\n { key: 'Segoe UI', text: 'Segoe UI' },\r\n { key: 'Sitka Heading', text: 'Sitka Heading' },\r\n { key: 'Tahoma', text: 'Tahoma' },\r\n { key: 'Times New Roman', text: 'Times New Roman' },\r\n { key: 'Verdana', text: 'Verdana' },\r\n];\r\n","import React, { useEffect, useRef } from 'react';\r\nimport { InjectedIntl, injectIntl } from 'react-intl';\r\nimport messages from '../../CreateAdunit/messages';\r\n\r\ntype AdPreviewType = (container: HTMLDivElement | null) => void;\r\ndeclare global {\r\n // tslint:disable-next-line:interface-name\r\n interface Window {\r\n AdPreview: AdPreviewType;\r\n }\r\n}\r\n\r\nexport interface IAdPreviewConfig {\r\n adWidth: number;\r\n adHeight: number;\r\n background?: string;\r\n fontFamily?: string;\r\n titleColor?: string;\r\n buttonBackground?: string;\r\n}\r\n\r\ninterface IAdPreviewProps {\r\n config: IAdPreviewConfig;\r\n}\r\n\r\nconst AdPreview: React.FC<IAdPreviewProps & { intl: InjectedIntl }> = ({ config, intl: { formatMessage } }) => {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const adPreviewRef = useRef<null | {\r\n render: (\r\n config,\r\n secondaryConfigs?: { image: { src: string; width: number; height: number }; title: string; providerName: string; ctaText: string }\r\n ) => void;\r\n }>(null); // new ref to store adPreview instance\r\n\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (container && window.AdPreview) {\r\n adPreviewRef.current = new window.AdPreview(container);\r\n }\r\n }, []); // Empty array to only run once\r\n\r\n useEffect(() => {\r\n if (adPreviewRef.current) {\r\n adPreviewRef.current.render(config, {\r\n image: {\r\n src: 'https://adsdk.microsoft.com/assets/images/ad-preview.png',\r\n width: config.adWidth,\r\n height: config.adHeight,\r\n },\r\n title: formatMessage(messages.nativeAdPreviewPreviewTitle),\r\n providerName: formatMessage(messages.nativeAdPreviewPreviewUrl),\r\n ctaText: formatMessage(messages.displayAdPreviewLearnMoreButton),\r\n });\r\n } // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [config]); // Run every time config changes\r\n\r\n return <div ref={containerRef} />;\r\n};\r\n\r\nexport default injectIntl(AdPreview);\r\n","import { Dropdown, MessageBar, Pivot, PivotItem, Stack, Text, TextField, css, getTheme } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { FormattedMessage, InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport Accordion from '../../../../../../components/Accordion';\r\nimport { ColorPicker } from '../../../../../../components/ColorPicker/ColorPicker';\r\nimport { FormLabel } from '../../../../../../components/Form/FormLabel';\r\nimport { useCMUIHelpExperience } from '../../../../../../hooks';\r\nimport { getClassNames } from '../../../Create/CreateAdunit';\r\nimport { TythonAdUnitDisplayAdTypeLayout, TythonAdUnitDisplayAdTypeLayoutLabel } from '../../CreateAdunit/constants';\r\nimport messages from '../../CreateAdunit/messages';\r\nimport { getStyles } from '../../CreateAdunit/styles';\r\nimport { AdTypes, NativeAdProperties } from '../../CreateAdunit/types';\r\nimport AutoFitHeight from '../../resources/AutoFitHeight.svg';\r\nimport AutoFitWidth from '../../resources/AutoFitWidth.svg';\r\nimport HorizontalBottomAdPreview from '../../resources/HorizontalBottomAdPreview.svg';\r\nimport HorizontalUpperAdPreview from '../../resources/HorizontalUpperAdPreview.svg';\r\nimport SquareBottomAdPreview from '../../resources/SquareBottomAdPreview.svg';\r\nimport SquareLeftAdPreview from '../../resources/SquareLeftAdPreview.svg';\r\nimport VerticalBottomAdPreview from '../../resources/VerticalBottomAdPreview.svg';\r\nimport VerticalLeftAdPreview from '../../resources/VerticalLeftAdPreview.svg';\r\nimport { fontOptions } from '../../services/fontOptions';\r\nimport AdPreview from './PreviewComponent';\r\nimport useAdUnitTypeSelector from './useAdUnitTypeSelector';\r\n\r\nexport interface IAdUnitTypeSelectorProps {\r\n adTypes: AdTypes;\r\n nativeProperties: NativeAdProperties;\r\n shouldRenderComponent?: boolean;\r\n isLoading?: boolean;\r\n onChange: ({ adTypes, nativeProperties }: { adTypes?: AdTypes; nativeProperties?: NativeAdProperties }) => void;\r\n}\r\n\r\nconst AdUnitTypeSelector = injectIntl<InjectedIntlProps & IAdUnitTypeSelectorProps>(\r\n ({ intl, shouldRenderComponent, isLoading, ...props }) => {\r\n if (!shouldRenderComponent) {\r\n return null;\r\n }\r\n const theme = getTheme();\r\n const { formatMessage } = intl;\r\n const {\r\n isSdkLoaded,\r\n adPreviewConfig,\r\n isNativeAdActive,\r\n isDisplayAdActive,\r\n shouldRenderFewerSelectionMsg,\r\n shouldRenderNoSelectionMsg,\r\n displayAdLayout,\r\n onDisaplayAdLayoutChange,\r\n onToggleNativeAd,\r\n onToggleDisplayAd,\r\n onAdPreviewConfigChange,\r\n } = useAdUnitTypeSelector({ ...props });\r\n const { CMUIPopupArticleByIdAnchor } = useCMUIHelpExperience();\r\n\r\n const classNames = getClassNames(getStyles, { theme, displayAdLayout });\r\n\r\n return (\r\n <div className={classNames.adTypeContainer}>\r\n <FormLabel\r\n id=\"adunitTypeLabel\"\r\n labelContent={formatMessage(messages.adunitType)}\r\n intl={intl}\r\n labelRequired\r\n noInfoButton\r\n disableHeading\r\n disableAriaLevel\r\n />\r\n <Accordion\r\n isActive={isNativeAdActive}\r\n onToggle={onToggleNativeAd}\r\n id=\"adUnit-native-ad-selector\"\r\n label={formatMessage(messages.nativeAd)}\r\n subContent={formatMessage(messages.nativeAdSubContent)}\r\n wrapperClassName={classNames.adunitTypeAccordionWrapper}\r\n >\r\n <Stack enableScopedSelectors horizontal className={classNames.adunitTypeAccordionContentWrapper}>\r\n <Stack.Item className={classNames.adunitTypeLeftSection}>\r\n <div className=\"nativeAdType\">\r\n <Text className={classNames.adunitTypeFormTitlePrimary} block role=\"heading\" aria-level={2}>\r\n {formatMessage(messages.nativeAdConfigLabel)}\r\n </Text>\r\n {/* Font selection */}\r\n <Dropdown\r\n label={formatMessage(messages.nativeAdConfigLabelFont)}\r\n options={fontOptions}\r\n selectedKey={adPreviewConfig.fontFamily}\r\n onChange={(_, option) => onAdPreviewConfigChange('fontFamily', option!.text)}\r\n />\r\n {/* Title color selection */}\r\n <div className={classNames.horizontalSelectionWrapper}>\r\n <label className={classNames.boldFieldTitle}>{formatMessage(messages.nativeAdConfigLabelTitleColor)}</label>\r\n <ColorPicker\r\n selectedColor={adPreviewConfig.titleColor}\r\n onChange={(color) => onAdPreviewConfigChange('titleColor', color)}\r\n colorType={formatMessage(messages.nativeAdConfigLabelTitleColor)}\r\n />\r\n </div>\r\n {/* Background color selection */}\r\n <div className={classNames.horizontalSelectionWrapper}>\r\n <label className={classNames.boldFieldTitle}>{formatMessage(messages.nativeAdConfigLabelBackgroundColor)}</label>\r\n <ColorPicker\r\n selectedColor={adPreviewConfig.background}\r\n onChange={(color) => onAdPreviewConfigChange('background', color)}\r\n colorType={formatMessage(messages.nativeAdConfigLabelBackgroundColor)}\r\n />\r\n </div>\r\n {/* Botton background color selection */}\r\n <div className={classNames.horizontalSelectionWrapper}>\r\n <label className={classNames.boldFieldTitle}>{formatMessage(messages.nativeAdConfigLabelButtonBackgroundColor)}</label>\r\n <ColorPicker\r\n selectedColor={adPreviewConfig.buttonBackground}\r\n onChange={(color) => onAdPreviewConfigChange('buttonBackground', color)}\r\n colorType={formatMessage(messages.nativeAdConfigLabelButtonBackgroundColor)}\r\n />\r\n </div>\r\n <br />\r\n <MessageBar messageBarType={0} className={classNames.infoMsgBar}>\r\n {formatMessage(messages.nativeAdConfigMsgBarContent)}\r\n </MessageBar>\r\n </div>\r\n </Stack.Item>\r\n <Stack.Item className={css(classNames.adunitTypeRightSection, classNames.adPreviewWrapper)}>\r\n <div>\r\n <Text className={classNames.adunitTypeFormTitlePrimary} block role=\"heading\" aria-level={2}>\r\n {formatMessage(messages.adPreview)}\r\n </Text>\r\n <div className={classNames.horizontalSelectionWrapper}>\r\n <label className={classNames.boldFieldTitle}>\r\n {formatMessage(messages.adPreviewContainerSize)} \r\n </label>\r\n <TextField\r\n id=\"adCardWidthTextBox\"\r\n ariaLabel=\"adjustWidth\"\r\n styles={classNames.subComponentStyles.textBox}\r\n value={adPreviewConfig.adWidth.toString()}\r\n onChange={(_, val) => onAdPreviewConfigChange('adWidth', val)}\r\n type=\"number\"\r\n onRenderPrefix={() => (\r\n <img className={classNames.expandIcon} src={AutoFitWidth} alt={formatMessage(messages.adPreviewHorizontal)} />\r\n )}\r\n />\r\n <label className={classNames.boldFieldTitle}> X </label>\r\n <TextField\r\n id=\"adCardHeightTextBox\"\r\n ariaLabel=\"adjustHeight\"\r\n styles={classNames.subComponentStyles.textBox}\r\n value={adPreviewConfig.adHeight.toString()}\r\n onChange={(_, val) => onAdPreviewConfigChange('adHeight', val)}\r\n type=\"number\"\r\n onRenderPrefix={() => (\r\n <img className={classNames.expandIcon} src={AutoFitHeight} alt={formatMessage(messages.adPreviewVertical)} />\r\n )}\r\n />\r\n </div>\r\n <br />\r\n <div className={classNames.previewSDKWrapper}>{isSdkLoaded && <AdPreview config={{ ...adPreviewConfig }} />}</div>\r\n </div>\r\n </Stack.Item>\r\n </Stack>\r\n </Accordion>\r\n <br />\r\n <Accordion\r\n isActive={isDisplayAdActive}\r\n onToggle={onToggleDisplayAd}\r\n id=\"adUnit-display-ad-selector\"\r\n label={formatMessage(messages.displayAd)}\r\n subContent={formatMessage(messages.displayAdSubContent)}\r\n wrapperClassName={classNames.adunitTypeAccordionWrapper}\r\n >\r\n <Stack enableScopedSelectors horizontal className={classNames.adunitTypeAccordionContentWrapper}>\r\n <Stack.Item className={classNames.adunitTypeLeftSection}>\r\n <MessageBar messageBarType={0} className={classNames.infoMsgBar}>\r\n <FormattedMessage\r\n {...messages.displayAdMsgBarContent}\r\n values={{\r\n displayAdMsgBarLink: <CMUIPopupArticleByIdAnchor query=\"ext07504\" name={formatMessage(messages.displayAdMsgBarLink)} />,\r\n }}\r\n />\r\n </MessageBar>\r\n </Stack.Item>\r\n <Stack.Item className={css(classNames.adunitTypeRightSection, classNames.adPreviewWrapper)}>\r\n <div className={classNames.adunitTypeDisplayAdPreviewHead}>\r\n <Text className={classNames.adunitTypeFormTitlePrimary} block role=\"heading\" aria-level={2}>\r\n {formatMessage(messages.adPreview)}\r\n </Text>\r\n <div className={classNames.adunitTypeDisplayAdPreviewHeadButtons}>\r\n <Pivot\r\n aria-label={formatMessage(messages.selectDisplayAdLayout)}\r\n linkSize=\"normal\"\r\n linkFormat=\"tabs\"\r\n onLinkClick={(a) => onDisaplayAdLayoutChange(a?.props.itemKey as TythonAdUnitDisplayAdTypeLayout)}\r\n selectedKey={displayAdLayout}\r\n >\r\n {Object.values(TythonAdUnitDisplayAdTypeLayout).map((layoutKey) => (\r\n <PivotItem\r\n headerText={formatMessage(\r\n messages[\r\n TythonAdUnitDisplayAdTypeLayoutLabel[\r\n Object.keys(TythonAdUnitDisplayAdTypeLayout)[\r\n Object.values(TythonAdUnitDisplayAdTypeLayout).indexOf(layoutKey)\r\n ]\r\n ]\r\n ]\r\n )}\r\n itemKey={layoutKey}\r\n />\r\n ))}\r\n </Pivot>\r\n </div>\r\n </div>\r\n <div>\r\n <div className={classNames.adunitTypeDisplayAdPreviewLayoutWrapper}>\r\n <div className={classNames.adunitTypeDisplayAdPreviewContainer}>\r\n <Text className={classNames.displayAdPreviewExampleTitle} block>\r\n {formatMessage(messages.displayAdPreviewExamplePrimaryTitle)}\r\n </Text>\r\n {displayAdLayout === TythonAdUnitDisplayAdTypeLayout.Horizontal && (\r\n <img src={HorizontalUpperAdPreview} alt={formatMessage(messages.adPreview)} />\r\n )}\r\n {displayAdLayout === TythonAdUnitDisplayAdTypeLayout.Square && (\r\n <img src={SquareLeftAdPreview} alt={formatMessage(messages.adPreview)} />\r\n )}\r\n {displayAdLayout === TythonAdUnitDisplayAdTypeLayout.Vertical && (\r\n <img src={VerticalLeftAdPreview} alt={formatMessage(messages.adPreview)} />\r\n )}\r\n </div>\r\n <div className={classNames.adunitTypeDisplayAdPreviewContainer}>\r\n <Text className={classNames.displayAdPreviewExampleTitle} block>\r\n {formatMessage(messages.displayAdPreviewExampleSecondaryTitle)}\r\n </Text>\r\n {displayAdLayout === TythonAdUnitDisplayAdTypeLayout.Horizontal && (\r\n <img src={HorizontalBottomAdPreview} alt={formatMessage(messages.adPreview)} />\r\n )}\r\n {displayAdLayout === TythonAdUnitDisplayAdTypeLayout.Square && (\r\n <img src={SquareBottomAdPreview} alt={formatMessage(messages.adPreview)} />\r\n )}\r\n {displayAdLayout === TythonAdUnitDisplayAdTypeLayout.Vertical && (\r\n <img\r\n className={classNames.verticalAdPreviewBottomWrapper}\r\n src={VerticalBottomAdPreview}\r\n alt={formatMessage(messages.adPreview)}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </Stack.Item>\r\n </Stack>\r\n </Accordion>\r\n <br />\r\n {shouldRenderNoSelectionMsg && !isLoading && (\r\n <MessageBar messageBarType={1} className={classNames.adunitTypeWarningMsgBar}>\r\n {formatMessage(messages.warningAdUnitTypeNotSelected)}\r\n </MessageBar>\r\n )}\r\n {shouldRenderFewerSelectionMsg && !isLoading && (\r\n <MessageBar messageBarType={5} className={classNames.adunitTypeWarningMsgBar}>\r\n {formatMessage(messages.warningAdUnitTypeNotFullySelected)}\r\n </MessageBar>\r\n )}\r\n <br />\r\n <br />\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nexport default AdUnitTypeSelector;\r\n","import { Log } from '../../../../../../logging/src';\r\nimport {\r\n InventoryPlatformType,\r\n NotificationLabel,\r\n NotificationSeverity,\r\n Property,\r\n Publisher,\r\n UserContext,\r\n listEntity,\r\n onNotificationCardAdded,\r\n} from '../../../../../@data';\r\nimport { PropertyServingConfigs } from '../../../../../@data/store/schema/models/ServingConfigs';\r\nimport notificationMessages from '../../../../../NotificationsPanel.Types.messages';\r\nimport { IPropertySitePickerItem } from '../../../../../layout/PropertySitePicker/PropertySitePicker.types';\r\nimport { setPropertyData } from '../../../Property/Manage/__data__/mutatorActions';\r\n\r\nexport const fetchProperties = async (\r\n publisher: Publisher,\r\n userContext?: UserContext,\r\n updateLoadingStatus?: (isLoading: boolean) => void\r\n) => {\r\n let data;\r\n updateLoadingStatus?.(true);\r\n try {\r\n const propertiesPromise = listEntity([publisher!], userContext, Property);\r\n const propertyConfigsPromise = listEntity([publisher], userContext, PropertyServingConfigs);\r\n const [properties, propertyConfigs] = await Promise.all([propertiesPromise, propertyConfigsPromise]);\r\n data = properties.filter(\r\n (p) => p.id && propertyConfigs.some((pc) => pc.propertyId === p.id && pc.inventoryPlatformType !== InventoryPlatformType.UWP)\r\n );\r\n } catch (e) {\r\n onNotificationCardAdded({\r\n // tslint:disable-next-line: no-any\r\n severity: NotificationSeverity.Error,\r\n titleMessageDescriptor: notificationMessages.LoadingSitesFailedTitle,\r\n contentMessageDescriptor: notificationMessages.LoadingSitesFailedContent,\r\n notificationLabel: NotificationLabel.LoadingSitesFailed,\r\n });\r\n Log.error(`properties failed to fetch ${e}`);\r\n } finally {\r\n updateLoadingStatus?.(false);\r\n if (!data) {\r\n return [];\r\n }\r\n Log.info('Properties fetched in ad unit builder form');\r\n setPropertyData(data);\r\n return data;\r\n }\r\n};\r\n\r\nexport const propertySerializer = (properties: Property[]): IPropertySitePickerItem[] => properties.map((p) => ({ id: p.id, url: p.url }));\r\n","import { Property } from '../../../../../@data';\r\n\r\nexport const getSiteSelectionSummary = (properties: Property[], propertyId?: number): string | undefined => {\r\n if (!propertyId) {\r\n return undefined;\r\n }\r\n\r\n const property = properties.find((p) => p.id === propertyId);\r\n\r\n return property ? `${property.id} - ${property.url}` : undefined;\r\n};\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { InjectedIntl } from 'react-intl';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { Publisher, TythonAdUnit, TythonAdUnitServingConfig, UserContext, listEntity, onNotificationChanged } from '../../../../../@data';\r\nimport messages from '../CreateAdunit/messages';\r\n\r\nexport const fetchTythonAdUnitById = async (\r\n publisher: Publisher,\r\n userContext: UserContext,\r\n id: string,\r\n formatMessage: InjectedIntl['formatMessage'],\r\n updateLoadingStatus?: (isLoading: boolean) => void\r\n): Promise<TythonAdUnitServingConfig> => {\r\n updateLoadingStatus?.(true);\r\n try {\r\n // Instantiate a new TythonAdUnit and assign the id\r\n const adUnit = new TythonAdUnit(id);\r\n adUnit.className = `adunits`;\r\n // Construct the URL parameters\r\n const urlParams = new URLSearchParams([['extendedinfo', 'true']]);\r\n\r\n // Call listEntity with the publisher and AdUnit models, passing `undefined` for the `entity` parameter\r\n const data = await listEntity([publisher, adUnit], userContext, TythonAdUnit, urlParams);\r\n\r\n updateLoadingStatus?.(false);\r\n\r\n return (data as unknown) as TythonAdUnitServingConfig;\r\n } catch (e) {\r\n updateLoadingStatus?.(false);\r\n onNotificationChanged({ messageBarType: MessageBarType.error, text: formatMessage(messages.failedLoadAdUnitNotification) });\r\n Log.error(`Load tython adunit by id(${id}) failed - ${e}`);\r\n return Promise.reject();\r\n }\r\n};\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { InjectedIntl } from 'react-intl';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport {\r\n AdUnit,\r\n ClarityType,\r\n IAppState,\r\n Property,\r\n TythonAdUnitServingConfig,\r\n listEntity,\r\n onNotificationChanged,\r\n} from '../../../../../@data';\r\nimport { useStateWithLatestCallback } from '../../../../../hooks';\r\nimport { IGoogleAdSenseViewState } from '../../../Account/Settings/components/GoogleConnector/@data';\r\nimport { onInitializeGoogleAccount as fetchAdSenseAccountStatus } from '../../../Account/Settings/components/GoogleConnector/@data/actions';\r\nimport { fetchPropertyById } from '../../../Property/@data/services/PropertyService';\r\nimport { createProperty as createPropertyService } from '../../../Property/Create/variations/CreateTythonProperty/__data__/services/createProperty';\r\nimport { fetchAdunitMediationStatus } from '../../@data/services/AdunitService';\r\nimport { IAdunitViewState } from '../../@data/store/schema/IAdunitViewState';\r\nimport messages from '../../Create/CreateAdunit.messages';\r\nimport { fetchProperties } from '../services/loadProperties';\r\nimport { fetchTythonAdUnitById } from '../services/loadTythonAdUnitById';\r\nimport {\r\n DEFAULT_AD_PREVIEW_BACKGROUND_COLOR,\r\n DEFAULT_AD_PREVIEW_BUTTON_BACKGROUND_COLOR,\r\n DEFAULT_AD_PREVIEW_FONT,\r\n DEFAULT_AD_PREVIEW_TITLE_BACKGROUND_COLOR,\r\n TythonAdTypes,\r\n} from './constants';\r\nimport { AdTypes, ITythonAdUnit, NativeAdProperties } from './types';\r\n\r\nexport type UseAdUnitData = ({\r\n appStore,\r\n googleAdsenseStore,\r\n onPropertyCreated,\r\n formatMessage,\r\n}: {\r\n appStore: IAppState;\r\n googleAdsenseStore: IGoogleAdSenseViewState;\r\n onPropertyCreated: () => void;\r\n adUnitsStore: IAdunitViewState;\r\n formatMessage: InjectedIntl['formatMessage'];\r\n}) => {\r\n properties: Property[];\r\n isPropertyLoading: boolean;\r\n isPropertySaving: boolean;\r\n getActiveAdunit: () => ITythonAdUnit | undefined;\r\n activeAdunit: ITythonAdUnit | undefined;\r\n setActiveAdunit: (adunit: ITythonAdUnit | undefined) => void;\r\n createProperty: (property: { url: string; name: string; clarityType?: ClarityType; clarityId?: string }) => void;\r\n isAdUnitSaving: boolean;\r\n isValidAdUnit: boolean;\r\n isAdUnitLoading: boolean;\r\n isAdUnitMediationLoading: boolean;\r\n initialAdUnit: ITythonAdUnit | undefined;\r\n setIsAdUnitSaving: (isLoading: boolean) => void;\r\n isAdUnitInitialized: boolean;\r\n};\r\n\r\nconst extractAdUnitId = (url: string): string | null => {\r\n const regex = /\\/adunit\\/edit\\/(\\d+)/;\r\n const match = url.match(regex);\r\n return match ? match[1] : null;\r\n};\r\n\r\nexport const convertToTythonAdUnitViewState = (data: TythonAdUnitServingConfig): ITythonAdUnit => ({\r\n id: data.adUnitId,\r\n accountId: data.accountId,\r\n propertyId: data.propertyId,\r\n name: data.adUnitName,\r\n adTypes: data.adTypes as AdTypes,\r\n nativeProperties: data.nativeProperties as NativeAdProperties,\r\n mediationEnabled: false, // this field is not present in your mock data\r\n raw: data as { id?: number },\r\n});\r\n\r\nexport const getLargestAdUnitNumber = (arr: string[]): number => {\r\n let max = arr.length + 1; // Initialize to length of array + 1\r\n\r\n arr.forEach((str) => {\r\n const match = str.match(/^Ad Unit (\\d+)$/); // The regex now ensures that only numbers follow \"Ad Unit \"\r\n if (match && match[1]) {\r\n const num = parseInt(match[1], 10) + 1;\r\n max = Math.max(max, num);\r\n }\r\n });\r\n return max;\r\n};\r\n\r\n/**\r\n * This hook mainly provides data and render state for ad unit form, it will take appStore and\r\n * goggleAdsenseStore to understand ad unit creation page render behavior\r\n */\r\nconst useAdUnitData: UseAdUnitData = ({ appStore, googleAdsenseStore, onPropertyCreated, adUnitsStore, formatMessage }) => {\r\n const [properties, setProperties] = useState<Property[]>([]);\r\n const [isPropertyLoading, setIsPropertyLoading] = useState<boolean>(false);\r\n const [isPropertySaving, setIsPropertySaving] = useState<boolean>(false);\r\n const [isAdUnitLoading, setIsAdUnitLoading] = useState<boolean>(false);\r\n const [isAdUnitMediationLoading, setIsAdUnitMediationLoading] = useState<boolean>(false);\r\n const [isAdUnitSaving, setIsAdUnitSaving] = useState<boolean>(false);\r\n const isPropertyLoadHandled = useRef<boolean>(false);\r\n const isAdUnitLoadHandled = useRef<boolean>(false);\r\n const isMediationLoadHandled = useRef<boolean>(false);\r\n const [activeAdunit, setActiveAdunit, getActiveAdunit] = useStateWithLatestCallback<ITythonAdUnit | undefined>(undefined);\r\n const initialAdUnit = useRef<ITythonAdUnit | undefined>(undefined);\r\n const { publisher, userContext, account } = appStore;\r\n const { adUnitsRaw } = adUnitsStore;\r\n const shouldFetchProperties = useMemo(() => publisher && !isPropertyLoadHandled.current, [publisher]);\r\n const isCreatingNewAdUnit = window?.location?.href.includes('adunit/create');\r\n const isValidAdUnit = useMemo<boolean>(() => !!(activeAdunit?.adTypes?.length && activeAdunit.name && activeAdunit.propertyId), [\r\n activeAdunit,\r\n ]);\r\n const existingAdUnitId = extractAdUnitId(window?.location?.href);\r\n /**\r\n * fetch mediation status per ad unit\r\n * when\r\n * - user editing an existing ad unit\r\n * - user level mediation is enabled at account setting page\r\n * - ad unit is fetched and id is ready to use\r\n * - publisher and account are both loaded from appStore\r\n */\r\n const shouldFetchAdUnitMediationStatus = useMemo(\r\n () => googleAdsenseStore.active?.isMediationEnabled && publisher && account && activeAdunit?.id && !isMediationLoadHandled.current,\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [googleAdsenseStore.active?.isMediationEnabled, publisher, account, activeAdunit]\r\n );\r\n\r\n /**\r\n * dependency value to initialize page during creation experience\r\n */\r\n const shouldInitializeHookOnCreation = useMemo(\r\n () => isCreatingNewAdUnit && userContext && publisher && account?.id && !isAdUnitLoadHandled.current,\r\n [isCreatingNewAdUnit, userContext, publisher, account]\r\n );\r\n\r\n /**\r\n * dependency value to initialize page during edition experience\r\n */\r\n const shouldInitializeHookOnEdition = useMemo(() => existingAdUnitId && userContext && publisher && !isAdUnitLoadHandled.current, [\r\n existingAdUnitId,\r\n userContext,\r\n publisher,\r\n ]);\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n const data = await fetchProperties(publisher!, userContext, setIsPropertyLoading);\r\n setProperties(data);\r\n };\r\n\r\n fetchData();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [shouldFetchProperties]);\r\n\r\n useEffect(() => {\r\n fetchAdSenseAccountStatus(true, false);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (shouldFetchAdUnitMediationStatus) {\r\n const fetchData = async () => {\r\n setIsAdUnitMediationLoading(true);\r\n const data = await fetchAdunitMediationStatus(publisher!, account!, `${activeAdunit?.id}`);\r\n const isAdUnitMediationEnabled = data?.[0]?.mediationStatus;\r\n initialAdUnit.current = { ...initialAdUnit.current!, mediationEnabled: isAdUnitMediationEnabled };\r\n setActiveAdunit({ ...getActiveAdunit()!, mediationEnabled: isAdUnitMediationEnabled });\r\n setIsAdUnitMediationLoading(false);\r\n isMediationLoadHandled.current = true;\r\n };\r\n fetchData();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [shouldFetchAdUnitMediationStatus]);\r\n\r\n useEffect(() => {\r\n const generateNewAdUnitName = async () => {\r\n let newAdunitName = '';\r\n try {\r\n let data;\r\n if (adUnitsRaw.data !== undefined) {\r\n data = adUnitsRaw.data;\r\n } else {\r\n const params = new URLSearchParams([['extendedInfo', 'true']]);\r\n data = await listEntity([publisher!, account!], userContext, AdUnit, params);\r\n }\r\n newAdunitName = data?.length\r\n ? formatMessage(messages.defaultAdUnitName, { number: getLargestAdUnitNumber(data.map((d) => d.name)) })\r\n : '';\r\n } catch (e) {\r\n Log.error(`Fetch Ad Unit failed, ${e}`);\r\n }\r\n return newAdunitName;\r\n };\r\n\r\n const initializeDefaultAdUnit = async () => {\r\n if (shouldInitializeHookOnCreation) {\r\n const newAdunitName = await generateNewAdUnitName();\r\n setActiveAdunit({\r\n name: newAdunitName,\r\n adTypes: [TythonAdTypes.Native, TythonAdTypes.Display],\r\n mediationEnabled: false,\r\n nativeProperties: {\r\n fontFamily: DEFAULT_AD_PREVIEW_FONT,\r\n background: DEFAULT_AD_PREVIEW_BACKGROUND_COLOR,\r\n buttonBackground: DEFAULT_AD_PREVIEW_BUTTON_BACKGROUND_COLOR,\r\n titleColor: DEFAULT_AD_PREVIEW_TITLE_BACKGROUND_COLOR,\r\n },\r\n });\r\n isAdUnitLoadHandled.current = true;\r\n }\r\n };\r\n\r\n initializeDefaultAdUnit();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [shouldInitializeHookOnCreation]);\r\n\r\n useEffect(() => {\r\n if (shouldInitializeHookOnEdition) {\r\n // load adunit\r\n const fetchAdUnit = async () => {\r\n const data = await fetchTythonAdUnitById(publisher!, userContext!, existingAdUnitId!, formatMessage, setIsAdUnitLoading);\r\n const fetchedAdUnit = convertToTythonAdUnitViewState(data);\r\n initialAdUnit.current = fetchedAdUnit;\r\n setActiveAdunit(fetchedAdUnit);\r\n isAdUnitLoadHandled.current = true;\r\n };\r\n fetchAdUnit();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [shouldInitializeHookOnEdition]);\r\n\r\n const createProperty = async (property: { url: string; name: string; clarityType?: ClarityType; clarityId?: string }) => {\r\n const res = await createPropertyService(publisher!, property, formatMessage, userContext, setIsPropertySaving);\r\n if (res?.id) {\r\n /**\r\n * close the property panel in ad unit creation page and\r\n * render loading experience to fetch latest properties\r\n */\r\n onPropertyCreated();\r\n try {\r\n const newProperty = await fetchPropertyById(publisher!, res.id, userContext, setIsPropertyLoading);\r\n setProperties([newProperty, ...properties]);\r\n } catch (e) {\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n textMessageDescriptor: messages.loadPropertyFailedInAdunit,\r\n });\r\n }\r\n }\r\n };\r\n\r\n return {\r\n properties,\r\n isPropertyLoading,\r\n isPropertySaving,\r\n activeAdunit,\r\n initialAdUnit: initialAdUnit.current,\r\n isValidAdUnit,\r\n isAdUnitMediationLoading,\r\n isAdUnitSaving,\r\n isAdUnitLoading,\r\n isAdUnitInitialized: isAdUnitLoadHandled.current,\r\n setIsAdUnitSaving,\r\n setActiveAdunit,\r\n getActiveAdunit,\r\n createProperty,\r\n setIsAdUnitLoading,\r\n };\r\n};\r\n\r\nexport default useAdUnitData;\r\n","import { InjectedIntl } from 'react-intl';\r\nimport {\r\n ApiError,\r\n ClarityType,\r\n Property,\r\n PropertyApprovalStatus,\r\n Publisher,\r\n UserContext,\r\n postEntity,\r\n showErrorToastNotification,\r\n showSuccessToastNotification,\r\n} from '../../../../../../../../@data';\r\nimport PropertyMessages from '../../../../../Property.messages';\r\nimport { onSettingClarityErrorMessage } from '../../../../__data__/mutatorActions';\r\nimport messages from '../../messages';\r\n\r\nexport const createProperty = async (\r\n publisher: Publisher,\r\n property: { url?: string; name?: string; clarityType?: ClarityType; clarityId?: string },\r\n formatMessage: InjectedIntl['formatMessage'],\r\n userContext?: UserContext,\r\n updateLoadingStatus?: (isLoading: boolean) => void\r\n) => {\r\n const body = {\r\n publisherId: publisher.id,\r\n approvalStatus: PropertyApprovalStatus.Approved, // always approved for tython flow\r\n url: property.url,\r\n name: property.name,\r\n approvalStatusComments: '',\r\n className: 'properties',\r\n associatedAdUnitIds: [],\r\n apiPath: undefined,\r\n clarityType: property.clarityType !== ClarityType.None ? property.clarityType : undefined,\r\n clarityProjectIdForTython: property.clarityType === ClarityType.None ? property.clarityId : undefined,\r\n };\r\n\r\n let data;\r\n try {\r\n updateLoadingStatus?.(true);\r\n\r\n data = await postEntity([publisher], Property, (body as unknown) as Property, userContext);\r\n showSuccessToastNotification({ text: formatMessage(messages.createPropertySuccessNotification, { entityId: data.id }) });\r\n } catch (e) {\r\n const getClarityErrorMessage = (e: ApiError) => {\r\n if (e.code === 404) {\r\n return formatMessage(messages.clarityProjectDoesNotExistNotification);\r\n } else {\r\n return e.message.split(`description\":\"`)[1].split(`\"`)[0];\r\n }\r\n };\r\n\r\n const apiErrorObj = e as ApiError;\r\n if (apiErrorObj.code === 404) {\r\n onSettingClarityErrorMessage(getClarityErrorMessage(apiErrorObj));\r\n } else {\r\n onSettingClarityErrorMessage(getClarityErrorMessage(apiErrorObj));\r\n }\r\n showErrorToastNotification({ textMessageDescriptor: PropertyMessages.propertyCreateFailed });\r\n } finally {\r\n updateLoadingStatus?.(false);\r\n }\r\n return data;\r\n};\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport {\r\n Account,\r\n NotificationLabel,\r\n NotificationSeverity,\r\n Publisher,\r\n TythonAdUnit,\r\n UserContext,\r\n buildRequestHeadersWithAuthToken,\r\n constructUrl,\r\n onNotificationCardAdded,\r\n onNotificationChanged,\r\n showErrorToastNotification,\r\n} from '../../../../../@data';\r\nimport notificationMessages from '../../../../../NotificationsPanel.Types.messages';\r\nimport messages from '../../Manage/ManagePage.messages';\r\nimport { ITythonAdUnit } from '../CreateAdunit/types';\r\n\r\nexport const createTythonAdUnit = async (\r\n publisher: Publisher,\r\n userContext: UserContext,\r\n account: Account,\r\n adunit: ITythonAdUnit,\r\n updateLoadingStatus?: (isLoading: boolean) => void\r\n): Promise<TythonAdUnit> => {\r\n updateLoadingStatus?.(true);\r\n const adUnit = new TythonAdUnit();\r\n adUnit.className = 'adunits';\r\n\r\n const body = {\r\n servingConfig: {\r\n adUnitName: adunit.name,\r\n adUnitId: adunit.id,\r\n accountId: account.id,\r\n propertyId: adunit.propertyId,\r\n adTypes: adunit.adTypes,\r\n nativeProperties: adunit.nativeProperties,\r\n servingStatus: 'Serving',\r\n enablebCat: false,\r\n bCat: [],\r\n xCat: [],\r\n enablebAdv: false,\r\n bAdv: [],\r\n },\r\n };\r\n\r\n const requestUrl = constructUrl([publisher, adUnit], undefined, undefined, undefined, 'servingConfig');\r\n const headers = await buildRequestHeadersWithAuthToken(requestUrl, userContext);\r\n\r\n try {\r\n const response = await fetch(requestUrl, {\r\n method: 'POST',\r\n body: JSON.stringify(body),\r\n headers: headers,\r\n });\r\n\r\n if (!response.ok) {\r\n const resRaw = await response.json();\r\n showErrorToastNotification({\r\n text: `Save Ad Unit Failed, ${\r\n resRaw?.errors?.[0]?.description ?? response.statusText\r\n }. Please find more details in the notification center.`,\r\n });\r\n onNotificationCardAdded({\r\n // tslint:disable-next-line: no-any\r\n severity: NotificationSeverity.Error,\r\n titleMessageDescriptor: notificationMessages.CreateTythonAdUnitFailedTitle,\r\n content: `Error code: ${resRaw?.errors?.[0]?.code ?? response.status}; Error status: ${\r\n resRaw?.errors?.[0]?.description ?? response.statusText\r\n }`,\r\n notificationLabel: NotificationLabel.CreateTythonAdUnitFailed,\r\n });\r\n updateLoadingStatus?.(false);\r\n Log.error(`create ad unit failed: ${response.status} ${response.statusText}`);\r\n return Promise.reject();\r\n }\r\n\r\n const data: TythonAdUnit = await response.json();\r\n updateLoadingStatus?.(false);\r\n return Promise.resolve(data);\r\n } catch (e) {\r\n updateLoadingStatus?.(false);\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n textMessageDescriptor: messages.createAdunitFailed,\r\n });\r\n Log.error(e);\r\n return Promise.reject();\r\n }\r\n};\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport {\r\n AdSenseAdUnitStatus,\r\n AdSenseConnectAdUnit,\r\n onNotificationChanged,\r\n postEntity,\r\n showSuccessToastNotification,\r\n} from '../../../../../@data';\r\nimport { onAdunitMediationUpdateEnd, onAdunitMediationUpdateStart } from '../../@data/actions';\r\nimport { updateAdUnitGrid } from '../../@data/services/AdunitService';\r\nimport messages from '../CreateAdunit/messages';\r\n\r\nconst adUnitNotConnectedStatus: AdSenseAdUnitStatus = {\r\n apiPath: 'preauth/mediation',\r\n className: 'getAdUnitMediationStatus',\r\n mediationStatus: false,\r\n};\r\n\r\nexport const enableTythonAdUnitMediation = async (ids: number[], onRequestSuccess?: () => void): Promise<AdSenseAdUnitStatus> => {\r\n const request: AdSenseConnectAdUnit = {\r\n apiPath: 'preauth/mediation',\r\n className: 'pubcenterAdUnitsIds',\r\n pubcenterAdUnitIds: ids,\r\n };\r\n const urlParamsConnect = new URLSearchParams();\r\n urlParamsConnect.append('routeSuffix', 'api/mediation/admanager/setupAdUnitMediation');\r\n try {\r\n onAdunitMediationUpdateStart(ids);\r\n const response = await postEntity([], AdSenseConnectAdUnit, request, undefined, urlParamsConnect, undefined);\r\n if (!response) {\r\n onNotificationChanged({ messageBarType: MessageBarType.error, textMessageDescriptor: messages.settingUpAdunitMediationFailed });\r\n return adUnitNotConnectedStatus;\r\n } else {\r\n showSuccessToastNotification({ textMessageDescriptor: messages.settingUpAdunitMediationSuccess });\r\n // only 1 ad unit will be updated for mediation, so first one in the array is the source of truth\r\n updateAdUnitGrid(ids[0], true, true);\r\n onRequestSuccess?.();\r\n return response;\r\n }\r\n } catch {\r\n return adUnitNotConnectedStatus;\r\n } finally {\r\n onAdunitMediationUpdateEnd(ids);\r\n }\r\n};\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport {\r\n Publisher,\r\n TythonAdUnit,\r\n UserContext,\r\n buildRequestHeadersWithAuthToken,\r\n constructUrl,\r\n onNotificationChanged,\r\n} from '../../../../../@data';\r\nimport { deepEqual } from '../../../../../utils';\r\nimport messages from '../CreateAdunit/messages';\r\nimport { ITythonAdUnit } from '../CreateAdunit/types';\r\n\r\nexport const updateTythonAdUnit = async (\r\n publisher: Publisher,\r\n userContext: UserContext,\r\n adunit: ITythonAdUnit,\r\n isAdUnitNameUpdated: boolean,\r\n updateLoadingStatus?: (isLoading: boolean) => void\r\n): Promise<TythonAdUnit | { isDirty?: boolean }> => {\r\n updateLoadingStatus?.(true);\r\n const adUnit = new TythonAdUnit(adunit.id);\r\n adUnit.className = 'adunits';\r\n const urlParams = new URLSearchParams();\r\n urlParams.append('extendedinfo', 'true');\r\n\r\n const body = {\r\n servingConfig: {\r\n ...(adunit.raw! as ITythonAdUnit),\r\n adUnitName: adunit.name,\r\n adUnitId: adunit.id,\r\n accountId: adunit.accountId,\r\n propertyId: adunit.propertyId,\r\n adTypes: adunit.adTypes,\r\n nativeProperties: adunit.nativeProperties,\r\n },\r\n };\r\n\r\n const isMadeNoChange = deepEqual(adunit.raw!, { ...body.servingConfig, adUnitName: adunit.name }, true);\r\n\r\n if (isMadeNoChange) {\r\n updateLoadingStatus?.(false);\r\n return Promise.resolve({ isDirty: false });\r\n }\r\n /**\r\n * if there is no update to ad unit name, we will delete the name\r\n * property in the payload for backend perf enhancement\r\n */\r\n if (!isAdUnitNameUpdated) {\r\n delete body.servingConfig.adUnitName;\r\n }\r\n\r\n const requestUrl = constructUrl([publisher, adUnit], undefined, urlParams, undefined, 'servingConfig');\r\n const headers = await buildRequestHeadersWithAuthToken(requestUrl, userContext);\r\n\r\n try {\r\n const response = await fetch(requestUrl, {\r\n method: 'PUT',\r\n body: JSON.stringify(body),\r\n headers: headers,\r\n });\r\n\r\n if (!response.ok) {\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n text: `Update ad unit failed: ${response.status} ${response.statusText}`,\r\n });\r\n updateLoadingStatus?.(false);\r\n Log.error(`Update ad unit failed: ${response.status} ${response.statusText}`);\r\n return Promise.reject();\r\n }\r\n\r\n const data: TythonAdUnit = await response.json();\r\n updateLoadingStatus?.(false);\r\n return Promise.resolve(data);\r\n } catch (e) {\r\n updateLoadingStatus?.(false);\r\n onNotificationChanged({ messageBarType: MessageBarType.error, textMessageDescriptor: messages.updateAdunitFailed });\r\n Log.error(e);\r\n return Promise.reject();\r\n }\r\n};\r\n","import { useCallback } from 'react';\r\nimport { InjectedIntl } from 'react-intl';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport {\r\n ClarityType,\r\n IAppState,\r\n NotificationLabel,\r\n NotificationSeverity,\r\n Property,\r\n onNotificationCardAdded,\r\n showErrorToastNotification,\r\n showSuccessToastNotification,\r\n} from '../../../../../@data';\r\nimport notificationMessages from '../../../../../NotificationsPanel.Types.messages';\r\nimport { IPropertySitePickerItem } from '../../../../../layout/PropertySitePicker/PropertySitePicker.types';\r\nimport { getTythonAdsManageRoute } from '../../../../../utils/routeUtils';\r\nimport { IGoogleAdSenseViewState } from '../../../Account/Settings/components/GoogleConnector/@data';\r\nimport { isFormValid } from '../../../Property/Create/variations/CreateTythonProperty/utils/validateForm';\r\nimport { createTythonAdUnit } from '../services/createTythonAdUnit';\r\nimport { disableTythonAdUnitMediation } from '../services/disableTythonAdUnitMediation';\r\nimport { enableTythonAdUnitMediation } from '../services/enableTythonAdUnitMediation';\r\nimport { updateTythonAdUnit } from '../services/updateTythonAdUnit';\r\nimport messages from './messages';\r\nimport { AdTypes, ITythonAdUnit, NativeAdProperties } from './types';\r\n\r\ntype UseAdunitEventHandlersProps = {\r\n getActiveAdunit: () => ITythonAdUnit | undefined;\r\n setActiveAdunit: (adUnit: ITythonAdUnit) => void;\r\n setIsAdUnitSaving: (isSaving: boolean) => void;\r\n createProperty: (property: { url: string; name: string; clarityType?: ClarityType; clarityId?: string }) => void;\r\n activeNewPropertyCreation: () => void;\r\n activeScriptView: () => void;\r\n formatMessage: InjectedIntl['formatMessage'];\r\n appStore: IAppState;\r\n googleAdsenseStore: IGoogleAdSenseViewState;\r\n initialAdUnit: ITythonAdUnit | undefined;\r\n routeProps: RouteComponentProps;\r\n properties: Property[];\r\n deActiveNewPropertyCreation: () => void;\r\n};\r\n\r\nconst useAdunitEventHandlers = ({\r\n getActiveAdunit,\r\n setActiveAdunit,\r\n createProperty,\r\n activeNewPropertyCreation,\r\n setIsAdUnitSaving,\r\n activeScriptView,\r\n deActiveNewPropertyCreation,\r\n formatMessage,\r\n appStore,\r\n googleAdsenseStore,\r\n initialAdUnit,\r\n routeProps,\r\n properties,\r\n}: UseAdunitEventHandlersProps) => {\r\n const onRedirectBackToAdUnitManagePage = useCallback(() => {\r\n const { publisher, account } = appStore;\r\n if (!publisher || !account) {\r\n return;\r\n }\r\n routeProps.history.push(getTythonAdsManageRoute());\r\n }, [appStore, routeProps.history]);\r\n\r\n const onAdunitNameChange = useCallback(\r\n (_, value: string) => {\r\n const currentActiveAdunit = getActiveAdunit();\r\n setActiveAdunit({ ...currentActiveAdunit, name: value } as ITythonAdUnit);\r\n },\r\n [getActiveAdunit, setActiveAdunit]\r\n );\r\n\r\n const onAdunitTypeChange = useCallback(\r\n ({ adTypes, nativeProperties }: { adTypes?: AdTypes; nativeProperties?: NativeAdProperties }) => {\r\n const currentActiveAdunit = getActiveAdunit();\r\n setActiveAdunit({\r\n ...currentActiveAdunit,\r\n ...(adTypes ? { adTypes: adTypes } : {}),\r\n ...(nativeProperties ? { nativeProperties: nativeProperties } : {}),\r\n } as ITythonAdUnit);\r\n },\r\n [getActiveAdunit, setActiveAdunit]\r\n );\r\n\r\n const onAdunitMediationChange = useCallback(\r\n (active: boolean) => {\r\n const currentActiveAdunit = getActiveAdunit();\r\n setActiveAdunit({ ...currentActiveAdunit, mediationEnabled: active } as ITythonAdUnit);\r\n },\r\n [getActiveAdunit, setActiveAdunit]\r\n );\r\n\r\n const onAddSiteClick = useCallback(() => {\r\n activeNewPropertyCreation();\r\n }, [activeNewPropertyCreation]);\r\n\r\n const onSiteChange = useCallback(\r\n (item: IPropertySitePickerItem) => {\r\n const currentActiveAdunit = getActiveAdunit();\r\n setActiveAdunit({ ...currentActiveAdunit, propertyId: item.id } as ITythonAdUnit);\r\n },\r\n [getActiveAdunit, setActiveAdunit]\r\n );\r\n\r\n const onCreatingNewProperty = useCallback(\r\n async ({ name, url, clarityType, clarityId }: { name: string; url: string; clarityType?: ClarityType; clarityId?: string }) => {\r\n const isValid = await isFormValid(properties, false, undefined);\r\n if (!isValid) {\r\n showErrorToastNotification({ text: formatMessage(messages.duplicatedSiteCreationErrorToastNotification) });\r\n onNotificationCardAdded({\r\n // tslint:disable-next-line: no-any\r\n severity: NotificationSeverity.Error,\r\n title: formatMessage(notificationMessages.DuplicatedSiteCreationErrorNotificationTitle),\r\n content: formatMessage(notificationMessages.DuplicatedSiteCreationErrorNotificationContent, { name: name, url: url }),\r\n intlContentMessageValues: { name: name, url: url },\r\n notificationLabel: NotificationLabel.DuplicatedSiteCreationErrorNotification,\r\n });\r\n return;\r\n }\r\n await createProperty({ name, url, clarityType, clarityId });\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [createProperty, properties]\r\n );\r\n\r\n const onAdUnitSubmit = useCallback(async () => {\r\n const isCreatingNewAdUnit = window?.location?.href.includes('adunit/create');\r\n const activeAdunit = getActiveAdunit();\r\n const { publisher, userContext, account } = appStore;\r\n\r\n if (!publisher || !userContext || !account || !activeAdunit) {\r\n return;\r\n }\r\n\r\n if (isCreatingNewAdUnit) {\r\n await createTythonAdUnit(publisher, userContext, account, activeAdunit, setIsAdUnitSaving).then((data) => {\r\n Log.info(`create tython ad unit success ${JSON.stringify(data)}`);\r\n const currentActiveAdunit = getActiveAdunit()!;\r\n const newAdUnitId = data.data.servingConfig?.adUnitId!;\r\n showSuccessToastNotification({ text: formatMessage(messages.createAdUnitSuccessNotification, { adunitId: newAdUnitId }) });\r\n setActiveAdunit({ ...currentActiveAdunit, id: newAdUnitId });\r\n if (activeAdunit.mediationEnabled) {\r\n enableTythonAdUnitMediation([newAdUnitId]);\r\n }\r\n activeScriptView();\r\n });\r\n } else {\r\n await updateTythonAdUnit(publisher, userContext, activeAdunit, initialAdUnit?.name !== activeAdunit.name, setIsAdUnitSaving).then(\r\n (data) => {\r\n if (data && (data as { isDirty?: boolean }).isDirty === false) {\r\n activeScriptView();\r\n return;\r\n }\r\n Log.info(`update tython ad unit success ${JSON.stringify(data)}`);\r\n /**\r\n * update mediation if save ad unit success\r\n */\r\n if (activeAdunit.mediationEnabled !== initialAdUnit?.mediationEnabled) {\r\n activeAdunit.mediationEnabled && enableTythonAdUnitMediation([activeAdunit.id!]);\r\n !activeAdunit.mediationEnabled && disableTythonAdUnitMediation([activeAdunit.id!]);\r\n }\r\n showSuccessToastNotification({ text: formatMessage(messages.editAdUnitSuccessNotification, { adunitId: activeAdunit.id }) });\r\n activeScriptView();\r\n }\r\n );\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [getActiveAdunit, appStore, googleAdsenseStore, initialAdUnit]);\r\n\r\n return {\r\n onAdunitNameChange,\r\n onAdunitTypeChange,\r\n onAdUnitSubmit,\r\n onAdunitMediationChange,\r\n onAddSiteClick,\r\n onSiteChange,\r\n onCreatingNewProperty,\r\n onRedirectBackToAdUnitManagePage,\r\n };\r\n};\r\n\r\nexport default useAdunitEventHandlers;\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport {\r\n AdSenseAdUnitStatus,\r\n AdSenseDisconnectAdUnit,\r\n deleteEntity,\r\n onNotificationChanged,\r\n showSuccessToastNotification,\r\n} from '../../../../../@data';\r\nimport { onAdunitMediationUpdateEnd, onAdunitMediationUpdateStart } from '../../@data/actions';\r\nimport { updateAdUnitGrid } from '../../@data/services/AdunitService';\r\nimport messages from '../CreateAdunit/messages';\r\n\r\nexport const disableTythonAdUnitMediation = async (ids: number[], onRequestStart?: () => void): Promise<AdSenseAdUnitStatus[]> => {\r\n const request: AdSenseDisconnectAdUnit = {\r\n apiPath: 'preauth/mediation',\r\n className: 'pubcenterAdUnitsIds',\r\n pubcenterAdUnitIds: ids,\r\n };\r\n const urlParams = new URLSearchParams();\r\n urlParams.append('routeSuffix', 'api/mediation/admanager/decommissionAdUnitMediation');\r\n try {\r\n onRequestStart?.();\r\n onAdunitMediationUpdateStart(ids);\r\n const response = (await deleteEntity(\r\n [],\r\n AdSenseDisconnectAdUnit,\r\n undefined,\r\n urlParams,\r\n undefined,\r\n request\r\n )) as AdSenseDisconnectAdUnit[];\r\n if (!response) {\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n textMessageDescriptor: messages.removingAdunitMediationFailed,\r\n });\r\n return [];\r\n } else {\r\n showSuccessToastNotification({ textMessageDescriptor: messages.removingAdunitMediationSuccess });\r\n // only 1 ad unit will be updated for mediation, so first one in the array is the source of truth\r\n updateAdUnitGrid(ids[0], false, true);\r\n return response;\r\n }\r\n } catch {\r\n return [];\r\n } finally {\r\n onAdunitMediationUpdateEnd(ids);\r\n }\r\n};\r\n","import { useBoolean } from '@fluentui/react-hooks';\r\nimport { useMemo } from 'react';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\nimport messages from '../../Create/CreateAdunit.messages';\r\nimport { IAdUnitMediationSelectorProps } from '../components/AdUnitMediationSelector';\r\nimport { IAdUnitNameInputFieldProps } from '../components/AdUnitNameInput';\r\nimport { IAdUnitSiteSelectorProps } from '../components/AdUnitSiteSelector';\r\nimport { IAdUnitTypeSelectorProps } from '../components/AdUnitTypeSelector';\r\nimport { IScriptPageProps } from '../components/ScriptPage/ScriptPage.types';\r\nimport { propertySerializer } from '../services/loadProperties';\r\nimport { getSiteSelectionSummary } from '../services/utils';\r\nimport { AdTypes, NativeAdProperties, TythonAdUnitDetailPageProps, UseCreateTythonAdunitRenderControl } from './types';\r\nimport useAdUnitData from './useAdUnitData';\r\nimport useAdunitEventHandlers from './useAdUnitEventHandlers';\r\n\r\n/**\r\n * This is the hook to serve components render behavior in ad unit creation flow for tython experience\r\n * it will take satcheljs store values as props to compose props for adunit builder form components.\r\n * Please see @type UseCreateTythonAdunitRenderControl for hook usages\r\n */\r\nconst useCreateTythonAdunitRenderControl: UseCreateTythonAdunitRenderControl = ({\r\n appStore,\r\n googleAdsenseStore,\r\n mode,\r\n routeProps,\r\n intl,\r\n adUnitsStore,\r\n}) => {\r\n const { formatMessage } = intl ?? {};\r\n const isEditing = !window?.location?.href.includes('adunit/create');\r\n const [isScriptViewActive, { setTrue: activeScriptView }] = useBoolean(false);\r\n const [isPropertyPanelActive, { setTrue: activeNewPropertyCreation, setFalse: deActiveNewPropertyCreation }] = useBoolean(false);\r\n const {\r\n properties,\r\n isPropertyLoading,\r\n isValidAdUnit,\r\n isPropertySaving,\r\n isAdUnitMediationLoading,\r\n activeAdunit,\r\n initialAdUnit,\r\n isAdUnitSaving,\r\n isAdUnitLoading,\r\n isAdUnitInitialized,\r\n setIsAdUnitSaving,\r\n setActiveAdunit,\r\n getActiveAdunit,\r\n createProperty,\r\n } = useAdUnitData({\r\n appStore,\r\n googleAdsenseStore,\r\n onPropertyCreated: deActiveNewPropertyCreation,\r\n adUnitsStore,\r\n formatMessage,\r\n });\r\n\r\n const {\r\n onAdunitNameChange,\r\n onAdunitTypeChange,\r\n onAdunitMediationChange,\r\n onAddSiteClick,\r\n onSiteChange,\r\n onCreatingNewProperty,\r\n onAdUnitSubmit,\r\n onRedirectBackToAdUnitManagePage,\r\n } = useAdunitEventHandlers({\r\n getActiveAdunit,\r\n setActiveAdunit,\r\n createProperty,\r\n activeNewPropertyCreation,\r\n setIsAdUnitSaving,\r\n activeScriptView,\r\n deActiveNewPropertyCreation,\r\n formatMessage,\r\n routeProps,\r\n appStore,\r\n googleAdsenseStore,\r\n initialAdUnit,\r\n properties,\r\n });\r\n\r\n const adUnitNameProps = useMemo<IAdUnitNameInputFieldProps>(\r\n () => ({\r\n onChange: onAdunitNameChange,\r\n value: activeAdunit?.name,\r\n errorMsg: undefined,\r\n disabled: false,\r\n shouldRenderComponent: !isScriptViewActive,\r\n }),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [activeAdunit?.name, isScriptViewActive]\r\n );\r\n\r\n const adUnitSiteProps = useMemo<IAdUnitSiteSelectorProps & RouteComponentProps>(\r\n () => ({\r\n options: propertySerializer(properties),\r\n onAddSiteClick,\r\n onSiteChange,\r\n searchBoxPlaceholder:\r\n getSiteSelectionSummary(properties, activeAdunit?.propertyId) ?? formatMessage(messages.propertyDefaultOptionText),\r\n isPropertyPanelActive,\r\n onCloseNewPropertyPanel: deActiveNewPropertyCreation,\r\n onCreatingNewProperty,\r\n isLoading: isPropertyLoading,\r\n isSaving: isPropertySaving,\r\n shouldRenderComponent: !isScriptViewActive,\r\n isDisabled: isEditing,\r\n ...routeProps,\r\n }),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [activeAdunit?.propertyId, isPropertyLoading, isPropertySaving, properties, isPropertyPanelActive, routeProps, isScriptViewActive]\r\n );\r\n\r\n const adUnitTypeProps = useMemo<IAdUnitTypeSelectorProps>(\r\n () => ({\r\n nativeProperties: activeAdunit?.nativeProperties as NativeAdProperties,\r\n adTypes: activeAdunit?.adTypes as AdTypes,\r\n onChange: onAdunitTypeChange,\r\n shouldRenderComponent: !isScriptViewActive,\r\n isLoading: isAdUnitLoading || appStore.loading || !isAdUnitInitialized,\r\n intl,\r\n }),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [activeAdunit?.adTypes, activeAdunit?.nativeProperties, intl, isScriptViewActive, isAdUnitLoading, appStore.loading]\r\n );\r\n\r\n const adUnitMediationProps = useMemo<IAdUnitMediationSelectorProps>(\r\n () => ({\r\n activeAdunit,\r\n toggleIsLoading: isAdUnitMediationLoading,\r\n shouldRenderComponent: !!googleAdsenseStore?.active?.isMediationEnabled && !isScriptViewActive,\r\n onAdunitMediationChange,\r\n }),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [activeAdunit, googleAdsenseStore?.active?.isMediationEnabled, isScriptViewActive, isAdUnitMediationLoading]\r\n );\r\n\r\n const adUnitScriptPageProps = useMemo<IScriptPageProps>(\r\n () => ({\r\n adunitId: `${activeAdunit?.id}`,\r\n siteId: activeAdunit?.propertyId,\r\n shouldRenderComponent: isScriptViewActive,\r\n intl,\r\n mode,\r\n ...routeProps,\r\n }),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [isScriptViewActive, appStore.publisher?.id, activeAdunit?.id, routeProps, intl, mode, isScriptViewActive]\r\n );\r\n\r\n const adUnitDetailPageProps = useMemo<TythonAdUnitDetailPageProps>(\r\n () => ({\r\n saving: isAdUnitSaving,\r\n loading: isAdUnitLoading,\r\n onSubmit: isScriptViewActive ? onRedirectBackToAdUnitManagePage : onAdUnitSubmit,\r\n onCancel: isScriptViewActive ? undefined : onRedirectBackToAdUnitManagePage,\r\n submitButtonDisabled: !isValidAdUnit || appStore.loading,\r\n submitLabel: formatMessage(isScriptViewActive ? messages.finishAdUnitCreation : messages.saveAndGetCode),\r\n titleLabel: formatMessage(isEditing ? messages.editPageTitle : messages.createPageTitle),\r\n hasFormTitle: true,\r\n hideNavButton: isScriptViewActive,\r\n }),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [isAdUnitSaving, isAdUnitLoading, isScriptViewActive, isValidAdUnit, isEditing, onAdUnitSubmit, onRedirectBackToAdUnitManagePage]\r\n );\r\n\r\n return {\r\n adUnitNameProps,\r\n adUnitSiteProps,\r\n adUnitTypeProps,\r\n adUnitMediationProps,\r\n adUnitDetailPageProps,\r\n adUnitScriptPageProps,\r\n isScriptViewActive,\r\n };\r\n};\r\n\r\nexport default useCreateTythonAdunitRenderControl;\r\n","import React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\nimport { getAppStore } from '../../../../../@data';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { DetailPage } from '../../../../../layout/DetailPage/DetailPage';\r\nimport { injectIntlAndObserver } from '../../../../../utils';\r\nimport { getGoogleAdSenseStore } from '../../../Account/Settings/components/GoogleConnector/@data';\r\nimport { getAdunitStore } from '../../@data';\r\nimport AdUnitMediationSelector from '../components/AdUnitMediationSelector';\r\nimport AdUnitNameInputField from '../components/AdUnitNameInput';\r\nimport AdUnitSiteSelector from '../components/AdUnitSiteSelector';\r\nimport AdUnitTypeSelector from '../components/AdUnitTypeSelector';\r\nimport { NativeAdScriptPage } from '../components/ScriptPage/ScriptPage';\r\nimport useCreateTythonAdunitRenderControl from './useCreateTythonAdunit';\r\n\r\ninterface ICreateTythonAdunitProps {\r\n mode: FormState;\r\n routeProps: RouteComponentProps;\r\n}\r\n\r\nconst CreateTythonAdunit = injectIntlAndObserver<InjectedIntlProps & ICreateTythonAdunitProps>(({ intl, mode, routeProps }) => {\r\n const appStore = getAppStore();\r\n const googleAdsenseStore = getGoogleAdSenseStore();\r\n const adUnitsStore = getAdunitStore();\r\n const {\r\n adUnitNameProps,\r\n adUnitSiteProps,\r\n adUnitTypeProps,\r\n adUnitMediationProps,\r\n adUnitDetailPageProps,\r\n adUnitScriptPageProps,\r\n } = useCreateTythonAdunitRenderControl({\r\n appStore,\r\n googleAdsenseStore,\r\n mode,\r\n routeProps,\r\n intl,\r\n adUnitsStore,\r\n });\r\n\r\n return (\r\n <DetailPage helpId={'pop_PCv4_AdUnitsCreate'} pageMode={mode} {...adUnitDetailPageProps}>\r\n <AdUnitNameInputField {...adUnitNameProps} />\r\n <AdUnitSiteSelector {...adUnitSiteProps} />\r\n <AdUnitTypeSelector {...adUnitTypeProps} />\r\n <AdUnitMediationSelector {...adUnitMediationProps} />\r\n <NativeAdScriptPage {...adUnitScriptPageProps} />\r\n </DetailPage>\r\n );\r\n});\r\n\r\nexport default CreateTythonAdunit;\r\n","import { InjectedIntlProps } from 'react-intl';\r\nimport { AppAdUnitPrimaryFormProps, AppAdUnitResultSummaryProps, AppAdUnitTypeFormProps } from '../CreateAdUnit/types';\r\n\r\nexport type AppAdUnitPrimaryFormType = (props: AppAdUnitPrimaryFormProps & InjectedIntlProps) => JSX.Element;\r\n\r\nexport type AppAdUnitTypeFormType = (props: AppAdUnitTypeFormProps & InjectedIntlProps) => JSX.Element;\r\n\r\nexport type V2SectionalAccordionType = (props: {\r\n onTitleToggle: (isSelected?: boolean) => void;\r\n isAccordionSelected: boolean;\r\n onRenderLeft: () => JSX.Element;\r\n onRenderRight?: () => JSX.Element;\r\n titleLabel: string;\r\n disabled?: boolean;\r\n isLoading: boolean;\r\n}) => JSX.Element;\r\n\r\nexport enum AppAdUnitPreviewLayout {\r\n Horizontal = 0,\r\n Vertical = 1,\r\n Square = 2,\r\n}\r\n\r\nexport type StaticAdPreviewType = (props: { dimension?: string } & InjectedIntlProps) => JSX.Element;\r\n\r\nexport type AppAdUnitResultSummaryType = (props: AppAdUnitResultSummaryProps & InjectedIntlProps) => JSX.Element;\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n createNewAppAdUnitPrimaryFormTitle: {\r\n id: 'appAdUnit.createNewAppAdUnitPrimaryFormTitle',\r\n defaultMessage: 'App details',\r\n },\r\n appAdUnitNameFieldLabel: {\r\n id: 'appAdUnit.appAdUnitNameFieldLabel',\r\n defaultMessage: 'Ad unit name',\r\n },\r\n appAdUnitApplicationIdFieldLabel: {\r\n id: 'appAdUnit.appAdUnitApplicationIdFieldLabel',\r\n defaultMessage: 'Connected application',\r\n },\r\n appAdUnitTypeFieldLabel: {\r\n id: 'appAdUnit.appAdUnitTypeFieldLabel',\r\n defaultMessage: 'Ad types',\r\n },\r\n appAdUnitTypeBanner: {\r\n id: 'appAdUnit.appAdUnitTypeBanner',\r\n defaultMessage: 'Banner',\r\n },\r\n appAdUnitTypeInterstitial: {\r\n id: 'appAdUnit.appAdUnitTypeInterstitial',\r\n defaultMessage: 'Interstitial',\r\n },\r\n appAdUnitTypeNative: {\r\n id: 'appAdUnit.appAdUnitTypeNative',\r\n defaultMessage: 'Native',\r\n },\r\n appAdUnitTypeBannerDescription: {\r\n id: 'appAdUnit.appAdUnitTypeBannerDescription',\r\n defaultMessage:\r\n \"Rectangular ads that occupy a portion of an app's layout; can be refreshed automatically after a period of time. See {helpLink} for more information.\",\r\n },\r\n appAdUnitTypeBannerHelpLink: {\r\n id: 'appAdUnit.appAdUnitTypeBannerHelpLink',\r\n defaultMessage: 'Overview of banner ads',\r\n },\r\n appAdUnitTypeInterstitialDescription: {\r\n id: 'appAdUnit.appAdUnitTypeInterstitialDescription',\r\n defaultMessage:\r\n 'Full-page ad format that appears at natural breaks and transitions, such as level completion. See {helpLink} for more information.',\r\n },\r\n appAdUnitTypeInterstitialHelpLink: {\r\n id: 'appAdUnit.appAdUnitTypeInterstitialHelpLink',\r\n defaultMessage: 'Overview of interstitial ads',\r\n },\r\n appAdUnitTypeNativeDescription: {\r\n id: 'appAdUnit.appAdUnitTypeNativeDescription',\r\n defaultMessage:\r\n 'Customizable ad format that matches the look and feel of your app; appears inline with app content. See {helpLink} for more information.',\r\n },\r\n overviewNativeAdsLink: {\r\n id: 'appAdUnit.overviewNativeAdsLink',\r\n defaultMessage: 'Overview of native ads',\r\n },\r\n appAdUnitTypeDisplayAdsTitle: {\r\n id: 'appAdUnit.appAdUnitTypeDisplayAdsTitle',\r\n defaultMessage: 'Display ad',\r\n },\r\n appAdUnitTypeNativeAdsTitle: {\r\n id: 'appAdUnit.appAdUnitTypeNativeAdsTitle',\r\n defaultMessage: 'Native ad',\r\n },\r\n appAdUnitTypeVideoAdsTitle: {\r\n id: 'appAdUnit.appAdUnitTypeVideoAdsTitle',\r\n defaultMessage: 'Video ad',\r\n },\r\n appAdUnitDisplayAdsBannerAdSizeLabel: {\r\n id: 'appAdUnit.appAdUnitDisplayAdsBannerAdSizeLabel',\r\n defaultMessage: 'Size',\r\n },\r\n appAdUnitVideoAdsInterstitialVideoAdConfigTitle: {\r\n id: 'appAdUnit.appAdUnitVideoAdsInterstitialVideoAdConfigTitle',\r\n defaultMessage: 'Video ad configuration',\r\n },\r\n appAdUnitNativeAdConfigTitle: {\r\n id: 'appAdUnit.appAdUnitNativeAdConfigTitle',\r\n defaultMessage: 'Native ad configuration',\r\n },\r\n appAdUnitNativeAdsConfigFontLabel: {\r\n id: 'appAdUnit.appAdUnitNativeAdsConfigFontLabel',\r\n defaultMessage: 'Font',\r\n },\r\n appAdUnitNativeAdsConfigTitleColorLabel: {\r\n id: 'appAdUnit.appAdUnitNativeAdsConfigTitleColorLabel',\r\n defaultMessage: 'Title color',\r\n },\r\n appAdUnitNativeAdsConfigBackgroundLabel: {\r\n id: 'appAdUnit.appAdUnitNativeAdsConfigBackgroundLabel',\r\n defaultMessage: 'Background color',\r\n },\r\n appAdUnitNativeAdsConfigButtonBackgroundLabel: {\r\n id: 'appAdUnit.appAdUnitNativeAdsConfigButtonBackgroundLabel',\r\n defaultMessage: 'Button background color',\r\n },\r\n appAdUnitNativeAdsConfigMsgBar: {\r\n id: 'appAdUnit.appAdUnitNativeAdsConfigMsgBar',\r\n defaultMessage: 'Ads might look different from the preview shown.',\r\n },\r\n appAdUnitVideoAdsInterstitialVideoAdConfigVideoSkipLabel: {\r\n id: 'appAdUnit.appAdUnitVideoAdsInterstitialVideoAdConfigVideoSkipLabel',\r\n defaultMessage: 'Can users skip the video?',\r\n },\r\n createNewAppAdUnitBannerAdTypeFormTitle: {\r\n id: 'appAdUnit.createNewAppAdUnitBannerAdTypeFormTitle',\r\n defaultMessage: 'Banner ad media types',\r\n },\r\n createNewAppAdUnitInterstitialAdTypeFormTitle: {\r\n id: 'appAdUnit.createNewAppAdUnitInterstitialAdTypeFormTitle',\r\n defaultMessage: 'Interstitial ad media types',\r\n },\r\n createNewAppAdUnitNativeAdTypeFormTitle: {\r\n id: 'appAdUnit.createNewAppAdUnitNativeAdTypeFormTitle',\r\n defaultMessage: 'Native ad media types',\r\n },\r\n adTypeInfoMsgContent: {\r\n id: 'appAdUnit.adTypeInfoMsgContent',\r\n defaultMessage:\r\n 'Smart auto-sizing will adapt to your site’s container, and so the actual ads served might look slightly different from the examples shown. For smart auto-sizing to work, {helpLink}.',\r\n },\r\n adTypeInfoMsgHelpLink: {\r\n id: 'appAdUnit.adTypeInfoMsgHelpLink',\r\n defaultMessage: 'ensure you have properly defined your container sizes',\r\n },\r\n adTypePreviewTitle: {\r\n id: 'appAdUnit.adTypePreviewTitle',\r\n defaultMessage: 'Ad preview',\r\n },\r\n adTypePreviewLayoutHorizontal: {\r\n id: 'appAdUnit.adTypePreviewLayoutHorizontal',\r\n defaultMessage: 'Horizontal',\r\n },\r\n adTypePreviewLayoutVertical: {\r\n id: 'appAdUnit.adTypePreviewLayoutVertical',\r\n defaultMessage: 'Vertical',\r\n },\r\n adTypePreviewLayoutSquare: {\r\n id: 'appAdUnit.adTypePreviewLayoutSquare',\r\n defaultMessage: 'Square',\r\n },\r\n adUnitFormCancelLabel: {\r\n id: 'appAdUnit.adUnitFormCancelLabel',\r\n defaultMessage: 'Cancel',\r\n },\r\n adUnitFormPreviousLabel: {\r\n id: 'appAdUnit.adUnitFormPreviousLabel',\r\n defaultMessage: 'Previous',\r\n },\r\n adUnitFormNextLabel: {\r\n id: 'appAdUnit.adUnitFormNextLabel',\r\n defaultMessage: 'Next',\r\n },\r\n adUnitFormDoneLabel: {\r\n id: 'appAdUnit.adUnitFormDoneLabel',\r\n defaultMessage: 'Done',\r\n },\r\n adUnitFormSubmissionLabelSuccess: {\r\n id: 'appAdUnit.adUnitFormSubmissionLabelSuccess',\r\n defaultMessage: 'Place the ad unit inside your app',\r\n },\r\n adUnitResultSummarySecondaryContent: {\r\n id: 'appAdUnit.adUnitResultSummarySecondaryContent',\r\n defaultMessage: 'Ad unit is successfully created. New ad unit may take up to an hour to start showing ads.',\r\n },\r\n adUnitResultSummarySecondaryContentSecondary: {\r\n id: 'appAdUnit.adUnitResultSummarySecondaryContentSecondary',\r\n defaultMessage: 'Follow these instructions to place the ad unit inside your app.',\r\n },\r\n adUnitResultSummaryCodeHelpContent: {\r\n id: 'appAdUnit.adUnitResultSummaryCodeHelpContent',\r\n defaultMessage: 'Need help with ad unit code? Try this.',\r\n },\r\n adUnitResultSummaryCodeButton: {\r\n id: 'appAdUnit.adUnitResultSummaryCodeButton',\r\n defaultMessage: 'Show code template',\r\n },\r\n adUnitResultSummaryCodeButtonInactive: {\r\n id: 'appAdUnit.adUnitResultSummaryCodeButtonInactive',\r\n defaultMessage: 'Hide code template',\r\n },\r\n adUnitResultSummaryFollowInstructionContent1: {\r\n id: 'appAdUnit.adUnitResultSummaryFollowInstructionContent1',\r\n defaultMessage: 'Next, place the ad unit inside your app',\r\n },\r\n adUnitResultSummaryFollowInstructionContent2: {\r\n id: 'appAdUnit.adUnitResultSummaryFollowInstructionContent2',\r\n defaultMessage: 'Follow these instructions:',\r\n },\r\n adUnitResultSummaryFollowInstructionContent3: {\r\n id: 'appAdUnit.adUnitResultSummaryFollowInstructionContent3',\r\n defaultMessage: 'Complete the instructions in the {helpLink} using this publisher code',\r\n },\r\n adUnitResultSummaryFollowInstructionContent3HelpLink: {\r\n id: 'appAdUnit.adUnitResultSummaryFollowInstructionContent3HelpLink',\r\n defaultMessage: 'Microsoft pubCenter Ads SDK guide',\r\n },\r\n adUnitResultSummaryFollowInstructionContent4: {\r\n id: 'appAdUnit.adUnitResultSummaryFollowInstructionContent4',\r\n defaultMessage:\r\n \"Follow the {helpLink} to integrate the SDK. You'll specify ad type, size, and placement when you integrate the code using this Ad Unit Code (Placement Code):\",\r\n },\r\n adUnitResultSummaryFollowInstructionContent4HelpLink: {\r\n id: 'appAdUnit.adUnitResultSummaryFollowInstructionContent4HelpLink',\r\n defaultMessage: 'banner implementation guide',\r\n },\r\n adUnitResultSummaryFollowInstructionContent5: {\r\n id: 'appAdUnit.adUnitResultSummaryFollowInstructionContent5',\r\n defaultMessage: 'Review the {helpLink} to ensure your implementation complies.',\r\n },\r\n adUnitResultSummaryFollowInstructionContent5HelpLink: {\r\n id: 'appAdUnit.adUnitResultSummaryFollowInstructionContent5HelpLink',\r\n defaultMessage: 'Microsoft pubCenter Ad Policies',\r\n },\r\n copyCode: {\r\n id: 'appAdUnit.copyCode',\r\n defaultMessage: 'Copy text',\r\n },\r\n copiedCode: {\r\n id: 'appAdUnit.copiedCode',\r\n defaultMessage: 'Copied!',\r\n },\r\n adPreviewPrimaryTitle: {\r\n id: 'appAdUnit.adPreviewPrimaryTitle',\r\n defaultMessage: 'Floral arrangements for all occasions',\r\n },\r\n adPreviewPrimaryDescriptionLine1: {\r\n id: 'appAdUnit.adPreviewPrimaryDescriptionLine1',\r\n defaultMessage: 'the leading floral experts',\r\n },\r\n adPreviewPrimaryDescriptionLine2: {\r\n id: 'appAdUnit.adPreviewPrimaryDescriptionLine2',\r\n defaultMessage: 'We use only the freshest, highest-quality flowers and greenery to ensure that each bouquet is a work of art.',\r\n },\r\n adPreviewPrimaryDescriptionActionButton: {\r\n id: 'appAdUnit.adPreviewPrimaryDescriptionActionButton',\r\n defaultMessage: 'Shop now',\r\n },\r\n adPreviewAdBadgeContent: {\r\n id: 'appAdUnit.adPreviewAdBadgeContent',\r\n defaultMessage: 'Ad',\r\n },\r\n appDetailSubTitle: {\r\n id: 'appAdUnit.appDetailSubTitle',\r\n defaultMessage: 'Currently we only support adding live apps that are in the Microsoft Store',\r\n },\r\n appAdUnitNamePlaceholder: {\r\n id: 'appAdUnit.appAdUnitNamePlaceholder',\r\n defaultMessage: 'Enter Ad Unit Name',\r\n },\r\n appAdUnitVideoSkipYes: {\r\n id: 'appAdUnit.appAdUnitVideoSkipYes',\r\n defaultMessage: 'Yes, video can be skipped.',\r\n },\r\n appAdUnitVideoSkipNo: {\r\n id: 'appAdUnit.appAdUnitVideoSkipNo',\r\n defaultMessage: 'No, video cannot be skipped.',\r\n },\r\n appAdUnitVideoAdsDuration: {\r\n id: 'appAdUnit.appAdUnitVideoAdsDuration',\r\n defaultMessage: 'Video duration',\r\n },\r\n appAdUnitVideoAdsDurationMetric: {\r\n id: 'appAdUnit.appAdUnitVideoAdsDurationMetric',\r\n defaultMessage: 'seconds',\r\n },\r\n appAdUnitNativePreviewTitle: {\r\n id: 'appAdUnit.appAdUnitNativePreviewTitle',\r\n defaultMessage: 'Ad preview',\r\n },\r\n nativeAdPreviewContainerSize: {\r\n id: 'appAdUnit.nativeAdPreviewContainerSize',\r\n defaultMessage: 'Container size',\r\n },\r\n appAdUnitVideoPlayMethodAutoSoundOn: {\r\n id: 'appAdUnit.appAdUnitVideoPlayMethodAutoSoundOn',\r\n defaultMessage: 'Auto-play, sound on',\r\n },\r\n appAdUnitVideoPlayMethodAutoSoundOff: {\r\n id: 'appAdUnit.appAdUnitVideoPlayMethodAutoSoundOff',\r\n defaultMessage: 'Auto-play, sound off',\r\n },\r\n appAdUnitVideoPlayMethodClickToPlay: {\r\n id: 'appAdUnit.appAdUnitVideoPlayMethodClickToPlay',\r\n defaultMessage: 'Click-to-play',\r\n },\r\n appAdUnitVideoPlayMethodMouseOff: {\r\n id: 'appAdUnit.appAdUnitVideoPlayMethodMouseOff',\r\n defaultMessage: 'Mouse-off',\r\n },\r\n appAdUnitVideoPlayMethodAutoplay: {\r\n id: 'appAdUnit.appAdUnitVideoPlayMethodAutoplay',\r\n defaultMessage: 'Auto-play',\r\n },\r\n appAdUnitVideoPlayMethodSoundUnknown: {\r\n id: 'appAdUnit.appAdUnitVideoPlayMethodSoundUnknown',\r\n defaultMessage: 'Sound unknown',\r\n },\r\n appAdUnitVideoPlayMethodFieldLabel: {\r\n id: 'appAdUnit.appAdUnitVideoPlayMethodFieldLabel',\r\n defaultMessage: 'Video auto-play method',\r\n },\r\n appAdUnitUpdateSuccess: {\r\n id: 'appAdUnit.appAdUnitUpdateSuccess',\r\n defaultMessage: 'Updated app ad unit {adunitId} success',\r\n },\r\n});\r\n","import { InjectedIntl } from 'react-intl';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport { IAppState } from '../../../../../@data';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { IAdPreviewConfig } from '../../TythonAdunit/components/AdUnitTypeSelector/PreviewComponent';\r\nimport { AppAdUnitPreviewLayout } from '../components/types';\r\nimport messages from '../messages';\r\n\r\nexport enum AppAdUnitType {\r\n Display = 'Display',\r\n Video = 'Video',\r\n Native = 'Native',\r\n}\r\n\r\nexport const AppAdUnitBannerSize = {\r\n '320 x 50': {\r\n value: '320 x 50',\r\n width: 320,\r\n height: 50,\r\n layout: AppAdUnitPreviewLayout.Horizontal,\r\n },\r\n '300 x 250': {\r\n value: '300 x 250',\r\n width: 300,\r\n height: 250,\r\n layout: AppAdUnitPreviewLayout.Horizontal,\r\n },\r\n '300 x 50': {\r\n value: '300 x 50',\r\n width: 300,\r\n height: 50,\r\n layout: AppAdUnitPreviewLayout.Horizontal,\r\n },\r\n '728 x 90': {\r\n value: '728 x 90',\r\n width: 728,\r\n height: 90,\r\n layout: AppAdUnitPreviewLayout.Horizontal,\r\n },\r\n};\r\n\r\nexport type VideoPlayMethod = 'auto_sound_on' | 'auto_sound_off' | 'click_to_play' | 'mouse_off' | 'auto_play' | 'sound_unknown';\r\n\r\ntype AppAdUnitVideoPlayMethodItem = {\r\n label: ReactIntl.FormattedMessage.MessageDescriptor;\r\n value: VideoPlayMethod;\r\n};\r\n\r\nexport const appAdUnitVideoPlayMethod: AppAdUnitVideoPlayMethodItem[] = [\r\n {\r\n label: messages.appAdUnitVideoPlayMethodAutoSoundOn,\r\n value: 'auto_sound_on',\r\n },\r\n {\r\n label: messages.appAdUnitVideoPlayMethodAutoSoundOff,\r\n value: 'auto_sound_off',\r\n },\r\n {\r\n label: messages.appAdUnitVideoPlayMethodClickToPlay,\r\n value: 'click_to_play',\r\n },\r\n {\r\n label: messages.appAdUnitVideoPlayMethodMouseOff,\r\n value: 'mouse_off',\r\n },\r\n {\r\n label: messages.appAdUnitVideoPlayMethodAutoplay,\r\n value: 'auto_play',\r\n },\r\n {\r\n label: messages.appAdUnitVideoPlayMethodSoundUnknown,\r\n value: 'sound_unknown',\r\n },\r\n];\r\n\r\nexport type SelectedAppAdUnitBannerSize = keyof typeof AppAdUnitBannerSize;\r\nexport interface ICreateTythonAppAdunitProps {\r\n mode: FormState;\r\n routeProps: RouteComponentProps;\r\n}\r\n\r\nexport type AppAdUnitPrimaryFormProps = {\r\n adUnitName: string | undefined;\r\n onAdUnitNameChange: (value: string) => void;\r\n adUnitApplicationId: string | undefined;\r\n onAdUnitApplicationIdChange: (value: string) => void;\r\n adUnitType: AppAdUnitType | undefined;\r\n onAdUnitTypeChange: (value: AppAdUnitType) => void;\r\n shouldRenderPrimaryForm: boolean;\r\n validationError: { addUnitName?: string };\r\n applicationOptions: { key: number; label: string; secondaryLabel: string }[];\r\n selectedBannerAdUnitAdSize: SelectedAppAdUnitBannerSize;\r\n onBannerAdUnitAdSizeChange: (value: SelectedAppAdUnitBannerSize) => void;\r\n bannerAdSizeOptions: { key: string; value: string }[];\r\n videoAdUnitSkipAllowed: boolean | undefined;\r\n onVideoAdUnitSkipAllowedChange: (value: boolean) => void;\r\n videoAdUnitDuration: string | undefined;\r\n onVideoAdUnitDurationChange: (value?: string) => void;\r\n nativeAdUnitConfig: IAdPreviewConfig;\r\n onNativeAdUnitConfigChange: (config: IAdPreviewConfig) => void;\r\n videoAdUnitPlayMethod: VideoPlayMethod;\r\n onVideoAdUnitPlayMethodChange: (method: VideoPlayMethod) => void;\r\n isAdUnitLoading: boolean;\r\n isEditMode: boolean;\r\n};\r\n\r\nexport type AppAdUnitTypeFormProps = {\r\n shouldRenderAdTypeForm: boolean;\r\n adUnitType?: AppAdUnitType;\r\n bannerAdSizeOptions: { key: string; value: string }[];\r\n selectedBannerAdUnitAdSize: SelectedAppAdUnitBannerSize;\r\n onBannerAdUnitAdSizeChange: (value: SelectedAppAdUnitBannerSize) => void;\r\n};\r\n\r\nexport type AppAdUnitDetailPageProps = {\r\n saving: boolean;\r\n loading: boolean;\r\n onSubmit: () => void;\r\n onCancel?: () => void;\r\n submitButtonDisabled: boolean;\r\n submitLabel: string;\r\n titleLabel: string;\r\n cancelLabel: string;\r\n hasFormTitle: boolean;\r\n hideNavButton: boolean;\r\n pageMode: FormState;\r\n helpId?: string;\r\n overlayHeight?: string;\r\n};\r\n\r\nexport type UseCreateTythonAppAdUnitProps = {\r\n appStore: IAppState;\r\n formatMessage: InjectedIntl['formatMessage'];\r\n routeProps: RouteComponentProps;\r\n} & ICreateTythonAppAdunitProps;\r\n\r\nexport type AppAdUnitResultSummaryProps = {\r\n shouldRenderResultSummary: boolean;\r\n adUnitId: string;\r\n};\r\n\r\nexport type UseCreateTythonAppAdUnitType = (\r\n props: UseCreateTythonAppAdUnitProps\r\n) => {\r\n primaryFormProps: AppAdUnitPrimaryFormProps;\r\n detailPageProps: AppAdUnitDetailPageProps;\r\n resultSummaryProps: AppAdUnitResultSummaryProps;\r\n};\r\n","import { Spinner } from '@fluentui/react-components';\r\nimport React, { useEffect } from 'react';\r\nimport { onHelpInfoChanged } from '../../../../../@data';\r\n\r\nexport const InfoLabelContent = ({ html }) => {\r\n useEffect(() => {\r\n return () => {\r\n onHelpInfoChanged();\r\n };\r\n }, []);\r\n\r\n if (!html) {\r\n return <Spinner size=\"tiny\" />;\r\n }\r\n\r\n return <div dangerouslySetInnerHTML={{ __html: html }} />;\r\n};\r\n","import { makeStyles, shorthands, tokens, typographyStyles } from '@fluentui/react-components';\r\nimport { BreakPoints } from '../../../../../../theme';\r\nimport AdPreviewBackground from './resources/adPreviewBackground.png';\r\n\r\nconst { ResponsiveSmall } = BreakPoints;\r\n\r\nexport const useAppAdUnitPrimaryFormStyles = makeStyles({\r\n previewSDKWrapper: {\r\n [ResponsiveSmall]: {\r\n maxWidth: '100%',\r\n overflowX: 'auto',\r\n },\r\n '& > div > div[data-template=\"horizontal\"]': {\r\n boxShadow: tokens.shadow4Brand,\r\n },\r\n },\r\n dimensionInputsWrapper: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n marginTop: tokens.spacingVerticalM,\r\n marginBottom: tokens.spacingVerticalM,\r\n ...shorthands.gap(tokens.spacingHorizontalM),\r\n },\r\n dimensionInput: {\r\n width: '100px',\r\n },\r\n colorSelectorWrapper: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n marginTop: tokens.spacingVerticalM,\r\n },\r\n sectionTitle: {\r\n ...typographyStyles.title3,\r\n },\r\n applicationDropdown: {\r\n width: '100%',\r\n },\r\n cardsWrapper: {\r\n display: 'flex',\r\n },\r\n card: {\r\n height: '388px',\r\n width: '187px',\r\n marginRight: tokens.spacingHorizontalL,\r\n },\r\n cardTitleRadioCheckbox: {\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n flexGrow: '0 !important',\r\n marginTop: tokens.spacingHorizontalM,\r\n },\r\n subTitle: {\r\n color: tokens.colorNeutralForeground2,\r\n marginTop: '-24px',\r\n marginBottom: tokens.spacingVerticalM,\r\n },\r\n body1Storng: {\r\n ...typographyStyles.body1Strong,\r\n },\r\n dimensionDropdown: {\r\n width: '100%',\r\n },\r\n msgBar: {\r\n backgroundColor: tokens.colorBrandBackgroundInvertedSelected,\r\n marginTop: tokens.spacingHorizontalM,\r\n },\r\n required: {\r\n '::after': {\r\n content: `\" *\"`,\r\n color: tokens.colorPaletteRedForeground3,\r\n paddingRight: tokens.spacingHorizontalM,\r\n },\r\n },\r\n infoButton: {\r\n width: tokens.spacingHorizontalL,\r\n height: tokens.spacingVerticalL,\r\n display: 'contents',\r\n '::before': {\r\n content: `\" *\"`,\r\n color: tokens.colorPaletteRedForeground3,\r\n },\r\n },\r\n infoBubbleNoRequire: {\r\n width: tokens.spacingHorizontalL,\r\n height: tokens.spacingVerticalL,\r\n display: 'contents',\r\n },\r\n propertyOption: {\r\n ...shorthands.padding(tokens.spacingVerticalSNudge),\r\n '> div': {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n width: '100%',\r\n },\r\n },\r\n});\r\n\r\nexport const useAppAdUnitTypeFormStyles = makeStyles({\r\n body1Storng: {\r\n ...typographyStyles.body1Strong,\r\n },\r\n dimensionDropdown: {\r\n width: '100%',\r\n },\r\n msgBar: {\r\n backgroundColor: tokens.colorBrandBackgroundInvertedSelected,\r\n marginTop: tokens.spacingHorizontalM,\r\n },\r\n required: {\r\n '::after': {\r\n content: `\" *\"`,\r\n color: tokens.colorPaletteRedForeground3,\r\n paddingRight: tokens.spacingHorizontalM,\r\n },\r\n },\r\n});\r\n\r\nexport const useV2SectionalAccordionStyles = makeStyles({\r\n card: {\r\n width: 'calc(100% - 48px)',\r\n maxWidth: '1360px',\r\n },\r\n horizontalDivider: {\r\n width: 'calc(100% + 24px)',\r\n marginLeft: '-12px',\r\n },\r\n titleWrapper: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n },\r\n contentWrapper: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n height: '400px',\r\n },\r\n verticalDivider: {\r\n height: 'calc(100% + 24px)',\r\n marginTop: `-12px`,\r\n maxWidth: tokens.spacingHorizontalXXS,\r\n },\r\n contentLeft: {\r\n width: '368px',\r\n minWidth: '368px',\r\n paddingRight: tokens.spacingHorizontalM,\r\n },\r\n contentRight: {\r\n paddingLeft: tokens.spacingHorizontalM,\r\n width: '100%',\r\n maxWidth: 'calc(100% - 380px - 12px)', // 100% - left content width - right side padding\r\n },\r\n chevronIcon: {\r\n cursor: 'pointer',\r\n ...shorthands.padding(tokens.spacingVerticalSNudge),\r\n },\r\n disabled: {\r\n display: 'none',\r\n },\r\n});\r\n\r\nexport const useAppAdUnitResultSummaryStyles = makeStyles({\r\n root: {\r\n marginTop: '48px',\r\n },\r\n stepAvatar: {\r\n marginRight: tokens.spacingHorizontalM,\r\n },\r\n checkMarkLogo: {\r\n marginLeft: 'calc((100% - 256px)/2)',\r\n },\r\n codeCard: {\r\n maxWidth: '600px',\r\n height: '88px',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n },\r\n codeIcon: {\r\n width: '64px',\r\n flexGrow: '0 !important',\r\n },\r\n codeCardContent: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n width: 'calc(100% - 64px)',\r\n height: '52px',\r\n backgroundColor: tokens.colorNeutralBackground3,\r\n ...shorthands.padding(0, tokens.spacingHorizontalM),\r\n },\r\n codeCardWrapper: {\r\n paddingLeft: tokens.spacingHorizontalXXL,\r\n marginLeft: tokens.spacingHorizontalS,\r\n marginTop: tokens.spacingHorizontalS,\r\n paddingBottom: tokens.spacingVerticalMNudge,\r\n marginBottom: tokens.spacingVerticalSNudge,\r\n ...shorthands.borderLeft(tokens.strokeWidthThicker, 'solid', tokens.colorNeutralBackground1Selected),\r\n },\r\n codeHelpText: {\r\n ...shorthands.margin(tokens.spacingVerticalS, 0),\r\n },\r\n codePanelButton: {\r\n marginBottom: tokens.spacingVerticalSNudge,\r\n },\r\n});\r\n\r\nexport const useAppAdUnitPreviewStyles = makeStyles({\r\n root: {\r\n height: '100%',\r\n },\r\n tittleWrapper: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'flex-start',\r\n },\r\n layoutTagsWrapper: {\r\n display: 'flex',\r\n ...shorthands.gap(tokens.spacingHorizontalXXS),\r\n },\r\n previewWrapper: {\r\n marginTop: tokens.spacingVerticalM,\r\n position: 'relative',\r\n height: 'calc(100% - 48px + 12px)', // 100% - title height + 12px margin\r\n overflowX: 'scroll',\r\n paddingLeft: tokens.spacingHorizontalM,\r\n },\r\n HorizontalBottomAdPreview: {\r\n width: '768px',\r\n marginLeft: '-5px',\r\n },\r\n SquareBottomAdPreview: {\r\n width: '294px',\r\n position: 'absolute',\r\n top: '-5px',\r\n },\r\n VerticalLeftAdPreview: {\r\n width: '134px',\r\n position: 'absolute',\r\n },\r\n VerticalBottomAdPreview: {\r\n width: '137px',\r\n position: 'absolute',\r\n left: '139px',\r\n top: '-5px',\r\n },\r\n});\r\n\r\nconst squareAdPreviewContainerSize = {\r\n width: '286px',\r\n height: '286px',\r\n minWidth: '286px',\r\n minHeight: '286px',\r\n maxWidth: '286px',\r\n maxHeight: '286px',\r\n};\r\n\r\nconst horizontalAdPreviewContainerSize = {\r\n width: '766px',\r\n height: '122px',\r\n};\r\n\r\nconst flowerBackgroundImg = {\r\n backgroundImage: `linear-gradient(rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.1)), url(${AdPreviewBackground})`,\r\n backgroundSize: 'cover',\r\n};\r\n\r\nconst verticalAdPreviewContainerSize = {\r\n width: '134px',\r\n height: '305px',\r\n};\r\n\r\nconst horizontalAdIconPosition = {\r\n right: tokens.spacingVerticalL,\r\n top: tokens.spacingVerticalL,\r\n};\r\n\r\nconst adIconSize = {\r\n width: tokens.spacingVerticalL,\r\n};\r\n\r\nconst adBadgeStyle = {\r\n backgroundColor: tokens.colorNeutralForegroundInverted,\r\n color: tokens.colorNeutralForeground3,\r\n fontSize: tokens.fontSizeBase200,\r\n lineHeight: tokens.lineHeightBase200,\r\n cursor: 'default',\r\n ...shorthands.borderRadius(tokens.borderRadiusSmall),\r\n ...shorthands.border(tokens.strokeWidthThin, 'solid', tokens.colorNeutralBackground2Pressed),\r\n ...shorthands.padding(0, tokens.spacingHorizontalM),\r\n};\r\n\r\nconst secondarySubtitleStyles = {\r\n textShadow: tokens.shadow64Brand,\r\n color: tokens.colorNeutralBackground1,\r\n fontWeight: tokens.fontWeightBold,\r\n};\r\n\r\nexport const useAdPreviewRendererStyles = makeStyles({\r\n nonSelectableText: {\r\n userSelect: 'none',\r\n '-ms-user-select': 'none',\r\n '-moz-user-select': 'none',\r\n '-webkit-user-select': 'none',\r\n },\r\n primaryAdWrapperHorizontal: {\r\n ...horizontalAdPreviewContainerSize,\r\n position: 'relative',\r\n },\r\n primaryAdWrapperVertical: {\r\n ...verticalAdPreviewContainerSize,\r\n position: 'relative',\r\n justifyContent: 'flex-start',\r\n backgroundImage: `linear-gradient(to top, ${tokens.colorNeutralBackground5} 40px, transparent 56px)`,\r\n },\r\n primaryAdWrapperSquare: {\r\n ...squareAdPreviewContainerSize,\r\n position: 'relative',\r\n justifyContent: 'flex-start',\r\n backgroundImage: `linear-gradient(to top, ${tokens.colorNeutralBackground5} 40px, transparent 56px)`,\r\n },\r\n secondaryAdWrapperHorizontal: {\r\n ...horizontalAdPreviewContainerSize,\r\n ...flowerBackgroundImg,\r\n position: 'relative',\r\n backgroundPositionY: 'center',\r\n },\r\n secondaryAdWrapperSquare: {\r\n ...squareAdPreviewContainerSize,\r\n ...flowerBackgroundImg,\r\n position: 'relative',\r\n backgroundPositionY: 'center',\r\n },\r\n secondaryAdWrapperVertical: {\r\n ...verticalAdPreviewContainerSize,\r\n ...flowerBackgroundImg,\r\n position: 'relative',\r\n backgroundPositionX: 'center',\r\n justifyContent: 'flex-start',\r\n },\r\n previewCardWrapperHorizontal: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n ...shorthands.gap(tokens.spacingHorizontalS),\r\n },\r\n previewCardWrapperVertical: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n ...shorthands.gap(tokens.spacingHorizontalS),\r\n },\r\n previewCardWrapperSquare: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n ...shorthands.gap(tokens.spacingHorizontalS),\r\n },\r\n primaryAdIconHorizontal: {\r\n ...horizontalAdIconPosition,\r\n ...adIconSize,\r\n position: 'absolute',\r\n },\r\n primaryAdIconVertical: {\r\n ...adIconSize,\r\n position: 'absolute',\r\n right: tokens.spacingVerticalXXS,\r\n top: tokens.spacingVerticalXXS,\r\n },\r\n primaryAdIconSquare: {\r\n ...adIconSize,\r\n position: 'absolute',\r\n right: tokens.spacingVerticalXXS,\r\n top: tokens.spacingVerticalXXS,\r\n },\r\n secondaryAdIconHorizontal: {\r\n ...horizontalAdIconPosition,\r\n ...adIconSize,\r\n position: 'absolute',\r\n },\r\n secondaryAdIconSquare: {\r\n ...adIconSize,\r\n position: 'absolute',\r\n right: tokens.spacingVerticalXXS,\r\n bottom: tokens.spacingVerticalXXS,\r\n },\r\n secondaryAdIconVertical: {\r\n ...adIconSize,\r\n position: 'absolute',\r\n right: tokens.spacingVerticalXXS,\r\n bottom: tokens.spacingVerticalXXS,\r\n },\r\n primaryAdButtonHorizontal: {\r\n position: 'absolute',\r\n right: '36px',\r\n top: '46px',\r\n },\r\n primaryAdButtonVertical: {\r\n position: 'absolute',\r\n bottom: tokens.spacingVerticalM,\r\n left: tokens.spacingHorizontalL,\r\n },\r\n primaryAdButtonSquare: {\r\n position: 'absolute',\r\n bottom: tokens.spacingVerticalM,\r\n left: '92px',\r\n },\r\n secondaryAdButtonHorizontal: {\r\n position: 'absolute',\r\n right: '64px',\r\n top: '46px',\r\n backgroundColor: tokens.colorStatusDangerBackground2,\r\n color: tokens.colorNeutralBackground1,\r\n shadow: tokens.shadow64,\r\n },\r\n secondaryAdButtonSquare: {\r\n position: 'absolute',\r\n right: '96px',\r\n bottom: '46px',\r\n backgroundColor: tokens.colorStatusDangerBackground2,\r\n color: tokens.colorNeutralBackground1,\r\n shadow: tokens.shadow64,\r\n },\r\n secondaryAdButtonVertical: {\r\n position: 'absolute',\r\n bottom: '40px',\r\n left: tokens.spacingHorizontalL,\r\n backgroundColor: tokens.colorStatusDangerBackground2,\r\n color: tokens.colorNeutralBackground1,\r\n shadow: tokens.shadow64,\r\n },\r\n primaryAdBadgeHorizontal: {\r\n position: 'absolute',\r\n right: '36px',\r\n top: '15px',\r\n ...adBadgeStyle,\r\n },\r\n primaryAdBadgeSquare: {\r\n position: 'absolute',\r\n right: tokens.spacingHorizontalXXL,\r\n top: '1px',\r\n ...adBadgeStyle,\r\n },\r\n primaryAdBadgeVertical: {\r\n position: 'absolute',\r\n right: tokens.spacingVerticalXL,\r\n top: tokens.spacingVerticalXXS,\r\n ...adBadgeStyle,\r\n },\r\n secondaryBadgeHorizontal: {\r\n position: 'absolute',\r\n bottom: tokens.spacingVerticalM,\r\n left: tokens.spacingVerticalXXL,\r\n ...adBadgeStyle,\r\n },\r\n secondaryBadgeSquare: {\r\n position: 'absolute',\r\n bottom: tokens.spacingVerticalXXS,\r\n left: tokens.spacingVerticalXXS,\r\n ...adBadgeStyle,\r\n },\r\n secondaryBadgeVertical: {\r\n position: 'absolute',\r\n bottom: tokens.spacingVerticalXXS,\r\n left: tokens.spacingVerticalXXS,\r\n ...adBadgeStyle,\r\n },\r\n secondarySubtitleHorizontal: {\r\n ...secondarySubtitleStyles,\r\n marginTop: tokens.spacingHorizontalM,\r\n marginLeft: tokens.spacingHorizontalS,\r\n },\r\n secondarySubtitleSquare: {\r\n ...secondarySubtitleStyles,\r\n marginTop: '48px',\r\n marginLeft: tokens.spacingHorizontalS,\r\n },\r\n secondarySubtitleVertical: {\r\n ...secondarySubtitleStyles,\r\n textAlign: 'center',\r\n fontSize: tokens.fontSizeBase400,\r\n lineHeight: tokens.lineHeightBase300,\r\n marginTop: tokens.spacingHorizontalXXL,\r\n },\r\n primaryTitleVertical: {\r\n fontSize: tokens.fontSizeBase400,\r\n lineHeight: tokens.lineHeightBase400,\r\n },\r\n primaryTitleSquare: {\r\n marginTop: tokens.spacingVerticalS,\r\n },\r\n displayNone: {\r\n display: 'none',\r\n },\r\n primaryBodyVertical: {\r\n marginTop: '-60px',\r\n lineHeight: tokens.spacingVerticalL,\r\n },\r\n primaryBodySquare: {\r\n marginTop: '-34px',\r\n },\r\n});\r\n","import { Body1, Body1Strong, Button, Field, InfoLabel, Input, Label, LabelProps, Spinner } from '@fluentui/react-components';\r\nimport React, { useState } from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport { getAppStore, onHelpInfoCalloutOpened } from '../../../../../@data';\r\nimport { useNativeAdSdk } from '../../../../../hooks';\r\nimport AdPreview from '../../TythonAdunit/components/AdUnitTypeSelector/PreviewComponent';\r\nimport AutoFitHeight from '../../TythonAdunit/resources/AutoFitHeight.svg';\r\nimport AutoFitWidth from '../../TythonAdunit/resources/AutoFitWidth.svg';\r\nimport messages from '../messages';\r\nimport { InfoLabelContent } from './V2HelpInfoBubble';\r\nimport { useAppAdUnitPrimaryFormStyles } from './styles';\r\n\r\nconst NativeAdDynamicAdPreview = ({ intl: { formatMessage }, config }) => {\r\n const { isSdkLoaded } = useNativeAdSdk();\r\n\r\n const { helpInfo, locale } = getAppStore();\r\n const classNames = useAppAdUnitPrimaryFormStyles();\r\n const [adWidth, setAdWidth] = useState(config.adWidth);\r\n const [adHeight, setAdHeight] = useState(config.adHeight);\r\n\r\n return (\r\n <>\r\n <Field\r\n label={{\r\n children: (_: unknown, slotProps: LabelProps) => (\r\n <Label>\r\n <Body1Strong>{formatMessage(messages.appAdUnitNativePreviewTitle)}</Body1Strong>\r\n <Button\r\n className={classNames.infoBubbleNoRequire}\r\n appearance=\"transparent\"\r\n onClick={() => onHelpInfoCalloutOpened('pop_PCv4_SiteLevel', locale)}\r\n >\r\n <InfoLabel info={<InfoLabelContent html={helpInfo} />} />\r\n </Button>\r\n </Label>\r\n ),\r\n }}\r\n className={classNames.sectionTitle}\r\n />\r\n <div className={classNames.dimensionInputsWrapper}>\r\n <Body1>{formatMessage(messages.nativeAdPreviewContainerSize)}</Body1>\r\n <Input\r\n className={classNames.dimensionInput}\r\n contentBefore={<img src={AutoFitWidth} alt={formatMessage(messages.nativeAdPreviewContainerSize)} />}\r\n value={`${adWidth}` ?? ''}\r\n onChange={(e) => {\r\n const newValue = parseInt(e.target.value, 10);\r\n if (newValue >= 0) {\r\n setAdWidth(newValue);\r\n } else if (e.target.value === '') {\r\n setAdWidth(0);\r\n }\r\n }}\r\n type=\"number\"\r\n />\r\n <Body1Strong>x</Body1Strong>\r\n <Input\r\n className={classNames.dimensionInput}\r\n contentBefore={<img src={AutoFitHeight} alt={formatMessage(messages.nativeAdPreviewContainerSize)} />}\r\n value={`${adHeight}` ?? ''}\r\n onChange={(e) => {\r\n const newValue = parseInt(e.target.value, 10);\r\n if (newValue >= 0) {\r\n setAdHeight(newValue);\r\n } else if (e.target.value === '') {\r\n setAdHeight(0);\r\n }\r\n }}\r\n type=\"number\"\r\n />\r\n </div>\r\n {isSdkLoaded ? (\r\n <div className={classNames.previewSDKWrapper}>\r\n <AdPreview config={{ ...config, adHeight: adHeight, adWidth: adWidth }} />\r\n </div>\r\n ) : (\r\n <Spinner size=\"tiny\" />\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport default injectIntl(NativeAdDynamicAdPreview);\r\n","import { Body1, Button, Caption1, Card, Subtitle1, mergeClasses } from '@fluentui/react-components';\r\nimport React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport messages from '../messages';\r\nimport AdVector from './resources/adVector.svg';\r\nimport { useAdPreviewRendererStyles } from './styles';\r\nimport { AppAdUnitPreviewLayout } from './types';\r\n\r\nconst AdPreviewDynamicRenderer: React.FC<InjectedIntlProps & { layout: AppAdUnitPreviewLayout }> = ({\r\n intl: { formatMessage },\r\n layout,\r\n}) => {\r\n const classNames = useAdPreviewRendererStyles();\r\n\r\n const classes = React.useMemo(\r\n () => ({\r\n previewCardWrapperClass: {\r\n [AppAdUnitPreviewLayout.Horizontal]: classNames.previewCardWrapperHorizontal,\r\n [AppAdUnitPreviewLayout.Square]: classNames.previewCardWrapperSquare,\r\n [AppAdUnitPreviewLayout.Vertical]: classNames.previewCardWrapperVertical,\r\n },\r\n primaryAdWrapperClass: {\r\n [AppAdUnitPreviewLayout.Horizontal]: classNames.primaryAdWrapperHorizontal,\r\n [AppAdUnitPreviewLayout.Square]: classNames.primaryAdWrapperSquare,\r\n [AppAdUnitPreviewLayout.Vertical]: classNames.primaryAdWrapperVertical,\r\n },\r\n primaryButtonClass: {\r\n [AppAdUnitPreviewLayout.Horizontal]: classNames.primaryAdButtonHorizontal,\r\n [AppAdUnitPreviewLayout.Square]: classNames.primaryAdButtonSquare,\r\n [AppAdUnitPreviewLayout.Vertical]: classNames.primaryAdButtonVertical,\r\n },\r\n primaryTitleClass: {\r\n [AppAdUnitPreviewLayout.Vertical]: classNames.primaryTitleVertical,\r\n [AppAdUnitPreviewLayout.Square]: classNames.primaryTitleSquare,\r\n },\r\n primaryAdVectorClass: {\r\n [AppAdUnitPreviewLayout.Horizontal]: classNames.primaryAdIconHorizontal,\r\n [AppAdUnitPreviewLayout.Square]: classNames.primaryAdIconSquare,\r\n [AppAdUnitPreviewLayout.Vertical]: classNames.primaryAdIconVertical,\r\n },\r\n primaryAdBadgeClass: {\r\n [AppAdUnitPreviewLayout.Horizontal]: classNames.primaryAdBadgeHorizontal,\r\n [AppAdUnitPreviewLayout.Square]: classNames.primaryAdBadgeSquare,\r\n [AppAdUnitPreviewLayout.Vertical]: classNames.primaryAdBadgeVertical,\r\n },\r\n primaryCaptionClass: {\r\n [AppAdUnitPreviewLayout.Vertical]: classNames.displayNone,\r\n [AppAdUnitPreviewLayout.Square]: classNames.displayNone,\r\n },\r\n primaryBodyClass: {\r\n [AppAdUnitPreviewLayout.Vertical]: classNames.primaryBodyVertical,\r\n [AppAdUnitPreviewLayout.Square]: classNames.primaryBodySquare,\r\n },\r\n secondaryAdWrapperClass: {\r\n [AppAdUnitPreviewLayout.Horizontal]: classNames.secondaryAdWrapperHorizontal,\r\n [AppAdUnitPreviewLayout.Square]: classNames.secondaryAdWrapperSquare,\r\n [AppAdUnitPreviewLayout.Vertical]: classNames.secondaryAdWrapperVertical,\r\n },\r\n secondarySubtitleClass: {\r\n [AppAdUnitPreviewLayout.Horizontal]: classNames.secondarySubtitleHorizontal,\r\n [AppAdUnitPreviewLayout.Square]: classNames.secondarySubtitleSquare,\r\n [AppAdUnitPreviewLayout.Vertical]: classNames.secondarySubtitleVertical,\r\n },\r\n secondaryButtonClass: {\r\n [AppAdUnitPreviewLayout.Horizontal]: classNames.secondaryAdButtonHorizontal,\r\n [AppAdUnitPreviewLayout.Square]: classNames.secondaryAdButtonSquare,\r\n [AppAdUnitPreviewLayout.Vertical]: classNames.secondaryAdButtonVertical,\r\n },\r\n secondaryAdVectorClass: {\r\n [AppAdUnitPreviewLayout.Horizontal]: classNames.secondaryAdIconHorizontal,\r\n [AppAdUnitPreviewLayout.Square]: classNames.secondaryAdIconSquare,\r\n [AppAdUnitPreviewLayout.Vertical]: classNames.secondaryAdIconVertical,\r\n },\r\n secondaryAdBadgeClass: {\r\n [AppAdUnitPreviewLayout.Horizontal]: classNames.secondaryBadgeHorizontal,\r\n [AppAdUnitPreviewLayout.Square]: classNames.secondaryBadgeSquare,\r\n [AppAdUnitPreviewLayout.Vertical]: classNames.secondaryBadgeVertical,\r\n },\r\n }),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [layout]\r\n );\r\n return (\r\n <>\r\n <div className={mergeClasses(classes.previewCardWrapperClass[layout], classNames.nonSelectableText)}>\r\n <Card className={mergeClasses(classes.primaryAdWrapperClass[layout])}>\r\n <Subtitle1 className={mergeClasses(classes.primaryTitleClass[layout])}>{formatMessage(messages.adPreviewPrimaryTitle)}</Subtitle1>\r\n <Caption1 className={mergeClasses(classes.primaryCaptionClass[layout])}>\r\n {formatMessage(messages.adPreviewPrimaryDescriptionLine1)}\r\n </Caption1>\r\n <Body1 className={mergeClasses(classes.primaryBodyClass[layout])}>\r\n {formatMessage(messages.adPreviewPrimaryDescriptionLine2)}\r\n </Body1>\r\n <Button appearance=\"primary\" className={mergeClasses(classes.primaryButtonClass[layout])}>\r\n {formatMessage(messages.adPreviewPrimaryDescriptionActionButton)}\r\n </Button>\r\n <img\r\n className={mergeClasses(classes.primaryAdVectorClass[layout])}\r\n src={AdVector}\r\n alt={formatMessage(messages.adPreviewPrimaryTitle)}\r\n />\r\n <div className={mergeClasses(classes.primaryAdBadgeClass[layout])}>{formatMessage(messages.adPreviewAdBadgeContent)}</div>\r\n </Card>\r\n <Card className={mergeClasses(classes.secondaryAdWrapperClass[layout])}>\r\n <Subtitle1 className={mergeClasses(classes.secondarySubtitleClass[layout])}>\r\n {formatMessage(messages.adPreviewPrimaryTitle)}\r\n </Subtitle1>\r\n <Button className={mergeClasses(classes.secondaryButtonClass[layout])}>\r\n {formatMessage(messages.adPreviewPrimaryDescriptionActionButton)}\r\n </Button>\r\n <img\r\n className={mergeClasses(classes.secondaryAdVectorClass[layout])}\r\n src={AdVector}\r\n alt={formatMessage(messages.adPreviewPrimaryTitle)}\r\n />\r\n <div className={mergeClasses(classes.secondaryAdBadgeClass[layout])}>{formatMessage(messages.adPreviewAdBadgeContent)}</div>\r\n </Card>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default injectIntl(AdPreviewDynamicRenderer);\r\n","import { Body1Strong, InteractionTag, InteractionTagPrimary } from '@fluentui/react-components';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport messages from '../messages';\r\nimport AdPreviewDynamicRenderer from './AdPreviewDynamicRenderer';\r\nimport { useAppAdUnitPreviewStyles } from './styles';\r\nimport { AppAdUnitPreviewLayout, StaticAdPreviewType } from './types';\r\n\r\nconst StaticAdPreview: StaticAdPreviewType = ({ intl: { formatMessage }, dimension }) => {\r\n const [previewLayout, setPreviewLayout] = useState<AppAdUnitPreviewLayout>(AppAdUnitPreviewLayout.Horizontal);\r\n\r\n const classNames = useAppAdUnitPreviewStyles();\r\n\r\n const shouldRenderSquareAdPreview = true; // TODO: update this\r\n\r\n useEffect(() => {\r\n setPreviewLayout(AppAdUnitPreviewLayout.Horizontal);\r\n }, []);\r\n\r\n return (\r\n <div className={classNames.root}>\r\n <div className={classNames.tittleWrapper}>\r\n <Body1Strong>{formatMessage(messages.adTypePreviewTitle)}</Body1Strong>\r\n {!dimension && (\r\n <div className={classNames.layoutTagsWrapper}>\r\n <InteractionTag\r\n onClick={() => setPreviewLayout(AppAdUnitPreviewLayout.Horizontal)}\r\n appearance={previewLayout === AppAdUnitPreviewLayout.Horizontal ? 'brand' : 'filled'}\r\n >\r\n <InteractionTagPrimary>{formatMessage(messages.adTypePreviewLayoutHorizontal)}</InteractionTagPrimary>\r\n </InteractionTag>\r\n {shouldRenderSquareAdPreview && (\r\n <InteractionTag\r\n onClick={() => setPreviewLayout(AppAdUnitPreviewLayout.Square)}\r\n appearance={previewLayout === AppAdUnitPreviewLayout.Square ? 'brand' : 'filled'}\r\n >\r\n <InteractionTagPrimary>{formatMessage(messages.adTypePreviewLayoutSquare)}</InteractionTagPrimary>\r\n </InteractionTag>\r\n )}\r\n <InteractionTag\r\n onClick={() => setPreviewLayout(AppAdUnitPreviewLayout.Vertical)}\r\n appearance={previewLayout === AppAdUnitPreviewLayout.Vertical ? 'brand' : 'filled'}\r\n >\r\n <InteractionTagPrimary>{formatMessage(messages.adTypePreviewLayoutVertical)}</InteractionTagPrimary>\r\n </InteractionTag>\r\n </div>\r\n )}\r\n </div>\r\n <div className={classNames.previewWrapper}>\r\n <AdPreviewDynamicRenderer layout={previewLayout} />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default injectIntl(StaticAdPreview);\r\n","import { Card, Divider, Radio, Subtitle2, mergeClasses } from '@fluentui/react-components';\r\nimport { ChevronDown24Regular, ChevronUp24Regular } from '@fluentui/react-icons';\r\nimport React, { useEffect } from 'react';\r\nimport { isButtonPressKey } from '../../../../../utils/AccessibilityUtils';\r\nimport { useV2SectionalAccordionStyles } from './styles';\r\nimport { V2SectionalAccordionType } from './types';\r\n\r\n/**\r\n * this is same accordion as in ad unit detail page but build on top of fluent 2\r\n */\r\n\r\nconst V2SectionalAccordion: V2SectionalAccordionType = ({\r\n onTitleToggle,\r\n isAccordionSelected,\r\n onRenderLeft,\r\n onRenderRight,\r\n titleLabel,\r\n disabled,\r\n isLoading,\r\n}) => {\r\n const classNames = useV2SectionalAccordionStyles();\r\n const [isComponentExpanded, setIsComponentExpanded] = React.useState(false);\r\n const shouldComponentExpand = isComponentExpanded && !isLoading;\r\n const onTitleChecked = (checked) => {\r\n onTitleToggle();\r\n setIsComponentExpanded(checked);\r\n };\r\n\r\n useEffect(() => {\r\n setIsComponentExpanded(isAccordionSelected);\r\n }, [isAccordionSelected]);\r\n\r\n return (\r\n <Card className={classNames.card}>\r\n <div className={classNames.titleWrapper}>\r\n <Radio\r\n disabled={isLoading ? true : disabled}\r\n checked={isLoading ? false : isAccordionSelected}\r\n onChange={(_, data) => onTitleChecked(data.value)}\r\n label={<Subtitle2>{titleLabel}</Subtitle2>}\r\n onKeyDown={(ev) => {\r\n if (isButtonPressKey(ev.key)) {\r\n onTitleChecked(isAccordionSelected);\r\n }\r\n }}\r\n />\r\n {shouldComponentExpand ? (\r\n <ChevronUp24Regular\r\n tabIndex={0}\r\n onClick={() => setIsComponentExpanded(false)}\r\n className={mergeClasses(classNames.chevronIcon, disabled ? classNames.disabled : '')}\r\n onKeyDown={(ev) => {\r\n if (isButtonPressKey(ev.key)) {\r\n setIsComponentExpanded(false);\r\n }\r\n }}\r\n />\r\n ) : (\r\n <ChevronDown24Regular\r\n tabIndex={0}\r\n onClick={() => setIsComponentExpanded(true)}\r\n className={mergeClasses(classNames.chevronIcon, disabled ? classNames.disabled : '')}\r\n onKeyDown={(ev) => {\r\n if (isButtonPressKey(ev.key)) {\r\n setIsComponentExpanded(true);\r\n }\r\n }}\r\n />\r\n )}\r\n </div>\r\n {shouldComponentExpand && (\r\n <>\r\n <Divider className={classNames.horizontalDivider} />\r\n <div className={classNames.contentWrapper}>\r\n <div className={classNames.contentLeft}>{onRenderLeft()}</div>\r\n {onRenderRight ? <Divider className={classNames.verticalDivider} vertical /> : <></>}\r\n {onRenderRight ? <div className={classNames.contentRight}>{onRenderRight()}</div> : <></>}\r\n </div>\r\n </>\r\n )}\r\n </Card>\r\n );\r\n};\r\n\r\nexport default V2SectionalAccordion;\r\n","import {\r\n Body1,\r\n Body1Strong,\r\n Body1Stronger,\r\n Button,\r\n Caption1,\r\n Caption1Strong,\r\n Dropdown,\r\n Field,\r\n InfoLabel,\r\n Input,\r\n Label,\r\n LabelProps,\r\n MessageBar,\r\n MessageBarBody,\r\n Option,\r\n Radio,\r\n} from '@fluentui/react-components';\r\nimport React from 'react';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport { getAppStore, onHelpInfoCalloutOpened } from '../../../../../@data';\r\nimport { ColorPicker } from '../../../../../components/ColorPicker/ColorPicker';\r\nimport { FormItem } from '../../../../../components/Form';\r\nimport { useCMUIHelpExperience } from '../../../../../hooks';\r\nimport { injectIntlAndObserver } from '../../../../../utils';\r\nimport { fontOptions } from '../../TythonAdunit/services/fontOptions';\r\nimport { AppAdUnitType, SelectedAppAdUnitBannerSize, VideoPlayMethod, appAdUnitVideoPlayMethod } from '../CreateAdUnit/types';\r\nimport messages from '../messages';\r\nimport NativeAdDynamicAdPreview from './NativeAdDynamicAdPreview';\r\nimport StaticAdPreview from './StaticAdPreview';\r\nimport { InfoLabelContent } from './V2HelpInfoBubble';\r\nimport V2SectionalAccordion from './V2SectionalAccordion';\r\nimport { useAppAdUnitPrimaryFormStyles } from './styles';\r\nimport { AppAdUnitPrimaryFormType } from './types';\r\n\r\n/**\r\n * this form is build on top of fluent 2, it is required to wrap it inside a fluent provider\r\n * @returns\r\n */\r\nconst AppAdUnitPrimaryForm: AppAdUnitPrimaryFormType = ({\r\n intl: { formatMessage },\r\n applicationOptions,\r\n adUnitName,\r\n adUnitType,\r\n adUnitApplicationId,\r\n onAdUnitApplicationIdChange,\r\n onAdUnitNameChange,\r\n onAdUnitTypeChange,\r\n validationError,\r\n shouldRenderPrimaryForm,\r\n selectedBannerAdUnitAdSize,\r\n onBannerAdUnitAdSizeChange,\r\n bannerAdSizeOptions,\r\n videoAdUnitSkipAllowed,\r\n onVideoAdUnitSkipAllowedChange,\r\n videoAdUnitDuration,\r\n onVideoAdUnitDurationChange,\r\n nativeAdUnitConfig,\r\n onNativeAdUnitConfigChange,\r\n videoAdUnitPlayMethod,\r\n onVideoAdUnitPlayMethodChange,\r\n isAdUnitLoading,\r\n isEditMode,\r\n}) => {\r\n const classNames = useAppAdUnitPrimaryFormStyles();\r\n const { CMUIPopupArticleByIdAnchor } = useCMUIHelpExperience();\r\n\r\n if (!shouldRenderPrimaryForm) {\r\n return <></>;\r\n }\r\n\r\n const { helpInfo, locale } = getAppStore();\r\n\r\n const adTypeAccordionItems = [\r\n {\r\n adType: AppAdUnitType.Native,\r\n title: formatMessage(messages.appAdUnitTypeNativeAdsTitle),\r\n summary: () => (\r\n <>\r\n <Body1Stronger block>{formatMessage(messages.appAdUnitNativeAdConfigTitle)}</Body1Stronger>\r\n <br />\r\n <Field\r\n label={{\r\n children: (_: unknown, slotProps: LabelProps) => (\r\n <Label>\r\n <Body1>{formatMessage(messages.appAdUnitNativeAdsConfigFontLabel)}</Body1>\r\n <Button\r\n className={classNames.infoBubbleNoRequire}\r\n appearance=\"transparent\"\r\n onClick={() => onHelpInfoCalloutOpened('pop_PCv4_SiteLevel', locale)}\r\n >\r\n <InfoLabel info={<InfoLabelContent html={helpInfo} />} />\r\n </Button>\r\n </Label>\r\n ),\r\n }}\r\n />\r\n <Dropdown\r\n className={classNames.dimensionDropdown}\r\n onOptionSelect={(ev, data) => onNativeAdUnitConfigChange({ ...nativeAdUnitConfig, fontFamily: data.optionValue! })}\r\n selectedOptions={[nativeAdUnitConfig.fontFamily!]}\r\n value={nativeAdUnitConfig.fontFamily}\r\n >\r\n {fontOptions.map((option) => (\r\n <Option key={option.key} value={option.key as string} checkIcon={undefined}>\r\n {option.text}\r\n </Option>\r\n ))}\r\n </Dropdown>\r\n <div className={classNames.colorSelectorWrapper}>\r\n <Body1>{formatMessage(messages.appAdUnitNativeAdsConfigTitleColorLabel)}</Body1>\r\n <ColorPicker\r\n selectedColor={nativeAdUnitConfig.titleColor}\r\n onChange={(color) => onNativeAdUnitConfigChange({ ...nativeAdUnitConfig, titleColor: color })}\r\n colorType={formatMessage(messages.appAdUnitNativeAdsConfigTitleColorLabel)}\r\n controlled\r\n />\r\n </div>\r\n <div className={classNames.colorSelectorWrapper}>\r\n <Body1>{formatMessage(messages.appAdUnitNativeAdsConfigBackgroundLabel)}</Body1>\r\n <ColorPicker\r\n selectedColor={nativeAdUnitConfig.background}\r\n onChange={(color) => onNativeAdUnitConfigChange({ ...nativeAdUnitConfig, background: color })}\r\n colorType={formatMessage(messages.appAdUnitNativeAdsConfigBackgroundLabel)}\r\n controlled\r\n />\r\n </div>\r\n <div className={classNames.colorSelectorWrapper}>\r\n <Body1>{formatMessage(messages.appAdUnitNativeAdsConfigButtonBackgroundLabel)}</Body1>\r\n <ColorPicker\r\n selectedColor={nativeAdUnitConfig.buttonBackground}\r\n onChange={(color) => onNativeAdUnitConfigChange({ ...nativeAdUnitConfig, buttonBackground: color })}\r\n colorType={formatMessage(messages.appAdUnitNativeAdsConfigButtonBackgroundLabel)}\r\n controlled\r\n />\r\n </div>\r\n <MessageBar intent=\"info\" className={classNames.msgBar}>\r\n <MessageBarBody>\r\n <Caption1>{formatMessage(messages.appAdUnitNativeAdsConfigMsgBar)}</Caption1>\r\n </MessageBarBody>\r\n </MessageBar>\r\n </>\r\n ),\r\n preview: () => <NativeAdDynamicAdPreview config={nativeAdUnitConfig} />,\r\n },\r\n {\r\n adType: AppAdUnitType.Display,\r\n title: formatMessage(messages.appAdUnitTypeDisplayAdsTitle),\r\n summary: () => (\r\n <>\r\n <Field\r\n label={{\r\n children: (_: unknown, slotProps: LabelProps) => (\r\n <Label>\r\n <Body1Strong>{formatMessage(messages.appAdUnitDisplayAdsBannerAdSizeLabel)}</Body1Strong>\r\n <Button\r\n className={classNames.infoBubbleNoRequire}\r\n appearance=\"transparent\"\r\n onClick={() => onHelpInfoCalloutOpened('pop_PCv4_SiteLevel', locale)}\r\n >\r\n <InfoLabel info={<InfoLabelContent html={helpInfo} />} />\r\n </Button>\r\n </Label>\r\n ),\r\n }}\r\n />\r\n <Dropdown\r\n className={classNames.dimensionDropdown}\r\n onOptionSelect={(ev, data) => onBannerAdUnitAdSizeChange(data.optionValue! as SelectedAppAdUnitBannerSize)}\r\n selectedOptions={[selectedBannerAdUnitAdSize]}\r\n value={selectedBannerAdUnitAdSize}\r\n >\r\n {bannerAdSizeOptions.map((option) => (\r\n <Option key={option.key} value={option.key} checkIcon={undefined}>\r\n {option.value}\r\n </Option>\r\n ))}\r\n </Dropdown>\r\n <MessageBar intent=\"info\" className={classNames.msgBar}>\r\n <MessageBarBody>\r\n <Caption1>\r\n <FormattedMessage\r\n {...messages.adTypeInfoMsgContent}\r\n values={{\r\n helpLink: (\r\n <CMUIPopupArticleByIdAnchor query={'ext07504'} name={formatMessage(messages.adTypeInfoMsgHelpLink)} useV2Link />\r\n ),\r\n }}\r\n />\r\n </Caption1>\r\n </MessageBarBody>\r\n </MessageBar>\r\n </>\r\n ),\r\n preview: () => <StaticAdPreview dimension={selectedBannerAdUnitAdSize} />,\r\n },\r\n {\r\n adType: AppAdUnitType.Video,\r\n disabled: true,\r\n title: formatMessage(messages.appAdUnitTypeVideoAdsTitle),\r\n summary: () => (\r\n <>\r\n <Body1Stronger block>{formatMessage(messages.appAdUnitVideoAdsInterstitialVideoAdConfigTitle)}</Body1Stronger>\r\n <br />\r\n <Field\r\n label={{\r\n children: (_: unknown, slotProps: LabelProps) => (\r\n <Label>\r\n <Body1Strong>{formatMessage(messages.appAdUnitVideoAdsInterstitialVideoAdConfigVideoSkipLabel)}</Body1Strong>\r\n <Button\r\n className={classNames.infoButton}\r\n appearance=\"transparent\"\r\n onClick={() => onHelpInfoCalloutOpened('pop_PCv4_SiteLevel', locale)}\r\n >\r\n <InfoLabel info={<InfoLabelContent html={helpInfo} />} />\r\n </Button>\r\n </Label>\r\n ),\r\n }}\r\n />\r\n <Radio\r\n checked={videoAdUnitSkipAllowed === true}\r\n onChange={() => onVideoAdUnitSkipAllowedChange(true)}\r\n label={<Body1>{formatMessage(messages.appAdUnitVideoSkipYes)}</Body1>}\r\n />\r\n <Radio\r\n checked={videoAdUnitSkipAllowed === false}\r\n onChange={() => onVideoAdUnitSkipAllowedChange(false)}\r\n label={<Body1>{formatMessage(messages.appAdUnitVideoSkipNo)}</Body1>}\r\n />\r\n <Field\r\n label={{\r\n children: (_: unknown, slotProps: LabelProps) => (\r\n <Label>\r\n <Body1Strong>{formatMessage(messages.appAdUnitVideoAdsDuration)}</Body1Strong>\r\n <Button\r\n className={classNames.infoButton}\r\n appearance=\"transparent\"\r\n onClick={() => onHelpInfoCalloutOpened('pop_PCv4_SiteLevel', locale)}\r\n >\r\n <InfoLabel info={<InfoLabelContent html={helpInfo} />} />\r\n </Button>\r\n </Label>\r\n ),\r\n }}\r\n />\r\n <Input\r\n contentAfter={<Body1>{formatMessage(messages.appAdUnitVideoAdsDurationMetric)}</Body1>}\r\n value={videoAdUnitDuration ?? ''}\r\n placeholder=\"0-30\"\r\n onChange={(e) => {\r\n const newValue = parseInt(e.target.value, 10);\r\n if (newValue >= 0 && newValue <= 30) {\r\n onVideoAdUnitDurationChange(`${newValue}`);\r\n } else if (e.target.value === '') {\r\n onVideoAdUnitDurationChange(undefined); // Handle empty string if the input is cleared\r\n }\r\n }}\r\n type=\"number\"\r\n />\r\n <Field\r\n label={{\r\n children: (_: unknown, slotProps: LabelProps) => (\r\n <Label>\r\n <Body1Strong>{formatMessage(messages.appAdUnitVideoPlayMethodFieldLabel)}</Body1Strong>\r\n <Button\r\n className={classNames.infoButton}\r\n appearance=\"transparent\"\r\n onClick={() => onHelpInfoCalloutOpened('pop_PCv4_SiteLevel', locale)}\r\n >\r\n <InfoLabel info={<InfoLabelContent html={helpInfo} />} />\r\n </Button>\r\n </Label>\r\n ),\r\n }}\r\n />\r\n <Dropdown\r\n className={classNames.dimensionDropdown}\r\n onOptionSelect={(ev, data) => onVideoAdUnitPlayMethodChange(data.optionValue! as VideoPlayMethod)}\r\n selectedOptions={[videoAdUnitPlayMethod]}\r\n value={formatMessage(appAdUnitVideoPlayMethod.find((item) => item.value === videoAdUnitPlayMethod)?.label!)}\r\n >\r\n {appAdUnitVideoPlayMethod.map((option) => (\r\n <Option key={option.value} value={option.value} checkIcon={undefined}>\r\n {formatMessage(option.label)}\r\n </Option>\r\n ))}\r\n </Dropdown>\r\n </>\r\n ),\r\n },\r\n ];\r\n\r\n return (\r\n <>\r\n <Body1 className={classNames.subTitle} block>\r\n {formatMessage(messages.appDetailSubTitle)}\r\n </Body1>\r\n <FormItem>\r\n <Field\r\n label={{\r\n children: (_: unknown, slotProps: LabelProps) => (\r\n <Label>\r\n {formatMessage(messages.appAdUnitNameFieldLabel)}\r\n <Button\r\n id={adUnitName}\r\n className={classNames.infoButton}\r\n appearance=\"transparent\"\r\n onClick={() => onHelpInfoCalloutOpened('pop_PCv4_SiteLevel', locale)}\r\n >\r\n <InfoLabel info={<InfoLabelContent html={helpInfo} />} />\r\n </Button>\r\n </Label>\r\n ),\r\n }}\r\n aria-required={true}\r\n validationMessage={validationError.addUnitName}\r\n className={classNames.sectionTitle}\r\n >\r\n <Input\r\n value={adUnitName ? `${adUnitName}` : ''}\r\n placeholder={formatMessage(messages.appAdUnitNamePlaceholder)}\r\n disabled={isAdUnitLoading}\r\n onChange={(_, data) => onAdUnitNameChange(data.value)}\r\n />\r\n </Field>\r\n </FormItem>\r\n <FormItem>\r\n <Field\r\n label={{\r\n children: (_: unknown, slotProps: LabelProps) => (\r\n <Label>\r\n {formatMessage(messages.appAdUnitApplicationIdFieldLabel)}\r\n <Button\r\n className={classNames.infoButton}\r\n appearance=\"transparent\"\r\n onClick={() => onHelpInfoCalloutOpened('pop_PCv4_UniversalBlockSetting', locale)}\r\n >\r\n <InfoLabel info={<InfoLabelContent html={helpInfo} />} />\r\n </Button>\r\n </Label>\r\n ),\r\n }}\r\n required={true}\r\n aria-required={true}\r\n validationMessage={validationError.addUnitName}\r\n className={classNames.sectionTitle}\r\n >\r\n <Dropdown\r\n className={classNames.applicationDropdown}\r\n onOptionSelect={(ev, data) => onAdUnitApplicationIdChange(data.optionValue!)}\r\n value={adUnitApplicationId ? applicationOptions.find((item) => item.key === +adUnitApplicationId)?.label : ''}\r\n disabled={isEditMode}\r\n >\r\n {applicationOptions.map((option) => (\r\n <Option key={option.key} value={`${option.key}`} className={classNames.propertyOption} text={option.label}>\r\n <div>\r\n <Caption1Strong>{option.label}</Caption1Strong>\r\n <Caption1>{option.secondaryLabel}</Caption1>\r\n </div>\r\n </Option>\r\n ))}\r\n </Dropdown>\r\n </Field>\r\n </FormItem>\r\n <FormItem>\r\n <Field\r\n label={{\r\n children: (_: unknown, slotProps: LabelProps) => (\r\n <Label>\r\n {formatMessage(messages.appAdUnitTypeFieldLabel)}\r\n <Button\r\n className={classNames.infoButton}\r\n appearance=\"transparent\"\r\n onClick={() => onHelpInfoCalloutOpened('pop_PCv4_UniversalBlockSetting', locale)}\r\n >\r\n <InfoLabel info={<InfoLabelContent html={helpInfo} />} />\r\n </Button>\r\n </Label>\r\n ),\r\n }}\r\n required={true}\r\n aria-required={true}\r\n className={classNames.sectionTitle}\r\n />\r\n </FormItem>\r\n {adTypeAccordionItems.map((item) => (\r\n <>\r\n <V2SectionalAccordion\r\n key={item.adType}\r\n isAccordionSelected={adUnitType === item.adType}\r\n onTitleToggle={() => onAdUnitTypeChange(item.adType)}\r\n onRenderLeft={item.summary}\r\n onRenderRight={item.preview}\r\n titleLabel={item.title}\r\n disabled={item.disabled}\r\n isLoading={isAdUnitLoading}\r\n />\r\n <br />\r\n </>\r\n ))}\r\n </>\r\n );\r\n};\r\n\r\nexport default injectIntlAndObserver(AppAdUnitPrimaryForm);\r\n","import { Avatar, Body1, Body2, Button, Card, Link, Title3 } from '@fluentui/react-components';\r\nimport { Copy20Regular } from '@fluentui/react-icons';\r\nimport React, { useEffect } from 'react';\r\nimport { FormattedMessage, injectIntl } from 'react-intl';\r\nimport { AdUnit, getAppStore } from '../../../../../@data';\r\nimport AppAdUnitCodePanel, { useAppAdUnitCodePanel } from '../../../Ads/Manage/hooks/useAppAdUnitCodePanel';\r\nimport messages from '../messages';\r\nimport CodeIcon from './resources/codeIcon.svg';\r\nimport { useAppAdUnitResultSummaryStyles } from './styles';\r\nimport { AppAdUnitResultSummaryType } from './types';\r\n\r\nconst AppAdUnitResultSummary: AppAdUnitResultSummaryType = ({ adUnitId, shouldRenderResultSummary, intl: { formatMessage } }) => {\r\n const classNames = useAppAdUnitResultSummaryStyles();\r\n const adUnitPanelProps = useAppAdUnitCodePanel(true);\r\n const { publisher } = getAppStore();\r\n const [isCodeBlockActive, setIsCodeBlockActive] = React.useState<boolean>(false);\r\n\r\n const onCopy = (content: string) => {\r\n navigator.clipboard.writeText(content);\r\n };\r\n\r\n useEffect(() => {\r\n adUnitPanelProps.onPanelTrigger(isCodeBlockActive, ({ id: adUnitId } as unknown) as AdUnit);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isCodeBlockActive]);\r\n\r\n if (!shouldRenderResultSummary) {\r\n return <></>;\r\n }\r\n\r\n const publisherIdCodeSnippet = `publisher_${publisher?.id}`;\r\n return (\r\n <div className={classNames.root}>\r\n <Title3 block align=\"start\">\r\n {formatMessage(messages.adUnitFormSubmissionLabelSuccess)}\r\n </Title3>\r\n <br />\r\n <Body2 block align=\"start\">\r\n {formatMessage(messages.adUnitResultSummarySecondaryContent)}\r\n </Body2>\r\n <Body2 block align=\"start\">\r\n {formatMessage(messages.adUnitResultSummarySecondaryContentSecondary)}\r\n </Body2>\r\n <br />\r\n <Body1 block>\r\n <Avatar initials=\"1\" size={20} color=\"navy\" className={classNames.stepAvatar} />\r\n <FormattedMessage\r\n {...messages.adUnitResultSummaryFollowInstructionContent3}\r\n values={{\r\n helpLink: (\r\n <Link\r\n target=\"_blank\"\r\n href=\"https://eng.ms/docs/experiences-devices/webxt/microsoft-ads/pubcenter/microsoftadssdk/microsoft-ads-sdk/ads/docs/quickstart-guide\"\r\n >\r\n {formatMessage(messages.adUnitResultSummaryFollowInstructionContent3HelpLink)}\r\n </Link>\r\n ),\r\n }}\r\n />\r\n </Body1>\r\n <div className={classNames.codeCardWrapper}>\r\n <Card className={classNames.codeCard}>\r\n <img src={CodeIcon} className={classNames.codeIcon} alt={formatMessage(messages.adUnitResultSummaryFollowInstructionContent3)} />\r\n <div className={classNames.codeCardContent}>\r\n <Body1>{publisherIdCodeSnippet}</Body1>\r\n <Button onClick={() => onCopy(publisherIdCodeSnippet)} icon={<Copy20Regular />} />\r\n </div>\r\n </Card>\r\n </div>\r\n\r\n <Body1 block>\r\n <Avatar initials=\"2\" size={20} color=\"navy\" className={classNames.stepAvatar} />\r\n <FormattedMessage\r\n {...messages.adUnitResultSummaryFollowInstructionContent4}\r\n values={{\r\n helpLink: formatMessage(messages.adUnitResultSummaryFollowInstructionContent4HelpLink),\r\n }}\r\n />\r\n </Body1>\r\n <div className={classNames.codeCardWrapper}>\r\n <Card className={classNames.codeCard}>\r\n <img src={CodeIcon} className={classNames.codeIcon} alt={formatMessage(messages.adUnitResultSummaryFollowInstructionContent4)} />\r\n <div className={classNames.codeCardContent}>\r\n <Body1>{`adunit_${adUnitId}`}</Body1>\r\n <Button onClick={() => onCopy(`adunit_${adUnitId}`)} icon={<Copy20Regular />} />\r\n </div>\r\n </Card>\r\n <Body1 block align=\"start\" className={classNames.codeHelpText}>\r\n {formatMessage(messages.adUnitResultSummaryCodeHelpContent)}\r\n </Body1>\r\n <Button onClick={() => setIsCodeBlockActive(!isCodeBlockActive)} className={classNames.codePanelButton}>\r\n {formatMessage(\r\n adUnitPanelProps.isPanelOpen ? messages.adUnitResultSummaryCodeButtonInactive : messages.adUnitResultSummaryCodeButton\r\n )}\r\n </Button>\r\n <AppAdUnitCodePanel {...adUnitPanelProps} />\r\n </div>\r\n\r\n <Body1 block>\r\n <Avatar initials=\"3\" size={20} color=\"navy\" className={classNames.stepAvatar} />\r\n <FormattedMessage\r\n {...messages.adUnitResultSummaryFollowInstructionContent5}\r\n values={{\r\n helpLink: formatMessage(messages.adUnitResultSummaryFollowInstructionContent5HelpLink),\r\n }}\r\n />\r\n </Body1>\r\n </div>\r\n );\r\n};\r\n\r\nexport default injectIntl(AppAdUnitResultSummary);\r\n","import { useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { InventoryPlatformType, TythonAdUnitServingConfig, getAppStore, showSuccessToastNotification } from '../../../../../@data';\r\nimport { PropertyServingConfigs } from '../../../../../@data/store/schema/models/ServingConfigs';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { getTythonAdsManageRoute } from '../../../../../utils/routeUtils';\r\nimport { fetchPropertiesServingConfigs } from '../../../AdBlock/@data/services';\r\nimport {\r\n DEFAULT_AD_PREVIEW_BACKGROUND_COLOR,\r\n DEFAULT_AD_PREVIEW_BUTTON_BACKGROUND_COLOR,\r\n DEFAULT_AD_PREVIEW_FONT,\r\n DEFAULT_AD_PREVIEW_TITLE_BACKGROUND_COLOR,\r\n} from '../../TythonAdunit/CreateAdunit/constants';\r\nimport { ITythonAdUnit } from '../../TythonAdunit/CreateAdunit/types';\r\nimport { IAdPreviewConfig } from '../../TythonAdunit/components/AdUnitTypeSelector/PreviewComponent';\r\nimport { createTythonAdUnit } from '../../TythonAdunit/services/createTythonAdUnit';\r\nimport { fetchTythonAdUnitById } from '../../TythonAdunit/services/loadTythonAdUnitById';\r\nimport { updateTythonAdUnit } from '../../TythonAdunit/services/updateTythonAdUnit';\r\nimport messages from '../messages';\r\nimport {\r\n AppAdUnitBannerSize,\r\n AppAdUnitDetailPageProps,\r\n AppAdUnitType,\r\n SelectedAppAdUnitBannerSize,\r\n UseCreateTythonAppAdUnitType,\r\n VideoPlayMethod,\r\n} from './types';\r\n\r\nconst DEFAULT_NATIVE_CONFIG = {\r\n adWidth: 500,\r\n adHeight: 250,\r\n fontFamily: DEFAULT_AD_PREVIEW_FONT,\r\n background: DEFAULT_AD_PREVIEW_BACKGROUND_COLOR,\r\n buttonBackground: DEFAULT_AD_PREVIEW_BUTTON_BACKGROUND_COLOR,\r\n titleColor: DEFAULT_AD_PREVIEW_TITLE_BACKGROUND_COLOR,\r\n};\r\n\r\nconst mapPropertyToApplicationOptions = (servingConfigs: PropertyServingConfigs[]) => {\r\n return servingConfigs\r\n .filter((item) => item.inventoryPlatformType === InventoryPlatformType.UWP)\r\n .map((property) => ({\r\n key: property.propertyId! as number,\r\n secondaryLabel: property.MicrosoftStoreAppId as string,\r\n label: property.name as string,\r\n }));\r\n};\r\n\r\nconst useCreateTythonAppAdUnit: UseCreateTythonAppAdUnitType = ({ mode, formatMessage, routeProps }) => {\r\n const [adUnitName, setAdUnitName] = useState<string | undefined>(undefined);\r\n const [adUnitApplicationId, setAdUnitApplicationId] = useState<string | undefined>(undefined); // property id\r\n // const [adUnitType, setAdUnitType] = useState<AppAdUnitType | undefined>(undefined);\r\n const [adUnitType, setAdUnitType] = useState<AppAdUnitType | undefined>(AppAdUnitType.Native);\r\n const [bannerAdUnitAdSize, setBannerAdUnitAdSize] = useState<SelectedAppAdUnitBannerSize>('320 x 50');\r\n const [videoAdUnitPlayMethod, setVideoAdUnitPlayMethod] = useState<VideoPlayMethod>('auto_sound_on');\r\n const [applicationOptions, setApplicationOptions] = useState<{ key: number; label: string; secondaryLabel: string }[]>([]);\r\n const [videoAdUnitSkipAllowed, setVideoAdUnitSkipAllowed] = useState<boolean | undefined>(undefined);\r\n const [videoAdUnitDuration, setVideoAdUnitDuration] = useState<string | undefined>(undefined);\r\n const [nativeAdUnitConfig, setNativeAdUnitConfig] = useState<IAdPreviewConfig>(DEFAULT_NATIVE_CONFIG);\r\n const [rawAdUnit, setRawAdUnit] = useState<TythonAdUnitServingConfig | undefined>(undefined);\r\n\r\n const [shouldRenderPrimaryForm, setShouldRenderPrimaryForm] = useState<boolean>(true);\r\n const [shouldRenderResultSummary, setShouldRenderResultSummary] = useState<boolean>(false);\r\n const [isSavingAdUnit, setIsSavingAdUnit] = useState<boolean>(false);\r\n const [isAdUnitLoading, setIsAdUnitLoading] = useState<boolean>(false);\r\n const { publisher, userContext, account } = getAppStore();\r\n const isEditMode = mode === FormState.Edit || rawAdUnit !== undefined;\r\n\r\n /**\r\n * initialize form props for existing ad unit\r\n */\r\n useEffect(() => {\r\n // load property serving configs\r\n async function asyncInitAdUnitData(formStateMode: FormState) {\r\n const propertyServingConfigPromise = fetchPropertiesServingConfigs(publisher!);\r\n setIsAdUnitLoading(true);\r\n if (formStateMode === FormState.Edit) {\r\n try {\r\n const adUnitId = (routeProps.match.params as { id: string }).id!;\r\n const fetchedAdUnitPromise = fetchTythonAdUnitById(publisher!, userContext!, adUnitId!, formatMessage);\r\n const [propertyServingConfig, adUnitRaw] = await Promise.all([propertyServingConfigPromise, fetchedAdUnitPromise]);\r\n const nextOptions = mapPropertyToApplicationOptions(propertyServingConfig);\r\n setApplicationOptions(nextOptions);\r\n setRawAdUnit(adUnitRaw);\r\n setAdUnitName(adUnitRaw.adUnitName);\r\n setAdUnitApplicationId(`${adUnitRaw.propertyId}`);\r\n setAdUnitType((adUnitRaw.adTypes[0] as unknown) as AppAdUnitType);\r\n if (((adUnitRaw.adTypes[0] as unknown) as AppAdUnitType) === AppAdUnitType.Native) {\r\n setNativeAdUnitConfig({ ...DEFAULT_NATIVE_CONFIG, ...adUnitRaw.nativeProperties } as IAdPreviewConfig);\r\n }\r\n } catch (e) {\r\n console.error(e);\r\n } finally {\r\n setIsAdUnitLoading(false);\r\n }\r\n } else {\r\n try {\r\n const [propertyServingConfig] = await Promise.all([propertyServingConfigPromise]);\r\n if (propertyServingConfig.length) {\r\n const nextOptions = mapPropertyToApplicationOptions(propertyServingConfig);\r\n setApplicationOptions(nextOptions);\r\n }\r\n } catch (e) {\r\n console.error(e);\r\n } finally {\r\n setIsAdUnitLoading(false);\r\n }\r\n }\r\n }\r\n asyncInitAdUnitData(mode);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const primaryFormProps = useMemo(() => {\r\n const validationError = {\r\n addUnitName: undefined,\r\n };\r\n return {\r\n adUnitName,\r\n onAdUnitNameChange: setAdUnitName,\r\n adUnitApplicationId,\r\n onAdUnitApplicationIdChange: setAdUnitApplicationId,\r\n adUnitType,\r\n onAdUnitTypeChange: setAdUnitType,\r\n shouldRenderPrimaryForm,\r\n validationError,\r\n applicationOptions: applicationOptions,\r\n selectedBannerAdUnitAdSize: bannerAdUnitAdSize,\r\n onBannerAdUnitAdSizeChange: setBannerAdUnitAdSize,\r\n bannerAdSizeOptions: Object.values(AppAdUnitBannerSize).map((item) => ({ ...item, key: item.value })),\r\n videoAdUnitSkipAllowed,\r\n onVideoAdUnitSkipAllowedChange: setVideoAdUnitSkipAllowed,\r\n videoAdUnitDuration,\r\n onVideoAdUnitDurationChange: setVideoAdUnitDuration,\r\n nativeAdUnitConfig,\r\n onNativeAdUnitConfigChange: setNativeAdUnitConfig,\r\n videoAdUnitPlayMethod,\r\n onVideoAdUnitPlayMethodChange: setVideoAdUnitPlayMethod,\r\n isAdUnitLoading,\r\n isEditMode,\r\n };\r\n }, [\r\n adUnitName,\r\n adUnitApplicationId,\r\n videoAdUnitSkipAllowed,\r\n adUnitType,\r\n shouldRenderPrimaryForm,\r\n bannerAdUnitAdSize,\r\n applicationOptions,\r\n videoAdUnitDuration,\r\n nativeAdUnitConfig,\r\n videoAdUnitPlayMethod,\r\n isAdUnitLoading,\r\n isEditMode,\r\n ]);\r\n\r\n const onAdUnitSubmit = useCallback(async () => {\r\n const isCreatingNewAdUnit = window?.location?.href.includes('adunit/createApp');\r\n\r\n if (!publisher || !userContext || !account) {\r\n return;\r\n }\r\n const { adHeight, adWidth, ...deStructuredNativeConfig } = nativeAdUnitConfig;\r\n\r\n if (isCreatingNewAdUnit) {\r\n await createTythonAdUnit(\r\n publisher,\r\n userContext,\r\n account,\r\n ({\r\n propertyId: adUnitApplicationId,\r\n name: adUnitName,\r\n adTypes: [adUnitType!],\r\n nativeProperties: deStructuredNativeConfig,\r\n } as unknown) as ITythonAdUnit,\r\n setIsSavingAdUnit\r\n )\r\n .then((data) => {\r\n setRawAdUnit(data.data.servingConfig);\r\n setShouldRenderResultSummary(true);\r\n setShouldRenderPrimaryForm(false);\r\n })\r\n .catch((e) => {\r\n console.error(e);\r\n });\r\n } else {\r\n await updateTythonAdUnit(\r\n publisher,\r\n userContext,\r\n ({\r\n raw: rawAdUnit,\r\n id: rawAdUnit?.adUnitId,\r\n propertyId: adUnitApplicationId,\r\n name: adUnitName,\r\n adTypes: [adUnitType!],\r\n nativeProperties: deStructuredNativeConfig,\r\n accountId: rawAdUnit?.accountId,\r\n } as unknown) as ITythonAdUnit,\r\n rawAdUnit?.adUnitName !== adUnitName,\r\n setIsSavingAdUnit\r\n ).then((data) => {\r\n if (data && (data as { isDirty?: boolean }).isDirty === false) {\r\n setShouldRenderResultSummary(true);\r\n setShouldRenderPrimaryForm(false);\r\n return;\r\n }\r\n Log.info(`update tython ad unit success ${JSON.stringify(data)}`);\r\n showSuccessToastNotification({ text: formatMessage(messages.appAdUnitUpdateSuccess, { adunitId: rawAdUnit?.adUnitId }) });\r\n setShouldRenderResultSummary(true);\r\n setShouldRenderPrimaryForm(false);\r\n });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [nativeAdUnitConfig, adUnitName, adUnitApplicationId, adUnitType]);\r\n\r\n const detailPageProps = useMemo(() => {\r\n // Define default properties\r\n let props: AppAdUnitDetailPageProps = {\r\n saving: isSavingAdUnit,\r\n overlayHeight: '100vh',\r\n loading: isAdUnitLoading,\r\n onSubmit: () => {\r\n return;\r\n },\r\n submitButtonDisabled: isAdUnitLoading,\r\n submitLabel: '',\r\n titleLabel: '',\r\n cancelLabel: '',\r\n hasFormTitle: true,\r\n hideNavButton: false,\r\n pageMode: mode,\r\n };\r\n\r\n if (shouldRenderPrimaryForm) {\r\n props = {\r\n ...props,\r\n titleLabel: formatMessage(messages.createNewAppAdUnitPrimaryFormTitle),\r\n cancelLabel: formatMessage(messages.adUnitFormCancelLabel),\r\n submitLabel: formatMessage(messages.adUnitFormNextLabel),\r\n onSubmit: () => {\r\n onAdUnitSubmit();\r\n },\r\n onCancel: () => routeProps.history.push(getTythonAdsManageRoute(true)),\r\n };\r\n } else {\r\n props = {\r\n ...props,\r\n submitLabel: formatMessage(messages.adUnitFormDoneLabel),\r\n onSubmit: () => routeProps.history.push(getTythonAdsManageRoute(true)),\r\n hideNavButton: true,\r\n };\r\n }\r\n\r\n return props;\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [mode, shouldRenderPrimaryForm, adUnitType, shouldRenderResultSummary, isSavingAdUnit, onAdUnitSubmit, isAdUnitLoading]);\r\n\r\n const resultSummaryProps = useMemo(() => {\r\n return {\r\n shouldRenderResultSummary,\r\n adUnitId: rawAdUnit?.adUnitId?.toString() ?? '',\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [shouldRenderResultSummary, rawAdUnit]);\r\n\r\n return {\r\n primaryFormProps,\r\n detailPageProps,\r\n resultSummaryProps,\r\n };\r\n};\r\n\r\nexport default useCreateTythonAppAdUnit;\r\n","import { FluentProvider, webLightTheme } from '@fluentui/react-components';\r\nimport React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { getAppStore } from '../../../../../@data';\r\nimport { DetailPage } from '../../../../../layout/DetailPage/DetailPage';\r\nimport { injectIntlAndObserver } from '../../../../../utils';\r\nimport AppAdUnitPrimaryForm from '../components/AppAdUnitPrimaryForm';\r\nimport AppAdUnitResultSummary from '../components/AppAdUnitResultSummary';\r\nimport { ICreateTythonAppAdunitProps } from './types';\r\nimport useCreateTythonAppAdUnit from './useCreateTythonAppAdUnit';\r\n\r\nconst CreateTythonAppAdUnit = injectIntlAndObserver<InjectedIntlProps & ICreateTythonAppAdunitProps>(\r\n ({ intl: { formatMessage }, mode, routeProps }) => {\r\n const appStore = getAppStore();\r\n const { detailPageProps, primaryFormProps, resultSummaryProps } = useCreateTythonAppAdUnit({\r\n mode,\r\n formatMessage,\r\n appStore,\r\n routeProps,\r\n });\r\n\r\n return (\r\n <DetailPage {...detailPageProps}>\r\n <FluentProvider theme={webLightTheme}>\r\n <AppAdUnitPrimaryForm {...primaryFormProps} />\r\n <AppAdUnitResultSummary {...resultSummaryProps} />\r\n </FluentProvider>\r\n </DetailPage>\r\n );\r\n }\r\n);\r\n\r\nexport default CreateTythonAppAdUnit;\r\n","import * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { Route, RouteComponentProps, Switch } from 'react-router-dom';\r\nimport { isTythonSelfServeUser } from '../../../@data';\r\nimport { RoutePrefix } from '../../../Routes';\r\nimport { FormState } from '../../../components/Form';\r\nimport { injectIntlWithObserver } from '../../../utils';\r\nimport { getTythonAppAdunitCreationRoute } from '../../../utils/routeUtils';\r\nimport { RouteName } from '../@data';\r\nimport { onCurrentRouteChanged } from '../@data/actions';\r\nimport './@data/mutatorActions';\r\nimport './@data/mutators';\r\nimport './@data/orchestrators';\r\nimport { CreateAdunit } from './Create/CreateAdunit';\r\nimport { ManagePage } from './Manage/ManagePage';\r\nimport CreateTythonAdunit from './TythonAdunit/CreateAdunit';\r\nimport CreateTythonAppAdUnit from './TythonAppAdUnit/CreateAdUnit';\r\n\r\nenum Operation {\r\n Create,\r\n Edit,\r\n}\r\n\r\nexport const AdunitPage = injectIntlWithObserver(function AdUnitPageComponent(props: RouteComponentProps & InjectedIntlProps) {\r\n const _tythonUser = isTythonSelfServeUser();\r\n\r\n const getRedirectionPage = (operation: Operation, componentProps: RouteComponentProps, isAppAdunit = false) => {\r\n const mode = operation === Operation.Create ? FormState.Create : FormState.Edit;\r\n if (_tythonUser) {\r\n if (isAppAdunit) {\r\n return <CreateTythonAppAdUnit routeProps={componentProps} mode={mode} />;\r\n }\r\n return <CreateTythonAdunit routeProps={componentProps} mode={mode} />;\r\n } else {\r\n return <CreateAdunit {...componentProps} mode={mode} />;\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n onCurrentRouteChanged(RouteName.adunit, props.intl.formatMessage);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <React.Fragment>\r\n <Switch>\r\n {/* TODO: use the new TythonManagePage when ad unit serving config api is fully migrated */}\r\n {/* <Route exact path={`${props.match.url}`} component={_tythonUser ? TythonManagePage : ManagePage} /> */}\r\n <Route exact path={`${props.match.url}`} component={ManagePage} />\r\n <Route\r\n exact\r\n path={`/${RoutePrefix.adManagement}/:publisherId-:accountId/${RouteName[RouteName.adunit]}/create`}\r\n render={(componentProps) => getRedirectionPage(Operation.Create, componentProps)}\r\n />\r\n <Route\r\n exact\r\n path={getTythonAppAdunitCreationRoute()}\r\n render={(componentProps) => getRedirectionPage(Operation.Create, componentProps, true)}\r\n />\r\n <Route\r\n exact\r\n path={`/${RoutePrefix.adManagement}/:publisherId-:accountId/${RouteName.adunit}/editApp/:id`}\r\n render={(componentProps) => getRedirectionPage(Operation.Edit, componentProps, true)}\r\n />\r\n <Route\r\n exact\r\n path={`/${RoutePrefix.adManagement}/:publisherId/${RouteName.adunit}/editApp/:id`}\r\n render={(componentProps) => getRedirectionPage(Operation.Edit, componentProps, true)}\r\n />\r\n <Route\r\n path={`/${RoutePrefix.adManagement}/:publisherId-:accountId/${RouteName[RouteName.adunit]}/create/:id`}\r\n render={(componentProps) => getRedirectionPage(Operation.Create, componentProps)}\r\n />\r\n <Route\r\n exact\r\n path={`/${RoutePrefix.adManagement}/:publisherId-:accountId/${RouteName[RouteName.adunit]}/edit/:id`}\r\n render={(componentProps) => getRedirectionPage(Operation.Edit, componentProps)}\r\n />\r\n <Route\r\n exact\r\n path={`/${RoutePrefix.adManagement}/:publisherId/${RouteName[RouteName.adunit]}/edit/:id`}\r\n render={(componentProps) => getRedirectionPage(Operation.Edit, componentProps)}\r\n />\r\n <Route\r\n exact\r\n path={`/${RoutePrefix.adManagement}/:publisherId-:accountId/${RouteName[RouteName.adunit]}/edit/:id?step=:step`}\r\n render={(componentProps) => getRedirectionPage(Operation.Edit, componentProps)}\r\n />\r\n <Route\r\n exact\r\n path={`/${RoutePrefix.adManagement}/:publisherId-:accountId/${\r\n RouteName[RouteName.adunit]\r\n }/edit/:id?step=:step&showExtraBtns/:showExtraBtns`}\r\n render={(componentProps) => getRedirectionPage(Operation.Edit, componentProps)}\r\n />\r\n </Switch>\r\n </React.Fragment>\r\n );\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { Channel } from '../../../../../@data';\r\nimport { mergeTypeWithObject } from '../../../../../utils';\r\nimport {\r\n onChannelChanged,\r\n onChannelErrorChanged,\r\n onChannelsFetched,\r\n onFetchChannelsLoading,\r\n onFetchingChannelsData,\r\n onRawChanged,\r\n} from '../actions';\r\nimport { getStore } from '../store/store';\r\n\r\nmutator(onRawChanged, (msg) => {\r\n getStore().raw = mergeTypeWithObject(new Channel(), msg.value);\r\n});\r\n\r\nmutator(onChannelChanged, (msg) => {\r\n getStore().active = msg.channel;\r\n});\r\n\r\nmutator(onFetchChannelsLoading, (msg) => {\r\n getStore().isLoading = msg.isLoading;\r\n});\r\n\r\nmutator(onFetchingChannelsData, (msg) => {\r\n getStore().isFetchingData = msg.isFetchingData;\r\n});\r\n\r\nmutator(onChannelsFetched, (msg) => {\r\n getStore().gridChannels = msg.items;\r\n});\r\n\r\nmutator(onChannelErrorChanged, (msg) => {\r\n const store = getStore();\r\n if (!store.errors.name && !store.errors.adunitsSelected && !store.errors.filtersSelected && !!msg.values) {\r\n getStore().errors = msg.values;\r\n } else if (!!getStore().errors.name || !!getStore().errors.adunitsSelected || !!getStore().errors.filtersSelected) {\r\n getStore().errors = msg.values || {};\r\n }\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { onFormAdunitsChanged, onFormChannelNameChanged, onFormCleared, onFormFiltersChanged, onFormIdChanged } from '../actions';\r\nimport { getStore } from '../store/store';\r\n\r\nmutator(onFormIdChanged, msg => {\r\n getStore().active.id = msg.value;\r\n});\r\n\r\nmutator(onFormChannelNameChanged, msg => {\r\n getStore().active.name = msg.value;\r\n});\r\n\r\nmutator(onFormAdunitsChanged, msg => {\r\n getStore().active.adunitsSelected = msg.values;\r\n});\r\n\r\nmutator(onFormFiltersChanged, msg => {\r\n getStore().active.filtersSelected = msg.values;\r\n});\r\n\r\nmutator(onFormCleared, () => {\r\n getStore().active = {};\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { onPanelOpenChanged } from '../../../@data/actions';\r\nimport { onFormCancelled, onFormCleared } from '../actions';\r\n\r\norchestrator(onFormCancelled, async msg => {\r\n onFormCleared();\r\n if (msg.mode === FormState.InPageCreate) {\r\n onPanelOpenChanged(false);\r\n }\r\n});\r\n","import { Channel, listEntity, Publisher, UserContext } from '../../../../../@data';\r\n\r\nexport const fetchChannelById = async (publisher: Publisher, id: string, userContext?: UserContext): Promise<Channel> => {\r\n const list = await listEntity([publisher], userContext, Channel, new URLSearchParams([['ids', id]]));\r\n\r\n if (!list || !list.length) {\r\n throw Error('Cannot find channel Id');\r\n }\r\n\r\n return list[0];\r\n};\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport {\r\n Account,\r\n AdUnit,\r\n Filter,\r\n FilterScope,\r\n getAppStore,\r\n listEntity,\r\n onLoadingChanged,\r\n onNotificationChanged,\r\n Publisher,\r\n} from '../../../../../@data';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { IIdNamePair } from '../../../../../components/MultiSelectPicker';\r\nimport { setPublisherAndAccountContext } from '../../../@data/services/AdManagementService';\r\nimport { fetchAdunitById } from '../../../Adunit/@data/services/AdunitService';\r\nimport { onChannelChanged, onChannelErrorChanged, onFormInitialized, onRawChanged } from '../actions';\r\nimport { fetchChannelById } from '../services/ChannelService';\r\nimport { IChannelViewModel } from '../store/schema';\r\n\r\norchestrator(onFormInitialized, async (msg) => {\r\n const { userContext } = getAppStore();\r\n\r\n const viewModel: IChannelViewModel = {\r\n filters: [],\r\n adunits: [],\r\n };\r\n\r\n const publisherId = parseInt(msg.publisherId, 10);\r\n let accountId = parseInt(msg.accountId, 10);\r\n\r\n // To load create channel page in adunit edit page with 'All accounts' scope\r\n if (!isNaN(publisherId) && accountId === 0 && msg.mode === FormState.InPageCreate && msg.entityId) {\r\n const adunit = await fetchAdunitById(new Publisher(publisherId), msg.entityId, userContext);\r\n accountId = adunit.accountId || NaN;\r\n }\r\n\r\n if (!isNaN(publisherId) && !isNaN(accountId)) {\r\n const publisher = new Publisher(publisherId);\r\n const account = new Account(accountId);\r\n\r\n try {\r\n setPublisherAndAccountContext(publisher, account);\r\n\r\n onChannelErrorChanged();\r\n onLoadingChanged(true);\r\n\r\n const response = await Promise.all([\r\n listEntity([publisher, account], userContext, AdUnit),\r\n listEntity([publisher, account], userContext, Filter),\r\n ]);\r\n\r\n viewModel.adunits = response[0] ? response[0]!.map((f) => ({ id: f.id, name: f.name } as IIdNamePair)) : [];\r\n\r\n // Filters for this scenario need to be scoped by Account, in order to edit/save them in UI.\r\n viewModel.filters = response[1]\r\n ? response[1]!.filter((f) => f.filterScope === FilterScope.Account).map((f) => ({ id: f.id, name: f.name } as IIdNamePair))\r\n : [];\r\n\r\n if (msg.mode === FormState.Edit && msg.entityId) {\r\n const raw = await fetchChannelById(publisher, msg.entityId, userContext);\r\n\r\n viewModel.id = raw.id;\r\n viewModel.name = String(raw.name);\r\n viewModel.filtersSelected = raw.associatedFilterIds ? viewModel.filters.filter((a) => raw.associatedFilterIds!.includes(a.id)) : [];\r\n viewModel.adunitsSelected = raw.associatedAdUnitIds ? viewModel.adunits.filter((f) => raw.associatedAdUnitIds!.includes(f.id)) : [];\r\n\r\n onRawChanged(raw);\r\n } else {\r\n onRawChanged();\r\n }\r\n\r\n onChannelChanged(viewModel);\r\n } catch (e) {\r\n onNotificationChanged({\r\n text: 'Failed to load entity',\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n text: `You have arrived in an invalid state, please report.`,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport {\r\n Channel,\r\n ChannelType,\r\n getAppStore,\r\n onNavigateBack,\r\n onNotificationChanged,\r\n onSavingChanged,\r\n postEntity,\r\n putEntity,\r\n} from '../../../../../@data';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { IIdNamePair } from '../../../../../components/MultiSelectPicker';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport { validateSchema } from '../../../../../utils';\r\nimport { RouteName } from '../../../@data';\r\nimport { onPanelOpenChanged } from '../../../@data/actions';\r\nimport { createReturnUrl } from '../../../@data/services/AdManagementService';\r\nimport { onFilterChannelListChanged } from '../../../AdFilter/@data/actions';\r\nimport { getFilterStore } from '../../../AdFilter/@data/store/store';\r\nimport { getAdunitStore } from '../../../Adunit/@data';\r\nimport { onAdunitChannelListChanged } from '../../../Adunit/@data/actions';\r\nimport { fetchAdunitById } from '../../../Adunit/@data/services/AdunitService';\r\nimport { onChannelErrorChanged, onFormCleared, onFormIdChanged, onFormSubmitted } from '../actions';\r\nimport { fetchChannelById } from '../services/ChannelService';\r\nimport { channelErrorModel } from '../store/schema/ChannelErrorModel';\r\nimport { getStore } from '../store/store';\r\n\r\n/**\r\n * 1) Set Loading to true\r\n * 2) Submit API call to Submit Data to Store\r\n * 3) Check errors, if any, send action to notification that error exists\r\n * 4) Clear the form\r\n * 5) Navigate back to channel list\r\n */\r\norchestrator(onFormSubmitted, async (msg) => {\r\n const { publisher, account, userContext } = getAppStore();\r\n const { active, raw } = getStore();\r\n\r\n let notification: INotificationBarItem = {};\r\n\r\n if (userContext && publisher && account && raw) {\r\n const body: Channel = {\r\n ...raw,\r\n id: active.id,\r\n name: active.name,\r\n accountId: account.id,\r\n };\r\n\r\n if (body.accountId === 0 && msg.entityId && msg.mode === FormState.InPageCreate) {\r\n // fetch accountId using adunit id\r\n const adunit = await fetchAdunitById(publisher, msg.entityId, userContext);\r\n body.accountId = adunit.accountId || NaN;\r\n }\r\n\r\n try {\r\n await validateSchema(channelErrorModel(), active);\r\n onChannelErrorChanged();\r\n } catch (e) {\r\n onChannelErrorChanged(e);\r\n onNotificationChanged({\r\n text: `Channel - You have ${Object.keys(e).length} missing fields, please fill them to continue.`,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n return;\r\n }\r\n\r\n onSavingChanged(true);\r\n\r\n body.type = ChannelType.CUSTOM;\r\n body.urls = [];\r\n body.associatedAdUnitIds = active.adunitsSelected ? active.adunitsSelected.map((m) => m.id) : [];\r\n body.associatedFilterIds = active.filtersSelected ? active.filtersSelected.map((m) => m.id) : [];\r\n\r\n try {\r\n let entity: Channel | undefined;\r\n\r\n if (msg.mode === FormState.Edit) {\r\n entity = await putEntity([publisher], body, userContext, Channel);\r\n\r\n notification = {\r\n text: `Edited channel ${entity.id} success`,\r\n messageBarType: MessageBarType.success,\r\n };\r\n } else {\r\n entity = await postEntity([publisher], Channel, body, userContext);\r\n\r\n if (entity && entity.id) {\r\n onFormIdChanged(entity.id);\r\n const filterStore = getFilterStore();\r\n const adunitStore = getAdunitStore();\r\n\r\n const channel = await fetchChannelById(publisher, entity.id + '', userContext);\r\n const filterChannelList = [] as IIdNamePair[];\r\n const adunitChannelList = [] as IIdNamePair[];\r\n\r\n if (filterStore.active.channels) {\r\n const newChannel = { id: channel.id, name: channel.name } as IIdNamePair;\r\n filterChannelList.push(...filterStore.active.channels);\r\n filterChannelList.push(newChannel);\r\n }\r\n\r\n if (adunitStore.active.channels) {\r\n const newChannel = { id: channel.id, name: channel.name } as IIdNamePair;\r\n adunitChannelList.push(...adunitStore.active.channels);\r\n adunitChannelList.push(newChannel);\r\n }\r\n onFilterChannelListChanged(filterChannelList);\r\n onAdunitChannelListChanged(adunitChannelList);\r\n }\r\n\r\n notification = {\r\n text: `Created new channel ${entity.id} success`,\r\n messageBarType: MessageBarType.success,\r\n };\r\n }\r\n\r\n if (msg.mode === FormState.InPageCreate) {\r\n onPanelOpenChanged(false);\r\n } else {\r\n // return to manage page\r\n const returnUrl = createReturnUrl(RouteName.channel, String(publisher.id), String(account.id));\r\n onNavigateBack(msg.routeHistory, returnUrl);\r\n }\r\n\r\n onFormCleared();\r\n } catch (e) {\r\n notification = {\r\n text: `Submitting the channel form \"${FormState[msg.mode]}\" caught an error \"${e}\"`,\r\n messageBarType: MessageBarType.error,\r\n };\r\n } finally {\r\n onSavingChanged(false);\r\n }\r\n } else {\r\n notification = {\r\n text: `Channel form \"${FormState[msg.mode]}\" is invalid id ${active.id}`,\r\n messageBarType: MessageBarType.warning,\r\n };\r\n }\r\n\r\n onNotificationChanged(notification);\r\n});\r\n","import { object, string } from 'yup';\r\nimport { IdNamePairErrorModel } from '../../../../../../@data/store/schema';\r\nimport { ArrayObservableSchemaYupType } from '../../../../../../utils/validation';\r\nimport { IChannelViewModel } from './IChannelViewModel';\r\n\r\nexport function channelErrorModel() {\r\n return object<IChannelViewModel>().shape({\r\n name: string().trim().required(),\r\n adunitsSelected: new ArrayObservableSchemaYupType().of(IdNamePairErrorModel).required(),\r\n filtersSelected: new ArrayObservableSchemaYupType().of(IdNamePairErrorModel)\r\n });\r\n}\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { Channel, getAppStore, listEntity, onNotificationChanged } from '../../../../../@data';\r\nimport { onChannelsFetched, onFetchChannelsLoading, onFetchingChannelsData } from '../actions';\r\nimport { onManagePageInitialized } from '../actions/onManagePageInitialized';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onManagePageInitialized, async () => {\r\n try {\r\n const { publisher, userContext, account } = getAppStore();\r\n const channels = getStore().gridChannels;\r\n\r\n if (channels === undefined || channels.length === 0) {\r\n onFetchChannelsLoading(true);\r\n }\r\n onFetchingChannelsData(true);\r\n\r\n if (publisher && account && userContext) {\r\n const params = new URLSearchParams([['extendedInfo', 'true']]);\r\n const data = await listEntity([publisher, account], userContext, Channel, params);\r\n onChannelsFetched(data);\r\n } else {\r\n onChannelsFetched([]);\r\n }\r\n } catch (error) {\r\n Log.error(error);\r\n onNotificationChanged({ messageBarType: MessageBarType.error, text: 'Failed to load channels' });\r\n } finally {\r\n onFetchingChannelsData(false);\r\n onFetchChannelsLoading(false);\r\n }\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n create: {\r\n id: 'channel.create',\r\n defaultMessage: 'Create Channel',\r\n },\r\n notFound: {\r\n id: 'channel.notFound',\r\n defaultMessage: 'No channels found for this account, create one.',\r\n },\r\n deactivateTitle: {\r\n id: 'channel.deactivateTitle',\r\n defaultMessage: 'Do you want to deactivate channel(s)?',\r\n },\r\n channelName: {\r\n id: 'channel.channelName',\r\n defaultMessage: 'Channel name',\r\n },\r\n channelId: {\r\n id: 'channel.channelId',\r\n defaultMessage: 'Channel ID',\r\n },\r\n adunitsNumber: {\r\n id: 'channel.adunitsNumber',\r\n defaultMessage: '# of ad units',\r\n },\r\n adunitNames: {\r\n id: 'channel.adunitNames',\r\n defaultMessage: 'Ad unit names',\r\n },\r\n adfiltersNumber: {\r\n id: 'channel.adfiltersNumber',\r\n defaultMessage: '# of ad filters',\r\n },\r\n adfilterNames: {\r\n id: 'channel.adfilterNames',\r\n defaultMessage: 'Ad filter names',\r\n },\r\n channels: {\r\n id: 'channels',\r\n defaultMessage: 'Channels',\r\n },\r\n actions: {\r\n id: 'property.actions',\r\n defaultMessage: 'Actions',\r\n },\r\n zeroResultTitle: {\r\n id: 'channel.zeroResultTitle',\r\n defaultMessage: 'No channels yet',\r\n },\r\n zeroResultDescription: {\r\n id: 'channel.zeroResultDescription',\r\n defaultMessage: 'You haven’t created any channel yet',\r\n },\r\n noPublisherSelected: {\r\n id: 'property.noPublisherSelected',\r\n defaultMessage: 'A publisher isn’t selected yet. To start managing channels, search for a publisher..',\r\n },\r\n});\r\n","import { Model, getAppStore } from '../../../../../@data';\r\nimport { CommandBarActions, IBuildCommandBarProps } from '../../../../../layout/GridPageV2';\r\nimport { getStore } from '../../@data';\r\nimport messages from '../ManagePage.messages';\r\n\r\nexport function getCommandBarItems(): IBuildCommandBarProps<Model> | undefined {\r\n const { publisher, account } = getAppStore();\r\n const { gridChannels, isLoading } = getStore();\r\n\r\n const commandBarItems: IBuildCommandBarProps<Model> | undefined =\r\n (gridChannels && gridChannels.length !== 0 && publisher && account) || isLoading\r\n ? {\r\n primaryButtonLabel: messages.create,\r\n includeActions: [CommandBarActions.new],\r\n includeFarActions: [\r\n CommandBarActions.searchBox,\r\n CommandBarActions.edit,\r\n CommandBarActions.activate,\r\n CommandBarActions.deactivate,\r\n CommandBarActions.delete,\r\n CommandBarActions.download,\r\n CommandBarActions.modifyColumns,\r\n ],\r\n }\r\n : undefined;\r\n\r\n return commandBarItems;\r\n}\r\n","import * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { Channel, getAppStore } from '../../../../@data';\r\nimport { DefaultRoute } from '../../../../Routes';\r\nimport { ZeroResults } from '../../../../components/ZeroResults/ZeroResults';\r\nimport { useWindowSize } from '../../../../hooks';\r\nimport { getStore as getWindowSizeStore } from '../../../../hooks/useWindowSize/store/store';\r\nimport { GridPageLayout } from '../../../../layout/GridPageLayout/GridPageLayout';\r\nimport { GridV2, IGridV2Column } from '../../../../layout/GridPageV2';\r\nimport { IRouterWithIntl, injectIntlWithObserver } from '../../../../utils/ReactUtils';\r\nimport { RouteName } from '../../@data';\r\nimport { getStore } from '../@data';\r\nimport { onChannelsFetched } from '../@data/actions';\r\nimport { onManagePageInitialized } from '../@data/actions/onManagePageInitialized';\r\nimport messages from './ManagePage.messages';\r\nimport { getCommandBarItems } from './utils/getCommandBarItems';\r\nimport { getGridColumns } from './utils/getGridColumns';\r\n\r\nexport const ManagePage = injectIntlWithObserver(function ChannelManagePage(props: IRouterWithIntl) {\r\n const { publisher, account } = getAppStore();\r\n const { gridChannels, isLoading, isFetchingData } = getStore();\r\n const { formatMessage } = props.intl;\r\n const { windowStoreSerializer } = useWindowSize();\r\n const { isWindowRegularSize } = windowStoreSerializer(getWindowSizeStore());\r\n const gridDefaultColumns: IGridV2Column[] = getGridColumns(formatMessage, isWindowRegularSize, props.history);\r\n\r\n const NoResultComponent = (\r\n <ZeroResults\r\n showDefaultImage\r\n title={!!publisher ? formatMessage(messages.zeroResultTitle) : undefined}\r\n description={formatMessage(!!publisher ? messages.zeroResultDescription : messages.noPublisherSelected)}\r\n buttonText={formatMessage(messages.create)}\r\n onButtonClick={\r\n !!publisher ? () => props.history.push(`${DefaultRoute}/${publisher?.id}-${account?.id}/${RouteName.channel}/create`) : undefined\r\n }\r\n />\r\n );\r\n\r\n useEffect(() => {\r\n onManagePageInitialized();\r\n }, [publisher, account]);\r\n\r\n return (\r\n <GridPageLayout>\r\n <GridV2\r\n history={props.history}\r\n location={props.location}\r\n match={props.match}\r\n entity={Channel}\r\n pageTitle={{ title: formatMessage(messages.channels), helpId: 'pop_PCv4_Channels' }}\r\n commandBarProps={getCommandBarItems()}\r\n dataGridProps={{\r\n gridV2Columns: gridDefaultColumns,\r\n data: publisher && account ? gridChannels || [] : [],\r\n setData: onChannelsFetched,\r\n shimmerLines: 10,\r\n renderZeroItemsComponent: NoResultComponent,\r\n noEntityFound: messages.notFound,\r\n }}\r\n isGridReady={!isLoading}\r\n isDataLoading={isFetchingData}\r\n paginationProps={{\r\n shouldGridHandlePagination: true,\r\n }}\r\n />\r\n </GridPageLayout>\r\n );\r\n});\r\n","import { CommandBarButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { Channel, PopupType, getAccessPermission, getAppStore } from '../../../../../@data';\r\nimport { hasDeleteAccess, hasUpdateAccess } from '../../../../../@data/services/UserRoleService';\r\nimport AppMessages from '../../../../../App.messages';\r\nimport { IGridV2Column } from '../../../../../layout/GridPageV2';\r\nimport { setDialogType } from '../../../../../layout/GridPageV2/@data/mutatorActions';\r\nimport messages from '../ManagePage.messages';\r\n\r\nexport function getGridColumns(formatMessage, isWindowRegularSize, routeHistory): IGridV2Column[] {\r\n const appStore = getAppStore();\r\n\r\n const columns: IGridV2Column[] = [\r\n {\r\n key: 'name',\r\n fieldName: 'name',\r\n name: formatMessage(messages.channelName),\r\n minWidth: 100,\r\n maxWidth: 125,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n suppressSorting: false,\r\n onRender: (item: Channel) => item.name,\r\n },\r\n {\r\n key: 'id',\r\n fieldName: 'id',\r\n name: formatMessage(messages.channelId),\r\n minWidth: 100,\r\n maxWidth: 100,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n onRender: (item: Channel) => item.id,\r\n },\r\n {\r\n key: 'status',\r\n name: formatMessage(AppMessages.status),\r\n minWidth: 100,\r\n maxWidth: 100,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n onRender: (item: Channel) => item.status,\r\n },\r\n {\r\n key: 'associatedAdUnitCount',\r\n fieldName: 'associatedAdUnitCount',\r\n name: formatMessage(messages.adunitsNumber),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n onRender: (item: Channel) => item.associatedAdUnitCount,\r\n },\r\n {\r\n key: 'associatedAdUnitNames',\r\n fieldName: 'associatedAdUnitNames',\r\n name: formatMessage(messages.adunitNames),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: false,\r\n isExportable: true,\r\n onRender: (item: Channel) => item.associatedAdUnitIds?.length,\r\n },\r\n {\r\n key: 'associatedFilterCount',\r\n fieldName: 'associatedFilterCount',\r\n name: formatMessage(messages.adfiltersNumber),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n onRender: (item: Channel) => item.associatedFilterCount,\r\n },\r\n {\r\n key: 'associatedFilterNames',\r\n fieldName: 'associatedFilterNames',\r\n name: formatMessage(messages.adfilterNames),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: false,\r\n isExportable: true,\r\n onRender: (item: Channel) => item.associatedFilterIds?.length,\r\n },\r\n {\r\n key: 'actions',\r\n name: formatMessage(messages.actions),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isPadded: true,\r\n isSearchable: true,\r\n isVisible: true,\r\n suppressSorting: true,\r\n onRender: (item: Channel) => {\r\n const accessPermission = getAccessPermission(item);\r\n\r\n return (\r\n <div>\r\n <CommandBarButton\r\n id={`adunitCallout-${item.id}`}\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'edit' }}\r\n ariaLabel={formatMessage(AppMessages.edit)}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.edit) : ''}\r\n disabled={!hasUpdateAccess(accessPermission) || appStore?.publisher === undefined || appStore?.account === undefined}\r\n onClick={() =>\r\n routeHistory.push(`/ad-management/${appStore?.publisher?.id}-${appStore?.account?.id}/channel/edit/${item.id}`)\r\n }\r\n />\r\n <CommandBarButton\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'Delete' }}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.delete) : ''}\r\n onClick={() => setDialogType(PopupType.DeleteConfirmation)}\r\n disabled={!hasDeleteAccess(accessPermission)}\r\n />\r\n </div>\r\n );\r\n },\r\n },\r\n ];\r\n\r\n return columns;\r\n}\r\n","import * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { Route, RouteComponentProps } from 'react-router-dom';\r\nimport { RoutePrefix } from '../../../Routes';\r\nimport { FormState } from '../../../components/Form';\r\nimport { injectIntlWithObserver } from '../../../utils';\r\nimport { RouteName } from '../@data';\r\nimport { onCurrentRouteChanged } from '../@data/actions';\r\nimport './@data/mutators';\r\nimport './@data/orchestrators';\r\nimport { CreateChannel } from './Create/CreateChannel';\r\nimport { ManagePage } from './Manage/ManagePage';\r\n\r\nexport const ChannelPage = injectIntlWithObserver(function ChannelPageComponent(props: RouteComponentProps & InjectedIntlProps) {\r\n useEffect(() => {\r\n onCurrentRouteChanged(RouteName.channel, props.intl.formatMessage);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <React.Fragment>\r\n <Route exact path={`${props.match.url}`} component={ManagePage} />\r\n <Route\r\n path={`/${RoutePrefix.adManagement}/:publisherId-:accountId/${RouteName[RouteName.channel]}/create`}\r\n render={(propsToRender) => <CreateChannel {...propsToRender} mode={FormState.Create} />}\r\n />\r\n <Route\r\n path={`/${RoutePrefix.adManagement}/:publisherId-:accountId/${RouteName[RouteName.channel]}/edit/:id`}\r\n render={(propsToRender) => <CreateChannel {...propsToRender} mode={FormState.Edit} />}\r\n />\r\n </React.Fragment>\r\n );\r\n});\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { AccessibilityContrast, IPubcenterPalette, IPubcenterSpacing } from '../../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../../types';\r\n\r\ntype StyleProperties = 'containerStyle' | 'contentStyle' | 'headerStyle' | 'dateStyle' | 'descriptionStyle' | 'buttonStyle';\r\ntype SetupCardStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): SetupCardStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const { Activated } = AccessibilityContrast;\r\n\r\n return mergeStyleSets({\r\n containerStyle: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: 'auto',\r\n boxShadow: `0px 0px ${spacing.size7} 0px rgba(0,0,0,0.2)`,\r\n transition: '0.3s',\r\n borderRadius: spacing.size4,\r\n flex: 1,\r\n [Activated]: {\r\n color: 'windowtext',\r\n borderColor: 'window',\r\n forcedColorAdjust: 'none',\r\n },\r\n },\r\n contentStyle: {\r\n justifyContent: 'center',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n paddingLeft: spacing.size16,\r\n paddingRight: spacing.size10,\r\n },\r\n headerStyle: { margin: `${spacing.size10} 0px`, fontSize: spacing.size18, fontWeight: '600' },\r\n dateStyle: { color: palette.darkSilver, fontSize: spacing.size12, marginBottom: spacing.size6 },\r\n descriptionStyle: {\r\n marginTop: '0px',\r\n },\r\n buttonStyle: {\r\n display: 'flex',\r\n alignItems: 'flex-end',\r\n paddingLeft: spacing.size16,\r\n paddingBottom: spacing.size16,\r\n marginTop: 'auto',\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { Shimmer } from '@fluentui/react';\r\nimport React, { ReactElement } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { useI18n } from '../../../../../../i18n/useI18n';\r\nimport { getAppStore } from '../../../../../@data';\r\nimport { injectIntlAndObserver } from '../../../../../utils';\r\nimport { getStore } from '../../../Account/Settings/@data/store/store';\r\nimport { getClassNames } from './AnnouncementCard.styles';\r\nimport { getShimmerAnnouncementCard } from './utils/getShimmerAnnouncementCards';\r\nimport { dateFormate } from './utils/utils';\r\n\r\nexport interface IAnnouncementCard {\r\n title: string;\r\n description: string;\r\n date: number;\r\n button?: ReactElement;\r\n}\r\n\r\nexport interface IAnnouncementCardProps extends InjectedIntlProps {\r\n card: IAnnouncementCard;\r\n}\r\n\r\nexport const AnnouncementCard = injectIntlAndObserver(function AnnouncementCardComponent(props: IAnnouncementCardProps) {\r\n // need to be loaded from store, is the value of announcement in store is retrieved or not. ex: undefined or not\r\n const isDataLoaded = false;\r\n const { publisher, userContext } = getAppStore();\r\n const { systemPreferences } = getStore().active;\r\n const { locale } = useI18n({ systemPreferences, publisher, userContext });\r\n const date = new Date(props.card.date);\r\n const { containerStyle, contentStyle, headerStyle, dateStyle, descriptionStyle, buttonStyle } = getClassNames();\r\n\r\n return (\r\n <div className={containerStyle}>\r\n {!isDataLoaded ? (\r\n <>\r\n <div className={contentStyle}>\r\n <span className={headerStyle}>{props.card.title}</span>\r\n <span className={dateStyle}>{dateFormate(date, locale)}</span>\r\n <p className={descriptionStyle}>{props.card.description}</p>\r\n </div>\r\n <div className={buttonStyle}>{props.card.button}</div>\r\n </>\r\n ) : (\r\n <Shimmer customElementsGroup={getShimmerAnnouncementCard()} style={{ minHeight: '320px' }} />\r\n )}\r\n </div>\r\n );\r\n});\r\n","import React from 'react';\r\n\r\nfunction ordinal(dayNum: number): string {\r\n const suffixes = {\r\n '1': 'st',\r\n '21': 'st',\r\n '31': 'st',\r\n '2': 'nd',\r\n '22': 'nd',\r\n '3': 'rd',\r\n '23': 'rd',\r\n };\r\n return suffixes[dayNum] || 'th';\r\n}\r\n\r\nexport function dateFormate(date: Date, locale: string): JSX.Element {\r\n return (\r\n <>\r\n {date.toLocaleString(locale, { month: 'long' }) + ' ' + date.getDate()}\r\n <sup>{ordinal(date.getDate())}</sup>\r\n {', ' + date.getFullYear()}\r\n </>\r\n );\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n announcementTitle: {\r\n id: 'announcement.title',\r\n defaultMessage: 'Announcements',\r\n },\r\n firstAnnouncementTitle: {\r\n id: 'firstAnnouncement.title',\r\n defaultMessage: 'New customer support experience',\r\n },\r\n firstAnnouncementDescription: {\r\n id: 'firstAnnouncement.description',\r\n defaultMessage: 'Our new webform makes it easier for you to contact our customer support team.',\r\n },\r\n firstAnnouncementButton: {\r\n id: 'firstAnnouncement.button',\r\n defaultMessage: 'Contact Support',\r\n },\r\n secondAnnouncementTitle: {\r\n id: 'secondAnnouncement.title',\r\n defaultMessage: 'We’ve updated the settings for native ads',\r\n },\r\n secondAnnouncementDescription: {\r\n id: 'secondAnnouncement.description',\r\n defaultMessage: 'The updated settings for native ads make it easier to create ad units and earn from your website.',\r\n },\r\n secondAnnouncementButton: {\r\n id: 'secondAnnouncement.button',\r\n defaultMessage: 'Learn more',\r\n },\r\n thirdAnnouncementTitle: {\r\n id: 'thirdAnnouncement.title',\r\n defaultMessage: 'Preview your Google mediation report',\r\n },\r\n thirdAnnouncementDescription: {\r\n id: 'thirdAnnouncement.description',\r\n defaultMessage:\r\n 'You can now preview your Google mediation report directly in the Reports tab. Please note, this feature is only accessible to users who have Google mediation enabled. You can activate Google mediation by selecting Account > Settings > Connect.',\r\n },\r\n thirdAnnouncementButton: {\r\n id: 'thirdAnnouncement.button',\r\n defaultMessage: 'View reports',\r\n },\r\n});\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterPalette, IPubcenterSpacing } from '../../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../../types';\r\n\r\ntype StyleProperties = 'cardsContainer' | 'buttonStyle' | 'headerSection';\r\ntype GettingStartedStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): GettingStartedStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n\r\n return mergeStyleSets({\r\n cardsContainer: {\r\n display: 'grid',\r\n gridTemplateColumns: `repeat(auto-fit, minmax(${spacing.size260}, 1fr))`,\r\n justifyContent: 'space-between',\r\n gap: spacing.size15,\r\n },\r\n buttonStyle: {\r\n justifyContent: 'center',\r\n display: 'flex',\r\n background: palette.white,\r\n color: palette.neutralPrimary,\r\n border: `${spacing.size1} solid ${palette['NeutralStroke1.Rest']}`,\r\n borderRadius: spacing.size4,\r\n selectors: {\r\n '&:focus': {\r\n border: '2px solid black',\r\n },\r\n ':hover': {\r\n background: palette.neutralLighter,\r\n border: `${spacing.size1} solid ${palette['NeutralStroke1.Rest']}`,\r\n color: palette.neutralPrimary,\r\n },\r\n },\r\n },\r\n headerSection: {\r\n margin: `${spacing.size15} 0px`,\r\n fontSize: spacing.size20,\r\n fontWeight: '600',\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { PrimaryButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { IHeaderItem } from '../../../../../../components/Header/Header.types';\r\nimport { getTythonReportDashboardPageRoute } from '../../../../../../utils/routeUtils';\r\nimport { IAnnouncementCard } from '../../AnnouncementCard/AnnouncementCard';\r\nimport { connectToSupportTeam } from '../../ResourcesSection/ResourcesSection';\r\nimport messages from '../Announcements.message';\r\nimport { getClassNames } from '../Announcements.styles';\r\n\r\nexport const getAnnouncementCards = (\r\n history,\r\n setIsNotificationPanelOpen,\r\n itemData: IHeaderItem,\r\n CMUIPopupArticleUsingButton,\r\n formatMessage\r\n): IAnnouncementCard[] => {\r\n const { buttonStyle } = getClassNames();\r\n\r\n const announcementCards: IAnnouncementCard[] = [\r\n {\r\n title: formatMessage(messages.firstAnnouncementTitle),\r\n description: formatMessage(messages.firstAnnouncementDescription),\r\n date: 1705693326950,\r\n button: (\r\n <PrimaryButton\r\n text={formatMessage(messages.firstAnnouncementButton)}\r\n className={buttonStyle}\r\n onClick={() => connectToSupportTeam()}\r\n tabIndex={0}\r\n />\r\n ),\r\n },\r\n {\r\n title: formatMessage(messages.secondAnnouncementTitle),\r\n description: formatMessage(messages.secondAnnouncementDescription),\r\n date: 1693008001000,\r\n button: (\r\n <CMUIPopupArticleUsingButton\r\n query=\"ext07504\"\r\n className={itemData.className}\r\n anchorStyle={{ textDecoration: 'none', color: 'black' }}\r\n formatMessage={formatMessage}\r\n buttonText={messages.secondAnnouncementButton}\r\n buttonStyle={buttonStyle}\r\n />\r\n ),\r\n },\r\n {\r\n title: formatMessage(messages.thirdAnnouncementTitle),\r\n description: formatMessage(messages.thirdAnnouncementDescription),\r\n date: 1693008001000,\r\n button: (\r\n <PrimaryButton\r\n text={formatMessage(messages.thirdAnnouncementButton)}\r\n className={buttonStyle}\r\n onClick={() => handleViewReportButton()}\r\n tabIndex={0}\r\n />\r\n ),\r\n },\r\n ];\r\n\r\n function handleViewReportButton() {\r\n history.push(getTythonReportDashboardPageRoute());\r\n }\r\n\r\n return announcementCards;\r\n};\r\n","import { Panel, PanelType } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { getAppStore, isTythonSelfServeUser } from '../../../../../../@data';\r\nimport AppMessages from '../../../../../../App.messages';\r\nimport { IHeaderItem, PanelTypes } from '../../../../../../components/Header/Header.types';\r\nimport { CUSTOM_WIDTH } from '../../../../../../constants/AppConstants';\r\nimport messages from '../../../../../../layout/GlobalSearchHeader/GlobalSearchHeader.messages';\r\nimport { NotificationsPanel, renderNotificationFooterContent } from '../../../../../../layout/PageLayout/header-panels';\r\n\r\ninterface IHeaderData {\r\n items?: IHeaderItem[];\r\n}\r\n\r\nexport const getHeaderItems = (CMUIHeaderMenuItemSerializer, formatMessage) => {\r\n const notifications = getAppStore().panelNotifications;\r\n const items: IHeaderItem[] = [\r\n {\r\n key: 'notifications',\r\n icon: 'Notifications',\r\n title: formatMessage(messages.notifications),\r\n type: PanelTypes.Notifications,\r\n panel: NotificationsPanel,\r\n panelProps: {\r\n isFooterAtBottom: true,\r\n onRenderFooterContent: renderNotificationFooterContent,\r\n },\r\n shouldOverflowUnderExtraSmallScreen: true,\r\n showRedDot: notifications && notifications.length > 0,\r\n },\r\n ];\r\n\r\n const itemsData: IHeaderData = {\r\n items: CMUIHeaderMenuItemSerializer(isTythonSelfServeUser(), items),\r\n };\r\n\r\n return itemsData;\r\n};\r\n\r\nexport const createPanel = (\r\n item: IHeaderItem,\r\n isNotificationPanelOpen: boolean,\r\n formatMessage,\r\n setIsNotificationPanelOpen\r\n): JSX.Element => {\r\n // For icons such as CMUI help icon, panels are integrated with 3rd party libraries no need to render native panel\r\n if (item && !item.panel) {\r\n return <></>;\r\n }\r\n\r\n return (\r\n <Panel\r\n headerText={item?.title}\r\n type={PanelType.custom}\r\n customWidth={CUSTOM_WIDTH}\r\n isOpen={isNotificationPanelOpen}\r\n isLightDismiss={true}\r\n onDismiss={() => hidePanel(setIsNotificationPanelOpen)}\r\n closeButtonAriaLabel={formatMessage(AppMessages.close)}\r\n isFooterAtBottom={item?.panelProps?.isFooterAtBottom}\r\n onRenderFooterContent={() =>\r\n item?.panelProps?.onRenderFooterContent?.({ onDismiss: () => hidePanel(setIsNotificationPanelOpen) }) || null\r\n }\r\n >\r\n {item?.panel ? React.cloneElement(<item.panel />, { hidePanel: () => hidePanel(setIsNotificationPanelOpen) }) : <p>Loading...</p>}\r\n </Panel>\r\n );\r\n};\r\n\r\nexport const showPanel = (setIsNotificationPanelOpen) => {\r\n setIsNotificationPanelOpen(true);\r\n};\r\n\r\nconst hidePanel = (setIsNotificationPanelOpen) => {\r\n setIsNotificationPanelOpen(false);\r\n};\r\n","import React, { useState } from 'react';\r\nimport { IHeaderItem } from '../../../../../components/Header/Header.types';\r\nimport { useCMUIHelpExperience } from '../../../../../hooks';\r\nimport { injectRouterAndIntlWithObserver } from '../../../../../utils';\r\nimport { AnnouncementCard, IAnnouncementCard } from '../AnnouncementCard/AnnouncementCard';\r\nimport messages from './Announcements.message';\r\nimport { getClassNames } from './Announcements.styles';\r\nimport { getAnnouncementCards } from './utils/getAnnouncementCards';\r\nimport { createPanel, getHeaderItems } from './utils/utils';\r\n\r\ninterface IHeaderData {\r\n items?: IHeaderItem[];\r\n}\r\n\r\nexport const Announcements = injectRouterAndIntlWithObserver(function AnnouncementsComponent(props) {\r\n const { cardsContainer, headerSection } = getClassNames();\r\n const { formatMessage } = props.intl;\r\n const { CMUIHeaderMenuItemSerializer, CMUIPopupArticleUsingButton } = useCMUIHelpExperience();\r\n const [isNotificationPanelOpen, setIsNotificationPanelOpen] = useState(false);\r\n\r\n const itemsData: IHeaderData = getHeaderItems(CMUIHeaderMenuItemSerializer, formatMessage);\r\n\r\n // TODO\r\n // Get the annoucements from BE using a new endpoint through a useEffect\r\n\r\n const displayAnnouncementCards = (cards: IAnnouncementCard[]) => {\r\n return cards.map((card, index) => <AnnouncementCard card={card} key={index} />);\r\n };\r\n\r\n return (\r\n <div>\r\n <h2 className={headerSection}>{formatMessage(messages.announcementTitle)}</h2>\r\n {createPanel(itemsData.items![1], isNotificationPanelOpen, formatMessage, setIsNotificationPanelOpen)}\r\n <div className={cardsContainer}>\r\n {displayAnnouncementCards(\r\n getAnnouncementCards(props.history, setIsNotificationPanelOpen, itemsData.items![0], CMUIPopupArticleUsingButton, formatMessage)\r\n )}\r\n </div>\r\n </div>\r\n );\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n faqTitle: {\r\n id: 'faq.title',\r\n defaultMessage: 'FAQ: Setup and Activation',\r\n },\r\n firstQuestion: {\r\n id: 'first.question',\r\n defaultMessage: 'How do I activate my {appName} account?',\r\n },\r\n firstAnswer: {\r\n id: 'first.answer',\r\n defaultMessage: `You can take the following steps to activate your account:\r\n 1. Submit your profile for review and approval.\r\n 2. Connect and submit your site for review.\r\n 3. Ensure that an ad unit status is actively serving.\r\n Upon successful completion of these steps, your account will be activated, and your site will be eligible to show ads.`,\r\n },\r\n secondQuestion: {\r\n id: 'second.question',\r\n defaultMessage: 'Can I earn money from my website if I’m located outside of the United States?',\r\n },\r\n secondAnswer: {\r\n id: 'second.answer',\r\n defaultMessage:\r\n 'No, we only provide access to publishers with active bank accounts in the United States. If you’re located outside of the United States and wish to express your interest, please connect with us ',\r\n },\r\n thirdQuestion: {\r\n id: 'third.question',\r\n defaultMessage: 'Can I earn money from multiple sites using one account?',\r\n },\r\n thirdAnswer: {\r\n id: 'third.answer',\r\n defaultMessage: 'Yes, you can add multiple sites to your account. After completing our site review, your site will be ready to earn.',\r\n },\r\n fourthQuestion: {\r\n id: 'fourth.question',\r\n defaultMessage: 'Why is my website status pending? What can I do to change its status?',\r\n },\r\n fourthAnswer: {\r\n id: 'fourth.answer',\r\n defaultMessage:\r\n 'Your website may be pending because your profile review isn’t complete. Once your profile review is complete, we’ll continue with your site review and your website status will reflect this change.',\r\n },\r\n fifthQuestion: {\r\n id: 'fifth.question',\r\n defaultMessage: 'Can I correct an error that I made while submitting my profile?',\r\n },\r\n fifthAnswer: {\r\n id: 'fifth.answer',\r\n defaultMessage:\r\n 'Once your profile is submitted, you won’t be able to edit until the review process is finalized. If you need to make changes to your profile during the review process, please ',\r\n },\r\n contactSupport: {\r\n id: 'contact.support',\r\n defaultMessage: 'contact support.',\r\n },\r\n redirectUser: {\r\n id: 'redirect.user',\r\n defaultMessage: 'here.',\r\n },\r\n});\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterSpacing } from '../../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../../types';\r\n\r\ntype StyleProperties = 'container' | 'headerSection';\r\ntype SetupCardStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): SetupCardStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return mergeStyleSets({\r\n container: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n cursor: 'pointer',\r\n boxShadow: `0px 0px ${spacing.size7} 0px rgba(0,0,0,0.2)`,\r\n },\r\n headerSection: {\r\n margin: `${spacing.size15} 0px`,\r\n fontSize: spacing.size20,\r\n fontWeight: '600',\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterPalette, IPubcenterSpacing } from '../../../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../../../types';\r\n\r\ntype StyleProperties = 'details' | 'titleStyle' | 'content' | 'arrow';\r\n\r\ntype SetupCardStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): SetupCardStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n\r\n return mergeStyleSets({\r\n details: {\r\n borderRadius: `0px 0px ${spacing.size1} 0px`,\r\n borderBottom: `${spacing.size1} solid ${palette.neutralLight}`,\r\n cursor: 'pointer',\r\n summary: {\r\n listStyle: 'none',\r\n display: 'flex',\r\n },\r\n },\r\n titleStyle: {\r\n userSelect: 'none',\r\n padding: `${spacing.size16} ${spacing.size12}`,\r\n fontWeight: 600,\r\n fontSize: spacing.size16,\r\n },\r\n content: {\r\n borderTop: `${spacing.size1} solid ${palette.azureishWhite}`,\r\n padding: `${spacing.size16} ${spacing.size12} ${spacing.size16} ${spacing.size48}`,\r\n cursor: 'default',\r\n color: palette['NeutralForeground3.Rest'],\r\n '> a': {\r\n color: palette['CompoundBrandForeground1.Rest'],\r\n textDecoration: 'none',\r\n },\r\n },\r\n arrow: {\r\n pointerEvents: 'none',\r\n userSelect: 'none',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: spacing.size36,\r\n paddingLeft: spacing.size6,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { Icon } from '@fluentui/react';\r\nimport React, { ReactNode } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { injectIntlAndObserver } from '../../../../../../utils';\r\nimport { getClassNames } from './FAQCard.styles';\r\n\r\nexport interface IFAQProps {\r\n title: string;\r\n description: ReactNode;\r\n isOpen?: boolean;\r\n order?: number;\r\n setIsOpen?: (index: number) => void;\r\n}\r\n\r\nconst FAQCard = injectIntlAndObserver<InjectedIntlProps & IFAQProps>(({ intl, ...props }) => {\r\n const { title, description, isOpen, order } = props;\r\n const { details, titleStyle, arrow, content } = getClassNames();\r\n\r\n return (\r\n <details className={details} open={isOpen}>\r\n <summary\r\n onClick={(e) => {\r\n props.setIsOpen?.(isOpen ? -1 : order ?? -1);\r\n e.preventDefault();\r\n }}\r\n >\r\n <Icon className={arrow} iconName={isOpen ? 'ChevronDown' : 'ChevronRight'} />\r\n <span className={titleStyle}>{title}</span>\r\n </summary>\r\n\r\n <div className={content}>{description}</div>\r\n </details>\r\n );\r\n});\r\n\r\nexport default FAQCard;\r\n","import React, { useState } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { isTythonSelfServeUser } from '../../../../../@data';\r\nimport { SupportPageRoute } from '../../../../../Routes';\r\nimport { APP_NAME_NEW, SUPPORT_EMAIL } from '../../../../../constants/AppConstants';\r\nimport { injectIntlAndObserver } from '../../../../../utils';\r\nimport { getStore } from '../../@data/store/store';\r\nimport messages from './FAQSection.messages';\r\nimport { getClassNames } from './FAQSection.styles';\r\nimport FAQCard, { IFAQProps } from './components/FAQCard';\r\n\r\nconst FAQSection = injectIntlAndObserver<InjectedIntlProps>(({ intl: { formatMessage, formatHTMLMessage } }) => {\r\n const { container, headerSection } = getClassNames();\r\n // TODO - get isSetupDone from the store to control display of section\r\n const { isSetupDone } = getStore();\r\n const [isOpen, setIsOpen] = useState(-1);\r\n const resources: IFAQProps[] = [\r\n {\r\n title: formatMessage(messages.firstQuestion, { appName: APP_NAME_NEW }),\r\n description: formatMessage(messages.firstAnswer),\r\n },\r\n {\r\n title: formatMessage(messages.secondQuestion),\r\n description: (\r\n <>\r\n {formatMessage(messages.secondAnswer)}\r\n <a href=\"https://about.ads.microsoft.com/en-us/h/a/publishers\">{formatMessage(messages.redirectUser)}</a>\r\n </>\r\n ),\r\n },\r\n {\r\n title: formatMessage(messages.thirdQuestion),\r\n description: formatMessage(messages.thirdAnswer),\r\n },\r\n {\r\n title: formatMessage(messages.fourthQuestion),\r\n description: formatMessage(messages.fourthAnswer),\r\n },\r\n {\r\n title: formatMessage(messages.fifthQuestion),\r\n description: (\r\n <>\r\n {formatMessage(messages.fifthAnswer)}\r\n <a href={isTythonSelfServeUser() ? `${SupportPageRoute}` : `mailto:${SUPPORT_EMAIL}`}>{formatMessage(messages.contactSupport)}</a>\r\n </>\r\n ),\r\n },\r\n ];\r\n\r\n return (\r\n <>\r\n {!isSetupDone ? (\r\n <div>\r\n <h2 className={headerSection}>{formatMessage(messages.faqTitle)}</h2>\r\n <div className={container}>\r\n {resources.map((resource, index) => (\r\n <FAQCard key={index} {...resource} isOpen={isOpen === index} order={index} setIsOpen={setIsOpen} />\r\n ))}\r\n </div>\r\n </div>\r\n ) : null}\r\n </>\r\n );\r\n});\r\n\r\nexport default FAQSection;\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n title1: {\r\n id: 'home.fre.cards.title1',\r\n defaultMessage: 'Welcome to the new Monetize Now',\r\n },\r\n title2: {\r\n id: 'home.fre.cards.title2',\r\n defaultMessage: `Bookmark our new site`,\r\n },\r\n title3: {\r\n id: 'home.fre.cards.title3',\r\n defaultMessage: 'Start earning with beautiful ads',\r\n },\r\n description1: {\r\n id: 'home.fre.cards.description1',\r\n defaultMessage: `You're seeing our updated look! All the functions you know and love are still here. Enjoy the enhanced experience as you navigate through the familiar features in our new Monetize Now!`,\r\n },\r\n description2: {\r\n id: 'home.fre.cards.description2',\r\n defaultMessage: `Don't forget to update your bookmarks! Our website has a new URL. Save it now to keep your access quick and easy: {newDomain}.`,\r\n },\r\n description3: {\r\n id: 'home.fre.cards.description3',\r\n defaultMessage: `Unlock the potential to earn more with Monetize Now. Serve ads that not only drive higher engagement but also blend seamlessly with your site. Get started now and watch your earnings grow!`,\r\n },\r\n notNowButton: {\r\n id: 'home.fre.cards.button',\r\n defaultMessage: 'Not now',\r\n },\r\n dialogAriaLabel: {\r\n id: 'home.fre.cards.dialogAriaLabel',\r\n defaultMessage: 'First Run Experience Dialog for users redirected from Pubcenter domain',\r\n },\r\n});\r\n","import {\r\n FontWeights,\r\n IDialogContentStyleProps,\r\n IDialogContentStyles,\r\n IDialogStyleProps,\r\n IDialogStyles,\r\n IStyleFunctionOrObject,\r\n getTheme,\r\n mergeStyleSets,\r\n} from '@fluentui/react';\r\nimport { IPubCenterFonts, IPubcenterSpacing } from '../../../../../../theme';\r\n\r\nexport interface IFRECardStyles {\r\n root: string;\r\n dot: string;\r\n selectedDot: string;\r\n content: string;\r\n title: string;\r\n description: string;\r\n primaryButton: string;\r\n subComponentStyles: {\r\n dialogContent: IStyleFunctionOrObject<IDialogContentStyleProps, IDialogContentStyles>;\r\n dialog: IStyleFunctionOrObject<IDialogStyleProps, IDialogStyles>;\r\n };\r\n}\r\n\r\nexport const getFRECardStyles = () => {\r\n const theme = getTheme();\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const fonts = theme.fonts as IPubCenterFonts;\r\n\r\n return mergeStyleSets({\r\n root: {\r\n borderRadius: spacing.size16,\r\n boxShadow: theme.effects.elevation16,\r\n },\r\n dot: {\r\n width: spacing.size8,\r\n height: spacing.size8,\r\n borderRadius: '50%',\r\n backgroundColor: '#185ABD',\r\n opacity: 0.3,\r\n },\r\n selectedDot: {\r\n width: spacing.size16,\r\n height: spacing.size8,\r\n borderRadius: spacing.size8,\r\n backgroundColor: '#185ABD',\r\n },\r\n content: {\r\n padding: spacing.size24,\r\n },\r\n title: {\r\n ...fonts.size20,\r\n fontWeight: FontWeights.semibold,\r\n marginBottom: spacing.size20,\r\n },\r\n description: {\r\n ...fonts.size14,\r\n marginBottom: spacing.size36,\r\n },\r\n subComponentStyles: {\r\n dialogContent: {\r\n header: { display: 'none' },\r\n inner: { padding: 0 },\r\n },\r\n dialog: {\r\n dialogDefaultMaxWidth: spacing.size600,\r\n main: {\r\n borderRadius: spacing.size16,\r\n '@media(min-width: 640px)': {\r\n maxWidth: spacing.size600,\r\n },\r\n },\r\n },\r\n },\r\n });\r\n};\r\n","import { DefaultButton, Image, PrimaryButton, Stack } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport AppMessages from '../../../../../App.messages';\r\nimport messages from './messages';\r\nimport { getFRECardStyles } from './styles';\r\n\r\nexport interface ICardProps {\r\n title: string;\r\n description: string;\r\n imageSrc?: string;\r\n imageAlt?: string;\r\n}\r\n\r\nexport interface IFRECardProps extends ICardProps {\r\n isLastCard?: boolean;\r\n selectedCardIndex?: number;\r\n totalCardCount: number;\r\n dismissDialog: () => void;\r\n nextButtonClicked: () => void;\r\n}\r\n\r\nexport const FRECard = injectIntl(\r\n ({\r\n title,\r\n description,\r\n imageAlt,\r\n imageSrc,\r\n isLastCard,\r\n selectedCardIndex = 0,\r\n totalCardCount,\r\n dismissDialog,\r\n nextButtonClicked,\r\n intl,\r\n }: IFRECardProps & InjectedIntlProps) => {\r\n const { formatMessage } = intl;\r\n const { dot, selectedDot, content, title: titleStyle, description: descStyle } = getFRECardStyles();\r\n\r\n return (\r\n <>\r\n {imageSrc && <Image width={600} height={324} src={imageSrc} alt={imageAlt} loading=\"lazy\" />}\r\n\r\n <div className={content}>\r\n <div className={titleStyle} role=\"heading\" aria-level={2}>\r\n {title}\r\n </div>\r\n <div className={descStyle}>{description}</div>\r\n\r\n <Stack horizontal horizontalAlign={'space-between'}>\r\n {!isLastCard && <DefaultButton text={formatMessage(messages.notNowButton)} onClick={dismissDialog} shape={'rounded'} />}\r\n\r\n <Stack horizontal tokens={{ childrenGap: '7px', maxHeight: '32px' }}>\r\n {Array.from(Array(totalCardCount).keys()).map((_, index) => (\r\n <span key={index} className={index === selectedCardIndex ? selectedDot : dot} />\r\n ))}\r\n </Stack>\r\n\r\n {!isLastCard ? (\r\n <PrimaryButton text={formatMessage(AppMessages.next)} onClick={nextButtonClicked} shape={'rounded'} />\r\n ) : (\r\n <PrimaryButton text={formatMessage(AppMessages.finish)} onClick={dismissDialog} shape={'rounded'} />\r\n )}\r\n </Stack>\r\n </div>\r\n </>\r\n );\r\n }\r\n);\r\n","import { Dialog } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport { TYTHON_NEW_PROD } from '../../../../../constants';\r\nimport { usePreloadSVGImages } from '../../../../../hooks';\r\nimport { getScreenReaderTextStyles } from '../../../../../utils/GlobalStyleUtils';\r\nimport { setIsFRECardShown } from '../../@data/mutatorActions';\r\nimport '../../@data/orchestrators';\r\nimport { FRECard, ICardProps } from './FRECard';\r\nimport messages from './messages';\r\nimport fre1 from './resources/fre-1.jpg';\r\nimport fre2 from './resources/fre-2.jpg';\r\nimport fre3 from './resources/fre-3.jpg';\r\nimport { getFRECardStyles } from './styles';\r\n\r\nexport const FREContainer = injectIntl(({ intl }) => {\r\n const { formatMessage } = intl;\r\n const { subComponentStyles } = getFRECardStyles();\r\n\r\n const [currentStep, updateCurrentStep] = React.useState(0);\r\n usePreloadSVGImages([fre1, fre2, fre3]);\r\n\r\n const cards: ICardProps[] = [\r\n {\r\n title: formatMessage(messages.title1),\r\n description: formatMessage(messages.description1),\r\n imageSrc: fre1,\r\n imageAlt: formatMessage(messages.title1),\r\n },\r\n {\r\n title: formatMessage(messages.title2),\r\n description: formatMessage(messages.description2, { newDomain: TYTHON_NEW_PROD }),\r\n imageSrc: fre2,\r\n imageAlt: formatMessage(messages.title2),\r\n },\r\n {\r\n title: formatMessage(messages.title3),\r\n description: formatMessage(messages.description3),\r\n imageSrc: fre3,\r\n imageAlt: formatMessage(messages.title3),\r\n },\r\n ];\r\n\r\n return (\r\n <Dialog\r\n hidden={false}\r\n styles={subComponentStyles.dialog}\r\n modalProps={{ titleAriaId: 'freDialogAria' }}\r\n dialogContentProps={{ styles: subComponentStyles.dialogContent }}\r\n >\r\n <FRECard\r\n {...cards[currentStep]}\r\n dismissDialog={() => setIsFRECardShown(false)}\r\n nextButtonClicked={() => updateCurrentStep(currentStep + 1)}\r\n totalCardCount={cards.length}\r\n isLastCard={currentStep === cards.length - 1}\r\n selectedCardIndex={currentStep}\r\n />\r\n <span id=\"freDialogAria\" style={getScreenReaderTextStyles()}>\r\n {formatMessage(messages.dialogAriaLabel)}\r\n </span>\r\n </Dialog>\r\n );\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n profileCardTitleNotStarted: {\r\n id: 'profileCardNotStarted.title',\r\n defaultMessage: 'Create your profile',\r\n },\r\n profileCardDescriptionNotStarted: {\r\n id: 'profileCardNotStarted.description',\r\n defaultMessage: 'We’ll need to verify your identity as an individual or business before displaying ads on your site.',\r\n },\r\n profileCardButtonNotStarted: {\r\n id: 'profileCardNotStarted.button',\r\n defaultMessage: 'Create your profile',\r\n },\r\n siteCardTitleNotStarted: {\r\n id: 'siteCardNotStarted.title',\r\n defaultMessage: 'Connect your site',\r\n },\r\n siteCardDescriptionNotStarted: {\r\n id: 'siteCardNotStarted.description',\r\n defaultMessage: 'Connect your site by adding its top level domain.',\r\n },\r\n siteCardButtonNotStarted: {\r\n id: 'siteCardNotStarted.button',\r\n defaultMessage: 'Connect your site',\r\n },\r\n adUnitCardTitleNotStarted: {\r\n id: 'adUnitCardNotStarted.title',\r\n defaultMessage: 'Create an ad unit',\r\n },\r\n adUnitCardDescriptionNotStarted: {\r\n id: 'adUnitCardNotStarted.description',\r\n defaultMessage: 'Customize the way ads will display on your website.',\r\n },\r\n adUnitCardButtonNotStarted: {\r\n id: 'adUnitCardNotStarted.button',\r\n defaultMessage: 'Create Ad Unit',\r\n },\r\n profileCardTitleAwaitingForVerification: {\r\n id: 'profileCard.title',\r\n defaultMessage: 'Your profile is awaiting verification',\r\n },\r\n profileCardDescriptionAwaitingForVerification: {\r\n id: 'profileCard.description',\r\n defaultMessage:\r\n \"Thank you for submitting your profile for review. We'll complete the review within seven business days, and once the review is complete, we'll notify you by email.\",\r\n },\r\n profileCardButtonAwaitingForVerification: {\r\n id: 'profileCardAwaitingForVerification.button',\r\n defaultMessage: 'View your profile',\r\n },\r\n siteCardTitleAwaitingForVerification: {\r\n id: 'siteCard.title',\r\n defaultMessage: 'Site in review',\r\n },\r\n siteCardDescriptionAwaitingForVerification: {\r\n id: 'siteCard.description',\r\n defaultMessage:\r\n \"Thank you for submitting your site for review. We'll notify you by email when the review is complete. Please note that it usually takes 7 days for a site to be reviewed. In the meantime, you can continue to submit more sites to increase your earnings.\",\r\n },\r\n siteCardButtonAwaitingForVerification: {\r\n id: 'siteCardAwaitingForVerification.button',\r\n defaultMessage: 'Add more sites',\r\n },\r\n profileCardTitleCompleted: {\r\n id: 'profileCard.title',\r\n defaultMessage: 'Profile setup complete',\r\n },\r\n profileCardDescriptionCompleted: {\r\n id: 'profileCard.description',\r\n defaultMessage: 'We verified your data and approved you as a publisher.',\r\n },\r\n profileCardButtonCompleted: {\r\n id: 'profileCardCompleted.button',\r\n defaultMessage: 'View your profile',\r\n },\r\n siteCardTitleCompleted: {\r\n id: 'siteCard.title',\r\n defaultMessage: 'Site setup complete',\r\n },\r\n siteCardDescriptionCompleted: {\r\n id: 'siteCard.description.cardCompleted',\r\n defaultMessage:\r\n 'We’ve verified and approved your site. In the meantime, you can continue to submit more sites to increase your earnings. ',\r\n },\r\n siteCardButtonCompleted: {\r\n id: 'siteCardCompleted.button',\r\n defaultMessage: 'Add more sites',\r\n },\r\n adUnitCardTitleCompleted: {\r\n id: 'adUnitCard.title',\r\n defaultMessage: 'Ad unit setup complete',\r\n },\r\n adUnitCardDescriptionCompleted: {\r\n id: 'adUnitCard.description',\r\n defaultMessage: 'You’ve set up your ad unit. Adding more ad units may help you earn more with your site.',\r\n },\r\n adUnitCardButtonCompleted: {\r\n id: 'adUnitsCardCompleted.button',\r\n defaultMessage: 'Add more ad units',\r\n },\r\n setupProfile: {\r\n id: 'setup.profile',\r\n defaultMessage: 'Profile Setup',\r\n },\r\n setupSite: {\r\n id: 'setup.site',\r\n defaultMessage: 'Site Setup',\r\n },\r\n setupAdunit: {\r\n id: 'setup.adunit',\r\n defaultMessage: 'Ad unit Setup',\r\n },\r\n NotStarted: {\r\n id: 'homepageStatus.notStarted',\r\n defaultMessage: 'Not started',\r\n },\r\n AwaitingVerification: {\r\n id: 'homepageStatus.awaitingVerification',\r\n defaultMessage: 'Awaiting verification',\r\n },\r\n Completed: {\r\n id: 'homepageStatus.completed',\r\n defaultMessage: 'Completed',\r\n },\r\n Rejected: {\r\n id: 'homepageStatus.rejected',\r\n defaultMessage: 'Needs attention',\r\n },\r\n profileCardTitleNeedsAttention: {\r\n id: 'profileCardNeedsAttention.title',\r\n defaultMessage: 'Your profile needs attention',\r\n },\r\n profileCardDescriptionNeedsAttention: {\r\n id: 'profileCardNeedsAttention.description',\r\n defaultMessage: 'There was a problem with your profile. Please follow the instructions to resolve the issue.',\r\n },\r\n profileCardButtonNeedsAttention: {\r\n id: 'profileCardNeedsAttention.button',\r\n defaultMessage: 'View profile',\r\n },\r\n});\r\n","import { ReactElement } from 'react';\r\nimport { HomePageStatus } from '../../@data/store/schema/IHomeViewState';\r\n\r\nexport interface ISetupCard {\r\n title: string;\r\n description: string;\r\n image?: string;\r\n imageAlt?: string;\r\n status?: HomePageStatus;\r\n button?: ReactElement;\r\n steps?: number;\r\n hidden?: boolean;\r\n onLoad?: () => void;\r\n cardType?: SetupCardType;\r\n}\r\n\r\nexport enum SetupCardType {\r\n GetStarted = 'GetStarted',\r\n Recommendations = 'Recommendations',\r\n}\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { AccessibilityContrast, IPubcenterPalette, IPubcenterSpacing } from '../../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../../types';\r\nimport { SetupCardType } from './SetupCardUtils';\r\n\r\ntype StyleProperties =\r\n | 'titleStyle'\r\n | 'statusStyle'\r\n | 'progressStepsContainerStyle'\r\n | 'progressStepStyle'\r\n | 'setupCardContainerStyle'\r\n | 'imageContainerStyle'\r\n | 'imageStyle'\r\n | 'setupContentStyle'\r\n | 'descriptionStyle'\r\n | 'setupCardButtonStyle';\r\ntype SetupCardStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps & { cardType?: SetupCardType }): SetupCardStyles => {\r\n const { theme, cardType } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const { Activated } = AccessibilityContrast;\r\n\r\n return mergeStyleSets({\r\n titleStyle: {\r\n margin: `${spacing.size10} 0px`,\r\n fontSize: spacing.size18,\r\n fontWeight: '600',\r\n },\r\n statusStyle: {\r\n margin: `${spacing.size10} 0px`,\r\n fontSize: spacing.size14,\r\n fontWeight: '600',\r\n },\r\n progressStepsContainerStyle: {\r\n height: spacing.size12,\r\n background: palette.neutralQuaternary,\r\n boxShadow: `${spacing.size2} ${spacing.size14} ${spacing.size15} -7px rgba(30, 166, 250, 0.36)`,\r\n borderRadius: spacing.size2,\r\n transition: 'all 0.5s',\r\n flex: 1,\r\n [Activated]: {\r\n color: 'window',\r\n backgroundColor: 'windowtext',\r\n borderColor: 'windowtext',\r\n forcedColorAdjust: 'none',\r\n },\r\n },\r\n progressStepStyle: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n width: 'calc(100% - 5%)',\r\n gap: '5px',\r\n '& :nth-child(1)': {\r\n borderTopLeftRadius: spacing.size4,\r\n borderBottomLeftRadius: spacing.size4,\r\n },\r\n '& :nth-child(last)': {\r\n borderTopRightRadius: spacing.size4,\r\n borderBottomRightRadius: spacing.size4,\r\n },\r\n },\r\n setupCardContainerStyle: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: 'auto',\r\n boxShadow: `0px 0px ${spacing.size7} 0px rgba(0,0,0,0.2)`,\r\n transition: '0.3s',\r\n borderRadius: spacing.size4,\r\n flex: 1,\r\n [Activated]: {\r\n color: 'windowtext',\r\n borderColor: 'window',\r\n forcedColorAdjust: 'none',\r\n },\r\n },\r\n imageContainerStyle: {\r\n justifyContent: 'center',\r\n display: 'flex',\r\n borderRadius: `${spacing.size4} ${spacing.size4} 0px 0px`,\r\n marginTop: spacing.size6,\r\n },\r\n imageStyle: {\r\n minHeight: spacing.size120,\r\n borderRadius: `${spacing.size4} ${spacing.size4} 0px 0px`,\r\n },\r\n setupContentStyle: {\r\n justifyContent: 'center',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n paddingLeft: spacing.size16,\r\n paddingRight: spacing.size10,\r\n },\r\n descriptionStyle: {\r\n marginTop: '0px',\r\n },\r\n setupCardButtonStyle: {\r\n display: 'flex',\r\n alignItems: 'flex-end',\r\n paddingLeft: spacing.size16,\r\n paddingBottom: spacing.size16,\r\n marginTop: 'auto',\r\n '> button': {\r\n borderRadius: spacing.size4,\r\n ...(cardType === SetupCardType.GetStarted ? { backgroundColor: palette['BrandBackground.Rest'] } : {}),\r\n },\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { ShimmerElementType, ShimmerElementsGroup } from '@fluentui/react';\r\nimport React from 'react';\r\n\r\nexport const getShimmerSetupCard = (): JSX.Element => {\r\n const styles = {\r\n root: {\r\n // Set the background color to white\r\n background: 'linear-gradient(to right, #E6E6E6,60%, white)',\r\n },\r\n };\r\n\r\n const stylesButton = {\r\n root: {\r\n // Set the background color to white\r\n background: 'linear-gradient(to right, #E6E6E6,30%, white)',\r\n },\r\n };\r\n return (\r\n <div>\r\n <ShimmerElementsGroup flexWrap width=\"100%\" shimmerElements={[{ type: ShimmerElementType.line, width: '100%', height: 90 }]} />\r\n <ShimmerElementsGroup flexWrap width=\"100%\" shimmerElements={[{ type: ShimmerElementType.gap, width: '100%', height: 15 }]} />\r\n <ShimmerElementsGroup\r\n styles={styles}\r\n flexWrap\r\n width=\"100%\"\r\n shimmerElements={[\r\n { type: ShimmerElementType.gap, width: '10%', height: 50 },\r\n { type: ShimmerElementType.line, width: '80%', height: 50, verticalAlign: 'bottom' },\r\n { type: ShimmerElementType.gap, width: '10%', height: 50 },\r\n ]}\r\n />\r\n\r\n <ShimmerElementsGroup flexWrap width=\"100%\" shimmerElements={[{ type: ShimmerElementType.gap, width: '100%', height: 5 }]} />\r\n\r\n <ShimmerElementsGroup\r\n styles={styles}\r\n flexWrap\r\n width=\"100%\"\r\n shimmerElements={[\r\n { type: ShimmerElementType.gap, width: '10%', height: 20 },\r\n { type: ShimmerElementType.line, width: '80%', height: 20, verticalAlign: 'bottom' },\r\n { type: ShimmerElementType.gap, width: '10%', height: 20 },\r\n ]}\r\n />\r\n <ShimmerElementsGroup flexWrap width=\"100%\" shimmerElements={[{ type: ShimmerElementType.gap, width: '100%', height: 5 }]} />\r\n\r\n <ShimmerElementsGroup\r\n styles={styles}\r\n flexWrap\r\n width=\"100%\"\r\n shimmerElements={[\r\n { type: ShimmerElementType.gap, width: '10%', height: 20 },\r\n { type: ShimmerElementType.line, width: '80%', height: 20, verticalAlign: 'bottom' },\r\n { type: ShimmerElementType.gap, width: '10%', height: 20 },\r\n ]}\r\n />\r\n <ShimmerElementsGroup flexWrap width=\"100%\" shimmerElements={[{ type: ShimmerElementType.gap, width: '100%', height: 55 }]} />\r\n\r\n <ShimmerElementsGroup\r\n styles={stylesButton}\r\n flexWrap\r\n width=\"100%\"\r\n shimmerElements={[\r\n { type: ShimmerElementType.gap, width: '10%', height: 20 },\r\n { type: ShimmerElementType.line, width: '50%', height: 30, verticalAlign: 'bottom' },\r\n { type: ShimmerElementType.gap, width: '40%', height: 20 },\r\n ]}\r\n />\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { HomePageStatus } from '../../../@data/store/schema/IHomeViewState';\r\nimport { getClassNames } from '../SetupCard.styles';\r\n\r\nexport const getProgressBar = (steps?: number, status?: HomePageStatus): JSX.Element => {\r\n const { progressStepsContainerStyle, progressStepStyle } = getClassNames();\r\n\r\n // colors: notStarted:#D2D0CE awaitingForVerification:#0078D4 completed:#107C10 needsAttention(Rejected):#F7630C\r\n const getProgressBarColor = () => {\r\n if (status && HomePageStatus[status] === HomePageStatus.AwaitingVerification) {\r\n return '#0078D4';\r\n }\r\n if (status && HomePageStatus[status] === HomePageStatus.Rejected) {\r\n return '#F7630C';\r\n }\r\n return '#107C10';\r\n };\r\n\r\n if (!steps) {\r\n return <></>;\r\n }\r\n\r\n const bars = [...Array(steps)].map((step, i) => {\r\n return (\r\n <div\r\n className={progressStepsContainerStyle}\r\n key={i}\r\n style={{\r\n background:\r\n (status &&\r\n (HomePageStatus[status] === HomePageStatus.AwaitingVerification || HomePageStatus[status] === HomePageStatus.Rejected) &&\r\n i <= steps - 2) ||\r\n (status && HomePageStatus[status] === HomePageStatus.Completed && i <= steps - 1)\r\n ? getProgressBarColor()\r\n : undefined,\r\n }}\r\n />\r\n );\r\n });\r\n\r\n return <div className={progressStepStyle}>{bars}</div>;\r\n};\r\n","import { Image, Shimmer } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { injectIntlAndObserver } from '../../../../../utils';\r\nimport { getGoogleAdSenseStore } from '../../../Account/Settings/components/GoogleConnector/@data';\r\nimport { getStore } from '../../@data/store/store';\r\nimport messages from './SetupCard.messages';\r\nimport { getClassNames } from './SetupCard.styles';\r\nimport { ISetupCard } from './SetupCardUtils';\r\nimport { getShimmerSetupCard } from './utils/getShimmerSetupCard';\r\nimport { getProgressBar } from './utils/renderProgressBar';\r\n\r\nexport interface ISetupCardProps extends InjectedIntlProps {\r\n card: ISetupCard;\r\n}\r\n\r\nexport const SetupCard = injectIntlAndObserver(function SetupCardComponent({ intl: { formatMessage }, card }: ISetupCardProps) {\r\n // need to be loaded from store, either the value itself or status of other entities are retrieved\r\n const { adUnitStatus, siteStatus, profileStatus, isSetupDone } = getStore();\r\n const { active } = getGoogleAdSenseStore();\r\n const {\r\n titleStyle,\r\n statusStyle,\r\n setupCardContainerStyle,\r\n imageContainerStyle,\r\n imageStyle,\r\n setupContentStyle,\r\n descriptionStyle,\r\n setupCardButtonStyle,\r\n } = getClassNames({ cardType: card.cardType });\r\n\r\n const isStatusFieldsHaveValue = (statusAdUnit, statusSite, statusProfile) => {\r\n return statusAdUnit !== undefined && statusSite !== undefined && statusProfile !== undefined;\r\n };\r\n const showContent = isSetupDone\r\n ? active.connectionStatus !== undefined\r\n ? true\r\n : false\r\n : isStatusFieldsHaveValue(adUnitStatus, siteStatus, profileStatus);\r\n\r\n return (\r\n <div className={setupCardContainerStyle}>\r\n {showContent ? (\r\n <>\r\n <div className={imageContainerStyle}>{card.image && <Image src={card.image} className={imageStyle} alt={card.imageAlt} />}</div>\r\n <div className={setupContentStyle}>\r\n <span className={titleStyle}>{card.title}</span>\r\n {getProgressBar(card.steps, card.status)}\r\n {card.status && <span className={statusStyle}>{formatMessage(messages[card.status])}</span>}\r\n <p className={descriptionStyle}>{card.description}</p>\r\n </div>\r\n <div className={setupCardButtonStyle}>{card.button}</div>\r\n </>\r\n ) : (\r\n <Shimmer customElementsGroup={getShimmerSetupCard()} style={{ minHeight: '320px' }} />\r\n )}\r\n </div>\r\n );\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n gettingStartedTitle: {\r\n id: 'gettingStarted.title',\r\n defaultMessage: 'Get started',\r\n },\r\n});\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterSpacing } from '../../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../../types';\r\n\r\ntype StyleProperties = 'cardsContainer' | 'headerSection';\r\ntype GettingStartedStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): GettingStartedStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n return mergeStyleSets({\r\n cardsContainer: {\r\n display: 'grid',\r\n gridTemplateColumns: `repeat(auto-fit, minmax(${spacing.size260}, 1fr))`,\r\n justifyContent: 'space-between',\r\n gap: spacing.size15,\r\n },\r\n headerSection: {\r\n margin: `${spacing.size15} 0px`,\r\n fontSize: spacing.size20,\r\n fontWeight: '600',\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { PrimaryButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { HomePageStatus } from '../../../@data/store/schema/IHomeViewState';\r\nimport messages from '../../SetupCard/SetupCard.messages';\r\nimport { ISetupCard, SetupCardType } from '../../SetupCard/SetupCardUtils';\r\n\r\nexport const getSetupCards = (\r\n handleProfileCardButtonClick,\r\n handleCompleteProfileCardButtonClick,\r\n handleSiteCardButtonClick,\r\n handleAdUnitCardButtonClick,\r\n profileCardInfo,\r\n siteCardInfo,\r\n adunitCardInfo,\r\n adUnitStatus: HomePageStatus,\r\n siteStatus: HomePageStatus,\r\n profileStatus: HomePageStatus,\r\n formatMessage\r\n): ISetupCard[] => {\r\n const gettingStartedCards: ISetupCard[] = [\r\n {\r\n title: profileCardInfo[HomePageStatus[profileStatus]][0],\r\n description: profileCardInfo[HomePageStatus[profileStatus]][1],\r\n button: (\r\n <PrimaryButton\r\n text={profileCardInfo[HomePageStatus[profileStatus]][2]}\r\n style={{\r\n justifyContent: 'center',\r\n display: 'flex',\r\n }}\r\n onClick={() => (isProfileNotStarted(profileStatus) ? handleCompleteProfileCardButtonClick() : handleProfileCardButtonClick())}\r\n />\r\n ),\r\n image: profileCardInfo[HomePageStatus[profileStatus]][3],\r\n imageAlt: formatMessage(messages.setupProfile),\r\n status: profileStatus, // formatMessage(messages[profileStatus])\r\n steps: 2,\r\n cardType: SetupCardType.GetStarted,\r\n },\r\n {\r\n title: siteCardInfo[HomePageStatus[siteStatus]][0],\r\n description: siteCardInfo[HomePageStatus[siteStatus]][1],\r\n button: (\r\n <PrimaryButton\r\n text={siteCardInfo[HomePageStatus[siteStatus]][2]}\r\n style={{\r\n justifyContent: 'center',\r\n display: 'flex',\r\n }}\r\n onClick={() => handleSiteCardButtonClick()}\r\n />\r\n ),\r\n image: siteCardInfo[HomePageStatus[siteStatus]][3],\r\n imageAlt: formatMessage(messages.setupSite),\r\n status: siteStatus, // formatMessage(messages[siteStatus]),\r\n steps: 2,\r\n cardType: SetupCardType.GetStarted,\r\n },\r\n {\r\n title: adunitCardInfo[HomePageStatus[adUnitStatus]][0],\r\n description: adunitCardInfo[HomePageStatus[adUnitStatus]][1],\r\n button: (\r\n <PrimaryButton\r\n text={adunitCardInfo[HomePageStatus[adUnitStatus]][2]}\r\n style={{\r\n justifyContent: 'center',\r\n display: 'flex',\r\n }}\r\n onClick={() => handleAdUnitCardButtonClick()}\r\n />\r\n ),\r\n image: adunitCardInfo[HomePageStatus[adUnitStatus]][3],\r\n imageAlt: formatMessage(messages.setupAdunit),\r\n status: adUnitStatus, // formatMessage(messages[adUnitStatus]),\r\n steps: 1,\r\n cardType: SetupCardType.GetStarted,\r\n },\r\n ];\r\n\r\n return gettingStartedCards;\r\n};\r\n\r\nexport const getSetupCardsPlaceholder = (): ISetupCard[] => {\r\n return [\r\n {\r\n title: '',\r\n description: '',\r\n },\r\n {\r\n title: '',\r\n description: '',\r\n },\r\n {\r\n title: '',\r\n description: '',\r\n },\r\n ];\r\n};\r\n\r\nconst isProfileNotStarted = (profileStatus: HomePageStatus): boolean => {\r\n return HomePageStatus[profileStatus] === HomePageStatus.NotStarted;\r\n};\r\n","import messages from '../../SetupCard/SetupCard.messages';\r\n// Since each state in Getting started card has a different title and description, so we will create a dictionary where the key\r\n// is status and value is ['title', 'description', 'button text']\r\nimport AdUnitStep1 from '../../SetupCard/resources/AdUnitStep1.svg';\r\nimport AdUnitStep2 from '../../SetupCard/resources/AdUnitStep2.svg';\r\nimport ProfileStep1 from '../../SetupCard/resources/ProfileStep1.svg';\r\nimport ProfileStep2 from '../../SetupCard/resources/ProfileStep2.svg';\r\nimport ProfileStep3 from '../../SetupCard/resources/ProfileStep3.svg';\r\nimport ProfileStep4 from '../../SetupCard/resources/ProfileStep4.svg';\r\nimport SiteStep1 from '../../SetupCard/resources/SiteStep1.svg';\r\nimport SiteStep2 from '../../SetupCard/resources/SiteStep2.svg';\r\nimport SiteStep3 from '../../SetupCard/resources/SiteStep3.svg';\r\n\r\nexport const getProfileCardInfo = (formatMessage) => {\r\n return {\r\n NotStarted: [\r\n formatMessage(messages.profileCardTitleNotStarted),\r\n formatMessage(messages.profileCardDescriptionNotStarted),\r\n formatMessage(messages.profileCardButtonNotStarted),\r\n ProfileStep1,\r\n ],\r\n AwaitingVerification: [\r\n formatMessage(messages.profileCardTitleAwaitingForVerification),\r\n formatMessage(messages.profileCardDescriptionAwaitingForVerification),\r\n formatMessage(messages.profileCardButtonAwaitingForVerification),\r\n ProfileStep2,\r\n ],\r\n Completed: [\r\n formatMessage(messages.profileCardTitleCompleted),\r\n formatMessage(messages.profileCardDescriptionCompleted),\r\n formatMessage(messages.profileCardButtonCompleted),\r\n ProfileStep3,\r\n ],\r\n Rejected: [\r\n formatMessage(messages.profileCardTitleNeedsAttention),\r\n formatMessage(messages.profileCardDescriptionNeedsAttention),\r\n formatMessage(messages.profileCardButtonNeedsAttention),\r\n ProfileStep4,\r\n ],\r\n };\r\n};\r\n\r\nexport const getSiteCardInfo = (formatMessage) => {\r\n return {\r\n NotStarted: [\r\n formatMessage(messages.siteCardTitleNotStarted),\r\n formatMessage(messages.siteCardDescriptionNotStarted),\r\n formatMessage(messages.siteCardButtonNotStarted),\r\n SiteStep1,\r\n ],\r\n AwaitingVerification: [\r\n formatMessage(messages.siteCardTitleAwaitingForVerification),\r\n formatMessage(messages.siteCardDescriptionAwaitingForVerification),\r\n formatMessage(messages.siteCardButtonAwaitingForVerification),\r\n SiteStep2,\r\n ],\r\n Completed: [\r\n formatMessage(messages.siteCardTitleCompleted),\r\n formatMessage(messages.siteCardDescriptionCompleted),\r\n formatMessage(messages.siteCardButtonCompleted),\r\n SiteStep3,\r\n ],\r\n };\r\n};\r\n\r\nexport const getAdunitCardInfo = (formatMessage) => {\r\n return {\r\n NotStarted: [\r\n formatMessage(messages.adUnitCardTitleNotStarted),\r\n formatMessage(messages.adUnitCardDescriptionNotStarted),\r\n formatMessage(messages.adUnitCardButtonNotStarted),\r\n AdUnitStep1,\r\n ],\r\n Completed: [\r\n formatMessage(messages.adUnitCardTitleCompleted),\r\n formatMessage(messages.adUnitCardDescriptionCompleted),\r\n formatMessage(messages.adUnitCardButtonCompleted),\r\n AdUnitStep2,\r\n ],\r\n };\r\n};\r\n\r\nexport const getStatusCardsInfo = (formatMessage) => {\r\n return {\r\n profileCardInfo: getProfileCardInfo(formatMessage),\r\n siteCardInfo: getSiteCardInfo(formatMessage),\r\n adunitCardInfo: getAdunitCardInfo(formatMessage),\r\n };\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { injectRouterAndIntlWithObserver } from '../../../../../utils';\r\nimport {\r\n getTythonAdUnitCreatePageRoute,\r\n getTythonAdsCreationPageRoute,\r\n getTythonInventoryCreationPageRoute,\r\n getTythonProfilePageRoute,\r\n getTythonSiteCreatePageRoute,\r\n} from '../../../../../utils/routeUtils';\r\n\r\nimport { usePreloadSVGImages } from '../../../../../hooks';\r\nimport { getStore as getWindowsAppFeatureFlagStore } from '../../../../../hooks/useWindowsAppFeatureFlag/store/store';\r\nimport ConnectAppImg from '../../../../../layout/EntityCreationLayout/connectApp.svg';\r\nimport ConnectSiteImg from '../../../../../layout/EntityCreationLayout/connectSite.svg';\r\nimport { editProfileAction } from '../../../Profile/@data/actions';\r\nimport { fetchSetupCardsStatus } from '../../@data/actions';\r\nimport { getStore } from '../../@data/store/store';\r\nimport { SetupCard } from '../SetupCard/SetupCard';\r\nimport { ISetupCard } from '../SetupCard/SetupCardUtils';\r\nimport AdUnitStep1 from '../SetupCard/resources/AdUnitStep1.svg';\r\nimport AdUnitStep2 from '../SetupCard/resources/AdUnitStep2.svg';\r\nimport ProfileStep1 from '../SetupCard/resources/ProfileStep1.svg';\r\nimport ProfileStep2 from '../SetupCard/resources/ProfileStep2.svg';\r\nimport ProfileStep3 from '../SetupCard/resources/ProfileStep3.svg';\r\nimport SiteStep1 from '../SetupCard/resources/SiteStep1.svg';\r\nimport SiteStep2 from '../SetupCard/resources/SiteStep2.svg';\r\nimport SiteStep3 from '../SetupCard/resources/SiteStep3.svg';\r\nimport messages from './GettingStarted.messages';\r\nimport { getClassNames } from './GettingStarted.styles';\r\nimport { getSetupCards, getSetupCardsPlaceholder } from './utils/getCards';\r\nimport { getStatusCardsInfo } from './utils/getStatusMessages';\r\n\r\nexport const GettingStarted = injectRouterAndIntlWithObserver(function GettingStartedComponent({ intl: { formatMessage }, history }) {\r\n const { cardsContainer, headerSection } = getClassNames();\r\n const { profileCardInfo, siteCardInfo, adunitCardInfo } = getStatusCardsInfo(formatMessage);\r\n const { isFeatureEnabled } = getWindowsAppFeatureFlagStore();\r\n // TODO - get isSetupDone from the store to control display of section\r\n const { adUnitStatus, siteStatus, profileStatus, isSetupDone } = getStore();\r\n let gettingStartedCards: ISetupCard[] = getSetupCardsPlaceholder();\r\n\r\n usePreloadSVGImages([\r\n ConnectAppImg,\r\n ConnectSiteImg,\r\n AdUnitStep1,\r\n AdUnitStep2,\r\n ProfileStep1,\r\n ProfileStep2,\r\n ProfileStep3,\r\n SiteStep1,\r\n SiteStep2,\r\n SiteStep3,\r\n ]);\r\n\r\n if (adUnitStatus && siteStatus && profileStatus) {\r\n gettingStartedCards = getSetupCards(\r\n handleProfileCardButtonClick,\r\n handleCompleteProfileCardButtonClick,\r\n handleSiteCardButtonClick,\r\n handleAdUnitCardButtonClick,\r\n profileCardInfo,\r\n siteCardInfo,\r\n adunitCardInfo,\r\n adUnitStatus,\r\n siteStatus,\r\n profileStatus,\r\n formatMessage\r\n );\r\n }\r\n\r\n function handleCompleteProfileCardButtonClick() {\r\n editProfileAction();\r\n history.push(getTythonProfilePageRoute());\r\n }\r\n\r\n function handleProfileCardButtonClick() {\r\n history.push(getTythonProfilePageRoute());\r\n }\r\n\r\n function handleSiteCardButtonClick() {\r\n history.push(isFeatureEnabled ? getTythonInventoryCreationPageRoute() : getTythonSiteCreatePageRoute());\r\n }\r\n\r\n function handleAdUnitCardButtonClick() {\r\n history.push(isFeatureEnabled ? getTythonAdsCreationPageRoute() : getTythonAdUnitCreatePageRoute());\r\n }\r\n\r\n useEffect(() => {\r\n // Make a call to fetch status for Profile, sites and adunit\r\n fetchSetupCardsStatus();\r\n }, []);\r\n\r\n const displaySetupCards = (cards: ISetupCard[]) => {\r\n return cards.map((card, index) => <SetupCard card={card} key={index} />);\r\n };\r\n\r\n return (\r\n <>\r\n {!isSetupDone ? (\r\n <div>\r\n <h2 className={headerSection}>{formatMessage(messages.gettingStartedTitle)}</h2>\r\n <div className={cardsContainer}>{displaySetupCards(gettingStartedCards)}</div>\r\n </div>\r\n ) : null}\r\n </>\r\n );\r\n});\r\n","import { mergeStyleSets } from '@fluentui/merge-styles';\r\nimport { getTheme } from '@fluentui/style-utilities';\r\nimport { IPubcenterSpacing } from '../../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../../types';\r\n\r\ntype StyleProperties = 'titleStyle' | 'sectionContainerStyle';\r\ntype PerformanceSectionStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): PerformanceSectionStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return mergeStyleSets({\r\n titleStyle: {\r\n margin: `${spacing.size15} 0px`,\r\n fontSize: spacing.size20,\r\n fontWeight: 600,\r\n },\r\n sectionContainerStyle: {\r\n display: 'grid',\r\n gridTemplateColumns: `repeat(auto-fit, minmax(${spacing.size260}, 1fr))`,\r\n justifyContent: 'space-between',\r\n gap: spacing.size15,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { getTheme } from '@fluentui/react';\r\nimport { IChartProps } from '@fluentui/react-charting';\r\nimport React from 'react';\r\nimport { IPubcenterPalette, IPubcenterTheme } from '../../../../../../../theme';\r\nimport { PaymentsPageBalance } from '../../../../../../@data';\r\nimport { roundNumber } from '../../../../../../utils';\r\n\r\nexport function mapToBarChartData(data?: PaymentsPageBalance): IChartProps[] {\r\n const theme = (getTheme() as unknown) as IPubcenterTheme;\r\n const palette = theme.palette as IPubcenterPalette;\r\n\r\n const chartData: IChartProps[] = [\r\n {\r\n chartData: [\r\n {\r\n horizontalBarChartdata: {\r\n x: data ? (roundNumber(data.currBalance, 2) === 0 ? 0.1 : roundNumber(data.currBalance, 2)) : 0,\r\n y: data ? data.threshold : 0,\r\n },\r\n color: data && roundNumber(data.currBalance, 2) === 0 ? palette.white : palette.blue,\r\n yAxisCalloutData: `${data ? data.currBalance : 0}$`,\r\n },\r\n ],\r\n },\r\n ];\r\n return chartData;\r\n}\r\n\r\nexport function getBarChartCustomData(payout: string) {\r\n const theme = (getTheme() as unknown) as IPubcenterTheme;\r\n const palette = theme.palette as IPubcenterPalette;\r\n return (props: IChartProps) => {\r\n return (\r\n <div\r\n style={{\r\n display: 'flex',\r\n height: '30px',\r\n width: '63px',\r\n background: palette['NeutralBackground3.Rest'],\r\n marginBottom: '5px',\r\n justifyContent: 'center',\r\n clipPath: 'polygon(0% 0%, 100% 0%, 100% 100%, 90% 80%, 0% 80%)',\r\n borderRadius: '5px',\r\n }}\r\n >\r\n <span style={{ fontSize: '14px', fontWeight: 400 }}>{payout}</span>\r\n </div>\r\n );\r\n };\r\n}\r\n","import { IStyle, mergeStyleSets } from '@fluentui/merge-styles';\r\nimport { getTheme } from '@fluentui/style-utilities';\r\nimport { IPubcenterPalette, IPubcenterSpacing } from '../../../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../../../types';\r\n\r\nexport interface IBalanceCardStyles {\r\n cardContainerStyle: string;\r\n contentStyle: string;\r\n balanceImageStyle: string;\r\n balanceStyle: string;\r\n balanceTextStyle: string;\r\n currentBalanceStyle: string;\r\n lastPaymentInfoStyle: string;\r\n imageStyle: string;\r\n barChartSectionStyle: string;\r\n currentBalanceInfoStyle: string;\r\n currentBalanceInfoTextStyle: string;\r\n iconSectionStyle: string;\r\n iconStyle: string;\r\n iconContentStyle: string;\r\n iconTextStyle: string;\r\n subComponentStyles: {\r\n chartTitle: IStyle;\r\n items: IStyle;\r\n };\r\n}\r\n\r\nexport const getStyles = (props: ICommonStyleProps): IBalanceCardStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n\r\n return mergeStyleSets({\r\n cardContainerStyle: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: 'auto',\r\n boxShadow: '0px 0px 7px 0px rgba(0,0,0,0.2)',\r\n transition: '0.3s',\r\n borderRadius: spacing.size10,\r\n flex: 1,\r\n gridColumn: 'span 1',\r\n minHeight: spacing.size256,\r\n },\r\n contentStyle: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n margin: `${spacing.size10} ${spacing.size15}`,\r\n height: '100%',\r\n },\r\n balanceImageStyle: {\r\n display: 'flex',\r\n },\r\n balanceStyle: {\r\n width: spacing.size150,\r\n marginRight: 'auto',\r\n },\r\n balanceTextStyle: {\r\n fontSize: spacing.size16,\r\n fontWeight: 600,\r\n },\r\n currentBalanceStyle: {\r\n margin: '0px',\r\n fontSize: spacing.size28,\r\n fontWeight: 600,\r\n },\r\n lastPaymentInfoStyle: {\r\n fontSize: spacing.size12,\r\n fontWeight: 400,\r\n marginTop: spacing.size4,\r\n },\r\n imageStyle: {\r\n display: 'flex',\r\n marginTop: spacing.size10,\r\n },\r\n barChartSectionStyle: {\r\n marginTop: spacing.size20,\r\n },\r\n currentBalanceInfoStyle: {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n },\r\n currentBalanceInfoTextStyle: {\r\n fontSize: spacing.size10,\r\n fontWeight: 400,\r\n },\r\n iconSectionStyle: {\r\n marginTop: spacing.size40,\r\n },\r\n iconStyle: {\r\n border: 'none',\r\n padding: '0px',\r\n cursor: 'pointer',\r\n fontStyle: 'normal',\r\n },\r\n iconContentStyle: {\r\n width: 'auto',\r\n padding: `0px ${spacing.size12}`,\r\n height: spacing.size32,\r\n border: `${spacing.size1} solid ${palette['NeutralStroke1.Rest']}`,\r\n borderRadius: spacing.size4,\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n display: 'flex',\r\n ':hover': {\r\n backgroundColor: palette['NeutralBackground3.Rest'],\r\n cursor: 'pointer',\r\n },\r\n },\r\n iconTextStyle: {\r\n marginLeft: spacing.size10,\r\n marginBottom: spacing.size4,\r\n color: palette['NeutralForeground1.Rest'],\r\n fontSize: spacing.size14,\r\n fontWeight: 600,\r\n },\r\n subComponentStyles: {\r\n chartTitle: {\r\n justifyContent: 'flex-end',\r\n },\r\n items: {\r\n marginBottom: '3px',\r\n },\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n performanceSectionTitle: {\r\n id: 'performanceSection.title',\r\n defaultMessage: 'Your Performance Snapshot',\r\n },\r\n viewPayment: {\r\n id: 'viewPayment.button',\r\n defaultMessage: 'View Payment',\r\n },\r\n lastEarned: {\r\n id: 'lastEarned.text',\r\n defaultMessage: 'earned since last payment',\r\n },\r\n balanceCardTitle: {\r\n id: 'balanceCard.title',\r\n defaultMessage: 'Balance',\r\n },\r\n payout: {\r\n id: 'payout.popup',\r\n defaultMessage: 'Payout!',\r\n },\r\n balanceImage: {\r\n id: 'balance.image',\r\n defaultMessage: 'Balance Image',\r\n },\r\n performanceCardTitle: {\r\n id: 'performanceCard.title',\r\n defaultMessage: 'Performance',\r\n },\r\n metricsDaterange: {\r\n id: 'metric.daterange',\r\n defaultMessage: 'Last 30 days',\r\n },\r\n viewReports: {\r\n id: 'viewReports.button',\r\n defaultMessage: 'View Reports',\r\n },\r\n});\r\n","import { Icon, Image, Shimmer } from '@fluentui/react';\r\nimport { HorizontalBarChart } from '@fluentui/react-charting';\r\nimport React from 'react';\r\nimport { useI18n } from '../../../../../../../i18n/useI18n';\r\nimport { getAppStore } from '../../../../../../@data';\r\nimport { injectRouterAndIntlWithObserver } from '../../../../../../utils';\r\nimport { getTythonPaymentPageRoute } from '../../../../../../utils/routeUtils';\r\nimport { getPaymentsPageBalance } from '../../../../Account/@data/store/selectors';\r\nimport { getStore } from '../../../../Account/Settings/@data/store/store';\r\nimport balanceImg from '../resources/BalanceImg.svg';\r\nimport paymentImg from '../resources/Payment.svg';\r\nimport { getBarChartCustomData, mapToBarChartData } from '../utils/balanceHelper';\r\nimport { getBalanceHorizontalBarShimmer, getBalanceValueShimmer } from '../utils/getBalanceShimmers';\r\nimport { getClassNames } from './BalanceCard.styles';\r\nimport messages from './messages';\r\n\r\nconst CURRENCY = 'USD';\r\n\r\nconst BalanceCard = injectRouterAndIntlWithObserver(({ intl: { formatMessage }, history }) => {\r\n const { data, isDataLoaded } = getPaymentsPageBalance();\r\n const {\r\n cardContainerStyle,\r\n contentStyle,\r\n balanceImageStyle,\r\n balanceStyle,\r\n balanceTextStyle,\r\n currentBalanceStyle,\r\n lastPaymentInfoStyle,\r\n imageStyle,\r\n barChartSectionStyle,\r\n currentBalanceInfoStyle,\r\n currentBalanceInfoTextStyle,\r\n iconSectionStyle,\r\n iconStyle,\r\n iconContentStyle,\r\n iconTextStyle,\r\n } = getClassNames();\r\n\r\n const { publisher, userContext } = getAppStore();\r\n const { systemPreferences } = getStore().active;\r\n const { locale } = useI18n({ systemPreferences, publisher, userContext });\r\n\r\n const currentBalance = Number(data?.currBalance).toLocaleString(locale, { style: 'currency', currency: CURRENCY });\r\n\r\n const styles = {\r\n chartTitle: {\r\n justifyContent: 'flex-end',\r\n },\r\n items: {\r\n marginBottom: '3px',\r\n },\r\n };\r\n\r\n function handleViewPaymentButton() {\r\n history.push(getTythonPaymentPageRoute());\r\n }\r\n\r\n return (\r\n <>\r\n <div className={cardContainerStyle}>\r\n <div className={contentStyle}>\r\n <div className={balanceImageStyle}>\r\n <div className={balanceStyle}>\r\n <h3 className={balanceTextStyle}>{formatMessage(messages.balanceCardTitle)}</h3>\r\n {isDataLoaded ? (\r\n <>\r\n <p className={currentBalanceStyle}>{currentBalance}</p>\r\n <p className={lastPaymentInfoStyle}>{formatMessage(messages.lastEarned)}</p>\r\n </>\r\n ) : (\r\n <Shimmer customElementsGroup={getBalanceValueShimmer()} />\r\n )}\r\n </div>\r\n <div className={imageStyle}>\r\n <Image src={balanceImg} alt={formatMessage(messages.balanceImage)} />\r\n </div>\r\n </div>\r\n <div className={barChartSectionStyle}>\r\n {isDataLoaded ? (\r\n <>\r\n <HorizontalBarChart\r\n barHeight={15}\r\n data={mapToBarChartData(data)}\r\n barChartCustomData={getBarChartCustomData(formatMessage(messages.payout))}\r\n styles={{ ...styles }}\r\n hideTooltip\r\n />\r\n <div className={currentBalanceInfoStyle}>\r\n <span className={currentBalanceInfoTextStyle}>{`${currentBalance} / $${data?.threshold}`}</span>\r\n </div>\r\n </>\r\n ) : (\r\n <Shimmer customElementsGroup={getBalanceHorizontalBarShimmer()} />\r\n )}\r\n </div>\r\n\r\n <div className={iconSectionStyle}>\r\n <Icon className={iconStyle} onClick={() => handleViewPaymentButton()}>\r\n <div className={iconContentStyle}>\r\n <Image src={paymentImg} />\r\n <span className={iconTextStyle}>{formatMessage(messages.viewPayment)}</span>\r\n </div>\r\n </Icon>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n});\r\n\r\nexport default BalanceCard;\r\n","import { ShimmerElementType, ShimmerElementsGroup } from '@fluentui/react';\r\nimport React from 'react';\r\n\r\nexport const getBalanceValueShimmer = (): JSX.Element => {\r\n return (\r\n <div>\r\n <ShimmerElementsGroup flexWrap width=\"100%\" shimmerElements={[{ type: ShimmerElementType.line, width: '100%', height: 37 }]} />\r\n </div>\r\n );\r\n};\r\n\r\nexport const getBalanceHorizontalBarShimmer = (): JSX.Element => {\r\n return (\r\n <div>\r\n <ShimmerElementsGroup flexWrap width=\"100%\" shimmerElements={[{ type: ShimmerElementType.line, width: '100%', height: 16 }]} />\r\n <ShimmerElementsGroup\r\n backgroundColor={'transparent'}\r\n flexWrap\r\n width=\"100%\"\r\n shimmerElements={[\r\n { type: ShimmerElementType.gap, width: '60%', height: 14 },\r\n { type: ShimmerElementType.line, width: '40%', height: 14, verticalAlign: 'bottom' },\r\n ]}\r\n />\r\n </div>\r\n );\r\n};\r\n","import { mergeStyleSets } from '@fluentui/merge-styles';\r\nimport { getTheme } from '@fluentui/style-utilities';\r\nimport { IPubcenterSpacing } from '../../../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../../../types';\r\n\r\ntype StyleProperties = 'titleStyle' | 'valueStyle';\r\n\r\ntype MetricItemStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): MetricItemStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return mergeStyleSets({\r\n titleStyle: {\r\n flex: '1 1 auto',\r\n borderBottom: '1px dotted black',\r\n fontSize: spacing.size12,\r\n fontWeight: 400,\r\n margin: `0px 0px ${spacing.size4} 0px`,\r\n },\r\n valueStyle: {\r\n fontSize: spacing.size24,\r\n fontWeight: 600,\r\n margin: '0px',\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { Icon, Shimmer, TooltipHost } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { injectIntlAndObserver } from '../../../../../../utils';\r\nimport { getPerformanceShimmer } from '../utils/getPerformanceShimmer';\r\nimport { getClassNames } from './MetricItem.styles';\r\n\r\nexport interface IMetricItemProps extends InjectedIntlProps {\r\n title: string;\r\n dataValue: string;\r\n isDataLoaded?: boolean;\r\n}\r\n\r\nconst MetricItem = injectIntlAndObserver<IMetricItemProps>((props: IMetricItemProps) => {\r\n const { titleStyle, valueStyle } = getClassNames();\r\n return (\r\n <>\r\n <span className={titleStyle}>\r\n {props.title}\r\n {props.title.length === 0 ? (\r\n ''\r\n ) : (\r\n <TooltipHost content=\"description\">\r\n <Icon iconName=\"info\" style={{ display: 'none', marginLeft: '5px' }} />\r\n </TooltipHost>\r\n )}\r\n </span>\r\n {props.isDataLoaded ? (\r\n <p className={valueStyle}>{props.dataValue ? props.dataValue : '--'}</p>\r\n ) : (\r\n <Shimmer customElementsGroup={getPerformanceShimmer()} />\r\n )}\r\n </>\r\n );\r\n});\r\n\r\nexport default MetricItem;\r\n","import { ShimmerElementType, ShimmerElementsGroup } from '@fluentui/react';\r\nimport React from 'react';\r\n\r\nexport const getPerformanceShimmer = (): JSX.Element => {\r\n return (\r\n <div style={{ width: '142px' }}>\r\n <ShimmerElementsGroup flexWrap width=\"100%\" shimmerElements={[{ type: ShimmerElementType.line, width: '100%', height: 37 }]} />\r\n </div>\r\n );\r\n};\r\n","import { mergeStyleSets } from '@fluentui/merge-styles';\r\nimport { getTheme } from '@fluentui/style-utilities';\r\nimport { BreakPoints, IPubcenterPalette, IPubcenterSpacing } from '../../../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../../../types';\r\n\r\ntype StyleProperties =\r\n | 'cardContainerStyle'\r\n | 'cardContentStyle'\r\n | 'headerStyle'\r\n | 'titleStyle'\r\n | 'timeRangeStyle'\r\n | 'metricsContainerStyle'\r\n | 'metricStyle'\r\n | 'iconContainerStyle'\r\n | 'iconStyle'\r\n | 'iconContentStyle'\r\n | 'iconTextStyle';\r\n\r\ntype PerformanceCardStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): PerformanceCardStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const { ResponsiveExtraLarge } = BreakPoints;\r\n return mergeStyleSets({\r\n cardContainerStyle: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: 'auto',\r\n boxShadow: '0px 0px 7px 0px rgba(0,0,0,0.2)',\r\n transition: '0.3s',\r\n borderRadius: spacing.size10,\r\n flex: 1,\r\n gridColumn: 'span 2',\r\n minHeight: spacing.size256,\r\n },\r\n cardContentStyle: {\r\n display: 'flex',\r\n marginLeft: spacing.size20,\r\n flexDirection: 'column',\r\n height: '100%',\r\n },\r\n headerStyle: {\r\n display: 'flex',\r\n },\r\n titleStyle: {\r\n fontSize: spacing.size16,\r\n fontWeight: 600,\r\n },\r\n timeRangeStyle: {\r\n fontSize: spacing.size12,\r\n fontWeight: 400,\r\n marginTop: spacing.size20,\r\n marginLeft: spacing.size10,\r\n },\r\n metricsContainerStyle: {\r\n display: 'grid',\r\n gridTemplateColumns: `repeat(auto-fit, minmax(150px, 1fr))`,\r\n justifyContent: 'space-around',\r\n gap: spacing.size30,\r\n [ResponsiveExtraLarge]: {\r\n gap: spacing.size54,\r\n },\r\n },\r\n metricStyle: {\r\n display: 'flex',\r\n alignItems: 'baseline',\r\n flexDirection: 'column',\r\n minWidth: spacing.size126,\r\n width: spacing.size142,\r\n height: spacing.size52,\r\n },\r\n iconContainerStyle: {\r\n marginTop: 'auto',\r\n marginBottom: spacing.size12,\r\n },\r\n iconStyle: {\r\n background: 'white',\r\n border: 'none',\r\n padding: '0px',\r\n cursor: 'pointer',\r\n fontStyle: 'normal',\r\n },\r\n iconContentStyle: {\r\n width: 'auto',\r\n padding: `0px ${spacing.size12}`,\r\n height: spacing.size32,\r\n border: `${spacing.size1} solid ${palette['NeutralStroke1.Rest']}`,\r\n borderRadius: spacing.size4,\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n display: 'flex',\r\n ':hover': {\r\n backgroundColor: palette['NeutralBackground3.Rest'],\r\n cursor: 'pointer',\r\n },\r\n },\r\n iconTextStyle: {\r\n marginLeft: spacing.size10,\r\n marginBottom: spacing.size4,\r\n color: palette['NeutralForeground1.Rest'],\r\n fontSize: spacing.size14,\r\n fontWeight: 600,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { Icon, Image } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { useI18n } from '../../../../../../../i18n/useI18n';\r\nimport { getAppStore } from '../../../../../../@data';\r\nimport { injectRouterAndIntlWithObserver } from '../../../../../../utils';\r\nimport { getTythonReportDashboardPageRoute } from '../../../../../../utils/routeUtils';\r\nimport { TythonColumnsEnum } from '../../../../../report/@data/store/schema/ColumnsEnum';\r\nimport { TythonReportingDataRow } from '../../../../../report/DashboardCards/@data/store/schema';\r\nimport { constructRequestBody } from '../../../../../report/DashboardCards/ReportCard/ReportCard.helpers';\r\nimport { ChartGrain, ReportCardType } from '../../../../../report/DashboardCards/ReportCard/ReportCard.types';\r\nimport { useReportMetadata, useReportQuery } from '../../../../../report/hooks/useReportQuery';\r\nimport { getReportColumnMetadataDisplayName } from '../../../../../report/utils/intlHelper';\r\nimport { formatMetric } from '../../../../../report/utils/metricsFormatter';\r\nimport { getStore } from '../../../../Account/Settings/@data/store/store';\r\nimport dataUsage from '../resources/Data_Usage.svg';\r\nimport MetricItem from './MetricItem';\r\nimport { getClassNames } from './PerformanceCard.styles';\r\nimport messages from './messages';\r\n\r\nconst PerformanceCard = injectRouterAndIntlWithObserver(({ intl: { formatMessage }, history }) => {\r\n const DAYS_BACK: number = 30;\r\n const dateRange = {\r\n startDate: new Date(new Date().setDate(new Date().getDate() - DAYS_BACK)),\r\n endDate: new Date(),\r\n };\r\n const { data: reportMetadata } = useReportMetadata();\r\n const isMetadataLoaded = !!reportMetadata;\r\n const { data: summaryData } = useReportQuery(\r\n constructRequestBody(ReportCardType.SUMMARY, dateRange, ChartGrain.NONE, [], [], reportMetadata?.metrics || []),\r\n false,\r\n isMetadataLoaded\r\n );\r\n const isDataLoaded = !!summaryData;\r\n const summary = (summaryData && summaryData[0] ? summaryData[0] : { DateTime: '' }) as TythonReportingDataRow;\r\n const { publisher, userContext } = getAppStore();\r\n const { systemPreferences } = getStore().active;\r\n const { locale } = useI18n({ systemPreferences, publisher, userContext });\r\n\r\n const {\r\n cardContainerStyle,\r\n cardContentStyle,\r\n headerStyle,\r\n titleStyle,\r\n timeRangeStyle,\r\n metricsContainerStyle,\r\n metricStyle,\r\n iconContainerStyle,\r\n iconStyle,\r\n iconContentStyle,\r\n iconTextStyle,\r\n } = getClassNames();\r\n\r\n function handleViewReportButton() {\r\n history.push(getTythonReportDashboardPageRoute());\r\n }\r\n\r\n return (\r\n <>\r\n <div className={cardContainerStyle}>\r\n <div className={cardContentStyle}>\r\n <div className={headerStyle}>\r\n <h3 className={titleStyle}>{formatMessage(messages.performanceCardTitle)}</h3>\r\n <p className={timeRangeStyle}>{formatMessage(messages.metricsDaterange)}</p>\r\n </div>\r\n\r\n <div className={metricsContainerStyle}>\r\n <div className={metricStyle}>\r\n <MetricItem\r\n title={(isMetadataLoaded && getReportColumnMetadataDisplayName(TythonColumnsEnum.Revenue, formatMessage)) || ''}\r\n dataValue={`${formatMetric(TythonColumnsEnum.Revenue, summary.Revenue, locale)}`}\r\n isDataLoaded={isDataLoaded}\r\n />\r\n </div>\r\n <div className={metricStyle}>\r\n <MetricItem\r\n title={(isMetadataLoaded && getReportColumnMetadataDisplayName(TythonColumnsEnum.FillRate, formatMessage)) || ''}\r\n dataValue={`${formatMetric(TythonColumnsEnum.FillRate, summary.FillRate, locale)}`}\r\n isDataLoaded={isDataLoaded}\r\n />\r\n </div>\r\n <div className={metricStyle}>\r\n <MetricItem\r\n title={(isMetadataLoaded && getReportColumnMetadataDisplayName(TythonColumnsEnum.ImpressionsServed, formatMessage)) || ''}\r\n dataValue={`${formatMetric(TythonColumnsEnum.ImpressionsServed, summary.ImpressionsServed, locale)}`}\r\n isDataLoaded={isDataLoaded}\r\n />\r\n </div>\r\n <div className={metricStyle}>\r\n <MetricItem\r\n title={(isMetadataLoaded && getReportColumnMetadataDisplayName(TythonColumnsEnum.Viewability, formatMessage)) || ''}\r\n dataValue={`${formatMetric(TythonColumnsEnum.Viewability, summary.Viewability, locale)}`}\r\n isDataLoaded={isDataLoaded}\r\n />\r\n </div>\r\n <div className={metricStyle}>\r\n <MetricItem\r\n title={(isMetadataLoaded && getReportColumnMetadataDisplayName(TythonColumnsEnum.ImpressionsViewed, formatMessage)) || ''}\r\n dataValue={`${formatMetric(TythonColumnsEnum.ImpressionsViewed, summary.ImpressionsViewed, locale)}`}\r\n isDataLoaded={isDataLoaded}\r\n />\r\n </div>\r\n <div className={metricStyle}>\r\n <MetricItem\r\n title={(isMetadataLoaded && getReportColumnMetadataDisplayName(TythonColumnsEnum.CTR, formatMessage)) || ''}\r\n dataValue={`${formatMetric(TythonColumnsEnum.CTR, summary.CTR, locale)}`}\r\n isDataLoaded={isDataLoaded}\r\n />\r\n </div>\r\n <div className={metricStyle}>\r\n <MetricItem\r\n title={(isMetadataLoaded && getReportColumnMetadataDisplayName(TythonColumnsEnum.eCPM, formatMessage)) || ''}\r\n dataValue={`${formatMetric(TythonColumnsEnum.eCPM, summary.eCPM, locale)}`}\r\n isDataLoaded={isDataLoaded}\r\n />\r\n </div>\r\n <div className={metricStyle}>\r\n <MetricItem\r\n title={(isMetadataLoaded && getReportColumnMetadataDisplayName(TythonColumnsEnum.Clicks, formatMessage)) || ''}\r\n dataValue={`${formatMetric(TythonColumnsEnum.Clicks, summary.Clicks, locale)}`}\r\n isDataLoaded={isDataLoaded}\r\n />\r\n </div>\r\n </div>\r\n <div className={iconContainerStyle}>\r\n <Icon className={iconStyle} onClick={() => handleViewReportButton()}>\r\n <div className={iconContentStyle}>\r\n <Image src={dataUsage} />\r\n <span className={iconTextStyle}>{formatMessage(messages.viewReports)}</span>\r\n </div>\r\n </Icon>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n});\r\n\r\nexport default PerformanceCard;\r\n","import React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { getEntityAccessPermissions } from '../../../../../@data';\r\nimport { UserRoleEntity, completeAccess, hasReadAccess } from '../../../../../@data/services/UserRoleService';\r\nimport { PublisherProfileTabs } from '../../../../../@data/store/schema/userrolemodels/PublisherProfileTabs';\r\nimport { injectIntlAndObserver } from '../../../../../utils';\r\nimport { getStore } from '../../@data/store/store';\r\nimport { getClassNames } from './PerformanceSection.styles';\r\nimport BalanceCard from './components/BalanceCard';\r\nimport PerformanceCard from './components/PerformanceCard';\r\nimport messages from './components/messages';\r\n\r\nconst PerformanceSection = injectIntlAndObserver<InjectedIntlProps>(({ intl: { formatMessage } }) => {\r\n const { isSetupDone } = getStore();\r\n const { titleStyle, sectionContainerStyle } = getClassNames();\r\n const publisherProfileAccess = getEntityAccessPermissions(UserRoleEntity.PublisherProfileTabs) as PublisherProfileTabs | null;\r\n const hasPaymentAccess = hasReadAccess(publisherProfileAccess === null ? completeAccess : publisherProfileAccess.payments);\r\n return (\r\n <>\r\n {isSetupDone ? (\r\n <div>\r\n <h2 className={titleStyle}>{formatMessage(messages.performanceSectionTitle)}</h2>\r\n <div className={sectionContainerStyle}>\r\n {hasPaymentAccess && <BalanceCard />}\r\n <PerformanceCard />\r\n </div>\r\n </div>\r\n ) : null}\r\n </>\r\n );\r\n});\r\n\r\nexport default PerformanceSection;\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n recommendationsTitle: {\r\n id: 'recommendations.title',\r\n defaultMessage: 'Recommendations',\r\n },\r\n setupPaymentTitle: {\r\n id: 'setupPayment.title',\r\n defaultMessage: 'Setup payment method',\r\n },\r\n setupPaymentDescription: {\r\n id: 'setupPayment.description',\r\n defaultMessage: 'Provide payment details to ensure your revenue is paid out correctly.',\r\n },\r\n setupPaymentButton: {\r\n id: 'setupPayment.button',\r\n defaultMessage: 'Go to Payments',\r\n },\r\n setupMediationTitle: {\r\n id: 'setupMediation.title',\r\n defaultMessage: 'Enable Google Mediation',\r\n },\r\n setupMediationDescription: {\r\n id: 'setupMediation.description',\r\n defaultMessage: 'Run your Google ads using {appName} to get maximum value for your ad inventory.',\r\n },\r\n setupMediationButton: {\r\n id: 'setupMediation.button',\r\n defaultMessage: 'Setup mediation',\r\n },\r\n setupAdsTxtTitle: {\r\n id: 'setupAdsTxt.title',\r\n defaultMessage: 'Enable Ads.txt on all sites',\r\n },\r\n setupAdsTxtDescription: {\r\n id: 'setupAdsTxt.description',\r\n defaultMessage: 'Install this file to verify your authenticity and increase the amount of advertisers who can advertise on your site.',\r\n },\r\n setupAdsTxtButton: {\r\n id: 'setupAdsTxt.button',\r\n defaultMessage: 'View sites',\r\n },\r\n paymentImage: {\r\n id: 'payment.image',\r\n defaultMessage: 'Payment Image',\r\n },\r\n mediationImage: {\r\n id: 'mediation.image',\r\n defaultMessage: 'Mediation Image',\r\n },\r\n adsTxtImage: {\r\n id: 'adsTxt.image',\r\n defaultMessage: 'Ads Txt image',\r\n },\r\n adBlockCardTitle: {\r\n id: 'adblock.card.title',\r\n defaultMessage: 'Set ad blocks',\r\n },\r\n adBlockCardDescription: {\r\n id: 'adblock.card.description',\r\n defaultMessage: 'Ad blocks shape which ads will show up on your sites ensuring that only content you approve of will be shown.',\r\n },\r\n adBlockCardAction: {\r\n id: 'adblock.card.action',\r\n defaultMessage: 'Ad blocks',\r\n },\r\n});\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterSpacing } from '../../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../../types';\r\n\r\ntype StyleProperties = 'cardsContainer' | 'headerSection';\r\ntype GettingStartedStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): GettingStartedStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n return mergeStyleSets({\r\n cardsContainer: {\r\n display: 'grid',\r\n gridTemplateColumns: `repeat(auto-fit, minmax(${spacing.size260}, 1fr))`,\r\n justifyContent: 'space-between',\r\n gap: '15px',\r\n },\r\n headerSection: {\r\n margin: '15px 0px',\r\n fontSize: '20px',\r\n fontWeight: '600',\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { DefaultButton, getTheme } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { IPubcenterPalette, IPubcenterSpacing, IPubcenterTheme } from '../../../../../../../theme';\r\nimport { getEntityAccessPermissions } from '../../../../../../@data';\r\nimport { UserRoleEntity, completeAccess, hasReadAccess } from '../../../../../../@data/services/UserRoleService';\r\nimport { PublisherProfileTabs } from '../../../../../../@data/store/schema/userrolemodels/PublisherProfileTabs';\r\nimport { APP_NAME_NEW } from '../../../../../../constants/AppConstants';\r\nimport { getAccountStatus } from '../../../../Account/@data/store/selectors';\r\nimport paymentImg from '../../PerformanceSection/resources/Payment.svg';\r\nimport { ISetupCard, SetupCardType } from '../../SetupCard/SetupCardUtils';\r\nimport messages from '../RecommendationsSection.messages';\r\nimport adBlock from '../resources/adBlock.svg';\r\nimport adsTxt from '../resources/adsTxt.svg';\r\nimport mediationImage from '../resources/mediation.svg';\r\nimport mediationIcon from '../resources/mediationIcon.svg';\r\nimport paymentImage from '../resources/payment.svg';\r\n\r\nexport const getRecommendationsCardsPlaceholder = (): ISetupCard[] => {\r\n return [\r\n {\r\n title: '',\r\n description: '',\r\n },\r\n {\r\n title: '',\r\n description: '',\r\n },\r\n {\r\n title: '',\r\n description: '',\r\n },\r\n ];\r\n};\r\n\r\nexport const getRecommendationsCards = (\r\n formatMessage,\r\n handlePaymentCardButtonClick,\r\n handleMediationButtonClick,\r\n handleAdsTxtCardButtonClick,\r\n handleAdBlockCardButtonClick,\r\n isMediationEnabeled\r\n): ISetupCard[] => {\r\n const NOT_CREATED_ACCOUNT_STATUS = 'NotCreated';\r\n const theme = (getTheme() as unknown) as IPubcenterTheme;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const actionButtonStyle = {\r\n justifyContent: 'center',\r\n display: 'flex',\r\n border: `${spacing.size1} solid ${palette['NeutralStroke1.Rest']}`,\r\n borderRadius: spacing.size4,\r\n };\r\n const actionButtonTextStyle = { lineHeight: spacing.size12, fontWeight: 600, marginLeft: spacing.size6 };\r\n const accountStatus = getAccountStatus();\r\n const publisherProfileAccess = getEntityAccessPermissions(UserRoleEntity.PublisherProfileTabs) as PublisherProfileTabs | null;\r\n const hasPaymentAccess = hasReadAccess(publisherProfileAccess === null ? completeAccess : publisherProfileAccess.payments);\r\n const gettingStartedCards: ISetupCard[] = [\r\n {\r\n title: formatMessage(messages.setupPaymentTitle),\r\n description: formatMessage(messages.setupPaymentDescription),\r\n button: (\r\n <DefaultButton style={actionButtonStyle} onClick={() => handlePaymentCardButtonClick()}>\r\n <img src={paymentImg} alt={formatMessage(messages.setupPaymentButton)} />\r\n <span style={actionButtonTextStyle}>{formatMessage(messages.setupPaymentButton)}</span>\r\n </DefaultButton>\r\n ),\r\n image: paymentImage,\r\n imageAlt: formatMessage(messages.paymentImage),\r\n hidden: !hasPaymentAccess || accountStatus !== NOT_CREATED_ACCOUNT_STATUS,\r\n cardType: SetupCardType.Recommendations,\r\n },\r\n {\r\n title: formatMessage(messages.setupMediationTitle),\r\n description: formatMessage(messages.setupMediationDescription, { appName: APP_NAME_NEW }),\r\n button: (\r\n <DefaultButton style={actionButtonStyle} onClick={() => handleMediationButtonClick()}>\r\n <img src={mediationIcon} alt={formatMessage(messages.setupMediationButton)} />\r\n <span style={actionButtonTextStyle}>{formatMessage(messages.setupMediationButton)}</span>\r\n </DefaultButton>\r\n ),\r\n image: mediationImage,\r\n imageAlt: formatMessage(messages.mediationImage),\r\n hidden: isMediationEnabeled,\r\n cardType: SetupCardType.Recommendations,\r\n },\r\n {\r\n title: formatMessage(messages.setupAdsTxtTitle),\r\n description: formatMessage(messages.setupAdsTxtDescription),\r\n button: (\r\n <DefaultButton style={actionButtonStyle} onClick={() => handleAdsTxtCardButtonClick()}>\r\n <img src={paymentImg} alt={formatMessage(messages.setupAdsTxtButton)} />\r\n <span style={actionButtonTextStyle}>{formatMessage(messages.setupAdsTxtButton)}</span>\r\n </DefaultButton>\r\n ),\r\n image: adsTxt,\r\n imageAlt: formatMessage(messages.adsTxtImage),\r\n cardType: SetupCardType.Recommendations,\r\n },\r\n {\r\n title: formatMessage(messages.adBlockCardTitle),\r\n description: formatMessage(messages.adBlockCardDescription),\r\n button: (\r\n <DefaultButton style={actionButtonStyle} onClick={() => handleAdBlockCardButtonClick()}>\r\n <img src={paymentImg} alt={formatMessage(messages.adBlockCardAction)} />\r\n <span style={actionButtonTextStyle}>{formatMessage(messages.adBlockCardAction)}</span>\r\n </DefaultButton>\r\n ),\r\n image: adBlock,\r\n imageAlt: formatMessage(messages.adBlockCardAction),\r\n cardType: SetupCardType.Recommendations,\r\n },\r\n ];\r\n\r\n return gettingStartedCards;\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { usePreloadSVGImages } from '../../../../../hooks';\r\nimport { injectRouterAndIntlWithObserver } from '../../../../../utils';\r\nimport {\r\n getAdBlocksPageRoute,\r\n getSitesRoute,\r\n getTythonAccountSettingPageRoute,\r\n getTythonPaymentPageRoute,\r\n} from '../../../../../utils/routeUtils';\r\nimport { getGoogleAdSenseStore } from '../../../Account/Settings/components/GoogleConnector/@data';\r\nimport { onInitializeRecommendationSection } from '../../@data/actions';\r\nimport { getStore } from '../../@data/store/store';\r\nimport performanceImg from '../PerformanceSection/resources/Payment.svg';\r\nimport { SetupCard } from '../SetupCard/SetupCard';\r\nimport { ISetupCard } from '../SetupCard/SetupCardUtils';\r\nimport messages from './RecommendationsSection.messages';\r\nimport { getClassNames } from './RecommendationsSection.styles';\r\nimport adBlockImg from './resources/adBlock.svg';\r\nimport adsTxtImg from './resources/adsTxt.svg';\r\nimport mediationImg from './resources/mediation.svg';\r\nimport mediationIconImg from './resources/mediationIcon.svg';\r\nimport paymentImg from './resources/payment.svg';\r\nimport { getRecommendationsCards, getRecommendationsCardsPlaceholder } from './utils/getCards';\r\n\r\nexport const RecommendationsSection = injectRouterAndIntlWithObserver(function RecommendationsSectionComponent({\r\n intl: { formatMessage },\r\n history,\r\n}) {\r\n const imgPreloadQueue = [adBlockImg, adsTxtImg, mediationImg, mediationIconImg, paymentImg, performanceImg];\r\n usePreloadSVGImages(imgPreloadQueue);\r\n const { cardsContainer, headerSection } = getClassNames();\r\n const { isSetupDone } = getStore();\r\n const { active } = getGoogleAdSenseStore();\r\n\r\n let recommendationsCards = getRecommendationsCardsPlaceholder();\r\n\r\n if (active.connectionStatus) {\r\n recommendationsCards = getRecommendationsCards(\r\n formatMessage,\r\n handlePaymentCardButtonClick,\r\n handleMediationButtonClick,\r\n handleAdsTxtCardButtonClick,\r\n handleAdBlockCardButtonClick,\r\n active.isMediationEnabled\r\n );\r\n }\r\n\r\n useEffect(() => {\r\n onInitializeRecommendationSection();\r\n }, []);\r\n\r\n function handlePaymentCardButtonClick() {\r\n history.push(getTythonPaymentPageRoute());\r\n }\r\n\r\n function handleMediationButtonClick() {\r\n history.push(getTythonAccountSettingPageRoute());\r\n }\r\n\r\n function handleAdsTxtCardButtonClick() {\r\n history.push(getSitesRoute());\r\n }\r\n\r\n function handleAdBlockCardButtonClick() {\r\n history.push(getAdBlocksPageRoute());\r\n }\r\n\r\n const displaySetupCards = (cards: ISetupCard[]) => {\r\n return cards.filter((card) => !card.hidden).map((card, index) => <SetupCard card={card} key={index} />);\r\n };\r\n\r\n return (\r\n <>\r\n {isSetupDone ? (\r\n <div>\r\n <h2 className={headerSection}>{formatMessage(messages.recommendationsTitle)}</h2>\r\n <div className={cardsContainer}>{displaySetupCards(recommendationsCards)}</div>\r\n </div>\r\n ) : null}\r\n </>\r\n );\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n notFound: {\r\n id: 'home.notFound',\r\n defaultMessage: 'No home found for this account.',\r\n },\r\n noPublisherSelected: {\r\n id: 'home.noPublisherSelected',\r\n defaultMessage: 'You arrived in an invalid state, please report.',\r\n },\r\n home: {\r\n id: 'home',\r\n defaultMessage: 'Home',\r\n },\r\n welcome: {\r\n id: 'home.welcome',\r\n defaultMessage: 'Welcome to {appName}',\r\n },\r\n showMore: {\r\n id: 'home.showMore',\r\n defaultMessage: 'Show more',\r\n },\r\n contentDialog: {\r\n id: 'home.dialog.content',\r\n defaultMessage: \"We're happy you're here! Now you can connect with your websites and create ads!\",\r\n },\r\n buttonDialog: {\r\n id: 'home.dialog.button',\r\n defaultMessage: 'Get started',\r\n },\r\n});\r\n","import { getTheme, IStackTokens, mergeStyleSets } from '@fluentui/react';\r\nimport { ICommonStyleProps } from '../../../../types';\r\nimport { noPointerEvents } from '../../../../utils/GlobalStyleUtils';\r\nimport { BreakPoints, IPubcenterTheme } from './../../../../../theme';\r\n\r\ntype StyleProperties = 'buttonStyle' | 'disabledLink' | 'homepageCards' | 'placeholder';\r\ntype ManagePageStyles = Record<StyleProperties, string>;\r\nconst { ResponsiveMedium, ResponsiveSmall } = BreakPoints;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): ManagePageStyles => {\r\n return mergeStyleSets({\r\n buttonStyle: {\r\n background: 'linear-gradient(88.27deg, #077BE6 -0.89%, #0A85E7 48.14%, #20AAE7 99.27%)',\r\n },\r\n disabledLink: {\r\n ...noPointerEvents,\r\n },\r\n homepageCards: {\r\n display: 'grid',\r\n gridTemplateColumns: '49.5% 49.5%',\r\n columnGap: '1%',\r\n rowGap: '2%',\r\n [ResponsiveMedium]: {\r\n gridTemplateColumns: '100%',\r\n columnGap: '0',\r\n },\r\n [ResponsiveSmall]: {\r\n gridTemplateColumns: '100%',\r\n columnGap: '0',\r\n },\r\n },\r\n placeholder: {\r\n height: '100%',\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): ManagePageStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n\r\nexport function getStackTokens(): IStackTokens {\r\n const theme = (getTheme() as unknown) as IPubcenterTheme;\r\n const spacing = theme.spacing;\r\n\r\n return { childrenGap: spacing.size12 };\r\n}\r\n","import { Stack } from '@fluentui/react';\r\nimport React, { useEffect } from 'react';\r\nimport { PublisherTier, getAppStore, onUserFirstTime } from '../../../../@data';\r\nimport { APP_NAME_NEW, TYTHON_DOMAIN_REDIRECTION_CACHE_KEY, WELCOME_SEND_FLAG } from '../../../../constants/AppConstants';\r\nimport { EmptyLayout } from '../../../../layout/EmptyLayout/EmptyLayout';\r\nimport { injectIntlWithObserver } from '../../../../utils';\r\nimport { sendWelcomeToPubcenterEmail } from '../../../partner-management/User/@data/actions';\r\nimport { triggerOneVetAPIs } from '../@data/actions';\r\nimport { setIsFRECardShown } from '../@data/mutatorActions';\r\nimport { getStore } from '../@data/store/store';\r\nimport { Announcements } from '../components/Announcements/Announcements';\r\nimport FAQSection from '../components/FAQSection/FAQSection';\r\nimport { FREContainer } from '../components/FRECards/FREContainer';\r\nimport { GettingStarted } from '../components/GettingStarted/GettingStarted';\r\nimport PerformanceSection from '../components/PerformanceSection/PerformanceSection';\r\nimport { RecommendationsSection } from '../components/RecommendationsSection/RecommendationsSection';\r\nimport ResourceSection from '../components/ResourcesSection/ResourcesSection';\r\nimport messages from './ManagePage.messages';\r\nimport { getStackTokens } from './ManagePage.styles';\r\n\r\nexport const ManagePage = injectIntlWithObserver(function ManagePageComponent(props) {\r\n const { formatMessage } = props.intl;\r\n const { isFirstTimeUser, publisher } = getAppStore();\r\n\r\n useEffect(() => {\r\n if (sessionStorage.getItem(WELCOME_SEND_FLAG) === 'true' && publisher && publisher.publisherTier === PublisherTier.SelfServe3rdParty) {\r\n sendWelcomeToPubcenterEmail();\r\n }\r\n }, [publisher]);\r\n\r\n useEffect(() => {\r\n triggerOneVetAPIs(isFirstTimeUser ? 'signup' : 'login');\r\n setIsFRECardShown(isFirstTimeUser || sessionStorage.getItem(TYTHON_DOMAIN_REDIRECTION_CACHE_KEY) === 'true');\r\n setTimeout(() => {\r\n sessionStorage.setItem(TYTHON_DOMAIN_REDIRECTION_CACHE_KEY, 'false');\r\n onUserFirstTime(false);\r\n }, 1000);\r\n }, [isFirstTimeUser]);\r\n\r\n return (\r\n <>\r\n {getStore().isFRECardShown && <FREContainer />}\r\n <EmptyLayout headingTitle={formatMessage(messages.welcome, { appName: APP_NAME_NEW })}>\r\n <Stack enableScopedSelectors tokens={getStackTokens()}>\r\n <GettingStarted />\r\n <PerformanceSection />\r\n <RecommendationsSection />\r\n <Announcements />\r\n <FAQSection />\r\n <ResourceSection />\r\n </Stack>\r\n </EmptyLayout>\r\n </>\r\n );\r\n});\r\n","import React, { useEffect } from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { Route, RouteComponentProps, Switch } from 'react-router-dom';\r\nimport { LayoutMode, onLayoutChanged } from '../../../@data';\r\nimport { RouteName } from '../@data';\r\nimport { fetchPublisherEvaluationStatusAction, onCurrentRouteChanged } from '../@data/actions';\r\nimport { ManagePage } from './Manage/ManagePage';\r\n\r\nexport const HomePage = injectIntl(function HomePageComponent(props: RouteComponentProps & InjectedIntlProps): JSX.Element {\r\n useEffect(() => {\r\n onLayoutChanged(LayoutMode.Default);\r\n onCurrentRouteChanged(RouteName.home, props.intl.formatMessage);\r\n fetchPublisherEvaluationStatusAction({ cache: false });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <Switch>\r\n <Route exact path={props.match.url} component={ManagePage} />\r\n </Switch>\r\n );\r\n});\r\n","import {\r\n classNamesFunction,\r\n ICalloutContentStyleProps,\r\n ICalloutContentStyles,\r\n IStyle,\r\n IStyleFunctionOrObject,\r\n ITheme,\r\n} from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../theme';\r\n\r\nexport interface IHoverStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\nexport interface IHoverStyles {\r\n hoverCard: IStyleFunctionOrObject<ICalloutContentStyleProps, ICalloutContentStyles>;\r\n footer: IStyle;\r\n primaryButton: IStyle;\r\n defaultButton: IStyle;\r\n}\r\n\r\nexport const getStyles = (props: IHoverStyleProps): IHoverStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { palette, spacing } = theme;\r\n\r\n return {\r\n hoverCard: {\r\n beakCurtain: {\r\n background: palette.themePrimary,\r\n },\r\n root: {\r\n color: palette.white,\r\n padding: spacing.size18,\r\n },\r\n },\r\n footer: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n marginTop: spacing.size12,\r\n },\r\n primaryButton: {\r\n backgroundColor: palette.white,\r\n color: palette.themePrimary,\r\n '&:hover': {\r\n backgroundColor: palette.themePrimary,\r\n color: palette.white,\r\n borderColor: palette.white,\r\n },\r\n '&:focus': {\r\n backgroundColor: palette.themePrimary,\r\n color: palette.white,\r\n borderColor: palette.white,\r\n },\r\n },\r\n defaultButton: {\r\n backgroundColor: palette.themePrimary,\r\n color: palette.white,\r\n borderColor: palette.white,\r\n marginRight: spacing.size8,\r\n '&:hover': {\r\n backgroundColor: palette.white,\r\n color: palette.themePrimary,\r\n },\r\n '&:focus': {\r\n backgroundColor: palette.white,\r\n color: palette.themePrimary,\r\n },\r\n },\r\n };\r\n};\r\n\r\nexport const getClassNames = classNamesFunction<IHoverStyleProps, IHoverStyles>();\r\n","import { Callout, DefaultButton, PrimaryButton, getTheme } from '@fluentui/react';\r\nimport React, { useState } from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport AppMessages from '../../App.messages';\r\nimport { getClassNames, getStyles } from './styles';\r\n\r\nexport interface ITutorialCalloutProps {\r\n steps: ITutorialCalloutSteps[];\r\n isOpen: boolean;\r\n onChangeState: () => void;\r\n}\r\n\r\nexport interface ITutorialCalloutSteps {\r\n containerId: string;\r\n isContentReady: boolean;\r\n content: JSX.Element;\r\n contentWidth?: number;\r\n backgroundColor?: string;\r\n}\r\n\r\nconst TutorialCallout = injectIntl((props: ITutorialCalloutProps & InjectedIntlProps) => {\r\n const [tutorialStep, setTutorialStep] = useState(0);\r\n const {\r\n isOpen,\r\n onChangeState,\r\n steps,\r\n intl: { formatMessage },\r\n } = props;\r\n const { containerId, content, contentWidth, backgroundColor } = steps[tutorialStep];\r\n const { footer, primaryButton, defaultButton } = getClassNames(getStyles, { theme: getTheme() });\r\n\r\n if (!isOpen) {\r\n return <></>;\r\n }\r\n\r\n const onUpdateTutorialStep = (step: number) => {\r\n if (steps[step].isContentReady === true) {\r\n setTutorialStep(step);\r\n }\r\n };\r\n\r\n const onDismissTutorialCallout = () => {\r\n onChangeState();\r\n setTutorialStep(0);\r\n };\r\n\r\n return (\r\n <Callout\r\n role=\"dialog\"\r\n gapSpace={0}\r\n backgroundColor={backgroundColor ?? '#0078D4'}\r\n calloutWidth={contentWidth ?? 400}\r\n target={`#${containerId}`}\r\n shouldDismissOnWindowFocus={true}\r\n onDismiss={() => onDismissTutorialCallout()}\r\n setInitialFocus\r\n styles={getStyles({ theme: getTheme() }).hoverCard}\r\n >\r\n {content}\r\n {steps.length > 1 && (\r\n <div className={footer}>\r\n <span>\r\n {tutorialStep + 1} {formatMessage(AppMessages.of)} {steps.length}\r\n </span>\r\n <div>\r\n {tutorialStep > 0 && (\r\n <DefaultButton className={defaultButton} onClick={() => onUpdateTutorialStep(tutorialStep - 1)}>\r\n {formatMessage(AppMessages.previous)}\r\n </DefaultButton>\r\n )}\r\n {tutorialStep === steps.length - 1 && (\r\n <PrimaryButton className={primaryButton} onClick={() => onDismissTutorialCallout()}>\r\n {formatMessage(AppMessages.finish)}\r\n </PrimaryButton>\r\n )}\r\n </div>\r\n {tutorialStep < steps.length - 1 && (\r\n <PrimaryButton className={primaryButton} onClick={() => onUpdateTutorialStep(tutorialStep + 1)}>\r\n {formatMessage(AppMessages.next)}\r\n </PrimaryButton>\r\n )}\r\n </div>\r\n )}\r\n </Callout>\r\n );\r\n});\r\n\r\nexport default TutorialCallout;\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n statusCmdBtnAriaLabel: {\r\n id: 'gridPage.clarityStatusCmdBtnAriaLabel',\r\n defaultMessage: 'Click to display clarity status',\r\n },\r\n update: {\r\n id: 'property.update',\r\n defaultMessage: 'Update property',\r\n },\r\n sidePanelLabel: {\r\n id: 'property.sidePanelLabel',\r\n defaultMessage: 'Clarity',\r\n },\r\n sidePanelDescription: {\r\n id: 'property.sidePanelDescription',\r\n defaultMessage: 'To connect the Clarity project associated with property ID {id}, turn on the toggle to enable Clarity.',\r\n },\r\n sidePanelTC: {\r\n id: 'property.sidePanelTC',\r\n defaultMessage:\r\n 'Microsoft Clarity is a free behavioral analysis tool that provides insights into how customers interact with your website. By enabling Clarity tracking, you agree to the Clarity terms of use and privacy policy. Clarity should not be used on sites that contain sensitive data, including information related to government, customer health care, or customer financial services.',\r\n },\r\n sidePanelUpdateProperty: {\r\n id: 'property.sidePanelUpdateProperty',\r\n defaultMessage: 'Update property',\r\n },\r\n});\r\n","import { DefaultButton, getTheme, IconButton, Panel, PanelType, PrimaryButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport AppMessages from '../../../../../../App.messages';\r\nimport { FormState } from '../../../../../../components/Form';\r\nimport { injectIntlAndObserver } from '../../../../../../utils';\r\nimport { getCreatePropertyStore } from '../../../Create/__data__/store/store';\r\nimport ClaritySection from '../../../Create/variations/CreateNonTythonProperty/components/ClarityFormSection';\r\nimport { setClarityPanelVisibility } from '../../__data__/mutatorActions';\r\nimport { onClarityUpdate } from '../../__data__/orchestrators/updateClarity';\r\nimport { getGridPropertyStore } from '../../__data__/store/store';\r\nimport messages from './messages';\r\nimport { getStyles } from './styles';\r\n\r\nconst ClarityPanel = injectIntlAndObserver<InjectedIntlProps>(\r\n ({ intl }): JSX.Element => {\r\n const {\r\n active: { clarity },\r\n } = getCreatePropertyStore();\r\n const { isPanelOpen, selectedPropertyId } = getGridPropertyStore();\r\n const { originalClarityId, clarityId } = clarity || {};\r\n const { panelButton, panelDescriptor, panelAgreement } = getStyles({ theme: getTheme() });\r\n const { formatMessage } = intl;\r\n\r\n const isDisabled = (originalClarityId?.length === 0 && clarityId?.length === 0) || originalClarityId === clarityId;\r\n\r\n return (\r\n <Panel\r\n isOpen={isPanelOpen}\r\n type={PanelType.medium}\r\n onDismiss={() => setClarityPanelVisibility(false)}\r\n headerText={formatMessage(messages.sidePanelLabel)}\r\n closeButtonAriaLabel={formatMessage(AppMessages.panelCloseButtonAriaDesc)}\r\n isFooterAtBottom={true}\r\n onRenderFooterContent={() => {\r\n return (\r\n <div className={panelButton}>\r\n <PrimaryButton\r\n onClick={onClarityUpdate}\r\n text={formatMessage(messages.update)}\r\n ariaDescription={formatMessage(messages.update)}\r\n disabled={isDisabled}\r\n />\r\n <DefaultButton onClick={() => setClarityPanelVisibility(false)} text={formatMessage(AppMessages.cancel)} />\r\n </div>\r\n );\r\n }}\r\n >\r\n <div className={panelDescriptor}>{formatMessage(messages.sidePanelDescription, { id: selectedPropertyId })}</div>\r\n\r\n <ClaritySection mode={FormState.Edit} clarityConfigs={clarity} isShownInPanel={true} />\r\n\r\n <div className={panelAgreement}>\r\n <IconButton iconProps={{ iconName: 'Info' }} />\r\n <div>{formatMessage(messages.sidePanelTC)}</div>\r\n </div>\r\n </Panel>\r\n );\r\n }\r\n);\r\n\r\nexport default ClarityPanel;\r\n","import { mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterSpacing } from '../../../../../../../theme';\r\nimport { IClarityPanelStyle, IClarityPanelStyleProps } from './types';\r\n\r\nexport const getStyles = (props: IClarityPanelStyleProps): IClarityPanelStyle => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return mergeStyleSets({\r\n panelButton: {\r\n display: 'flex',\r\n gap: spacing.size8,\r\n },\r\n panelAgreement: {\r\n width: 'inherit',\r\n display: 'flex',\r\n alignItems: 'center',\r\n backgroundColor: theme.palette.themeLighterAlt,\r\n fontSize: theme.fonts.small.fontSize,\r\n padding: `${spacing.size12} ${spacing.size6}`,\r\n marginTop: spacing.size12,\r\n },\r\n panelDescriptor: {\r\n marginTop: spacing.size12,\r\n fontSize: theme.fonts.small.fontSize,\r\n },\r\n panelPendingResendButton: {\r\n textDecoration: 'underline',\r\n color: theme.palette.blue,\r\n cursor: 'Pointer',\r\n paddingRight: spacing.size2,\r\n paddingLeft: spacing.size2,\r\n },\r\n });\r\n};\r\n","import { Panel, PanelType } from '@fluentui/react';\r\nimport React from 'react';\r\nimport AppMessages from '../../../../../../App.messages';\r\nimport { IRouterWithIntl, injectIntlAndObserver } from '../../../../../../utils';\r\nimport { PropertyScriptPage } from '../../../Create/variations/CreateTythonProperty/components/ScriptPage';\r\nimport { setCodePanelVisibility } from '../../__data__/mutatorActions';\r\nimport { getGridPropertyStore } from '../../__data__/store/store';\r\n\r\nexport interface ICodePanelProps extends IRouterWithIntl {}\r\n\r\nexport const CodePanel = injectIntlAndObserver(function CodePanelComponent(props: ICodePanelProps) {\r\n const { isCodePanelOpen, selectedPropertyId, clarityPanel } = getGridPropertyStore();\r\n\r\n return (\r\n <Panel\r\n isOpen={isCodePanelOpen}\r\n type={PanelType.custom}\r\n customWidth={'900px'}\r\n onDismiss={() => {\r\n setCodePanelVisibility(false);\r\n }}\r\n isLightDismiss\r\n closeButtonAriaLabel={props.intl.formatMessage(AppMessages.close)}\r\n >\r\n <PropertyScriptPage {...props} isShownInPanel={true} siteId={selectedPropertyId} clarityStatus={clarityPanel?.clarityStatus} />\r\n </Panel>\r\n );\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n create: {\r\n id: 'property.create',\r\n defaultMessage: 'Create Property',\r\n },\r\n siteCreate: {\r\n id: 'property.create',\r\n defaultMessage: 'Create Site',\r\n },\r\n update: {\r\n id: 'property.update',\r\n defaultMessage: 'Update property',\r\n },\r\n notFound: {\r\n id: 'property.notFound',\r\n defaultMessage: 'No properties found for this account, create one.',\r\n },\r\n siteNotFound: {\r\n id: 'property.notFound',\r\n defaultMessage: 'No sites found for this account, create one.',\r\n },\r\n noPublisherSelected: {\r\n id: 'property.noPublisherSelected',\r\n defaultMessage: 'A publisher isn’t selected yet. To start managing properties, search for a publisher..',\r\n },\r\n deactivateTitle: {\r\n id: 'property.deactivateTitle',\r\n defaultMessage: 'Do you want to deactivate property(s)?',\r\n },\r\n deactivateSiteTitle: {\r\n id: 'property.deactivateTitle',\r\n defaultMessage: 'Do you want to deactivate site(s)?',\r\n },\r\n name: {\r\n id: 'property.name',\r\n defaultMessage: 'Property name',\r\n },\r\n siteName: {\r\n id: 'property.name',\r\n defaultMessage: 'Site Name',\r\n },\r\n id: {\r\n id: 'property.id',\r\n defaultMessage: 'Property ID',\r\n },\r\n siteId: {\r\n id: 'property.id',\r\n defaultMessage: 'Site ID',\r\n },\r\n url: {\r\n id: 'property.url',\r\n defaultMessage: 'Website URL',\r\n },\r\n approvalStatus: {\r\n id: 'property.approvalStatus',\r\n defaultMessage: 'Approval status',\r\n },\r\n issues: {\r\n id: 'property.issues',\r\n defaultMessage: 'Issues',\r\n },\r\n properties: {\r\n id: 'property.properties',\r\n defaultMessage: 'Properties',\r\n },\r\n sites: {\r\n id: 'property.sites',\r\n defaultMessage: 'Sites',\r\n },\r\n sitesCannotServeMessage: {\r\n id: 'property.sitesCannotServeMessage',\r\n defaultMessage: 'Sites cannot serve ads until your profile is submitted and approved {learn}',\r\n },\r\n clarityStatus: {\r\n id: 'property.clarityStatus',\r\n defaultMessage: 'Clarity status',\r\n },\r\n clarityPending: {\r\n id: 'property.clarityPending',\r\n defaultMessage: 'Pending',\r\n },\r\n clarityPendingApproval: {\r\n id: 'property.clarityPendingApproval',\r\n defaultMessage: 'Pending Approval',\r\n },\r\n clarityRejected: {\r\n id: 'property.clarityRejected',\r\n defaultMessage: 'Rejected',\r\n },\r\n clarityNotConnected: {\r\n id: 'property.clarityNotConnected',\r\n defaultMessage: 'Not Connected',\r\n },\r\n clarityApproved: {\r\n id: 'property.clarityApproved',\r\n defaultMessage: 'Approved',\r\n },\r\n clarityExpired: {\r\n id: 'property.clarityExpired',\r\n defaultMessage: 'Expired',\r\n },\r\n clarityCancelled: {\r\n id: 'property.clarityCancelled',\r\n defaultMessage: 'Cancelled',\r\n },\r\n clarityNotFound: {\r\n id: 'property.clarityNotFound',\r\n defaultMessage: 'Not Found',\r\n },\r\n clarityLinkStatusCalloutTitle: {\r\n id: 'property.clarityLinkStatusCalloutTitle',\r\n defaultMessage: 'Microsoft Clarity Project',\r\n },\r\n clarityLinkStatusCalloutProjectStatus: {\r\n id: 'property.clarityLinkStatusCalloutTitle',\r\n defaultMessage: '{id}: Link request {status}',\r\n },\r\n clarityLinkPendingStatus: {\r\n id: 'property.clarityLinkPendingStatus',\r\n defaultMessage: 'Pending Approval',\r\n },\r\n clarityLinkRejectedStatus: {\r\n id: 'property.clarityLinkRejectedStatus',\r\n defaultMessage: ' Request rejected',\r\n },\r\n clarityLinkCancelledStatus: {\r\n id: 'property.clarityLinkCancelledStatus',\r\n defaultMessage: 'Cancelled',\r\n },\r\n clarityLinkExpiredStatus: {\r\n id: 'property.clarityLinkExpiredStatus',\r\n defaultMessage: 'Request expired',\r\n },\r\n clarityLinkPendingStatusCalloutDescription: {\r\n id: 'property.clarityLinkPendingStatusCalloutDescription',\r\n defaultMessage: 'Request to link your Clarity project pending on Clarity Admin.',\r\n },\r\n clarityLinkRejectStatusCalloutDescription: {\r\n id: 'property.clarityLinkRejectStatusCalloutDescription',\r\n defaultMessage: 'Request to connect Clarity project was rejected',\r\n },\r\n clarityLinkCancelledStatusCalloutDescription: {\r\n id: 'property.clarityLinkCancelledStatusCalloutDescription',\r\n defaultMessage: 'Linked Clarity project does not exist.',\r\n },\r\n clarityLinkExpiredStatusCalloutDescription: {\r\n id: 'property.clarityLinkExpiredStatusCalloutDescription',\r\n defaultMessage: ' Request to link your Clarity project expired.',\r\n },\r\n clarityLinkNotConnectedStatusCalloutDescription: {\r\n id: 'property.clarityLinkNotConnectedStatusCalloutDescription',\r\n defaultMessage: 'Request to link your Clarity project. Click below send the link request.',\r\n },\r\n clarityLinkNotFoundStatusCalloutDescription: {\r\n id: 'property.clarityLinkNotFoundStatusCalloutDescription',\r\n defaultMessage: 'Clarity hasn’t been added to this site. Clarity can be added from site edit screen.',\r\n },\r\n clarityLinkStatusCalloutResendAction: {\r\n id: 'property.clarityLinkStatusCalloutResendAction',\r\n defaultMessage: 'Resend link request',\r\n },\r\n clarityLinkStatusRejected: {\r\n id: 'property.clarityLinkStatusRejected',\r\n defaultMessage: 'Link request rejected',\r\n },\r\n clarityLinkStatusPendingApproval: {\r\n id: 'property.clarityLinkStatusPendingApproval',\r\n defaultMessage: 'Pending Approval',\r\n },\r\n clarityProject: {\r\n id: 'property.clarityProject',\r\n defaultMessage: 'Clarity project ID',\r\n },\r\n clarityProjectInfo: {\r\n id: 'property.clarityProjectInfo',\r\n defaultMessage: 'This column shows your bundled Clarity ID.',\r\n },\r\n servingStatus: {\r\n id: 'property.servingStatus',\r\n defaultMessage: 'Serving status',\r\n },\r\n status: {\r\n id: 'property.status',\r\n defaultMessage: 'Status',\r\n },\r\n actions: {\r\n id: 'property.actions',\r\n defaultMessage: 'Actions',\r\n },\r\n zeroResultTitleNonTython: {\r\n id: 'property.titleNonTython',\r\n defaultMessage: 'No properties yet',\r\n },\r\n zeroResultTitle: {\r\n id: 'property.title',\r\n defaultMessage: 'No sites yet',\r\n },\r\n zeroResultDescription: {\r\n id: 'property.description',\r\n defaultMessage: 'You haven’t created any site yet',\r\n },\r\n zeroResultDescriptionNonTython: {\r\n id: 'property.descriptionNonTython',\r\n defaultMessage: 'You haven’t created any property yet',\r\n },\r\n zeroResultcallToAction: {\r\n id: 'property.callToAction',\r\n defaultMessage: 'Create site',\r\n },\r\n clarityTour: {\r\n id: 'property.clarityTour',\r\n defaultMessage: 'Clarity Tour',\r\n },\r\n clarityTourSecondPageHeader: {\r\n id: 'property.clarityTourSecondPageHeader',\r\n defaultMessage: 'Jump to Clarity with one click',\r\n },\r\n clarityTourSecondPageDesc: {\r\n id: 'property.clarityTourSecondPageDesc',\r\n defaultMessage: 'When you want to check the site performance in Clarity, clicking on the Clarity project id from here.',\r\n },\r\n statusTourFirstPageHeader: {\r\n id: 'property.statusTourFirstPageHeader',\r\n defaultMessage: 'Site Status',\r\n },\r\n statusTourFirstPageDesc: {\r\n id: 'property.statusTourFirstPageDesc',\r\n defaultMessage:\r\n 'This column will show each sites serving status. If you view one of these sites in another context, you can hover or click on the tag to get more information.',\r\n },\r\n statusTourSecondPageHeader: {\r\n id: 'property.statusTourSecondPageHeader',\r\n defaultMessage: 'Issues',\r\n },\r\n statusTourSecondPageDesc: {\r\n id: 'property.statusTourSecondPageDesc',\r\n defaultMessage:\r\n 'Any issues with your sites will appear here. Blocking issues are shown with a red dot while non-blocking issues are shown with an orange dot.',\r\n },\r\n clarityBenefits: {\r\n id: 'property.clarityBenefits',\r\n defaultMessage: 'What more can you do in Clarity:',\r\n },\r\n clarityFirstBenefit: {\r\n id: 'property.clarityFirstBenefit',\r\n defaultMessage: 'Clarity masks all sensitive content on your site by default. Review your settings',\r\n },\r\n claritySecondBenefit: {\r\n id: 'property.claritySecondBenefit',\r\n defaultMessage: 'Check our all Clarity features with our',\r\n },\r\n claritySecondBenefitRedirection: {\r\n id: 'property.claritySecondBenefitRedirection',\r\n defaultMessage: ' live demo',\r\n },\r\n clarityThirdBenefit: {\r\n id: 'property.clarityThirdBenefit',\r\n defaultMessage: 'Add site and',\r\n },\r\n clarityThirdBenefitRedirection: {\r\n id: 'property.clarityThirdBenefitRedirection',\r\n defaultMessage: 'privacy disclosures',\r\n },\r\n siteServingAds: {\r\n id: 'property.siteServingAds',\r\n defaultMessage: 'Site is currently serving ads',\r\n },\r\n siteServingAdsWithoutAdsTxt: {\r\n id: 'property.siteServingAdsWithoutAdsTxt',\r\n defaultMessage: 'Site performance could be enhanced by adding Ads.txt. {more}',\r\n },\r\n siteServingAdsWithoutScript: {\r\n id: 'property.siteServingAdsWithoutScript',\r\n defaultMessage: 'Site is ready to show ads. Please add {snippet} in your webpage',\r\n },\r\n sitePendingWithApprovedProfile: {\r\n id: 'property.sitePendingWithApprovedProfile',\r\n defaultMessage:\r\n 'Your site is being reviewed. The review takes seven business days, and you will be notified by email once the review is approved.',\r\n },\r\n sitePendingWithoutApprovedProfile: {\r\n id: 'property.sitePendingWithoutApprovedProfile',\r\n defaultMessage: 'Your site review is pending. We will review your site after your profile is approved',\r\n },\r\n siteRejected: {\r\n id: 'property.siteRejected',\r\n defaultMessage:\r\n 'This site has been rejected. Please make sure that it follows {guidelines}. If you update your site and would like it to be reviewed again, please delete this site and add it to {appName} again as a new site.',\r\n },\r\n siteNotServingIssuesHeader: {\r\n id: 'property.siteNotServingIssuesHeader',\r\n defaultMessage: 'Issues with this site:',\r\n },\r\n siteNotServingPubCenterScriptInActive: {\r\n id: 'property.siteNotServingPubCenterScriptInActive',\r\n defaultMessage: 'Script not found',\r\n },\r\n siteNotServingSiteIsRejected: {\r\n id: 'property.siteNotServingSiteIsRejected',\r\n defaultMessage: 'Site is rejected',\r\n },\r\n siteNotServingWithoutAdsTxt: {\r\n id: 'property.siteNotServingWithoutAdsTxt',\r\n defaultMessage: 'Ads.txt is not found',\r\n },\r\n codeSnippet: {\r\n id: 'property.codeSnippet',\r\n defaultMessage: 'code snippet',\r\n },\r\n siteApprovalGuideLines: {\r\n id: 'property.siteApprovalGuideLines',\r\n defaultMessage: 'site approval guidelines',\r\n },\r\n approvalStatusPendingInfo: {\r\n id: 'property.approvalStatusPendingInfo',\r\n defaultMessage: 'Pending: Your site is awaiting verification to be approved.',\r\n },\r\n approvalStatusApprovalInfo: {\r\n id: 'property.approvalStatusApprovalInfo',\r\n defaultMessage: 'Approved: Your site is ready to show ads.',\r\n },\r\n approvalStatusRejectedInfo: {\r\n id: 'property.approvalStatusRejectedInfo',\r\n defaultMessage: 'Rejected: Your site is reviewed and not approved.',\r\n },\r\n approvalStatusInfoHelp: {\r\n id: 'property.approvalStatusInfoHelp',\r\n defaultMessage: 'If you need more help, please visit {guidelines} or {support}.',\r\n },\r\n approvalStatusInfoGuideLines: {\r\n id: 'property.approvalStatusInfoGuideLines',\r\n defaultMessage: 'site approval guidelines',\r\n },\r\n approvalStatusInfoSupport: {\r\n id: 'property.approvalStatusInfoSupport',\r\n defaultMessage: 'contact support',\r\n },\r\n deletePropertyPopupTitle: {\r\n id: 'property.deletePopupApproval',\r\n defaultMessage: 'Are you sure you want to delete this site?',\r\n },\r\n deletePropertyPopupDescription: {\r\n id: 'property.deletePopupDescription',\r\n defaultMessage: 'By deleting this site, you’ll unlink the ad units associated with it',\r\n },\r\n});\r\n","import { classNamesFunction, FontWeights, IStyle, ITheme } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../../../theme';\r\n\r\nexport interface IManagePageStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\nexport interface IManagePageStyles {\r\n redirectionLink: IStyle;\r\n hoverCardTitle: IStyle;\r\n hoverCardInfo: IStyle;\r\n clarityCalloutTitle: IStyle;\r\n clarityStatusUnderline: IStyle;\r\n clarityCalloutFooter: IStyle;\r\n errorMsg: IStyle;\r\n errorMsgContent: IStyle;\r\n errorBulletPoint: IStyle;\r\n warningBulletPoint: IStyle;\r\n propertyIssuesUnorderedList: IStyle;\r\n}\r\n\r\nexport const getStyles = (props: IManagePageStyleProps): IManagePageStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { fonts, spacing, palette } = theme;\r\n\r\n return {\r\n redirectionLink: {\r\n color: palette.white,\r\n cursor: 'pointer',\r\n textDecorationLine: 'underline',\r\n '&:hover': {\r\n color: palette.white,\r\n },\r\n '&:active': {\r\n color: palette.white,\r\n },\r\n '&:focus': {\r\n color: palette.white,\r\n },\r\n },\r\n hoverCardTitle: {\r\n fontSize: fonts.size16.fontSize,\r\n fontWeight: fonts.size14Medium.fontWeight,\r\n marginBottom: spacing.size10,\r\n },\r\n hoverCardInfo: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n lineHeight: fonts.size14Medium.lineHeight,\r\n },\r\n clarityCalloutTitle: {\r\n ...fonts.size20,\r\n },\r\n clarityCalloutFooter: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n },\r\n clarityStatusUnderline: {\r\n borderBottom: `1px dotted ${palette.themePrimary}`,\r\n width: 'fit-content',\r\n boxSizing: 'border-box',\r\n },\r\n errorMsg: {\r\n border: `1px solid ${palette.paleChestnut}`,\r\n borderRadius: spacing.size4,\r\n marginBottom: spacing.size10,\r\n i: {\r\n display: 'flex',\r\n alignSelf: 'center',\r\n },\r\n },\r\n errorMsgContent: {\r\n fontSize: fonts.size14.fontSize,\r\n fontWeight: FontWeights.semibold,\r\n },\r\n errorBulletPoint: {\r\n '&::marker': {\r\n color: palette.redDark,\r\n },\r\n },\r\n warningBulletPoint: {\r\n ' &::marker': {\r\n color: palette.orangeLighter,\r\n },\r\n },\r\n propertyIssuesUnorderedList: {\r\n margin: 0,\r\n },\r\n };\r\n};\r\n\r\nexport const getClassNames = classNamesFunction<IManagePageStyleProps, IManagePageStyles>();\r\n","import { Link, getTheme } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { FormattedMessage, MessageValue } from 'react-intl';\r\nimport { PropertyServingConfigs } from '../../../../../@data/store/schema/models/ServingConfigs';\r\nimport { CLARITY_DEMO, CLARITY_PRIVACY_DISCLOSURE } from '../../../../../constants/AppConstants';\r\nimport { ITutorialCalloutSteps } from '../../../../../layout/TutorialCallout';\r\nimport messages from '../messages';\r\nimport { getClassNames, getStyles } from '../styles';\r\n\r\nexport const getClarityTutorialSteps = (\r\n formatMessage: (messageDescriptor: FormattedMessage.MessageDescriptor, values?: { [key: string]: MessageValue }) => string,\r\n configs?: PropertyServingConfigs[]\r\n): ITutorialCalloutSteps[] => {\r\n const styles = getClassNames(getStyles, { theme: getTheme() });\r\n\r\n return [\r\n {\r\n containerId: 'clarityTourIcon',\r\n content: (\r\n <div className={styles.hoverCardInfo}>\r\n <span className={styles.hoverCardTitle}>{formatMessage(messages.clarityTour)}</span>\r\n <span>{formatMessage(messages.clarityBenefits)}</span>\r\n <ol>\r\n <li>{formatMessage(messages.clarityFirstBenefit)}</li>\r\n <li>\r\n {formatMessage(messages.claritySecondBenefit)}{' '}\r\n <Link href={CLARITY_DEMO} target=\"_blank\" rel=\"noreferrer noopener\" className={styles.redirectionLink}>\r\n {formatMessage(messages.claritySecondBenefitRedirection)}\r\n </Link>\r\n </li>\r\n <li>\r\n {formatMessage(messages.clarityThirdBenefit)}{' '}\r\n <Link href={CLARITY_PRIVACY_DISCLOSURE} target=\"_blank\" rel=\"noreferrer noopener\" className={styles.redirectionLink}>\r\n {formatMessage(messages.clarityThirdBenefitRedirection)}\r\n </Link>\r\n </li>\r\n </ol>\r\n </div>\r\n ),\r\n isContentReady: true,\r\n },\r\n {\r\n containerId: 'clarityProjectId',\r\n content: (\r\n <div className={styles.hoverCardInfo}>\r\n <span className={styles.hoverCardTitle}>{formatMessage(messages.clarityTourSecondPageHeader)}</span>\r\n <span>{formatMessage(messages.clarityTourSecondPageDesc)}</span>\r\n </div>\r\n ),\r\n isContentReady: (configs && configs?.length > 0 && configs.some((config) => config.clarityConfig?.clarityId !== undefined)) || false,\r\n },\r\n ];\r\n};\r\n","import { Model } from '../../../../../../../@data';\r\nimport { ClarityStatus } from '../../../../../../../@data/store/schema/enums/ClarityStatus';\r\nimport { isTythonSelfServeUser } from '../../../../../../../@data/utils/checkUserType';\r\nimport { CommandBarActions, Direction, GridSelectionMode, IGridPageCommandBarItemProps } from '../../../../../../../layout/GridPageV2';\r\nimport { onClarityChanged } from '../../../../Create/__data__/mutatorActions';\r\nimport { setClarityPanelVisibility, setSelectedPropertyId } from '../../../__data__/mutatorActions';\r\nimport messages from '../messages';\r\nimport { IClarityParams } from '../types';\r\n\r\nexport const getClarityCommandBarItems = (selectedItems: () => Model[], formatMessage): IGridPageCommandBarItemProps[] => {\r\n if (isTythonSelfServeUser()) {\r\n return [];\r\n }\r\n\r\n const clarityItem = {\r\n key: CommandBarActions.clarity,\r\n name: formatMessage(messages.sidePanelLabel),\r\n iconProps: {\r\n iconName: 'AddLink',\r\n },\r\n ariaLabel: formatMessage(messages.statusCmdBtnAriaLabel),\r\n placement: { direction: Direction.after },\r\n onClick: () => {\r\n const selectedItem = selectedItems();\r\n /* tslint:disable:no-string-literal */\r\n if (selectedItem && selectedItem[0]['id']) {\r\n const status: ClarityStatus = ClarityStatus[selectedItem[0]['clarityStatus']];\r\n const clarityId: string = selectedItem[0]['clarityProjectId'];\r\n\r\n const clarityPanelDisplayParams: IClarityParams = {\r\n clarityLinkingEnabled: status === ClarityStatus.NotConnected ? false : true,\r\n clarityStatus: status || ClarityStatus.Approved,\r\n clarityId: clarityId ? clarityId : '',\r\n originalClarityId: clarityId ? clarityId : '',\r\n clarityEdit: status === ClarityStatus.Approved || status === undefined ? false : true,\r\n };\r\n setSelectedPropertyId(selectedItem[0]['id'].toString());\r\n onClarityChanged(clarityPanelDisplayParams);\r\n setClarityPanelVisibility(true);\r\n }\r\n },\r\n selectionModes: [GridSelectionMode.Single],\r\n // disabled: !hasCreateAccess(params.accessPermission),\r\n };\r\n\r\n return [clarityItem];\r\n};\r\n","import { isTythonSelfServeUser } from '../../../../../@data';\r\nimport { FilterType } from '../../../../../components/GridFilter/GridFilter.types';\r\nimport { IFilterItem } from '../../../../../layout/GridPageV2';\r\nimport messages from '../messages';\r\n\r\nexport const getFilterItems = (formatMessage): IFilterItem[] => {\r\n const tythonFilters: IFilterItem[] = [\r\n { columnName: 'id', filterName: formatMessage(messages.siteId), filterType: FilterType.relational },\r\n { columnName: 'name', filterName: formatMessage(messages.siteName), filterType: FilterType.string },\r\n { columnName: 'url', filterName: formatMessage(messages.url), filterType: FilterType.string },\r\n // {\r\n // columnName: 'status',\r\n // filterName: formatMessage(AppMessages.status),\r\n // filterType: FilterType.custom,\r\n // filterOptions: [\r\n // { key: 'Active', text: formatMessage(AppMessages.statusActive) },\r\n // { key: 'Inactive', text: formatMessage(AppMessages.statusInactive) },\r\n // ] as IDropdownOption[],\r\n // },\r\n ];\r\n\r\n const nonTythonFilters: IFilterItem[] = [];\r\n\r\n return isTythonSelfServeUser() ? tythonFilters : nonTythonFilters;\r\n};\r\n","import { Model, isTythonSelfServeUser } from '../../../../../@data';\r\nimport { CommandBarActions, IBuildCommandBarProps } from '../../../../../layout/GridPageV2';\r\nimport { getTythonSiteCreatePageRoute } from '../../../../../utils/routeUtils';\r\nimport { setPropertiesFetching } from '../__data__/mutatorActions';\r\nimport { getGridPropertyStore } from '../__data__/store/store';\r\nimport { getClarityCommandBarItems } from '../components/ClarityPanel/utils/getCommandBarItems';\r\nimport messages from '../messages';\r\nimport { getFilterItems } from './getFilterItems';\r\n\r\nexport function getCommandBarItems(formatMessage): IBuildCommandBarProps<Model> | undefined {\r\n const { data, isLoading } = getGridPropertyStore();\r\n\r\n const onUpdatePropertyEnd = () => setPropertiesFetching(false);\r\n const nonTythonItems: IBuildCommandBarProps<Model> | undefined =\r\n (data && data.length !== 0) || isLoading\r\n ? {\r\n primaryButtonLabel: messages.create,\r\n includeActions: [CommandBarActions.new],\r\n includeFarActions: [\r\n CommandBarActions.searchBox,\r\n CommandBarActions.edit,\r\n CommandBarActions.activate,\r\n CommandBarActions.deactivate,\r\n CommandBarActions.delete,\r\n CommandBarActions.download,\r\n CommandBarActions.modifyColumns,\r\n CommandBarActions.clarity,\r\n ],\r\n getCustomCommandBarItems: (getSelectedItems) => getClarityCommandBarItems(getSelectedItems, formatMessage),\r\n filterItems: getFilterItems(formatMessage),\r\n }\r\n : undefined;\r\n\r\n const tythonItems: IBuildCommandBarProps<Model> | undefined =\r\n (data && data.length !== 0) || isLoading\r\n ? {\r\n primaryButtonLabel: messages.siteCreate,\r\n primaryButtonUrl: getTythonSiteCreatePageRoute(),\r\n includeActions: [CommandBarActions.new],\r\n includeFarActions: [\r\n CommandBarActions.searchBox,\r\n CommandBarActions.addFilter,\r\n CommandBarActions.edit,\r\n // CommandBarActions.activate,\r\n // CommandBarActions.deactivate,\r\n CommandBarActions.delete,\r\n CommandBarActions.download,\r\n CommandBarActions.modifyColumns,\r\n ],\r\n onDeactivateDialogDismiss: onUpdatePropertyEnd,\r\n filterItems: getFilterItems(formatMessage),\r\n deleteLabels: {\r\n title: messages.deletePropertyPopupTitle,\r\n description: messages.deletePropertyPopupDescription,\r\n },\r\n }\r\n : undefined;\r\n\r\n return isTythonSelfServeUser() ? tythonItems : nonTythonItems;\r\n}\r\n","import { Link } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { FormattedMessage, MessageValue } from 'react-intl';\r\nimport { AdsTxtStatus, Property } from '../../../../../@data';\r\nimport AppMessages from '../../../../../App.messages';\r\nimport { ADS_DOT_TEXT_HELP_URL, APP_NAME_NEW, CONNECT_SITE_HELP_URL } from '../../../../../constants/AppConstants';\r\nimport { setCodePanelVisibility } from '../__data__/mutatorActions';\r\nimport messages from '../messages';\r\n\r\ntype Statuses = {\r\n [key: string]: Status;\r\n};\r\n\r\ntype Status = {\r\n defaultMessage: JSX.Element | string | null;\r\n issues: Issues;\r\n};\r\n\r\ntype Issues = Array<{ type: string; isActive: boolean; message: JSX.Element | string }>;\r\n\r\nexport const getServingStatusCalloutContent = (\r\n formatMessage: (messageDescriptor: FormattedMessage.MessageDescriptor, values?: { [key: string]: MessageValue }) => string,\r\n isPublisherRejected: boolean,\r\n item: Property\r\n): JSX.Element | null => {\r\n if (item === undefined || item.servingConfig === undefined) {\r\n return null;\r\n }\r\n\r\n const { servingStatus, scriptStatus, adsDotTxtStatus } = item.servingConfig;\r\n\r\n const toolTipContent: Statuses = {\r\n Serving: {\r\n defaultMessage: formatMessage(messages.siteServingAds),\r\n issues: [\r\n {\r\n type: 'noAdsTxt',\r\n isActive: (adsDotTxtStatus && AdsTxtStatus[adsDotTxtStatus.toString()] === AdsTxtStatus.NotFound) || false,\r\n message: (\r\n <FormattedMessage\r\n {...messages.siteServingAds}\r\n values={{\r\n more: (\r\n <Link href={ADS_DOT_TEXT_HELP_URL} target=\"_blank\" rel=\"noreferrer noopener\">\r\n {formatMessage(AppMessages.readMore)}\r\n </Link>\r\n ),\r\n }}\r\n />\r\n ),\r\n },\r\n {\r\n type: 'noScript',\r\n isActive: scriptStatus === false,\r\n message: (\r\n <FormattedMessage\r\n {...messages.siteServingAdsWithoutScript}\r\n values={{\r\n snippet: (\r\n <Link\r\n onClick={() => setCodePanelVisibility(true, item?.id.toString(), item?.servingConfig?.clarityConfig?.clarityStatus)}\r\n >\r\n {formatMessage(messages.codeSnippet)}\r\n </Link>\r\n ),\r\n }}\r\n />\r\n ),\r\n },\r\n ],\r\n },\r\n Pending: {\r\n defaultMessage: null,\r\n issues: [\r\n {\r\n type: 'siteReview',\r\n isActive: isPublisherRejected === true,\r\n message: formatMessage(messages.sitePendingWithApprovedProfile),\r\n },\r\n {\r\n type: 'domainReview',\r\n isActive: isPublisherRejected === false,\r\n message: formatMessage(messages.sitePendingWithoutApprovedProfile),\r\n },\r\n ],\r\n },\r\n NotServing: {\r\n defaultMessage: (\r\n <FormattedMessage\r\n {...messages.siteRejected}\r\n values={{\r\n guidelines: (\r\n <Link href={CONNECT_SITE_HELP_URL} target=\"_blank\" rel=\"noreferrer noopener\">\r\n {formatMessage(messages.siteApprovalGuideLines)}\r\n </Link>\r\n ),\r\n appName: APP_NAME_NEW,\r\n }}\r\n />\r\n ),\r\n issues: [],\r\n },\r\n };\r\n\r\n const status = toolTipContent[servingStatus];\r\n if (status === undefined) {\r\n return null;\r\n }\r\n\r\n const getStatusMessage = (toolTipStatus: Status): JSX.Element | string | null | undefined => {\r\n const issues = toolTipStatus.issues;\r\n return issues.length > 0 ? issues.find((issue) => issue.isActive)?.message : toolTipStatus.defaultMessage;\r\n };\r\n\r\n return <>{getStatusMessage(status)}</>;\r\n};\r\n","import { CommandBarButton, DirectionalHint, IconButton, Link, getTheme } from '@fluentui/react';\r\nimport React from 'react';\r\nimport {\r\n AdsTxtStatus,\r\n ClarityStatus,\r\n EntityEvaluationStatus,\r\n PopupType,\r\n Property,\r\n ServingStatus,\r\n ServingStatusLabel,\r\n getAccessPermission,\r\n getAppStore,\r\n isTythonSelfServeUser,\r\n} from '../../../../../@data';\r\nimport {\r\n UserRoleEntity,\r\n completeAccess,\r\n hasDeleteAccess,\r\n hasReadAccess,\r\n hasUpdateAccess,\r\n userRoleKey,\r\n} from '../../../../../@data/services/UserRoleService';\r\nimport { Property as PropertyAccessPermissions } from '../../../../../@data/store/schema/userrolemodels/Property';\r\nimport AppMessages from '../../../../../App.messages';\r\nimport {\r\n ADS_DOT_TEXT_HELP_URL,\r\n CLARITY_WEB_APP,\r\n CONNECT_SITE_HELP_URL,\r\n SITE_APPROVAL_HELP_URL,\r\n} from '../../../../../constants/AppConstants';\r\nimport { IGridV2Column } from '../../../../../layout/GridPageV2';\r\nimport { setDialogType } from '../../../../../layout/GridPageV2/@data/mutatorActions';\r\nimport adManagementMessages from '../../../AdManagement.messages';\r\nimport messages from '../messages';\r\n\r\nimport { FormattedMessage } from 'react-intl';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport Tag, { TagType } from '../../../../../components/Tag';\r\nimport { CellInfoCallout } from '../../../../../layout/GridPageV2/components/CellInfoCallout';\r\nimport { HeaderInfoCallout } from '../../../../../layout/GridPageV2/components/HeaderInfoCallout';\r\nimport { RouteName } from '../../../@data';\r\nimport { createReturnUrl } from '../../../@data/services/AdManagementService';\r\nimport { connectToSupportTeam } from '../../../Home/components/ResourcesSection/ResourcesSection';\r\nimport { onResendClarityLink } from '../../Create/__data__/orchestrators';\r\nimport { setCodePanelVisibility } from '../__data__/mutatorActions';\r\nimport { getGridPropertyStore } from '../__data__/store/store';\r\nimport { getClassNames, getStyles } from '../styles';\r\nimport { getServingStatusCalloutContent } from './getServingStatusCalloutContent';\r\n\r\nexport const getTagType = (status: ServingStatus): TagType => {\r\n switch (status) {\r\n case ServingStatus.Serving:\r\n return TagType.Success;\r\n case ServingStatus.Pending:\r\n return TagType.Pending;\r\n case ServingStatus.NotServing:\r\n return TagType.Fail;\r\n default:\r\n return TagType.Pending;\r\n }\r\n};\r\n\r\nconst getClarityStatus = (status?: ClarityStatus, formatMessage?) => {\r\n switch (status) {\r\n case ClarityStatus.Approved:\r\n return formatMessage(messages.clarityApproved);\r\n case ClarityStatus.Pending:\r\n return formatMessage(messages.clarityPendingApproval);\r\n case ClarityStatus.Declined:\r\n return formatMessage(messages.clarityRejected);\r\n case ClarityStatus.Expired:\r\n return formatMessage(messages.clarityExpired);\r\n case ClarityStatus.Cancelled:\r\n return formatMessage(messages.clarityCancelled);\r\n case ClarityStatus.NotFound:\r\n return formatMessage(messages.clarityNotFound);\r\n default:\r\n return formatMessage(messages.clarityNotConnected);\r\n }\r\n};\r\n\r\nconst getClarityCalloutDescriptionStatus = (status?: ClarityStatus): ReactIntl.FormattedMessage.MessageDescriptor => {\r\n switch (status) {\r\n case ClarityStatus.Pending:\r\n return messages.clarityLinkPendingStatusCalloutDescription;\r\n case ClarityStatus.Declined:\r\n return messages.clarityLinkRejectStatusCalloutDescription;\r\n case ClarityStatus.Expired:\r\n return messages.clarityLinkExpiredStatusCalloutDescription;\r\n case ClarityStatus.Cancelled:\r\n return messages.clarityLinkCancelledStatusCalloutDescription;\r\n case ClarityStatus.NotConnected:\r\n return messages.clarityLinkNotConnectedStatusCalloutDescription;\r\n default:\r\n return messages.clarityLinkNotConnectedStatusCalloutDescription;\r\n }\r\n};\r\n\r\nconst editRouter = (item: Property, routeHistory, step?: number, showExtraBtns?: boolean) => {\r\n const { publisher, account } = getAppStore();\r\n const returnUrl = createReturnUrl(RouteName.property, publisher!.id, account!.id, item.id, FormState.MultiStepEdit, step, showExtraBtns);\r\n routeHistory.push(returnUrl);\r\n};\r\n\r\nconst getCallOutContent = (\r\n item: Property,\r\n formatMessage,\r\n routeHistory,\r\n clarityProjectId?: string,\r\n status?: ClarityStatus\r\n): JSX.Element | null => {\r\n const styles = getClassNames(getStyles, { theme: getTheme() });\r\n\r\n return status === ClarityStatus.NotFound ? (\r\n formatMessage(messages.clarityLinkNotFoundStatusCalloutDescription)\r\n ) : (\r\n <>\r\n <span className={styles.clarityCalloutTitle}>{formatMessage(messages.clarityLinkStatusCalloutTitle)}</span>\r\n {status !== ClarityStatus.NotConnected && (\r\n <>\r\n <br />\r\n <span className={styles.clarityCalloutTitle}>\r\n {formatMessage(messages.clarityLinkStatusCalloutProjectStatus, {\r\n id: clarityProjectId,\r\n status: getClarityStatus(status, formatMessage),\r\n })}\r\n </span>\r\n </>\r\n )}\r\n <p>{formatMessage(getClarityCalloutDescriptionStatus(status))}</p>\r\n <div className={styles.clarityCalloutFooter}>\r\n <Link onClick={() => onResendClarityLink(item.id, clarityProjectId!)}>\r\n {formatMessage(messages.clarityLinkStatusCalloutResendAction)}\r\n </Link>\r\n <Link onClick={() => editRouter(item, routeHistory, 0, true)}>{formatMessage(AppMessages.edit)}</Link>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nconst getPropertyAccessPermission = (): PropertyAccessPermissions | null => {\r\n const userRoles = localStorage.getItem(userRoleKey);\r\n if (userRoles === null) {\r\n return null;\r\n }\r\n const userRolesJSON = JSON.parse(userRoles);\r\n\r\n for (const value in userRolesJSON) {\r\n if (value === UserRoleEntity.Property) {\r\n return JSON.parse(userRolesJSON[value]);\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\nexport const getServingStatusLabel = (servingStatus: ServingStatus, formatMessage) => {\r\n const servingStatusType = Object.keys(ServingStatus)[Object.values(ServingStatus).indexOf(servingStatus)];\r\n return servingStatusType ? formatMessage(adManagementMessages[ServingStatusLabel[servingStatusType]]) : '';\r\n};\r\n\r\nexport const getGridColumns = (\r\n formatMessage,\r\n routeHistory,\r\n isWindowRegularSize,\r\n isFetchingPropertyStatus,\r\n servingConfigs,\r\n changeState\r\n): IGridV2Column[] => {\r\n const tythonUser = isTythonSelfServeUser();\r\n const propertyAccessPermissions = getPropertyAccessPermission();\r\n const { publisher, publisherEvaluationStatus } = getAppStore();\r\n const styles = getClassNames(getStyles, { theme: getTheme() });\r\n const isPublisherRejected = publisherEvaluationStatus?.approvalStatus === EntityEvaluationStatus.Rejected;\r\n\r\n const commonColumns: IGridV2Column[] = [\r\n {\r\n columnOrder: 0,\r\n key: 'name',\r\n fieldName: 'name',\r\n name: formatMessage(tythonUser ? messages.siteName : messages.name),\r\n minWidth: 80,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isVisible: tythonUser ? true : hasReadAccess(propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.name),\r\n isShowingDisabled: tythonUser\r\n ? true\r\n : hasReadAccess(propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.name),\r\n isExportable: true,\r\n isResizable: true,\r\n suppressSorting: false,\r\n },\r\n {\r\n columnOrder: 1,\r\n key: 'id',\r\n fieldName: 'id',\r\n name: formatMessage(tythonUser ? messages.siteId : messages.id),\r\n minWidth: 50,\r\n maxWidth: 100,\r\n isSearchable: true,\r\n isVisible: tythonUser ? true : hasReadAccess(propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.id),\r\n isShowingDisabled: tythonUser\r\n ? true\r\n : hasReadAccess(propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.id),\r\n isExportable: true,\r\n isResizable: true,\r\n isSortedDescending: true,\r\n },\r\n {\r\n columnOrder: 2,\r\n key: 'url',\r\n fieldName: 'url',\r\n name: formatMessage(messages.url),\r\n minWidth: 100,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: tythonUser\r\n ? true\r\n : hasReadAccess(propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.websiteURL),\r\n isShowingDisabled: tythonUser\r\n ? true\r\n : hasReadAccess(propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.websiteURL),\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 99,\r\n key: 'actions',\r\n name: formatMessage(messages.actions),\r\n minWidth: 220,\r\n maxWidth: 350,\r\n isPadded: true,\r\n isResizable: true,\r\n isSearchable: true,\r\n isVisible: true,\r\n suppressSorting: true,\r\n onRender: (item: Property) => {\r\n const accessPermission = getAccessPermission(item);\r\n\r\n return (\r\n <div>\r\n <CommandBarButton\r\n id={`siteCallout-${item.id}`}\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'edit' }}\r\n ariaLabel={formatMessage(AppMessages.edit)}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.edit) : ''}\r\n disabled={!hasUpdateAccess(accessPermission) || publisher === undefined}\r\n onClick={() => routeHistory.push(`/ad-management/${publisher?.id}/property/edit/${item.id}`)}\r\n />\r\n {isTythonSelfServeUser() && item.id !== undefined && (\r\n <CommandBarButton\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'PasteAsCode' }}\r\n ariaLabel={formatMessage(AppMessages.code)}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.code) : ''}\r\n onClick={() => setCodePanelVisibility(true, item.id.toString(), item.servingConfig?.clarityConfig?.clarityStatus)}\r\n />\r\n )}\r\n <CommandBarButton\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'Delete' }}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.delete) : ''}\r\n onClick={() => setDialogType(PopupType.DeleteConfirmation)}\r\n disabled={!hasDeleteAccess(accessPermission)}\r\n />\r\n </div>\r\n );\r\n },\r\n },\r\n ];\r\n\r\n const tythonColumns: IGridV2Column[] = [\r\n {\r\n columnOrder: 4,\r\n key: 'servingConfig.servingStatus',\r\n fieldName: 'servingConfig.servingStatus',\r\n name: formatMessage(messages.approvalStatus),\r\n minWidth: 50,\r\n maxWidth: 200,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isLoading: getGridPropertyStore().isFetchingPropertyStatus && getGridPropertyStore()?.servingConfigs === undefined,\r\n exportFunction: (item: Property) => item?.servingConfig?.servingStatus,\r\n onRenderHeader: HeaderInfoCallout({\r\n width: 350,\r\n calloutContent: (\r\n <div>\r\n <ul style={{ paddingInlineStart: 20 }}>\r\n <li>{formatMessage(messages.approvalStatusPendingInfo)}</li>\r\n <li>{formatMessage(messages.approvalStatusApprovalInfo)}</li>\r\n <li>{formatMessage(messages.approvalStatusRejectedInfo)}</li>\r\n </ul>\r\n <FormattedMessage\r\n {...messages.approvalStatusInfoHelp}\r\n values={{\r\n guidelines: (\r\n <Link href={SITE_APPROVAL_HELP_URL} target=\"_blank\" rel=\"noreferrer noopener\">\r\n {formatMessage(messages.approvalStatusInfoGuideLines)}\r\n </Link>\r\n ),\r\n support: (\r\n <Link onClick={() => connectToSupportTeam()} aria-label={formatMessage(messages.approvalStatusInfoGuideLines)}>\r\n {formatMessage(messages.approvalStatusInfoSupport)}\r\n </Link>\r\n ),\r\n }}\r\n />\r\n </div>\r\n ),\r\n }),\r\n onRenderData: (item: Property) =>\r\n item?.servingConfig?.servingStatus ? (\r\n <Tag\r\n status={getTagType(ServingStatus[item?.servingConfig?.servingStatus])}\r\n text={getServingStatusLabel(ServingStatus[item?.servingConfig?.servingStatus], formatMessage)}\r\n calloutProps={{\r\n placement: DirectionalHint.topCenter,\r\n calloutContent: getServingStatusCalloutContent(formatMessage, isPublisherRejected, item),\r\n }}\r\n />\r\n ) : (\r\n <></>\r\n ),\r\n },\r\n {\r\n columnOrder: 3,\r\n key: 'servingConfig.clarityConfig.clarityId',\r\n fieldName: 'servingConfig.clarityConfig.clarityId',\r\n name: formatMessage(messages.clarityProject),\r\n minWidth: 50,\r\n maxWidth: 200,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n isLoading: getGridPropertyStore().isFetchingPropertyStatus && getGridPropertyStore()?.servingConfigs === undefined,\r\n exportFunction: (item: Property) => {\r\n const clarityProjectId = item?.servingConfig?.clarityConfig?.clarityId;\r\n const clarityStatus = item?.servingConfig?.clarityConfig?.clarityStatus;\r\n\r\n if (clarityProjectId && clarityStatus === ClarityStatus.Approved) {\r\n const refLink = CLARITY_WEB_APP.replace('{id}', clarityProjectId);\r\n return `=HYPERLINK(\"${refLink}\", \"${clarityProjectId}\")`;\r\n } else {\r\n return getClarityStatus(clarityStatus, formatMessage);\r\n }\r\n },\r\n onRenderHeader: () => {\r\n return (\r\n <>\r\n {formatMessage(messages.clarityProject)}\r\n <IconButton\r\n id=\"clarityTourIcon\"\r\n title=\"Information\"\r\n iconProps={{ iconName: 'Info' }}\r\n onClick={(e) => {\r\n changeState();\r\n e.stopPropagation();\r\n }}\r\n />\r\n </>\r\n );\r\n },\r\n onRenderData: (item: Property) => {\r\n const clarityProjectId = item?.servingConfig?.clarityConfig?.clarityId;\r\n const clarityStatus = item?.servingConfig?.clarityConfig?.clarityStatus;\r\n\r\n if (clarityProjectId && clarityStatus === ClarityStatus.Approved) {\r\n return (\r\n <Link id=\"clarityProjectId\" href={CLARITY_WEB_APP.replace('{id}', clarityProjectId)} target=\"_blank\" rel=\"noreferrer noopener\">\r\n {clarityProjectId}\r\n </Link>\r\n );\r\n } else {\r\n return clarityStatus === ClarityStatus.NotConnected || clarityStatus === undefined ? (\r\n getClarityStatus(clarityStatus, formatMessage)\r\n ) : (\r\n <CellInfoCallout\r\n placement={DirectionalHint.bottomCenter}\r\n calloutContent={getCallOutContent(item, formatMessage, routeHistory, clarityProjectId, clarityStatus)}\r\n >\r\n <div className={styles.clarityStatusUnderline}>{getClarityStatus(clarityStatus, formatMessage)}</div>\r\n </CellInfoCallout>\r\n );\r\n }\r\n },\r\n },\r\n {\r\n columnOrder: 5,\r\n key: 'issues',\r\n fieldName: 'issues',\r\n name: formatMessage(messages.issues),\r\n minWidth: 180,\r\n maxWidth: 300,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n isLoading: getGridPropertyStore().isFetchingPropertyStatus && getGridPropertyStore()?.servingConfigs === undefined,\r\n onRenderData: (item: Property) => (\r\n <>\r\n <ul className={styles.propertyIssuesUnorderedList}>\r\n {item?.servingConfig?.scriptStatus === false && (\r\n <li className={styles.errorBulletPoint}>\r\n <Link onClick={() => setCodePanelVisibility(true, item?.id.toString(), item?.servingConfig?.clarityConfig?.clarityStatus)}>\r\n {formatMessage(messages.siteNotServingPubCenterScriptInActive)}\r\n </Link>\r\n </li>\r\n )}\r\n {item?.servingConfig?.servingStatus &&\r\n ServingStatus[item?.servingConfig?.servingStatus.toString()] === ServingStatus.NotServing && (\r\n <li className={styles.errorBulletPoint}>\r\n <Link href={CONNECT_SITE_HELP_URL} target=\"_blank\" rel=\"noreferrer noopener\">\r\n {formatMessage(messages.siteNotServingSiteIsRejected)}\r\n </Link>\r\n </li>\r\n )}\r\n {item?.servingConfig?.adsDotTxtStatus &&\r\n (AdsTxtStatus[item?.servingConfig?.adsDotTxtStatus?.toString()] === AdsTxtStatus.NotFound ||\r\n AdsTxtStatus[item?.servingConfig?.adsDotTxtStatus?.toString()] === AdsTxtStatus.Scanning) && (\r\n <li className={styles.warningBulletPoint}>\r\n <Link href={ADS_DOT_TEXT_HELP_URL} target=\"_blank\" rel=\"noreferrer noopener\">\r\n {formatMessage(messages.siteNotServingWithoutAdsTxt)}\r\n </Link>\r\n </li>\r\n )}\r\n </ul>\r\n </>\r\n ),\r\n },\r\n ];\r\n\r\n const nonTythonColumns: IGridV2Column[] = [\r\n {\r\n columnOrder: 3,\r\n key: 'status',\r\n fieldName: 'status',\r\n name: formatMessage(messages.status),\r\n minWidth: 50,\r\n maxWidth: 100,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n suppressSorting: false,\r\n },\r\n {\r\n columnOrder: 4,\r\n key: 'approvalStatus',\r\n fieldName: 'approvalStatus',\r\n name: formatMessage(tythonUser ? messages.approvalStatus : messages.approvalStatus),\r\n minWidth: 50,\r\n maxWidth: 100,\r\n isSearchable: true,\r\n isVisible: hasReadAccess(propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.approvalStatus),\r\n isShowingDisabled: hasReadAccess(propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.approvalStatus),\r\n isExportable: true,\r\n isResizable: true,\r\n onRender: (item: Property) => item.approvalStatus,\r\n },\r\n {\r\n columnOrder: 5,\r\n key: 'clarityStatus',\r\n fieldName: 'clarityStatus',\r\n name: formatMessage(messages.clarityStatus),\r\n minWidth: 100,\r\n maxWidth: 150,\r\n isResizable: true,\r\n isSearchable: true,\r\n isVisible: hasReadAccess(propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.clarity),\r\n isShowingDisabled: hasReadAccess(propertyAccessPermissions === null ? completeAccess : propertyAccessPermissions.clarity),\r\n isExportable: true,\r\n onRender: (item: Property) => {\r\n if (item.clarityProjectId && (item.clarityStatus === 'Approved' || item.clarityStatus === item.clarityProjectId)) {\r\n return (\r\n <Link href={CLARITY_WEB_APP.replace('{id}', item?.clarityProjectId)} target=\"_blank\" rel=\"noreferrer noopener\">\r\n {item.clarityStatus}\r\n </Link>\r\n );\r\n } else {\r\n return item.clarityStatus;\r\n }\r\n },\r\n exportFunction: (item: Property) => {\r\n if (item.clarityStatus === 'Approved' && item.clarityProjectId) {\r\n const refLink = CLARITY_WEB_APP.replace('{id}', item.clarityProjectId);\r\n return `=HYPERLINK(\"${refLink}\", \"${item.clarityProjectId}\")`;\r\n } else {\r\n return item.clarityStatus;\r\n }\r\n },\r\n },\r\n ];\r\n\r\n if (getGridPropertyStore().servingConfigs !== undefined && getGridPropertyStore().servingConfigs!.length > 0) {\r\n nonTythonColumns.push({\r\n columnOrder: 4.5,\r\n key: 'servingStatus',\r\n fieldName: 'servingStatus',\r\n name: formatMessage(messages.servingStatus),\r\n minWidth: 100,\r\n maxWidth: 200,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n suppressSorting: false,\r\n isLoading: getGridPropertyStore().isFetchingPropertyStatus && getGridPropertyStore()?.servingConfigs === undefined,\r\n onRenderData: (item: Property) => {\r\n const servingStatus = getGridPropertyStore()?.servingConfigs?.find((property) => property.propertyId === item.id)?.servingStatus;\r\n return <>{servingStatus}</>;\r\n },\r\n });\r\n }\r\n\r\n const newColumns = [...commonColumns, ...(isTythonSelfServeUser() ? tythonColumns : nonTythonColumns)];\r\n return newColumns;\r\n};\r\n","import { Link, SelectionMode, getTheme } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { useEffect, useState } from 'react';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport { EntityEvaluationStatus, InventoryPlatformType, Property, getAppStore } from '../../../../@data';\r\nimport { isTythonSelfServeUser } from '../../../../@data/utils/checkUserType';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { DefaultRoute } from '../../../../Routes';\r\nimport { ZeroResults } from '../../../../components/ZeroResults/ZeroResults';\r\nimport { useWindowSize } from '../../../../hooks';\r\nimport { getStore as getWindowSizeStore } from '../../../../hooks/useWindowSize/store/store';\r\nimport { GridPageLayout } from '../../../../layout/GridPageLayout/GridPageLayout';\r\nimport { GridV2, IGridV2Column } from '../../../../layout/GridPageV2';\r\nimport TutorialCallout from '../../../../layout/TutorialCallout';\r\nimport { IRouterWithIntl, injectIntlAndObserver } from '../../../../utils/ReactUtils';\r\nimport { RouteName } from '../../@data';\r\nimport { fetchPublisherEvaluationStatusAction } from '../../@data/actions';\r\nimport { setPropertyData } from './__data__/mutatorActions';\r\nimport { onManagePageInitialized } from './__data__/orchestrators';\r\nimport { getGridPropertyStore } from './__data__/store/store';\r\nimport ClarityPanel from './components/ClarityPanel';\r\nimport { CodePanel } from './components/CodePanel/CodePanel';\r\nimport messages from './messages';\r\nimport { getClassNames, getStyles } from './styles';\r\nimport { getClarityTutorialSteps } from './utils/getClarityTutorialSteps';\r\nimport { getCommandBarItems } from './utils/getCommandBarItems';\r\nimport { getGridColumns } from './utils/getGridColumns';\r\n\r\nconst { windowStoreSerializer } = useWindowSize();\r\n\r\nexport const ManagePage = injectIntlAndObserver((props: IRouterWithIntl & { withParentLayout?: boolean; abortDataFetch?: boolean }) => {\r\n const { publisher, publisherEvaluationStatus } = getAppStore();\r\n const tythonUser = isTythonSelfServeUser();\r\n const { history, intl, location, match, withParentLayout, abortDataFetch = false } = props;\r\n const { formatMessage } = intl;\r\n const { isWindowRegularSize } = windowStoreSerializer(getWindowSizeStore());\r\n const store = getGridPropertyStore();\r\n const [clarityTutorialCallout, setClarityTutorialCallout] = useState(false);\r\n const styles = getClassNames(getStyles, { theme: getTheme() });\r\n const isPublisherRejected = publisherEvaluationStatus?.approvalStatus === EntityEvaluationStatus.Rejected;\r\n\r\n const changeClarityCalloutVisibility = () => setClarityTutorialCallout((prevState) => !prevState);\r\n\r\n const gridDefaultColumns: IGridV2Column[] = getGridColumns(\r\n formatMessage,\r\n props.history,\r\n isWindowRegularSize,\r\n getGridPropertyStore().isFetchingPropertyStatus,\r\n getGridPropertyStore().servingConfigs,\r\n changeClarityCalloutVisibility\r\n );\r\n\r\n const NoResultComponent = (\r\n <ZeroResults\r\n showDefaultImage\r\n title={\r\n tythonUser || (!tythonUser && !!publisher)\r\n ? formatMessage(tythonUser ? messages.zeroResultTitle : messages.zeroResultTitleNonTython)\r\n : undefined\r\n }\r\n description={formatMessage(\r\n tythonUser ? messages.zeroResultDescription : !!publisher ? messages.zeroResultDescriptionNonTython : messages.noPublisherSelected\r\n )}\r\n buttonText={formatMessage(tythonUser ? messages.siteCreate : messages.create)}\r\n onButtonClick={\r\n tythonUser || (!tythonUser && !!publisher)\r\n ? () => history.push(`${DefaultRoute}/${publisher?.id}/${RouteName.property}/create`)\r\n : undefined\r\n }\r\n />\r\n );\r\n\r\n useEffect(() => {\r\n if ((publisher !== undefined && store?.data && store?.data[0]?.publisherId === publisher?.id) || abortDataFetch) {\r\n return;\r\n }\r\n onManagePageInitialized();\r\n fetchPublisherEvaluationStatusAction({ cache: false });\r\n // eslint-disable-next-line\r\n }, [publisher]);\r\n\r\n const pageContent = (\r\n <>\r\n <TutorialCallout\r\n steps={getClarityTutorialSteps(formatMessage, store.servingConfigs)}\r\n isOpen={clarityTutorialCallout}\r\n onChangeState={changeClarityCalloutVisibility}\r\n />\r\n\r\n <ClarityPanel {...props} />\r\n <>{isTythonSelfServeUser() && <CodePanel {...props} />}</>\r\n <GridV2\r\n history={history}\r\n location={location}\r\n match={match}\r\n entity={Property}\r\n pageTitle={{\r\n title: formatMessage(tythonUser ? messages.sites : messages.properties),\r\n helpId: tythonUser ? 'pop_PCv4_Sites' : 'pop_PCv4_Properties',\r\n }}\r\n msgBarProps={\r\n isPublisherRejected\r\n ? {\r\n messageBarType: 1,\r\n children: (\r\n <span className={styles.errorMsgContent}>\r\n <FormattedMessage\r\n {...messages.sitesCannotServeMessage}\r\n values={{ learn: <Link>{formatMessage(AppMessages.learnMore)}</Link> }}\r\n />\r\n </span>\r\n ),\r\n className: styles.errorMsg,\r\n }\r\n : undefined\r\n }\r\n isGridReady={!store.isLoading}\r\n isDataLoading={store.isFetchingData}\r\n commandBarProps={getCommandBarItems(formatMessage)}\r\n dataGridProps={{\r\n gridV2Columns: gridDefaultColumns,\r\n data: publisher\r\n ? store.data?.filter?.((property) => property.servingConfig?.inventoryPlatformType !== InventoryPlatformType.UWP) || []\r\n : [],\r\n setData: setPropertyData,\r\n shimmerLines: 10,\r\n selectionMode: SelectionMode.single,\r\n renderZeroItemsComponent: NoResultComponent,\r\n noEntityFound: tythonUser ? messages.siteNotFound : messages.notFound,\r\n }}\r\n paginationProps={{\r\n shouldGridHandlePagination: true,\r\n }}\r\n />\r\n </>\r\n );\r\n return withParentLayout ? <>{pageContent}</> : <GridPageLayout>{pageContent}</GridPageLayout>;\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n appInventoryTableTitle: {\r\n id: 'inventory.manage.app.title',\r\n defaultMessage: 'Apps',\r\n },\r\n appsCannotServeMessage: {\r\n id: 'inventory.manage.app.appsCannotServeMessage',\r\n defaultMessage: 'Apps cannot serve ads until your profile is submitted and approved {learn}',\r\n },\r\n learnMore: {\r\n id: 'app.learnMore',\r\n defaultMessage: 'Learn more',\r\n },\r\n appNameColumnLabel: {\r\n id: 'inventory.app.appNameColumnLabel',\r\n defaultMessage: 'App Name',\r\n },\r\n appIdColumnLabel: {\r\n id: 'inventory.app.appIdColumnLabel',\r\n defaultMessage: 'App ID',\r\n },\r\n appUrlColumnLabel: {\r\n id: 'inventory.app.appUrlColumnLabel',\r\n defaultMessage: 'App URL',\r\n },\r\n appAdUnitPlatformColumnLabel: {\r\n id: 'inventory.app.appAdUnitPlatformColumnLabel',\r\n defaultMessage: 'Ad unit platform',\r\n },\r\n appAdUnitStatusColumnLabel: {\r\n id: 'inventory.app.appAdUnitStatusColumnLabel',\r\n defaultMessage: 'Status',\r\n },\r\n appAdUnitActionsColumnLabel: {\r\n id: 'inventory.app.appAdUnitActionsColumnLabel',\r\n defaultMessage: 'Actions',\r\n },\r\n appAdunitGridCreateButtonLabel: {\r\n id: 'inventory.app.adunitGridCreateButtonLabel',\r\n defaultMessage: 'Create An App',\r\n },\r\n appInventoryIssueColumnLabel: {\r\n id: 'inventory.app.appInventoryIssueColumnLabel',\r\n defaultMessage: 'Issues',\r\n },\r\n appInventoryZeroResultTitle: {\r\n id: 'inventory.app.appInventoryZeroResultTitle',\r\n defaultMessage: 'No inventory found by apps',\r\n },\r\n appInventoryZeroResultDescription: {\r\n id: 'inventory.app.appInventoryZeroResultDescription',\r\n defaultMessage: 'Create an app to start serving ads',\r\n },\r\n appInventoryZeroResultCallToAction: {\r\n id: 'inventory.app.appInventoryZeroResultCallToAction',\r\n defaultMessage: 'Create an App',\r\n },\r\n appInventoryDeletePopupTitle: {\r\n id: 'inventory.app.appInventoryDeletePopupTitle',\r\n defaultMessage: 'Are you sure you want to delete this app?',\r\n },\r\n appInventoryDeletePopupDescription: {\r\n id: 'inventory.app.appInventoryDeletePopupDescription',\r\n defaultMessage: 'By deleting this app, you’ll unlink the app ad units associated with it',\r\n },\r\n});\r\n","import { CommandBarButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { Model, PopupType, Property, getAccessPermission } from '../../../../@data';\r\nimport { hasDeleteAccess } from '../../../../@data/services/UserRoleService';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { ZeroResults } from '../../../../components/ZeroResults/ZeroResults';\r\nimport { CommandBarActions, IBuildCommandBarProps } from '../../../../layout/GridPageV2';\r\nimport { setDialogType } from '../../../../layout/GridPageV2/@data/mutatorActions';\r\nimport { getTythonAppInventoryCreationRoute, getTythonAppInventoryEditionRoute } from '../../../../utils/routeUtils';\r\nimport messages from './messages';\r\n\r\nconst useAppInventoryGrid = (formatMessage, routeHistory, isWindowRegularSize, publisher) => {\r\n const NoResultComponent = (\r\n <ZeroResults\r\n showDefaultImage\r\n title={formatMessage(messages.appInventoryZeroResultTitle)}\r\n description={formatMessage(messages.appInventoryZeroResultDescription)}\r\n buttonText={formatMessage(messages.appInventoryZeroResultCallToAction)}\r\n onButtonClick={() => routeHistory.push(getTythonAppInventoryCreationRoute())}\r\n />\r\n );\r\n\r\n const gridColumns = [\r\n {\r\n columnOrder: 0,\r\n key: 'name',\r\n fieldName: 'name',\r\n name: formatMessage(messages.appNameColumnLabel),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isVisible: true,\r\n isShowingDisabled: true,\r\n isExportable: true,\r\n isResizable: true,\r\n suppressSorting: false,\r\n },\r\n {\r\n columnOrder: 1,\r\n key: 'id',\r\n fieldName: 'id',\r\n name: formatMessage(messages.appIdColumnLabel),\r\n minWidth: 100,\r\n maxWidth: 100,\r\n isSearchable: true,\r\n isVisible: true,\r\n isShowingDisabled: true,\r\n isExportable: true,\r\n isResizable: true,\r\n isSortedDescending: true,\r\n },\r\n {\r\n columnOrder: 2,\r\n key: 'url',\r\n fieldName: 'url',\r\n name: formatMessage(messages.appUrlColumnLabel),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: true,\r\n isShowingDisabled: true,\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 99,\r\n key: 'actions',\r\n name: formatMessage(messages.appAdUnitActionsColumnLabel),\r\n minWidth: 220,\r\n maxWidth: 220,\r\n isPadded: true,\r\n isSearchable: true,\r\n isVisible: true,\r\n suppressSorting: true,\r\n onRender: (item: Property) => {\r\n const accessPermission = getAccessPermission(item);\r\n\r\n return (\r\n <div>\r\n <CommandBarButton\r\n id={`siteCallout-${item.id}`}\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'edit' }}\r\n ariaLabel={formatMessage(AppMessages.edit)}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.edit) : ''}\r\n disabled={false}\r\n onClick={() => routeHistory.push(`${getTythonAppInventoryEditionRoute(item.id)}`)}\r\n />\r\n <CommandBarButton\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'Delete' }}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.delete) : ''}\r\n onClick={() => setDialogType(PopupType.DeleteConfirmation)}\r\n disabled={!hasDeleteAccess(accessPermission)}\r\n />\r\n </div>\r\n );\r\n },\r\n },\r\n ];\r\n\r\n const pageTitle = {\r\n title: formatMessage(messages.appInventoryTableTitle),\r\n helpId: 'pop_PCv4_Sites',\r\n };\r\n\r\n const commandBarItems: IBuildCommandBarProps<Model> = {\r\n primaryButtonUrl: getTythonAppInventoryCreationRoute(),\r\n primaryButtonLabel: messages.appAdunitGridCreateButtonLabel,\r\n includeActions: [CommandBarActions.new],\r\n includeFarActions: [CommandBarActions.searchBox, CommandBarActions.code, CommandBarActions.download, CommandBarActions.modifyColumns],\r\n filterItems: [],\r\n deleteLabels: {\r\n title: messages.appInventoryDeletePopupTitle,\r\n description: messages.appInventoryDeletePopupDescription,\r\n },\r\n };\r\n\r\n return { gridColumns, pageTitle, commandBarItems, NoResultComponent };\r\n};\r\n\r\nexport default useAppInventoryGrid;\r\n","import { Link, SelectionMode } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport { EntityEvaluationStatus, InventoryPlatformType, Property, getAppStore } from '../../../../@data';\r\nimport { useWindowSize } from '../../../../hooks';\r\nimport { getStore as getWindowSizeStore } from '../../../../hooks/useWindowSize/store/store';\r\nimport { GridV2 } from '../../../../layout/GridPageV2';\r\nimport { injectRouterAndIntlWithObserver } from '../../../../utils';\r\nimport { setPropertyData } from '../../Property/Manage/__data__/mutatorActions';\r\nimport { getGridPropertyStore } from '../../Property/Manage/__data__/store/store';\r\nimport messages from './messages';\r\nimport { AppInventoryManagePageType } from './types';\r\nimport useAppInventoryGrid from './useAppInventoryGrid';\r\n\r\nconst { windowStoreSerializer } = useWindowSize();\r\n\r\nconst AppInventoryManagePage: AppInventoryManagePageType = ({ intl: { formatMessage }, history, location, match }) => {\r\n const { isWindowRegularSize } = windowStoreSerializer(getWindowSizeStore());\r\n const { publisher, publisherEvaluationStatus } = getAppStore();\r\n const isPublisherRejected = publisherEvaluationStatus?.approvalStatus === EntityEvaluationStatus.Rejected;\r\n const store = getGridPropertyStore();\r\n const { gridColumns, pageTitle, commandBarItems, NoResultComponent } = useAppInventoryGrid(\r\n formatMessage,\r\n history,\r\n isWindowRegularSize,\r\n publisher\r\n );\r\n\r\n return (\r\n <div>\r\n <GridV2\r\n history={history}\r\n location={location}\r\n match={match}\r\n entity={Property}\r\n pageTitle={pageTitle}\r\n msgBarProps={\r\n isPublisherRejected\r\n ? {\r\n messageBarType: 1,\r\n children: (\r\n <span>\r\n <FormattedMessage\r\n {...messages.appsCannotServeMessage}\r\n values={{ learn: <Link>{formatMessage(messages.learnMore)}</Link> }}\r\n />\r\n </span>\r\n ),\r\n }\r\n : undefined\r\n }\r\n isGridReady={!store.isLoading}\r\n isDataLoading={store.isFetchingData}\r\n commandBarProps={commandBarItems}\r\n dataGridProps={{\r\n gridV2Columns: gridColumns,\r\n data: publisher\r\n ? store.data?.filter?.((property) => property.servingConfig?.inventoryPlatformType === InventoryPlatformType.UWP) || []\r\n : [],\r\n setData: setPropertyData,\r\n shimmerLines: 10,\r\n selectionMode: SelectionMode.single,\r\n renderZeroItemsComponent: NoResultComponent,\r\n }}\r\n paginationProps={{\r\n shouldGridHandlePagination: true,\r\n }}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default (injectRouterAndIntlWithObserver(AppInventoryManagePage) as unknown) as React.FC;\r\n","import { observer } from 'mobx-react';\r\nimport React, { useEffect } from 'react';\r\nimport { withRouter } from 'react-router-dom';\r\nimport { getAppStore } from '../../../../@data';\r\nimport EntityTypeSwitch from '../../../../components/EntityTypeSwitch';\r\nimport { InventoryPageTabs, useEntityTypeManage } from '../../../../hooks/useEntityTypeManage';\r\nimport { getStore as getWindowsAppFeatureFlagStore } from '../../../../hooks/useWindowsAppFeatureFlag/store/store';\r\nimport { GridPageLayout } from '../../../../layout/GridPageLayout/GridPageLayout';\r\nimport { fetchPublisherEvaluationStatusAction } from '../../@data/actions';\r\nimport { ManagePage } from '../../Property/Manage';\r\nimport { onManagePageInitialized } from '../../Property/Manage/__data__/orchestrators';\r\nimport { getGridPropertyStore } from '../../Property/Manage/__data__/store/store';\r\nimport AppInventoryManagePage from './AppInventoryManagePage';\r\n\r\nexport const TythonInventoryManagePage = withRouter(\r\n observer(({ history, match, location }) => {\r\n const { isFeatureEnabled } = getWindowsAppFeatureFlagStore();\r\n const { activeSubTab, setActiveSubTab } = useEntityTypeManage({ isFeatureEnabled });\r\n const SiteManageView = <ManagePage withParentLayout history={history} match={match} location={location} abortDataFetch />;\r\n const AppInventoryManageView = <AppInventoryManagePage />;\r\n const store = getGridPropertyStore();\r\n\r\n const { publisher } = getAppStore();\r\n\r\n useEffect(() => {\r\n if (publisher !== undefined && store?.data && store?.data[0]?.publisherId === publisher?.id) {\r\n return;\r\n }\r\n onManagePageInitialized();\r\n fetchPublisherEvaluationStatusAction({ cache: false });\r\n // eslint-disable-next-line\r\n }, [publisher]);\r\n\r\n return (\r\n <GridPageLayout withSubHeader>\r\n <EntityTypeSwitch selectedValue={activeSubTab} onTabSelect={setActiveSubTab} isFeatureEnabled={isFeatureEnabled} />\r\n {activeSubTab === InventoryPageTabs.Sites ? SiteManageView : <></>}\r\n {activeSubTab === InventoryPageTabs.Apps ? AppInventoryManageView : <></>}\r\n </GridPageLayout>\r\n );\r\n })\r\n);\r\n","import { Spinner } from '@fluentui/react-components';\r\nimport React, { useEffect } from 'react';\r\nimport { onHelpInfoChanged } from '../../@data';\r\n\r\nexport const HelpcenterInfoBubbleV2 = ({ html }) => {\r\n useEffect(() => {\r\n return () => {\r\n onHelpInfoChanged();\r\n };\r\n }, []);\r\n if (!html) {\r\n return <Spinner size=\"tiny\" />;\r\n }\r\n return <div dangerouslySetInnerHTML={{ __html: html }} />;\r\n};\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n errorSellerIdDoesNotMatchApp: {\r\n id: 'appInventoryForm.errorSellerIdDoesNotMatchApp',\r\n defaultMessage: 'SellerId does not match provided App.',\r\n },\r\n errorPropertyNameAlreadyExists: {\r\n id: 'appInventoryForm.errorPropertyNameAlreadyExists',\r\n defaultMessage: 'An inventory by this name already exists',\r\n },\r\n errorInventoryAppUrlAlreadyExists: {\r\n id: 'appInventoryForm.errorPropertyNameAlreadyExists',\r\n defaultMessage: 'An inventory by this url already exists',\r\n },\r\n processNameCreate: {\r\n id: 'appInventoryForm.processNameCreate',\r\n defaultMessage: 'Create app',\r\n },\r\n processNameEdit: {\r\n id: 'appInventoryForm.processNameEdit',\r\n defaultMessage: 'Edit app',\r\n },\r\n CreateSiteStep: {\r\n id: 'appInventoryForm.CreateSiteStep',\r\n defaultMessage: 'App details',\r\n },\r\n AdsTxtCreationStep: {\r\n id: 'appInventoryForm.AdsTxtCreationStep',\r\n defaultMessage: 'Ads.txt creation',\r\n },\r\n AdsTxtCreationStepTitle: {\r\n id: 'appInventoryForm.AdsTxtCreationStepTitle',\r\n defaultMessage: 'Create ads.txt file',\r\n },\r\n GetCodeAndFinishStep: {\r\n id: 'appInventoryForm.GetCodeAndFinishStep',\r\n defaultMessage: 'Get code',\r\n },\r\n appNameFieldLabel: {\r\n id: 'appInventoryForm.appNameFieldLabel',\r\n defaultMessage: 'App Name',\r\n },\r\n appSellerIdFieldLabel: {\r\n id: 'appInventoryForm.appSellerIdFieldLabel',\r\n defaultMessage: 'Seller ID',\r\n },\r\n appUrlFieldLabel: {\r\n id: 'appInventoryForm.appUrlFieldLabel',\r\n defaultMessage: 'App Url',\r\n },\r\n appNameFieldPlaceholder: {\r\n id: 'appInventoryForm.appNameFieldPlaceholder',\r\n defaultMessage: 'Enter the name of your App',\r\n },\r\n appSellerIdFieldPlaceholder: {\r\n id: 'appInventoryForm.appSellerIdFieldPlaceholder',\r\n defaultMessage: 'Enter the name of your windows store seller id',\r\n },\r\n appUrlFieldPlaceholder: {\r\n id: 'appInventoryForm.appUrlFieldPlaceholder',\r\n defaultMessage: 'Enter app URL',\r\n },\r\n appPlatformInfo: {\r\n id: 'appInventoryForm.appPlatformInfo',\r\n defaultMessage: 'Currently Ads SDK supports only Windows UWP framework. Future support for additional frameworks will be added soon.',\r\n },\r\n appPlatformWindowsUWPLabel: {\r\n id: 'appInventoryForm.appPlatformWindowsUWPLabel',\r\n defaultMessage: 'Windows UWP',\r\n },\r\n appPlatformTitleLabel: {\r\n id: 'appInventoryForm.appPlatformTitleLabel',\r\n defaultMessage: 'App Platform',\r\n },\r\n appPlatformConnectLiveAppInfo: {\r\n id: 'appInventoryForm.appPlatformConnectLiveAppInfo',\r\n defaultMessage: 'Your app must be live in the Microsoft Store for us to serve ads. Please search your app using Store ID',\r\n },\r\n appPlatformConnectLiveAppTitleLabel: {\r\n id: 'appInventoryForm.appPlatformConnectLiveAppTitleLabel',\r\n defaultMessage: 'Connect your live app',\r\n },\r\n appSearchFieldPlaceholder: {\r\n id: 'appInventoryForm.appSearchFieldPlaceholder',\r\n defaultMessage: 'Search for your app by Store ID',\r\n },\r\n appAgreement: {\r\n id: 'appInventoryForm.appAgreement',\r\n defaultMessage: 'COPPA Agreement',\r\n },\r\n appAgreementSection1: {\r\n id: 'appInventoryForm.appAgreementSection1',\r\n defaultMessage:\r\n 'In accordance with the Children’s Online Privacy Protection Act (COPPA) in the United States, we require all partners using Microsoft’s Monetize services to identify whether or not their apps are primarily directed toward children under the age of thirteen (13).',\r\n },\r\n appAgreementSection2: {\r\n id: 'appInventoryForm.appAgreementSection2',\r\n defaultMessage:\r\n 'By clicking “Agree†below, partner: (i) represents that this app is not primarily directed at children under age thirteen (13), and (ii) agrees that this app will not be tagged as primarily child-directed.',\r\n },\r\n appAgreementCheckboxLabel: {\r\n id: 'appInventoryForm.appAgreementCheckboxLabel',\r\n defaultMessage: 'I agree',\r\n },\r\n getCodeTitle: {\r\n id: 'appInventoryForm.getCodeTitle',\r\n defaultMessage: 'Your app set-up is almost complete',\r\n },\r\n finishStepperTittle: {\r\n id: 'appInventoryForm.finishStepperTittle',\r\n defaultMessage: 'Finish',\r\n },\r\n finishPageExpectNextTitle: {\r\n id: 'appInventoryForm.finishPageExpectNextTitle',\r\n defaultMessage: 'What to expect next?',\r\n },\r\n finishPageExpectNextContent1: {\r\n id: 'appInventoryForm.finishPageExpectNextContent1',\r\n defaultMessage: 'Now that your app is set up, please ensure your have added app-ads.txt on your website for an unhindered ad delivery.',\r\n },\r\n finishPageExpectNextContent2: {\r\n id: 'appInventoryForm.finishPageExpectNextContent2',\r\n defaultMessage:\r\n 'We will now review your ad to make sure it’s ready to show ads. App reviews typically take 7 business days. Ad serving is will be restricted until the review is complete.',\r\n },\r\n finishPageExpectNextContentHelpLink: {\r\n id: 'appInventoryForm.finishPageExpectNextContentHelpLink',\r\n defaultMessage: 'Learn more about app review process',\r\n },\r\n finishPageExpectNextTitle2: {\r\n id: 'appInventoryForm.finishPageExpectNextTitle2',\r\n defaultMessage: 'Next Steps',\r\n },\r\n finishPageCardTitle: {\r\n id: 'appInventoryForm.finishPageCardTitle',\r\n defaultMessage: 'Set up ad unit for your App',\r\n },\r\n finishPageActionButtonLabel: {\r\n id: 'appInventoryForm.finishPageActionButtonLabel',\r\n defaultMessage: 'Create App ad unit',\r\n },\r\n finishPageCardContent: {\r\n id: 'appInventoryForm.finishPageCardContent',\r\n defaultMessage: 'Set up ad placements for this app so that when your app is approved, you can start serving ads right away',\r\n },\r\n CreateSiteStepFormTitle: {\r\n id: 'appInventoryForm.CreateSiteStepFormTitle',\r\n defaultMessage: 'Add your App details',\r\n },\r\n loadingLabel: {\r\n id: 'appInventoryForm.loadingLabel',\r\n defaultMessage: 'Loading...',\r\n },\r\n coopaTnCInfo: {\r\n id: 'appInventoryForm.coopaTnCInfo',\r\n defaultMessage:\r\n 'Partners may have other legal obligations under COPPA. Please review the FTC’s guidance and/or seek your own advice of counsel. Microsoft pubCenter tools are designed only to facilitate compliance and do not relieve partners of their legal obligations, including under COPPA.',\r\n },\r\n appPropertyInvalidUrl: {\r\n id: 'appInventoryForm.appPropertyInvalidUrl',\r\n defaultMessage: 'Invalid URL, no path or query parameters',\r\n },\r\n});\r\n","import { makeStyles, shorthands, tokens, typographyStyles } from '@fluentui/react-components';\r\nimport { BreakPoints } from '../../../../../../../../theme';\r\n\r\nexport const useAppPropertyDetailPageStyles = makeStyles({\r\n sectionTitle: {\r\n ...typographyStyles.title3,\r\n },\r\n sectionTitleOffset: {\r\n marginBottom: tokens.spacingVerticalXS,\r\n },\r\n textTitle: {\r\n ...typographyStyles.body1Strong,\r\n '::after': {\r\n content: `\" *\"`,\r\n color: tokens.colorPaletteRedForeground3,\r\n paddingRight: tokens.spacingHorizontalM,\r\n },\r\n },\r\n infoMsgBar: {\r\n ...typographyStyles.caption1Strong,\r\n marginBottom: tokens.spacingVerticalXS,\r\n paddingTop: tokens.spacingVerticalXS,\r\n paddingBottom: tokens.spacingVerticalXS,\r\n },\r\n agreementTitle: {\r\n ...typographyStyles.body1,\r\n color: tokens.colorNeutralForeground3,\r\n },\r\n agreementContent: {\r\n ...typographyStyles.caption1,\r\n color: tokens.colorNeutralForeground3,\r\n },\r\n platformDropdown: {\r\n width: '100%',\r\n },\r\n infoButton: {\r\n width: tokens.spacingHorizontalL,\r\n height: tokens.spacingVerticalL,\r\n display: 'contents',\r\n '::before': {\r\n content: `\" *\"`,\r\n color: tokens.colorPaletteRedForeground3,\r\n },\r\n ':hover': {\r\n backgroundColor: 'transparent',\r\n },\r\n },\r\n skeletonWrapper: {\r\n width: '96px',\r\n marginTop: tokens.spacingVerticalSNudge,\r\n marginBottom: tokens.spacingVerticalSNudge,\r\n },\r\n urlPrefix: {\r\n backgroundColor: tokens.colorSubtleBackgroundSelected,\r\n color: tokens.colorNeutralStrokeAccessible,\r\n height: '28px',\r\n marginLeft: '-9px',\r\n paddingLeft: '10px',\r\n paddingRight: '6px',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n marginTop: '-1px',\r\n },\r\n});\r\n\r\nexport const useConnectAppDropdownStyles = makeStyles({\r\n containerWrapper: {\r\n '>span': {\r\n width: '100%',\r\n },\r\n },\r\n appSearchIcon: {\r\n transform: 'scaleX(-1)',\r\n },\r\n isHiding: {\r\n display: 'none',\r\n },\r\n optionCardWrapper: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n },\r\n optionCardSelectable: {\r\n minHeight: '64px',\r\n ':hover': {\r\n backgroundColor: tokens.colorNeutralBackground1Hover,\r\n cursor: 'pointer',\r\n },\r\n ...shorthands.borderRadius(tokens.borderRadiusNone),\r\n ...shorthands.padding(tokens.spacingHorizontalM, tokens.spacingHorizontalSNudge),\r\n },\r\n optionCardTitle: {\r\n marginLeft: tokens.spacingHorizontalSNudge,\r\n color: tokens.colorNeutralForeground1,\r\n },\r\n optionCardImgIcon: {\r\n width: '48px',\r\n },\r\n optionCardAppId: {},\r\n optionInnerWrapper: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-start',\r\n },\r\n optionInnerWrapperLower: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n color: tokens.colorNeutralForeground3,\r\n },\r\n infoMsgBar: {\r\n ...typographyStyles.caption1Strong,\r\n marginBottom: tokens.spacingVerticalXS,\r\n paddingTop: tokens.spacingVerticalXS,\r\n paddingBottom: tokens.spacingVerticalXS,\r\n },\r\n optionsWrapper: {\r\n maxHeight: '194px',\r\n overflowY: 'scroll',\r\n ...shorthands.padding(0),\r\n ...shorthands.gap(0),\r\n '::-webkit-scrollbar': {\r\n display: 'none',\r\n },\r\n '-ms-overflow-style': 'none',\r\n 'scrollbar-width': 'none',\r\n },\r\n});\r\nexport const useAppPropertyFinishPageStyles = makeStyles({\r\n title: {\r\n ...typographyStyles.subtitle1,\r\n },\r\n content: {\r\n color: tokens.colorNeutralForeground3,\r\n },\r\n root: {\r\n width: '800px',\r\n },\r\n cardTitle: {\r\n color: tokens.colorNeutralForeground1,\r\n },\r\n divider: {\r\n height: '96px',\r\n width: 'calc(100vw - 96px - 222px)', // 96px layout horizontal padding + 222px of stepper nav, nav will take 0px width in smaller screen\r\n [BreakPoints.ResponsiveMedium]: {\r\n width: 'calc(100vw - 96px)',\r\n },\r\n [BreakPoints.ResponsiveSmall]: {\r\n width: 'calc(100vw - 96px)',\r\n },\r\n [BreakPoints.ResponsiveExtraSmall]: {\r\n width: 'calc(100vw - 96px)',\r\n },\r\n },\r\n actionDivWrapper: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'flex-start',\r\n alignItems: 'center',\r\n '> img': {\r\n ...shorthands.padding(0, tokens.spacingHorizontalM, 0, 0),\r\n },\r\n },\r\n});\r\n","import { Body1Strong, Caption1, Card, Input, Skeleton, SkeletonItem, Spinner, mergeClasses } from '@fluentui/react-components';\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { Log } from '../../../../../../../../logging/src';\r\nimport { buildRequestHeadersWithAuthToken, getAppStore } from '../../../../../../../@data';\r\nimport { uiConfig } from '../../../../../../../config/ui.config';\r\nimport { useDebouncedValue } from '../../../../../../../hooks';\r\nimport useOnClickOutside from '../../../../../../../hooks/useOnClickOutside';\r\nimport { injectIntlAndObserver } from '../../../../../../../utils';\r\nimport messages from '../messages';\r\nimport SearchIcon from '../resources/SearchIcon.svg';\r\nimport { useConnectAppDropdownStyles } from './styles';\r\n\r\ntype ConnectAppDropdownProps = {\r\n inventoryAppStoreId: string;\r\n onChange: (value: string) => void;\r\n isSaving?: boolean;\r\n onChangeCallback?: (value: string) => void;\r\n} & InjectedIntlProps;\r\n\r\ntype ConnectAppDropdownType = React.FC<ConnectAppDropdownProps>;\r\n\r\nconst ConnectAppDropdown: ConnectAppDropdownType = ({\r\n inventoryAppStoreId,\r\n isSaving,\r\n onChange,\r\n onChangeCallback,\r\n intl: { formatMessage },\r\n}) => {\r\n const [searchString, setSearchString] = useState('');\r\n const [appOptions, setAppOptions] = useState([]); // TODO: update type\r\n const [selectedOption, setSelectedOption] = useState(undefined);\r\n const debouncedAppSearchString = useDebouncedValue(searchString, 500);\r\n const [shouldRenderOptions, setShouldRenderOptions] = useState(false);\r\n const [isSearching, setIsSearching] = useState(false);\r\n const { userContext } = getAppStore();\r\n const isEditMode = window.location.pathname.includes('editApp');\r\n const isOptionInitialized = useRef(false);\r\n const optionMenuRef = useRef<HTMLDivElement>(null);\r\n const classNames = useConnectAppDropdownStyles();\r\n useOnClickOutside(optionMenuRef, () => {\r\n setShouldRenderOptions(false);\r\n });\r\n const shouldInitializeOptions = isEditMode && !isOptionInitialized.current && inventoryAppStoreId;\r\n\r\n const fetchAppSearchData = async (searchedString, signal?: AbortSignal) => {\r\n if (searchedString.length) {\r\n const url = `${uiConfig.getApiBaseAddress('1.2')}/metadata/store?appId=${searchedString}&market=en-US`;\r\n try {\r\n setIsSearching(true);\r\n const headers = await buildRequestHeadersWithAuthToken(url, userContext);\r\n\r\n const response = await fetch(url, { method: 'GET', headers: headers, signal });\r\n if (!response.ok) {\r\n Log.error(`HTTP error! status: ${response.status}`);\r\n }\r\n const appSearchResult = await response.json();\r\n setAppOptions(appSearchResult.data.matchingApps);\r\n setShouldRenderOptions(true);\r\n if (!signal) {\r\n setSelectedOption(appSearchResult.data.matchingApps[0]);\r\n }\r\n } catch (error) {\r\n if (error.name === 'AbortError') {\r\n console.error('Fetch aborted:', searchedString);\r\n } else {\r\n Log.error(error);\r\n }\r\n } finally {\r\n setIsSearching(false);\r\n }\r\n } else {\r\n setAppOptions([]);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n // Create an instance of AbortController\r\n const controller = new AbortController();\r\n const signal = controller.signal;\r\n fetchAppSearchData(debouncedAppSearchString, signal);\r\n // Cleanup function that aborts the fetch when the component unmounts or debouncedAppSearchString changes\r\n return () => {\r\n controller.abort();\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [debouncedAppSearchString]);\r\n\r\n useEffect(() => {\r\n if (shouldInitializeOptions) {\r\n fetchAppSearchData(inventoryAppStoreId);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [shouldInitializeOptions]);\r\n\r\n const onOptionSelect = (option) => {\r\n setShouldRenderOptions(false);\r\n onChange(option.appId);\r\n setSelectedOption(option);\r\n setSearchString('');\r\n onChangeCallback?.(option.appName);\r\n };\r\n\r\n const renderAppCard = (option, isEditable) => {\r\n const content = (\r\n <>\r\n <div className={classNames.optionInnerWrapper}>\r\n <img className={classNames.optionCardImgIcon} src={option.iconImageUrl} alt={option.appName} />\r\n <Body1Strong block className={classNames.optionCardTitle}>\r\n {option.appName}\r\n </Body1Strong>\r\n </div>\r\n <div className={classNames.optionInnerWrapperLower}>\r\n <Caption1 className={classNames.optionCardAppId}>{option.appId}</Caption1>\r\n </div>\r\n </>\r\n );\r\n\r\n if (!isEditable) {\r\n return (\r\n <Card appearance=\"outline\" className={classNames.optionCardWrapper}>\r\n {content}\r\n </Card>\r\n );\r\n }\r\n return (\r\n <Card className={mergeClasses(classNames.optionCardWrapper, classNames.optionCardSelectable)} onClick={() => onOptionSelect(option)}>\r\n {content}\r\n </Card>\r\n );\r\n };\r\n\r\n const [\r\n shouldRenderSearchInput,\r\n shouldRenderAppPreviewForExistingInventory,\r\n shouldRenderAppOptionsDropdown,\r\n shouldRenderSelectedAppPreview,\r\n ] = useMemo(\r\n () => [!isEditMode, selectedOption, !isEditMode && shouldRenderOptions, !isEditMode && selectedOption && !shouldRenderOptions],\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [isEditMode, appOptions, shouldRenderOptions, selectedOption]\r\n );\r\n\r\n return (\r\n <>\r\n {isSaving && (\r\n <Skeleton>\r\n <SkeletonItem />\r\n </Skeleton>\r\n )}\r\n <div className={isSaving ? classNames.isHiding : classNames.containerWrapper}>\r\n {shouldRenderSearchInput && (\r\n <Input\r\n id=\"connectAppId\"\r\n value={searchString}\r\n placeholder={formatMessage(messages.appSearchFieldPlaceholder)}\r\n onClick={() => setShouldRenderOptions(true)}\r\n disabled={false}\r\n onChange={(_, data) => setSearchString(data.value.toUpperCase())}\r\n contentBefore={\r\n <img className={classNames.appSearchIcon} src={SearchIcon} alt={formatMessage(messages.appSearchFieldPlaceholder)} />\r\n }\r\n onBlur={(e) => {\r\n if (selectedOption && appOptions.length === 0) {\r\n setShouldRenderOptions(false);\r\n }\r\n }}\r\n contentAfter={isSearching ? <Spinner size=\"tiny\" /> : undefined}\r\n />\r\n )}\r\n\r\n {isEditMode ? (shouldRenderAppPreviewForExistingInventory && renderAppCard(selectedOption, false)) || <Spinner /> : <></>}\r\n\r\n {shouldRenderAppOptionsDropdown && appOptions.length > 0 && (\r\n <Card ref={optionMenuRef} className={classNames.optionsWrapper}>\r\n {appOptions.map((option) => renderAppCard(option, true))}\r\n </Card>\r\n )}\r\n\r\n {(shouldRenderSelectedAppPreview && renderAppCard(selectedOption, false)) || <></>}\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default injectIntlAndObserver<ConnectAppDropdownProps>(ConnectAppDropdown);\r\n","import {\r\n Body1,\r\n Button,\r\n Caption1,\r\n Checkbox,\r\n Dropdown,\r\n Field,\r\n FluentProvider,\r\n InfoLabel,\r\n Input,\r\n Label,\r\n LabelProps,\r\n MessageBar,\r\n Skeleton,\r\n SkeletonItem,\r\n Text,\r\n mergeClasses,\r\n webLightTheme,\r\n} from '@fluentui/react-components';\r\nimport React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { getAppStore, onHelpInfoCalloutOpened } from '../../../../../../../@data';\r\nimport { FormItem, FormState } from '../../../../../../../components/Form';\r\nimport { HelpcenterInfoBubbleV2 } from '../../../../../../../components/HelpcenterInfoBubbleV2';\r\nimport messages from '../messages';\r\nimport ConnectAppDropdown from './ConnectAppDropdown';\r\nimport { useAppPropertyDetailPageStyles } from './styles';\r\n\r\ntype AppPropertyDetailFormProps = {\r\n mode: FormState;\r\n appName: string;\r\n isAppNameInputDisabled: boolean;\r\n onAppNameChange: (value: string) => void;\r\n appUrl: string;\r\n isAppUrlInputDisabled: boolean;\r\n onAppUrlChange: (value: string) => void;\r\n appSearchString: string;\r\n onAppSearchStringChange: (value: string) => void;\r\n appAgreement: boolean;\r\n onAppAgreementChange: (value: boolean) => void;\r\n appSellerId: string;\r\n onAppSellerIdChange: (value: string) => void;\r\n inventoryAppStoreId: string;\r\n onInventoryAppStoreIdChange: (value: string) => void;\r\n isSaving: boolean;\r\n errorState: { appSellerId?: string; appName?: string; appUrl?: string };\r\n};\r\n\r\ntype AppPropertyDetaulFormType = React.FC<AppPropertyDetailFormProps & InjectedIntlProps>;\r\n\r\nconst AppPropertyDetailForm: AppPropertyDetaulFormType = ({\r\n intl: { formatMessage },\r\n onAppNameChange,\r\n appName,\r\n isAppNameInputDisabled,\r\n onAppUrlChange,\r\n appUrl,\r\n isAppUrlInputDisabled,\r\n appAgreement,\r\n onAppAgreementChange,\r\n appSellerId,\r\n onAppSellerIdChange,\r\n inventoryAppStoreId,\r\n onInventoryAppStoreIdChange,\r\n isSaving,\r\n errorState,\r\n}) => {\r\n const classNames = useAppPropertyDetailPageStyles();\r\n const isEditMode = window.location.pathname.includes('editApp');\r\n const { helpInfo, locale } = getAppStore();\r\n const renderSkeleton = () => (\r\n <Skeleton>\r\n <SkeletonItem />\r\n </Skeleton>\r\n );\r\n\r\n return (\r\n <>\r\n <FluentProvider theme={webLightTheme}>\r\n <FormItem>\r\n <Body1>{formatMessage(messages.appPlatformInfo)}</Body1>\r\n </FormItem>\r\n\r\n <FormItem id=\"appInventoryPlatform\">\r\n <Text block className={mergeClasses(classNames.textTitle, classNames.sectionTitleOffset)}>\r\n {formatMessage(messages.appPlatformTitleLabel)}\r\n </Text>\r\n <Dropdown className={classNames.platformDropdown} placeholder={formatMessage(messages.appPlatformWindowsUWPLabel)} disabled />\r\n </FormItem>\r\n\r\n <FormItem id=\"appInventoryConnectAppId\">\r\n <Field\r\n label={{\r\n children: (_: unknown, slotProps: LabelProps) => (\r\n <Label className={classNames.sectionTitleOffset}>\r\n {formatMessage(messages.appPlatformConnectLiveAppTitleLabel)}\r\n <Button\r\n className={classNames.infoButton}\r\n appearance=\"transparent\"\r\n onClick={() => onHelpInfoCalloutOpened('pop_PCv4_UniversalBlockSetting', locale)}\r\n >\r\n <InfoLabel info={<HelpcenterInfoBubbleV2 html={helpInfo} />} />\r\n </Button>\r\n </Label>\r\n ),\r\n }}\r\n aria-required={true}\r\n className={classNames.sectionTitle}\r\n >\r\n <ConnectAppDropdown inventoryAppStoreId={inventoryAppStoreId} onChange={onInventoryAppStoreIdChange} isSaving={isSaving} />\r\n </Field>\r\n </FormItem>\r\n\r\n <FormItem id=\"appInventoryName\">\r\n <Field\r\n label={formatMessage(messages.appNameFieldLabel)}\r\n required={true}\r\n aria-required={true}\r\n className={classNames.sectionTitle}\r\n {...(errorState.appName && { validationMessage: errorState.appName, validationState: 'error' })}\r\n >\r\n {isSaving ? (\r\n renderSkeleton()\r\n ) : (\r\n <Input\r\n id=\"appInventoryName\"\r\n value={appName}\r\n placeholder={formatMessage(messages.appNameFieldPlaceholder)}\r\n disabled={isAppNameInputDisabled}\r\n onChange={(_, data) => onAppNameChange(data.value.slice(0, 200))} // limit to 200 characters\r\n />\r\n )}\r\n </Field>\r\n </FormItem>\r\n\r\n {!isEditMode && (\r\n <FormItem id=\"appInventorySellerId\">\r\n <Field\r\n label={{\r\n children: (_: unknown, slotProps: LabelProps) => (\r\n <Label className={classNames.sectionTitleOffset}>\r\n {formatMessage(messages.appSellerIdFieldLabel)}\r\n <Button\r\n className={classNames.infoButton}\r\n appearance=\"transparent\"\r\n onClick={() => onHelpInfoCalloutOpened('pop_PCv4_SiteLevel', locale)}\r\n >\r\n <InfoLabel info={<HelpcenterInfoBubbleV2 html={helpInfo} />} />\r\n </Button>\r\n </Label>\r\n ),\r\n }}\r\n aria-required={true}\r\n className={classNames.sectionTitle}\r\n {...(errorState.appSellerId && { validationMessage: errorState.appSellerId, validationState: 'error' })}\r\n >\r\n {isSaving ? (\r\n renderSkeleton()\r\n ) : (\r\n <Input\r\n id=\"appInventorySellerId\"\r\n value={appSellerId}\r\n placeholder={formatMessage(messages.appSellerIdFieldPlaceholder)}\r\n disabled={isAppNameInputDisabled}\r\n onChange={(_, data) => onAppSellerIdChange(data.value)}\r\n />\r\n )}\r\n </Field>\r\n </FormItem>\r\n )}\r\n\r\n <FormItem id=\"appInventoryUrl\">\r\n <Field\r\n className={classNames.sectionTitle}\r\n label={formatMessage(messages.appUrlFieldLabel)}\r\n required={true}\r\n aria-required={true}\r\n {...(errorState.appUrl && { validationMessage: errorState.appUrl, validationState: 'error' })}\r\n >\r\n {isSaving ? (\r\n renderSkeleton()\r\n ) : (\r\n <Input\r\n type=\"url\"\r\n contentBefore={<span className={classNames.urlPrefix}>https://</span>}\r\n id=\"appInventoryUrl\"\r\n value={appUrl}\r\n placeholder={formatMessage(messages.appUrlFieldPlaceholder)}\r\n disabled={isAppUrlInputDisabled}\r\n onChange={(_, data) => onAppUrlChange(data.value)}\r\n />\r\n )}\r\n </Field>\r\n </FormItem>\r\n\r\n {!isEditMode && (\r\n <>\r\n <Field label={formatMessage(messages.appAgreement)} required={true} aria-required={true} className={classNames.sectionTitle} />\r\n <Caption1 block className={classNames.agreementContent}>\r\n {formatMessage(messages.appAgreementSection1)}\r\n </Caption1>\r\n <Caption1 block className={classNames.agreementContent}>\r\n {formatMessage(messages.appAgreementSection2)}\r\n </Caption1>\r\n {isSaving ? (\r\n <div className={classNames.skeletonWrapper}>{renderSkeleton()}</div>\r\n ) : (\r\n <Checkbox\r\n className={classNames.agreementTitle}\r\n id=\"appInventoryAgreement\"\r\n checked={appAgreement}\r\n label={formatMessage(messages.appAgreementCheckboxLabel)}\r\n onChange={(ev, data) => onAppAgreementChange(!!data.checked)}\r\n />\r\n )}\r\n <MessageBar className={classNames.infoMsgBar} intent=\"info\">\r\n <Caption1>{formatMessage(messages.coopaTnCInfo)}</Caption1>\r\n </MessageBar>\r\n </>\r\n )}\r\n </FluentProvider>\r\n </>\r\n );\r\n};\r\n\r\nexport default injectIntl(AppPropertyDetailForm);\r\n","import { Body1, Body1Strong, Body2, Button, Card, Divider, FluentProvider, webLightTheme } from '@fluentui/react-components';\r\nimport React from 'react';\r\nimport { useCMUIHelpExperience } from '../../../../../../../hooks/useCMUIHelpExperience';\r\nimport { IRouterWithIntl, injectRouterWithIntl } from '../../../../../../../utils';\r\nimport { getTythonAppAdunitCreationRoute } from '../../../../../../../utils/routeUtils';\r\nimport messages from '../messages';\r\nimport CreateAppIcon from '../resources/CreateAppIcon.svg';\r\nimport { useAppPropertyFinishPageStyles } from './styles';\r\n\r\ntype FinishPageType = React.FC<IRouterWithIntl>;\r\n\r\nconst FinishPage: FinishPageType = ({ intl: { formatMessage }, history }) => {\r\n const { CMUIPopupArticleByIdAnchor } = useCMUIHelpExperience();\r\n const classNames = useAppPropertyFinishPageStyles();\r\n return (\r\n <>\r\n <FluentProvider theme={webLightTheme}>\r\n <div className={classNames.root}>\r\n <Body1 className={classNames.content} block>\r\n {formatMessage(messages.finishPageExpectNextContent1)}\r\n </Body1>\r\n <br />\r\n <Body1 className={classNames.content} block>\r\n {formatMessage(messages.finishPageExpectNextContent2)}\r\n </Body1>\r\n <Body1 block>\r\n <CMUIPopupArticleByIdAnchor query=\"ext07504\" name={formatMessage(messages.finishPageExpectNextContentHelpLink)} />\r\n </Body1>\r\n <Divider className={classNames.divider} />\r\n <Body2 className={classNames.title} block>\r\n {formatMessage(messages.finishPageExpectNextTitle2)}\r\n </Body2>\r\n <br />\r\n <Card>\r\n <div className={classNames.actionDivWrapper}>\r\n <img src={CreateAppIcon} alt={formatMessage(messages.finishPageCardTitle)} />\r\n <div>\r\n <Body1Strong block className={classNames.cardTitle}>\r\n {formatMessage(messages.finishPageCardTitle)}\r\n </Body1Strong>\r\n <Body1 block className={classNames.content}>\r\n {formatMessage(messages.finishPageCardContent)}\r\n </Body1>\r\n <Button onClick={() => history.push(getTythonAppAdunitCreationRoute())}>\r\n <Body1Strong>{formatMessage(messages.finishPageActionButtonLabel)}</Body1Strong>\r\n </Button>\r\n </div>\r\n </div>\r\n </Card>\r\n </div>\r\n </FluentProvider>\r\n </>\r\n );\r\n};\r\n\r\nexport default injectRouterWithIntl(FinishPage);\r\n","import { useEffect, useMemo, useState } from 'react';\r\nimport { Log } from '../../../../../../../logging/src';\r\nimport { InventoryPlatformType, Property, listEntity, postEntity, putEntity } from '../../../../../../@data';\r\nimport { PropertyServingConfigs } from '../../../../../../@data/store/schema/models/ServingConfigs';\r\nimport { fetchPropertyById } from '../../../@data/services/PropertyService';\r\nimport messages from './messages';\r\n\r\nenum ErrorType {\r\n SellerIdDoesNotMatchApp = 'SellerIdDoesNotMatchApp',\r\n PropertyNameAlreadyExists = 'PropertyNameAlreadyExists',\r\n}\r\n\r\nconst useCreateTythonAppProperty = ({ mode, propertyId, publisher, userContext, formatMessage }) => {\r\n const [appName, setAppName] = useState<string>('');\r\n const [appUrl, setAppUrl] = useState<string>('');\r\n const [appSearchString, setAppSearchString] = useState<string>('');\r\n const [appAgreement, setAppAgreement] = useState<boolean>(false);\r\n const [appSellerId, setAppSellerId] = useState<string>('');\r\n const [isPropertyLoading, setIsPropertyLoading] = useState<boolean>(false);\r\n const [inventoryAppStoreId, setInventoryAppStoreId] = useState<string>(''); // TODO: update type\r\n const [rawProperty, setRawProperty] = useState<Property | undefined>(undefined); // TODO: update type\r\n const [rawPropertyServingConfigs, setRawPropertyServingConfigs] = useState<PropertyServingConfigs[] | undefined>(undefined);\r\n const [isSaving, setIsSaving] = useState<boolean>(false);\r\n const [errorState, setErrorState] = useState({ appSellerId: undefined, appName: undefined, appUrl: undefined });\r\n const isEditMode = propertyId;\r\n\r\n // clean up app url error state when updating url\r\n useEffect(() => {\r\n setErrorState({ ...errorState, appUrl: undefined });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [appUrl]);\r\n\r\n // clean up app seller id error state when updating seller id\r\n useEffect(() => {\r\n setErrorState({ ...errorState, appSellerId: undefined });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [appSellerId]);\r\n\r\n // clean up app name error state when updating app name\r\n useEffect(() => {\r\n setErrorState({ ...errorState, appName: undefined });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [appName]);\r\n\r\n const handlePropertyErrors = (error) => {\r\n try {\r\n const nextErrorState = { ...errorState };\r\n const errorMsg = Error(error).message.toString();\r\n if (errorMsg.includes(ErrorType.SellerIdDoesNotMatchApp)) {\r\n nextErrorState.appSellerId = formatMessage(messages.errorSellerIdDoesNotMatchApp);\r\n }\r\n if (errorMsg.includes(ErrorType.PropertyNameAlreadyExists)) {\r\n nextErrorState.appName = formatMessage(messages.errorPropertyNameAlreadyExists);\r\n }\r\n setErrorState(nextErrorState);\r\n } catch (e) {\r\n Log.error(`error in app inventory view: ${error}`);\r\n }\r\n };\r\n\r\n const onAppPropertyFormSubmit = async (action) => {\r\n let shouldRedirect = false;\r\n if (!isEditMode && rawPropertyServingConfigs?.some((p) => p.url === appUrl)) {\r\n setErrorState({ ...errorState, appUrl: formatMessage(messages.errorInventoryAppUrlAlreadyExists) });\r\n return;\r\n }\r\n if (!isEditMode && appUrl.includes('/')) {\r\n setErrorState({ ...errorState, appUrl: formatMessage(messages.appPropertyInvalidUrl) });\r\n return;\r\n }\r\n\r\n try {\r\n setIsSaving(true);\r\n const appProperty = {\r\n name: appName,\r\n className: 'properties',\r\n approvalStatus: 'Approved',\r\n approvalStatusComments: '',\r\n publisherId: publisher.id,\r\n url: appUrl,\r\n MicrosoftStoreAppId: inventoryAppStoreId,\r\n COPPAAgreement: appAgreement,\r\n inventoryPlatformType: InventoryPlatformType.UWP,\r\n associatedAdUnitIds: [],\r\n clarityType: 1,\r\n PartnerCenterSellerId: appSellerId,\r\n };\r\n\r\n if (isEditMode) {\r\n const property = await putEntity(\r\n [publisher],\r\n ({ ...appProperty, id: rawProperty?.id!, etag: rawProperty?.eTag } as unknown) as Property,\r\n userContext,\r\n Property\r\n );\r\n setRawProperty(property);\r\n action();\r\n } else {\r\n const property = await postEntity([publisher], Property, (appProperty as unknown) as Property, userContext);\r\n const appPropertyId = property.id;\r\n shouldRedirect = true;\r\n window.location.replace(`/ad-management/${publisher.id}/property/editApp/${appPropertyId}?step=1`);\r\n return Promise.resolve();\r\n }\r\n } catch (error) {\r\n handlePropertyErrors(error);\r\n } finally {\r\n !shouldRedirect && setIsSaving(false);\r\n }\r\n };\r\n\r\n const isValidAppInventoryCreation = useMemo(() => {\r\n if (isEditMode) {\r\n return appName.trim() !== '' && appUrl.trim() !== '' && inventoryAppStoreId.trim() !== '';\r\n }\r\n return appName.trim() !== '' && appUrl.trim() !== '' && appSellerId.trim() !== '' && inventoryAppStoreId.trim() !== '';\r\n }, [appName, appUrl, appSellerId, inventoryAppStoreId, isEditMode]);\r\n\r\n useEffect(() => {\r\n async function fetchPropertyData() {\r\n setIsPropertyLoading(true);\r\n if (isEditMode) {\r\n try {\r\n const fetchPropertyPromise = fetchPropertyById(publisher, propertyId, userContext);\r\n const propertyConfigsPromise = listEntity([publisher], userContext, PropertyServingConfigs);\r\n const [savedProperty, propertyConfigs] = await Promise.all([fetchPropertyPromise, propertyConfigsPromise]);\r\n const propertyConfig = propertyConfigs.find((p) => p.propertyId.toString() === propertyId);\r\n setRawPropertyServingConfigs(propertyConfigs);\r\n setAppName(savedProperty.name! as string);\r\n setAppUrl(savedProperty.url! as string);\r\n setInventoryAppStoreId(propertyConfig?.MicrosoftStoreAppId! as string);\r\n setRawProperty(savedProperty);\r\n setAppAgreement(savedProperty.COPPAAgreement! as boolean);\r\n } catch (error) {\r\n handlePropertyErrors(error);\r\n } finally {\r\n setIsPropertyLoading(false);\r\n }\r\n } else {\r\n try {\r\n const propertyServingConfigs = await listEntity([publisher], userContext, PropertyServingConfigs);\r\n setRawPropertyServingConfigs(propertyServingConfigs);\r\n } catch (error) {\r\n console.error(error);\r\n } finally {\r\n setIsPropertyLoading(false);\r\n }\r\n }\r\n }\r\n fetchPropertyData();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const appPropertyFormProps = {\r\n mode,\r\n appName: isPropertyLoading ? formatMessage(messages.loadingLabel) : appName,\r\n onAppNameChange: setAppName,\r\n isAppNameInputDisabled: isPropertyLoading,\r\n appUrl: isPropertyLoading ? formatMessage(messages.loadingLabel) : appUrl,\r\n onAppUrlChange: setAppUrl,\r\n isAppUrlInputDisabled: isPropertyLoading || isEditMode,\r\n appSearchString,\r\n onAppSearchStringChange: setAppSearchString,\r\n appAgreement,\r\n onAppAgreementChange: setAppAgreement,\r\n appSellerId,\r\n onAppSellerIdChange: setAppSellerId,\r\n inventoryAppStoreId,\r\n onInventoryAppStoreIdChange: setInventoryAppStoreId,\r\n isSaving,\r\n errorState,\r\n };\r\n\r\n return {\r\n isValidAppInventoryCreation,\r\n appPropertyFormProps,\r\n onAppPropertyFormSubmit,\r\n };\r\n};\r\n\r\nexport default useCreateTythonAppProperty;\r\n","import React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\nimport { getAppStore } from '../../../../../../@data';\r\nimport { FormState } from '../../../../../../components/Form';\r\nimport { DetailPageWithStepper } from '../../../../../../layout/DetailPageWithStepper/DetailPageWithStepper';\r\nimport { IStepperStep } from '../../../../../../layout/DetailPageWithStepper/DetailPageWithStepper.types';\r\nimport { injectRouterAndIntlWithObserver } from '../../../../../../utils';\r\nimport { getTythonInventoryPage } from '../../../../../../utils/routeUtils';\r\nimport { AdsTextPage } from '../CreateTythonProperty/components/AdsTextPage';\r\nimport AppPropertyDetailForm from './components/AppPropertyDetailForm';\r\nimport FinishPage from './components/FinishPage';\r\nimport messages from './messages';\r\nimport useCreateTythonAppProperty from './useCreateTythonAppProperty';\r\n\r\ntype CreateTythonAppPropertyProps = {\r\n mode: FormState;\r\n};\r\n\r\ntype CreateTythonAppPropertyType = React.FC<CreateTythonAppPropertyProps & InjectedIntlProps & RouteComponentProps>;\r\n\r\nconst CreateTythonAppProperty: CreateTythonAppPropertyType = ({ mode, intl: { formatMessage }, history, location, match }) => {\r\n const { id: propertyId } = match.params as { id: string };\r\n const { publisher, userContext } = getAppStore();\r\n const { appPropertyFormProps, isValidAppInventoryCreation, onAppPropertyFormSubmit } = useCreateTythonAppProperty({\r\n mode,\r\n propertyId,\r\n publisher,\r\n userContext,\r\n formatMessage,\r\n });\r\n\r\n const steps: IStepperStep[] = [\r\n {\r\n name: formatMessage(messages.CreateSiteStep),\r\n title: formatMessage(messages.CreateSiteStepFormTitle),\r\n component: <AppPropertyDetailForm {...appPropertyFormProps} />,\r\n // helpId: 'pop_PCv4_UniversalBlockSetting', //TODO: update help id for App inventory\r\n isNextDisabled: !!!isValidAppInventoryCreation || appPropertyFormProps.isSaving,\r\n isStepDirty: propertyId !== undefined, // TODO: update dirty flag\r\n onNext: onAppPropertyFormSubmit,\r\n },\r\n {\r\n name: formatMessage(messages.AdsTxtCreationStep),\r\n title: formatMessage(messages.AdsTxtCreationStepTitle),\r\n isStepDirty: propertyId !== undefined,\r\n component: <AdsTextPage history={history} location={location} match={match} />,\r\n },\r\n {\r\n name: formatMessage(messages.finishStepperTittle),\r\n title: formatMessage(messages.getCodeTitle),\r\n component: <FinishPage />,\r\n isStepDirty: propertyId !== undefined,\r\n onNext: () => history.push(getTythonInventoryPage(true)),\r\n },\r\n ];\r\n\r\n return (\r\n <>\r\n <DetailPageWithStepper\r\n openStep={window.location.search.includes('step=1') ? 1 : 0}\r\n process={mode === FormState.MultiStepCreation ? formatMessage(messages.processNameCreate) : formatMessage(messages.processNameEdit)}\r\n steps={steps}\r\n pageMode={mode}\r\n backToBase={() => history.goBack()}\r\n history={history}\r\n location={location}\r\n match={match}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nexport default injectRouterAndIntlWithObserver(CreateTythonAppProperty);\r\n","import * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { Route, RouteComponentProps, Switch } from 'react-router-dom';\r\nimport { isTythonSelfServeUser } from '../../../@data';\r\nimport { RoutePrefix } from '../../../Routes';\r\nimport { FormState } from '../../../components/Form';\r\nimport { injectIntlWithObserver } from '../../../utils';\r\nimport { RouteName } from '../@data';\r\nimport { onCurrentRouteChanged } from '../@data/actions';\r\nimport './@data/orchestrators';\r\nimport { CreateProperty } from './Create/variations/CreateNonTythonProperty';\r\nimport CreateTythonAppProperty from './Create/variations/CreateTythonAppProperty';\r\nimport { CreateTythonProperty } from './Create/variations/CreateTythonProperty';\r\nimport { ManagePage } from './Manage';\r\n\r\nexport const PropertyPage = injectIntlWithObserver((props: RouteComponentProps & InjectedIntlProps) => {\r\n const isTythonUser = isTythonSelfServeUser();\r\n\r\n const getRedirectionPage = (operation: FormState, componentProps: RouteComponentProps, isAppProperty = false) => {\r\n if (isTythonUser) {\r\n const mode = operation === FormState.Create ? FormState.MultiStepCreation : FormState.MultiStepEdit;\r\n if (isAppProperty) {\r\n // @ts-ignore\r\n return <CreateTythonAppProperty mode={mode} />;\r\n }\r\n return <CreateTythonProperty {...componentProps} mode={mode} />;\r\n } else {\r\n const mode = operation === FormState.Create ? FormState.Create : FormState.Edit;\r\n return <CreateProperty {...componentProps} mode={mode} />;\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n onCurrentRouteChanged(RouteName.property, props.intl.formatMessage);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <React.Fragment>\r\n <Switch>\r\n <Route exact path={`${props.match.url}`} component={ManagePage} />\r\n <Route\r\n exact\r\n path={`/${RoutePrefix.adManagement}/:publisherId/${RouteName[RouteName.property]}/create`}\r\n render={(componentProps) => getRedirectionPage(FormState.Create, componentProps)}\r\n />\r\n <Route\r\n path={`/${RoutePrefix.adManagement}/:publisherId/${RouteName[RouteName.property]}/create/:id`}\r\n render={(componentProps) => getRedirectionPage(FormState.Create, componentProps)}\r\n />\r\n <Route\r\n path={`/${RoutePrefix.adManagement}/:publisherId/${RouteName[RouteName.property]}/edit/:id`}\r\n render={(componentProps) => getRedirectionPage(FormState.Edit, componentProps)}\r\n />\r\n <Route\r\n path={`/${RoutePrefix.adManagement}/:publisherId/${RouteName[RouteName.property]}/createApp`}\r\n render={(componentProps) => getRedirectionPage(FormState.Create, componentProps, true)}\r\n />\r\n <Route\r\n path={`/${RoutePrefix.adManagement}/:publisherId/${RouteName[RouteName.property]}/editApp/:id`}\r\n render={(componentProps) => getRedirectionPage(FormState.Create, componentProps, true)}\r\n />\r\n </Switch>\r\n </React.Fragment>\r\n );\r\n});\r\n","import { isPublisherRejectionUnappealable, isTythonSelfServeUser } from '../../../../@data';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { IRoute } from '../../../../Routes.types';\r\nimport { BaseReportPage } from '../../../report/BaseReportPage';\r\nimport { AccountPage } from '../../Account';\r\nimport { LazyAdBlockPage } from '../../AdBlock/LazyAdBlockPage';\r\nimport { AdFilterPage } from '../../AdFilter/AdFilterPage';\r\nimport { AdQualityPage } from '../../AdQuality/AdQualityPage';\r\nimport { TythonAppManagePage } from '../../Ads/Manage';\r\nimport { AdunitPage } from '../../Adunit/AdunitPage';\r\nimport { ChannelPage } from '../../Channel/ChannelPage';\r\nimport { HomePage } from '../../Home/HomePage';\r\nimport { TythonInventoryManagePage } from '../../Inventory/Manage';\r\nimport { PropertyPage } from '../../Property';\r\nimport { RouteName } from '../store/store';\r\n\r\nexport function getRoutes(formatMessage): IRoute[] {\r\n const routes: IRoute[] = [\r\n {\r\n key: RouteName[RouteName.adunit],\r\n text: formatMessage(AppMessages.navAdUnits),\r\n icon: 'AdUnit',\r\n disabled: isPublisherRejectionUnappealable(),\r\n component: AdunitPage,\r\n },\r\n {\r\n key: RouteName[RouteName.channel],\r\n text: formatMessage(AppMessages.navChannels),\r\n icon: 'AdUnitChannel',\r\n component: ChannelPage,\r\n },\r\n {\r\n key: RouteName[RouteName.adfilter],\r\n text: formatMessage(AppMessages.navAdFilters),\r\n icon: 'Filter',\r\n component: AdFilterPage,\r\n },\r\n {\r\n key: RouteName[RouteName.property],\r\n text: isTythonSelfServeUser() ? formatMessage(AppMessages.navSites) : formatMessage(AppMessages.navProperties),\r\n icon: isTythonSelfServeUser() ? 'Favicon' : 'BusinessHoursSign',\r\n component: PropertyPage,\r\n disabled: isPublisherRejectionUnappealable(),\r\n },\r\n {\r\n key: RouteName[RouteName.adquality],\r\n text: formatMessage(AppMessages.navAdQuality),\r\n icon: 'Blocked',\r\n component: AdQualityPage,\r\n },\r\n ];\r\n\r\n if (isTythonSelfServeUser()) {\r\n routes.unshift({\r\n key: RouteName[RouteName.home],\r\n text: formatMessage(AppMessages.navHome),\r\n icon: 'Home',\r\n component: HomePage,\r\n });\r\n routes.push({\r\n key: RouteName[RouteName.inventory],\r\n text: formatMessage(AppMessages.navInventory),\r\n icon: 'Inventory',\r\n disabled: isPublisherRejectionUnappealable(),\r\n component: (TythonInventoryManagePage as unknown) as React.ComponentType,\r\n });\r\n routes.push({\r\n key: RouteName[RouteName.ads],\r\n text: formatMessage(AppMessages.navAds),\r\n icon: 'Ads',\r\n disabled: isPublisherRejectionUnappealable(),\r\n component: (TythonAppManagePage as unknown) as React.ComponentType,\r\n });\r\n routes.push({\r\n key: RouteName[RouteName.adblock],\r\n text: formatMessage(AppMessages.navAdBlocks),\r\n disabled: isPublisherRejectionUnappealable(),\r\n icon: 'AdUnitBlock',\r\n component: LazyAdBlockPage,\r\n });\r\n routes.push({\r\n key: RouteName[RouteName.dashboard],\r\n text: formatMessage(AppMessages.navReports),\r\n icon: 'CRMReport',\r\n disabled: isPublisherRejectionUnappealable(),\r\n component: BaseReportPage,\r\n });\r\n routes.push({\r\n key: RouteName[RouteName.publisherProfile],\r\n text: formatMessage(AppMessages.navAccount),\r\n icon: 'AccountManagement',\r\n component: AccountPage,\r\n disabled: isPublisherRejectionUnappealable(),\r\n });\r\n }\r\n\r\n return routes;\r\n}\r\n","import React from 'react';\r\nimport { LazyComponent } from '../../../components/LazyComponents';\r\n// @ts-ignore\r\nconst ProfilePageLazy = React.lazy(() => import('./ProfilePage'));\r\n\r\nexport function LazyProfilePage() {\r\n return <LazyComponent lazyComponent={<ProfilePageLazy />} />;\r\n}\r\n","import { action } from 'satcheljs';\r\nimport { UserInvitation } from '../../../../../../@data';\r\n\r\nexport const onUserInvited = action('onUserInvited');\r\n\r\nexport const onResendUserInvitation = action('onResendUserInvitation', (userInvite: UserInvitation) => ({ userInvite }));\r\n\r\nexport const onDeleteUserInvitation = action('onDeleteUserInvitation', (userInvite: UserInvitation) => ({ userInvite }));\r\n\r\nexport const loadUserInvitations = action('loadUserInvitations');\r\n\r\nexport const dismissUserInvitePanel = action('dismissUserInvitePanel');\r\n","import { createStore } from 'satcheljs';\r\nimport { IStringDictionary, User, UserInvitation } from '../../../../../@data';\r\nimport { EN_LOCALE_KEY, LOCAL_STORAGE_LOCALE } from '../../../../../constants';\r\nimport { IUserInviteViewModel } from './schema/UserInviteViewModel';\r\n\r\nexport interface IUserInvitationState {\r\n userInviteErrors?: IStringDictionary;\r\n userInvitePanelOpen: boolean;\r\n selectedItem?: User;\r\n userInvitations: UserInvitation[];\r\n userInviteViewModel: IUserInviteViewModel;\r\n}\r\n\r\nexport const getUserInvitationStore = createStore<IUserInvitationState>('UserInvitationState', {\r\n userInviteErrors: {},\r\n userInvitePanelOpen: false,\r\n userInvitations: [],\r\n userInviteViewModel: {\r\n recipientPreferredLang: localStorage.getItem(LOCAL_STORAGE_LOCALE) ?? EN_LOCALE_KEY,\r\n },\r\n});\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { Log } from '../../../../../../../logging/src';\r\nimport { IStringDictionary, UserInvitation } from '../../../../../../@data';\r\nimport { getUserInvitationStore } from '../store';\r\n\r\nexport const setUserInvitationErrors = mutatorAction('setUserInvitationErrors', (errors?: IStringDictionary) => {\r\n getUserInvitationStore().userInviteErrors = errors;\r\n});\r\n\r\nexport const setUserInvitationPanelStatus = mutatorAction('setUserInvitationPanelStatus', (isPanelOpen: boolean) => {\r\n getUserInvitationStore().userInvitePanelOpen = isPanelOpen;\r\n});\r\n\r\nexport const setUserInvitations = mutatorAction('setUserInvitations', (userInvitations?: UserInvitation[]) => {\r\n getUserInvitationStore().userInvitations = userInvitations || [];\r\n});\r\n\r\nexport const updateUserInvitationExpiry = mutatorAction('updateUserInvitationExpiry', (id: number, date: Date) => {\r\n const { userInvitations } = getUserInvitationStore();\r\n\r\n const userInvitation = userInvitations?.find((ui) => ui.id === id);\r\n if (userInvitation) {\r\n userInvitation.expirationDate = date;\r\n\r\n getUserInvitationStore().userInvitations = [...userInvitations];\r\n Log.info(`Updated user invitation expiry date to ${userInvitation.expirationDate}`);\r\n }\r\n});\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { UserRole } from '../../../../../../@data';\r\nimport { getUserInvitationStore } from '../store';\r\n\r\nexport const setFirstName = mutatorAction('setFirstName', (value: string) => {\r\n getUserInvitationStore().userInviteViewModel.firstName = value;\r\n});\r\n\r\nexport const setLastName = mutatorAction('setLastName', (value: string) => {\r\n getUserInvitationStore().userInviteViewModel.lastName = value;\r\n});\r\n\r\nexport const updateEmail = mutatorAction('updateEmail', (value: string) => {\r\n getUserInvitationStore().userInviteViewModel.email = value;\r\n});\r\n\r\nexport const updateRecipientPreferredLanguage = mutatorAction('updateRecipientPreferredLanguage', (value: string) => {\r\n getUserInvitationStore().userInviteViewModel.recipientPreferredLang = value;\r\n});\r\n\r\nexport const updateRole = mutatorAction('updateRole', (value: UserRole) => {\r\n getUserInvitationStore().userInviteViewModel.userRole = value;\r\n});\r\n\r\nexport const onFormCleared = mutatorAction('onFormCleared', () => {\r\n getUserInvitationStore().userInviteViewModel = {};\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n invite: {\r\n id: 'userInvitations.invite',\r\n defaultMessage: 'Invite',\r\n },\r\n inviteUser: {\r\n id: 'userInvitations.inviteUser',\r\n defaultMessage: 'Invite user',\r\n },\r\n resend: {\r\n id: 'userInvitations.resend',\r\n defaultMessage: 'Resend',\r\n },\r\n send: {\r\n id: 'userInvitations.send',\r\n defaultMessage: 'Send invite',\r\n },\r\n expirationDate: {\r\n id: 'userInvitations.expirationDate',\r\n defaultMessage: 'Invitation expiration date',\r\n },\r\n panelDescription: {\r\n id: 'userInvitations.panelDescription',\r\n defaultMessage: `Provide the email address and select the user role for the person you'd like to invite.`,\r\n },\r\n inviteUserEmailTitle: {\r\n id: 'userInvitations.inviteUserEmailTitle',\r\n defaultMessage: 'Email',\r\n },\r\n recipientPreferredLanguageTitle: {\r\n id: 'userInvitations.inviteUserRecipientPreferredLangTitle',\r\n defaultMessage: \"Recipient's preferred language\",\r\n },\r\n emailPlaceholder: {\r\n id: 'userInvitations.emailPlaceholder',\r\n defaultMessage: 'Email address',\r\n },\r\n pending: {\r\n id: 'userInvitations.pending',\r\n defaultMessage: 'Pending',\r\n },\r\n expired: {\r\n id: 'userInvitations.expired',\r\n defaultMessage: 'Expired',\r\n },\r\n firstNameTitle: {\r\n id: 'userInvitations.firstNameTitle',\r\n defaultMessage: 'First name',\r\n },\r\n lastNameTitle: {\r\n id: 'userInvitations.lastNameTitle',\r\n defaultMessage: 'Last name',\r\n },\r\n zeroInvitationsTitle: {\r\n id: 'userInvitations.zeroInvitationsTitle',\r\n defaultMessage: 'No pending invitations',\r\n },\r\n failedToFetchInvitedUser: {\r\n id: 'userInvitations.failedToFetchInvitedUserDetails',\r\n defaultMessage: 'Failed to fetch invited user details',\r\n },\r\n invalidState: {\r\n id: 'userInvitations.invalidState',\r\n defaultMessage: 'You have arrived in an invalid state, please re-login or report if issue persists.',\r\n },\r\n resendEmailInviteFailed: {\r\n id: 'resendEmailInvite.failed',\r\n defaultMessage: 'We’re unable to resend the user invitation email at this time. Please try again later.',\r\n },\r\n userInvitedNewUserSuccessfully: {\r\n id: 'userInvitations.invitedNewUserSuccessfully',\r\n defaultMessage: 'Invited new user successfully!',\r\n },\r\n userInvitedNewUserFailed: {\r\n id: 'userInvitations.inviteNewUserFailed',\r\n defaultMessage: 'Submitting the user invitation form caught an error \"{error}\"',\r\n },\r\n userInvitationResendSuccessfully: {\r\n id: 'userInvitations.resendInvitationSuccessfully',\r\n defaultMessage: 'Resend user invitation to {email} successfully',\r\n },\r\n userInvitationInvalidState: {\r\n id: 'userInvitation.deleteUserInvalidState',\r\n defaultMessage: 'You have arrived in an invalid state, please report.',\r\n },\r\n userInvitationDeletedInvitationSuccessfully: {\r\n id: 'userInvitation.deletedUserInvitationSuccessfully',\r\n defaultMessage: 'Deleted invitation for {email} successfully',\r\n },\r\n userInvitationDeletingUserInvitation: {\r\n id: 'userInvitation.deletingUserInvitation',\r\n defaultMessage: 'Deleting user invitation',\r\n },\r\n userInvitationInvalidStateReportOrLogin: {\r\n id: 'userInvitation.userInvitationInvalidStateReportOrLogin',\r\n defaultMessage: 'You have arrived in an invalid state, please re-login or report if issue persists.',\r\n },\r\n userInviteFormFailed: {\r\n id: 'userInvitation.userInviteFormFailed',\r\n defaultMessage: 'User Invite form has {count} errors, please fix them to continue.',\r\n },\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../../logging/src';\r\nimport { deleteEntity, getAppStore, UserInvitation } from '../../../../../../@data';\r\nimport {\r\n showErrorToastNotification,\r\n showInfoToastNotification,\r\n showSuccessToastNotification,\r\n} from '../../../../../../@data/mutatorActions';\r\nimport messages from '../../UserInvitations.messages';\r\nimport { onDeleteUserInvitation } from '../actions/userInvitationActions';\r\nimport { setUserInvitations } from '../mutatorActions';\r\nimport { getUserInvitationStore } from '../store';\r\n\r\norchestrator(onDeleteUserInvitation, async ({ userInvite }) => {\r\n const { publisher, userContext } = getAppStore();\r\n\r\n if (userInvite && publisher && userContext) {\r\n const entityInstance = new UserInvitation(userInvite.id);\r\n\r\n try {\r\n showInfoToastNotification({ textMessageDescriptor: messages.userInvitationDeletingUserInvitation });\r\n await deleteEntity([publisher, entityInstance], undefined, userContext);\r\n\r\n const { userInvitations } = getUserInvitationStore();\r\n setUserInvitations(userInvitations.filter((ui) => ui.id !== userInvite.id));\r\n\r\n showSuccessToastNotification({\r\n textMessageDescriptor: messages.userInvitationDeletedInvitationSuccessfully,\r\n intlMessageValues: { email: userInvite.email },\r\n });\r\n } catch (e) {\r\n Log.error(e);\r\n }\r\n } else {\r\n showErrorToastNotification({ textMessageDescriptor: messages.userInvitationInvalidState });\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { dismissUserInvitePanel } from '../actions/userInvitationActions';\r\nimport { onFormCleared, setUserInvitationErrors, setUserInvitationPanelStatus } from '../mutatorActions';\r\n\r\norchestrator(dismissUserInvitePanel, () => {\r\n setUserInvitationPanelStatus(false);\r\n setUserInvitationErrors();\r\n onFormCleared();\r\n});\r\n","import { action } from 'satcheljs';\r\nimport { UserRole } from '../../../../../../@data';\r\n\r\nexport const onUserRoleChanged = action('onUserRoleChanged', (role: UserRole) => ({ role }));\r\n\r\nexport const onUsersDeleted = action(\r\n 'onUsersDeleted',\r\n (\r\n formatMessage: (\r\n messageDescriptor: ReactIntl.FormattedMessage.MessageDescriptor,\r\n values?:\r\n | {\r\n [key: string]: ReactIntl.MessageValue;\r\n }\r\n | undefined\r\n ) => string\r\n ) => ({ formatMessage })\r\n);\r\n\r\nexport const loadUsers = action('loadUsers');\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../../logging/src';\r\nimport { getAppStore, listEntity, onLoadingChanged, showErrorToastNotification, UserInvitation } from '../../../../../../@data';\r\nimport { loadUsers } from '../../../Users/@data/actions/usersTabActions';\r\nimport messages from '../../UserInvitations.messages';\r\nimport { setUserInvitations } from '../mutatorActions';\r\n\r\norchestrator(loadUsers, async () => {\r\n const { userContext, publisher } = getAppStore();\r\n Log.debug('Loading user invitations');\r\n\r\n if (userContext && publisher) {\r\n try {\r\n onLoadingChanged(true);\r\n\r\n const userInvitations = await listEntity([publisher], userContext, UserInvitation);\r\n setUserInvitations(userInvitations);\r\n } catch (e) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.failedToFetchInvitedUser });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n showErrorToastNotification({ textMessageDescriptor: messages.invalidState });\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../../logging/src';\r\nimport {\r\n getAppStore,\r\n onNotificationChanged,\r\n postEntity,\r\n showErrorToastNotification,\r\n showSuccessToastNotification,\r\n UserInvitation,\r\n UserInvitationResend,\r\n} from '../../../../../../@data';\r\nimport messages from '../../UserInvitations.messages';\r\nimport { onResendUserInvitation } from '../actions/userInvitationActions';\r\nimport { updateUserInvitationExpiry } from '../mutatorActions';\r\n\r\norchestrator(onResendUserInvitation, async (msg) => {\r\n const { publisher, userContext } = getAppStore();\r\n\r\n if (publisher && userContext) {\r\n const newInvite = new UserInvitation();\r\n newInvite.id = msg.userInvite.id;\r\n try {\r\n await postEntity([publisher, newInvite], UserInvitationResend, newInvite, userContext);\r\n\r\n /* Updating the user invitation expiry date on successful resend */\r\n updateUserInvitationExpiry(msg.userInvite.id, new Date(new Date().setDate(new Date().getDate() + 30)));\r\n\r\n showSuccessToastNotification({\r\n textMessageDescriptor: messages.userInvitationResendSuccessfully,\r\n intlMessageValues: { email: msg.userInvite.email },\r\n });\r\n } catch (e) {\r\n Log.error(`Failed to resend email invite, error: ${JSON.stringify(e)}`);\r\n showErrorToastNotification({ textMessageDescriptor: messages.resendEmailInviteFailed });\r\n }\r\n } else {\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n textMessageDescriptor: messages.userInvitationInvalidStateReportOrLogin,\r\n });\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport {\r\n getAppStore,\r\n onNotificationChanged,\r\n onSavingChanged,\r\n postEntity,\r\n showErrorToastNotification,\r\n showSuccessToastNotification,\r\n UserInvitation,\r\n UserInvitationType,\r\n UserRole,\r\n UserRoleEntityType,\r\n} from '../../../../../../@data';\r\nimport { reverseLocales } from '../../../../../../config/locale';\r\nimport { validateSchema } from '../../../../../../utils';\r\nimport { userRoleToRoleIdMap } from '../../../utils/userRoleUtils';\r\nimport messages from '../../UserInvitations.messages';\r\nimport { onUserInvited } from '../actions/userInvitationActions';\r\nimport { onFormCleared, setUserInvitationErrors, setUserInvitationPanelStatus, setUserInvitations } from '../mutatorActions';\r\nimport { UserInviteErrorModel } from '../schema/UserInviteErrorModel';\r\nimport { getUserInvitationStore } from '../store';\r\n\r\norchestrator(onUserInvited, async () => {\r\n const { publisher, account, userContext } = getAppStore();\r\n const userInvite = getUserInvitationStore().userInviteViewModel;\r\n\r\n if (publisher && userContext) {\r\n try {\r\n onSavingChanged(true);\r\n try {\r\n await validateSchema(UserInviteErrorModel(), userInvite);\r\n\r\n setUserInvitationErrors();\r\n } catch (e) {\r\n setUserInvitationErrors(e);\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n textMessageDescriptor: messages.userInviteFormFailed,\r\n intlMessageValues: { count: Object.keys(e).length },\r\n });\r\n return;\r\n }\r\n\r\n if (userInvite.userRole) {\r\n const entity = new UserInvitation();\r\n entity.firstName = userInvite.firstName;\r\n entity.lastName = userInvite.lastName;\r\n entity.email = userInvite.email;\r\n entity.userInvitationType = UserInvitationType.PubCenterSelfServeUser;\r\n entity.lcid =\r\n userInvite.recipientPreferredLang && reverseLocales[userInvite.recipientPreferredLang]\r\n ? reverseLocales[userInvite.recipientPreferredLang]\r\n : 1033;\r\n entity.entityRoles = [\r\n {\r\n entityId: publisher.id,\r\n userRole: userInvite.userRole,\r\n entityType: UserRoleEntityType.Customer,\r\n },\r\n ];\r\n\r\n if ([UserRole.AccountManager, UserRole.ReportUser].includes(userInvite.userRole) && account) {\r\n entity.entityRoles.push({\r\n entityId: account.id,\r\n userRole: userInvite.userRole,\r\n entityType: UserRoleEntityType.Account,\r\n });\r\n }\r\n\r\n const response = await postEntity([publisher], UserInvitation, entity, userContext);\r\n\r\n if (response) {\r\n const date = new Date();\r\n // Updating the expiry date to 30 days from the time of invitaion sent\r\n date.setDate(date.getDate() + 30);\r\n entity.expirationDate = date;\r\n const userRoleId = userInvite.userRole ? userRoleToRoleIdMap.get(userInvite.userRole) : undefined;\r\n entity.roleIds = userRoleId ? [userRoleId] : [];\r\n entity.id = response;\r\n\r\n const { userInvitations } = getUserInvitationStore();\r\n setUserInvitations([...userInvitations, entity]);\r\n\r\n setUserInvitationPanelStatus(false);\r\n onFormCleared();\r\n }\r\n\r\n showSuccessToastNotification({ textMessageDescriptor: messages.userInvitedNewUserSuccessfully });\r\n }\r\n } catch (e) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.userInvitedNewUserFailed, intlMessageValues: { error: e } });\r\n } finally {\r\n onSavingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n textMessageDescriptor: messages.userInvitationInvalidStateReportOrLogin,\r\n });\r\n }\r\n});\r\n","import { mixed, object, string } from 'yup';\r\nimport { UserRole } from '../../../../../../@data';\r\nimport { IUserInviteViewModel } from './UserInviteViewModel';\r\n\r\nexport function UserInviteErrorModel() {\r\n return object<IUserInviteViewModel>().shape({\r\n firstName: string().trim().required(),\r\n lastName: string().trim().required(),\r\n email: string().email().required(),\r\n recipientPreferredLang: string().trim().required(),\r\n userRole: mixed()\r\n .oneOf([\r\n UserRole.AccountManager,\r\n UserRole.AdView,\r\n UserRole.ListManager,\r\n UserRole.PublisherAdmin,\r\n UserRole.ReportUser,\r\n UserRole.SuperAdmin,\r\n ])\r\n .required(),\r\n });\r\n}\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubCenterFonts, IPubcenterSpacing } from '../../../../theme';\r\n\r\nexport interface IUserManagementStyles {\r\n root: string;\r\n actionButtonsWrapper: string;\r\n roleDesc: string;\r\n}\r\n\r\nexport const getClassNames = (): IUserManagementStyles => {\r\n const theme = getTheme();\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const fonts = theme.fonts as IPubCenterFonts;\r\n\r\n return mergeStyleSets({\r\n root: {\r\n marginTop: spacing.size32,\r\n },\r\n actionButtonsWrapper: {\r\n display: 'flex',\r\n gap: spacing.size8,\r\n flexWrap: 'wrap',\r\n },\r\n roleDesc: {\r\n paddingLeft: spacing.size24,\r\n paddingTop: spacing.size4,\r\n ...fonts.size12,\r\n color: theme.palette.neutralSecondary,\r\n },\r\n });\r\n};\r\n","import UserMessages from '../UserManagement.messages';\r\n\r\nimport { ActionButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { UserInvitation } from '../../../../@data';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { GridCell } from '../../../../components/GridWithCustomColumns';\r\nimport { IGridV2Column } from '../../../../layout/GridPageV2';\r\nimport { getClassNames } from '../UserManagement.styles';\r\nimport { getUserRoleMapping } from '../utils/userRoleUtils';\r\nimport { onDeleteUserInvitation, onResendUserInvitation } from './@data/actions/userInvitationActions';\r\nimport UserInvitationsMessages from './UserInvitations.messages';\r\n\r\nexport function getColumns(intl, longestEmailLength): IGridV2Column[] {\r\n const { formatMessage } = intl;\r\n const { actionButtonsWrapper } = getClassNames();\r\n const { pending, expirationDate, expired, resend } = UserInvitationsMessages;\r\n\r\n const getUserInvitationExpiryStatus = (invite: UserInvitation) => {\r\n const currTime = new Date();\r\n const expiryDate = invite.expirationDate ? new Date(invite.expirationDate) : undefined;\r\n return expiryDate ? formatMessage(expiryDate > currTime ? pending : expired) : '';\r\n };\r\n\r\n return [\r\n {\r\n columnOrder: 0,\r\n key: 'email',\r\n name: formatMessage(UserMessages.email),\r\n ariaLabel: formatMessage(AppMessages.sortByColumnHeaderTooltipLabel, { columnName: formatMessage(UserMessages.email) }),\r\n minWidth: longestEmailLength,\r\n maxWidth: longestEmailLength + 10,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n sortableValue: (invite: UserInvitation) => invite.email ?? '',\r\n onRender: (invite: UserInvitation) => <GridCell>{invite.email}</GridCell>,\r\n },\r\n {\r\n columnOrder: 1,\r\n key: 'role',\r\n name: formatMessage(UserMessages.role),\r\n ariaLabel: formatMessage(AppMessages.sortByColumnHeaderTooltipLabel, { columnName: formatMessage(UserMessages.role) }),\r\n minWidth: 100,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n sortableValue: (invite: UserInvitation) => getUserRoleMapping(invite.roleIds, formatMessage),\r\n onRender: (invite: UserInvitation) => <GridCell>{getUserRoleMapping(invite.roleIds, formatMessage)}</GridCell>,\r\n },\r\n {\r\n columnOrder: 2,\r\n key: 'status',\r\n name: formatMessage(AppMessages.status),\r\n ariaLabel: formatMessage(AppMessages.sortByColumnHeaderTooltipLabel, { columnName: formatMessage(AppMessages.status) }),\r\n minWidth: 50,\r\n maxWidth: 100,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n sortableValue: getUserInvitationExpiryStatus,\r\n onRender: (invite: UserInvitation) => <GridCell>{getUserInvitationExpiryStatus(invite)}</GridCell>,\r\n },\r\n {\r\n columnOrder: 3,\r\n key: 'expirationDate',\r\n name: formatMessage(expirationDate),\r\n ariaLabel: formatMessage(AppMessages.sortByColumnHeaderTooltipLabel, { columnName: formatMessage(expirationDate) }),\r\n minWidth: 100,\r\n maxWidth: 150,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n sortableValue: (invite: UserInvitation) => new Date(invite.expirationDate as Date).toISOString() ?? '',\r\n onRender: (invite: UserInvitation) => {\r\n const expiryDate = invite.expirationDate ? new Date(invite.expirationDate) : undefined;\r\n const expiryDateString = expiryDate ? expiryDate.toISOString().split('T')[0] : '';\r\n return <GridCell>{expiryDateString}</GridCell>;\r\n },\r\n },\r\n {\r\n columnOrder: 4,\r\n key: 'actions',\r\n name: formatMessage(UserMessages.actions),\r\n minWidth: 180,\r\n maxWidth: 200,\r\n isVisible: true,\r\n isExportable: false,\r\n suppressSorting: true,\r\n isPadded: true,\r\n isResizable: true,\r\n onRender: (invite: UserInvitation) => {\r\n return (\r\n <div className={actionButtonsWrapper}>\r\n <ActionButton iconProps={{ iconName: 'Send' }} onClick={(ev) => onResendUserInvitation(invite)}>\r\n {formatMessage(resend)}\r\n </ActionButton>\r\n <ActionButton iconProps={{ iconName: 'delete' }} onClick={() => onDeleteUserInvitation(invite)}>\r\n {formatMessage(AppMessages.delete)}\r\n </ActionButton>\r\n </div>\r\n );\r\n },\r\n },\r\n ];\r\n}\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterSpacing } from '../../theme';\r\nimport { ICommonStyleProps } from '../types';\r\n\r\ntype StyleProperties = 'panelTitleStyle' | 'panelFooterButtonsWrapper' | 'panelDescription';\r\ntype SettingsPageStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): SettingsPageStyles => {\r\n const { palette } = props.theme;\r\n const spacing = props.theme.spacing as IPubcenterSpacing;\r\n\r\n return mergeStyleSets({\r\n panelTitleStyle: {\r\n marginTop: spacing.size16,\r\n },\r\n panelFooterButtonsWrapper: {\r\n display: 'flex',\r\n gap: spacing.size8,\r\n },\r\n panelDescription: {\r\n padding: `${spacing.size16} 0`,\r\n color: palette.neutralSecondary,\r\n },\r\n });\r\n};\r\n\r\nexport function getPanelClassNames<PropType>(props?: PropType): SettingsPageStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { IChoiceGroupOption } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { UserRole } from '../../../../@data';\r\nimport UserManagementMessages from '../UserManagement.messages';\r\nimport { getClassNames } from '../UserManagement.styles';\r\n\r\nexport function getUserRoleChoiceGroupOptions(intl) {\r\n const { formatMessage } = intl;\r\n const { roleDesc } = getClassNames();\r\n const { superAdmin, accountManager, reportUser, superAdminDesc, accountManagerDesc, reportUserDesc } = UserManagementMessages;\r\n\r\n function renderChoiceGroupOption(props, render, description) {\r\n return (\r\n <React.Fragment>\r\n {render?.(props)}\r\n <div className={roleDesc}>{formatMessage(description)}</div>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n const choiceGroupOptions: IChoiceGroupOption[] = [\r\n {\r\n key: UserRole.SuperAdmin,\r\n text: formatMessage(superAdmin),\r\n onRenderField: (props, render) => renderChoiceGroupOption(props, render, superAdminDesc),\r\n },\r\n {\r\n key: UserRole.AccountManager,\r\n text: formatMessage(accountManager),\r\n onRenderField: (props, render) => renderChoiceGroupOption(props, render, accountManagerDesc),\r\n },\r\n {\r\n key: UserRole.ReportUser,\r\n text: formatMessage(reportUser),\r\n onRenderField: (props, render) => renderChoiceGroupOption(props, render, reportUserDesc),\r\n },\r\n ];\r\n\r\n return choiceGroupOptions;\r\n}\r\n","import { ChoiceGroup, DefaultButton, Dropdown, Panel, PanelType, PrimaryButton, TextField } from '@fluentui/react';\r\nimport React, { useEffect } from 'react';\r\nimport { UserRole, getAppStore } from '../../../../@data';\r\nimport { getSupportedLanguagesDropDownOptions } from '../../../../@data/utils/supportedLanguages';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { FormItem } from '../../../../components/Form';\r\nimport { getPanelClassNames } from '../../../../styles/PanelStyles';\r\nimport { injectIntlAndObserver } from '../../../../utils';\r\nimport UserManagementMessages from '../UserManagement.messages';\r\nimport { getUserRoleChoiceGroupOptions } from '../components/UserRoleChoiceGroupOptions';\r\nimport { onUserInvited } from './@data/actions/userInvitationActions';\r\nimport { setFirstName, setLastName, updateEmail, updateRecipientPreferredLanguage, updateRole } from './@data/mutatorActions';\r\nimport { setUserInvitationPanelStatus } from './@data/mutatorActions/onUserInvitationTabChanged';\r\nimport { getUserInvitationStore } from './@data/store';\r\nimport messages from './UserInvitations.messages';\r\n\r\nconst USER_INVITE_PANEL_WIDTH = '466px';\r\nconst PANEL_FIELD_WIDTH = 416;\r\n\r\nexport const UserInvitePanel = injectIntlAndObserver(function UserInvitePanelComponent({ intl }) {\r\n const { formatMessage } = intl;\r\n const {\r\n inviteUser,\r\n panelDescription,\r\n inviteUserEmailTitle,\r\n emailPlaceholder,\r\n send,\r\n firstNameTitle,\r\n lastNameTitle,\r\n recipientPreferredLanguageTitle,\r\n } = messages;\r\n const { locale } = getAppStore();\r\n const { panelDescription: panelDesc, panelFooterButtonsWrapper } = getPanelClassNames();\r\n const { userInvitePanelOpen, userInviteErrors } = getUserInvitationStore();\r\n\r\n const { firstName, lastName, email, userRole, recipientPreferredLang } = getUserInvitationStore().userInviteViewModel;\r\n const onDismiss = () => setUserInvitationPanelStatus(false);\r\n\r\n useEffect(() => {\r\n updateRecipientPreferredLanguage(locale);\r\n }, [locale]);\r\n\r\n const isFormComplete = () => {\r\n if (firstName?.trim() !== '' && lastName?.trim() !== '' && email?.trim() !== '' && recipientPreferredLang?.trim() !== '' && userRole) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n const onUserLanguageChanged = (ev, option) => {\r\n updateRecipientPreferredLanguage(option.key);\r\n };\r\n\r\n if (!userInvitePanelOpen) {\r\n return null;\r\n }\r\n\r\n return (\r\n <React.Fragment>\r\n <Panel\r\n headerText={formatMessage(inviteUser)}\r\n isOpen={userInvitePanelOpen}\r\n type={PanelType.custom}\r\n customWidth={USER_INVITE_PANEL_WIDTH}\r\n onDismiss={onDismiss}\r\n closeButtonAriaLabel={formatMessage(AppMessages.close)}\r\n isFooterAtBottom={true}\r\n onRenderFooterContent={() => {\r\n return (\r\n <div className={panelFooterButtonsWrapper}>\r\n <PrimaryButton text={formatMessage(send)} disabled={!isFormComplete()} onClick={onUserInvited} />\r\n <DefaultButton text={formatMessage(AppMessages.cancel)} onClick={onDismiss} />\r\n </div>\r\n );\r\n }}\r\n >\r\n <React.Fragment>\r\n <div className={panelDesc}>{formatMessage(panelDescription)}</div>\r\n <FormItem formWidth={PANEL_FIELD_WIDTH}>\r\n <TextField\r\n required\r\n label={formatMessage(firstNameTitle)}\r\n ariaLabel={formatMessage(firstNameTitle)}\r\n value={firstName}\r\n onChange={(_, value: string) => setFirstName(value)}\r\n errorMessage={userInviteErrors?.firstName}\r\n />\r\n </FormItem>\r\n <FormItem formWidth={PANEL_FIELD_WIDTH}>\r\n <TextField\r\n required\r\n label={formatMessage(lastNameTitle)}\r\n ariaLabel={formatMessage(lastNameTitle)}\r\n value={lastName}\r\n onChange={(_, value: string) => setLastName(value)}\r\n errorMessage={userInviteErrors?.lastName}\r\n />\r\n </FormItem>\r\n <FormItem formWidth={PANEL_FIELD_WIDTH}>\r\n <TextField\r\n label={formatMessage(inviteUserEmailTitle)}\r\n placeholder={formatMessage(emailPlaceholder)}\r\n value={email}\r\n onChange={(_, val: string) => updateEmail(val)}\r\n errorMessage={userInviteErrors?.email}\r\n required\r\n />\r\n </FormItem>\r\n <FormItem formWidth={PANEL_FIELD_WIDTH}>\r\n <Dropdown\r\n label={formatMessage(recipientPreferredLanguageTitle)}\r\n options={getSupportedLanguagesDropDownOptions(locale)}\r\n onChange={onUserLanguageChanged}\r\n selectedKey={recipientPreferredLang}\r\n errorMessage={userInviteErrors?.recipientPreferredLang}\r\n required\r\n />\r\n </FormItem>\r\n <FormItem formWidth={PANEL_FIELD_WIDTH}>\r\n <ChoiceGroup\r\n label={formatMessage(UserManagementMessages.role)}\r\n options={getUserRoleChoiceGroupOptions(intl)}\r\n onChange={(_, option) => option && updateRole(option!.key as UserRole)}\r\n defaultSelectedKey={userRole}\r\n />\r\n </FormItem>\r\n </React.Fragment>\r\n </Panel>\r\n </React.Fragment>\r\n );\r\n});\r\n","import { PrimaryButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport { ZeroResults } from '../../../../components/ZeroResults/ZeroResults';\r\nimport desertImage from '../../AdBlock/resources/Desert.svg';\r\nimport { setUserInvitationPanelStatus } from './@data/mutatorActions';\r\nimport UserInvitationsMessages from './UserInvitations.messages';\r\n\r\nexport const ZeroInvitations = injectIntl(function ZeroInvitationsComponent({ intl: { formatMessage } }) {\r\n return (\r\n <>\r\n <ZeroResults imageSrc={desertImage} title={formatMessage(UserInvitationsMessages.zeroInvitationsTitle)}>\r\n <PrimaryButton\r\n iconProps={{ iconName: 'Add' }}\r\n text={formatMessage(UserInvitationsMessages.inviteUser)}\r\n onClick={() => setUserInvitationPanelStatus(true)}\r\n />\r\n </ZeroResults>\r\n </>\r\n );\r\n});\r\n","import { PrimaryButton } from '@fluentui/react';\r\nimport React, { useEffect, useMemo } from 'react';\r\nimport { UserInvitation, getAppStore } from '../../../../@data';\r\nimport { useCanvasTextWidth } from '../../../../hooks';\r\nimport {\r\n CommandBarActions,\r\n Direction,\r\n GridSelectionMode,\r\n GridV2,\r\n IBuildCommandBarProps,\r\n IGridPageCommandBarItemProps,\r\n} from '../../../../layout/GridPageV2';\r\nimport { IRouterWithIntl, injectRouterAndIntlWithObserver } from '../../../../utils';\r\nimport { loadUserInvitations } from './@data/actions/userInvitationActions';\r\nimport './@data/mutatorActions';\r\nimport { setUserInvitationPanelStatus, setUserInvitations } from './@data/mutatorActions';\r\nimport './@data/orchestrators';\r\nimport { getUserInvitationStore } from './@data/store';\r\nimport { getColumns } from './UserInvitationColumns';\r\nimport UserInvitationsMessages from './UserInvitations.messages';\r\nimport { UserInvitePanel } from './UserInvitePanel';\r\nimport { ZeroInvitations } from './ZeroInvitations';\r\n\r\nexport interface IUserInvitationProps extends IRouterWithIntl {}\r\n\r\nexport const UserInvitationsTab = injectRouterAndIntlWithObserver(function UserInvitationsTabComponent(props: IUserInvitationProps) {\r\n const { formatMessage } = props.intl;\r\n const { publisher } = getAppStore();\r\n const { userInvitations } = getUserInvitationStore();\r\n\r\n const longestEmail = useMemo(\r\n () => userInvitations?.map((user) => user.email || '').reduce((a, b) => (a.length > b.length ? a : b), '') || '',\r\n [userInvitations]\r\n );\r\n\r\n useEffect(() => {\r\n loadUserInvitations();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const commandBarProps: IBuildCommandBarProps<UserInvitation> = {\r\n includeActions: [CommandBarActions.searchBox],\r\n getCustomCommandBarItems: () => {\r\n const commandBarItems: IGridPageCommandBarItemProps[] = [\r\n {\r\n key: 'inviteUser',\r\n placement: { direction: Direction.before },\r\n commandBarButtonAs: () => (\r\n <PrimaryButton\r\n iconProps={{ iconName: 'Add' }}\r\n text={formatMessage(UserInvitationsMessages.invite)}\r\n onClick={() => setUserInvitationPanelStatus(true)}\r\n />\r\n ),\r\n selectionModes: [GridSelectionMode.None],\r\n },\r\n ];\r\n\r\n return commandBarItems;\r\n },\r\n };\r\n\r\n return (\r\n <React.Fragment>\r\n <GridV2\r\n {...props}\r\n isGridReady={!!publisher}\r\n entity={UserInvitation}\r\n commandBarProps={userInvitations.length > 0 ? commandBarProps : undefined}\r\n dataGridProps={{\r\n gridV2Columns: getColumns(props.intl, useCanvasTextWidth(longestEmail)),\r\n data: userInvitations,\r\n setData: setUserInvitations,\r\n renderZeroItemsComponent: <ZeroInvitations />,\r\n }}\r\n paginationProps={{\r\n shouldGridHandlePagination: true,\r\n }}\r\n />\r\n <UserInvitePanel {...props} />\r\n </React.Fragment>\r\n );\r\n});\r\n","import { getTheme, IButtonStyles, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterPalette, IPubcenterTheme } from '../../../theme';\r\nimport { ICommonStyleProps } from '../../types';\r\n\r\ntype StyleProperties = 'confirmation';\r\ntype PopupCardStyles = Record<StyleProperties, string>;\r\nexport const getStyles = (props: ICommonStyleProps): PopupCardStyles => {\r\n const theme = props.theme as unknown as IPubcenterTheme;\r\n const { spacing } = theme;\r\n\r\n return mergeStyleSets({\r\n confirmation: {\r\n paddingBottom: spacing.size4,\r\n },\r\n });\r\n};\r\nexport function getClassNames<PropType>(props?: PropType): PopupCardStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n\r\nexport const getPermanentDeleteButtonStyles = (): IButtonStyles => {\r\n const palette = getTheme().palette as IPubcenterPalette;\r\n const customStyles = {\r\n backgroundColor: palette.redDark,\r\n borderColor: palette.redDark,\r\n };\r\n\r\n return {\r\n root: {\r\n ...customStyles,\r\n },\r\n rootHovered: {\r\n ...customStyles,\r\n },\r\n rootFocused: {\r\n ...customStyles,\r\n },\r\n rootPressed: {\r\n ...customStyles,\r\n },\r\n };\r\n};\r\n","import { DefaultButton, DialogFooter, PrimaryButton, TextField } from '@fluentui/react';\r\nimport React, { useState } from 'react';\r\nimport { FormattedMessage, InjectedIntlProps } from 'react-intl';\r\nimport AppMessages from '../../App.messages';\r\nimport { IDestructiveDialogLabelsProps } from '../../layout/GridPageV2';\r\nimport { injectIntlAndObserver } from '../../utils';\r\nimport { PopupCard } from './PopupCard';\r\nimport { getClassNames, getPermanentDeleteButtonStyles } from './PopupCard.styles';\r\n\r\nexport interface IDeleteConfirmationPopupProps extends InjectedIntlProps {\r\n onDeleteClicked: () => void;\r\n onDialogDismissed: () => void;\r\n isOpen: boolean;\r\n deleteLabels?: IDestructiveDialogLabelsProps;\r\n confirmActionMessage?: FormattedMessage.MessageDescriptor;\r\n deleteButtonText?: FormattedMessage.MessageDescriptor;\r\n}\r\n\r\nexport const DeleteConfirmationPopup = injectIntlAndObserver(function DeleteConfirmationPopupComp({\r\n intl: { formatMessage },\r\n onDeleteClicked,\r\n onDialogDismissed,\r\n isOpen,\r\n deleteLabels,\r\n confirmActionMessage,\r\n deleteButtonText,\r\n}: IDeleteConfirmationPopupProps): JSX.Element | null {\r\n const [confirmationText, setConfirmationText] = useState('');\r\n const { confirmation } = getClassNames();\r\n\r\n if (!isOpen) {\r\n return null;\r\n }\r\n\r\n return (\r\n <PopupCard\r\n isShown={isOpen}\r\n popUpTitle={formatMessage(deleteLabels?.title ?? AppMessages.deleteGenericTitle)}\r\n popUpDescription={formatMessage(deleteLabels?.description ?? AppMessages.userDeleteWarning)}\r\n onPopupDismiss={onDialogDismissed}\r\n >\r\n <React.Fragment>\r\n <div className={confirmation}>{formatMessage(confirmActionMessage ?? AppMessages.confirmActionMessage)}</div>\r\n <TextField value={confirmationText} onChange={(_, val: string) => setConfirmationText(val)} />\r\n <DialogFooter>\r\n <PrimaryButton\r\n text={formatMessage(deleteButtonText ?? AppMessages.permanentDelete)}\r\n disabled={confirmationText.toLowerCase() !== 'yes'}\r\n onClick={() => {\r\n onDeleteClicked();\r\n onDialogDismissed();\r\n }}\r\n styles={getPermanentDeleteButtonStyles()}\r\n />\r\n <DefaultButton onClick={() => onDialogDismissed()} text={formatMessage(AppMessages.cancel)} />\r\n </DialogFooter>\r\n </React.Fragment>\r\n </PopupCard>\r\n );\r\n});\r\n","import { createStore } from 'satcheljs';\r\nimport { User } from '../../../../../@data';\r\n\r\nexport interface IUserManagementState {\r\n roleChangePanelOpen: boolean;\r\n selectedItem?: User;\r\n users: User[];\r\n}\r\n\r\nexport const getUserManagementStore = createStore<IUserManagementState>('UserManagementState', {\r\n roleChangePanelOpen: false,\r\n users: [],\r\n});\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { User } from '../../../../../../@data';\r\nimport { getUserManagementStore } from '../store';\r\n\r\nexport const setUserRoleChangePanelStatus = mutatorAction('setUserRoleChangePanelStatus', (isPanelOpen: boolean, selectedItem?: User) => {\r\n getUserManagementStore().roleChangePanelOpen = isPanelOpen;\r\n getUserManagementStore().selectedItem = selectedItem;\r\n});\r\n\r\nexport const setSelectedItem = mutatorAction('setSelectedItem', (selectedItem: User) => {\r\n getUserManagementStore().selectedItem = selectedItem;\r\n});\r\n\r\nexport const setUsers = mutatorAction('setUsers', (users?: User[]) => {\r\n getUserManagementStore().users = users || [];\r\n});\r\n\r\n// tslint:disable-next-line: no-any\r\nexport const updateUserRole = mutatorAction('updateUserRole', (user: User, updatedUser: any) => {\r\n const { users } = getUserManagementStore();\r\n const userToUpdate = users.find((item) => user.id === item.id);\r\n\r\n if (userToUpdate) {\r\n userToUpdate.userRoleDetails = updatedUser.userRoleDetails;\r\n userToUpdate.userRoleDetailsETag = updatedUser.eTag;\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport {\r\n deleteEntity,\r\n getAppStore,\r\n onNotificationChanged,\r\n showErrorToastNotification,\r\n showSuccessToastNotification,\r\n User,\r\n} from '../../../../../../@data';\r\nimport { getSuccessNotificationDeleteItem } from '../../../../../../utils';\r\nimport messages from '../../../UserManagement.messages';\r\nimport { onUsersDeleted } from '../actions/usersTabActions';\r\nimport { setUsers } from '../mutatorActions';\r\nimport { getUserManagementStore } from '../store';\r\n\r\norchestrator(onUsersDeleted, async (msg) => {\r\n const { publisher, userContext } = getAppStore();\r\n const { selectedItem, users } = getUserManagementStore();\r\n\r\n if (userContext && publisher && selectedItem) {\r\n const entityInstance = new User(selectedItem.id);\r\n try {\r\n const result = await deleteEntity([publisher, entityInstance], undefined, userContext);\r\n\r\n if (result && users) {\r\n setUsers(users.filter((user) => user.id !== entityInstance.id));\r\n }\r\n\r\n showSuccessToastNotification({ text: getSuccessNotificationDeleteItem([selectedItem], entityInstance, msg.formatMessage) });\r\n } catch (e) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.userManagementFailedToDeleteItem });\r\n }\r\n } else {\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n textMessageDescriptor: messages.userManagementInvalidState,\r\n });\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport {\r\n getAppStore,\r\n listEntity,\r\n onLoadingChanged,\r\n onNotificationChanged,\r\n showErrorToastNotification,\r\n User,\r\n} from '../../../../../../@data';\r\nimport messages from '../../../UserManagement.messages';\r\nimport { loadUsers } from '../actions/usersTabActions';\r\nimport { setUsers } from '../mutatorActions';\r\n\r\norchestrator(loadUsers, async () => {\r\n const { userContext, publisher } = getAppStore();\r\n\r\n if (userContext && publisher) {\r\n try {\r\n onLoadingChanged(true);\r\n\r\n const users = await listEntity([publisher], userContext, User, new URLSearchParams([['extendedInfo', 'true']]));\r\n setUsers(users);\r\n } catch (e) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.loadUserDetailsFailed });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n textMessageDescriptor: messages.userManagementInvalidState,\r\n });\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport {\r\n getAppStore,\r\n onAuthLogout,\r\n onNotificationChanged,\r\n onSavingChanged,\r\n patchEntity,\r\n showErrorToastNotification,\r\n showSuccessToastNotification,\r\n User,\r\n UserRole,\r\n UserRoleEntityType,\r\n UserRoleUpdate,\r\n} from '../../../../../../@data';\r\nimport messages from '../../../UserManagement.messages';\r\nimport { onUserRoleChanged } from '../actions/usersTabActions';\r\nimport { updateUserRole } from '../mutatorActions';\r\nimport { getUserManagementStore } from '../store';\r\n\r\norchestrator(onUserRoleChanged, async (msg) => {\r\n const { publisher, account, userContext } = getAppStore();\r\n const user = getUserManagementStore().selectedItem;\r\n\r\n if (user && publisher && userContext) {\r\n try {\r\n onSavingChanged(true);\r\n\r\n const entity = new UserRoleUpdate();\r\n\r\n entity.eTag = user.userRoleDetailsETag;\r\n entity.removedRoles = user.userRoleDetails || [];\r\n entity.addedRoles = [\r\n {\r\n entityId: publisher.id,\r\n userRole: msg.role,\r\n entityType: UserRoleEntityType.Customer,\r\n },\r\n ];\r\n\r\n if ([UserRole.AccountManager, UserRole.ReportUser].includes(msg.role) && account) {\r\n entity.addedRoles.push({\r\n entityId: account.id,\r\n userRole: msg.role,\r\n entityType: UserRoleEntityType.Account,\r\n });\r\n }\r\n\r\n user.className = new User().className;\r\n const response = await patchEntity([publisher, user], UserRoleUpdate, entity, userContext);\r\n\r\n updateUserRole(user, response);\r\n\r\n if (user.id === userContext.id) {\r\n // User role has changed, so logout the user to provide different UX\r\n onAuthLogout();\r\n }\r\n\r\n showSuccessToastNotification({\r\n textMessageDescriptor: messages.editedUserRoleSuccessfully,\r\n intlMessageValues: { username: user.username },\r\n });\r\n } catch (e) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.userRoleChangeFailed });\r\n } finally {\r\n onSavingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n textMessageDescriptor: messages.userManagementInvalidState,\r\n });\r\n }\r\n});\r\n","import { ChoiceGroup, DefaultButton, Panel, PanelType, PrimaryButton } from '@fluentui/react';\r\nimport React, { useState } from 'react';\r\nimport { UserRole } from '../../../../@data';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { FormItem } from '../../../../components/Form';\r\nimport { getPanelClassNames } from '../../../../styles/PanelStyles';\r\nimport { injectIntlAndObserver } from '../../../../utils';\r\nimport UserManagementMessages from '../UserManagement.messages';\r\nimport { getUserRoleChoiceGroupOptions } from '../components/UserRoleChoiceGroupOptions';\r\nimport { getUserRoleFromUser } from '../utils/userRoleUtils';\r\nimport { onUserRoleChanged } from './@data/actions/usersTabActions';\r\nimport './@data/mutatorActions';\r\nimport { setUserRoleChangePanelStatus } from './@data/mutatorActions/onUsersTabChanged';\r\nimport './@data/orchestrators';\r\nimport { getUserManagementStore } from './@data/store';\r\n\r\nconst ROLE_CHANGE_PANEL_WIDTH = '466px';\r\nconst PANEL_FIELD_WIDTH = 416;\r\n\r\nexport const UserRoleChangePanel = injectIntlAndObserver(function UserRoleChangePanelComponent({ intl }) {\r\n const { roleChangePanelOpen, selectedItem } = getUserManagementStore();\r\n const { formatMessage } = intl;\r\n const { changeUserRole, roleChangePanelDesc } = UserManagementMessages;\r\n const { panelFooterButtonsWrapper, panelDescription } = getPanelClassNames();\r\n\r\n const onDismiss = () => setUserRoleChangePanelStatus(false, undefined);\r\n const existingUserRole = selectedItem ? getUserRoleFromUser(selectedItem) : undefined;\r\n\r\n const [role, setUserRole] = useState<UserRole | undefined>(existingUserRole);\r\n\r\n return (\r\n <Panel\r\n headerText={formatMessage(changeUserRole)}\r\n isOpen={roleChangePanelOpen}\r\n type={PanelType.custom}\r\n customWidth={ROLE_CHANGE_PANEL_WIDTH}\r\n onDismiss={onDismiss}\r\n closeButtonAriaLabel={formatMessage(AppMessages.close)}\r\n isFooterAtBottom={true}\r\n onRenderFooterContent={() => {\r\n return (\r\n <div className={panelFooterButtonsWrapper}>\r\n <PrimaryButton\r\n id=\"roleChangeButton\"\r\n text={formatMessage(AppMessages.save)}\r\n disabled={!role || role === existingUserRole}\r\n onClick={(ev) => {\r\n if (role) {\r\n onUserRoleChanged(role);\r\n onDismiss();\r\n }\r\n }}\r\n />\r\n <DefaultButton text={formatMessage(AppMessages.cancel)} onClick={onDismiss} />\r\n </div>\r\n );\r\n }}\r\n >\r\n <React.Fragment>\r\n <div className={panelDescription}>{formatMessage(roleChangePanelDesc)}</div>\r\n <FormItem formWidth={PANEL_FIELD_WIDTH}>\r\n <ChoiceGroup\r\n selectedKey={role || existingUserRole}\r\n options={getUserRoleChoiceGroupOptions(intl)}\r\n onChange={(_, option) => setUserRole(option?.key as UserRole)}\r\n />\r\n </FormItem>\r\n </React.Fragment>\r\n </Panel>\r\n );\r\n});\r\n","import { ActionButton, mergeStyleSets } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntl } from 'react-intl';\r\nimport { INamePair, User } from '../../../../@data';\r\nimport { onPopupOpenChanged } from '../../../../@data/mutatorActions';\r\nimport { getPrimaryUserId } from '../../../../@data/store';\r\nimport { PopupType } from '../../../../@data/store/schema/enums/PopupType';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { GridCell, getGridClassNames } from '../../../../components/GridWithCustomColumns';\r\nimport { IGridV2Column } from '../../../../layout/GridPageV2/GridV2.types';\r\nimport messages from '../UserManagement.messages';\r\nimport { getUserRoleString } from '../utils/userRoleUtils';\r\nimport { setSelectedItem, setUserRoleChangePanelStatus } from './@data/mutatorActions';\r\n\r\nexport const getUserName = (name?: INamePair, userName?: string) => {\r\n return name ? name.firstName ?? '' + name.lastName ?? '' : userName ?? '';\r\n};\r\n\r\nexport function getColumns(intl: InjectedIntl, longestNameLength, longestEmailLength): IGridV2Column[] {\r\n const { formatMessage } = intl;\r\n const { gridActionButton, actionButtonsWrapper } = mergeStyleSets(getGridClassNames());\r\n const primaryUserId = getPrimaryUserId();\r\n\r\n return [\r\n {\r\n columnOrder: 0,\r\n key: 'name',\r\n name: formatMessage(AppMessages.name),\r\n ariaLabel: formatMessage(AppMessages.sortByColumnHeaderTooltipLabel, { columnName: formatMessage(AppMessages.name) }),\r\n minWidth: longestNameLength,\r\n maxWidth: longestNameLength + 10,\r\n sortableValue: (item: User) => getUserName(item.name, item.username),\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n onRender: (item: User) => <GridCell>{getUserName(item.name, item.username)}</GridCell>,\r\n },\r\n {\r\n columnOrder: 1,\r\n key: 'email',\r\n name: formatMessage(messages.email),\r\n ariaLabel: formatMessage(AppMessages.sortByColumnHeaderTooltipLabel, { columnName: formatMessage(messages.email) }),\r\n minWidth: longestEmailLength,\r\n maxWidth: longestEmailLength + 10,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n sortableValue: (item: User) => item.email || '',\r\n onRender: (item: User) => <GridCell>{item.email}</GridCell>,\r\n },\r\n {\r\n columnOrder: 2,\r\n key: 'userRole',\r\n name: formatMessage(messages.role),\r\n ariaLabel: formatMessage(AppMessages.sortByColumnHeaderTooltipLabel, { columnName: formatMessage(messages.role) }),\r\n minWidth: 100,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n sortableValue: (item: User) => getUserRoleString(formatMessage, item),\r\n onRender: (item: User) => <GridCell>{getUserRoleString(formatMessage, item)}</GridCell>,\r\n },\r\n {\r\n columnOrder: 3,\r\n key: 'actions',\r\n name: formatMessage(messages.actions),\r\n minWidth: 200,\r\n maxWidth: 300,\r\n suppressSorting: true,\r\n isPadded: true,\r\n isVisible: true,\r\n isResizable: true,\r\n isExportable: false,\r\n onRender: (item: User) => {\r\n return (\r\n <div className={actionButtonsWrapper}>\r\n <ActionButton\r\n className={gridActionButton}\r\n iconProps={{ iconName: 'PeopleRepeat' }}\r\n disabled={primaryUserId === item.id}\r\n onClick={(ev) => {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n setUserRoleChangePanelStatus(true, item);\r\n }}\r\n >\r\n {formatMessage(messages.role)}\r\n </ActionButton>\r\n <ActionButton\r\n className={gridActionButton}\r\n iconProps={{ iconName: 'delete' }}\r\n disabled={primaryUserId === item.id}\r\n onClick={(ev) => {\r\n onPopupOpenChanged(PopupType.DeleteConfirmation);\r\n setSelectedItem(item);\r\n }}\r\n >\r\n {formatMessage(AppMessages.delete)}\r\n </ActionButton>\r\n </div>\r\n );\r\n },\r\n },\r\n ];\r\n}\r\n","import React, { useEffect, useMemo } from 'react';\r\nimport { Log } from '../../../../../logging/src';\r\nimport { User, getAppStore } from '../../../../@data';\r\nimport { onPopupOpenChanged } from '../../../../@data/mutatorActions';\r\nimport { getPrimaryUserId } from '../../../../@data/store';\r\nimport { PopupType } from '../../../../@data/store/schema/enums/PopupType';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { DeleteConfirmationPopup } from '../../../../components/Popup/DeleteConfirmationPopup';\r\nimport { useCanvasTextWidth } from '../../../../hooks';\r\nimport {\r\n CommandBarActions,\r\n Direction,\r\n GridSelectionMode,\r\n GridV2,\r\n IGridPageCommandBarItemProps,\r\n IGridV2Column,\r\n} from '../../../../layout/GridPageV2';\r\nimport { IRouterWithIntl, injectRouterAndIntlWithObserver } from '../../../../utils';\r\nimport messages from '../UserManagement.messages';\r\nimport { loadUsers, onUsersDeleted } from './@data/actions/usersTabActions';\r\nimport './@data/mutatorActions';\r\nimport { setSelectedItem, setUserRoleChangePanelStatus } from './@data/mutatorActions';\r\nimport './@data/orchestrators';\r\nimport { getUserManagementStore } from './@data/store';\r\nimport { UserRoleChangePanel } from './UserRoleChangePanel';\r\nimport { getColumns, getUserName } from './UsersTabColumns';\r\n\r\nconst USER_ROLE_CHANGE_KEY = 'userRoleChange';\r\n\r\nexport interface IUserPageProps extends IRouterWithIntl {}\r\n\r\nexport const UsersTab = injectRouterAndIntlWithObserver(function UsersTabComponent(props: IUserPageProps) {\r\n const { formatMessage } = props.intl;\r\n const { publisher, openedPopup } = getAppStore();\r\n const { users } = getUserManagementStore();\r\n const primaryUserId = getPrimaryUserId();\r\n\r\n const longestEmail = useMemo(() => users?.map((user) => user.email || '').reduce((a, b) => (a.length > b.length ? a : b), '') || '', [\r\n users,\r\n ]);\r\n const longestName = useMemo(\r\n () => users?.map((user) => getUserName(user.name, user.username)).reduce((a, b) => (a.length > b.length ? a : b), '') || '',\r\n [users]\r\n );\r\n const gridDefaultColumns: IGridV2Column[] = getColumns(props.intl, useCanvasTextWidth(longestName), useCanvasTextWidth(longestEmail));\r\n\r\n useEffect(() => {\r\n loadUsers();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <React.Fragment>\r\n <GridV2\r\n {...props}\r\n notGridReadyLabel={formatMessage(messages.gridNotReadyLabel)}\r\n isGridReady={!!publisher}\r\n entity={User}\r\n commandBarProps={{\r\n searchBoxPlaceholder: messages.searchByNamePlaceholder,\r\n includeFarActions: [CommandBarActions.searchBox, CommandBarActions.modifyColumns, CommandBarActions.download],\r\n getCustomCommandBarItems: (getSelectedItems) => {\r\n if (getSelectedItems().some((user) => user.id === primaryUserId)) {\r\n return [];\r\n }\r\n const commandBarItems: IGridPageCommandBarItemProps[] = [\r\n {\r\n key: CommandBarActions.delete,\r\n name: formatMessage(AppMessages.delete),\r\n iconProps: {\r\n iconName: 'Delete',\r\n },\r\n placement: { direction: Direction.before },\r\n onClick: () => {\r\n const selectedItems = getSelectedItems() as User[];\r\n Log.debug(`User command bar delete clicked: ${selectedItems.map((user) => user.username).toString()}`);\r\n\r\n if (selectedItems.length > 0) {\r\n onPopupOpenChanged(PopupType.DeleteConfirmation);\r\n setSelectedItem(selectedItems[0]);\r\n }\r\n },\r\n selectionModes: [GridSelectionMode.Single],\r\n },\r\n {\r\n key: USER_ROLE_CHANGE_KEY,\r\n name: formatMessage(messages.role),\r\n iconProps: { iconName: 'PeopleRepeat' },\r\n placement: { direction: Direction.before },\r\n onClick: () => {\r\n const selectedItems = getSelectedItems() as User[];\r\n Log.debug(`User command bar role change clicked: ${JSON.stringify(selectedItems)}`);\r\n\r\n if (selectedItems.length > 0) {\r\n setUserRoleChangePanelStatus(true, selectedItems[0]);\r\n }\r\n },\r\n selectionModes: [GridSelectionMode.Single],\r\n },\r\n ];\r\n\r\n return commandBarItems;\r\n },\r\n }}\r\n dataGridProps={{\r\n gridV2Columns: gridDefaultColumns,\r\n data: users,\r\n setData: loadUsers,\r\n noEntityFound: messages.noEntityFound,\r\n }}\r\n paginationProps={{\r\n shouldGridHandlePagination: true,\r\n }}\r\n />\r\n <UserRoleChangePanel {...props} />\r\n <DeleteConfirmationPopup\r\n onDeleteClicked={() => onUsersDeleted(formatMessage)}\r\n isOpen={openedPopup === PopupType.DeleteConfirmation}\r\n onDialogDismissed={() => onPopupOpenChanged(PopupType.None)}\r\n deleteLabels={{ title: messages.deleteConfirmationDialogTitle, description: messages.deleteConfirmationDialogDesc }}\r\n confirmActionMessage={messages.confirmActionMessage}\r\n deleteButtonText={messages.deleteButtonText}\r\n />\r\n </React.Fragment>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { getAppStore, onHelpInfoCalloutOpened, onHelpInfoChanged } from '../../../@data';\r\nimport { FormTitle } from '../../../components/Form';\r\nimport { Tabs } from '../../../components/Tabs';\r\nimport { injectIntlAndObserver } from '../../../utils';\r\nimport { UserInvitationsTab } from './UserInvitations/UserInvitations';\r\nimport messages from './UserManagement.messages';\r\nimport { getClassNames } from './UserManagement.styles';\r\nimport { UsersTab } from './Users/UsersTab';\r\n\r\nconst UserManagementPage = injectIntlAndObserver(function UserManagementPageComponent({ intl }) {\r\n const { title, usersTab, userInvitationsTab } = messages;\r\n const { formatMessage } = intl;\r\n const { root } = getClassNames();\r\n const { helpInfo, locale } = getAppStore();\r\n\r\n return (\r\n <div className={root}>\r\n <FormTitle\r\n intl={intl}\r\n title={formatMessage(title)}\r\n id=\"pop_PCv4_User_Managment\"\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_User_Managment', locale)}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n />\r\n\r\n <Tabs\r\n tabs={[\r\n {\r\n key: 'users',\r\n headerText: formatMessage(usersTab),\r\n component: <UsersTab />,\r\n },\r\n {\r\n key: 'userInvitations',\r\n headerText: formatMessage(userInvitationsTab),\r\n component: <UserInvitationsTab />,\r\n },\r\n ]}\r\n />\r\n </div>\r\n );\r\n});\r\n\r\nexport default UserManagementPage;\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n pageTitle: {\r\n id: 'paymentsPage.pageTitle',\r\n defaultMessage: 'Payments',\r\n },\r\n estimatedEarningsNoDataText: {\r\n id: 'paymentsPage.estimatedEarningsNoDataText',\r\n defaultMessage: 'There is no data available for the selected date range.',\r\n },\r\n estimatedEarningsNoDataMessage: {\r\n id: 'paymentsPage.estimatedEarningsNoDataMessage',\r\n defaultMessage:\r\n 'To update the graph, please select a different date range. If the graph still appears blank, your account may not have data available for the selected date range.',\r\n },\r\n estimatedEarningsTitle: {\r\n id: 'paymentsPage.estimatedEarningsTitle',\r\n defaultMessage: 'Estimated earnings',\r\n },\r\n balanceTitle: {\r\n id: 'paymentsPage.balanceTitle',\r\n defaultMessage: 'Balance',\r\n },\r\n thresholdNotification: {\r\n id: 'paymentsPage.thresholdNotification',\r\n defaultMessage: 'You can withdraw your earnings once you reach the {threshold} minimum payout threshold.',\r\n },\r\n nextPayout: {\r\n id: 'paymentsPage.nextPayout',\r\n defaultMessage: 'You’ll receive your next payout once you reach the threshold amount',\r\n },\r\n nextPayoutDate: {\r\n id: 'paymentsPage.nextPayoutDate',\r\n defaultMessage: 'You’ve reached your payout threshold and your payout will occur on',\r\n },\r\n lastPayoutDate: {\r\n id: 'paymentsPage.nextPayoutDate',\r\n defaultMessage: 'Your last payout was on',\r\n },\r\n yourThreshold: {\r\n id: 'paymentsPage.yourThreshold',\r\n defaultMessage: 'Your Payment Threshold is',\r\n },\r\n reachedThreshold: {\r\n id: 'paymentsPage.reachedThreshold',\r\n defaultMessage: 'You’ve reached your payout threshold.',\r\n },\r\n genericNextPayout: {\r\n id: 'paymentsPage.genericNextPayout',\r\n defaultMessage: 'Earnings will be paid out on the 15th of the second month after you reach the minimum payout threshold.',\r\n },\r\n estimatedEarningMonthly: {\r\n id: 'paymentPage.estimatedEarningMonthly',\r\n defaultMessage: 'Monthly',\r\n },\r\n estimatedEarningYearly: {\r\n id: 'paymentPage.estimatedEarningYearly',\r\n defaultMessage: 'Yearly',\r\n },\r\n});\r\n","import { getTheme, IStackTokens, ITheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterPalette, IPubcenterTheme } from '../../../../../theme';\r\n\r\ninterface IPaymentsPageStyleProps {\r\n theme: ITheme;\r\n}\r\ntype StyleProperties = 'chartCard' | 'pageTitleStyle' | 'cardsTitleBarStyle';\r\ntype PaymentsPageStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: IPaymentsPageStyleProps): PaymentsPageStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const { spacing } = theme;\r\n return mergeStyleSets({\r\n chartCard: {\r\n width: '49%',\r\n height: 'auto',\r\n },\r\n pageTitleStyle: {\r\n margin: `${spacing.size32} 0 ${spacing.size12}`,\r\n },\r\n cardsTitleBarStyle: {\r\n borderBottom: `1px solid ${palette.neutralLight}`,\r\n minHeight: '30px',\r\n },\r\n });\r\n};\r\nexport const chartsContainersStyles = { root: { padding: '1rem' } };\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\nexport function getStackTokens(): IStackTokens {\r\n const theme = (getTheme() as unknown) as IPubcenterTheme;\r\n const spacing = theme.spacing;\r\n\r\n return { childrenGap: spacing.size12 };\r\n}\r\n","import { getTheme, IStackTokens, ITheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterPalette, IPubcenterTheme } from '../../../../../../theme';\r\n\r\nexport interface IBalanceStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\ntype StyleProperties = 'paymentThreshold' | 'iconStyle' | 'notificationMessage' | 'cardContainer';\r\ntype BalanceStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: IBalanceStyleProps): BalanceStyles => {\r\n const { theme } = props;\r\n const palette = theme.palette as IPubcenterPalette;\r\n return mergeStyleSets({\r\n paymentThreshold: {\r\n paddingTop: 40,\r\n fontSize: 18,\r\n },\r\n iconStyle: {\r\n marginRight: '10px',\r\n },\r\n notificationMessage: {\r\n backgroundColor: palette.themeLighter,\r\n },\r\n cardContainer: {\r\n height: '100%',\r\n },\r\n });\r\n};\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n\r\nexport function getStackTokens(): IStackTokens {\r\n const theme = (getTheme() as unknown) as IPubcenterTheme;\r\n const spacing = theme.spacing;\r\n\r\n return { childrenGap: spacing.size12 };\r\n}\r\n","import { getTheme, MessageBar, ShimmerElementsGroup, ShimmerElementType } from '@fluentui/react';\r\nimport { IChartDataPoint, IChartProps } from '@fluentui/react-charting';\r\nimport React from 'react';\r\nimport { IPubcenterPalette, IPubcenterTheme } from '../../../../../../theme';\r\nimport { PaymentsPageBalance } from '../../../../../@data';\r\nimport { roundNumber } from '../../../../../utils';\r\nimport { getClassNames } from './Balance.styles';\r\n\r\nexport const getChartShimmerCustomElements = () => {\r\n return (\r\n <div>\r\n <ShimmerElementsGroup\r\n flexWrap\r\n width=\"100%\"\r\n shimmerElements={[\r\n { type: ShimmerElementType.line, width: '100%' },\r\n { type: ShimmerElementType.gap, height: 30, width: '100%' },\r\n { type: ShimmerElementType.line, width: '100%' },\r\n { type: ShimmerElementType.gap, height: 30, width: '100%' },\r\n { type: ShimmerElementType.line, width: '100%' },\r\n { type: ShimmerElementType.gap, height: 30, width: '100%' },\r\n { type: ShimmerElementType.line, width: '100%' },\r\n { type: ShimmerElementType.gap, height: 30, width: '100%' },\r\n { type: ShimmerElementType.line, width: '100%' },\r\n { type: ShimmerElementType.gap, height: 30, width: '100%' },\r\n { type: ShimmerElementType.line, width: '100%' },\r\n ]}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport function mapToBarChartData(data?: PaymentsPageBalance): IChartProps[] {\r\n const theme = (getTheme() as unknown) as IPubcenterTheme;\r\n const palette = theme.palette as IPubcenterPalette;\r\n\r\n const chartData: IChartProps[] = [\r\n {\r\n chartTitle: 'Balance',\r\n chartData: [\r\n {\r\n legend: 'Balance',\r\n horizontalBarChartdata: {\r\n x: data ? (roundNumber(data.currBalance, 2) === 0 ? 0.1 : roundNumber(data.currBalance, 2)) : 0,\r\n y: data ? data.threshold : 0,\r\n },\r\n color: data && roundNumber(data.currBalance, 2) === 0 ? palette.white : palette.blue,\r\n yAxisCalloutData: `${data ? data.currBalance : 0}$`,\r\n },\r\n ],\r\n },\r\n ];\r\n return chartData;\r\n}\r\n\r\nexport function getBarChartCustomData(currencyCode: string, locale: string) {\r\n return (props: IChartProps) => {\r\n const chartData: IChartDataPoint = props!.chartData![0];\r\n const y = chartData.horizontalBarChartdata!.y;\r\n return (\r\n <div>\r\n <span>{`${formatByCurrencyAndLocale(y, locale, currencyCode)} ${currencyCode}`} </span>\r\n </div>\r\n );\r\n };\r\n}\r\nexport function getFooterNotification(message: string): React.ReactNode {\r\n const { notificationMessage } = getClassNames();\r\n return <MessageBar className={notificationMessage}>{message}</MessageBar>;\r\n}\r\n\r\nexport function formatByCurrencyAndLocale(paymentThreshold: number, sysLocale: string, sysCurrency: string) {\r\n return paymentThreshold.toLocaleString(sysLocale, { style: 'currency', currency: sysCurrency });\r\n}\r\n","import { Icon, Stack } from '@fluentui/react';\r\nimport { HorizontalBarChart } from '@fluentui/react-charting';\r\nimport React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { useI18n } from '../../../../../../i18n/useI18n';\r\nimport { getAppStore } from '../../../../../@data';\r\nimport { Card } from '../../../../../components/Card/Card';\r\nimport { DEFAULT_CURRENCY_CODE } from '../../../../../constants/AppConstants';\r\nimport { injectIntlAndObserver } from '../../../../../utils';\r\nimport { getPaymentsPageBalance } from '../../@data/store/selectors';\r\nimport { getStore } from '../../Settings/@data/store/store';\r\nimport messages from '../PaymentsPage.messages';\r\nimport { getClassNames as getPaymentsCommonClassNames } from '../PaymentsPage.styles';\r\nimport {\r\n formatByCurrencyAndLocale,\r\n getBarChartCustomData,\r\n getChartShimmerCustomElements,\r\n getFooterNotification,\r\n mapToBarChartData,\r\n} from './Balance.helpers';\r\nimport { getClassNames, getStackTokens } from './Balance.styles';\r\n\r\nconst DATA_METRIC_ID = 'balance-card';\r\nconst CHART_DATA_METRIC_ID = 'balance-chart';\r\nexport interface IBalanceProps extends InjectedIntlProps {}\r\nexport const Balance = injectIntlAndObserver<IBalanceProps>((props) => {\r\n const { cardContainer } = getClassNames();\r\n const { intl } = props;\r\n const { formatMessage } = intl;\r\n const classNames = getClassNames(props);\r\n const { cardsTitleBarStyle } = getPaymentsCommonClassNames(props);\r\n const { data, isDataLoaded } = getPaymentsPageBalance();\r\n const paymentThreshold = data?.threshold ?? 0;\r\n const passedThreshold = data && data?.currBalance >= paymentThreshold;\r\n const { systemPreferences } = getStore().active;\r\n const { currency: sysCurrency } = systemPreferences ?? { currency: DEFAULT_CURRENCY_CODE };\r\n const { publisher, userContext } = getAppStore();\r\n const { locale } = useI18n({ systemPreferences, publisher, userContext });\r\n\r\n const formattedThreshold = formatByCurrencyAndLocale(paymentThreshold, locale, sysCurrency ?? DEFAULT_CURRENCY_CODE);\r\n return (\r\n <div className={cardContainer} data-metric={DATA_METRIC_ID}>\r\n <Card\r\n titleText={formatMessage(messages.balanceTitle)}\r\n shimmerCustomElement={getChartShimmerCustomElements()}\r\n isDataLoaded={!!isDataLoaded}\r\n footerComponents={\r\n !passedThreshold ? getFooterNotification(formatMessage(messages.thresholdNotification, { threshold: formattedThreshold })) : ''\r\n }\r\n styleProps={{ titleBar: cardsTitleBarStyle }}\r\n >\r\n <Stack data-metric={CHART_DATA_METRIC_ID} enableScopedSelectors tokens={getStackTokens()}>\r\n <Stack enableScopedSelectors>\r\n <div className={classNames.paymentThreshold}>\r\n {!passedThreshold\r\n ? `${formatMessage(messages.yourThreshold)} ${formattedThreshold}`\r\n : formatMessage(messages.reachedThreshold)}\r\n </div>\r\n <h1>\r\n {Number(data?.currBalance).toLocaleString(locale, {\r\n style: 'currency',\r\n currency: sysCurrency ?? DEFAULT_CURRENCY_CODE,\r\n })}\r\n </h1>\r\n <HorizontalBarChart\r\n barHeight={30}\r\n data={mapToBarChartData(data)}\r\n barChartCustomData={getBarChartCustomData(sysCurrency ?? DEFAULT_CURRENCY_CODE, locale)}\r\n hideTooltip\r\n />\r\n <div>\r\n <Icon className={classNames.iconStyle} iconName=\"Calendar\" />\r\n <span>{formatMessage(messages.genericNextPayout)}</span>\r\n </div>\r\n </Stack>\r\n </Stack>\r\n </Card>\r\n </div>\r\n );\r\n});\r\n","import { getTheme, IStackTokens, ITheme, mergeStyleSets } from '@fluentui/react';\r\nimport { AccessibilityContrast, IPubcenterPalette, IPubcenterTheme } from '../../../../../../theme';\r\nexport interface IEstimatedEarningsStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\ntype StyleProperties = 'activeButton' | 'buttonBorder' | 'chartTypes' | 'cardContainer';\r\ntype EstimatedEarningsStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: IEstimatedEarningsStyleProps): EstimatedEarningsStyles => {\r\n const { theme } = props;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const { Activated } = AccessibilityContrast;\r\n\r\n return mergeStyleSets({\r\n activeButton: {\r\n backgroundColor: palette.themePrimary,\r\n color: palette.themeLight,\r\n ':hover': {\r\n backgroundColor: palette.themePrimary,\r\n color: palette.themeLight,\r\n },\r\n ':active': {\r\n backgroundColor: palette.themePrimary,\r\n color: palette.themeLight,\r\n },\r\n [Activated]: {\r\n color: 'window',\r\n backgroundColor: 'windowtext',\r\n borderColor: 'windowtext',\r\n forcedColorAdjust: 'none',\r\n },\r\n },\r\n buttonBorder: {\r\n border: '1px solid',\r\n borderRadius: '2px',\r\n borderColor: palette.neutralLight,\r\n },\r\n chartTypes: {\r\n marginRight: '15px !important',\r\n },\r\n cardContainer: {\r\n height: '100%',\r\n },\r\n });\r\n};\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\nexport function getStackTokens(): IStackTokens {\r\n const theme = (getTheme() as unknown) as IPubcenterTheme;\r\n const spacing = theme.spacing;\r\n\r\n return { childrenGap: spacing.size12 };\r\n}\r\n","import { DefaultButton, IconButton, ShimmerElementsGroup, ShimmerElementType } from '@fluentui/react';\r\nimport { IChartProps, ILineChartPoints, IVerticalBarChartDataPoint, LineChart, VerticalBarChart } from '@fluentui/react-charting';\r\nimport React, { ReactNode } from 'react';\r\nimport { PaymentsPageEstimatedEarnings } from '../../../../../@data';\r\nimport { EmptyChart } from '../../../../../components/EmptyChart/EmptyChart';\r\nimport messages from '../PaymentsPage.messages';\r\nimport { getClassNames } from './EstimatedEarnings.styles';\r\nimport { ChartGrain, EstimatedEarningsChartTypes } from './EstimatedEarnings.types';\r\n\r\nconst chartColor = '#0099BC';\r\nexport const getShimmerCustomElements = () => {\r\n return (\r\n <div>\r\n <ShimmerElementsGroup\r\n flexWrap\r\n width=\"100%\"\r\n shimmerElements={[\r\n { type: ShimmerElementType.line, width: '100%' },\r\n { type: ShimmerElementType.gap, height: 30, width: '100%' },\r\n { type: ShimmerElementType.line, width: '100%' },\r\n { type: ShimmerElementType.gap, height: 30, width: '100%' },\r\n { type: ShimmerElementType.line, width: '100%' },\r\n { type: ShimmerElementType.gap, height: 30, width: '100%' },\r\n { type: ShimmerElementType.line, width: '100%' },\r\n { type: ShimmerElementType.gap, height: 30, width: '100%' },\r\n { type: ShimmerElementType.line, width: '100%' },\r\n { type: ShimmerElementType.gap, height: 30, width: '100%' },\r\n { type: ShimmerElementType.line, width: '100%' },\r\n ]}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport function mapToLineChartData(data: PaymentsPageEstimatedEarnings, grain) {\r\n const points: ILineChartPoints[] = [\r\n {\r\n data: data.earningDates.map((date, index) => {\r\n const localDate = parseDateKey(date);\r\n\r\n return { x: localDate, y: +data.earningValues[index].toFixed(2) };\r\n }),\r\n legend: 'Balance',\r\n color: chartColor,\r\n },\r\n ];\r\n const chartData: IChartProps = {\r\n chartTitle: 'Line Chart',\r\n lineChartData: points,\r\n };\r\n return chartData;\r\n}\r\n\r\nfunction parseDateKey(date: string) {\r\n const dateArray = date.split('-');\r\n const year = Number(dateArray[0]);\r\n const month = Number(dateArray[1]) || 1;\r\n const localDate = new Date(year, month - 1, 1, 0, 0, 0);\r\n return localDate;\r\n}\r\n\r\nexport function mapToBarChartData(data: PaymentsPageEstimatedEarnings, grain): IVerticalBarChartDataPoint[] {\r\n const dynamicData: IVerticalBarChartDataPoint[] = data.earningDates.map((date, index) => {\r\n const localDate = parseDateKey(date);\r\n const localeMonth = localDate.toLocaleString('default', { month: 'short' });\r\n const localYear = localDate.toLocaleString('default', { year: 'numeric' });\r\n // \\u2800 is unicode BRAILLE PATTERN BLANK character which is rendered as empty space\r\n // work around to prevent year from being parsed as number\r\n const xValue = grain === ChartGrain.MONTHLY ? `${localeMonth} ${localYear}` : `\\u2800${localYear}\\u2800`;\r\n return { x: xValue, y: data.earningValues[index] };\r\n });\r\n return dynamicData;\r\n}\r\n\r\nexport const getTopBarActions = (currentChartTypeStateManagement, activeGrainStateManagement, formatMessage, props): ReactNode => {\r\n const { setCurrentChartType, currentChartType } = currentChartTypeStateManagement;\r\n const { activeGrain, setActiveGrain } = activeGrainStateManagement;\r\n const isMonthlyGrain = activeGrain === ChartGrain.MONTHLY;\r\n const isYearlyGrain = activeGrain === ChartGrain.YEARLY;\r\n const classNames = getClassNames(props);\r\n const { activeButton, buttonBorder, chartTypes } = classNames;\r\n return (\r\n <>\r\n <div className={`${chartTypes} ${buttonBorder}`}>\r\n <IconButton\r\n iconProps={{ iconName: 'LineChart' }}\r\n ariaLabel=\"Line chart\"\r\n className={currentChartType === EstimatedEarningsChartTypes.LINE ? activeButton : ''}\r\n aria-expanded={currentChartType === EstimatedEarningsChartTypes.LINE ? true : false}\r\n onClick={() => {\r\n setCurrentChartType(EstimatedEarningsChartTypes.LINE);\r\n }}\r\n />\r\n <IconButton\r\n iconProps={{ iconName: 'BarChartVertical' }}\r\n ariaLabel=\"Bar chart vertical\"\r\n className={currentChartType === EstimatedEarningsChartTypes.VERTICAL_BAR ? activeButton : ''}\r\n aria-expanded={currentChartType === EstimatedEarningsChartTypes.VERTICAL_BAR ? true : false}\r\n onClick={() => {\r\n setCurrentChartType(EstimatedEarningsChartTypes.VERTICAL_BAR);\r\n }}\r\n />\r\n </div>\r\n <div className={buttonBorder}>\r\n <DefaultButton\r\n ariaLabel=\"Monthly\"\r\n className={isMonthlyGrain ? activeButton : buttonBorder}\r\n toggle\r\n checked={isMonthlyGrain}\r\n text={formatMessage(messages.estimatedEarningMonthly)}\r\n onClick={() => {\r\n setActiveGrain(ChartGrain.MONTHLY);\r\n }}\r\n allowDisabledFocus\r\n />\r\n <DefaultButton\r\n ariaLabel=\"Yearly\"\r\n className={isYearlyGrain ? activeButton : buttonBorder}\r\n toggle\r\n checked={isYearlyGrain}\r\n text={formatMessage(messages.estimatedEarningYearly)}\r\n onClick={() => {\r\n setActiveGrain(ChartGrain.YEARLY);\r\n }}\r\n allowDisabledFocus\r\n />\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport const getChart = (\r\n currentChartType: EstimatedEarningsChartTypes,\r\n currentGrain: ChartGrain,\r\n data: PaymentsPageEstimatedEarnings,\r\n size: { height: number; width: number },\r\n formatMessage\r\n) => {\r\n if (!data || !data.earningDates || data.earningDates.length <= 0) {\r\n return (\r\n <EmptyChart\r\n noDataText={formatMessage(messages.estimatedEarningsNoDataText)}\r\n noDataMessage={formatMessage(messages.estimatedEarningsNoDataMessage)}\r\n showGridLines\r\n />\r\n );\r\n }\r\n switch (currentChartType) {\r\n case EstimatedEarningsChartTypes.LINE:\r\n return (\r\n <LineChart\r\n yMaxValue={200}\r\n hideLegend={true}\r\n data={mapToLineChartData(data, currentGrain)}\r\n height={size.height}\r\n width={size.width}\r\n customDateTimeFormatter={customFormatDateAxisData(currentGrain)}\r\n tickValues={data.earningDates.map((date) => parseDateKey(date))}\r\n />\r\n );\r\n case EstimatedEarningsChartTypes.VERTICAL_BAR:\r\n return (\r\n <VerticalBarChart\r\n useSingleColor={true}\r\n colors={[chartColor]}\r\n hideLegend={true}\r\n yMaxValue={200}\r\n data={mapToBarChartData(data, currentGrain)}\r\n height={size.height}\r\n width={size.width}\r\n />\r\n );\r\n }\r\n};\r\nfunction customFormatDateAxisData(currentGrain: ChartGrain): (dateTime: Date) => string {\r\n return (dateTime) => {\r\n const month = dateTime.toLocaleString('default', { month: 'short' });\r\n const year = dateTime.toLocaleString('default', { year: 'numeric' });\r\n const xValue = currentGrain === ChartGrain.MONTHLY ? `${month} ${year}` : `${year}`;\r\n return xValue;\r\n };\r\n}\r\n","import React, { useEffect, useRef, useState } from 'react';\r\nimport { Card } from '../../../../../components/Card/Card';\r\nimport { useIntersectionObserverWithRefCallback } from '../../../../../hooks';\r\nimport { injectIntlAndObserver } from '../../../../../utils';\r\nimport { fetchPaymentsPageEstimatedEarnings } from '../../@data/actions';\r\nimport { getPaymentsPageEstimatedEarnings } from '../../@data/store/selectors';\r\nimport messages from '../PaymentsPage.messages';\r\nimport { getClassNames as getPaymentsCommonClassNames } from '../PaymentsPage.styles';\r\nimport { getChart, getShimmerCustomElements, getTopBarActions } from './EstimatedEarnings.helpers';\r\nimport { getClassNames } from './EstimatedEarnings.styles';\r\nimport { IEstimatedEarningsProps } from './EstimatedEarnings.types';\r\n\r\nconst DATA_METRIC_ID = 'estimated-earnings-card';\r\nconst CHART_DATA_METRIC_ID = 'estimated-earnings-chart';\r\nexport const EstimatedEarnings = injectIntlAndObserver<IEstimatedEarningsProps>((props) => {\r\n const { cardContainer } = getClassNames();\r\n const { cardsTitleBarStyle } = getPaymentsCommonClassNames(props);\r\n const { defaultChartType, defaultChartGrain, intl } = props;\r\n const { formatMessage } = intl;\r\n const [activeGrain, setActiveGrain] = useState(defaultChartGrain);\r\n const estimatedEarningsAllGrainData = getPaymentsPageEstimatedEarnings();\r\n const { data, isDataLoaded } = estimatedEarningsAllGrainData[activeGrain];\r\n const [intersectionEntry, targetObservationRef] = useIntersectionObserverWithRefCallback({});\r\n const isCardVisible = !!intersectionEntry?.isIntersecting;\r\n const [currentChartType, setCurrentChartType] = useState(defaultChartType);\r\n const ref = useRef<HTMLDivElement>(null);\r\n const [parentCardHeight, setHeight] = useState(0);\r\n const [parentCardWidth, setWidth] = useState(0);\r\n useEffect(() => {\r\n if (!isDataLoaded && isCardVisible) {\r\n fetchPaymentsPageEstimatedEarnings(activeGrain);\r\n }\r\n }, [isCardVisible, isDataLoaded, activeGrain]);\r\n useEffect(() => {\r\n const resizeObserver = new ResizeObserver((event) => {\r\n setWidth(event[0].contentBoxSize[0].inlineSize);\r\n setHeight(event[0].contentBoxSize[0].blockSize);\r\n });\r\n\r\n ref.current && resizeObserver.observe(ref.current);\r\n });\r\n\r\n return (\r\n <div className={cardContainer} data-metric={DATA_METRIC_ID} ref={targetObservationRef}>\r\n <Card\r\n titleText={formatMessage(messages.estimatedEarningsTitle)}\r\n shimmerCustomElement={getShimmerCustomElements()}\r\n isDataLoaded={isDataLoaded}\r\n cardTopBarActions={getTopBarActions(\r\n { currentChartType, setCurrentChartType },\r\n { activeGrain, setActiveGrain },\r\n formatMessage,\r\n props\r\n )}\r\n styleProps={{ titleBar: cardsTitleBarStyle }}\r\n >\r\n <div data-metric={CHART_DATA_METRIC_ID} ref={ref}>\r\n {getChart(currentChartType, activeGrain, data!, { height: parentCardHeight, width: parentCardWidth }, formatMessage)}\r\n </div>\r\n </Card>\r\n </div>\r\n );\r\n});\r\n","import { Stack } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { getAppStore, onHelpInfoCalloutOpened, onHelpInfoChanged } from '../../../../@data';\r\nimport { FormTitle } from '../../../../components/Form';\r\nimport { injectIntlAndObserver } from '../../../../utils';\r\nimport '../@data/orchestrators';\r\nimport { Balance } from './Balance/Balance';\r\nimport { EstimatedEarnings } from './EstimatedEarnings/EstimatedEarnings';\r\nimport { ChartGrain, EstimatedEarningsChartTypes } from './EstimatedEarnings/EstimatedEarnings.types';\r\nimport { PaymentsOnboarding } from './Onboarding/PaymentsOnboarding';\r\nimport messages from './PaymentsPage.messages';\r\nimport { chartsContainersStyles, getClassNames, getStackTokens } from './PaymentsPage.styles';\r\n\r\nexport const PaymentsPage = injectIntlAndObserver((props) => {\r\n const classNames = getClassNames(props);\r\n const { intl } = props;\r\n const { formatMessage } = intl;\r\n const { helpInfo, locale } = getAppStore();\r\n\r\n return (\r\n <div className=\"paymentsPageRoot\">\r\n <FormTitle\r\n intl={intl}\r\n title={formatMessage(messages.pageTitle)}\r\n styles={{ root: classNames.pageTitleStyle }}\r\n id=\"pop_PCv4_Payments\"\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_Payments', locale)}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n />\r\n\r\n <Stack styles={chartsContainersStyles} horizontal horizontalAlign=\"space-between\" wrap tokens={getStackTokens()}>\r\n <Stack.Item className={classNames.chartCard} grow>\r\n <Balance />\r\n </Stack.Item>\r\n <Stack.Item className={classNames.chartCard} grow>\r\n <EstimatedEarnings defaultChartType={EstimatedEarningsChartTypes.LINE} defaultChartGrain={ChartGrain.MONTHLY} />\r\n </Stack.Item>\r\n </Stack>\r\n <Stack horizontal horizontalAlign=\"space-between\" wrap tokens={getStackTokens()}>\r\n <Stack.Item className={classNames.chartCard} grow>\r\n <PaymentsOnboarding />\r\n </Stack.Item>\r\n </Stack>\r\n </div>\r\n );\r\n});\r\n","import React, { lazy } from 'react';\r\nimport { LazyComponent } from '../../../../components/LazyComponents';\r\n\r\n// @ts-ignore\r\nconst SettingsPageLazy = lazy(() => import('./AccountSettingsPage'));\r\n\r\nexport function LazySettingsPage() {\r\n return <LazyComponent lazyComponent={<SettingsPageLazy />} />;\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport const accountManageMessages = defineMessages({\r\n profileTab: {\r\n id: 'accountManageMessages.profileTab',\r\n defaultMessage: 'Profile Information',\r\n },\r\n paymentsTab: {\r\n id: 'accountManageMessages.paymentsTab',\r\n defaultMessage: 'Payments',\r\n },\r\n settingsTab: {\r\n id: 'accountManageMessages.settingsTab',\r\n defaultMessage: 'Account settings',\r\n },\r\n userManagementTab: {\r\n id: 'accountManageMessages.userManagementTab',\r\n defaultMessage: 'User Management',\r\n },\r\n});\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../types';\r\n\r\nexport interface IManagePageStyles {\r\n layoutRootStyle?: string;\r\n}\r\n\r\nexport const getStyles = (props: ICommonStyleProps): IManagePageStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { spacing } = theme;\r\n\r\n return mergeStyleSets({\r\n layoutRootStyle: {\r\n paddingTop: 0,\r\n paddingLeft: spacing.size24,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): IManagePageStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import React from 'react';\r\nimport { completeAccess, hasReadAccess, UserRoleEntity } from '../../../../@data/services/UserRoleService';\r\nimport { PublisherProfileTabs } from '../../../../@data/store/schema/userrolemodels/PublisherProfileTabs';\r\nimport { getEntityAccessPermissions } from '../../../../@data/utils/getAccessPermission';\r\nimport { ITabProps, Tabs } from '../../../../components/Tabs';\r\nimport { EmptyLayout } from '../../../../layout/EmptyLayout/EmptyLayout';\r\nimport { injectIntlWithObserver } from '../../../../utils';\r\nimport { LazyProfilePage } from '../../Profile/LazyProfilePage';\r\nimport UserManagementPage from '../../UserManagement/UserManagement';\r\nimport { PAYMENTS_TAB_KEY, PROFILE_TAB_KEY, SETTINGS_TAB_KEY, USER_MANAGEMENT_TAB_KEY } from '../constants';\r\nimport { PaymentsPage } from '../Payments/PaymentsPage';\r\nimport { LazySettingsPage } from '../Settings/LazySettingsPage';\r\nimport { accountManageMessages } from './ManagePage.messages';\r\nimport { getClassNames } from './ManagePage.styles';\r\n\r\n// TODO: Refactor this to use a common component for lazy loading logic\r\n\r\nexport const ManagePage = injectIntlWithObserver(({ intl: { formatMessage } }) => {\r\n const { layoutRootStyle } = getClassNames();\r\n\r\n const publisherProfileAccess = getEntityAccessPermissions(UserRoleEntity.PublisherProfileTabs) as PublisherProfileTabs | null;\r\n\r\n function getTabs() {\r\n const tabs: ITabProps[] = [];\r\n\r\n if (hasReadAccess(publisherProfileAccess === null ? completeAccess : publisherProfileAccess.profile)) {\r\n tabs.push({\r\n key: PROFILE_TAB_KEY,\r\n headerText: formatMessage(accountManageMessages.profileTab),\r\n component: <LazyProfilePage />,\r\n });\r\n }\r\n\r\n if (hasReadAccess(publisherProfileAccess === null ? completeAccess : publisherProfileAccess.userManagement)) {\r\n tabs.push({\r\n key: USER_MANAGEMENT_TAB_KEY,\r\n headerText: formatMessage(accountManageMessages.userManagementTab),\r\n component: <UserManagementPage />,\r\n });\r\n }\r\n\r\n if (hasReadAccess(publisherProfileAccess === null ? completeAccess : publisherProfileAccess.payments)) {\r\n tabs.push({\r\n key: PAYMENTS_TAB_KEY,\r\n headerText: formatMessage(accountManageMessages.paymentsTab),\r\n component: <PaymentsPage />, // Any custom component can be passed here\r\n });\r\n }\r\n\r\n if (hasReadAccess(publisherProfileAccess === null ? completeAccess : publisherProfileAccess.settings)) {\r\n tabs.push({\r\n key: SETTINGS_TAB_KEY,\r\n headerText: formatMessage(accountManageMessages.settingsTab),\r\n component: <LazySettingsPage />,\r\n });\r\n }\r\n\r\n return tabs;\r\n }\r\n\r\n return (\r\n <EmptyLayout styleProps={{ root: layoutRootStyle }}>\r\n <Tabs tabs={getTabs()} />\r\n </EmptyLayout>\r\n );\r\n});\r\n","import React, { useEffect } from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\nimport { LayoutMode, onLayoutChanged } from '../../../@data';\r\nimport { RouteName } from '../@data';\r\nimport { onCurrentRouteChanged } from '../@data/actions';\r\nimport { ManagePage } from './Manage/ManagePage';\r\n\r\nexport const AccountPage = injectIntl(function AccountPageComponent(props: RouteComponentProps & InjectedIntlProps): JSX.Element {\r\n useEffect(() => {\r\n onLayoutChanged(LayoutMode.Default);\r\n onCurrentRouteChanged(RouteName.publisherProfile, props.intl.formatMessage);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return <ManagePage {...props} />;\r\n});\r\n","import { action } from 'satcheljs';\r\nimport { MediationReportingDataRequestBody } from '../../../../../@data/store/schema/models/MediationReportingDataRequestBody';\r\nimport { ReportColumnMembersParams } from '../../../../../@data/store/schema/models/ReportColumnMembersParams';\r\nimport { ReportingDataRequestBody } from '../../../../../@data/store/schema/models/ReportingDataRequestBody';\r\nimport { ReportCardType } from '../../ReportCard/ReportCard.types';\r\n\r\nexport const fetchReportPageSummary = action('fetchReportPageSummary', (reportRequestBody: ReportingDataRequestBody) => ({\r\n reportRequestBody,\r\n}));\r\nexport const fetchReportPageMediationSummary = action(\r\n 'fetchReportPageMediationSummary',\r\n (reportRequestBody: MediationReportingDataRequestBody) => ({\r\n reportRequestBody,\r\n })\r\n);\r\nexport const fetchReportPageSites = action('fetchReportPageSites', (reportRequestBody: ReportingDataRequestBody) => ({\r\n reportRequestBody,\r\n}));\r\nexport const fetchReportPageAdUnits = action('fetchReportPageAdUnits', (reportRequestBody: ReportingDataRequestBody) => ({\r\n reportRequestBody,\r\n}));\r\nexport const fetchReportPageCountry = action('fetchReportPageCountry', (reportRequestBody: ReportingDataRequestBody) => ({\r\n reportRequestBody,\r\n}));\r\nexport const fetchReportPageMediation = action('fetchReportPageMediation', (reportRequestBody: MediationReportingDataRequestBody) => ({\r\n reportRequestBody,\r\n}));\r\nexport const fetchReportPagePerformance = action('fetchReportPagePerformance', (reportRequestBody: ReportingDataRequestBody) => ({\r\n reportRequestBody,\r\n}));\r\nexport const fetchReportPageDetailedSites = action('fetchReportPageDetailedSites', (reportRequestBody: ReportingDataRequestBody) => ({\r\n reportRequestBody,\r\n}));\r\nexport const fetchReportPageDetailedAdUnits = action('fetchReportPageDetailedAdUnits', (reportRequestBody: ReportingDataRequestBody) => ({\r\n reportRequestBody,\r\n}));\r\nexport const fetchReportPageDetailedPerformance = action(\r\n 'fetchReportPageDetailedPerformance',\r\n (reportRequestBody: ReportingDataRequestBody) => ({\r\n reportRequestBody,\r\n })\r\n);\r\nexport const fetchReportPageDetailedCountry = action('fetchReportPageDetailedCountry', (reportRequestBody: ReportingDataRequestBody) => ({\r\n reportRequestBody,\r\n}));\r\nexport const fetchReportPageDetailedMediation = action(\r\n 'fetchReportPageDetailedMediation',\r\n (reportRequestBody: MediationReportingDataRequestBody) => ({\r\n reportRequestBody,\r\n })\r\n);\r\nexport const fetchMediationReportsMetadata = action('fetchMediationReportsMetadata');\r\nexport const fetchReportsMetadata = action('fetchReportsMetadata');\r\nexport const fetchReportDimensionColumnMembers = action(\r\n 'fetchReportDimensionColumnMembers',\r\n (requestParams: ReportColumnMembersParams, reportCardType?: ReportCardType) => ({\r\n requestParams,\r\n reportCardType,\r\n })\r\n);\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { IColumnMemberDetails } from '../store/schema';\r\nimport { getReportPageStore } from '../store/store';\r\n\r\nexport const setColumnMembers = mutatorAction('setColumnMembers', (dimension: string, columnMembers: IColumnMemberDetails[]) => {\r\n getReportPageStore().columnMembers[dimension] = { isDataLoaded: true, data: columnMembers };\r\n});\r\nexport const resetColumnMembers = mutatorAction('resetColumnMembers', () => {\r\n getReportPageStore().columnMembers = {};\r\n});\r\nexport const setReportType = mutatorAction('setReportType', (reportType: string) => {\r\n getReportPageStore().reportType = reportType;\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n profileTitle: {\r\n id: 'profile.title',\r\n defaultMessage: 'Profile',\r\n },\r\n profileHeading: {\r\n id: 'profile.heading',\r\n defaultMessage: 'Profile management',\r\n },\r\n profileDescription: {\r\n id: 'profile.description',\r\n defaultMessage: \"You cannot manually update your profile at this time. Don't worry—you will be able to soon!\",\r\n },\r\n profileSubtitle: {\r\n id: 'profile.subtitle',\r\n defaultMessage: 'COMING SOON',\r\n },\r\n profileIncomplete: {\r\n id: 'profile.incomplete',\r\n defaultMessage: 'Complete your profile; tell us more about you!',\r\n },\r\n manageProfile: {\r\n id: 'profile.manage',\r\n defaultMessage: 'Manage your profile',\r\n },\r\n underReviewTitle: {\r\n id: 'profile.underReviewTitle',\r\n defaultMessage: \"We're reviewing your profile\",\r\n },\r\n underReviewDescription: {\r\n id: 'profile.underReviewDescription',\r\n defaultMessage: \"Our review can take up to seven business days, and we'll notify you as soon as it's approved.\",\r\n },\r\n approvedTitle: {\r\n id: 'profile.approvedTitle',\r\n defaultMessage: 'Your account is now active',\r\n },\r\n approvedDescription: {\r\n id: 'profile.approvedDescription',\r\n defaultMessage: 'Congratulations! We successfully verified your profile and activated your account!',\r\n },\r\n retryTitle: {\r\n id: 'profile.retryTitle',\r\n defaultMessage: 'Your profile needs attention!',\r\n },\r\n retryDescription: {\r\n id: 'profile.retryDescription',\r\n defaultMessage: \"Your profile doesn't meet our policy requirements. Please review your profile before taking further action.\",\r\n },\r\n rejectedTitle: {\r\n id: 'profile.rejectedTitle',\r\n defaultMessage: \"We weren't able to verify your identity\",\r\n },\r\n rejectedDescriptionPart1: {\r\n id: 'profile.rejectedDescriptionPart1',\r\n defaultMessage: \"Because your account doesn't comply with our\",\r\n },\r\n rejectedDescriptionPart2: {\r\n id: 'profile.rejectedDescriptionPart2',\r\n defaultMessage: 'it has seven days before removal. If you have any questions or concerns regarding our decision, please contact',\r\n },\r\n rejectedBannerPart1: {\r\n id: 'profile.rejectedBannerPart1',\r\n defaultMessage: \"We have rejected your profile because it doesn't comply with our\",\r\n },\r\n rejectedBannerPart2: {\r\n id: 'profile.rejectedBannerPart2',\r\n defaultMessage: 'Your account will be removed in 7 days.',\r\n },\r\n termsAndConditions: {\r\n id: 'profile.termsAndConditions',\r\n defaultMessage: 'Terms and Conditions',\r\n },\r\n viewProfile: {\r\n id: 'profile.notification.button',\r\n defaultMessage: 'View profile',\r\n },\r\n});\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onFetchPublisherPreferences = action('onFetchEntityPreferences');\r\n\r\nexport const onFetchUserPreferences = action('onFetchEntityPreferences', (locale?: string) => ({ locale }));\r\n\r\nexport const onUpdateSystemPreferences = action('onUpdateSystemPreferences');\r\n\r\nexport const onUpdateUserLanguage = action(\r\n 'onUpdateUserLanguage',\r\n (locale, closePanel?: () => void, setFormChanged?: (state: boolean) => void) => ({ closePanel, setFormChanged, locale })\r\n);\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onFetchTnC = action('onFetchTnC', (locale?: string) => ({ locale }));\r\n\r\nexport const setNotificationPanelTriggered = action('setNotificationPanelTriggered', (isTrigerred: boolean) => ({ isTrigerred }));\r\n","import { FontWeights, getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubCenterFonts, IPubcenterSpacing } from '../../../theme';\r\nimport { IEmptyLayoutStyleProps, IEmptyLayoutStyles } from './EmptyLayout.types';\r\n\r\nexport const getStyles = (props: IEmptyLayoutStyleProps): IEmptyLayoutStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const { size16, size32 } = spacing;\r\n const fonts = theme.fonts as IPubCenterFonts;\r\n\r\n return mergeStyleSets({\r\n root: {\r\n padding: size32,\r\n overflowY: 'auto',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flex: '1 1 0',\r\n },\r\n heading: {\r\n margin: `0 0 ${size16} 0`,\r\n ...fonts.size28,\r\n fontWeight: FontWeights.semibold,\r\n },\r\n description: {\r\n ...fonts.size16,\r\n marginBottom: size16,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): IEmptyLayoutStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { mergeStyleSets } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { Main } from '../../components/Main/Main';\r\nimport { getClassNames } from './EmptyLayout.styles';\r\nimport { IEmptyLayoutProps } from './EmptyLayout.types';\r\n\r\nexport function EmptyLayout({ headingTitle, descriptionText, children, styleProps }: IEmptyLayoutProps): JSX.Element {\r\n const { root, heading, description } = mergeStyleSets(getClassNames(), styleProps);\r\n\r\n return (\r\n <Main className={root}>\r\n {headingTitle && <h1 className={heading}>{headingTitle}</h1>}\r\n {descriptionText && <div className={description}>{descriptionText}</div>}\r\n {children}\r\n </Main>\r\n );\r\n}\r\n","import { createStore } from 'satcheljs';\r\nimport { DEFAULT_NON_TYTHON_TNC, DEFAULT_TNC } from '../orchestrators';\r\n\r\nexport interface ITnC {\r\n content: string;\r\n nonTythonContent: string;\r\n latestTnCReleaseDate?: string;\r\n latestTnCVersion?: string;\r\n isDataLoaded: boolean;\r\n isNotificationPanelTrigerred?: boolean;\r\n}\r\n\r\nexport const getStore = createStore<ITnC>('ITnC', {\r\n content: DEFAULT_TNC,\r\n nonTythonContent: DEFAULT_NON_TYTHON_TNC,\r\n latestTnCReleaseDate: undefined,\r\n latestTnCVersion: undefined,\r\n isDataLoaded: false,\r\n isNotificationPanelTrigerred: false,\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n notificationText: {\r\n id: 'detectAdBlock.notificationText',\r\n defaultMessage:\r\n 'An Adblocker is detected. Part of the website might not work with Adblocker enabled. Please consider disabling it for this website.',\r\n },\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { useEffect } from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport { onNotificationChanged } from '../../@data';\r\nimport { useDetectAdBlock } from '../../hooks/useDetectAdBlock';\r\nimport { INotificationBarItem } from '../NotificationBar';\r\nimport messages from './DetectAdBlock.messages';\r\n\r\nexport const DetectAdBlock = injectIntl(({ intl }) => {\r\n const adBlockDetected = useDetectAdBlock();\r\n\r\n useEffect(() => {\r\n if (adBlockDetected) {\r\n const notification: INotificationBarItem = {\r\n text: intl.formatMessage(messages.notificationText),\r\n messageBarType: MessageBarType.warning,\r\n suppressAutoDismiss: true,\r\n };\r\n\r\n onNotificationChanged(notification);\r\n }\r\n }, [adBlockDetected, intl]);\r\n\r\n return null;\r\n});\r\n","/* tslint:disable */\r\nimport { AnimationClassNames, getFocusStyle, IStyle } from '@fluentui/react';\r\nimport { BreakPoints } from '../../../theme';\r\nimport { noPointerEvents } from '../../utils/GlobalStyleUtils';\r\nimport { INavStyleProps, INavStyles } from './Nav.types';\r\n\r\nexport type INavItemStyle = {\r\n root?: IStyle;\r\n iconColumn?: IStyle;\r\n nameColumn?: IStyle;\r\n};\r\n\r\nexport type IFloatingNavStyle = IStyle & {\r\n root?: IStyle;\r\n withChild?: IStyle;\r\n};\r\n\r\nconst { ResponsiveSmall } = BreakPoints;\r\n\r\nconst navFontSize = 14;\r\nconst navTextColor = '#FFF';\r\nconst navWidth = 228;\r\nconst navCollapsedWidth = 48;\r\nconst shortenedIconWidth = 32;\r\nconst navFloatingWidth = 230;\r\nconst navItemHeight = 48;\r\nconst navChildItemHeight = 32;\r\nconst navBackgroundColor = '#EDEBE9';\r\nconst floatingNavBackgroundColor = 'rgba(255,255,255,1)';\r\nconst navItemHoverColor = '#CCCCCC';\r\nconst navGroupSeparatorItemHeight = 40;\r\nconst navGroupSeparatorWithGroupNameHeight = 70;\r\nconst navItemWithChildBgColor = '#CCCCCC';\r\nconst navItemSelectedColor = '#B7B7B7';\r\nconst navItemIndentSize = 50;\r\nconst navFloatingItemIndentSize = 20;\r\nconst BackDropSelector = '@supports (backdrop-filter: blur(20px)) or (-webkit-backdrop-filter: blur(20px))';\r\nconst navItemContainerSelector = 'ul';\r\nconst navFocusZoneInnerContainerSelector = 'div#navFocusZone>nav';\r\nconst navExpandCollapseButtonInnerContainerSelector = 'a#expandCollapseButton';\r\nconst navExpandCollapseButtonBackgroundContainerSelector = 'i[data-icon-name=\"GlobalNavButton\"]';\r\n\r\nconst getResponsiveNavStyles = (isCollapsed = false) => ({\r\n [ResponsiveSmall]: {\r\n width: isCollapsed ? 0 : navWidth,\r\n ...(isCollapsed\r\n ? {}\r\n : {\r\n position: 'absolute',\r\n height: `calc(100vh - ${navItemHeight}px)`,\r\n }),\r\n [navItemContainerSelector]: {\r\n ...(isCollapsed ? { display: 'none' } : {}),\r\n },\r\n [navFocusZoneInnerContainerSelector]: {\r\n top: 0,\r\n position: 'fixed',\r\n width: navWidth,\r\n },\r\n [navExpandCollapseButtonInnerContainerSelector]: {\r\n ...(isCollapsed ? {} : { backgroundColor: 'rgb(237, 235, 233)' }),\r\n width: isCollapsed ? navCollapsedWidth : navWidth,\r\n },\r\n [navExpandCollapseButtonBackgroundContainerSelector]: {\r\n ...(isCollapsed ? { color: '#ffffff' } : {}),\r\n },\r\n },\r\n});\r\n\r\nexport const getStyles = (props: INavStyleProps): INavStyles => {\r\n const { isSelected, hasChildren, nestingLevel, isCollapsed, scrollTop, isChildLinkSelected, hasGroupName, theme, groupIndex } = props;\r\n\r\n const isFirstNavGroup = groupIndex === 0;\r\n\r\n return {\r\n root: {\r\n width: isCollapsed ? navCollapsedWidth : navWidth,\r\n backgroundColor: navBackgroundColor,\r\n color: navTextColor,\r\n selectors: {\r\n ul: {\r\n listStyleType: 'none',\r\n padding: 0,\r\n margin: 0,\r\n fontSize: navFontSize,\r\n selectors: {\r\n 'li:hover >div': {\r\n display: 'block',\r\n },\r\n },\r\n },\r\n a: {\r\n color: `${navTextColor} !important`,\r\n outline: 'none',\r\n },\r\n },\r\n ...getResponsiveNavStyles(isCollapsed),\r\n },\r\n overlay: {\r\n [ResponsiveSmall]: {\r\n ...(isCollapsed\r\n ? {}\r\n : {\r\n width: `calc(100vw - ${navWidth}px)`,\r\n height: `calc(100vh - ${navItemHeight}px)`,\r\n backgroundColor: '#000000',\r\n opacity: 0.3,\r\n marginLeft: navWidth,\r\n position: 'absolute',\r\n }),\r\n },\r\n },\r\n navItemRoot: {\r\n height: !!nestingLevel && nestingLevel > 0 ? navChildItemHeight : navItemHeight,\r\n cursor: 'pointer',\r\n paddingLeft: !!nestingLevel && nestingLevel > 0 ? nestingLevel * navItemIndentSize : 'inherit',\r\n selectors: {\r\n ':hover': {\r\n backgroundColor: hasChildren ? navItemWithChildBgColor : navItemHoverColor,\r\n },\r\n ':active': {\r\n backgroundColor: navItemSelectedColor,\r\n },\r\n },\r\n },\r\n navItemBarMarker: {\r\n marginLeft: !!nestingLevel && nestingLevel > 0 && !hasChildren ? '-10px' : '6px',\r\n marginRight: !!nestingLevel && nestingLevel > 0 && !hasChildren ? '8px' : '0px',\r\n marginTop: !!nestingLevel && nestingLevel > 0 ? '7px' : '12px',\r\n width: '2px',\r\n height: !!nestingLevel && nestingLevel > 0 ? '18px' : '24px',\r\n backgroundColor: '#0078D4',\r\n display: isSelected || isChildLinkSelected ? 'inline-block' : 'none',\r\n borderWidth: 0,\r\n },\r\n navItemIconColumn: {\r\n width: isSelected || isChildLinkSelected ? shortenedIconWidth : navCollapsedWidth,\r\n fontSize: '16px',\r\n lineHeight: !!nestingLevel && nestingLevel > 0 ? navChildItemHeight : navItemHeight,\r\n textAlign: 'center',\r\n color: '#000000',\r\n verticalAlign: 'top',\r\n },\r\n navItemNameColumn: {\r\n width: '100%',\r\n marginLeft: isChildLinkSelected || (!hasChildren && isSelected && !(nestingLevel && nestingLevel > 0)) ? '8px' : '0px',\r\n lineHeight: !!nestingLevel && nestingLevel > 0 ? navChildItemHeight : navItemHeight,\r\n verticalAlign: 'top',\r\n display: 'inline-block',\r\n textOverflow: 'ellipsis',\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n color: '#000000',\r\n },\r\n navSlimItemRoot: {\r\n selectors: {\r\n ':hover': {\r\n backgroundColor: hasChildren ? navItemWithChildBgColor : navItemHoverColor,\r\n },\r\n },\r\n },\r\n navFloatingRoot: [\r\n {\r\n display: 'none',\r\n zIndex: 1901,\r\n position: 'absolute',\r\n marginLeft: navCollapsedWidth,\r\n marginTop: -navItemHeight - (!!scrollTop && scrollTop > 0 ? scrollTop : 0),\r\n width: navFloatingWidth,\r\n color: navTextColor,\r\n boxShadow: '0px 1.2px 3.6px rgba(0, 0, 0, 0.18), 0px 6.4px 14.4px rgba(0, 0, 0, 0.22)',\r\n backgroundColor: floatingNavBackgroundColor,\r\n opacity: '0.6',\r\n selectors: {\r\n [BackDropSelector]: {\r\n webkitBackdropFilter: 'blur(20px) saturate(125%)',\r\n backdropFilter: 'blur(20px) saturate(125%)',\r\n backgroundColor: 'rgba(255,255,255,.6)',\r\n },\r\n a: {\r\n width: '100%',\r\n backgroundColor: 'inherit',\r\n },\r\n },\r\n },\r\n AnimationClassNames.slideRightIn20,\r\n ],\r\n navFloatingItemRoot: {\r\n height: !!nestingLevel && nestingLevel > 0 ? navChildItemHeight : navItemHeight,\r\n cursor: 'pointer',\r\n backgroundColor: !(nestingLevel && nestingLevel > 0) ? navItemHoverColor : floatingNavBackgroundColor,\r\n paddingLeft: navFloatingItemIndentSize,\r\n selectors: {\r\n ':hover': {\r\n backgroundColor: !!nestingLevel && nestingLevel > 0 ? navItemHoverColor : 'unset',\r\n },\r\n ':active': {\r\n backgroundColor: navItemSelectedColor,\r\n },\r\n },\r\n },\r\n navGroupSeparatorRoot: isFirstNavGroup\r\n ? {\r\n width: '100%',\r\n height: hasGroupName ? navGroupSeparatorItemHeight : undefined,\r\n textAlign: 'center',\r\n }\r\n : {\r\n width: '100%',\r\n height: hasGroupName ? navGroupSeparatorWithGroupNameHeight : navGroupSeparatorItemHeight,\r\n textAlign: 'center',\r\n },\r\n navGroupSeparatorHrLine: isFirstNavGroup\r\n ? undefined\r\n : {\r\n position: 'relative',\r\n height: '20px',\r\n borderBottom: `1px solid ${navItemWithChildBgColor}`,\r\n },\r\n navGroupSeparatorHeaderGroupName: {\r\n position: 'absolute',\r\n marginTop: isFirstNavGroup || !hasGroupName ? undefined : '40px',\r\n left: '16px',\r\n color: '#000000',\r\n fontWeight: 'bold',\r\n },\r\n navToggler: {\r\n height: navItemHeight,\r\n cursor: 'pointer',\r\n selectors: {\r\n ':hover': {\r\n backgroundColor: navItemHoverColor,\r\n },\r\n },\r\n textAlign: 'left',\r\n },\r\n disabledStyle: {\r\n ...noPointerEvents,\r\n opacity: 0.5,\r\n },\r\n focusedStyle: [\r\n getFocusStyle(theme, undefined, undefined, undefined, 'transparent', undefined),\r\n {\r\n display: 'block',\r\n position: 'relative',\r\n height: !!nestingLevel && nestingLevel > 0 ? navChildItemHeight : navItemHeight,\r\n width: '100%',\r\n lineHeight: !!nestingLevel && nestingLevel > 0 ? navChildItemHeight : navItemHeight,\r\n },\r\n ],\r\n };\r\n};\r\n\r\n/* tslint:enable */\r\n","/* tslint:disable */\r\n\r\nimport {\r\n INavLink as OfficeFabricNavLink,\r\n INavLinkGroup,\r\n INavState as OfficeFabricINavState,\r\n IStyle,\r\n IStyleFunctionOrObject,\r\n ITheme,\r\n} from '@fluentui/react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\n\r\n/* tslint:enable */\r\n\r\nexport enum NavGroupType {\r\n ToggleGroup,\r\n MenuGroup,\r\n CustomizationGroup,\r\n}\r\n\r\nexport interface INavProps {\r\n /**\r\n * A collection of link groups to display in the navigation bar\r\n */\r\n groups: ICustomNavLinkGroup[] | null;\r\n\r\n /**\r\n * (Optional) The key of the nav item initially selected.\r\n */\r\n initialSelectedKey?: string;\r\n\r\n /**\r\n * (Optional) The key of the nav item selected by caller.\r\n */\r\n selectedKey?: string;\r\n\r\n /**\r\n * (Optional) Used to toggle the nav component between expanded and collapsed state\r\n */\r\n isNavCollapsed?: boolean;\r\n\r\n /**\r\n * (Optional) If used inside a parent element with scrollbar, provide the parent element id to properly position\r\n * the floating nav by considering the scroll bar.\r\n */\r\n navScrollerId?: string;\r\n\r\n /**\r\n * (Optional) Aria label for the main menu\r\n */\r\n\r\n ariaLabel?: string;\r\n\r\n /**\r\n * (Optional) Call to provide customized styling that will layer on top of the variant rules\r\n */\r\n styles?: IStyleFunctionOrObject<INavStyleProps, INavStyles>;\r\n\r\n /**\r\n * (Optional) Used for telemetry\r\n */\r\n dataHint?: string;\r\n\r\n /**\r\n * (Optional) When enabled\r\n * 1. Links will consider isHidden property to show/hide itself.\r\n * 2. There will be a customization group with show more/less link to show/hide hidden links.\r\n * 3. There will also be an edit nav link button. This is for the partner to implement the UX which\r\n * will customize the isHidden property of the nav link (possibly through a flyout and refresh the Nav component).\r\n */\r\n enableCustomization?: boolean;\r\n\r\n /**\r\n * Used to override isHidden property of the Nav link when the \"Show More\" link is clicked\r\n */\r\n showMore?: boolean;\r\n\r\n /**\r\n * Theme provided by HOC.\r\n */\r\n theme?: ITheme;\r\n\r\n /**\r\n * (Optional) callback for the parent component when the nav component is toggled between expanded and collapsed state\r\n */\r\n onNavCollapsedCallback?(isCollapsed: boolean): void;\r\n\r\n /**\r\n * (Optional) callback for the Nav and SlimNav component when the \"Show more\" / \"Show less\" nav link is clicked.\r\n * The state \"showMore\" stays in the parent NavToggler component to keep show more/less state of Nav and SlimNav component in sync.\r\n */\r\n onShowMoreLinkClicked?(ev: React.MouseEvent<HTMLElement>): void;\r\n\r\n /**\r\n * (Optional) callback for the parent component when the nav node is toggled between expanded and collapsed state\r\n */\r\n onNavNodeExpandedCallback?(nodeKey: string, isExpanded: boolean): void;\r\n\r\n /**\r\n * (Optional) callback for the parent component when the edit nav node is clicked\r\n */\r\n onEditLeftNavClickedCallback?(): void;\r\n}\r\n\r\nexport interface INavTogglerProps extends INavProps, InjectedIntlProps {\r\n /**\r\n * (Optional) callback for the consumer of NavToggler to know about the \"Show more\" / \"Show less\" event.\r\n */\r\n onShowMoreLinkClicked?(ev: React.MouseEvent<HTMLElement>, showMore?: boolean): void;\r\n}\r\n\r\nexport interface INavState extends OfficeFabricINavState {\r\n /**\r\n * Used to toggle the nav component between expanded and collapsed state.\r\n */\r\n isNavCollapsed?: boolean;\r\n\r\n /**\r\n * Used to override isHidden property of the Nav link when the \"Show More\" link is clicked\r\n */\r\n showMore?: boolean;\r\n\r\n /**\r\n * Used to lock the auto collapse logic when user manually expand the navigation\r\n */\r\n lockAutoCollapse?: boolean;\r\n}\r\n\r\nexport interface INavLink extends OfficeFabricNavLink {\r\n /**\r\n * (Optional) Used to adjust the floating nav when the scrollbar appears\r\n */\r\n scrollTop?: number;\r\n\r\n /**\r\n * (Optional) Show / hide the nav link\r\n */\r\n isHidden?: boolean;\r\n\r\n /**\r\n * (Optional) Localized alternate text for the name field.\r\n */\r\n alternateText?: string;\r\n\r\n /**\r\n * (Optional) To identify whether this link is show more/less and\r\n * provide internal implementation to show/hide nav links based on isHidden property.\r\n */\r\n isShowMoreLink?: boolean;\r\n\r\n /**\r\n * (Optional) Provides an ability to toggle auto expand when the selectedKey prop is one of the child of this link\r\n */\r\n disableAutoExpand?: boolean;\r\n}\r\n\r\nexport interface ICustomNaveLink extends INavLink {\r\n /**\r\n * (Optional) Used to provide the tooltip text\r\n */\r\n tooltipText?: string;\r\n}\r\n\r\nexport interface ICustomNavLinkGroup extends INavLinkGroup {\r\n /**\r\n * Used to identify whether the nav group is toggle group or menu group or the customization group.\r\n */\r\n groupType: NavGroupType;\r\n\r\n /**\r\n * Used to show custom nav links\r\n */\r\n links: ICustomNaveLink[];\r\n}\r\n\r\nexport interface INavStyleProps {\r\n /**\r\n * Accept theme prop.\r\n */\r\n theme: ITheme;\r\n\r\n /**\r\n * is element selected boolean\r\n */\r\n isSelected?: boolean;\r\n\r\n /**\r\n * has children boolean\r\n */\r\n hasChildren?: boolean;\r\n\r\n /**\r\n * has group name\r\n */\r\n hasGroupName?: boolean;\r\n\r\n /**\r\n * has child be selected boolean\r\n */\r\n isChildLinkSelected?: boolean;\r\n\r\n /**\r\n * nesting level of the nav item in the nav tree\r\n */\r\n nestingLevel?: number;\r\n\r\n /**\r\n * is nav collapsed boolean\r\n */\r\n isCollapsed?: boolean;\r\n\r\n /**\r\n * if the component is hosted inside a scroll bar, send the scrollTop to position the floating nav relative to it's parent\r\n */\r\n scrollTop?: number;\r\n\r\n /**\r\n * zero based nav group index in the nav\r\n */\r\n groupIndex?: number;\r\n}\r\n\r\nexport interface INavStyles {\r\n /**\r\n * Style set for the nav component root\r\n */\r\n root: IStyle;\r\n\r\n /**\r\n * Style set for the nav item root\r\n */\r\n navItemRoot: IStyle;\r\n\r\n /**\r\n * Style set for the bar marker in the nav item\r\n */\r\n navItemBarMarker: IStyle;\r\n\r\n /**\r\n * Style set for the icon column in the nav item\r\n */\r\n navItemIconColumn: IStyle;\r\n\r\n /**\r\n * Style set for the name column in the nav item\r\n */\r\n navItemNameColumn: IStyle;\r\n\r\n /**\r\n * Style set for the slim version of nav item\r\n */\r\n navSlimItemRoot: IStyle;\r\n\r\n /**\r\n * Style set for the floating nav root in the slim version\r\n */\r\n navFloatingRoot: IStyle;\r\n\r\n /**\r\n * Style set for the floating nav item root\r\n */\r\n navFloatingItemRoot: IStyle;\r\n\r\n /**\r\n * Style set for the nav group separator\r\n */\r\n navGroupSeparatorRoot: IStyle;\r\n\r\n /**\r\n * Style set for the horizontal line in nav group separator\r\n */\r\n navGroupSeparatorHrLine: IStyle;\r\n\r\n /**\r\n * Style set for the group name in nav group separator\r\n */\r\n navGroupSeparatorHeaderGroupName: IStyle;\r\n\r\n /**\r\n * Style set for the nav toggler which toggles expanded and slim nav\r\n */\r\n navToggler: IStyle;\r\n\r\n /**\r\n * Style set to apply border on keyboard focus\r\n */\r\n focusedStyle: IStyle;\r\n\r\n /**\r\n * Style set to stop pointer events\r\n *\r\n */\r\n disabledStyle: IStyle;\r\n /**\r\n * Overlay stylings for responsive nav\r\n */\r\n overlay: IStyle;\r\n}\r\n\r\nexport interface INavLinkProps extends React.AllHTMLAttributes<HTMLAnchorElement> {\r\n /**\r\n * Used for telemetry\r\n */\r\n dataHint?: string;\r\n\r\n /**\r\n * Used for telemetry\r\n */\r\n dataValue?: string;\r\n\r\n /**\r\n * Used by the screen reader to describe the nav link\r\n */\r\n ariaLabel?: string;\r\n\r\n /**\r\n * True means the nav link is currently expanded (visible), false means the nav link is currently collapsed (invisible)\r\n */\r\n ariaExpanded?: boolean;\r\n\r\n /**\r\n * The true means it is the current item within a set. False means it is not the current item.\r\n * \"page\" means that it is the current page within a set of pages.\r\n */\r\n ariaCurrent?: boolean | 'page';\r\n\r\n /**\r\n * CSS class for the nav link container\r\n */\r\n rootClassName?: string;\r\n\r\n /**\r\n * Icon name for the icon shown on the left side of the nav link\r\n */\r\n leftIconName?: string;\r\n\r\n /**\r\n * Icon name for the icon shown on the right side of the nav link\r\n */\r\n rightIconName?: string;\r\n\r\n /**\r\n * CSS class for the text part of the nav link\r\n */\r\n textClassName?: string;\r\n\r\n /**\r\n * CSS class for the icon part of the nav link\r\n */\r\n iconClassName?: string;\r\n\r\n /**\r\n * CSS class for the bar marker part of the nav link\r\n */\r\n barClassName?: string;\r\n\r\n /**\r\n * Style to apply border on keyboard focus\r\n */\r\n focusedStyle?: string;\r\n\r\n /**\r\n * Style to stop pointer events\r\n */\r\n disabledStyle?: string;\r\n}\r\n","import { getDocument, INav } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { INavLink, INavProps, INavState } from './Nav.types';\r\n\r\nexport class NavBase extends React.Component<INavProps, INavState> implements INav {\r\n protected _hasAtleastOneHiddenLink = false;\r\n\r\n public get selectedKey(): string | undefined {\r\n return this.state.selectedKey;\r\n }\r\n\r\n // mandatory function from the INav interface. Focus on the first button/link when called\r\n public focus(forceIntoFirstElement?: boolean | undefined): boolean {\r\n const document = getDocument();\r\n const expandCollapseButton = document ? (document.querySelector('#expandCollapseButton') as HTMLElement) : null;\r\n const navFocusZone = document ? (document.querySelector('#navFocusZone') as HTMLElement) : null;\r\n\r\n if (forceIntoFirstElement && !!expandCollapseButton) {\r\n expandCollapseButton.focus();\r\n return true;\r\n }\r\n\r\n if (navFocusZone) {\r\n navFocusZone.focus();\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n protected getPreferredSelectedKey(): string {\r\n let selectedKey = '';\r\n\r\n // if caller passes in selectedKey, use it as first choice or use current state.selectedKey\r\n if (this.props.selectedKey) {\r\n selectedKey = this.props.selectedKey;\r\n } else if (this.state.selectedKey) {\r\n selectedKey = this.state.selectedKey;\r\n }\r\n\r\n return selectedKey;\r\n }\r\n\r\n /* given a link, find if one of the child is selected */\r\n protected isChildLinkSelected(link: INavLink): boolean {\r\n const selectedKey = this.getPreferredSelectedKey();\r\n\r\n if (!selectedKey || !link || !link.links || link.links.length === 0) {\r\n return false;\r\n }\r\n\r\n return link.links.some((childLink: INavLink) => {\r\n return !!childLink && childLink.key === selectedKey;\r\n });\r\n }\r\n\r\n // given a link and an optional includeChildren parameter, find if the link or any of the children is selected\r\n protected isLinkSelected(link: INavLink, includeChildren: boolean): boolean {\r\n const selectedKey = this.getPreferredSelectedKey();\r\n\r\n if (!selectedKey || !link) {\r\n return false;\r\n }\r\n\r\n // check if the link or any of the child link is selected\r\n return link.key === selectedKey || (includeChildren && this.isChildLinkSelected(link));\r\n }\r\n\r\n protected getLinkText(link: INavLink, showMore?: boolean): string | undefined {\r\n if (!link) {\r\n return undefined;\r\n }\r\n\r\n if (link.isShowMoreLink && !showMore && link.alternateText) {\r\n // if the link is show more/less link, based on the showMore state; return \"Show more\" localized text\r\n return link.alternateText;\r\n }\r\n\r\n return link.name;\r\n }\r\n\r\n // find if atleast one child link is visible using isHidden property\r\n // showMore flag will overwrite isHidden property\r\n protected hasAtleastOneVisibleLink(links: INavLink[], showMore?: boolean): boolean {\r\n if (!links || links.length === 0) {\r\n return false;\r\n }\r\n\r\n return (\r\n links.some((link: INavLink): boolean => {\r\n return !link.isHidden;\r\n }) || !!showMore\r\n );\r\n }\r\n}\r\n","import { Icon, IStyle, mergeStyles } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { isPublisherRejectionUnappealable } from '../../@data';\r\nimport { INavLinkProps } from './Nav.types';\r\n\r\n/**\r\n * Represents a composed link in the Nav component.\r\n */\r\nexport const NavLink: React.FunctionComponent<INavLinkProps> = (props: INavLinkProps) => {\r\n if (!props) {\r\n return null;\r\n }\r\n\r\n const {\r\n rightIconName,\r\n leftIconName,\r\n id,\r\n href,\r\n target,\r\n disabled,\r\n onClick,\r\n dataHint,\r\n dataValue,\r\n ariaLabel,\r\n ariaExpanded,\r\n ariaCurrent,\r\n title,\r\n role,\r\n rootClassName,\r\n barClassName,\r\n content,\r\n iconClassName,\r\n textClassName,\r\n focusedStyle,\r\n disabledStyle,\r\n } = props;\r\n\r\n const computedTextWidth: IStyle = {\r\n // 100px to accommodate left and right icons (48px each)\r\n width: 'calc(100% - 96px)',\r\n };\r\n\r\n if (!rightIconName && !leftIconName) {\r\n // no icons, take full with to text\r\n computedTextWidth.width = '100%';\r\n } else if (!leftIconName || !rightIconName) {\r\n // 48px to the left or right icon\r\n computedTextWidth.width = 'calc(100% - 48px)';\r\n }\r\n\r\n const fixedIconWidth: IStyle = {\r\n width: '48px',\r\n display: rightIconName === 'OpenInNewWindow' ? 'none' : 'inline-block',\r\n };\r\n\r\n return (\r\n <>\r\n <a\r\n id={id}\r\n href={href}\r\n target={target}\r\n onClick={onClick}\r\n data-hint={dataHint}\r\n data-value={dataValue}\r\n aria-label={ariaLabel}\r\n aria-expanded={ariaExpanded}\r\n aria-current={ariaCurrent}\r\n role={role}\r\n className={disabled ? disabledStyle : focusedStyle}\r\n title={title}\r\n style={{ pointerEvents: isPublisherRejectionUnappealable() ? 'none' : undefined }}\r\n >\r\n <div className={rootClassName} aria-hidden=\"true\">\r\n <hr className={barClassName} />\r\n {leftIconName ? <Icon iconName={leftIconName} className={iconClassName} /> : null}\r\n {content ? <div className={mergeStyles(textClassName, computedTextWidth)}>{content}</div> : null}\r\n {rightIconName ? <Icon iconName={rightIconName} className={mergeStyles(iconClassName, fixedIconWidth)} /> : null}\r\n </div>\r\n </a>\r\n </>\r\n );\r\n};\r\n","import { AnimationClassNames, classNamesFunction, styled } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { getStyles } from './Nav.styles';\r\nimport { ICustomNavLinkGroup, INavLink, INavProps, INavState, INavStyleProps, INavStyles, NavGroupType } from './Nav.types';\r\nimport { NavBase } from './NavBase';\r\nimport { NavLink } from './NavLink';\r\n\r\nconst getClassNames = classNamesFunction<INavStyleProps, INavStyles>();\r\n\r\nclass NavComponent extends NavBase {\r\n constructor(props: INavProps) {\r\n super(props);\r\n\r\n this.state = {\r\n isLinkExpandStateChanged: false,\r\n selectedKey: props.initialSelectedKey || props.selectedKey,\r\n isGroupCollapsed: {},\r\n };\r\n }\r\n\r\n public render() {\r\n if (!this.props.groups || this.props.groups.length === 0) {\r\n return null;\r\n }\r\n\r\n // reset the flag\r\n // on render link, find if there is atleast one hidden link to display \"Show more\" link\r\n this._hasAtleastOneHiddenLink = false;\r\n\r\n return (\r\n <>\r\n {this.props.groups.map((group: ICustomNavLinkGroup, groupIndex: number) => {\r\n return this._renderGroup(group, groupIndex);\r\n })}\r\n </>\r\n );\r\n }\r\n\r\n private _onLinkClicked(link: INavLink, ev: React.MouseEvent<HTMLElement>): void {\r\n const nextState: INavState = {\r\n selectedKey: link.key,\r\n isGroupCollapsed: {},\r\n };\r\n\r\n const hasChildren = link.links && link.links.length > 0;\r\n\r\n if (hasChildren) {\r\n // show child links\r\n link.isExpanded = !link.isExpanded;\r\n\r\n nextState.isLinkExpandStateChanged = true;\r\n\r\n if (!!this.props.onNavNodeExpandedCallback && link.key) {\r\n this.props.onNavNodeExpandedCallback(link.key, link.isExpanded);\r\n }\r\n } else if (link.onClick) {\r\n if (!!this.props.onEditLeftNavClickedCallback && link.key && link.key === 'EditNavLink') {\r\n this.props.onEditLeftNavClickedCallback();\r\n } else {\r\n // if there is a onClick defined, call it\r\n link.onClick(ev, link);\r\n }\r\n }\r\n\r\n this.setState(nextState);\r\n\r\n if (hasChildren || link.onClick) {\r\n // prevent further action if the link has children or onClick handler is defined\r\n ev.preventDefault();\r\n }\r\n\r\n ev.stopPropagation();\r\n }\r\n\r\n private _renderCompositeLink(link: INavLink, linkIndex: number, nestingLevel: number): React.ReactElement<{}> | null {\r\n if (!link) {\r\n return null;\r\n }\r\n\r\n let ariaExpanded: boolean | undefined = undefined;\r\n let rightIconName = '';\r\n if (link.links && link.links.length > 0 && nestingLevel === 0) {\r\n // for the first level link, show chevron icon if there is a children\r\n rightIconName = link.isExpanded ? 'ChevronUp' : 'ChevronDown';\r\n\r\n ariaExpanded = !!link.isExpanded;\r\n } else if (link.url && link.target && link.target === '_blank') {\r\n // for external links, show an icon\r\n rightIconName = 'OpenInNewWindow';\r\n }\r\n\r\n // show nav icon for the first level only\r\n const leftIconName = nestingLevel === 0 ? link.icon : undefined;\r\n const isLinkSelected = this.isLinkSelected(link, false /* includeChildren */);\r\n const isChildLinkSelected = this.isChildLinkSelected(link);\r\n const hasChildren = !!link.links && link.links.length > 0;\r\n const isSelected = (isLinkSelected && !hasChildren) || (isChildLinkSelected && !link.isExpanded);\r\n const { styles, showMore, onShowMoreLinkClicked, dataHint, theme } = this.props;\r\n const classNames = getClassNames(styles!, { isSelected, nestingLevel, isChildLinkSelected, theme: theme! });\r\n const linkText = this.getLinkText(link, showMore);\r\n const onClickHandler = link.isShowMoreLink && onShowMoreLinkClicked ? onShowMoreLinkClicked : this._onLinkClicked.bind(this, link);\r\n\r\n let ariaCurrent: boolean | 'page' | undefined = undefined;\r\n if (isSelected) {\r\n // Set as current page within a set of pages.\r\n ariaCurrent = 'page';\r\n }\r\n\r\n return (\r\n <NavLink\r\n id={link.key}\r\n content={linkText}\r\n href={link.url}\r\n target={link.target}\r\n onClick={onClickHandler}\r\n dataHint={dataHint}\r\n dataValue={link.key}\r\n disabled={link.disabled}\r\n ariaLabel={linkText}\r\n ariaExpanded={ariaExpanded}\r\n ariaCurrent={ariaCurrent}\r\n title={link.title}\r\n role=\"menuitem\"\r\n rootClassName={classNames.navItemRoot}\r\n leftIconName={leftIconName}\r\n rightIconName={rightIconName === '' ? undefined : rightIconName}\r\n textClassName={classNames.navItemNameColumn}\r\n iconClassName={classNames.navItemIconColumn}\r\n barClassName={classNames.navItemBarMarker}\r\n focusedStyle={classNames.focusedStyle}\r\n disabledStyle={classNames.disabledStyle}\r\n />\r\n );\r\n }\r\n\r\n private _renderLink(link: INavLink, linkIndex: number, nestingLevel: number): React.ReactElement<{}> | null {\r\n if (!link) {\r\n return null;\r\n }\r\n\r\n const linkText = this.getLinkText(link, this.props.showMore);\r\n\r\n return (\r\n <li key={link.key || linkIndex} title={linkText} role=\"menuitem\">\r\n <span role=\"link\">\r\n {this._renderCompositeLink(link, linkIndex, nestingLevel)}\r\n {\r\n // show child links\r\n // 1. only for the first level and\r\n // 2. if the link is expanded\r\n nestingLevel === 0 && link.isExpanded ? (\r\n <div className={AnimationClassNames.slideDownIn20}>{this._renderLinks(link.links as INavLink[], ++nestingLevel)}</div>\r\n ) : null\r\n }\r\n </span>\r\n </li>\r\n );\r\n }\r\n\r\n private _renderLinks(links: INavLink[], nestingLevel: number): React.ReactElement<{}> | null {\r\n if (!links || links.length === 0) {\r\n return null;\r\n }\r\n\r\n const { enableCustomization, showMore } = this.props;\r\n\r\n return (\r\n <ul role=\"menu\">\r\n {links.map((link: INavLink, linkIndex: number) => {\r\n if (enableCustomization && link.isHidden) {\r\n // atleast one link is hidden\r\n this._hasAtleastOneHiddenLink = true;\r\n }\r\n if (enableCustomization && link.isHidden && !showMore) {\r\n // atleast one link is hidden\r\n this._hasAtleastOneHiddenLink = true;\r\n\r\n // \"Show more\" overrides isHidden property\r\n return null;\r\n } else if (link.isShowMoreLink && !this._hasAtleastOneHiddenLink) {\r\n // there is no hidden link, hide \"Show more\" link\r\n return null;\r\n } else {\r\n return this._renderLink(link, linkIndex, nestingLevel);\r\n }\r\n })}\r\n </ul>\r\n );\r\n }\r\n\r\n private _renderGroup(group: ICustomNavLinkGroup, groupIndex: number): React.ReactElement<{}> | null {\r\n if (!group || !group.links || group.links.length === 0) {\r\n return null;\r\n }\r\n\r\n const { styles, enableCustomization, theme } = this.props;\r\n const hasGroupName = !!group.name;\r\n\r\n // skip customization group if customization is not enabled\r\n if (!enableCustomization && group.groupType === NavGroupType.CustomizationGroup) {\r\n return null;\r\n }\r\n\r\n const classNames = getClassNames(styles!, { hasGroupName, groupIndex, theme: theme! });\r\n\r\n // display group header for groups with visible links\r\n const isGroupHeaderVisible = this.hasAtleastOneVisibleLink(group.links, this.props.showMore);\r\n\r\n return (\r\n <div key={groupIndex}>\r\n {isGroupHeaderVisible ? (\r\n <div className={classNames.navGroupSeparatorRoot}>\r\n <div className={classNames.navGroupSeparatorHrLine}>\r\n {hasGroupName && <span className={classNames.navGroupSeparatorHeaderGroupName}>{group.name}</span>}\r\n </div>\r\n </div>\r\n ) : null}\r\n {this._renderLinks(group.links, 0 /* nestingLevel */)}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport const Nav = styled<INavProps, INavStyleProps, INavStyles>(NavComponent, getStyles);\r\n\r\n/* tslint:enable */\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n collapseMenu: {\r\n id: 'nav.collapseMenu',\r\n defaultMessage: 'Collapse main menu',\r\n },\r\n expandMenu: {\r\n id: 'nav.expandMenu',\r\n defaultMessage: 'Expand main menu',\r\n },\r\n});\r\n","/* tslint:disable */\r\nimport { classNamesFunction, getId, styled } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { getStyles } from './Nav.styles';\r\nimport { ICustomNavLinkGroup, INavLink, INavProps, INavState, INavStyleProps, INavStyles, NavGroupType } from './Nav.types';\r\nimport { NavBase } from './NavBase';\r\nimport { NavLink } from './NavLink';\r\n\r\nconst getClassNames = classNamesFunction<INavStyleProps, INavStyles>();\r\n\r\nclass SlimNavComponent extends NavBase {\r\n // store the previous floating nav shown to close when the current floating nav shows up.\r\n private _prevFloatingNav: any;\r\n\r\n constructor(props: INavProps) {\r\n super(props);\r\n\r\n this.state = {\r\n isLinkExpandStateChanged: false,\r\n selectedKey: props.initialSelectedKey || props.selectedKey,\r\n isGroupCollapsed: {},\r\n };\r\n }\r\n\r\n public get selectedKey(): string | undefined {\r\n return this.state.selectedKey;\r\n }\r\n\r\n public render() {\r\n if (!this.props.groups || this.props.groups.length === 0) {\r\n return null;\r\n }\r\n\r\n // reset the flag\r\n // on render link, find if there is atleast one hidden link to display \"Show more\" link\r\n this._hasAtleastOneHiddenLink = false;\r\n\r\n return (\r\n <>\r\n {this.props.groups.map((group: ICustomNavLinkGroup, groupIndex: number) => {\r\n return this._renderGroup(group, groupIndex);\r\n })}\r\n </>\r\n );\r\n }\r\n\r\n private _onLinkClicked(link: INavLink, ev: React.MouseEvent<HTMLElement>): void {\r\n // set selected node\r\n const nextState: INavState = {\r\n selectedKey: link.key,\r\n isGroupCollapsed: {},\r\n };\r\n this.setState(nextState);\r\n\r\n const hasChildren = link.links && link.links.length > 0;\r\n\r\n // if there is no children and onClick handler is defined, call it\r\n if (!hasChildren && link.onClick) {\r\n if (!!this.props.onEditLeftNavClickedCallback && link.key && link.key === 'EditNavLink') {\r\n this.props.onEditLeftNavClickedCallback();\r\n } else {\r\n // if there is a onClick defined, call it\r\n link.onClick(ev, link);\r\n }\r\n }\r\n\r\n // prevent url action on anchor tag if the node has a children or if the onClick handler is defined\r\n if (hasChildren || link.onClick) {\r\n ev.preventDefault();\r\n }\r\n\r\n ev.stopPropagation();\r\n }\r\n\r\n private _getScrollTop(): number | undefined {\r\n if (!this.props.navScrollerId) {\r\n return undefined;\r\n }\r\n\r\n const navScroller = document.getElementById(this.props.navScrollerId) as HTMLElement;\r\n\r\n if (navScroller && navScroller.scrollTop > 0) {\r\n return navScroller.scrollTop;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private _onLinkMouseEnterOrLeave(link: INavLink, ev: React.SyntheticEvent<HTMLElement>): void {\r\n link.scrollTop = this._getScrollTop();\r\n this.setState({ isLinkExpandStateChanged: true });\r\n\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n\r\n if (this._prevFloatingNav) {\r\n this._prevFloatingNav.removeAttribute('style');\r\n }\r\n }\r\n\r\n private _getFloatingNav(parentElement: HTMLElement | null): HTMLDivElement | undefined {\r\n if (!parentElement) {\r\n return;\r\n }\r\n\r\n return parentElement.querySelector('[data-floating-nav]') as HTMLDivElement;\r\n }\r\n\r\n private _onFocus(event: React.SyntheticEvent<HTMLElement>): void {\r\n const currentFloatingNav = this._getFloatingNav((event.target as HTMLElement).parentElement);\r\n\r\n if (!currentFloatingNav) {\r\n return;\r\n }\r\n currentFloatingNav.setAttribute('style', 'display: block');\r\n this._prevFloatingNav = currentFloatingNav;\r\n }\r\n\r\n private _onBlur(event: React.SyntheticEvent<HTMLElement>): void {\r\n const currentFloatingNav = this._getFloatingNav((event.target as HTMLElement).parentElement);\r\n\r\n if (!currentFloatingNav) {\r\n return;\r\n }\r\n currentFloatingNav.removeAttribute('style');\r\n }\r\n\r\n private _onKeyDown(event: React.SyntheticEvent<HTMLElement>): void {\r\n const nativeEvent = event as any;\r\n const currentFloatingNav = this._getFloatingNav((nativeEvent.target as HTMLElement).parentElement);\r\n\r\n if (!currentFloatingNav) {\r\n return;\r\n }\r\n\r\n // Enter and Right Arrow\r\n if (nativeEvent.keyCode === 13 || nativeEvent.keyCode === 39) {\r\n currentFloatingNav.setAttribute('style', 'display: block');\r\n this._prevFloatingNav = currentFloatingNav;\r\n } else {\r\n currentFloatingNav.removeAttribute('style');\r\n }\r\n }\r\n\r\n private _renderCompositeLink(link: INavLink, linkIndex: number, nestingLevel: number): React.ReactElement<{}> | null {\r\n if (!link) {\r\n return null;\r\n }\r\n\r\n let rightIconName = '';\r\n if (link.url && link.target && link.target === '_blank') {\r\n // for external links, show an icon\r\n rightIconName = 'OpenInNewWindow';\r\n }\r\n\r\n const isSelected = nestingLevel > 0 && this.isLinkSelected(link, false /* includeChildren */);\r\n const { styles, showMore, dataHint, onShowMoreLinkClicked, theme } = this.props;\r\n const classNames = getClassNames(styles!, { isSelected, nestingLevel, theme: theme! });\r\n const linkText = this.getLinkText(link, showMore);\r\n const onClickHandler = link.isShowMoreLink && onShowMoreLinkClicked ? onShowMoreLinkClicked : this._onLinkClicked.bind(this, link);\r\n\r\n return (\r\n <NavLink\r\n id={getId(link.key)}\r\n content={linkText}\r\n href={link.url}\r\n target={link.target}\r\n dataHint={dataHint}\r\n dataValue={link.key}\r\n ariaLabel={linkText}\r\n title={link.title}\r\n role=\"menuitem\"\r\n onClick={onClickHandler}\r\n rootClassName={classNames.navFloatingItemRoot}\r\n rightIconName={rightIconName === '' ? undefined : rightIconName}\r\n textClassName={classNames.navItemNameColumn}\r\n iconClassName={classNames.navItemIconColumn}\r\n barClassName={classNames.navItemBarMarker}\r\n focusedStyle={classNames.focusedStyle}\r\n />\r\n );\r\n }\r\n\r\n private _renderFloatingLink(link: INavLink, linkIndex: number, nestingLevel: number): React.ReactElement<{}> | null {\r\n if (!link) {\r\n return null;\r\n }\r\n\r\n const linkText = this.getLinkText(link, this.props.showMore);\r\n\r\n return (\r\n <li key={link.key || linkIndex} title={linkText} role=\"none\">\r\n {this._renderCompositeLink(link, linkIndex, nestingLevel)}\r\n {\r\n // show child links\r\n // 1. only for the first level\r\n nestingLevel === 0 ? <div>{this._renderFloatingLinks(link.links as INavLink[], ++nestingLevel)}</div> : null\r\n }\r\n </li>\r\n );\r\n }\r\n\r\n private _renderFloatingLinks(links: INavLink[], nestingLevel: number): React.ReactElement<{}> | null {\r\n if (!links || links.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <ul role=\"menu\">\r\n {links.map((link: INavLink, linkIndex: number) => {\r\n return this._renderFloatingLink(link, linkIndex, nestingLevel);\r\n })}\r\n </ul>\r\n );\r\n }\r\n\r\n private _renderFloatingNav(link: INavLink, _linkIndex: number): React.ReactElement<{}> | null {\r\n if (!link) {\r\n return null;\r\n }\r\n\r\n const hasChildren = !!link.links && link.links.length > 0;\r\n const { styles, theme } = this.props;\r\n const classNames = getClassNames(styles!, { hasChildren, scrollTop: link.scrollTop, theme: theme! });\r\n\r\n return (\r\n <div className={classNames.navFloatingRoot} data-floating-nav>\r\n {this._renderFloatingLinks([link], 0 /* nestingLevel */)}\r\n </div>\r\n );\r\n }\r\n\r\n private _renderLink(link: INavLink, linkIndex: number, _nestingLevel: number): React.ReactElement<{}> | null {\r\n if (!link) {\r\n return null;\r\n }\r\n\r\n const isSelected = this.isLinkSelected(link, true /* includeChildren */);\r\n const hasChildren = !!link.links && link.links.length > 0;\r\n const { styles, showMore, onShowMoreLinkClicked, dataHint, theme } = this.props;\r\n const classNames = getClassNames(styles!, { isSelected, hasChildren, theme: theme! });\r\n const linkText = this.getLinkText(link, showMore);\r\n const onClickHandler = link.isShowMoreLink && onShowMoreLinkClicked ? onShowMoreLinkClicked : this._onLinkClicked.bind(this, link);\r\n\r\n let ariaCurrent: boolean | 'page' | undefined = undefined;\r\n if (isSelected) {\r\n // Set as current page within a set of pages.\r\n ariaCurrent = 'page';\r\n }\r\n\r\n return (\r\n <li\r\n key={link.key || linkIndex}\r\n onMouseEnter={this._onLinkMouseEnterOrLeave.bind(this, link)}\r\n onMouseLeave={this._onLinkMouseEnterOrLeave.bind(this, link)}\r\n onKeyDown={this._onKeyDown.bind(this)}\r\n onFocus={this._onFocus.bind(this)}\r\n onBlur={this._onBlur.bind(this)}\r\n title={linkText}\r\n className={classNames.navSlimItemRoot}\r\n role=\"menuitem\"\r\n >\r\n <span role=\"link\">\r\n <NavLink\r\n id={getId(link.key)}\r\n href={link.url}\r\n target={link.target}\r\n dataHint={dataHint}\r\n dataValue={link.key}\r\n ariaLabel={linkText}\r\n ariaCurrent={ariaCurrent}\r\n role=\"menuitem\"\r\n onClick={onClickHandler}\r\n rootClassName={classNames.navItemRoot}\r\n leftIconName={link.icon}\r\n iconClassName={classNames.navItemIconColumn}\r\n barClassName={classNames.navItemBarMarker}\r\n focusedStyle={classNames.focusedStyle}\r\n />\r\n {this._renderFloatingNav(link, linkIndex)}\r\n </span>\r\n </li>\r\n );\r\n }\r\n\r\n private _renderLinks(links: INavLink[], nestingLevel: number): React.ReactElement<{}> | null {\r\n if (!links || links.length === 0) {\r\n return null;\r\n }\r\n\r\n const { enableCustomization, showMore } = this.props;\r\n\r\n return (\r\n <ul role=\"menu\">\r\n {links.map((link: INavLink, linkIndex: number) => {\r\n if (enableCustomization && link.isHidden && !showMore) {\r\n // atleast one link is hidden\r\n this._hasAtleastOneHiddenLink = true;\r\n\r\n // \"Show more\" overrides isHidden property\r\n return null;\r\n } else if (link.isShowMoreLink && !this._hasAtleastOneHiddenLink && !showMore) {\r\n // there is no hidden link, hide \"Show more\" link\r\n return null;\r\n } else {\r\n return this._renderLink(link, linkIndex, nestingLevel);\r\n }\r\n })}\r\n </ul>\r\n );\r\n }\r\n\r\n private _renderGroup(group: ICustomNavLinkGroup, groupIndex: number): React.ReactElement<{}> | null {\r\n if (!group || !group.links || group.links.length === 0) {\r\n return null;\r\n }\r\n\r\n const { styles, enableCustomization, theme } = this.props;\r\n\r\n // skip customization group if customization is not enabled\r\n if (!enableCustomization && group.groupType === NavGroupType.CustomizationGroup) {\r\n return null;\r\n }\r\n\r\n const classNames = getClassNames(styles!, { groupIndex, theme: theme! });\r\n\r\n // display group header for groups with visible links\r\n const isGroupHeaderVisible = this.hasAtleastOneVisibleLink(group.links, this.props.showMore);\r\n\r\n return (\r\n <div key={groupIndex}>\r\n {isGroupHeaderVisible ? (\r\n <div className={classNames.navGroupSeparatorRoot}>\r\n <div className={classNames.navGroupSeparatorHrLine} />\r\n </div>\r\n ) : null}\r\n {this._renderLinks(group.links, 0 /* nestingLevel */)}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport const SlimNav = styled<INavProps, INavStyleProps, INavStyles>(SlimNavComponent, getStyles);\r\n/* tslint:enable */\r\n","/* tslint:disable */\r\nimport { classNamesFunction, DirectionalHint, FocusZone, FocusZoneDirection, styled } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { debounce, useWindowSize } from '../../hooks';\r\nimport { getStore } from '../../hooks/useWindowSize/store/store';\r\nimport { ConditionalTooltip } from '../ConditionalTooltip';\r\nimport { Nav } from './Nav';\r\nimport { getStyles } from './Nav.styles';\r\nimport { ICustomNavLinkGroup, INavState, INavStyleProps, INavStyles, INavTogglerProps, NavGroupType } from './Nav.types';\r\nimport { NavLink } from './NavLink';\r\nimport messages from './NavToggler.messages';\r\nimport { SlimNav } from './SlimNav';\r\n\r\nconst getClassNames = classNamesFunction<INavStyleProps, INavStyles>();\r\nconst { windowSizeFormatter, windowStoreSerializer } = useWindowSize();\r\n\r\nclass NavTogglerComponent extends React.Component<INavTogglerProps, INavState> {\r\n constructor(props: INavTogglerProps) {\r\n super(props);\r\n\r\n this.state = {\r\n isNavCollapsed: props.isNavCollapsed ? props.isNavCollapsed : false,\r\n showMore: props.showMore ? props.showMore : false,\r\n isGroupCollapsed: {},\r\n lockAutoCollapse: false,\r\n };\r\n\r\n this._onShowMoreLinkClicked = this._onShowMoreLinkClicked.bind(this);\r\n }\r\n\r\n public triggerNavCollapse = (expand = true) => {\r\n this.props.onNavCollapsedCallback?.(expand);\r\n this.setState({ ...this.state, isNavCollapsed: expand });\r\n };\r\n\r\n public onOverlayClick = () => {\r\n const { isWindowSmallSize, isWindowExtraSmallSize } = windowStoreSerializer(getStore());\r\n if ((isWindowSmallSize || isWindowExtraSmallSize) && !this.state.isNavCollapsed) {\r\n this.triggerNavCollapse();\r\n }\r\n };\r\n\r\n // auto collapse nav bar when resizing to a smaller size\r\n public handleResizeCollapseReset = () => {\r\n if (this.state.lockAutoCollapse && this.state.isNavCollapsed) {\r\n return;\r\n }\r\n const isWindowNonRegularSize = windowSizeFormatter(window.innerWidth) !== 'regular';\r\n if (isWindowNonRegularSize && !this.state.isNavCollapsed) {\r\n this.triggerNavCollapse();\r\n }\r\n if (!isWindowNonRegularSize && this.state.isNavCollapsed) {\r\n this.triggerNavCollapse(false);\r\n }\r\n };\r\n\r\n public componentDidMount(): void {\r\n window.addEventListener('resize', debounce(this.handleResizeCollapseReset, 10));\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window.removeEventListener('resize', debounce(this.handleResizeCollapseReset, 10));\r\n }\r\n\r\n // in small window size when nav item is clicked, nav should auto collapse\r\n public componentDidUpdate(prevProps: Readonly<INavTogglerProps>, prevState: Readonly<INavState>, snapshot?: any): void {\r\n const { isWindowSmallSize, isWindowExtraSmallSize } = windowStoreSerializer(getStore());\r\n const shouldTriggerNavCollapse =\r\n prevProps.selectedKey !== this.props.selectedKey && (isWindowSmallSize || isWindowExtraSmallSize) && !this.state.isNavCollapsed;\r\n if (shouldTriggerNavCollapse) {\r\n this.triggerNavCollapse();\r\n }\r\n }\r\n\r\n public render() {\r\n if (!this.props.groups || this.props.groups.length === 0) {\r\n return null;\r\n }\r\n\r\n const { isNavCollapsed, showMore } = this.state;\r\n\r\n const { styles, groups, theme, ariaLabel } = this.props;\r\n const classNames = getClassNames(styles!, { isCollapsed: isNavCollapsed, theme: theme! });\r\n\r\n const toggleNavGroups = groups.filter((navGroup: ICustomNavLinkGroup) => {\r\n return !!navGroup && navGroup.groupType === NavGroupType.ToggleGroup;\r\n });\r\n\r\n const nonToggleNavGroups = groups.filter((navGroup: ICustomNavLinkGroup) => {\r\n return !!navGroup && navGroup.groupType !== NavGroupType.ToggleGroup;\r\n });\r\n\r\n return (\r\n <div className={classNames.root}>\r\n <FocusZone id={'navFocusZone'} direction={FocusZoneDirection.vertical}>\r\n <div className={classNames.overlay} onClick={this.onOverlayClick} />\r\n <nav aria-label={ariaLabel}>\r\n {this._renderExpandCollapseNavItem(toggleNavGroups)}\r\n {isNavCollapsed ? (\r\n <SlimNav\r\n groups={nonToggleNavGroups}\r\n selectedKey={this.props.selectedKey}\r\n navScrollerId={this.props.navScrollerId}\r\n dataHint={this.props.dataHint}\r\n enableCustomization={this.props.enableCustomization}\r\n showMore={showMore}\r\n onShowMoreLinkClicked={this._onShowMoreLinkClicked}\r\n onEditLeftNavClickedCallback={this.props.onEditLeftNavClickedCallback}\r\n />\r\n ) : (\r\n <Nav\r\n groups={nonToggleNavGroups}\r\n selectedKey={this.props.selectedKey}\r\n dataHint={this.props.dataHint}\r\n enableCustomization={this.props.enableCustomization}\r\n showMore={showMore}\r\n onShowMoreLinkClicked={this._onShowMoreLinkClicked}\r\n onNavNodeExpandedCallback={this.props.onNavNodeExpandedCallback}\r\n onEditLeftNavClickedCallback={this.props.onEditLeftNavClickedCallback}\r\n />\r\n )}\r\n </nav>\r\n </FocusZone>\r\n </div>\r\n );\r\n }\r\n\r\n private _onNavCollapseClicked(ev: React.MouseEvent<HTMLElement>): void {\r\n this.setState((prevState: INavState) => {\r\n const isNavCollapsed = !prevState.isNavCollapsed;\r\n\r\n // inform the caller about the collapse event\r\n if (!!this.props.onNavCollapsedCallback) {\r\n this.props.onNavCollapsedCallback(isNavCollapsed);\r\n }\r\n\r\n return {\r\n isNavCollapsed: isNavCollapsed,\r\n /**\r\n * manual toggle nav will disable the auto collapse logic while resizing, only manual toggle nav again will unlock the auto collapse logic\r\n */\r\n lockAutoCollapse: !this.state.lockAutoCollapse,\r\n };\r\n });\r\n\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n }\r\n\r\n private _renderExpandCollapseNavItem(toggleNavGroups: ICustomNavLinkGroup[]): React.ReactElement<{}> | null {\r\n const { formatMessage } = this.props.intl;\r\n if ((!!toggleNavGroups && toggleNavGroups.length === 0) || !toggleNavGroups[0].links || toggleNavGroups[0].links.length === 0) {\r\n // There is no toggle group with links defined\r\n return null;\r\n }\r\n\r\n const isNavCollapsed = this.state.isNavCollapsed;\r\n const { styles, dataHint, theme } = this.props;\r\n const classNames = getClassNames(styles!, { theme: theme! });\r\n const link = toggleNavGroups[0].links[0];\r\n const navLinkId = 'expandCollapseButton';\r\n\r\n return (\r\n <ConditionalTooltip\r\n showTooltip={!!link.tooltipText}\r\n targetSelector={`#${navLinkId}`}\r\n content={link.tooltipText}\r\n directionalHint={DirectionalHint.bottomAutoEdge}\r\n >\r\n <NavLink\r\n id={navLinkId}\r\n href={link.url}\r\n content={link.name}\r\n disabled={link.disabled}\r\n onClick={this._onNavCollapseClicked.bind(this)}\r\n ariaExpanded={!isNavCollapsed}\r\n dataHint={dataHint}\r\n dataValue={link.key}\r\n rootClassName={classNames.navToggler}\r\n leftIconName={link.icon}\r\n iconClassName={classNames.navItemIconColumn}\r\n barClassName={classNames.navItemBarMarker}\r\n textClassName={classNames.navItemNameColumn}\r\n focusedStyle={classNames.focusedStyle}\r\n role=\"button\"\r\n ariaLabel={formatMessage(isNavCollapsed ? messages.expandMenu : messages.collapseMenu)}\r\n />\r\n </ConditionalTooltip>\r\n );\r\n }\r\n\r\n private _onShowMoreLinkClicked(ev: React.MouseEvent<HTMLElement>): void {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n\r\n this.setState((prevState: INavState) => {\r\n // let the consumer know about the \"show more\" or \"show less\" event\r\n if (this.props.onShowMoreLinkClicked) {\r\n this.props.onShowMoreLinkClicked(ev, !prevState.showMore);\r\n }\r\n\r\n return {\r\n showMore: !prevState.showMore,\r\n };\r\n });\r\n }\r\n}\r\n\r\nexport const NavToggler = styled<INavTogglerProps, INavStyleProps, INavStyles>(NavTogglerComponent, getStyles);\r\n/* tslint:enable */\r\n","import * as React from 'react';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport { RouteComponentProps } from 'react-router';\r\n\r\nexport const NotFound = (props: RouteComponentProps) => (\r\n <h1>\r\n <FormattedMessage\r\n id=\"notfound\"\r\n defaultMessage=\"No match for {pathname}\"\r\n values={{\r\n pathname: <code>{props.location.pathname}</code>\r\n }}\r\n />\r\n </h1>\r\n);\r\n","import { IPubcenterPalette, IPubcenterSpacing } from '../../../theme';\r\nimport { TythonNavStyleProps, TythonNavStyles } from './types';\r\n\r\nconst renderNormalIcon = {\r\n '.fui-Tab__icon': {\r\n '.navIconActive': {\r\n display: 'none',\r\n },\r\n '.navIcon': {\r\n display: 'block',\r\n },\r\n },\r\n};\r\nconst renderActiveIcon = {\r\n '.fui-Tab__icon': {\r\n '.navIconActive': {\r\n display: 'block',\r\n },\r\n '.navIcon': {\r\n display: 'none',\r\n },\r\n },\r\n};\r\n\r\nexport const getStyles = (props: TythonNavStyleProps): TythonNavStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n\r\n return {\r\n container: {\r\n background: palette['NeutralBackground4.Rest'],\r\n '.fui-TabList': {\r\n height: '100%',\r\n width: spacing.size64,\r\n },\r\n '.side-navigation-item-button': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '100%',\r\n padding: `${spacing.size12} ${spacing.size6}`,\r\n '.fui-Tab__content': {\r\n fontWeight: 400,\r\n fontSize: spacing.size10,\r\n lineHeight: spacing.size14,\r\n color: palette['NeutralForeground2.Rest'],\r\n },\r\n '.side-navigation-item-text': {\r\n display: 'block',\r\n maxWidth: spacing.size56,\r\n },\r\n ...renderNormalIcon,\r\n },\r\n '.side-navigation-item-button:hover': {\r\n background: palette['NeutralBackground3.Rest'],\r\n borderLeft: `${spacing.size2} solid ${palette['NeutralStroke1.Rest']}`,\r\n '.fui-Tab__content': {\r\n color: palette['CompoundBrandForeground1.Rest'],\r\n },\r\n ...renderActiveIcon,\r\n },\r\n '.side-navigation-item-button[aria-selected=\"true\"]:hover': {\r\n '.fui-Tab__content': {\r\n color: palette['CompoundBrandForeground1.Hover'],\r\n },\r\n },\r\n '.side-navigation-item-button[aria-selected=\"true\"]': {\r\n borderLeft: `${spacing.size2} solid ${palette['CompoundBrandForeground1.Rest']}`,\r\n '.fui-Tab__content': {\r\n color: palette['CompoundBrandForeground1.Rest'],\r\n },\r\n ...renderActiveIcon,\r\n },\r\n '.fui-Tab__content--reserved-space': {\r\n height: 0,\r\n },\r\n },\r\n };\r\n};\r\n","import { SideNavigationProps } from '@bingads-webui-fluent-component/navigation';\r\nimport { classNamesFunction, getTheme } from '@fluentui/react';\r\nimport { useEffect, useState } from 'react';\r\nimport { AuditHistoryRoute, HomePageRoute, UserLevelSettingRoute } from '../../Routes';\r\nimport { ICustomNavLinkGroup } from '../../components/Nav';\r\nimport { getRoutes } from '../../pages/ad-management/@data/services/getAdmanagementRoutes';\r\nimport { getStore } from '../../pages/ad-management/Account/Settings/@data/store/store';\r\nimport { getStyles } from './styles';\r\nimport { TythonNavStyleProps, TythonNavStyles, UseTythonNav } from './types';\r\n\r\nconst useTythonNav: UseTythonNav = (props) => {\r\n const {\r\n accessibleRoutes,\r\n history,\r\n generateNavIcons,\r\n intl: { formatMessage },\r\n } = props;\r\n const { systemPreferences } = getStore().active;\r\n const [navItems, setNavItems] = useState<SideNavigationProps['items']>([]);\r\n const theme = getTheme();\r\n const getClassNames = classNamesFunction<TythonNavStyleProps, TythonNavStyles>();\r\n const classNames = getClassNames(getStyles, { theme });\r\n const handleNavItemClick = (url: string, id: string) => {\r\n url && history.push(url);\r\n };\r\n\r\n const generateNavItems = (input: ICustomNavLinkGroup[]): SideNavigationProps['items'] => {\r\n return input.map((group) => {\r\n return group.links.map((link) => {\r\n let isNavItemSelected = history.location.pathname.includes(link.url);\r\n // corner case - when user navigates to home page from logo click\r\n if (history.location.pathname === HomePageRoute && link.icon === 'Home') {\r\n isNavItemSelected = true;\r\n }\r\n // corner case - when user navigates to pages where we don't have a nav item for them. e.g. Audit History, User Level Setting page\r\n if (history.location.pathname.includes(AuditHistoryRoute) || history.location.pathname.includes(UserLevelSettingRoute)) {\r\n isNavItemSelected = false;\r\n }\r\n return {\r\n text: getRoutes(formatMessage).find((route) => route.text === link.name)?.text ?? '',\r\n onClick: () => handleNavItemClick(link.url, link.key ?? ''),\r\n icon: generateNavIcons(link.icon),\r\n title: link.title ?? '',\r\n disabled: link.disabled ?? false,\r\n id: link.key ?? '',\r\n tooltipText: link.tooltipText ?? '',\r\n isSelected: isNavItemSelected,\r\n };\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * Initialize nav items\r\n */\r\n useEffect(() => {\r\n setNavItems(generateNavItems(accessibleRoutes));\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n /**\r\n * lifecycle hook to update nav render conditions when\r\n * - url updated\r\n * - locale updated\r\n */\r\n useEffect(() => {\r\n setNavItems(generateNavItems(accessibleRoutes));\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [history.location.pathname, systemPreferences?.locale]);\r\n\r\n /**\r\n * accessibility enhancement: set tabindex to -1 for dummy elements in ads UI kit nav component\r\n */\r\n useEffect(() => {\r\n const checkRender = () => {\r\n const element = document?.querySelectorAll('i[data-tabster-dummy]');\r\n if (element?.length) {\r\n element.forEach((el) => {\r\n el.setAttribute('tabindex', '-1');\r\n });\r\n } else {\r\n window.requestAnimationFrame(checkRender);\r\n }\r\n };\r\n\r\n checkRender();\r\n }, []);\r\n\r\n return { navItems, classNames };\r\n};\r\n\r\nexport default useTythonNav;\r\n","import { SideNavigation } from '@bingads-webui-fluent-component/navigation';\r\nimport { css } from '@fluentui/react';\r\nimport React from 'react';\r\nimport {\r\n AccountNavIcon,\r\n AccountNavIconActive,\r\n AdBlockNavIcon,\r\n AdBlockNavIconActive,\r\n AdUnitNavIcon,\r\n AdUnitNavIconActive,\r\n AdsIcon,\r\n AdsIconActive,\r\n HomeNavIcon,\r\n HomeNavIconActive,\r\n InventoryIcon,\r\n InventoryIconActive,\r\n ReportNavIcon,\r\n ReportNavIconActive,\r\n SiteNavIcon,\r\n SiteNavIconActive,\r\n} from './resources';\r\nimport { GenerateNavIcons, TythonNavComponent } from './types';\r\nimport useTythonNav from './useTythonNav';\r\n\r\nconst generateNavIcons: GenerateNavIcons = (iconName, className) => {\r\n let iconSrc;\r\n let iconSrcActive;\r\n switch (iconName) {\r\n case 'Home':\r\n iconSrc = HomeNavIcon;\r\n iconSrcActive = HomeNavIconActive;\r\n break;\r\n case 'AdUnit':\r\n iconSrc = AdUnitNavIcon;\r\n iconSrcActive = AdUnitNavIconActive;\r\n break;\r\n case 'Favicon':\r\n iconSrc = SiteNavIcon;\r\n iconSrcActive = SiteNavIconActive;\r\n break;\r\n case 'AdUnitBlock':\r\n iconSrc = AdBlockNavIcon;\r\n iconSrcActive = AdBlockNavIconActive;\r\n break;\r\n case 'CRMReport':\r\n iconSrc = ReportNavIcon;\r\n iconSrcActive = ReportNavIconActive;\r\n break;\r\n case 'AccountManagement':\r\n iconSrc = AccountNavIcon;\r\n iconSrcActive = AccountNavIconActive;\r\n break;\r\n case 'Inventory':\r\n iconSrc = InventoryIcon;\r\n iconSrcActive = InventoryIconActive;\r\n break;\r\n case 'Ads':\r\n iconSrc = AdsIcon;\r\n iconSrcActive = AdsIconActive;\r\n break;\r\n default:\r\n iconSrc = undefined;\r\n iconSrcActive = undefined;\r\n }\r\n return () => (\r\n <>\r\n <img src={iconSrc} alt={iconName} className={css(className, 'navIcon')} />\r\n <img src={iconSrcActive} alt={iconName} className={css(className, 'navIconActive')} />\r\n </>\r\n );\r\n};\r\n\r\nconst TythonNav: TythonNavComponent = (props) => {\r\n const { accessibleRoutes, history, intl } = props;\r\n const { navItems, classNames } = useTythonNav({ accessibleRoutes, history, generateNavIcons, intl });\r\n\r\n return (\r\n <div className={classNames.container}>\r\n <SideNavigation items={navItems} />\r\n </div>\r\n );\r\n};\r\n\r\nexport default TythonNav;\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n mainMenuAriaLabel: {\r\n id: 'contentLayout.mainMenuAriaLabel',\r\n defaultMessage: 'Main menu',\r\n },\r\n});\r\n","import { IContentLayoutStyleProps, IContentLayoutStyles } from './ContentLayout.types';\r\n\r\nexport const getStyles = (props: IContentLayoutStyleProps): IContentLayoutStyles => {\r\n const { theme } = props;\r\n\r\n return {\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: 'inherit',\r\n flex: 1\r\n },\r\n menuAndContent: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n height: 'inherit',\r\n flex: 1,\r\n overflowY: 'auto'\r\n },\r\n appNav: [\r\n 'ms-appNav',\r\n {\r\n overflowY: 'auto',\r\n zIndex: 999,\r\n display: 'flex'\r\n }\r\n ],\r\n appContent: {\r\n backgroundColor: theme.palette.white,\r\n flex: 1,\r\n overflowY: 'auto',\r\n position: 'relative',\r\n display: 'flex',\r\n flexDirection: 'column'\r\n },\r\n appContentRoutes: {\r\n flex: 1,\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }\r\n };\r\n};\r\n","import { classNamesFunction, getTheme, INavLink } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { Route, Switch } from 'react-router';\r\nimport { getAppStore, LayoutMode, onMenuCollapsedChanged } from '../../@data';\r\nimport { completeAccess, hasReadAccess, UserRoleEntity } from '../../@data/services/UserRoleService';\r\nimport { NavigationMenu } from '../../@data/store/schema/userrolemodels/NavigationMenu';\r\nimport { isTythonSelfServeUser } from '../../@data/utils/checkUserType';\r\nimport { getEntityAccessPermissions } from '../../@data/utils/getAccessPermission';\r\nimport { DetectAdBlock } from '../../components/DetectAdBlock/DetectAdBlock';\r\nimport { Main } from '../../components/Main/Main';\r\nimport { ICustomNaveLink, ICustomNavLinkGroup, NavGroupType, NavToggler } from '../../components/Nav';\r\nimport { useWindowSize } from '../../hooks';\r\nimport { getStore } from '../../hooks/useWindowSize/store/store';\r\nimport { RouteName } from '../../pages/ad-management/@data';\r\nimport { IRoute } from '../../Routes.types';\r\nimport { injectIntlWithObserver } from '../../utils';\r\nimport { getAdUnitRoute, getSitesRoute } from '../../utils/routeUtils';\r\nimport { Footer } from '../Footer/Footer';\r\nimport { InternationalizationLayout } from '../InternationalizationLayout';\r\nimport { NotFound } from '../NotFound/NotFound';\r\nimport { NotificationLayout } from '../NotificationLayout';\r\nimport TythonNav from '../TythonNav';\r\nimport messages from './ContentLayout.messages';\r\nimport { getStyles } from './ContentLayout.styles';\r\nimport { IContentLayoutProps, IContentLayoutStyleProps, IContentLayoutStyles } from './ContentLayout.types';\r\n\r\nconst getClassNames = classNamesFunction<IContentLayoutStyleProps, IContentLayoutStyles>();\r\nconst { windowStoreSerializer } = useWindowSize();\r\n/**\r\n * ContentLayout component is used to render the snackbar notifications, side-nav menu conditionally\r\n * and a custom header below the global header.\r\n */\r\nexport const ContentLayout = injectIntlWithObserver(\r\n class ContentLayoutComponent extends React.Component<IContentLayoutProps> {\r\n // when layout initial load, define nav manu collapse based on window size\r\n public componentDidMount(): void {\r\n const { isWindowRegularSize } = windowStoreSerializer(getStore());\r\n if (!isWindowRegularSize) {\r\n onMenuCollapsedChanged(true);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const classNames = getClassNames(getStyles, { theme: getTheme() });\r\n const renderedHeader = this.props.onRenderHeader && this.props.onRenderHeader();\r\n\r\n const isDefaultLayout = getAppStore().layout === LayoutMode.Default;\r\n\r\n let menuRenderer: JSX.Element | undefined;\r\n\r\n if (this.props.menuProps) {\r\n menuRenderer = (\r\n <div className={classNames.appNav}>\r\n {isTythonSelfServeUser() ? (\r\n <TythonNav {...this.props} accessibleRoutes={this._getNavigationAccess(this.props.menuProps.routes)} />\r\n ) : (\r\n <NavToggler\r\n intl={this.props.intl}\r\n groups={this._getNavigationAccess(this.props.menuProps.routes)}\r\n dataHint=\"LeftNav\"\r\n enableCustomization={true}\r\n isNavCollapsed={getAppStore().menuCollapsed}\r\n selectedKey={this.props.location.pathname}\r\n onNavCollapsedCallback={(isCollapsed) => onMenuCollapsedChanged(isCollapsed)}\r\n ariaLabel={this.props.intl.formatMessage(messages.mainMenuAriaLabel)}\r\n />\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <React.Fragment>\r\n <DetectAdBlock />\r\n <div className={classNames.root}>\r\n <InternationalizationLayout publisher={getAppStore().publisher} userContext={getAppStore().userContext} />\r\n <NotificationLayout {...this.props} ignoreGlobalAsync={this.props.ignoreNotificationAsync}>\r\n <div className={classNames.menuAndContent}>\r\n {isDefaultLayout && menuRenderer}\r\n <Main className={classNames.appContent}>\r\n {isDefaultLayout && renderedHeader}\r\n <Switch>\r\n {this.props.children}\r\n <Route path=\"*\" component={NotFound} />\r\n </Switch>\r\n <Footer {...this.props} />\r\n </Main>\r\n </div>\r\n </NotificationLayout>\r\n </div>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private _getNavigationAccess(routes: IRoute[]): ICustomNavLinkGroup[] {\r\n const toggleNavLinkName = '';\r\n const navAccessPermissions = getEntityAccessPermissions(UserRoleEntity.NavigationMenu) as NavigationMenu | null;\r\n\r\n let navMenuLinks: ICustomNaveLink[] = [];\r\n\r\n routes.forEach((route: IRoute) => {\r\n const routeName = this._getRouteName(route.key);\r\n const isTythonRoute = isTythonSelfServeUser() && [RouteName.inventory, RouteName.ads].includes(routeName as RouteName);\r\n\r\n if (hasReadAccess(navAccessPermissions === null ? completeAccess : navAccessPermissions[routeName]) || isTythonRoute) {\r\n navMenuLinks.push({\r\n name: route.text,\r\n url: this.props.match.url + route.key,\r\n onClick: this._onNavClicked,\r\n icon: route.icon,\r\n title: route.text,\r\n disabled: route.disabled,\r\n key: this.props.match.url + route.key,\r\n });\r\n }\r\n });\r\n\r\n if (isTythonSelfServeUser()) {\r\n const tythonExcludedRoutes = [getAdUnitRoute(), getSitesRoute()];\r\n navMenuLinks = navMenuLinks.filter((link) => !tythonExcludedRoutes.includes(link.url));\r\n }\r\n\r\n const toggleGroup = isTythonSelfServeUser()\r\n ? []\r\n : [\r\n {\r\n links: [\r\n {\r\n name: toggleNavLinkName,\r\n url: '#',\r\n icon: 'GlobalNavButton',\r\n key: 'key',\r\n tooltipText: toggleNavLinkName,\r\n },\r\n ],\r\n groupType: NavGroupType.ToggleGroup,\r\n },\r\n ];\r\n\r\n return [\r\n ...toggleGroup,\r\n {\r\n links: navMenuLinks,\r\n groupType: NavGroupType.MenuGroup,\r\n },\r\n ];\r\n }\r\n\r\n private _onNavClicked = (e: React.MouseEvent<HTMLElement>, nl: INavLink) => {\r\n e.preventDefault();\r\n\r\n if (!nl) {\r\n return;\r\n }\r\n\r\n this.props.history.push(nl.url);\r\n };\r\n\r\n private _getRouteName = (key: string) => {\r\n const keyParts = key.split('/');\r\n const lastPart = keyParts[keyParts.length - 1];\r\n return lastPart.split('?')[0];\r\n };\r\n }\r\n);\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { ICommonStyleProps } from '../../types';\r\n\r\ntype StyleProperties = 'overlayStyle' | 'spinnerStyle';\r\nexport type PageSpinnerStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): PageSpinnerStyles => {\r\n return mergeStyleSets({\r\n overlayStyle: {\r\n flex: 1,\r\n display: 'flex',\r\n position: 'fixed',\r\n zIndex: 9999999, // This should be of largest z-index to always appear at the top\r\n },\r\n spinnerStyle: {\r\n flex: 1,\r\n display: 'flex',\r\n selectors: {\r\n '.ms-Spinner-circle': {\r\n height: 67,\r\n width: 67,\r\n },\r\n },\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): PageSpinnerStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { mergeStyleSets, Overlay, Spinner } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { LOADING_SPINNER } from '../../constants/DataTestIdConstants';\r\nimport { getClassNames, PageSpinnerStyles } from './PageSpinner.styles';\r\n\r\nexport interface IPageSpinnerProps {\r\n label?: string;\r\n styleProps?: Partial<PageSpinnerStyles>;\r\n}\r\n\r\nexport function PageSpinner({ label, styleProps }: IPageSpinnerProps): JSX.Element {\r\n const { overlayStyle, spinnerStyle } = mergeStyleSets(getClassNames(), styleProps);\r\n\r\n return (\r\n <Overlay data-test-id={LOADING_SPINNER} className={overlayStyle}>\r\n <Spinner className={spinnerStyle} label={label} labelPosition=\"bottom\" />\r\n </Overlay>\r\n );\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n footerAriaLabel: {\r\n id: 'footer.footerAriaLabel',\r\n defaultMessage: 'Footer',\r\n },\r\n legal: {\r\n id: 'footer.legal',\r\n defaultMessage: 'Legal',\r\n },\r\n privacyCookies: {\r\n id: 'footer.privacyCookies',\r\n defaultMessage: 'Privacy & Cookies',\r\n },\r\n consumerHealthPrivacy: {\r\n id: 'footer.consumerHealthPrivacy',\r\n defaultMessage: 'Consumer Health Privacy',\r\n },\r\n contactSupport: {\r\n id: 'footer.contactSupport',\r\n defaultMessage: 'Contact Support',\r\n },\r\n copyrightMicrosoft: {\r\n id: 'footer.copyrightMicrosoft',\r\n defaultMessage: '\\u00a9 Microsoft 2024',\r\n },\r\n});\r\n","import { BreakPoints } from '../../../theme';\r\nimport { IFooterStyleProps, IFooterStyles } from './Footer.types';\r\n\r\nexport const getStyles = (props: IFooterStyleProps): IFooterStyles => {\r\n const { theme } = props;\r\n const { ResponsiveSmall } = BreakPoints;\r\n\r\n return {\r\n root: {\r\n display: 'block',\r\n backgroundColor: theme.palette['NeutralBackground4.Rest'],\r\n padding: '13px 15px',\r\n width: '-webkit-fill-available',\r\n minWidth: `-moz-available`,\r\n [ResponsiveSmall]: {\r\n padding: '0px 15px',\r\n },\r\n },\r\n footerLinks: {\r\n color: theme.palette.themeDarkAlt,\r\n fontSize: theme.fonts.smallPlus.fontSize,\r\n padding: '0 15px',\r\n lineHeight: '22px',\r\n cursor: 'pointer',\r\n textDecoration: 'none',\r\n [ResponsiveSmall]: {\r\n lineHeight: theme.fonts.small.fontSize,\r\n padding: '0px 8px',\r\n },\r\n },\r\n copyrightText: {\r\n fontSize: theme.fonts.smallPlus.fontSize,\r\n padding: '0 15px',\r\n lineHeight: '22px',\r\n [ResponsiveSmall]: {\r\n lineHeight: theme.fonts.small.fontSize,\r\n padding: '0px 8px',\r\n },\r\n },\r\n };\r\n};\r\n","import { classNamesFunction, getTheme, IProcessedStyleSet } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport { isTythonSelfServeUser } from '../../@data';\r\nimport { ExternalLink } from '../../components/ExternalLink';\r\nimport { SUPPORT_EMAIL, TNC_HREF_PATH } from '../../constants/AppConstants';\r\nimport { SupportPageRoute } from '../../Routes';\r\nimport messages from './Footer.messages';\r\nimport { getStyles } from './Footer.styles';\r\nimport { IFooterProps, IFooterStyleProps, IFooterStyles } from './Footer.types';\r\n\r\nconst theme = getTheme();\r\nconst getClassNames = classNamesFunction<IFooterStyleProps, IFooterStyles>();\r\nconst CONSUMER_HEALTH_PRIVACY_URL = 'https://go.microsoft.com/fwlink/?linkid=2259814';\r\n\r\nexport const Footer = injectIntl(\r\n class extends React.Component<IFooterProps> {\r\n private _classNames: IProcessedStyleSet<IFooterStyles>;\r\n\r\n public render(): JSX.Element {\r\n this._classNames = getClassNames(getStyles, { theme });\r\n const formatMessage = this.props.intl.formatMessage;\r\n\r\n return (\r\n <footer className={this._classNames.root} aria-label={formatMessage(messages.footerAriaLabel)}>\r\n <ExternalLink href={TNC_HREF_PATH} className={this._classNames.footerLinks} aria-label={formatMessage(messages.legal)}>\r\n {formatMessage(messages.legal)}\r\n </ExternalLink>\r\n\r\n <ExternalLink\r\n href=\"http://go.microsoft.com/fwlink/?LinkId=248681\"\r\n className={this._classNames.footerLinks}\r\n aria-label={formatMessage(messages.privacyCookies)}\r\n >\r\n {formatMessage(messages.privacyCookies)}\r\n </ExternalLink>\r\n\r\n <ExternalLink\r\n href={CONSUMER_HEALTH_PRIVACY_URL}\r\n className={this._classNames.footerLinks}\r\n aria-label={formatMessage(messages.consumerHealthPrivacy)}\r\n >\r\n {formatMessage(messages.consumerHealthPrivacy)}\r\n </ExternalLink>\r\n\r\n <ExternalLink\r\n href={isTythonSelfServeUser() ? `${SupportPageRoute}` : `mailto:${SUPPORT_EMAIL}`}\r\n aria-label={formatMessage(messages.contactSupport)}\r\n className={this._classNames.footerLinks}\r\n >\r\n {formatMessage(messages.contactSupport)}\r\n </ExternalLink>\r\n\r\n <span className={this._classNames.copyrightText}>{formatMessage(messages.copyrightMicrosoft)}</span>\r\n </footer>\r\n );\r\n }\r\n }\r\n);\r\n","export const upperCaseCountryCode = (locale: string): string => {\r\n const arr = locale.split('-');\r\n arr[1] = arr[1].toUpperCase();\r\n\r\n return arr[0] + '-' + arr[1];\r\n};\r\n","export enum AccountProfileFeature {\r\n EnableAdUnitDebugging = 'EnableAdUnitDebugging',\r\n EnablePassedUrls = 'EnablePassedUrls',\r\n EnablePassedKeywords = 'EnablePassedKeywords',\r\n EnableCrawling = 'EnableCrawling',\r\n EnableGlobalDefaultKeywords = 'EnableGlobalDefaultKeywords',\r\n EnableAdultAds = 'EnableAdultAds'\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n profileNotImplemented: {\r\n id: 'profile.notImplemented',\r\n defaultMessage: 'Profile Not Implemented Yet',\r\n },\r\n profileSignOut: {\r\n id: 'profile.signout',\r\n defaultMessage: 'Sign out',\r\n },\r\n userSettings: {\r\n id: 'profile.userSettings',\r\n defaultMessage: 'User settings',\r\n },\r\n auditHistory: {\r\n id: 'profile.auditHistory',\r\n defaultMessage: 'Audit history',\r\n },\r\n});\r\n","module.exports = __webpack_public_path__ + \"static/media/Payment.b6d8fb79.svg\";","export function downloadFile(dataUrl: string, filename: string) {\r\n if (!filename || !dataUrl) {\r\n return;\r\n }\r\n const link = document.createElement('a');\r\n link.setAttribute('download', filename);\r\n link.setAttribute('href', dataUrl);\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n}\r\n","import { MessageBarType, getTheme } from '@fluentui/react';\r\nimport html2canvas from 'html2canvas';\r\nimport { IPubcenterSpacing } from '../../../../theme';\r\nimport { onNotificationChanged } from '../../../@data';\r\nimport { breakdownDate } from '../../../utils';\r\nimport { IMetadataElement } from '../DashboardCards/@data/store/schema';\r\nimport { ChartGrain } from '../DashboardCards/ReportCard/ReportCard.types';\r\nimport messages from '../Report.messages';\r\nimport { ICustomCalenderDateRange } from '../components/CustomCalender/CustomCalender.types';\r\nimport { downloadCSV } from './downloadCSV';\r\nimport { downloadFile } from './downloadFile';\r\nimport { FormatMessageFuncType, getReportColumnMetadataDisplayName } from './intlHelper';\r\n\r\nexport function exportToCsv(data: object[], columns: IMetadataElement[], filename, formatMessage: FormatMessageFuncType) {\r\n if (!filename || columns.length <= 0) {\r\n return;\r\n }\r\n const csvData = data\r\n .map((row) => {\r\n return columns\r\n .map((col) => {\r\n return row[col.key];\r\n })\r\n .join(',');\r\n })\r\n .join('\\n');\r\n const csvHeaders = columns\r\n .map((col) => {\r\n return getReportColumnMetadataDisplayName(col.key, formatMessage);\r\n })\r\n .join(',');\r\n\r\n downloadCSV(csvData, csvHeaders, filename);\r\n}\r\n\r\nexport async function exportToPNG(node: HTMLElement, filename: string) {\r\n try {\r\n if (!filename || !node) {\r\n return;\r\n }\r\n const theme = getTheme();\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n node.style.padding = `${spacing.size8} ${spacing.size16}`;\r\n const dataUrl = (await html2canvas(node)).toDataURL();\r\n downloadFile(dataUrl, `${filename}.png`);\r\n } catch (error) {\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n textMessageDescriptor: messages.failedToExportReportAsPNG,\r\n });\r\n }\r\n}\r\nexport function getExportFileName(\r\n calendarDateRange: ICustomCalenderDateRange,\r\n chartGrain: ChartGrain,\r\n reportTitle: string,\r\n locale: string\r\n) {\r\n const brokenDownStartDate = breakdownDate(calendarDateRange.startDate, locale);\r\n const brokenDownEndDate = breakdownDate(calendarDateRange.endDate, locale);\r\n const startDateString = `${brokenDownStartDate.month}-${brokenDownStartDate.day}-${brokenDownStartDate.year}`;\r\n const endDateString = `${brokenDownEndDate.month}-${brokenDownEndDate.day}-${brokenDownEndDate.year}`;\r\n const exportedFileName = chartGrain ? constructName(reportTitle, chartGrain, startDateString, endDateString) : '';\r\n return exportedFileName;\r\n}\r\n\r\nexport function constructName(reportName: string, currentChartGrain: ChartGrain, startDateString: string, endDateString: string) {\r\n return `${reportName}${currentChartGrain === ChartGrain.NONE ? '-' : `-${currentChartGrain}-`}${startDateString}-to-${endDateString}`;\r\n}\r\n","import { downloadFile } from './downloadFile';\r\n\r\nexport function downloadCSV(csvData: string, csvHeaders: string, filename: string) {\r\n if (!filename) {\r\n return;\r\n }\r\n const csvDataMarker = 'data:text/csv;charset=utf-8,';\r\n const csvFileData = csvDataMarker + (csvHeaders ? `${csvHeaders}\\n` : '') + csvData;\r\n const encodedCSV = encodeURI(csvFileData);\r\n downloadFile(encodedCSV, filename);\r\n}\r\n","import { Model } from './Model';\r\n\r\nexport class ReportingDataResponse {\r\n public TrackingGuid: string;\r\n public CallerGuid: string;\r\n public Data: ReportingDataRow[];\r\n}\r\nexport class MediationReportingDataResponse {\r\n public trackingId: string;\r\n public data: MediationReportingDataRow[];\r\n}\r\n\r\nexport class ReportingDataRow extends Model {\r\n public className: string = '';\r\n public apiPath: string = '';\r\n}\r\nexport class TythonReportingDataRow extends ReportingDataRow {\r\n public DateTime?: string;\r\n public AccountId?: string;\r\n public AccountName?: string;\r\n public AdUnitId?: string;\r\n public AdUnitName?: string;\r\n public Country?: string;\r\n public CountryCode?: string;\r\n public ImpressionsServed?: number;\r\n public ImpressionsViewed?: number;\r\n public Viewability?: string;\r\n public Revenue?: number;\r\n public eCPM?: string;\r\n public Clicks?: number;\r\n public CTR?: string;\r\n public FillRate?: string;\r\n}\r\nexport class MediationReportingDataRow extends ReportingDataRow {\r\n public AdUnitId?: string;\r\n public PubCenterAdUnitId?: string;\r\n public AdUnitName?: string;\r\n public SiteName?: string;\r\n public Country?: string;\r\n public Date?: string;\r\n public OperatingSystem?: string;\r\n public Revenue?: number;\r\n public Impressions?: number;\r\n public AdClicks?: number;\r\n public AdCTR?: string;\r\n public AdECPM?: string;\r\n}\r\n","import { MediationReportingDataRow, TythonReportingDataRow } from '../../../../../../@data/store/schema/models/ReportingDataResponse';\r\nimport { ChartGrain } from '../../../ReportCard/ReportCard.types';\r\n\r\nexport interface IReportPageReportData<DataType> {\r\n isDataLoaded?: boolean;\r\n isDetailedDataLoaded?: boolean;\r\n data?: DataType[];\r\n detailedData?: DataType[];\r\n}\r\nexport interface IReportsMetadata {\r\n dimensions: IMetadataElement[];\r\n metrics: IMetadataElement[];\r\n grains: IMetadataElement[];\r\n isMetadataLoaded: boolean;\r\n}\r\nexport interface IMetadataElement {\r\n key: string;\r\n displayName: string;\r\n filterKey: string;\r\n incompatibleFields: string[];\r\n}\r\nexport interface IGrainedReportData<DataType> {\r\n [ChartGrain.NONE]: IReportPageReportData<DataType>;\r\n [ChartGrain.HOURLY]: IReportPageReportData<DataType>;\r\n [ChartGrain.DAILY]: IReportPageReportData<DataType>;\r\n [ChartGrain.WEEKLY]: IReportPageReportData<DataType>;\r\n [ChartGrain.MONTHLY]: IReportPageReportData<DataType>;\r\n [ChartGrain.YEARLY]: IReportPageReportData<DataType>;\r\n [ChartGrain.MONTH_AND_YEAR]: IReportPageReportData<DataType>;\r\n}\r\n\r\nexport type ColumnMembers = Record<string, IColumnMembersData>;\r\nexport interface IColumnMembersData {\r\n isDataLoaded?: boolean;\r\n data?: IColumnMemberDetails[];\r\n}\r\nexport interface IColumnMemberDetails {\r\n Id: string;\r\n Value: string;\r\n DisplayName: string;\r\n}\r\n\r\nexport interface IReportPageData {\r\n reportType: string;\r\n metadata: IReportsMetadata;\r\n mediationMetadata: IReportsMetadata;\r\n columnMembers: ColumnMembers;\r\n summary: IGrainedReportData<TythonReportingDataRow>;\r\n mediationSummary: IGrainedReportData<MediationReportingDataRow>;\r\n sites: IGrainedReportData<TythonReportingDataRow>;\r\n country: IGrainedReportData<TythonReportingDataRow>;\r\n adUnits: IGrainedReportData<TythonReportingDataRow>;\r\n mediation: IGrainedReportData<MediationReportingDataRow>;\r\n performance: IGrainedReportData<TythonReportingDataRow>;\r\n}\r\n\r\nexport enum ReportDataSource {\r\n MSXTython = 'MSXTython',\r\n TythonV2 = 'TythonV2',\r\n}\r\n","import { BaseButton, classNamesFunction, getTheme, ITheme, Spinner, Text } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { APP_NAME_NEW } from '../../../../../constants/AppConstants';\r\nimport { AccountPageRoute } from '../../../../../Routes';\r\nimport { injectIntlAndObserver, injectRouterAndIntlWithObserver, IRouterWithIntl } from '../../../../../utils';\r\nimport { PAYMENTS_TAB_KEY } from '../../constants';\r\nimport { notificationMessages } from './paymentsOnboarding.messages';\r\nimport { getStyles, IPaymentsOnboardingStyles } from './PaymentsOnboarding.styles';\r\nimport usePaymentsOnboarding, { SETUP_PAYMENTS_NOTIFICATION_ACTION_BUTTON_ID } from './usePaymentsOnboarding';\r\n\r\nconst getClassNames = classNamesFunction<{ theme: ITheme }, IPaymentsOnboardingStyles>();\r\nexport const classNames = getClassNames(getStyles, { theme: getTheme() });\r\nconst ONBOARDING_CONTAINER_ID = 'onboarding-container';\r\n\r\nexport const PaymentsOnboarding = injectIntlAndObserver(({ intl: { formatMessage } }) => {\r\n // render logic\r\n const { xPayContainerRef, isInitializingXPayContainer } = usePaymentsOnboarding(formatMessage);\r\n\r\n return (\r\n <div className={classNames.root}>\r\n {isInitializingXPayContainer && <Spinner className={classNames.xPayLoadingSpinner} />}\r\n <div\r\n id={ONBOARDING_CONTAINER_ID}\r\n ref={xPayContainerRef}\r\n className={(isInitializingXPayContainer && classNames.transparentContainer) || undefined}\r\n />\r\n </div>\r\n );\r\n});\r\n\r\nexport const SetupPaymentNotification = injectRouterAndIntlWithObserver<IRouterWithIntl & { publisher: string; onAction: () => void }>(\r\n ({ onAction, history, publisher: publisherId, intl: { formatMessage } }) => (\r\n <div className={classNames.setupNotificationWrapper}>\r\n <Text className={classNames.setupNotificationText}>\r\n <b>\r\n {formatMessage(notificationMessages.setupPaymentNotificationBoldedText, {\r\n appName: APP_NAME_NEW,\r\n })}\r\n </b>{' '}\r\n {formatMessage(notificationMessages.setupPaymentNotificationText)}\r\n </Text>\r\n {!history.location.pathname.includes(`${AccountPageRoute}#${PAYMENTS_TAB_KEY}`) && (\r\n <BaseButton\r\n className={classNames.actionButton}\r\n id={SETUP_PAYMENTS_NOTIFICATION_ACTION_BUTTON_ID}\r\n onClick={() => {\r\n history.push(`/ad-management/${publisherId}${AccountPageRoute}#${PAYMENTS_TAB_KEY}`, { defaultTab: PAYMENTS_TAB_KEY });\r\n onAction();\r\n }}\r\n >\r\n {formatMessage(notificationMessages.setupPaymentButton)}\r\n </BaseButton>\r\n )}\r\n </div>\r\n )\r\n);\r\n","import { IStyle } from '@fluentui/merge-styles';\r\nimport { ITheme } from '@fluentui/theme';\r\nimport { BreakPoints, IPubcenterSpacing } from '../../../../../../theme';\r\n\r\nexport interface IPaymentsOnboardingStyles {\r\n root: IStyle;\r\n buttonContainer: IStyle;\r\n dialogContentContainer: IStyle;\r\n text: IStyle;\r\n defaultButton: IStyle;\r\n xPayContainer: IStyle;\r\n xPayOverlay: IStyle;\r\n setupNotificationWrapper: IStyle;\r\n setupNotificationText: IStyle;\r\n xPayLoadingSpinner: IStyle;\r\n transparentContainer: IStyle;\r\n targetPointer: IStyle;\r\n actionButton: IStyle;\r\n tncNotificationText: IStyle;\r\n}\r\nexport interface IPaymentOnboardingStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\nexport const getStyles = (props: IPaymentOnboardingStyleProps): IPaymentsOnboardingStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const { ResponsiveSmall } = BreakPoints;\r\n\r\n return {\r\n root: {\r\n padding: spacing.size8,\r\n [`#xpay-cpconboarding-container > div:nth-child(2) > div:nth-child(1)`]: { boxShadow: '1px 1px 4px -2px lightgray' },\r\n },\r\n buttonContainer: {\r\n display: 'flex',\r\n marginTop: spacing.l2,\r\n justifyContent: 'flex-end',\r\n '> button:first-child': { marginRight: spacing.size12 },\r\n },\r\n dialogContentContainer: {},\r\n setupNotificationWrapper: {\r\n display: 'flex',\r\n width: `calc(100vw - 64px)`,\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n },\r\n xPayContainer: {\r\n zIndex: 4,\r\n position: 'relative',\r\n backgroundColor: '#ffffff',\r\n borderRadius: 12,\r\n },\r\n xPayOverlay: { backgroundColor: 'lightgray', opacity: 0.6, zIndex: 3, overflowY: 'auto', transition: 'opacity 3s ease-in-out' },\r\n text: { color: theme.semanticColors.primaryButtonText },\r\n defaultButton: { color: theme.semanticColors.primaryButtonBackground },\r\n xPayLoadingSpinner: {\r\n paddingTop: 24,\r\n },\r\n transparentContainer: { opacity: 0 },\r\n setupNotificationText: {\r\n maxWidth: 'calc(100vw - 181px)',\r\n [ResponsiveSmall]: {\r\n alignSelf: 'center',\r\n },\r\n },\r\n tncNotificationText: {\r\n alignItems: 'center',\r\n maxWidth: 'calc(100vw - 164px)',\r\n [ResponsiveSmall]: {\r\n alignSelf: 'center',\r\n },\r\n },\r\n targetPointer: {\r\n position: 'absolute',\r\n width: 24,\r\n height: 24,\r\n backgroundColor: 'rgb(0, 120, 212)',\r\n transform: 'rotate(132deg)',\r\n bottom: -6,\r\n left: 30,\r\n },\r\n actionButton: {\r\n height: spacing.size24,\r\n },\r\n };\r\n};\r\n","module.exports = __webpack_public_path__ + \"static/media/noImageAvailable.86bd217e.svg\";","import { ISubGeography } from '../..';\r\nimport { getMetaDataStore } from './store';\r\n\r\nexport function getStatesOfCountry(country: string): ISubGeography[] {\r\n const metadataStore = getMetaDataStore();\r\n return metadataStore.raw?.states?.[country] || [];\r\n}\r\n\r\nexport function isStatesPresentForCountry(country: string): boolean {\r\n return getStatesOfCountry(country).length > 0;\r\n}\r\n\r\nexport function getStatesDropdownOptions(country: string): { key: string; text: string }[] {\r\n return getStatesOfCountry(country).map((state) => ({ key: state.code, text: state.name }));\r\n}\r\n","export enum ClarityStatus {\r\n NotConnected = 'NotConnected',\r\n Approved = 'Approved',\r\n Declined = 'Declined',\r\n Expired = 'Expired',\r\n Pending = 'Pending',\r\n Cancelled = 'Cancelled',\r\n NotFound = 'NotFound',\r\n}\r\n","import { createStore } from 'satcheljs';\r\nimport { IAppealStateState } from './schema/IAppealState';\r\n\r\nexport const getAppealStore = createStore<IAppealStateState>('AppealState', {\r\n documentUploadStatus: [],\r\n isDocumentUploadPanelOpen: false,\r\n});\r\n","export const xandrAdProvidersToNames = {\r\n 2: 'Xandr Invest',\r\n 8: 'MediaMath',\r\n 13: 'OwnerIQ',\r\n 17: 'Roku OneView',\r\n 18: 'Zeta DSP',\r\n 20: 'Amobee',\r\n 33: 'Peer39',\r\n 34: 'Epsilon',\r\n 44: 'Quantcast',\r\n 48: 'Proximic',\r\n 52: 'Criteo',\r\n 54: 'iPromote',\r\n 65: 'eyeReturn',\r\n 66: 'Simpli.fi',\r\n 74: 'ClickDistrict (Platform 161 / Verve DSP)',\r\n 78: 'Accordant Media, LLC',\r\n 82: 'The Trade Desk',\r\n 87: 'Buzzlogic',\r\n 89: 'Grapeshot',\r\n 91: 'AdForm',\r\n 94: 'AdGear',\r\n 96: 'Media.Net',\r\n 98: 'DoubleVerify',\r\n 100: 'sociomantic labs GmbH',\r\n 101: 'Display & Video 360',\r\n 107: 'Bidtheatre',\r\n 112: 'Delta Projects',\r\n 114: 'AcuityAds',\r\n 115: 'Bering Data Provider',\r\n 120: 'Integral Ad Science',\r\n 122: 'Dealer.com',\r\n 123: 'Vizury Interactive Solutions Pvt. Ltd.',\r\n 125: 'FOutClient01Bidder',\r\n 129: 'Platform Services Test Bidder',\r\n 133: 'Basis Technologies',\r\n 137: 'Semcasting',\r\n 139: 'adtheorent_bidder',\r\n 145: 'AdPilot',\r\n 158: 'Adobe - Display',\r\n 160: 'AppNexus Testing Data Provider Bidder',\r\n 164: 'LiquidM Technology GmbH',\r\n 172: 'NextRoll',\r\n 177: 'Adloox (Data Provider)',\r\n 179: 'El Toro (Data Provider)',\r\n 180: 'Crimson Tangerine Ltd.',\r\n 182: 'shong',\r\n 183: 'Yahoo DSP',\r\n 188: 'Amazon Advertising',\r\n 194: 'Mediarithmics',\r\n 197: 'mbr targeting GmbH',\r\n 216: 'Mobile Listening Bidder',\r\n 218: 'The Weather Channel, LLC (Data Provider)',\r\n 222: 'Rockerbox, Inc',\r\n 225: 'MaxPoint Interactive',\r\n 226: '4Info, Inc.',\r\n 228: 'BlueCava, Inc.',\r\n 230: 'TradeLab (Data Provider)',\r\n 236: 'Opt Out Advertising B.V.',\r\n 240: 'Ubimo',\r\n 245: 'Media IQ Digital Ltd',\r\n 247: 'Addictive Mobility',\r\n 254: 'Active Agent',\r\n 256: 'Platform Integrations Test RTDP (Data Provider)',\r\n 259: 'dw_bidder_capacity',\r\n 260: 'Triapodi LTD',\r\n 264: 'Samba RDP',\r\n 268: 'Civolution B.V. (Data Provider)',\r\n 271: 'Accordant Media, LLC - 2',\r\n 276: 'So-net Media Networks',\r\n 283: 'adsquare GmbH',\r\n 290: 'AppNexus Floor Optimization',\r\n 291: 'Deqwas Inc.',\r\n 297: 'LDMobile (netADge)',\r\n 301: 'Adserver Test (Data Provider)',\r\n 302: 'remerge bidder',\r\n 304: 'Factual Inc (Data Provider)',\r\n 305: 'Exponential Interactive, Inc.',\r\n 306: 'AdDaptive Intelligence, Inc.',\r\n 313: 'TradeLab2',\r\n 315: 'RTB House',\r\n 319: 'A.Mob',\r\n 320: 'Travel Audience GmbH',\r\n 326: 'Integral Ad Science (Data Provider 2)',\r\n 327: 'AppNexus Programmable Data (Data Provider)',\r\n 328: 'StackAdapt',\r\n 329: 'Accordant Media, LLC',\r\n 331: 'Beeswax',\r\n 332: 'Mediasmart Mobile S.L.',\r\n 333: 'Bidtellect',\r\n 335: 'Emerse Sverige AB',\r\n 337: 'Schibsted',\r\n 341: 'Mindlytix SAS',\r\n 347: 'Digital To Store Limited',\r\n 349: 'apd_scylla',\r\n 351: 'Adelphic',\r\n 353: 'Jaduda GmbH',\r\n 359: 'Biga Bid Media Ltd',\r\n 360: 'Chalk Digital, Inc.',\r\n 363: 'Kobler AS',\r\n 368: 'TAPTAP Networks, S.L',\r\n 370: 'Blis Media Ltd.',\r\n 373: 'LinkedIn Bidder',\r\n 375: 'RhythmOne LLC',\r\n 376: 'Mobile Professionals B.V.',\r\n 384: 'Appier Inc.',\r\n 385: 'Kontekstno-mediynye tekhnologii',\r\n 386: 'Nanigans Bidder',\r\n 388: 'Bidswitch',\r\n 389: 'AdElement, Inc.',\r\n 390: 'Adello Group AG',\r\n 394: 'Localsensor B.V.',\r\n 397: 'Adtube AS',\r\n 399: 'Zemanta',\r\n 402: 'Lerta Business Inc.',\r\n 405: 'Hawk (TabMo SAS)',\r\n 408: 'Smadex SL',\r\n 421: 'AN Data Science Internal 1',\r\n 423: 'Smartology',\r\n 425: 'Mediakeys Platform',\r\n 427: 'Adobe - Video',\r\n 430: 'Yandex Europe AG',\r\n 431: 'Kika Tech Inc',\r\n 433: 'ZypMedia, Inc. (Compulse)',\r\n 435: 'ReadPeak',\r\n 437: 'SundaySky, Inc.',\r\n 438: 'M1D (BidSwitch)',\r\n 440: 'YDN',\r\n 442: 'Knorex Pte. Ltd.',\r\n 443: 'Prebid Server',\r\n 446: 'Dynalyst',\r\n 448: 'US3',\r\n 449: 'OC GROUP TECNOLOGIA DA INFORMACAO LTDA',\r\n 451: 'National Media Connection',\r\n 453: 'Pocketmath, Inc.',\r\n 454: 'digiseg apn gateway',\r\n 457: 'YJ Test',\r\n 461: 'Beemray OY (Data Provider)',\r\n 462: 'appnexus-video',\r\n 463: 'DeepIntent, Inc.',\r\n 464: 'SMARTSTREAM.TV GmbH',\r\n 465: 'ITN Holdings, LLC',\r\n 466: 'Craid Inc.',\r\n 467: 'NetSeer, Inc. (Data Provider)',\r\n 468: 'Eyeview Inc.',\r\n 471: 'SQUARED (Data Provider Test 12)',\r\n 472: 'Semasio GmbH (Data Provider)',\r\n 473: 'Axel Springer Teaser Ad GmbH',\r\n 474: \"DO NOT USE - Kayla's test\",\r\n 480: 'Mnet_bidder_2.0',\r\n 481: 'PLAYGROUND XYZ (Data Provider)',\r\n 482: 'MadHive Inc.',\r\n 483: 'MSAN',\r\n 484: 'AdLede (Data Provider)',\r\n 488: 'Emetriq GmbH RT (Data Provider)',\r\n 490: 'test-1',\r\n 492: 'test (can be deleted)',\r\n 493: 'test2 (can be deleted)',\r\n 494: 'PulsePoint, Inc.',\r\n 508: 'Nano Interactive GmbH (Data Provider)',\r\n 512: 'Test1Bdr',\r\n 514: 'Test2',\r\n 522: 'Silver Bullet Media Services (Data Provider)',\r\n 523: 'Inmar-OIQ, LLC',\r\n 524: 'GCN INC',\r\n 526: 'GUM GUM Inc (Data Provider)',\r\n 528: 'Qwarry (Data Provider)',\r\n 529: 'Baidu (Hong Kong) Limited',\r\n 530: 'Cognitiv',\r\n 534: 'Ericson Emodo',\r\n 535: 'Stirista_Bidder',\r\n 537: 'OctillionMediaLLC',\r\n 539: 'Sirdata SAS (Data Provider)',\r\n 541: 'Seedtag Advertising SL (Data Provider)',\r\n 542: 'ALLIANCE GRAVITY DATA MEDIA (Data Provider)',\r\n 543: 'Adelaide Metrics Inc. (Data Provider)',\r\n 544: 'MGID Inc',\r\n 545: 'Audigent (Data Provider)',\r\n 546: 'Cognitiv Corp, a Delaware corp (Data Provider)',\r\n 548: 'MSAN Test',\r\n 550: 'Proxistore (Data Provider)',\r\n 551: 'CTV AppNexus Programmable Data (Data Provider)',\r\n 552: 'non CTV AppNexus Programmable Data (Data Provider)',\r\n 553: 'GDMServices, Inc. d/b/a Bidmind',\r\n 554: 'DealerX',\r\n 555: 'Predictive Audiences RealTime APD',\r\n 556: 'MNTN',\r\n 557: 'Ravel Technologies (Data Provider)',\r\n 558: 'Audigent (Test)',\r\n 559: 'Choreograph RTDP (Data Provider)',\r\n 560: 'Decide',\r\n 561: 'Goldfish Ads, LLC (Data Provider)',\r\n};\r\n","export function startOfDay(date: Date) {\r\n const newDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0, 0));\r\n return newDate;\r\n}\r\nexport function endOfDay(date: Date) {\r\n const newDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 0));\r\n return newDate;\r\n}\r\nexport const daysAheadOfToday = (dateString: string): number => {\r\n const today = new Date();\r\n const date = new Date(dateString);\r\n const diffTime = date.getTime() - today.getTime();\r\n const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\r\n return diffDays;\r\n};\r\nexport const breakdownDate = (date: Date, locale): { year: string; month: string; day: string } => {\r\n const year = date.toLocaleString(locale, { year: 'numeric' });\r\n const month = date.toLocaleString(locale, { month: 'short' });\r\n const day = date.toLocaleString(locale, { day: '2-digit' });\r\n return { year, month, day };\r\n};\r\n","import { addMethod, string, StringSchema } from 'yup';\r\nimport { Property } from '../../@data';\r\nimport { IPropertyViewModel } from '../../pages/ad-management/Property/Create/__data__/store/schema';\r\n\r\ndeclare module 'yup' {\r\n // tslint:disable-next-line:interface-name\r\n interface StringSchema {\r\n domain(message?: TestOptionsMessage): StringSchema;\r\n oldDomain(message?: TestOptionsMessage): StringSchema;\r\n duplicateDomain(sites: Property[], isEditMode: boolean, activeSite: IPropertyViewModel): StringSchema;\r\n name(message?: TestOptionsMessage): StringSchema;\r\n duplicateName(sites: Property[], activeSite: IPropertyViewModel): StringSchema;\r\n }\r\n}\r\n;\r\n\r\nexport function domainInitialize(defaultMessage: string) {\r\n const rDomain = /^(https?:\\/\\/)?([a-zA-Z0-9]+\\.)?[a-zA-Z0-9][a-zA-Z0-9-]+\\.[a-zA-Z]{2,}?\\/?.*(?<!\\/)$|^(\\*\\.([a-zA-Z0-9]+)((.[a-zA-Z0-9]+)?)+)$/i\r\n const pattern = new RegExp('^(?!://)([a-zA-Z0-9-_]+.)*[a-zA-Z0-9][a-zA-Z0-9-_]+.[a-zA-Z]{2,11}?$', 'i');\r\n\r\n function domainStringValidator(this: StringSchema, message?: string) {\r\n return this.matches(rDomain, { message: message ?? defaultMessage, excludeEmptyString: true });\r\n }\r\n\r\n function tythonDomainStringValidator(this: StringSchema, message?: string) {\r\n return (\r\n this.matches(rDomain, { message: message ?? defaultMessage, excludeEmptyString: true }) &&\r\n this.matches(pattern, { message: message ?? defaultMessage, excludeEmptyString: true })\r\n );\r\n }\r\n\r\n addMethod(string, 'oldDomain', domainStringValidator);\r\n addMethod(string, 'domain', tythonDomainStringValidator);\r\n}\r\n\r\nexport function duplicateDomainInitialize(defaultMessage: string) {\r\n // This function retrieves the domain name from the already saved site domains, if the sites saved contains 'www.' or 'https://'\r\n // it just retrieves the domain name without 'www.'\r\n function getDomainNameFromURL(websiteURL: string): string {\r\n let getTheHostName: string;\r\n if (websiteURL.indexOf('//') > -1) {\r\n getTheHostName = websiteURL.split('/')[2];\r\n } else {\r\n getTheHostName = websiteURL.split('/')[0];\r\n }\r\n getTheHostName = getTheHostName.split(':')[0];\r\n getTheHostName = getTheHostName.split('?')[0];\r\n getTheHostName = getTheHostName.split('www.')[1] ?? getTheHostName;\r\n return getTheHostName;\r\n }\r\n\r\n function checkSiteDomainDuplicates(this: StringSchema, sites: Property[], isEditMode: boolean, activeSite?: IPropertyViewModel) {\r\n if (!isEditMode) {\r\n const sitesDomain = sites.filter((site) => site.url && site.id !== activeSite?.id).map((site) => getDomainNameFromURL(site.url));\r\n\r\n return this.test('domain-duplicate', defaultMessage, (value: string) => {\r\n const domainName = value.split('www.')[1] ?? value;\r\n return !sitesDomain.some((site) => site === domainName);\r\n });\r\n } else {\r\n return this.test('domain-duplicate', defaultMessage, () => true);\r\n }\r\n }\r\n\r\n addMethod(string, 'duplicateDomain', checkSiteDomainDuplicates);\r\n}\r\n\r\nexport function nameInitialize(defaultMessage: string) {\r\n const nameRegex = /^[^\\d^\\W].*$/i;\r\n\r\n function nameStringValidator(this: StringSchema, message?: string) {\r\n return this.matches(nameRegex, { message: message ?? defaultMessage, excludeEmptyString: true });\r\n }\r\n\r\n addMethod(string, 'name', nameStringValidator);\r\n}\r\n\r\nexport function duplicateNameInitialize(defaultMessage: string) {\r\n function checkSiteNameDuplicates(this: StringSchema, sites: Property[], activeSite?: IPropertyViewModel) {\r\n return this.test('name-duplicate', defaultMessage, (value: string) => {\r\n return !sites.filter((site) => site.id !== activeSite?.id).some((site) => site.name === value);\r\n });\r\n }\r\n\r\n addMethod(string, 'duplicateName', checkSiteNameDuplicates);\r\n}\r\n","import { createStore } from \"satcheljs\";\r\nimport \"../orchestrators\";\r\nimport { IGoogleAdSenseViewState } from \"./schema/IGoogleAdSenseViewState\";\r\n\r\nexport const getGoogleAdSenseStore = createStore<IGoogleAdSenseViewState>('IGoogleAdSenseViewState', {\r\n active: {}\r\n});","import { uiConfig } from '../../config/ui.config';\r\nimport { IColumnMemberDetails, IMetadataElement } from '../../pages/report/DashboardCards/@data/store/schema';\r\nimport { ReportColumnMembersParams } from '../store/schema/models/ReportColumnMembersParams';\r\nimport { ReportingDataRequestBody } from '../store/schema/models/ReportingDataRequestBody';\r\nimport { ReportingDataResponse } from '../store/schema/models/ReportingDataResponse';\r\nimport { handleApiErrors, handleError } from '../utils/handleApiErrors';\r\nimport { buildRequestHeadersWithAuthToken } from '../utils/requestUtils';\r\nimport { ApiError } from './ApiService';\r\n\r\nexport async function getReportData(\r\n requestBody: ReportingDataRequestBody,\r\n abortController: AbortController\r\n): Promise<{ data: ReportingDataResponse; aborted: boolean }> {\r\n const baseUrl = `${uiConfig.getReportingApiBaseAddress()}`;\r\n const redirectUrl = 'data';\r\n const url = baseUrl + redirectUrl;\r\n\r\n const headers = await buildRequestHeadersWithAuthToken(url);\r\n\r\n let response: Response;\r\n try {\r\n response = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: JSON.stringify(requestBody),\r\n signal: abortController.signal,\r\n });\r\n if (!response.ok) {\r\n return handleApiErrors<{ data: ReportingDataResponse; aborted: boolean }>(response, url);\r\n }\r\n\r\n const responseJson = await response.json();\r\n if (responseJson) {\r\n return { data: responseJson, aborted: false };\r\n }\r\n return Promise.resolve({ aborted: false } as { data: ReportingDataResponse; aborted: boolean });\r\n } catch (err) {\r\n if (err.name === 'AbortError') {\r\n return Promise.resolve({ aborted: true } as { data: ReportingDataResponse; aborted: boolean });\r\n }\r\n const error = `getReportData operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function getDimensions(reportType: string): Promise<IMetadataElement[]> {\r\n const baseUrl = `${uiConfig.getReportingApiBaseAddress()}`;\r\n const redirectUrl = `metadata/dimensions?reportType=${reportType}`;\r\n const url = baseUrl + redirectUrl;\r\n\r\n const headers = await buildRequestHeadersWithAuthToken(url);\r\n\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: 'GET',\r\n headers,\r\n });\r\n\r\n if (!response.ok) {\r\n return handleApiErrors<IMetadataElement[]>(response, url);\r\n }\r\n\r\n const responseJson = await response.json();\r\n\r\n if (responseJson) {\r\n return responseJson;\r\n }\r\n return Promise.resolve([]);\r\n } catch (err) {\r\n const error = `getDimensions operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function getMetrics(reportType: string): Promise<IMetadataElement[]> {\r\n const baseUrl = `${uiConfig.getReportingApiBaseAddress()}`;\r\n const redirectUrl = `metadata/metrics?reportType=${reportType}`;\r\n const url = baseUrl + redirectUrl;\r\n\r\n const headers = await buildRequestHeadersWithAuthToken(url);\r\n\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: 'GET',\r\n headers,\r\n });\r\n\r\n if (!response.ok) {\r\n return handleApiErrors<IMetadataElement[]>(response, url);\r\n }\r\n\r\n const responseJson = await response.json();\r\n\r\n if (responseJson) {\r\n return responseJson;\r\n }\r\n return Promise.resolve([]);\r\n } catch (err) {\r\n const error = `getMetrics operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function getGranularity(reportType: string): Promise<IMetadataElement[]> {\r\n const baseUrl = `${uiConfig.getReportingApiBaseAddress()}`;\r\n const redirectUrl = `metadata/grain?reportType=${reportType}`;\r\n const url = baseUrl + redirectUrl;\r\n\r\n const headers = await buildRequestHeadersWithAuthToken(url);\r\n\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: 'GET',\r\n headers,\r\n });\r\n\r\n if (!response.ok) {\r\n return handleApiErrors<IMetadataElement[]>(response, url);\r\n }\r\n\r\n const responseJson = await response.json();\r\n\r\n if (responseJson) {\r\n return responseJson;\r\n }\r\n return Promise.resolve([]);\r\n } catch (err) {\r\n const error = `getGranularity operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function getColumnMembers(requestParams: ReportColumnMembersParams): Promise<IColumnMemberDetails[]> {\r\n const baseUrl = `${uiConfig.getReportingApiBaseAddress()}`;\r\n const redirectUrl = `metadata/columnMembers?${new URLSearchParams(requestParams)}`;\r\n const url = baseUrl + encodeURIComponent(redirectUrl);\r\n\r\n const headers = await buildRequestHeadersWithAuthToken(url);\r\n\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: 'GET',\r\n headers,\r\n });\r\n\r\n if (!response.ok) {\r\n return handleApiErrors<IColumnMemberDetails[]>(response, url);\r\n }\r\n\r\n const responseJson = await response.json();\r\n\r\n if (responseJson) {\r\n return responseJson;\r\n }\r\n return Promise.resolve([]);\r\n } catch (err) {\r\n const error = `getColumnMembers operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../theme';\r\nimport { ICommonStyleProps } from '../../types';\r\n\r\ntype StyleProperties = 'pivotRootStyle' | 'pivotItemContainerStyle';\r\nexport type TabsStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): TabsStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { spacing, palette } = theme;\r\n\r\n return mergeStyleSets({\r\n pivotRootStyle: {\r\n borderBottom: `1px solid ${palette.neutralQuaternaryAlt}`,\r\n marginLeft: `-${spacing.size32}`,\r\n marginTop: spacing.size2,\r\n padding: `0 ${spacing.size32}`,\r\n },\r\n pivotItemContainerStyle: {\r\n marginLeft: spacing.size8,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): TabsStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { mergeStyleSets, Pivot, PivotItem } from '@fluentui/react';\r\nimport React, { useEffect, useMemo, useState } from 'react';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\nimport { injectRouterAndIntlWithObserver, IRouterWithIntl } from '../../utils';\r\nimport { getCurrentHashValue } from '../../utils/UrlUtils';\r\nimport { getClassNames, TabsStyles } from './Tabs.styles';\r\n\r\nexport interface ITabProps {\r\n key: string;\r\n headerText: string;\r\n component: JSX.Element;\r\n}\r\n\r\nexport interface ITabsProps {\r\n tabs: ITabProps[];\r\n className?: string;\r\n styleProps?: Partial<TabsStyles>;\r\n defaultTab?: string;\r\n showItem?: (item) => void;\r\n}\r\n\r\nconst getDefaultSelectedTabKey = (keys: string[]): string => {\r\n const currentHashValue = getCurrentHashValue();\r\n if (keys.includes(currentHashValue)) {\r\n return currentHashValue;\r\n }\r\n\r\n // return first tab key if no hash is provided in the URL\r\n return keys[0];\r\n};\r\n\r\nconst updateUrl = (item?: PivotItem) => {\r\n if (!item) {\r\n return;\r\n }\r\n\r\n const url = new URL(window.location.href);\r\n url.hash = item.props.itemKey || '';\r\n window.history.replaceState('', '', url.toString());\r\n};\r\n\r\nexport const Tabs = injectRouterAndIntlWithObserver(\r\n ({\r\n tabs,\r\n styleProps,\r\n className = '',\r\n history,\r\n showItem,\r\n }: ITabsProps &\r\n IRouterWithIntl &\r\n RouteComponentProps<\r\n {},\r\n {},\r\n {\r\n defaultTab?: string;\r\n }\r\n >): JSX.Element => {\r\n const { pivotRootStyle, pivotItemContainerStyle } = mergeStyleSets(getClassNames(), styleProps);\r\n const keys = useMemo(() => tabs.map((tab) => tab.key), [tabs]);\r\n const defaultTab = getDefaultSelectedTabKey(keys);\r\n const redirectTab = history?.location?.state?.defaultTab;\r\n const [selectedKey, setSelectedKey] = useState(defaultTab);\r\n\r\n useEffect(() => {\r\n if (redirectTab) {\r\n setSelectedKey(redirectTab);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [redirectTab]);\r\n\r\n useEffect(() => {\r\n return () => setSelectedKey(defaultTab);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <Pivot\r\n defaultSelectedKey={defaultTab}\r\n selectedKey={selectedKey}\r\n className={className}\r\n styles={{ root: pivotRootStyle, itemContainer: pivotItemContainerStyle }}\r\n onLinkClick={(link) => {\r\n setSelectedKey(link?.props?.itemKey!!);\r\n showItem?.(link);\r\n updateUrl(link);\r\n }}\r\n >\r\n {tabs.map((tab) => (\r\n <PivotItem key={tab.key} itemKey={tab.key} headerText={tab.headerText}>\r\n {tab.component}\r\n </PivotItem>\r\n ))}\r\n </Pivot>\r\n );\r\n }\r\n);\r\n","import { action } from 'satcheljs';\r\n\r\nexport const showTokenExpirationNotification = action('showTokenExpirationNotification');\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onManagePageInitialized = action('onManagePageInitialized');\r\n","export enum FormState {\r\n Create,\r\n View,\r\n Edit,\r\n InPageCreate,\r\n InPageView,\r\n InPageEdit,\r\n Delete,\r\n Resend,\r\n AcceptInvite,\r\n MultiStepCreation,\r\n MultiStepEdit,\r\n}\r\n","import { action } from 'satcheljs';\r\nimport { IGridV2Column } from '../../../../../layout/GridPageV2';\r\n\r\nexport const onManagePageInitialized = action('onManagePageInitialized', (defaultDataGridColumns: IGridV2Column[]) => ({\r\n defaultDataGridColumns,\r\n}));\r\n\r\nexport const onUserInvitationsGridInitialized = action('onUserInvitationsGridInitialized', (defaultDataGridColumns: IGridV2Column[]) => ({\r\n defaultDataGridColumns,\r\n}));\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onInitializeRecommendationSection = action('onInitializeRecommendationSection');\r\nexport const fetchSetupCardsStatus = action('fetchSetupCardsStatus');\r\nexport const triggerOneVetAPIs = action('triggerOneVetAPIs', (eventType: 'login' | 'signup', useCache?: boolean) => ({\r\n eventType,\r\n useCache,\r\n}));\r\nexport const dismissFRE = action('dismissFRE');\r\nexport const onInitializeSystemPreferences = action('onInitializeSystemPreferences');\r\n","export enum AdPropertyType {\r\n Unspecified,\r\n Website,\r\n Software,\r\n Mobile\r\n}","export enum AdSource {\r\n Microsoft = 'Microsoft',\r\n Auction = 'Auction',\r\n XandrAuction = 'Xandr Auction',\r\n}\r\n","export enum AdsTxtStatus {\r\n Found,\r\n NotFound,\r\n Scanning,\r\n}\r\n","export enum AdUnitMarketClassification {\r\n OwnedAndOperatedCore = 'OwnedAndOperatedCore',\r\n OwnedAndOperated = 'OwnedAndOperated',\r\n Syndicated = 'Syndicated',\r\n SelectTier = 'SelectTier',\r\n Sponsored = 'Sponsored',\r\n SponsoredEnhanced = 'SponsoredEnhanced',\r\n}\r\n","export enum AdUnitRPSGuarantee {\r\n None,\r\n Core,\r\n Excluded,\r\n Other\r\n}","export enum AdUnitServingTier {\r\n Default = 'Default',\r\n lowCost = 'Low'\r\n}\r\n","export enum AdUnitType {\r\n Unspecified = 'Unspecified',\r\n Search = 'Search',\r\n Native = 'Native',\r\n MobileSearch = 'MobileSearch',\r\n}","export enum ApiErrorCodes {\r\n AdUnitDoesNotHaveTemplate = 'AdUnitDoesNotHaveTemplate',\r\n /** When API call fails due to token exiry or other authentication failure below error codes are returned */\r\n InvalidOAuthToken = 'InvalidOAuthToken',\r\n InvalidUserCredentials = 'InvalidUserCredentials',\r\n InvalidCCAuthToken = 'InvalidClientCenterAuthenticationToken',\r\n UserDoesNotExist = 'UserDoesNotExist',\r\n UserAlreadyMigrated = 'UserAlreadyMigrated',\r\n UserIdNotFound = 'UserIdNotFound',\r\n}\r\n","export enum AuditType {\r\n CREATE = 'CREATE',\r\n UPDATE = 'UPDATE',\r\n DELETE = 'DELETE',\r\n EXPORT = 'EXPORT',\r\n DOWNLOAD = 'DOWNLOAD',\r\n INVITE = 'INVITE',\r\n INVITE_ACCEPT = 'INVITE_ACCEPT',\r\n}\r\n","export enum ChannelType {\r\n UnSpecified = 'UnSpecified',\r\n URL = 'Url',\r\n CUSTOM = 'Custom',\r\n}","export enum ClarityType {\r\n Fraud,\r\n Behavioral,\r\n None,\r\n}\r\n","export enum CustomPanelType {\r\n ModifyColumns,\r\n None,\r\n}","export enum EntityLimitTier {\r\n Infinite = 'Infinite',\r\n Small = 'Small',\r\n Medium = 'Medium',\r\n Large = 'Large',\r\n Network = 'Network'\r\n}\r\n","export enum EntityType {\r\n Publisher = 'Publisher',\r\n Property = 'Property',\r\n User = 'User',\r\n}\r\n","export enum FeatureOverideTier {\r\n // needs to add what API accepts\r\n InternalPremium = 'InternalPremium',\r\n ManagedPremium = 'ManagedPremium',\r\n SelfServeStandard = 'SelfServeStandard',\r\n Api = 'Api',\r\n SelfServeExperiment = 'SelfServeExperiment',\r\n SelfServeSearch = 'SelfServeSearch'\r\n}\r\n","export enum FilterScope {\r\n Account = 'Account',\r\n Publisher = 'Publisher'\r\n}","export enum LayoutMode {\r\n Default,\r\n ContentOnly\r\n}\r\n","export enum MediaType {\r\n PaidSearch = 1,\r\n Contextual = 2,\r\n MobileSearch = 3,\r\n MobileContextual = 4,\r\n Display = 5,\r\n WindowsApp = 6,\r\n Native = 10,\r\n AudienceAds = 11,\r\n LinkedInAds = 12,\r\n}\r\n\r\nexport const MediaTypeString = {\r\n PaidSearch: 'PaidSearch',\r\n MobilePaidSearch: 'MobilePaidSearch',\r\n Native: 'Native',\r\n AudienceAds: 'AudienceAds',\r\n LinkedInAds: 'LinkedInAds',\r\n};\r\n","import { IDictionary } from '../../../../globalization';\r\n\r\nexport enum NotificationLabel {\r\n // Critical\r\n ProfileReviewTSTFailed = 'ProfileReviewTSTFailed',\r\n ProfileReviewPublisherReputationFailed = 'ProfileReviewPublisherReputationFailed',\r\n PaymentFailed = 'PaymentFailed',\r\n PolicyUpdate = 'PolicyUpdate',\r\n ClarityLinkDeclined = 'ClarityLinkDeclined',\r\n ClarityLinkExpired = 'ClarityLinkExpired',\r\n\r\n ProfileReviewPublisherReputationPassed = 'ProfileReviewPublisherReputationPassed',\r\n\r\n // Payment failed reasons\r\n PaymentFailedAccountClosed = 'PaymentFailedAccountClosed',\r\n PaymentFailedBankAccountRestricted = 'PaymentFailedBankAccountRestricted',\r\n PaymentFailedStripeCouldNotProcess = 'PaymentFailedStripeCouldNotProcess',\r\n PaymentFailedCouldNotProcess = 'PaymentFailedCouldNotProcess',\r\n PaymentFailedDeclined = 'PaymentFailedDeclined',\r\n PaymentFailedExpiredCard = 'PaymentFailedExpiredCard',\r\n PaymentFailedIncorrectAccountHolderName = 'PaymentFailedIncorrectAccountHolderName',\r\n PaymentFailedInvalidAccountNumber = 'PaymentFailedInvalidAccountNumber',\r\n PaymentFailedInvalidCard = 'PaymentFailedInvalidCard',\r\n PaymentFailedInvalidCurrency = 'PaymentFailedInvalidCurrency',\r\n PaymentFailedLostOrStolenCard = 'PaymentFailedLostOrStolenCard',\r\n PaymentFailedNoAccount = 'PaymentFailedNoAccount',\r\n PaymentFailedNoAccountLocated = 'PaymentFailedNoAccountLocated',\r\n\r\n // b. Warning\r\n DomainReviewPassed = 'DomainReviewPassed',\r\n DomainReviewFailed = 'DomainReviewFailed',\r\n MissingPaymentInformation = 'MissingPaymentInformation',\r\n\r\n UserSpecificTestLabel = 'UserSpecificTestLabel',\r\n\r\n SomeTestAnnouncement = 'SomeTestAnnouncement',\r\n\r\n // Error\r\n ChooseGamNetworkFailure = 'ChooseGamNetworkFailure',\r\n ChangingItemStatusFailure = 'ChangingItemStatusFailure',\r\n DeletingItemFailure = 'DeletingItemFailure',\r\n GridDataDownloadFailure = 'GridDataDownloadFailure',\r\n DuplicateGridItemFailure = 'DuplicateGridItemFailure',\r\n FeedbackErrorMessage = 'FeedbackErrorMessage',\r\n FeedBackInvalidFormMessage = 'FeedBackInvalidFormMessage',\r\n LoadingBalanceDataFailed = 'LoadingBalanceDataFailed',\r\n PayoutInformationFailed = 'PayoutInformationFailed',\r\n LoadPayoutInfoFailed = 'LoadPayoutInfoFailed',\r\n DeletingUserWentWrong = 'DeletingUserWentWrong',\r\n AdblockUpdateFailed = 'AdblockUpdateFailed',\r\n AdblockToggleFailed = 'AdblockToggleFailed',\r\n ToggleUniversalBlockFailed = 'ToggleUniversalBlockFailed',\r\n UniversalAdblockUpdateFailed = 'UniversalAdblockUpdateFailed',\r\n DuplicatedSiteCreationErrorNotification = 'DuplicatedSiteCreationErrorNotification',\r\n LoadingSitesFailed = 'LoadingSitesFailed',\r\n PropertyEditFailedNotification = 'PropertyEditFailedNotification',\r\n CreateTythonAdUnitFailed = 'CreateTythonAdUnitFailed',\r\n}\r\n\r\nexport const mappingReasonsToLabels: IDictionary<NotificationLabel> = {\r\n PaymentFailedReason_account_closed: NotificationLabel.PaymentFailedAccountClosed,\r\n PaymentFailedReason_bank_account_restricted: NotificationLabel.PaymentFailedBankAccountRestricted,\r\n PaymentFailedReasonStripe_could_not_process: NotificationLabel.PaymentFailedStripeCouldNotProcess,\r\n PaymentFailedReason_could_not_process: NotificationLabel.PaymentFailedCouldNotProcess,\r\n PaymentFailedReason_declined: NotificationLabel.PaymentFailedDeclined,\r\n PaymentFailedReason_expired_card: NotificationLabel.PaymentFailedExpiredCard,\r\n PaymentFailedReason_incorrect_account_holder_name: NotificationLabel.PaymentFailedIncorrectAccountHolderName,\r\n PaymentFailedReason_invalid_account_number: NotificationLabel.PaymentFailedInvalidAccountNumber,\r\n PaymentFailedReason_invalid_card: NotificationLabel.PaymentFailedInvalidCard,\r\n PaymentFailedReason_invalid_currency: NotificationLabel.PaymentFailedInvalidCurrency,\r\n PaymentFailedReason_lost_or_stolen_card: NotificationLabel.PaymentFailedLostOrStolenCard,\r\n PaymentFailedReason_no_account: NotificationLabel.PaymentFailedNoAccount,\r\n PaymentFailedReasonLocate_no_account: NotificationLabel.PaymentFailedNoAccountLocated,\r\n};\r\n\r\nexport const primaryExternalNotificationLabels = [\r\n NotificationLabel.PolicyUpdate,\r\n NotificationLabel.PaymentFailed,\r\n NotificationLabel.PaymentFailedAccountClosed,\r\n NotificationLabel.PaymentFailedBankAccountRestricted,\r\n NotificationLabel.PaymentFailedStripeCouldNotProcess,\r\n NotificationLabel.PaymentFailedCouldNotProcess,\r\n NotificationLabel.PaymentFailedDeclined,\r\n NotificationLabel.PaymentFailedExpiredCard,\r\n NotificationLabel.PaymentFailedIncorrectAccountHolderName,\r\n NotificationLabel.PaymentFailedInvalidAccountNumber,\r\n NotificationLabel.PaymentFailedInvalidCard,\r\n NotificationLabel.PaymentFailedInvalidCurrency,\r\n NotificationLabel.PaymentFailedLostOrStolenCard,\r\n NotificationLabel.PaymentFailedNoAccount,\r\n NotificationLabel.PaymentFailedNoAccountLocated,\r\n NotificationLabel.ClarityLinkDeclined,\r\n NotificationLabel.ClarityLinkExpired,\r\n];\r\n","export enum NotificationSeverity {\r\n Critical = 'Critical',\r\n Warning = 'Warning',\r\n Informational = 'Informational',\r\n Announcements = 'Announcements',\r\n Error = 'Error',\r\n}\r\n","export enum Partner {\r\n Microsoft = 'Microsoft',\r\n Yahoo = 'Yahoo'\r\n}","export enum PaymentInstrumentLifeCycleStatus {\r\n Created = 'Created',\r\n Submitted = 'Submitted',\r\n Pending = 'Pending',\r\n Failed = 'Failed',\r\n PinFailed = 'PinFailed',\r\n Blacklisted = 'Blacklisted',\r\n Success = 'Success',\r\n Validated = 'Validated'\r\n}\r\n","export enum PaymentOption {\r\n MonthlyThreshold = 'Monthly Threshold',\r\n NoPay = 'No Pay',\r\n}\r\n","export enum PrivateMarketplace {\r\n InHouse = 'InHouse',\r\n Boost = 'Boost',\r\n}\r\n","export enum PropertyApprovalStatus {\r\n Approved = 'Approved',\r\n AutoApproved = 'AutoApproved',\r\n Rejected = 'Rejected',\r\n UnderManualReview= 'UnderManualReview'\r\n}","export enum PublisherGroupConfig {\r\n DefaultPlus = 'DefaultPlus',\r\n Default = 'Default',\r\n Generalist = 'Generalist',\r\n YieldOptimize = 'YieldOptimize',\r\n YieldMaximize = 'YieldMaximize',\r\n BingYahooOAndO = 'BingYahooOAndO',\r\n LowQualityDistribution = 'LowQualityDistribution',\r\n MediumQualityDistribution = 'MediumQualityDistribution',\r\n HighQualityDistribution = 'HighQualityDistribution',\r\n}\r\n","export enum NetworkAffiliation {\r\n OwnedAndOperated = 'OwnedAndOperated',\r\n Syndicated = 'Syndicated'\r\n}","export enum PublisherTier {\r\n // needs to add what API accepts\r\n InternalPremium = 'InternalPremium',\r\n ManagedPremium = 'ManagedPremium',\r\n SelfServeStandard = 'SelfServeStandard',\r\n SelfServe3rdParty = 'SelfServe3rdParty',\r\n SelfServe1stParty = 'SelfServe1stParty',\r\n SelfServe1stPartyBoost = 'SelfServe1stPartyBoost',\r\n}\r\n","export enum ServiceLevel {\r\n SelfServe = 'SelfServe',\r\n SelfServeTrusted = 'SelfServeTrusted',\r\n Premium = 'Premium',\r\n Internal = 'Internal',\r\n Select = 'Select'\r\n}\r\n\r\nexport const serviceLevelNameIdMap = {\r\n SelfServe: 1,\r\n SelfServeTrusted: 2,\r\n Premium: 3,\r\n Internal: 4,\r\n Select: 5\r\n};\r\n","export enum UserRole {\r\n PublisherAdmin = 'PublisherAdmin',\r\n AccountManager = 'AccountManager',\r\n ReportUser = 'ReportUser',\r\n ListManager = 'ListManager',\r\n AdView = 'AdViewer',\r\n SuperAdmin = 'SuperAdmin'\r\n}\r\n","export enum UserRoleEntityType {\r\n Customer = 'Customer',\r\n Account = 'Account'\r\n}\r\n","import { AppealHistory } from '../../../../../../@data';\r\n\r\nexport interface IAppealStateState {\r\n isDocumentUploadPanelOpen?: boolean;\r\n documentUploadStatus: DocumentUploadStatus[];\r\n appealHistory?: AppealHistory[];\r\n}\r\n\r\nexport enum DocumentUploadStatus {\r\n NotStarted = 1,\r\n InProgress,\r\n Uploaded,\r\n ActionRequired,\r\n}\r\n","import { mixed, object, string } from 'yup';\r\nimport { CustomerHelp } from '../../../../../@data/store/schema/enums/CustomerHelp';\r\nimport { PublisherType } from '../../../../../@data/store/schema/enums/PublisherType';\r\nimport { ISignUpViewModel } from './ISignUpViewModel';\r\n\r\nexport const ORG_NAME_MIN_LENGTH = 3;\r\nexport const ORG_NAME_MAX_LENGTH = 250;\r\n\r\nexport function signUpErrorModel() {\r\n return object<ISignUpViewModel>().shape({\r\n accountType: mixed().oneOf([PublisherType.individual, PublisherType.organization]).required(),\r\n organizationName: mixed()\r\n .when('accountType', {\r\n is: PublisherType.organization,\r\n then: string().required().min(ORG_NAME_MIN_LENGTH).max(ORG_NAME_MAX_LENGTH),\r\n })\r\n .label('Organization name'),\r\n userFirstName: string().trim().required().label('First name'),\r\n userLastName: string().trim().required().label('Last name'),\r\n customerHelp: mixed().oneOf([CustomerHelp.Default, CustomerHelp.NoHelp]),\r\n });\r\n}\r\n","import { createStore } from 'satcheljs';\r\nimport { PublisherType } from '../../../../@data/store/schema/enums/PublisherType';\r\nimport { ISignUpViewState } from './schema';\r\nexport const DEFAULT_SELECTED_ACCOUNT_TYPE = PublisherType.individual;\r\n\r\nexport const getSignUpStore = createStore<ISignUpViewState>('SignUpState', {\r\n active: {\r\n accountType: DEFAULT_SELECTED_ACCOUNT_TYPE,\r\n },\r\n errors: {},\r\n isTermsAndConditionsAgreed: false,\r\n fetchingOvdfStatus: false,\r\n optInPromotionalEmail: false,\r\n});\r\n","import { mixed, object, string } from 'yup';\r\nimport { Publisher, SelfServePublisher, User, getAddressValidationModel, isOrganizationPublisher } from '../../../../../../@data';\r\nimport { PublisherType } from '../../../../../../@data/store/schema/enums/PublisherType';\r\nimport { ORG_NAME_MAX_LENGTH, ORG_NAME_MIN_LENGTH } from '../../../../../signup/@data';\r\n\r\nexport function profileValidationModel() {\r\n if (isOrganizationPublisher()) {\r\n return object<SelfServePublisher>().shape({\r\n user: getUserProfileValidationModel(),\r\n publisher: getPublisherProfileValidationModel(),\r\n });\r\n } else {\r\n return object<SelfServePublisher>().shape({\r\n user: getUserProfileValidationModel(),\r\n });\r\n }\r\n}\r\n\r\nexport function getUserProfileValidationModel() {\r\n return object<User>().shape({\r\n contactInfo: object().shape({\r\n phone1: string()\r\n // TODO: for now make +1 as mandatory US country code, when enabling for other countries, we can make it dynamic\r\n .matches(/^\\+1 \\d{10}$/, {\r\n message: 'Invalid phone number',\r\n })\r\n .required()\r\n .label('Phone1'),\r\n }),\r\n postalAddress: getAddressValidationModel(),\r\n });\r\n}\r\n\r\nexport function getPublisherProfileValidationModel() {\r\n return object<Publisher>().shape({\r\n publisherType: mixed().oneOf([PublisherType.individual, PublisherType.organization]).required(),\r\n name: string().required().min(ORG_NAME_MIN_LENGTH).max(ORG_NAME_MAX_LENGTH).label('Organization name'),\r\n extendedProperties: object().shape({\r\n organizationEmailAddress: string().email().required().label('Organization email'),\r\n organizationUrl: string().domain('Invalid organization URL').required().label('Organization URL'),\r\n ceoName: string().name().required().label('CEO name'),\r\n }),\r\n address: getAddressValidationModel(),\r\n });\r\n}\r\n","import { Callout, classNamesFunction, DirectionalHint, IconButton, Spinner } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { IInfoButtonProps, IInfoButtonStyleProps, IInfoButtonStyles } from './InfoButton.types';\r\n\r\nconst getClassNames = classNamesFunction<IInfoButtonStyleProps, IInfoButtonStyles>();\r\ninterface IInfoButtonState {\r\n isCalloutVisible?: boolean;\r\n}\r\n\r\nexport class InfoButtonBase extends React.Component<IInfoButtonProps, IInfoButtonState> {\r\n private _iconButtonElement = React.createRef<HTMLDivElement>();\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n isCalloutVisible: false,\r\n };\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { styles, theme, iconName, iconTitle, calloutContent, calloutProps, ariaLabel, ariaDescription } = this.props;\r\n const classNames = getClassNames(styles, { theme: theme! });\r\n\r\n return (\r\n <div className={classNames.root}>\r\n <div className={classNames.icon} ref={this._iconButtonElement}>\r\n <IconButton\r\n styles={{\r\n rootFocused: {\r\n '@media screen and (-ms-high-contrast: active), screen and (forced-colors: active) .ms-Fabric--isFocusVisible .root-241:focus::after': {\r\n inset: '2px !important',\r\n },\r\n },\r\n }}\r\n iconProps={{ iconName: iconName ? iconName : 'info' }}\r\n title={iconTitle}\r\n ariaLabel={ariaLabel}\r\n ariaDescription={ariaDescription}\r\n onClick={this._onInfoButtonClick}\r\n />\r\n </div>\r\n <Callout\r\n className={classNames.callout}\r\n {...calloutProps}\r\n target={this._iconButtonElement.current}\r\n onDismiss={this._onCalloutDismiss}\r\n hidden={!this.state.isCalloutVisible}\r\n directionalHint={DirectionalHint.rightCenter}\r\n gapSpace={15}\r\n ariaLabel={ariaLabel + ' Callout'}\r\n setInitialFocus={true}\r\n aria-live=\"assertive\"\r\n >\r\n {calloutContent ? <div dangerouslySetInnerHTML={{ __html: calloutContent }} /> : <Spinner />}\r\n </Callout>\r\n </div>\r\n );\r\n }\r\n\r\n private _onInfoButtonClick = (ev: React.MouseEvent<HTMLDivElement>): void => {\r\n ev.stopPropagation(); // Prevents the event from bubbling up to the parent element\r\n this.setState({ isCalloutVisible: !this.state.isCalloutVisible });\r\n if (this.props.iconButtonOnClick) {\r\n this.props.iconButtonOnClick();\r\n }\r\n };\r\n\r\n private _onCalloutDismiss = (): void => {\r\n this.setState({ isCalloutVisible: false });\r\n if (this.props.calloutOnDismiss) {\r\n this.props.calloutOnDismiss();\r\n }\r\n };\r\n}\r\n","import { IInfoButtonStyleProps, IInfoButtonStyles } from './InfoButton.types';\r\n\r\nexport const getStyles = (props: IInfoButtonStyleProps): IInfoButtonStyles => {\r\n return {\r\n callout:['ms-font-m',{\r\n padding: 10,\r\n }],\r\n icon: {\r\n display: 'inline-block'\r\n }\r\n };\r\n};\r\n","import { styled } from '@fluentui/react';\r\nimport { InfoButtonBase } from './InfoButton.base';\r\nimport { getStyles } from './InfoButton.styles';\r\nimport { IInfoButtonProps, IInfoButtonStyleProps, IInfoButtonStyles } from './InfoButton.types';\r\n\r\n// Use Fabric Base guidelines since this might be contributed back to Fabric.\r\nexport const InfoButton = styled<IInfoButtonProps, IInfoButtonStyleProps, IInfoButtonStyles>(InfoButtonBase, getStyles, undefined, {\r\n scope: 'InfoButton',\r\n});\r\n","import { getAppStore, listEntity, UserContext } from '../../../../../@data';\r\nimport { BrandSearchResponse } from '../../../../../@data/store/schema/models/BrandSearchResponse';\r\n\r\nexport async function fetchBrands(keyword: string, userContext?: UserContext): Promise<BrandSearchResponse[]> {\r\n const effectiveUserContext = userContext || getAppStore().userContext;\r\n const searchParams = new URLSearchParams({\r\n search: keyword,\r\n });\r\n\r\n return await listEntity([], effectiveUserContext, BrandSearchResponse, searchParams);\r\n}\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../logging/src';\r\nimport { getSupportedSubGeographies } from '../../services/MetadataService';\r\nimport { fetchStatesOfCountry, setStatesOfCountry } from '../actions';\r\nimport { isStatesPresentForCountry } from '../store/selectors';\r\n\r\norchestrator(fetchStatesOfCountry, async ({ country }) => {\r\n try {\r\n // Return if the states are already fetched\r\n // NOTE: This logic is inside the orchestrator to avoid unnecessary network calls,\r\n // because the states don't change often.\r\n if (isStatesPresentForCountry(country)) {\r\n return;\r\n }\r\n\r\n const states = await getSupportedSubGeographies(country);\r\n setStatesOfCountry(country, states);\r\n } catch (error) {\r\n Log.error(`Failed to fetch states of country ${country}`);\r\n }\r\n});\r\n","import { createStore } from 'satcheljs';\r\nimport '../orchestrators';\r\nimport { IAppMetaDataState } from './schema';\r\n\r\nexport const getMetaDataStore = createStore<IAppMetaDataState>('AppMetaData', {\r\n raw: {},\r\n errors: {},\r\n});\r\n","/* eslint-disable @typescript-eslint/consistent-type-assertions */\r\nfunction generateChars(length: number) {\r\n let chars = '';\r\n for (let i = 0; i < length; i++) {\r\n const array = new Uint8Array(1);\r\n // tslint:disable-next-line\r\n const crypto = window.crypto || (<any>window).msCrypto;\r\n crypto.getRandomValues(array);\r\n const randomChar = Math.floor((array[0] / 1000) * 64);\r\n chars += randomChar.toString(36);\r\n }\r\n return chars;\r\n}\r\n\r\nexport function generateGuid() {\r\n // format : 'xxxxxxxx-xxxx-4xxx-yxxx-xx'\r\n\r\n return generateChars(8) + '-' + generateChars(4) + '-' + generateChars(4) + '-' + generateChars(4) + '-' + generateChars(2);\r\n}\r\n","import 'dotenv/config';\r\nimport { Log } from '../../../logging/src';\r\nimport { uiConfig } from '../../config/ui.config';\r\nimport { handleError } from '../../pages/ad-management/AdQuality/@data/services/utility/utility';\r\nimport '../../pages/ad-management/Profile/@data/orchestrators';\r\nimport { generateGuid } from '../../utils/GuidUtils';\r\nimport { Publisher, User } from '../store';\r\nimport { PublisherType } from '../store/schema/enums/PublisherType';\r\nimport { OvdfAPIRequest } from '../store/schema/models/OvdfAPIRequest';\r\nimport { VerifyCodeStatusRequest } from '../store/schema/models/VerifyCodeStatusRequest';\r\nimport { VerifyCodeStatusResponse } from '../store/schema/models/VerifyCodeStatusResponse';\r\nimport { getAppStore } from '../store/store';\r\nimport { buildRequestHeadersWithAuthToken, handleApiErrors } from '../utils';\r\nimport { ApiError } from './ApiService';\r\nimport { getIdToken } from './PubCenterAADAuthService';\r\n\r\nexport const CUSTOM_MESSAGE_CODE = '715-123325';\r\n\r\nexport async function fetchOneVetReviewStatus(eventType: 'login' | 'signup', publisher?: Publisher, user?: User): Promise<string> {\r\n if (process.env.REACT_APP_ENV !== 'production') {\r\n return 'pass';\r\n }\r\n\r\n const { userContext } = getAppStore();\r\n const sessionId = sessionStorage.getItem('session_id');\r\n const idToken = await getIdToken();\r\n\r\n if (userContext && sessionId && idToken) {\r\n const url = `${uiConfig.getApiBaseAddress()}/${encodeURIComponent('ovdf')}`;\r\n const headers = await buildRequestHeadersWithAuthToken(url, userContext);\r\n\r\n const request: OvdfAPIRequest = {\r\n sessionId: sessionId || '',\r\n eventType: eventType,\r\n publisherId: publisher?.id || 0,\r\n publisherName: publisher?.name?.toString() || '',\r\n publisherType: publisher?.publisherType || PublisherType.individual,\r\n idToken: idToken,\r\n user: user,\r\n organization: {\r\n address: publisher?.address,\r\n extendedProperties: publisher?.extendedProperties,\r\n },\r\n ipAddress: (await getIP()) || '',\r\n };\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: JSON.stringify(request),\r\n });\r\n\r\n const responseJson = await response.json();\r\n const reviewStatus = responseJson.data.reviewStatus.toString();\r\n\r\n // Blocking user signup and redirecting user to no-access page. But existing users will be allowed to login\r\n if (reviewStatus === 'reject' && eventType === 'signup') {\r\n Log.write(`TMX review failed for this user ${userContext.email}. Response: ${JSON.stringify(responseJson)}`);\r\n\r\n const noAccessPageRoute = encodeURI(window.location.protocol + '//' + window.location.host + '/no-access');\r\n window.location.replace(noAccessPageRoute);\r\n }\r\n\r\n Log.debug(`OneVet review for user: <${userContext.email}>, trying to <${eventType}> resulted as: <${reviewStatus}>`);\r\n Log.debug('OVDF response: ' + JSON.stringify(responseJson));\r\n\r\n sessionStorage.setItem('review_status', reviewStatus);\r\n return reviewStatus;\r\n\r\n // TODO: handle unknown_session scenario\r\n } catch (err) {\r\n const error = `Session query API failed for ${url}. Errors: ${JSON.stringify(err)}`;\r\n sessionStorage.setItem('review_status', 'API failed');\r\n\r\n Log.error(error);\r\n return 'pass';\r\n }\r\n } else {\r\n Log.error('Could not fetch OVDF ReviewStatus: userContext/idToken is null or session id is missing');\r\n return 'pass';\r\n }\r\n}\r\n\r\nexport async function fetchOneVetCodeVerificationStatus(\r\n publisherId: string,\r\n requestBody: VerifyCodeStatusRequest\r\n): Promise<{ data: VerifyCodeStatusResponse }> {\r\n const url = `${uiConfig.getApiBaseAddress()}/entityEvaluation/publishers/${publisherId}/tokenVerification/checkIfVerified`;\r\n\r\n const headers = await buildRequestHeadersWithAuthToken(url);\r\n\r\n let response: Response;\r\n try {\r\n response = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: JSON.stringify(requestBody),\r\n });\r\n if (!response.ok) {\r\n return handleApiErrors<{ data: VerifyCodeStatusResponse }>(response, url);\r\n }\r\n\r\n const responseJson = await response.json();\r\n if (responseJson) {\r\n return responseJson;\r\n }\r\n return Promise.resolve({} as { data: VerifyCodeStatusResponse });\r\n } catch (err) {\r\n if (err.name === 'AbortError') {\r\n return Promise.resolve({} as { data: VerifyCodeStatusResponse });\r\n }\r\n const error = `getReportData operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport function addThreatMetrixScripts() {\r\n const tmScriptId = 'tmScript';\r\n const tmNoScriptId = 'tmNoScript';\r\n const tmScript = document.getElementById(tmScriptId);\r\n const tmNoScript = document.getElementById(tmNoScriptId);\r\n\r\n const currentTimestamp = new Date().getTime();\r\n const sessionId = sessionStorage.getItem('session_id') || generateGuid() + currentTimestamp;\r\n const orgId = process.env.REACT_APP_ENV === 'production' ? 'y6jn8c31' : 'w0rnzpxd';\r\n const srcUrl = 'https://vlscppe.microsoft.com/fp/tags.js?org_id=' + orgId + '&session_id=' + sessionId;\r\n\r\n if (!tmScript) {\r\n const script = document.createElement('script');\r\n\r\n script.id = tmScriptId;\r\n script.src = srcUrl;\r\n\r\n sessionStorage.setItem('session_id', sessionId);\r\n document.head.appendChild(script);\r\n }\r\n\r\n if (!tmNoScript) {\r\n const noScript = document.createElement('noscript');\r\n const iframe = document.createElement('iframe');\r\n\r\n iframe.setAttribute('aria-hidden', 'true');\r\n iframe.setAttribute('style', 'width: 100px; height: 100px; border: 0; position: absolute; top: -5000px;');\r\n iframe.src = srcUrl;\r\n\r\n noScript.id = tmNoScriptId;\r\n noScript.appendChild(iframe);\r\n document.body.appendChild(noScript);\r\n }\r\n}\r\n\r\nexport async function getIP() {\r\n const ipResponse = await fetch('https://api.ipify.org?format=json')\r\n .then((response) => response.json())\r\n .catch(() => console.log('IP fetch failed'));\r\n\r\n return ipResponse?.ip;\r\n}\r\n","import { FontWeights, ITheme, getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { TagSize } from '.';\r\nimport { IPubCenterFonts, IPubcenterTheme } from '../../../theme';\r\nimport { ICommonStyleProps } from '../../types';\r\n\r\ntype StyleProperties = 'success' | 'pending' | 'fail' | 'widthFit';\r\n\r\ntype TabStyles = Record<StyleProperties, string>;\r\n\r\nexport interface ITagStyleProps extends ICommonStyleProps {\r\n theme: ITheme;\r\n size?: TagSize;\r\n hoverAble?: boolean;\r\n}\r\n\r\nexport const getStyles = (props: ITagStyleProps): TabStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { spacing, palette } = theme;\r\n const fonts = theme.fonts as IPubCenterFonts;\r\n\r\n const LARGE_SIZE = fonts.size14.fontSize;\r\n const MEDIUM_SIZE = fonts.size12.fontSize;\r\n const SMALL_SIZE = fonts.size10.fontSize;\r\n\r\n const SizeMapper = {\r\n 0: LARGE_SIZE,\r\n 1: MEDIUM_SIZE,\r\n 2: SMALL_SIZE,\r\n };\r\n\r\n const statusIdentifier = {\r\n display: 'flex',\r\n gap: spacing.size4,\r\n width: 'fit-content',\r\n borderRadius: spacing.size4,\r\n padding: `${spacing.size2} ${spacing.size6}`,\r\n fontSize: SizeMapper[props.size || 1],\r\n cursor: props.hoverAble ? 'pointer' : 'default',\r\n fontWeight: FontWeights.semibold,\r\n };\r\n\r\n return mergeStyleSets({\r\n widthFit: {\r\n width: 'fit-content',\r\n },\r\n success: {\r\n backgroundColor: palette.honeydew,\r\n color: palette.deepGreen,\r\n border: `1px solid ${palette.grannySmithApple}`,\r\n ...statusIdentifier,\r\n '&:focus-visible': {\r\n border: `1px solid black`,\r\n },\r\n },\r\n pending: {\r\n backgroundColor: palette.neutralLighter,\r\n color: palette.disabledGray,\r\n border: `1px solid ${palette.grayX11}`,\r\n ...statusIdentifier,\r\n '&:focus-visible': {\r\n border: `1px solid black`,\r\n },\r\n },\r\n fail: {\r\n backgroundColor: palette.lavenderBlush,\r\n color: palette.venetianRed,\r\n border: `1px solid ${palette.paleChestnut}`,\r\n ...statusIdentifier,\r\n '&:focus-visible': {\r\n border: `1px solid black`,\r\n },\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames(props?: ITagStyleProps): TabStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { DirectionalHint, Icon, TooltipHost, getTheme } from '@fluentui/react';\r\nimport { observer } from 'mobx-react-lite';\r\nimport React from 'react';\r\nimport { CellInfoCallout } from '../../layout/GridPageV2/components/CellInfoCallout';\r\nimport { getClassNames } from './styles';\r\n\r\nexport enum TagType {\r\n Success = 'success',\r\n Pending = 'pending',\r\n Fail = 'fail',\r\n}\r\n\r\nexport enum TagSize {\r\n Large,\r\n Medium,\r\n Small,\r\n}\r\n\r\nexport interface ITagCalloutProps {\r\n placement: DirectionalHint;\r\n calloutContent: JSX.Element | null;\r\n}\r\n\r\nexport interface ITagProps {\r\n status: TagType;\r\n size?: TagSize;\r\n text: string;\r\n tooltipContent?: string;\r\n icon?: string;\r\n calloutProps?: ITagCalloutProps;\r\n}\r\n\r\nexport const Tag = observer(({ text, size = 1, tooltipContent, status, icon, calloutProps }: ITagProps) => {\r\n const classNames = getClassNames({\r\n theme: getTheme(),\r\n size: size,\r\n hoverAble: tooltipContent !== undefined || calloutProps !== undefined,\r\n });\r\n const toolTipId = 'status';\r\n\r\n if (status === undefined) {\r\n return null;\r\n }\r\n\r\n const getTagStyle = () => classNames[status.toString()];\r\n\r\n const renderTag = () => {\r\n return (\r\n <div aria-describedby={toolTipId} className={getTagStyle()}>\r\n <span>{text}</span>\r\n {icon !== undefined && <Icon iconName={icon} />}\r\n </div>\r\n );\r\n };\r\n\r\n const renderTagWithTooltip = () => {\r\n if (tooltipContent === undefined) {\r\n return renderTag();\r\n }\r\n\r\n return (\r\n <div className={classNames.widthFit}>\r\n <TooltipHost\r\n content={tooltipContent}\r\n id={toolTipId}\r\n directionalHint={12}\r\n aria-describedby={tooltipContent}\r\n aria-label={tooltipContent}\r\n >\r\n {renderTag()}\r\n </TooltipHost>\r\n </div>\r\n );\r\n };\r\n\r\n const renderTagWithCallout = () => {\r\n if (calloutProps === undefined || calloutProps.calloutContent === null) {\r\n return renderTag();\r\n }\r\n\r\n return (\r\n <CellInfoCallout placement={calloutProps?.placement} calloutContent={calloutProps?.calloutContent}>\r\n {renderTag()}\r\n </CellInfoCallout>\r\n );\r\n };\r\n\r\n return tooltipContent ? renderTagWithTooltip() : calloutProps ? renderTagWithCallout() : renderTag();\r\n});\r\n\r\nexport default Tag;\r\n","import { Environment } from \"./Environment\";\r\n\r\nexport class LoggingUtils {\r\n public static getEnvironment(): string {\r\n const environment = process.env.REACT_APP_ENV;\r\n if (environment !== undefined) {\r\n return environment;\r\n }\r\n return Environment.TEST;\r\n }\r\n}\r\n","export enum TokenType {\r\n SessionGuid = 1,\r\n PubCenterAADToken = 4,\r\n}\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onLoadingChanged = action('onLoadingChanged', (loading: boolean) => ({ loading }));\r\nexport const onLoadingSetting = action('onLoadingSetting', (waiting: boolean) => ({ waiting }));\r\nexport const onLoadingWaiting = action('onLoadingWaiting', (waiting: boolean) => ({ waiting }));\r\n","import { Model } from './Model';\r\n\r\nexport class UpdateClarityProject extends Model {\r\n public apiPath = undefined;\r\n public className = 'updateClarityProject';\r\n public propertyId?: string;\r\n // NOTE: this should be reduced to one attribute for both cases\r\n // For non Tython users\r\n public clarityProjectId?: string;\r\n // For Tython users\r\n public clarityProjectIdForTython?: string;\r\n public enableMicrosoftClarity?: boolean;\r\n}\r\n","import { getAppStore, getCurrentPublisher, getEntity, User } from '../../../../../@data';\r\n\r\nexport async function fetchUserDetails(user: User): Promise<User> {\r\n const { userContext } = getAppStore();\r\n const publisher = getCurrentPublisher();\r\n if (!publisher) {\r\n throw new Error('No publisher found');\r\n }\r\n\r\n const userDetails = await getEntity<User>([publisher, user], userContext);\r\n return userDetails;\r\n}\r\n","export enum VerificationCodeGenerationErrorCodes {\r\n INVALID_INPUT = 'InvalidInput',\r\n CODE_GENERATION_LIMIT_REACHED = 'CodeGenerationLimitReached',\r\n REQUESTED_CODE_VERIFICATION_RESULT_NOT_FOUND_FOR_PUBLISHER = 'RequestedCodeVerificationResultNotFoundForPublisher',\r\n}\r\n","export enum PaginationDisplay {\r\n Dotted,\r\n Navigation,\r\n}","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n noPublisherOrAccountSelected: {\r\n id: 'admanagement.noPublisherOrAccountSelected',\r\n defaultMessage: 'Select a publisher and account.',\r\n },\r\n servingStatusPending: {\r\n id: 'servingStatus.pending',\r\n defaultMessage: 'Pending',\r\n },\r\n servingStatusNotServing: {\r\n id: 'servingStatus.notServing',\r\n defaultMessage: 'Rejected',\r\n },\r\n servingStatusServing: {\r\n id: 'servingStatus.serving',\r\n defaultMessage: 'Approved',\r\n },\r\n servingStatusOnHold: {\r\n id: 'servingStatus.onHold',\r\n defaultMessage: 'On hold',\r\n },\r\n});\r\n","import {\r\n BaseComponent,\r\n BasePicker,\r\n classNamesFunction,\r\n getId,\r\n IBasePickerProps,\r\n Icon,\r\n IProcessedStyleSet,\r\n ITag,\r\n Label,\r\n} from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { isButtonPressKey } from '../../utils/AccessibilityUtils';\r\nimport {\r\n IListItem,\r\n IListPickerItemProps,\r\n IListPickerProps,\r\n IListPickerState,\r\n IListPickerStyleProps,\r\n IListPickerStyles,\r\n} from './ListPicker.types';\r\n\r\nconst getClassNames = classNamesFunction<IListPickerStyleProps, IListPickerStyles>();\r\nlet classNames: IProcessedStyleSet<IListPickerStyles>;\r\n\r\nclass ListPickerLegacy extends BasePicker<IListItem, IBasePickerProps<IListItem>> {\r\n protected static defaultProps: Partial<IBasePickerProps<IListItem>> = {\r\n resolveDelay: 300,\r\n itemLimit: 1,\r\n\r\n onRenderItem: (props: IListPickerItemProps) => (\r\n <div className={classNames.selectedInput} key={props.item.key}>\r\n <span className={classNames.selectedText} role=\"listitem\">\r\n {props.item.name}\r\n </span>\r\n\r\n <span\r\n className={classNames.selectedClose}\r\n role=\"button\"\r\n tabIndex={0}\r\n onClick={props.onRemoveItem}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key) && props.onRemoveItem && props.onRemoveItem()}\r\n aria-label={props.removeButtonAriaLabel}\r\n >\r\n <Icon iconName=\"Cancel\" />\r\n </span>\r\n </div>\r\n ),\r\n onRenderSuggestionsItem: (props: ITag) => (\r\n <div className={classNames.item} key={props.key}>\r\n {props.name + ' (ID: ' + props.key + ')'}\r\n </div>\r\n ),\r\n };\r\n}\r\n\r\nexport class ListPickerBase extends BaseComponent<IListPickerProps, IListPickerState> {\r\n private _id: string;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this._id = props.id || getId('ListPicker');\r\n\r\n this.state = {\r\n selectedItems: this.props.selectedItem ? [this.props.selectedItem] : undefined,\r\n pickerIsDisabled: this.props.disabled,\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: IListPickerProps, prevState: IListPickerState) {\r\n if (this.props.selectedItem === prevProps.selectedItem) {\r\n return;\r\n }\r\n\r\n this.setState({\r\n selectedItems: this.props.selectedItem ? [this.props.selectedItem] : [],\r\n });\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { styles, theme, onRenderLabel = this._onRenderLabel } = this.props;\r\n classNames = getClassNames(styles, { theme: theme!, closeButtonIsDisabled: this.state.pickerIsDisabled });\r\n\r\n const basePickerProps: IBasePickerProps<IListItem> = {\r\n onResolveSuggestions: (filter, selectedItems) => {\r\n let selectedItem;\r\n if (selectedItems && selectedItems.length) {\r\n selectedItem = selectedItems[0];\r\n }\r\n\r\n return this.props.onResolveSuggestions(filter, selectedItem);\r\n },\r\n inputProps: {\r\n placeholder: this.props.inputPlaceholder,\r\n },\r\n pickerSuggestionsProps: {\r\n noResultsFoundText: this.props.noResultsFoundText,\r\n },\r\n selectedItems: this.state.selectedItems,\r\n getTextFromItem: this.props.getTextFromItem,\r\n disabled: this.props.disabled,\r\n onChange: (selectedItems: IListItem[]) => {\r\n this.setState({\r\n selectedItems: selectedItems,\r\n });\r\n\r\n if (this.props.onChange) {\r\n this.props.onChange(selectedItems.length ? selectedItems[0] : undefined);\r\n }\r\n },\r\n pickerCalloutProps: {\r\n calloutMaxHeight: 320,\r\n },\r\n removeButtonAriaLabel: this.props.removeButtonAriaLabel,\r\n };\r\n\r\n return (\r\n <div className={classNames.root}>\r\n {onRenderLabel(this.props, this._onRenderLabel)}\r\n\r\n <ListPickerLegacy className={classNames.basePicker} {...basePickerProps} />\r\n </div>\r\n );\r\n }\r\n\r\n private _onRenderLabel = (props: IListPickerProps): JSX.Element | null => {\r\n const { label, required } = props;\r\n if (label) {\r\n return (\r\n <Label className={classNames.label} required={required} htmlFor={this._id}>\r\n {props.label}\r\n </Label>\r\n );\r\n }\r\n return null;\r\n };\r\n}\r\n","import { BreakPoints, IPubcenterSpacing } from '../../../theme';\r\nimport { IListPickerStyleProps, IListPickerStyles } from './ListPicker.types';\r\n\r\nconst { ResponsiveMedium } = BreakPoints;\r\n\r\nexport const getStyles = (props: IListPickerStyleProps): IListPickerStyles => {\r\n const { theme, closeButtonIsDisabled } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return {\r\n root: [\r\n 'ms-ListPicker',\r\n {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n },\r\n ],\r\n basePicker: {\r\n backgroundColor: 'transparent',\r\n selectors: {\r\n '.ms-BasePicker-text': {\r\n height: 46,\r\n position: 'relative',\r\n border: 0,\r\n borderBottom: `1px solid`,\r\n borderColor: theme.palette.neutralQuaternary,\r\n width: 320,\r\n selectors: {\r\n ':hover': {\r\n borderColor: theme.palette.neutralQuaternary,\r\n },\r\n },\r\n [ResponsiveMedium]: {\r\n width: 'calc(28vw - 60px)',\r\n },\r\n },\r\n '.ms-BasePicker-input': {\r\n backgroundColor: theme.palette.neutralLight,\r\n height: '100%',\r\n border: 0,\r\n borderBottom: `1px solid`,\r\n borderColor: theme.palette.neutralQuaternary,\r\n selectors: {\r\n ':hover': {\r\n borderColor: theme.palette.themePrimary,\r\n backgroundColor: theme.palette.white,\r\n },\r\n ':focus': {\r\n backgroundColor: theme.palette.white,\r\n borderColor: theme.palette.themePrimary,\r\n },\r\n },\r\n },\r\n '.ms-Callout-container': {\r\n minWidth: 320,\r\n width: 320,\r\n },\r\n },\r\n },\r\n item: {\r\n padding: theme.spacing.s1,\r\n },\r\n selectedInput: {\r\n position: 'relative',\r\n right: 0,\r\n top: 0,\r\n bottom: 0,\r\n display: 'flex',\r\n alignItems: 'center',\r\n width: 320,\r\n [ResponsiveMedium]: {\r\n width: 'calc(28vw - 60px)',\r\n },\r\n },\r\n selectedText: {\r\n flex: 1,\r\n paddingRight: spacing.size8,\r\n paddingLeft: spacing.size8,\r\n paddingTop: spacing.size12,\r\n paddingBottom: spacing.size12,\r\n width: 320,\r\n whiteSpace: 'nowrap',\r\n textOverflow: 'ellipsis',\r\n overflow: 'hidden',\r\n },\r\n selectedClose: {\r\n display: closeButtonIsDisabled ? 'none' : 'block',\r\n width: spacing.size44,\r\n textAlign: 'center',\r\n lineHeight: spacing.size44,\r\n cursor: 'pointer',\r\n },\r\n label: {\r\n marginRight: spacing.size8,\r\n paddingBottom: spacing.size12,\r\n paddingTop: spacing.size12,\r\n },\r\n };\r\n};\r\n","import { styled } from '@fluentui/react';\r\nimport { ListPickerBase } from './ListPicker.base';\r\nimport { getStyles } from './ListPicker.styles';\r\nimport { IListPickerProps, IListPickerStyleProps, IListPickerStyles } from './ListPicker.types';\r\n\r\n// Use Fabric Base guidelines since this might be contributed back to Fabric.\r\nexport const ListPicker = styled<IListPickerProps, IListPickerStyleProps, IListPickerStyles>(ListPickerBase, getStyles, undefined, {\r\n scope: 'ListPicker',\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n publisherPlaceholder: {\r\n id: 'picker.publisherPlaceholder',\r\n defaultMessage: 'Search for publisher name or ID'\r\n },\r\n publisherNotFound: {\r\n id: 'picker.publisherNotFound',\r\n defaultMessage: 'No publishers found'\r\n },\r\n accountPlaceholder: {\r\n id: 'picker.accountPlaceholder',\r\n defaultMessage: 'Select publisher first and then account'\r\n },\r\n accountNotFound: {\r\n id: 'picker.accountNotFound',\r\n defaultMessage: 'No accounts found'\r\n },\r\n allAccountsOption: {\r\n id: 'allAccountsOption',\r\n defaultMessage: 'All accounts',\r\n },\r\n listPickerRemoveAriaLabel: {\r\n id: 'listPickerRemoveAriaLabel',\r\n defaultMessage: 'Clear selection'\r\n },\r\n publisherAccountPickerAriaLabel: {\r\n id: 'publisherAccountPickerAriaLabel',\r\n defaultMessage: 'Publisher account picker'\r\n }\r\n});\r\n","import { IDropdownStyles } from '@fluentui/react';\r\nimport { BreakPoints, IPubcenterSpacing } from '../../../theme';\r\nimport { IPublisherAccountPickerStyleProps, IPublisherAccountPickerStyles } from './PublisherAccountPicker.types';\r\n\r\nconst { ResponsiveMedium, ResponsiveSmall } = BreakPoints;\r\n\r\nexport const getStyles = (props: IPublisherAccountPickerStyleProps): IPublisherAccountPickerStyles => {\r\n const { theme, isAccountDisabled } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return {\r\n root: [\r\n 'ms-PublisherAccountPicker',\r\n {\r\n display: 'flex',\r\n paddingLeft: spacing.size32,\r\n backgroundColor: theme.palette.neutralLight,\r\n height: 47,\r\n // minWidth: 1100, // This causes horizontal scrollbar to appear in smaller desktop screens\r\n [ResponsiveSmall]: {\r\n flexDirection: 'column',\r\n height: 96,\r\n paddingLeft: 0,\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n },\r\n ],\r\n listGroup: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginRight: theme.spacing.l1,\r\n width: '38vw',\r\n [ResponsiveMedium]: {\r\n width: '28vw',\r\n },\r\n [ResponsiveSmall]: {\r\n marginRight: 0,\r\n width: '100vw',\r\n alignItems: 'center',\r\n },\r\n },\r\n publisherPicker: ['ms-PublisherPicker'],\r\n accountPicker: ['ms-AccountPicker'],\r\n subComponentStyles: {\r\n dropdown: ({\r\n root: [\r\n {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n height: 46,\r\n width: 'auto',\r\n color: theme.palette.neutralQuaternary,\r\n },\r\n ],\r\n dropdown: [\r\n {\r\n selectors: {\r\n '&:focus $title': {\r\n borderColor: theme.palette.neutralQuaternary,\r\n },\r\n '&:hover $ms-Dropdown-title': {\r\n borderColor: theme.palette.neutralQuaternary,\r\n backgroundColor: 'transparent',\r\n },\r\n },\r\n },\r\n !isAccountDisabled && {\r\n selectors: {\r\n '&:hover $title': {\r\n borderColor: theme.palette.themePrimary,\r\n backgroundColor: theme.palette.white,\r\n },\r\n '&:focus $title': {\r\n borderColor: theme.palette.themePrimary,\r\n backgroundColor: theme.palette.white,\r\n },\r\n },\r\n },\r\n ],\r\n label: [\r\n {\r\n marginRight: spacing.size8,\r\n paddingBottom: spacing.size12,\r\n paddingTop: spacing.size12,\r\n },\r\n ],\r\n title: [\r\n {\r\n flex: 1,\r\n backgroundColor: 'transparent',\r\n width: 320,\r\n height: '100%',\r\n border: 0,\r\n borderBottom: `1px solid ${theme.palette.neutralQuaternary}`,\r\n paddingBottom: 13,\r\n paddingTop: spacing.size8,\r\n },\r\n ],\r\n caretDownWrapper: [\r\n {\r\n height: 44,\r\n width: 44,\r\n textAlign: 'center',\r\n lineHeight: 44,\r\n cursor: 'pointer',\r\n },\r\n ],\r\n } as unknown) as IDropdownStyles,\r\n },\r\n };\r\n};\r\n","import { classNamesFunction, css, Dropdown, DropdownMenuItemType, getTheme, IDropdownOption, MessageBarType } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport { Log } from '../../../logging/src';\r\nimport {\r\n Account,\r\n getAppStore,\r\n getEntity,\r\n listEntity,\r\n onLoadingChanged,\r\n onNotificationChanged,\r\n onSetFirstPartyBoost,\r\n Publisher,\r\n PublisherSearch,\r\n} from '../../@data';\r\nimport { default as appMessages, default as AppMessages } from '../../App.messages';\r\nimport { IListItem, ListPicker } from '../../components/ListPicker';\r\nimport { APP_NAME_PUBCENTER, NO_VALUE_PLACEHOLDER } from '../../constants/AppConstants';\r\nimport { delay } from '../../utils/DelayUtils';\r\nimport messages from './PublisherAccountPicker.messages';\r\nimport { getStyles } from './PublisherAccountPicker.styles';\r\nimport {\r\n IPublisherAccountPickerProps,\r\n IPublisherAccountPickerState,\r\n IPublisherAccountPickerStyleProps,\r\n IPublisherAccountPickerStyles,\r\n} from './PublisherAccountPicker.types';\r\n\r\nconst getClassNames = classNamesFunction<IPublisherAccountPickerStyleProps, IPublisherAccountPickerStyles>();\r\nconst publisherSearchApiVersion = '1.3';\r\n\r\nexport const PublisherAccountPicker = injectIntl(\r\n class extends React.Component<IPublisherAccountPickerProps, IPublisherAccountPickerState> {\r\n private _accountsForCurrentPublisher: IDropdownOption[] = [];\r\n private _isComponentMounted: boolean;\r\n private defaultSelectedAccount: Account | undefined = undefined;\r\n\r\n constructor(props: IPublisherAccountPickerProps) {\r\n super(props);\r\n\r\n this.state = {\r\n publisher: this.props.publisher,\r\n account: this.props.account,\r\n isAccountSelectionDisabled: this.props.isAccountSelectionDisabled,\r\n isPublisherSelectionDisabled: this.props.isPublisherSelectionDisabled,\r\n };\r\n }\r\n\r\n public async componentDidUpdate(prevProps: IPublisherAccountPickerProps) {\r\n if (this.props.publisher !== prevProps.publisher || this.props.account !== prevProps.account) {\r\n if (this.props.publisher) {\r\n await this._updateAccountsCache(this.props.publisher);\r\n } else {\r\n this._accountsForCurrentPublisher = [];\r\n this.setState({ publisher: undefined, account: undefined });\r\n }\r\n }\r\n\r\n const { publisher, account } = this.props;\r\n const urlPath = this.props.location.pathname;\r\n if (publisher && account) {\r\n if (account.id === 0 && urlPath && (urlPath.includes('channel') || urlPath.includes('adfilter'))) {\r\n this._updateAccountsCache(publisher, true);\r\n }\r\n this._handleAllAccountsOptions();\r\n }\r\n }\r\n\r\n public async componentDidMount() {\r\n this._isComponentMounted = true;\r\n if (this.state.publisher) {\r\n if (this.props.isAccountHidden) {\r\n // this is a hack for now, the global search routing is incomplete, since in AdManagement the below await _updateAccountsCache\r\n // prevents the route to be changed on OnChange action\r\n await delay(1000);\r\n if (this._isComponentMounted) {\r\n this.props.onChange(this.state.publisher, undefined);\r\n }\r\n } else {\r\n await this._updateAccountsCache(this.state.publisher);\r\n }\r\n }\r\n }\r\n\r\n public async componentWillUnmount() {\r\n this._isComponentMounted = false;\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { formatMessage } = this.props.intl;\r\n const classNames = getClassNames(getStyles, {\r\n theme: getTheme(),\r\n isAccountDisabled: !this.state.publisher || this.state.isAccountSelectionDisabled,\r\n isPublisherDisabled: this.state.isPublisherSelectionDisabled,\r\n });\r\n const selectedPublisherItem =\r\n this.state.publisher && this.state.publisher.name\r\n ? {\r\n key: String(this.state.publisher.id),\r\n name: String(this.state.publisher.name),\r\n }\r\n : undefined;\r\n const selectedAccountItem = this.state.account && this.state.account.name ? String(this.state.account.id) : undefined;\r\n this._handleAllAccountsOptions();\r\n\r\n return (\r\n <div className={classNames.root} role=\"complementary\" aria-label={formatMessage(messages.publisherAccountPickerAriaLabel)}>\r\n <div className={css(classNames.listGroup, classNames.publisherPicker)}>\r\n <ListPicker\r\n label={formatMessage(appMessages.publisher)}\r\n selectedItem={selectedPublisherItem}\r\n onResolveSuggestions={this._onPublishersResolveSuggestions}\r\n getTextFromItem={(item: IListItem) => item.name}\r\n inputPlaceholder={formatMessage(messages.publisherPlaceholder)}\r\n noResultsFoundText={formatMessage(messages.publisherNotFound)}\r\n removeButtonAriaLabel={formatMessage(messages.listPickerRemoveAriaLabel)}\r\n onChange={this._onPublisherChanged}\r\n disabled={this.state.isPublisherSelectionDisabled}\r\n />\r\n </div>\r\n {!this.props.isAccountHidden && (\r\n <div className={css(classNames.listGroup, classNames.accountPicker)}>\r\n <Dropdown\r\n id={'accountPicker'}\r\n placeholder={formatMessage(messages.accountPlaceholder)}\r\n styles={classNames.subComponentStyles.dropdown}\r\n label={formatMessage(appMessages.account)}\r\n options={this._accountsForCurrentPublisher}\r\n selectedKey={selectedAccountItem}\r\n onChange={this._onAccountChanged}\r\n disabled={!this.state.publisher || this.state.isAccountSelectionDisabled}\r\n calloutProps={{ calloutMaxHeight: 300 }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n private _onPublisherChanged = async (item?: IListItem) => {\r\n if (!item) {\r\n this.setState({\r\n publisher: undefined,\r\n account: undefined,\r\n });\r\n\r\n this.props.onChange(undefined, undefined);\r\n return;\r\n }\r\n\r\n // Query the db for the full publisher.\r\n const publisher = new Publisher(parseInt(item.key, 10));\r\n publisher.name = item.name;\r\n\r\n if (this.state.isAccountSelectionDisabled) {\r\n this.props.onChange(publisher, undefined);\r\n }\r\n // Update current accounts cache:\r\n await this._updateAccountsCache(publisher);\r\n };\r\n\r\n private async _updateAccountsCache(publisher: Publisher, isUpdateAccount?: boolean) {\r\n onLoadingChanged(true);\r\n const userContext = getAppStore().userContext;\r\n try {\r\n // If isUpdateAccount is true, then change account selected to defaultSelectedAccount of the Publisher\r\n if (this.defaultSelectedAccount && isUpdateAccount) {\r\n const account = new Account(this.defaultSelectedAccount.id);\r\n account.name = this.defaultSelectedAccount.name;\r\n\r\n this.setState({ publisher: publisher, account: account });\r\n this.props.onChange(publisher, account);\r\n onLoadingChanged(false);\r\n return;\r\n }\r\n\r\n // If user is changing account of the same publisher, to prevent unneccesary API call and reduce page load time\r\n if (\r\n !this.state.isAccountSelectionDisabled &&\r\n this._accountsForCurrentPublisher.length > 0 &&\r\n this.state.account &&\r\n this._isComponentMounted &&\r\n !isUpdateAccount\r\n ) {\r\n this.setState({ publisher: publisher, account: this.state.account });\r\n this.props.onChange(publisher, this.state.account);\r\n onLoadingChanged(false);\r\n return;\r\n }\r\n\r\n // Prevent unnecessary API call and reduce load time when the Account Picker (at the top) is hidden. For example,\r\n // this happens when on the AdQuality page.\r\n if (this.props.isAccountHidden) {\r\n this.setState({ publisher: publisher, account: this.state.account });\r\n this.props.onChange(publisher, this.state.account);\r\n onLoadingChanged(false);\r\n return;\r\n }\r\n\r\n let accounts = await listEntity([publisher], userContext, Account);\r\n accounts = accounts.sort((a, b) => (String(a.name)!.toLowerCase() < String(b.name)!.toLowerCase() ? -1 : 1));\r\n\r\n if (this._isComponentMounted && (!accounts || accounts.length === 0)) {\r\n this._accountsForCurrentPublisher = [];\r\n this.setState({ publisher: publisher, account: undefined });\r\n this.props.onChange(publisher, undefined);\r\n onLoadingChanged(false);\r\n return;\r\n }\r\n\r\n this._accountsForCurrentPublisher = accounts.map((p) => ({\r\n key: String(p.id),\r\n text: String(p.name!),\r\n }));\r\n\r\n this._accountsForCurrentPublisher.unshift({ key: 'divider', text: NO_VALUE_PLACEHOLDER, itemType: DropdownMenuItemType.Divider });\r\n this._accountsForCurrentPublisher.unshift({\r\n key: String('0'),\r\n text: this.props.intl.formatMessage(messages.allAccountsOption),\r\n } as IDropdownOption);\r\n\r\n if (!this.state.isAccountSelectionDisabled) {\r\n if (this.state.account && this._isComponentMounted && !isUpdateAccount) {\r\n this.setState({ publisher: publisher, account: this.state.account });\r\n this.props.onChange(publisher, this.state.account);\r\n } else {\r\n const publisherFullInfo = await getEntity<Publisher>([publisher], userContext);\r\n onSetFirstPartyBoost(publisherFullInfo.publisherTier);\r\n publisher.publisherTier = publisherFullInfo.publisherTier;\r\n\r\n if (publisherFullInfo && publisherFullInfo.defaultAccountId) {\r\n this.defaultSelectedAccount = accounts.find((acc) => acc.id === publisherFullInfo.defaultAccountId);\r\n } else {\r\n if (accounts) {\r\n this.defaultSelectedAccount = accounts[0];\r\n }\r\n }\r\n\r\n if (this.defaultSelectedAccount && this._isComponentMounted) {\r\n const account = new Account(this.defaultSelectedAccount.id);\r\n account.name = this.defaultSelectedAccount.name;\r\n\r\n this.setState({ publisher: publisher, account: account });\r\n this.props.onChange(publisher, account);\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n onNotificationChanged({\r\n text: this.props.intl.formatMessage(AppMessages.customerInvalid, { appName: APP_NAME_PUBCENTER }),\r\n messageBarType: MessageBarType.error,\r\n });\r\n }\r\n\r\n onLoadingChanged(false);\r\n }\r\n\r\n private _onPublishersResolveSuggestions = async (filter: string): Promise<IListItem[]> => {\r\n if (filter.trim().length === 0) {\r\n return [];\r\n }\r\n const userContext = getAppStore().userContext!;\r\n\r\n try {\r\n const publishers =\r\n (await listEntity(\r\n [],\r\n userContext,\r\n PublisherSearch,\r\n new URLSearchParams([\r\n ['type', 'publishername'],\r\n ['value', filter],\r\n ['publisherstatus', 'active'],\r\n ]),\r\n publisherSearchApiVersion\r\n )) || [];\r\n\r\n if (Number(filter)) {\r\n const publisher = new Publisher(parseInt(filter, 10));\r\n const publisherAsync = await getEntity([publisher], userContext);\r\n\r\n if (publisherAsync) {\r\n const newPublisher = new PublisherSearch();\r\n newPublisher.publisherId = publisherAsync.id!;\r\n newPublisher.publisherName = String(publisherAsync.name);\r\n publishers.push(newPublisher);\r\n }\r\n }\r\n\r\n return publishers.map((p) => ({\r\n key: String(p.publisherId),\r\n name: p.publisherName!,\r\n }));\r\n } catch (e) {\r\n Log.error(`Fetching publisher suggestions failed with error: ${e}`);\r\n }\r\n\r\n return [];\r\n };\r\n\r\n private _onAccountChanged = (event: React.FormEvent<HTMLDivElement>, option?: IDropdownOption): void => {\r\n if (!option) {\r\n this.setState({\r\n account: undefined,\r\n });\r\n\r\n this.props.onChange(this.state.publisher, undefined);\r\n return;\r\n }\r\n\r\n // Query the db for the full account.\r\n const account = new Account(parseInt(option.key.toString(), 10));\r\n account.name = option.text;\r\n\r\n this.setState({ account });\r\n\r\n this.props.onChange(this.state.publisher, account);\r\n };\r\n\r\n private _handleAllAccountsOptions = () => {\r\n const urlPath = this.props.location.pathname;\r\n const accounts = this._accountsForCurrentPublisher;\r\n\r\n if (urlPath && urlPath.includes('adunit') && accounts.length > 0 && accounts[0].key === '0') {\r\n accounts[0].disabled = false;\r\n }\r\n\r\n if (urlPath && (urlPath.includes('channel') || urlPath.includes('adfilter')) && accounts.length > 0 && accounts[0].key === '0') {\r\n accounts[0].disabled = true;\r\n }\r\n this._accountsForCurrentPublisher = accounts;\r\n };\r\n }\r\n);\r\n","export function delay(ms: number) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n","import { FontWeights, getTheme, ITheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../../../../../theme';\r\nimport { flexWithCenter, noPointerEvents } from '../../../../../../utils/GlobalStyleUtils';\r\n\r\ninterface IPaginationStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\ntype StyleProperties = 'containerStyle' | 'itemStyle' | 'dotsStyle' | 'selectedItemStyle' | 'disabledItemStyle';\r\nexport type PaginationStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: IPaginationStyleProps): PaginationStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { spacing, palette } = theme;\r\n\r\n const buttonStyles = {\r\n ...flexWithCenter,\r\n width: 32,\r\n height: 32,\r\n minWidth: 32,\r\n margin: spacing.size4,\r\n fontWeight: FontWeights.semibold,\r\n };\r\n\r\n return mergeStyleSets({\r\n containerStyle: {\r\n ...flexWithCenter,\r\n margin: spacing.size16,\r\n },\r\n itemStyle: {\r\n ...buttonStyles,\r\n ':hover': {\r\n background: palette.neutralLighter,\r\n },\r\n },\r\n dotsStyle: {\r\n ...buttonStyles,\r\n ...noPointerEvents,\r\n },\r\n selectedItemStyle: {\r\n background: palette.themePrimary,\r\n color: palette.white,\r\n ...noPointerEvents,\r\n },\r\n disabledItemStyle: {\r\n opacity: 0.5,\r\n ...noPointerEvents,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): PaginationStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { useMemo } from 'react';\r\n\r\nexport const DOTS = '...';\r\nexport const DEFAULT_SIBLING_COUNT = 1;\r\n\r\nexport interface IUsePaginationProps {\r\n currentPageNumber: number;\r\n pageSize?: number;\r\n totalPageCount?: number;\r\n totalItemCount?: number;\r\n siblingCount?: number;\r\n}\r\n\r\nconst getRange = (start: number, end: number) => {\r\n const length = end - start + 1;\r\n return Array.from({ length }, (_, index) => index + start);\r\n};\r\n\r\nexport const useDottedPagination = ({\r\n totalPageCount,\r\n totalItemCount,\r\n pageSize,\r\n siblingCount = DEFAULT_SIBLING_COUNT,\r\n currentPageNumber,\r\n}: IUsePaginationProps) => {\r\n const paginationRange = useMemo(() => {\r\n if (!totalPageCount && (!totalItemCount || !pageSize)) {\r\n throw new Error('Either totalPageCount or totalItemCount and pageSize must be provided');\r\n }\r\n\r\n const pageCount = totalPageCount ?? Math.ceil(totalItemCount! / pageSize!);\r\n\r\n // Pages count is determined as siblingCount + firstPage + lastPage + currentPage + 2 * DOTS\r\n const totalPageNumbersDisplayed = siblingCount + 5;\r\n\r\n if (totalPageNumbersDisplayed >= pageCount) {\r\n return getRange(1, pageCount);\r\n }\r\n\r\n const leftSiblingIndex = Math.max(currentPageNumber - siblingCount, 1);\r\n const rightSiblingIndex = Math.min(currentPageNumber + siblingCount, pageCount);\r\n\r\n /*\r\n We do not want to show dots if there is only one position left\r\n after/before the left/right page count as that would lead to a change if our Pagination\r\n component size which we do not want\r\n */\r\n const shouldShowLeftDots = leftSiblingIndex > 2;\r\n const shouldShowRightDots = rightSiblingIndex < pageCount - 2;\r\n\r\n const firstPageIndex = 1;\r\n const lastPageIndex = pageCount;\r\n\r\n if (!shouldShowLeftDots && shouldShowRightDots) {\r\n const leftItemCount = 3 + 2 * siblingCount;\r\n const leftRange = getRange(1, leftItemCount);\r\n\r\n return [...leftRange, DOTS, pageCount];\r\n }\r\n\r\n if (shouldShowLeftDots && !shouldShowRightDots) {\r\n const rightItemCount = 3 + 2 * siblingCount;\r\n const rightRange = getRange(pageCount - rightItemCount + 1, pageCount);\r\n return [firstPageIndex, DOTS, ...rightRange];\r\n }\r\n\r\n if (shouldShowLeftDots && shouldShowRightDots) {\r\n const middleRange = getRange(leftSiblingIndex, rightSiblingIndex);\r\n return [firstPageIndex, DOTS, ...middleRange, DOTS, lastPageIndex];\r\n }\r\n }, [totalItemCount, pageSize, siblingCount, currentPageNumber, totalPageCount]);\r\n\r\n return paginationRange;\r\n};\r\n","import { DefaultButton, IconButton, mergeStyleSets } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { IPaginationProps } from '../../Pagination';\r\nimport { getClassNames } from './DottedPagination.styles';\r\nimport { DOTS, useDottedPagination } from './useDottedPagination';\r\n\r\nexport interface IDottedPaginationProps extends IPaginationProps {}\r\n\r\nexport const DottedPagination = ({\r\n currentPageNumber,\r\n pageSize,\r\n className,\r\n onPageChange,\r\n siblingCount,\r\n totalItemCount,\r\n totalPageCount,\r\n styleProps,\r\n}: IDottedPaginationProps) => {\r\n const paginationRange = useDottedPagination({\r\n currentPageNumber,\r\n totalItemCount,\r\n totalPageCount,\r\n siblingCount,\r\n pageSize,\r\n });\r\n const { containerStyle, itemStyle, dotsStyle, selectedItemStyle, disabledItemStyle } = mergeStyleSets(getClassNames(), styleProps);\r\n\r\n if (!paginationRange) {\r\n return null;\r\n }\r\n\r\n if (currentPageNumber === 0 || paginationRange.length < 2) {\r\n return null;\r\n }\r\n\r\n const lastPage = paginationRange[paginationRange.length - 1];\r\n\r\n const onNext = () => {\r\n onPageChange!(currentPageNumber + 1);\r\n };\r\n\r\n const onPrevious = () => {\r\n onPageChange!(currentPageNumber - 1);\r\n };\r\n\r\n return (\r\n <div className={`${containerStyle} ${className || ''}`}>\r\n <IconButton\r\n id=\"previousPage\"\r\n iconProps={{ iconName: 'ChevronLeftSmall' }}\r\n className={`${itemStyle} ${currentPageNumber === 1 ? disabledItemStyle : ''}`}\r\n onClick={onPrevious}\r\n />\r\n\r\n {paginationRange.map((pageNumber, index) => {\r\n if (pageNumber === DOTS) {\r\n return <span className={dotsStyle}>…</span>;\r\n }\r\n\r\n return (\r\n <DefaultButton\r\n id={`customPage-${index}`}\r\n key={pageNumber}\r\n className={`${itemStyle} ${currentPageNumber === pageNumber ? selectedItemStyle : ''}`}\r\n onClick={() => onPageChange!(pageNumber as number)}\r\n >\r\n {pageNumber}\r\n </DefaultButton>\r\n );\r\n })}\r\n <IconButton\r\n id=\"nextPage\"\r\n iconProps={{ iconName: 'ChevronRightSmall' }}\r\n className={`${itemStyle} ${currentPageNumber === lastPage ? disabledItemStyle : ''}`}\r\n onClick={onNext}\r\n />\r\n </div>\r\n );\r\n};\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n showRows: {\r\n id: 'showRows',\r\n defaultMessage: 'Show rows:',\r\n },\r\n of: {\r\n id: 'of',\r\n defaultMessage: 'of',\r\n },\r\n firstPage: {\r\n id: 'firstPage',\r\n defaultMessage: 'First page',\r\n },\r\n prevPage: {\r\n id: 'prevPage',\r\n defaultMessage: 'Previous page',\r\n },\r\n lastPage: {\r\n id: 'lastPage',\r\n defaultMessage: 'Last page',\r\n },\r\n nextPage: {\r\n id: 'nextPage',\r\n defaultMessage: 'Next page',\r\n },\r\n});\r\n","import { getTheme, ITheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../../../../../theme';\r\nimport { flexWithAlignCenter, flexWithCenter, noPointerEvents } from '../../../../../../utils/GlobalStyleUtils';\r\n\r\ninterface INavigatedPaginationStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\ntype StyleProperties = 'containerStyle' | 'itemStyle' | 'dropdownStyle' | 'disabledItemStyle';\r\nexport type NavigatedPaginationStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: INavigatedPaginationStyleProps): NavigatedPaginationStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { spacing, palette } = theme;\r\n\r\n const buttonStyles = {\r\n ...flexWithCenter,\r\n width: 32,\r\n height: 32,\r\n minWidth: 32,\r\n margin: spacing.size4,\r\n color: palette.black,\r\n };\r\n\r\n return mergeStyleSets({\r\n containerStyle: {\r\n ...flexWithAlignCenter,\r\n },\r\n itemStyle: {\r\n ...buttonStyles,\r\n ':hover': {\r\n backgroundColor: palette.neutralLighter,\r\n color: palette.blackTranslucent40,\r\n },\r\n },\r\n dropdownStyle: {\r\n width: 80,\r\n margin: `0 ${spacing.size12}`,\r\n },\r\n disabledItemStyle: {\r\n opacity: 0.5,\r\n color: palette.blackTranslucent40,\r\n ...noPointerEvents,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): NavigatedPaginationStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { Dropdown, IconButton, IDropdownOption, mergeStyleSets } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { PAGINATION_PAGE_SIZES } from '../../../../../../constants/AppConstants';\r\nimport { useWindowSize } from '../../../../../../hooks';\r\nimport { getStore as getWindowSizeStore } from '../../../../../../hooks/useWindowSize/store/store';\r\nimport { IPaginationProps } from '../../Pagination';\r\nimport messages from './NavigatedPagination.messages';\r\nimport { getClassNames } from './NavigatedPagination.styles';\r\n\r\nexport interface INavigatedPaginationProps extends IPaginationProps, InjectedIntlProps {}\r\n\r\nexport const NavigatedPagination = ({\r\n intl,\r\n currentPageNumber,\r\n pageSize,\r\n className,\r\n onPageNumberChange,\r\n onPageSizeChange,\r\n totalItemCount,\r\n totalPageCount,\r\n styleProps,\r\n}: INavigatedPaginationProps) => {\r\n const { formatMessage } = intl;\r\n const { containerStyle, itemStyle, dropdownStyle, disabledItemStyle } = mergeStyleSets(getClassNames(), styleProps);\r\n const { windowStoreSerializer } = useWindowSize();\r\n const { isWindowSmallSize, isWindowExtraSmallSize } = windowStoreSerializer(getWindowSizeStore());\r\n\r\n const lastPage = totalPageCount || (totalItemCount && pageSize && Math.ceil(totalItemCount / pageSize)) || 0;\r\n if (lastPage === 0) {\r\n // Either totalPageCount or totalItemCount and pageSize must be provided\r\n return <></>;\r\n }\r\n\r\n const onFirst = () => {\r\n onPageNumberChange?.(1);\r\n };\r\n\r\n const onNext = () => {\r\n onPageNumberChange?.(currentPageNumber + 1);\r\n };\r\n\r\n const onPrevious = () => {\r\n onPageNumberChange?.(currentPageNumber - 1);\r\n };\r\n\r\n const onLast = () => {\r\n onPageNumberChange?.(lastPage as number);\r\n };\r\n\r\n const getPageSizeOptions = () => {\r\n return PAGINATION_PAGE_SIZES.map((size) => {\r\n return {\r\n key: size.toString(),\r\n text: size.toString(),\r\n isSelected: size === currentPageNumber,\r\n };\r\n }) as IDropdownOption[];\r\n };\r\n\r\n const getPageOptions = () => {\r\n return Array.from({ length: lastPage as number }, (_, i) => i + 1).map((index) => {\r\n return {\r\n key: index.toString(),\r\n text: index.toString(),\r\n isSelected: index === currentPageNumber,\r\n };\r\n }) as IDropdownOption[];\r\n };\r\n\r\n return (\r\n <div className={`${containerStyle} ${className || ''}`}>\r\n <span>{formatMessage(messages.showRows)}</span>\r\n <Dropdown\r\n ariaLabel={formatMessage(messages.showRows)}\r\n selectedKey={pageSize?.toString()}\r\n options={getPageSizeOptions()}\r\n className={dropdownStyle}\r\n onChange={(_, e) => {\r\n if (e) {\r\n onFirst();\r\n onPageSizeChange?.(Number(e.text));\r\n }\r\n }}\r\n />\r\n\r\n {!isWindowSmallSize && !isWindowExtraSmallSize && (\r\n <IconButton\r\n id=\"firstPage\"\r\n iconProps={{ iconName: 'DoubleChevronLeft' }}\r\n className={`${itemStyle} ${currentPageNumber === 1 ? disabledItemStyle : ''}`}\r\n ariaLabel={formatMessage(messages.firstPage)}\r\n onClick={onFirst}\r\n />\r\n )}\r\n <IconButton\r\n id=\"previousPage\"\r\n iconProps={{ iconName: 'ChevronLeft' }}\r\n className={`${itemStyle} ${currentPageNumber === 1 ? disabledItemStyle : ''}`}\r\n ariaLabel={formatMessage(messages.prevPage)}\r\n onClick={onPrevious}\r\n />\r\n\r\n <Dropdown\r\n id=\"pageChangerDropdown\"\r\n selectedKey={currentPageNumber.toString()}\r\n options={getPageOptions()}\r\n className={dropdownStyle}\r\n onChange={(_, e) => e && onPageNumberChange?.(Number(e.text))}\r\n ariaLabel={currentPageNumber.toString()}\r\n />\r\n <span>\r\n {formatMessage(messages.of)} {lastPage}\r\n </span>\r\n\r\n <IconButton\r\n id=\"nextPage\"\r\n iconProps={{ iconName: 'ChevronRight' }}\r\n className={`${itemStyle} ${currentPageNumber === lastPage ? disabledItemStyle : ''}`}\r\n ariaLabel={formatMessage(messages.nextPage)}\r\n onClick={onNext}\r\n />\r\n {!isWindowSmallSize && !isWindowExtraSmallSize && (\r\n <IconButton\r\n id=\"lastPage\"\r\n iconProps={{ iconName: 'DoubleChevronRight' }}\r\n className={`${itemStyle} ${currentPageNumber === lastPage ? disabledItemStyle : ''}`}\r\n ariaLabel={formatMessage(messages.lastPage)}\r\n onClick={onLast}\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { PaginationDisplay } from './Pagination.types';\r\nimport { DottedPagination } from './Themes/DottedPagination/DottedPagination';\r\nimport { IUsePaginationProps } from './Themes/DottedPagination/useDottedPagination';\r\nimport { NavigatedPagination } from './Themes/NavigatedPagination/NavigatedPagination';\r\n\r\nexport interface IPaginationProps extends IUsePaginationProps, InjectedIntlProps {\r\n display?: PaginationDisplay;\r\n className?: string;\r\n styleProps?: React.CSSProperties;\r\n onPageNumberChange?: (page: number) => void;\r\n onPageSizeChange?: (page: number) => void;\r\n onPageChange?: (page: number) => void;\r\n}\r\n\r\nexport const Pagination = (props: IPaginationProps) => {\r\n const getPagination = () => {\r\n switch (props.display) {\r\n case PaginationDisplay.Navigation:\r\n return <NavigatedPagination {...props} />;\r\n default:\r\n return <DottedPagination {...props} />;\r\n }\r\n };\r\n return getPagination();\r\n};\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterPalette, IPubcenterSpacing } from '../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../types';\r\n\r\ntype StyleProperties =\r\n | 'calenderContainer'\r\n | 'calenderRangeSelectorsContainer'\r\n | 'calenderRangeSelector'\r\n | 'calenderRangeSelectedSelector'\r\n | 'calenderRangeSelectorDateContainer'\r\n | 'calenderRangeSelectorDate'\r\n | 'calenderButton'\r\n | 'calender'\r\n | 'calenderHeader'\r\n | 'calenderMonthLabel'\r\n | 'calenderNavigator'\r\n | 'calenderBody'\r\n | 'actions'\r\n | 'daysGrid';\r\n\r\ntype CustomCalenderStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): CustomCalenderStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n\r\n return mergeStyleSets({\r\n calenderContainer: {\r\n display: 'flex',\r\n },\r\n calenderRangeSelectorsContainer: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n borderTop: `3px solid ${palette.themePrimary}`,\r\n borderRight: '1px solid #D6D6D6',\r\n },\r\n calenderRangeSelectorDateContainer: {\r\n padding: spacing.size10,\r\n },\r\n calenderRangeSelectorDate: {\r\n padding: '5px 20px 5px 10px',\r\n border: '1px solid #757575',\r\n borderRadius: 2,\r\n userSelect: 'none',\r\n },\r\n calenderRangeSelector: {\r\n padding: spacing.size10,\r\n cursor: 'pointer',\r\n userSelect: 'none',\r\n '&:hover': {\r\n color: palette.white,\r\n background: palette.themePrimary,\r\n },\r\n },\r\n calenderRangeSelectedSelector: {\r\n color: palette.white,\r\n background: palette.themePrimary,\r\n },\r\n calenderButton: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n color: '#757575',\r\n gap: spacing.size10,\r\n width: 'fit-content',\r\n padding: spacing.size6,\r\n border: '1px solid #757575',\r\n borderRadius: 2,\r\n cursor: 'pointer',\r\n userSelect: 'none',\r\n },\r\n calender: {\r\n width: '450px',\r\n display: 'grid',\r\n gap: spacing.size10,\r\n textAlign: 'center',\r\n alignItems: 'center',\r\n padding: spacing.size16,\r\n },\r\n calenderHeader: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n },\r\n calenderNavigator: {\r\n borderRadius: 2,\r\n cursor: 'pointer',\r\n userSelect: 'none',\r\n padding: spacing.size6,\r\n '&:hover': {\r\n color: palette.white,\r\n background: palette.themePrimary,\r\n },\r\n },\r\n calenderMonthLabel: {\r\n flexGrow: 1,\r\n userSelect: 'none',\r\n },\r\n calenderBody: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n },\r\n daysGrid: {\r\n display: 'grid',\r\n gridTemplateColumns: 'repeat(7, 1fr)',\r\n userSelect: 'none',\r\n },\r\n actions: {\r\n display: 'flex',\r\n gap: '10px',\r\n justifyContent: 'end',\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): CustomCalenderStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterPalette, IPubcenterSpacing } from '../../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../../types';\r\n\r\ntype StyleProperties = 'dateInCurrentMonth' | 'dateNotInCurrentMonth' | 'dateSelected' | 'dateSelectedInBetween' | 'disabledDate';\r\n\r\ntype SingleDayStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): SingleDayStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n\r\n const day = {\r\n padding: spacing.size8,\r\n borderRadius: 2,\r\n cursor: 'pointer',\r\n };\r\n\r\n return mergeStyleSets({\r\n dateNotInCurrentMonth: {\r\n ...day,\r\n color: '#737373',\r\n cursor: 'not-allowed',\r\n },\r\n disabledDate: {\r\n ...day,\r\n color: '#737373',\r\n cursor: 'not-allowed',\r\n },\r\n dateInCurrentMonth: {\r\n ...day,\r\n background: palette.neutralLight,\r\n '&:hover': {\r\n color: palette.white,\r\n background: palette.themePrimary,\r\n },\r\n },\r\n dateSelected: {\r\n ...day,\r\n background: palette.themePrimary,\r\n color: palette.white,\r\n },\r\n dateSelectedInBetween: {\r\n ...day,\r\n background: '#CBE7F2',\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): SingleDayStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import React from 'react';\r\nimport { injectIntlAndObserver } from '../../../../../utils';\r\nimport { getClassNames } from './SingleDay.styles';\r\nimport { ISingleDayProps } from './SingleDay.types';\r\n\r\nexport const SingleDay = injectIntlAndObserver(function SingleDayComponent(props: ISingleDayProps): JSX.Element {\r\n const { dayObj, handleDateRangeSelection, selectedDateRange, hoveredDateRange, handleDateRangeHover, turn, isDisabled } = props;\r\n const { day, fullDay, isInCurrentMonth } = dayObj;\r\n const { dateNotInCurrentMonth, dateInCurrentMonth, dateSelected, dateSelectedInBetween, disabledDate } = getClassNames();\r\n\r\n function getDayClasses() {\r\n const disabledClass = isDisabled ? disabledDate : '';\r\n const isInCurrentMonthClass = !isDisabled ? (isInCurrentMonth ? dateInCurrentMonth : dateNotInCurrentMonth) : '';\r\n const dayIndex = selectedDateRange.findIndex(\r\n (date) => date.toDateString() === new Date(fullDay.year, fullDay.month, fullDay.day).toDateString()\r\n );\r\n const isInHoverRange = hoveredDateRange?.find(\r\n (date) => date.toDateString() === new Date(fullDay.year, fullDay.month, fullDay.day).toDateString()\r\n );\r\n const selectedClass =\r\n isInCurrentMonth && dayIndex !== -1\r\n ? dayIndex === 0 || dayIndex === selectedDateRange.length - 1\r\n ? dateSelected\r\n : dateSelectedInBetween\r\n : '';\r\n const hoverClass = isInCurrentMonth && isInHoverRange ? dateSelected : '';\r\n return `${disabledClass} ${selectedClass} ${isInCurrentMonthClass} ${hoverClass}`;\r\n }\r\n\r\n return (\r\n <span\r\n id={isInCurrentMonth ? Object.values(fullDay).join('/') : ''}\r\n className={getDayClasses()}\r\n onClick={() => !isDisabled && isInCurrentMonth && handleDateRangeSelection(fullDay)}\r\n onMouseEnter={() => {\r\n turn === 1 && isInCurrentMonth && !isDisabled && handleDateRangeHover?.(fullDay);\r\n }}\r\n >\r\n {day}\r\n </span>\r\n );\r\n});\r\n","import { Callout, DefaultButton, DirectionalHint, Icon, PrimaryButton } from '@fluentui/react';\r\nimport React, { useState } from 'react';\r\nimport { useI18n } from '../../../../../i18n/useI18n';\r\nimport { getAppStore } from '../../../../@data';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { DATE_RANGE_PICKER_APPLY_BUTTON } from '../../../../constants/DataTestIdConstants';\r\nimport { WEEK_DAYS_LANGUAGE_MAPPING } from '../../../../globalization';\r\nimport { injectIntlAndObserver } from '../../../../utils';\r\nimport { getStore } from '../../../ad-management/Account/Settings/@data/store/store';\r\nimport messages from './CustomCalender.messages';\r\nimport { getClassNames } from './CustomCalender.styles';\r\nimport { ICustomCalenderProps, IDateElements, IDay, RangeType } from './CustomCalender.types';\r\nimport { SingleDay } from './components/SingleDay';\r\nimport {\r\n get7DaysExcludingToday,\r\n getDatesInRange,\r\n getLastSundayToSaturday,\r\n getMondayToToday,\r\n getMonthlyCalendar,\r\n getPresetDataTestId,\r\n getSelectedEndingDate,\r\n getSelectedPeriodLabel,\r\n getSelectedStartingDate,\r\n getSundayToToday,\r\n getToday,\r\n getYesterday,\r\n isDayInFuture,\r\n} from './utils/CalenderUtils';\r\n\r\nconst END_OF_YEAR_INDEX = 11;\r\nconst START_OF_YEAR_INDEX = 0;\r\n\r\nexport const CustomCalender = injectIntlAndObserver(function CustomCalenderComponent(props: ICustomCalenderProps): JSX.Element {\r\n const { onSelectedDatesChanged, initialRangeType, initialDateRange, intl, disableFutureDays = true, dataTestId } = props;\r\n const { formatMessage } = intl;\r\n const [selectedDateRange, setSelectedDateRange] = useState<Date[]>(getDatesInRange(initialDateRange.startDate, initialDateRange.endDate));\r\n const [finalDateRange, setFinalDateRange] = useState<Date[]>(getDatesInRange(initialDateRange.startDate, initialDateRange.endDate));\r\n const [hoveredDateRange, setHoveredDateRange] = useState<Date[]>([]);\r\n const [turn, setTurn] = useState(0);\r\n const [isCalenderVisible, setIsCalenderVisible] = useState(false);\r\n const [rangeType, setRangeType] = useState(initialRangeType);\r\n const [finalRangeType, setFinalRangeType] = useState(initialRangeType);\r\n const { publisher, userContext } = getAppStore();\r\n const { systemPreferences } = getStore().active;\r\n const { locale } = useI18n({ systemPreferences, publisher, userContext });\r\n const options: Intl.DateTimeFormatOptions = {};\r\n options.year = 'numeric';\r\n options.month = 'short';\r\n const optionsDays: Intl.DateTimeFormatOptions = {};\r\n optionsDays.weekday = 'narrow';\r\n const WEEK_DAYS = WEEK_DAYS_LANGUAGE_MAPPING[getAppStore().locale];\r\n\r\n const [currentMonth, setCurrentMonth] = useState(new Date().getMonth());\r\n const [currentYear, setCurrentYear] = useState(new Date().getFullYear());\r\n const {\r\n calenderContainer,\r\n calenderRangeSelectorsContainer,\r\n calenderRangeSelector,\r\n calenderRangeSelectedSelector,\r\n calenderRangeSelectorDateContainer,\r\n calenderRangeSelectorDate,\r\n calenderButton,\r\n calender,\r\n calenderBody,\r\n calenderNavigator,\r\n calenderMonthLabel,\r\n daysGrid,\r\n calenderHeader,\r\n actions,\r\n } = getClassNames();\r\n\r\n const nextMonth = () => {\r\n if (currentMonth < END_OF_YEAR_INDEX) {\r\n setCurrentMonth((prev) => prev + 1);\r\n } else {\r\n setCurrentMonth(START_OF_YEAR_INDEX);\r\n setCurrentYear((prev) => prev + 1);\r\n }\r\n };\r\n\r\n const prevMonth = () => {\r\n if (currentMonth > START_OF_YEAR_INDEX) {\r\n setCurrentMonth((prev) => prev - 1);\r\n } else {\r\n setCurrentMonth(END_OF_YEAR_INDEX);\r\n setCurrentYear((prev) => prev - 1);\r\n }\r\n };\r\n\r\n const handleDateRangeSelection = (selectedDate: IDateElements) => {\r\n if (turn === 0) {\r\n setTurn(1);\r\n setSelectedDateRange([new Date(selectedDate.year, selectedDate.month, selectedDate.day)]);\r\n setHoveredDateRange([new Date(selectedDate.year, selectedDate.month, selectedDate.day)]);\r\n } else if (turn === 1) {\r\n let dates = getDatesInRange(selectedDateRange[0], new Date(selectedDate.year, selectedDate.month, selectedDate.day));\r\n if (dates.length === 0) {\r\n dates = [selectedDateRange[0]];\r\n }\r\n if (dates.length === 1) {\r\n dates = [selectedDateRange[0], selectedDateRange[0]];\r\n }\r\n setTurn(0);\r\n setSelectedDateRange(dates);\r\n setHoveredDateRange([]);\r\n setRangeType(RangeType.Custom);\r\n }\r\n };\r\n\r\n const handleDateRangeHover = (date: IDateElements) => {\r\n const days = getDatesInRange(hoveredDateRange[0], new Date(date.year, date.month, date.day));\r\n setHoveredDateRange(days.length === 0 ? [selectedDateRange[0]] : days);\r\n };\r\n\r\n const getRangeSelectorContent = (type: RangeType, message: ReactIntl.FormattedMessage.MessageDescriptor, clickable: boolean = true) => {\r\n const getRange = (selector: RangeType) => {\r\n setRangeType(selector);\r\n let dateRange;\r\n switch (selector) {\r\n case RangeType.Today:\r\n dateRange = getToday();\r\n break;\r\n case RangeType.Yesterday:\r\n dateRange = getYesterday();\r\n break;\r\n case RangeType.SundayToday:\r\n dateRange = getSundayToToday();\r\n break;\r\n case RangeType.MondayToday:\r\n dateRange = getMondayToToday();\r\n break;\r\n case RangeType.Last7ExcludingToday:\r\n dateRange = get7DaysExcludingToday();\r\n break;\r\n case RangeType.Last7FromSunToSat:\r\n dateRange = getLastSundayToSaturday();\r\n break;\r\n default:\r\n break;\r\n }\r\n setSelectedDateRange(dateRange);\r\n };\r\n\r\n return (\r\n <span\r\n data-test-id={getPresetDataTestId(type)}\r\n className={`${calenderRangeSelector} ${rangeType === type ? calenderRangeSelectedSelector : ''}`}\r\n onClick={() => clickable && getRange(type)}\r\n >\r\n {formatMessage(message)}\r\n </span>\r\n );\r\n };\r\n\r\n const getCalenderContent = (year: number, month: number) => {\r\n return (\r\n <div className={daysGrid}>\r\n {WEEK_DAYS.map((day, index) => (\r\n <p key={index}>{day}</p>\r\n ))}\r\n {getMonthlyCalendar(year, month).map((day: IDay, index) => (\r\n <SingleDay\r\n {...props}\r\n key={index}\r\n dayObj={day}\r\n turn={turn}\r\n isDisabled={disableFutureDays && isDayInFuture(day.fullDay)}\r\n handleDateRangeSelection={handleDateRangeSelection}\r\n selectedDateRange={selectedDateRange}\r\n hoveredDateRange={hoveredDateRange}\r\n handleDateRangeHover={handleDateRangeHover}\r\n />\r\n ))}\r\n </div>\r\n );\r\n };\r\n const resetCalender = () => {\r\n setSelectedDateRange(finalDateRange);\r\n setRangeType(finalRangeType);\r\n };\r\n const hideCalender = () => {\r\n setIsCalenderVisible(false);\r\n };\r\n const onApplyClicked = () => {\r\n onSelectedDatesChanged({ startDate: selectedDateRange[0], endDate: selectedDateRange[selectedDateRange.length - 1] }, rangeType);\r\n setFinalDateRange(selectedDateRange);\r\n setFinalRangeType(rangeType);\r\n hideCalender();\r\n };\r\n const onDismiss = () => {\r\n resetCalender();\r\n hideCalender();\r\n };\r\n\r\n return (\r\n <>\r\n <div\r\n data-test-id={dataTestId}\r\n id={'customCalender'}\r\n className={calenderButton}\r\n onClick={() => setIsCalenderVisible(!isCalenderVisible)}\r\n >\r\n <span>\r\n {getSelectedPeriodLabel(rangeType, formatMessage)}\r\n {getSelectedStartingDate(selectedDateRange, locale)}\r\n {getSelectedEndingDate(selectedDateRange, locale)}\r\n </span>\r\n <Icon iconName=\"Calendar\" />\r\n </div>\r\n {isCalenderVisible && (\r\n <Callout target={'#customCalender'} isBeakVisible={false} onDismiss={onDismiss} directionalHint={DirectionalHint.bottomRightEdge}>\r\n <div className={calenderContainer}>\r\n <div className={calenderRangeSelectorsContainer}>\r\n <div className={calenderRangeSelectorDateContainer}>\r\n <span className={calenderRangeSelectorDate}>{selectedDateRange[0].toLocaleDateString(locale)}</span>\r\n {' - '}\r\n <span className={calenderRangeSelectorDate}>\r\n {selectedDateRange[selectedDateRange.length - 1].toLocaleDateString(locale)}\r\n </span>\r\n </div>\r\n {getRangeSelectorContent(RangeType.Custom, messages.customLabel, false)}\r\n {getRangeSelectorContent(RangeType.Today, messages.todayLabel)}\r\n {getRangeSelectorContent(RangeType.Yesterday, messages.yesterdayLabel)}\r\n {getRangeSelectorContent(RangeType.SundayToday, messages.sundayTodayLabel)}\r\n {getRangeSelectorContent(RangeType.MondayToday, messages.mondayTodayLabel)}\r\n {getRangeSelectorContent(RangeType.Last7ExcludingToday, messages.last7FromTodayLabel)}\r\n {getRangeSelectorContent(RangeType.Last7FromSunToSat, messages.last7FromSunToSatLabel)}\r\n </div>\r\n <div className={calender}>\r\n <div className={calenderHeader}>\r\n <Icon iconName=\"ChevronLeft\" className={calenderNavigator} onClick={prevMonth} />\r\n <span className={calenderMonthLabel}>\r\n {new Date(\r\n currentMonth - 1 >= 0 ? currentYear : currentYear - 1,\r\n currentMonth - 1 >= 0 ? currentMonth - 1 : 11\r\n ).toLocaleDateString(locale, options)}\r\n </span>\r\n <span className={calenderMonthLabel}>{new Date(currentYear, currentMonth).toLocaleDateString(locale, options)}</span>\r\n <Icon iconName=\"ChevronRight\" className={calenderNavigator} onClick={nextMonth} />\r\n </div>\r\n <div className={calenderBody}>\r\n {getCalenderContent(currentMonth - 1 >= 0 ? currentYear : currentYear - 1, currentMonth - 1 >= 0 ? currentMonth - 1 : 11)}\r\n {getCalenderContent(currentYear, currentMonth)}\r\n </div>\r\n <div className={actions}>\r\n <PrimaryButton data-test-id={DATE_RANGE_PICKER_APPLY_BUTTON} onClick={onApplyClicked}>\r\n {formatMessage(AppMessages.apply)}\r\n </PrimaryButton>\r\n <DefaultButton onClick={onDismiss}>{formatMessage(AppMessages.cancel)}</DefaultButton>\r\n </div>\r\n </div>\r\n </div>\r\n </Callout>\r\n )}\r\n </>\r\n );\r\n});\r\n","import { IStyle } from '@fluentui/react';\r\nimport { IPubcenterSpacing } from '../../../theme';\r\n\r\nexport interface IInternationalizationStyles {\r\n supportButtonWrapper?: IStyle;\r\n supportButton?: IStyle;\r\n}\r\n\r\nexport const getStyles = (props) => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return {\r\n supportButtonWrapper: {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n },\r\n supportButton: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n marginRight: spacing.size12,\r\n img: {\r\n marginRight: spacing.size6,\r\n },\r\n },\r\n };\r\n};\r\n","import { ITheme, classNamesFunction, css, getTheme } from '@fluentui/react';\r\nimport React, { useEffect, useRef } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { useI18n } from '../../../i18n/useI18n';\r\nimport { Publisher, UserContext, getEntityAccessPermissions, isTythonSelfServeUser } from '../../@data';\r\nimport { UserRoleEntity, completeAccess, hasReadAccess } from '../../@data/services/UserRoleService';\r\nimport { PublisherSettings } from '../../@data/store/schema/userrolemodels/PublisherSettings';\r\nimport { SupportPageRoute } from '../../Routes';\r\nimport { useCMUIHelpExperience } from '../../hooks';\r\nimport SupportBotton from '../../hooks/useCMUIHelpExperience/supportButton.svg';\r\nimport { onFetchPublisherPreferences } from '../../pages/ad-management/Account/Settings/@data/actions';\r\nimport { getStore } from '../../pages/ad-management/Account/Settings/@data/store/store';\r\nimport { onInitializeSystemPreferences } from '../../pages/ad-management/Home/@data/actions';\r\nimport supportMessages from '../../pages/ad-management/Home/components/ResourcesSection/ResourcesSection.messages';\r\nimport { injectIntlAndObserver } from '../../utils';\r\nimport { IInternationalizationStyles, getStyles } from './InternationalizationLayout.styles';\r\n\r\nexport interface IInternationalizationLayoutProps extends InjectedIntlProps {\r\n children?: React.ReactNode;\r\n publisher?: Publisher;\r\n userContext?: UserContext;\r\n}\r\n\r\nconst getClassNames = classNamesFunction<{ theme: ITheme }, IInternationalizationStyles>();\r\n\r\nexport const InternationalizationLayout = injectIntlAndObserver(({ publisher, userContext, intl }: IInternationalizationLayoutProps) => {\r\n const accessPermissions = getEntityAccessPermissions(UserRoleEntity.PublisherSettings) as PublisherSettings | null;\r\n const hasPublisherPreferencesAccess = hasReadAccess(accessPermissions ? accessPermissions.publisherPreferences : completeAccess);\r\n const systemPreferences = getStore().active.systemPreferences;\r\n const { locale } = useI18n({ systemPreferences, publisher, userContext });\r\n const handledPreference = useRef<boolean>(false);\r\n const handledSystemPreference = useRef<boolean>(false);\r\n const { init: initCMUIExperience, initCMUIHelpButtonEventListener, removeCMUIHelpButtonEventListener } = useCMUIHelpExperience();\r\n const classNames = getClassNames(getStyles, { theme: getTheme() });\r\n\r\n useEffect(() => {\r\n if (hasPublisherPreferencesAccess && publisher && userContext && !handledPreference.current && isTythonSelfServeUser()) {\r\n onFetchPublisherPreferences();\r\n handledPreference.current = true;\r\n }\r\n }, [publisher, userContext, hasPublisherPreferencesAccess]);\r\n\r\n useEffect(() => {\r\n if (publisher && userContext && !handledSystemPreference.current && isTythonSelfServeUser()) {\r\n onInitializeSystemPreferences();\r\n handledSystemPreference.current = true;\r\n }\r\n }, [publisher, userContext]);\r\n\r\n useEffect(() => {\r\n initCMUIExperience(constructSupportButton(), locale);\r\n initCMUIHelpButtonEventListener();\r\n return () => {\r\n removeCMUIHelpButtonEventListener();\r\n };\r\n // eslint-disable-next-line\r\n }, [locale]);\r\n\r\n const constructSupportButton = () => {\r\n return `\r\n <div class=\"${css(classNames.supportButtonWrapper)}\">\r\n <a href=\"${SupportPageRoute}\" target=\"_blank\">\r\n <button class=\"${css(classNames.supportButton)}\">\r\n <img src=\"${SupportBotton}\" alt=\"${intl.formatMessage(supportMessages.assistanceDescription)}\" /> ${intl.formatMessage(\r\n supportMessages.assistanceDescription\r\n )}\r\n </button>\r\n </a>\r\n </div>\r\n `;\r\n };\r\n\r\n return <></>;\r\n});\r\n","import { nullRender } from '@fluentui/react';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport { getAppStore, onPublisherChanged, onPublisherSelected, Publisher } from '../../@data';\r\nimport { PublisherAccountPicker } from '../../layout/PublisherAccountPicker/PublisherAccountPicker';\r\nimport { onSetPublisherReporting } from './@data/actions';\r\nimport { IReportParams } from './@data/store/schema';\r\nimport { defaultRoute, getPageStore, RouteName } from './@data/store/store';\r\n\r\nexport const ReportHeader = observer(\r\n class ReportHeaderComponent extends React.Component<RouteComponentProps<IReportParams>> {\r\n public componentDidMount() {\r\n const publisherId = this.props.match.params.publisherId;\r\n\r\n onPublisherSelected(publisherId);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const appStore = getAppStore();\r\n const store = getPageStore();\r\n\r\n if (store.loading) {\r\n return nullRender();\r\n }\r\n\r\n return (\r\n <PublisherAccountPicker\r\n {...this.props}\r\n onChange={this._onPublisherChanged}\r\n publisher={appStore.publisher}\r\n isAccountHidden={true}\r\n isAccountSelectionDisabled={true}\r\n />\r\n );\r\n }\r\n\r\n private _onPublisherChanged = (publisher?: Publisher) => {\r\n const store = getPageStore();\r\n const currentRoute = RouteName[store.currentRoute || defaultRoute];\r\n\r\n const publisherId = publisher ? publisher.id : 0;\r\n\r\n if (publisher && publisherId !== 0) {\r\n this.props.history.push(`/report/${publisherId}/${currentRoute}`);\r\n onSetPublisherReporting(publisher);\r\n } else {\r\n this.props.history.push(`/report/${currentRoute}`);\r\n }\r\n onPublisherChanged(publisher);\r\n };\r\n }\r\n);\r\n","import * as React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { Redirect, Route, RouteComponentProps } from 'react-router';\r\nimport { Switch } from 'react-router-dom';\r\nimport { IAppState, getAppStore } from '../../@data';\r\nimport AppMessages from '../../App.messages';\r\nimport { IRoute } from '../../Routes.types';\r\nimport { ContentLayout } from '../../layout/ContentLayout/ContentLayout';\r\nimport { IMenuProps } from '../../layout/ContentLayout/ContentLayout.types';\r\nimport { RouteName } from './@data/store/store';\r\nimport { BaseReportPage } from './BaseReportPage';\r\nimport { ReportHeader } from './ReportHeader';\r\n\r\nexport const getRoutes = (formatMessage) => [\r\n {\r\n key: RouteName[RouteName.dashboard],\r\n text: formatMessage(AppMessages.navReports),\r\n icon: 'CRMReport',\r\n component: BaseReportPage,\r\n },\r\n];\r\n\r\nconst DefaultRoute = RouteName[RouteName.dashboard];\r\n\r\nexport const ReportRouter = injectIntl(\r\n class extends React.Component<RouteComponentProps & InjectedIntlProps> {\r\n public render(): JSX.Element {\r\n const store = getAppStore();\r\n const menuProps: IMenuProps = {\r\n ...this.props,\r\n routes: this._generateMenuRoutes(store),\r\n };\r\n return (\r\n <ContentLayout {...this.props} menuProps={menuProps} onRenderHeader={this._renderHeader}>\r\n <Redirect exact path={this.props.match.url} to={`${this.props.match.url}/${DefaultRoute}`} />\r\n {getRoutes(this.props.intl.formatMessage).map((route: IRoute, index: number) => (\r\n <Route\r\n key={index}\r\n path={[`${this.props.match.url}/${route.key}`, `${this.props.match.url}/:publisherId/${route.key}`]}\r\n component={route.component}\r\n />\r\n ))}\r\n </ContentLayout>\r\n );\r\n }\r\n\r\n private _generateMenuRoutes(store: IAppState) {\r\n let keyFnc: (key: string) => string;\r\n\r\n if (store.publisher && store.publisher.id) {\r\n const publisherId = store.publisher.id.toString();\r\n keyFnc = (key) => {\r\n return `/${publisherId}/${key}`;\r\n };\r\n } else {\r\n keyFnc = (key) => `/${key}`;\r\n }\r\n\r\n // Update the menu routes according to whether the publisher/account were specified.\r\n return getRoutes(this.props.intl.formatMessage).map(\r\n (route) =>\r\n ({\r\n key: keyFnc(route.key),\r\n text: route.text,\r\n icon: route.icon,\r\n } as IRoute)\r\n );\r\n }\r\n\r\n private _renderHeader = (): JSX.Element => {\r\n // Support non pub urls as well. When nothing matched, go back to home to do the default route.\r\n return (\r\n <React.Fragment>\r\n <Switch>\r\n <Route path={`${this.props.match.url}/:publisherId`} render={(props) => <ReportHeader {...props} />} />\r\n <Route path=\"*\" render={() => <Redirect to={this.props.match.url} />} />\r\n </Switch>\r\n </React.Fragment>\r\n );\r\n };\r\n }\r\n);\r\n","import React, { ReactNode, Suspense } from 'react';\r\nimport { PageSpinner } from '../Spinners';\r\n\r\nexport interface ILazyLoadedComponentProps {\r\n fallback?: JSX.Element;\r\n lazyComponent: ReactNode;\r\n}\r\n\r\nexport const LazyComponent = ({ fallback, lazyComponent }: ILazyLoadedComponentProps): JSX.Element => {\r\n if (!fallback) {\r\n fallback = <PageSpinner />;\r\n }\r\n\r\n return <Suspense fallback={fallback}>{lazyComponent}</Suspense>;\r\n};\r\n","import { action, orchestrator } from 'satcheljs';\r\n\r\nimport {\r\n ApiError,\r\n ClarityStatus,\r\n Property,\r\n getAppStore,\r\n isTythonSelfServeUser,\r\n onLoadingChanged,\r\n patchEntity,\r\n showErrorToastNotification,\r\n showSuccessToastNotification,\r\n} from '../../../../../../@data';\r\nimport { UpdateClarityProject } from '../../../../../../@data/store/schema/models/UpdateClarityProject';\r\nimport { setPropertyData } from '../../../Manage/__data__/mutatorActions';\r\nimport { getGridPropertyStore } from '../../../Manage/__data__/store/store';\r\nimport PropertyMessages from '../../../Property.messages';\r\n\r\nexport const onResendClarityLink = action('onResendClarityLink', (propertyId: string, clarityId: string, clarityEnabled?: boolean) => ({\r\n propertyId,\r\n clarityId,\r\n clarityEnabled,\r\n}));\r\n\r\norchestrator(onResendClarityLink, async ({ propertyId, clarityId, clarityEnabled }) => {\r\n const { publisher, userContext } = getAppStore();\r\n const { data } = getGridPropertyStore();\r\n\r\n if (publisher && propertyId && clarityId) {\r\n try {\r\n onLoadingChanged(true);\r\n\r\n const body: UpdateClarityProject = {\r\n apiPath: undefined,\r\n className: 'updateClarityProject',\r\n propertyId: propertyId?.toString(),\r\n };\r\n\r\n if (isTythonSelfServeUser()) {\r\n body.clarityProjectIdForTython = clarityId;\r\n } else {\r\n body.clarityProjectId = clarityId;\r\n body.enableMicrosoftClarity = clarityEnabled;\r\n }\r\n\r\n await patchEntity([publisher, new Property()], UpdateClarityProject, body, userContext);\r\n showSuccessToastNotification({ textMessageDescriptor: PropertyMessages.clarityRelinkSuccess });\r\n\r\n if (clarityEnabled === undefined && data !== undefined) {\r\n const updatedProperty = { ...data?.find((property) => property.id === propertyId) };\r\n updatedProperty.servingConfig!.clarityConfig!.clarityStatus = ClarityStatus.Pending;\r\n\r\n const updatedProperties: Property[] =\r\n data?.map((property) => {\r\n if (property.id === propertyId) {\r\n return updatedProperty as Property;\r\n } else {\r\n return property as Property;\r\n }\r\n }) || [];\r\n\r\n setPropertyData(updatedProperties);\r\n }\r\n } catch (e) {\r\n const apiErrorObj = e as ApiError;\r\n if (clarityId && apiErrorObj && (apiErrorObj.code === 404 || apiErrorObj.code === 400)) {\r\n showErrorToastNotification({ text: JSON.parse(apiErrorObj.message)[0].description });\r\n } else {\r\n // Add check for link or unlink request\r\n showErrorToastNotification({\r\n textMessageDescriptor: PropertyMessages.clarityRelinkFailed,\r\n intlMessageValues: { projectId: clarityId },\r\n });\r\n }\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n showErrorToastNotification({ textMessageDescriptor: PropertyMessages.invalidState });\r\n }\r\n});\r\n","import { createStore } from 'satcheljs';\r\nimport { IAccountStatusData } from './schema';\r\n\r\n// !NOTE: This is to be added explicitly for the orchestrators to register themselves.\r\nimport '../orchestrators';\r\n\r\nexport const getAccountStatusData = createStore<IAccountStatusData>('AccountStatusData', {\r\n status: undefined,\r\n isLoading: false,\r\n});\r\n","export const ratioMetrics = [\r\n 'WinRate',\r\n 'eCPM',\r\n 'CTR',\r\n 'Viewability',\r\n 'FillRate',\r\n 'AdECPM',\r\n 'AdCTR',\r\n 'ImpressionsRate',\r\n 'MeasurableImpressionsRate',\r\n];\r\n","import { when } from 'mobx';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../logging/src';\r\nimport { onAccountSelected, onPublisherAccountChanged, onPublisherSelected } from '../actions';\r\nimport '../mutators';\r\nimport '../orchestrators';\r\nimport { setUserRoles } from '../services/UserRoleService';\r\nimport { UserContext } from '../store/schema';\r\nimport { getAppStore } from '../store/store';\r\nimport { isTythonSelfServeUser } from '../utils/checkUserType';\r\n\r\norchestrator(onPublisherAccountChanged, async (msg) => {\r\n const store = getAppStore();\r\n if (isTythonSelfServeUser() && !store.publisher && msg.publisherId === '0') {\r\n /** DefaultPublisherId is not set when scope call had been failed/skipped,\r\n * as Publisher and Accounts are not set, entities on homepage won't load.\r\n * If scope call succeeds, page will load, else user will be logged out. */\r\n const userContext = store.userContext || new UserContext();\r\n\r\n Log.info('Fetching user scope again');\r\n await setUserRoles(userContext);\r\n when(\r\n () => store.defaultPublisher !== 0,\r\n () => {\r\n const publisherId = store.defaultPublisher ? store.defaultPublisher.toString() : '0';\r\n onPublisherSelected(publisherId, msg.routeHistory);\r\n }\r\n );\r\n } else {\r\n onPublisherSelected(msg.publisherId, msg.routeHistory);\r\n onAccountSelected(msg.accountId);\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { onAccountChanged } from '../actions';\r\nimport { StorageAccountKey } from '../store/store';\r\n\r\norchestrator(onAccountChanged, async msg => {\r\n if (!msg.account) {\r\n localStorage.removeItem(StorageAccountKey);\r\n } else {\r\n localStorage.setItem(StorageAccountKey, JSON.stringify(msg.account));\r\n }\r\n});","import { orchestrator } from 'satcheljs';\r\nimport { Account, getEntity } from '..';\r\nimport { Log } from '../../../logging/src/Log';\r\nimport { onAccountChanged, onAccountSelected, onLoadingChanged } from '../actions';\r\nimport { getAppStore } from '../store/store';\r\n\r\norchestrator(onAccountSelected, async (msg) => {\r\n const userContext = getAppStore().userContext;\r\n const accountId = parseInt(msg.id, 10);\r\n\r\n if (isNaN(accountId)) {\r\n return;\r\n }\r\n\r\n const store = getAppStore();\r\n\r\n // Account can only get selected when a publisher is present.\r\n if (!store.publisher) {\r\n return;\r\n }\r\n\r\n if (store.account && store.account.id === accountId) {\r\n // The stored account params are the same. No need to reset it.\r\n return;\r\n }\r\n\r\n onLoadingChanged(true);\r\n\r\n const account = new Account(accountId);\r\n\r\n try {\r\n const accountAsync = await getEntity([store.publisher, account], userContext);\r\n if (accountAsync) {\r\n onAccountChanged(new Account(accountAsync.id, accountAsync.name));\r\n } else {\r\n onAccountChanged(undefined);\r\n }\r\n } catch (e) {\r\n Log.error('TODO: Error Handling for API Requests');\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../logging/src';\r\nimport { removePaymentNotificationBuffers } from '../../pages/ad-management/Account/Payments/Onboarding/usePaymentsOnboarding';\r\nimport { onAuthLogout } from '../actions';\r\nimport { logoutPubCenterAADUser } from '../services/PubCenterAADAuthService';\r\nimport { getAppStore } from '../store/store';\r\n\r\norchestrator(onAuthLogout, async ({ isTokenExpired }) => {\r\n const { userContext } = getAppStore();\r\n Log.info(`Logging out ${userContext?.email}`);\r\n\r\n removePaymentNotificationBuffers();\r\n\r\n await logoutPubCenterAADUser(isTokenExpired);\r\n});\r\n","import { uiConfig } from '../../config/ui.config';\r\nimport { DismissNotificationRequest, Notification, UserContext } from '../store/schema';\r\nimport { handleApiErrors, handleError } from '../utils/handleApiErrors';\r\nimport { buildRequestHeadersWithAuthToken } from '../utils/requestUtils';\r\nimport { ApiError } from './ApiService';\r\n\r\nexport async function getBackendNotifications(publisherId, accountId, userContext: UserContext): Promise<Notification[]> {\r\n const url = `${uiConfig.getApiBaseAddress('1.0')}/notifications/publishers/${publisherId}/accounts/${accountId}/users/${\r\n userContext!.id\r\n }/panel`;\r\n const headers = await buildRequestHeadersWithAuthToken(url, userContext);\r\n\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n });\r\n if (!response.ok) {\r\n return handleApiErrors<Notification[]>(response, url);\r\n }\r\n\r\n const responseJson = await response.json();\r\n if (responseJson.data) {\r\n return responseJson.data;\r\n }\r\n return Promise.resolve([] as Notification[]);\r\n } catch (err) {\r\n const error = `getBackendNotifications operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n\r\nexport async function dismissNotifications(\r\n publisherId,\r\n accountId,\r\n userContext: UserContext,\r\n body: DismissNotificationRequest\r\n): Promise<string[]> {\r\n const url = `${uiConfig.getApiBaseAddress('1.0')}/notifications/publishers/${publisherId}/accounts/${accountId}/users/${\r\n userContext!.id\r\n }/dismiss`;\r\n const headers = await buildRequestHeadersWithAuthToken(url, userContext);\r\n\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: 'DELETE',\r\n headers: headers,\r\n body: JSON.stringify(body),\r\n });\r\n if (!response.ok) {\r\n return handleApiErrors<string[]>(response, url);\r\n }\r\n\r\n const responseJson = await response.json();\r\n if (responseJson.data && responseJson.data.notificationIds) {\r\n return responseJson.data.notificationIds;\r\n }\r\n return Promise.resolve([] as string[]);\r\n } catch (err) {\r\n const error = `dismiss backend operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n","import { orchestrator } from 'satcheljs';\r\nimport {\r\n DismissNotificationRequest,\r\n NotificationSeverity,\r\n getAppStore,\r\n onDismissAllNotifications,\r\n onNotificationPanelItemsChanged,\r\n} from '..';\r\nimport { Log } from '../../../logging/src';\r\nimport { SESSION_DISMISSED_NOTIFICATIONS_BACKEND, SESSION_NOTIFICATIONS_UI } from '../../constants/AppConstants';\r\nimport { dismissNotifications } from '../services/NotificationService';\r\n\r\norchestrator(onDismissAllNotifications, async () => {\r\n const store = getAppStore();\r\n\r\n const panelNotifications = store.panelNotifications || [];\r\n const dismissedNotifications = sessionStorage.getItem(SESSION_DISMISSED_NOTIFICATIONS_BACKEND);\r\n\r\n let dismissedBackendNotificationInUI: string[] = [];\r\n if (dismissedNotifications) {\r\n dismissedBackendNotificationInUI = JSON.parse(dismissedNotifications);\r\n }\r\n\r\n const backendDismissedNotifications: string[] = [];\r\n panelNotifications.forEach((panelNotification) => {\r\n if (!panelNotification.isUIGenerated) {\r\n if (panelNotification.severity === NotificationSeverity.Critical || panelNotification.severity === NotificationSeverity.Warning) {\r\n // we donot dismiss backend notification but remove in UI\r\n dismissedBackendNotificationInUI.push(panelNotification.id!);\r\n } else {\r\n backendDismissedNotifications.push(panelNotification.id!);\r\n }\r\n }\r\n });\r\n sessionStorage.setItem(SESSION_DISMISSED_NOTIFICATIONS_BACKEND, JSON.stringify(dismissedBackendNotificationInUI));\r\n\r\n if (backendDismissedNotifications.length > 0) {\r\n try {\r\n const body: DismissNotificationRequest = { notificationIds: backendDismissedNotifications };\r\n await dismissNotifications(store.publisher?.id!, store.account?.id!, store.userContext!, body);\r\n } catch (e) {\r\n Log.error(`Failed to dismiss notifications: ${JSON.stringify(e)}`);\r\n }\r\n }\r\n\r\n onNotificationPanelItemsChanged([]);\r\n sessionStorage.setItem(SESSION_NOTIFICATIONS_UI, '');\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { DismissNotificationRequest, NotificationSeverity, getAppStore, onDismissNotification, onNotificationPanelItemsChanged } from '..';\r\nimport { Log } from '../../../logging/src';\r\nimport { INotificationCardItem } from '../../components/NotificationCard';\r\nimport { SESSION_DISMISSED_NOTIFICATIONS_BACKEND, SESSION_NOTIFICATIONS_UI } from '../../constants/AppConstants';\r\nimport { dismissNotifications } from '../services/NotificationService';\r\n\r\norchestrator(onDismissNotification, async (msg) => {\r\n const store = getAppStore();\r\n let panelNotifications = store.panelNotifications || [];\r\n const selectedNotification = msg.notification;\r\n const indexOfNotification = panelNotifications.findIndex((notification) =>\r\n selectedNotification.component\r\n ? notification.id === selectedNotification.id\r\n : notification.title === selectedNotification.title && notification.id === selectedNotification.id\r\n );\r\n panelNotifications = [...panelNotifications.slice(0, indexOfNotification), ...panelNotifications.slice(indexOfNotification + 1)];\r\n onNotificationPanelItemsChanged(panelNotifications);\r\n\r\n if (selectedNotification.isUIGenerated) {\r\n const existingNotifications = sessionStorage.getItem(SESSION_NOTIFICATIONS_UI);\r\n\r\n let notifications: INotificationCardItem[] = [];\r\n if (existingNotifications) {\r\n notifications = JSON.parse(existingNotifications);\r\n }\r\n\r\n const indexOfSSNotification = notifications.findIndex((notification) =>\r\n selectedNotification.component\r\n ? notification.id === selectedNotification.id\r\n : notification.title === selectedNotification.title && notification.id === selectedNotification.id\r\n );\r\n notifications = [...notifications.slice(0, indexOfSSNotification), ...notifications.slice(indexOfSSNotification + 1)];\r\n\r\n // Store the updated list back to sessionStorage\r\n const updatedData = JSON.stringify(notifications);\r\n sessionStorage.setItem(SESSION_NOTIFICATIONS_UI, updatedData);\r\n } else {\r\n // dismiss notification in backend if not critical or warning, or else just in UI\r\n if (selectedNotification.severity === NotificationSeverity.Critical || selectedNotification.severity === NotificationSeverity.Warning) {\r\n const dismissedNotifications = sessionStorage.getItem(SESSION_DISMISSED_NOTIFICATIONS_BACKEND);\r\n\r\n let dismissedBackendNotificationInUI: string[] = [];\r\n if (dismissedNotifications) {\r\n dismissedBackendNotificationInUI = JSON.parse(dismissedNotifications);\r\n }\r\n // we donot dismiss backend notification but remove in UI\r\n dismissedBackendNotificationInUI.push(selectedNotification.id!);\r\n sessionStorage.setItem(SESSION_DISMISSED_NOTIFICATIONS_BACKEND, JSON.stringify(dismissedBackendNotificationInUI));\r\n } else {\r\n try {\r\n const body: DismissNotificationRequest = { notificationIds: [selectedNotification.id!] };\r\n await dismissNotifications(store.publisher?.id!, store.account?.id!, store.userContext!, body);\r\n } catch (e) {\r\n Log.error(`Failed to dismiss notifications: ${JSON.stringify(e)}`);\r\n }\r\n }\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { NotificationLabel, fetchBackendNotifications, getAppStore, mappingReasonsToLabels, onNotificationPanelItemsChanged } from '..';\r\nimport { Log } from '../../../logging/src';\r\nimport { INotificationCardItem } from '../../components/NotificationCard';\r\nimport { SESSION_DISMISSED_NOTIFICATIONS_BACKEND, SESSION_NOTIFICATIONS_UI } from '../../constants/AppConstants';\r\nimport { getBackendNotifications } from '../services/NotificationService';\r\nimport messages from './../../NotificationsPanel.Types.messages';\r\n\r\norchestrator(fetchBackendNotifications, async ({ intl }) => {\r\n const userContext = getAppStore().userContext;\r\n const publisher = getAppStore().publisher;\r\n const account = getAppStore().account;\r\n const dismissedNotifications = sessionStorage.getItem(SESSION_DISMISSED_NOTIFICATIONS_BACKEND);\r\n\r\n let dismissedBackendNotificationInUI: string[] = [];\r\n if (dismissedNotifications) {\r\n dismissedBackendNotificationInUI = JSON.parse(dismissedNotifications);\r\n }\r\n const { formatMessage } = intl;\r\n try {\r\n let notifications = await getBackendNotifications(publisher?.id!, account?.id!, userContext!);\r\n\r\n const existingNotifications = sessionStorage.getItem(SESSION_NOTIFICATIONS_UI);\r\n\r\n let existingNotificationsCollection: INotificationCardItem[] = [];\r\n if (existingNotifications) {\r\n existingNotificationsCollection = JSON.parse(existingNotifications);\r\n }\r\n if (dismissedBackendNotificationInUI && dismissedBackendNotificationInUI.length > 0) {\r\n notifications = notifications.filter((item) => !dismissedBackendNotificationInUI.includes(item.notificationId));\r\n }\r\n notifications.forEach((notification) => {\r\n const intlNotificationTitle = notification.notificationLabel + 'Title';\r\n const intlNotificationContent = notification.notificationLabel + 'Content';\r\n const notificationItem: INotificationCardItem = {\r\n id: notification.notificationId,\r\n title: messages[intlNotificationTitle] ? formatMessage(messages[intlNotificationTitle]) : notification.notificationTitle,\r\n content: messages[intlNotificationContent] ? formatMessage(messages[intlNotificationContent]) : notification.notificationContent,\r\n severity: notification.severity,\r\n timestamp: notification.lastModifiedDTime,\r\n notificationLabel: notification.notificationLabel,\r\n isUIGenerated: false,\r\n };\r\n if (notification.notificationLabel === NotificationLabel.PolicyUpdate) {\r\n const intlNotificationPrimaryActionLabel = notification.notificationLabel + 'PrimaryActionLabel';\r\n notificationItem.primaryActionText = messages[intlNotificationPrimaryActionLabel]\r\n ? formatMessage(messages[intlNotificationPrimaryActionLabel])\r\n : notification.notificationLabel;\r\n }\r\n if (notification.notificationLabel === NotificationLabel.PaymentFailed) {\r\n // get the property bag a dictionary of <string, string>\r\n const propertyBag = notification.propertyBag;\r\n const errorCode = propertyBag['errorCode'];\r\n const errorReason = propertyBag['errorReason'];\r\n\r\n // get the localized error message\\reason\\content\r\n // replace all the spaces in errorcode with empty string\r\n const errorCodeStr = errorCode.toString().replace(/\\s/g, '');\r\n const intlNotificationErrorReason = notification.notificationLabel + 'Reason_' + errorCodeStr;\r\n const intlNotificationErrorReasonTitle = notification.notificationLabel + 'Title_' + errorCodeStr;\r\n if (messages[intlNotificationErrorReasonTitle]) {\r\n notificationItem.title = formatMessage(messages[intlNotificationErrorReasonTitle]);\r\n }\r\n notificationItem.content = messages[intlNotificationErrorReason]\r\n ? formatMessage(messages[intlNotificationErrorReason])\r\n : errorReason;\r\n\r\n notificationItem.notificationLabel = mappingReasonsToLabels[intlNotificationErrorReason]\r\n ? mappingReasonsToLabels[intlNotificationErrorReason]\r\n : notificationItem.notificationLabel;\r\n\r\n // could_not_process could be for 2 reasons, Stripe or bank\r\n if (errorCodeStr === 'could_not_process' && errorReason.toString().contains('Stripe')) {\r\n const reason = notification.notificationLabel + 'ReasonStripe_' + errorCodeStr;\r\n if (messages[reason]) {\r\n notificationItem.content = messages[reason];\r\n notificationItem.notificationLabel = mappingReasonsToLabels[reason];\r\n }\r\n }\r\n\r\n // no_account could be for 2 reasons, not located or invalid\r\n if (errorCodeStr === 'no_account' && errorReason.toString().contains('located')) {\r\n const reason = notification.notificationLabel + 'ReasonLocate_' + errorCodeStr;\r\n if (messages[reason]) {\r\n notificationItem.content = messages[reason];\r\n notificationItem.notificationLabel = mappingReasonsToLabels[reason];\r\n }\r\n }\r\n }\r\n\r\n if (notification.notificationActions && notification.notificationActions.length > 0) {\r\n const primaryAction = notification.notificationActions[0];\r\n const intlNotificationPrimaryActionLabel = notification.notificationLabel + 'PrimaryActionLabel';\r\n notificationItem.primaryActionText = messages[intlNotificationPrimaryActionLabel]\r\n ? formatMessage(messages[intlNotificationPrimaryActionLabel])\r\n : primaryAction.text;\r\n notificationItem.primaryActionLink = primaryAction.url;\r\n if (notification.notificationActions.length > 1) {\r\n const secondaryAction = notification.notificationActions[1];\r\n const intlNotificationSecondaryActionLabel = notification.notificationLabel + 'SecondaryActionLabel';\r\n notificationItem.secondaryActionText = messages[intlNotificationSecondaryActionLabel]\r\n ? formatMessage(messages[intlNotificationSecondaryActionLabel])\r\n : secondaryAction.text;\r\n notificationItem.secondaryActionLink = secondaryAction.url;\r\n }\r\n }\r\n if (\r\n notification.notificationLabel === NotificationLabel.ClarityLinkDeclined ||\r\n notification.notificationLabel === NotificationLabel.ClarityLinkExpired\r\n ) {\r\n // get the property bag a dictionary of <object, object>\r\n if (notification.propertyBag) {\r\n const propertyBag = notification.propertyBag;\r\n const clarityId = propertyBag['clarityId'];\r\n const propertyName = propertyBag['propertyName'];\r\n\r\n notificationItem.title = messages[intlNotificationTitle]\r\n ? formatMessage(messages[intlNotificationTitle], { projectId: clarityId })\r\n : notification.notificationTitle;\r\n notificationItem.intlTitleMessageValues = { projectId: clarityId };\r\n\r\n notificationItem.content = messages[intlNotificationContent]\r\n ? formatMessage(messages[intlNotificationContent], { projectId: clarityId, propertyName: propertyName })\r\n : notification.notificationTitle;\r\n notificationItem.intlContentMessageValues = { projectId: clarityId, propertyName: propertyName };\r\n\r\n notificationItem.propertyBag = propertyBag;\r\n }\r\n }\r\n existingNotificationsCollection.push(notificationItem);\r\n });\r\n\r\n onNotificationPanelItemsChanged(existingNotificationsCollection);\r\n } catch (error) {\r\n Log.error(JSON.stringify(error));\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../logging/src';\r\nimport { DOMAIN_REDIRECTION_QUERY_PARAM, PUBCENTER_TYTHON_DOMAIN_MAPPING, TYTHON_DOMAIN_REDIRECTION_CACHE_KEY } from '../../constants';\r\nimport { onDoNotRenderDefaultPageChanged } from '../../pages/ad-management/@data/actions';\r\nimport { handleDomainRedirection } from '../actions';\r\n\r\norchestrator(handleDomainRedirection, ({ username, pathname }) => {\r\n onDoNotRenderDefaultPageChanged(true);\r\n Log.write('Initiating domain redirection for loginHint ' + username);\r\n\r\n sessionStorage.setItem(TYTHON_DOMAIN_REDIRECTION_CACHE_KEY, 'true');\r\n\r\n const newDomainOrigin = PUBCENTER_TYTHON_DOMAIN_MAPPING[window.location.host];\r\n let redirectUrl = `${newDomainOrigin}/login?${DOMAIN_REDIRECTION_QUERY_PARAM}=${username}`;\r\n if (pathname) {\r\n pathname = pathname.replace(/\\//, '');\r\n redirectUrl = `${newDomainOrigin}/${pathname}`;\r\n }\r\n Log.write('Redirecting to new domain: ' + redirectUrl);\r\n\r\n const iframe = document.getElementById('redirectionIframe') as HTMLIFrameElement;\r\n if (iframe && iframe.contentWindow) {\r\n iframe.contentWindow?.postMessage(JSON.stringify(localStorage), newDomainOrigin);\r\n }\r\n\r\n setTimeout(() => {\r\n window.location.href = redirectUrl;\r\n }, 4000);\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { onHelpInfoCalloutOpened, onHelpInfoChanged } from '../actions';\r\nimport { getHelpInfo } from '../services/HelpService';\r\n\r\nimport '../mutators/helpInfoChanged';\r\n\r\norchestrator(onHelpInfoCalloutOpened, async (msg) => {\r\n onHelpInfoChanged();\r\n const helpHtml = await getHelpInfo(msg.popupId, msg.locale);\r\n onHelpInfoChanged(helpHtml);\r\n});\r\n","import { ApiError, handleApiErrors, handleError } from '..';\r\nimport { EN_LOCALE_KEY } from '../../constants';\r\n\r\nexport async function getHelpInfo(id: string, locale?: string): Promise<string> {\r\n const helpUrl =\r\n process.env.REACT_APP_ENV === 'production'\r\n ? `https://help.pubcenter.microsoft.com/api/apexapi/?project=pubcenter_v4&language=${\r\n locale ?? EN_LOCALE_KEY\r\n }&method=popup&asRow=popup&Query=`\r\n : `https://help.si.pubcenter.microsoft.com/api/apexapi/?project=pubcenter_v4&language=${\r\n locale ?? EN_LOCALE_KEY\r\n }&method=popup&asRow=popup&Query=`;\r\n\r\n const url = helpUrl + encodeURIComponent(id) + '.htm';\r\n try {\r\n const response = await fetch(url);\r\n\r\n if (!response.ok) {\r\n return handleApiErrors(response, url);\r\n }\r\n\r\n const responseJson = await response.json();\r\n const htmlStr =\r\n process.env.REACT_APP_ENV === 'production'\r\n ? '<link rel=\"stylesheet\" type=\"text/css\" href=\"http://help.pubcenter.microsoft.com/resources/popup/styles/PopupStyles.min.css?v=2.00023\"/> '\r\n : '<link rel=\"stylesheet\" type=\"text/css\" href=\"http://help.si.pubcenter.microsoft.com/resources/popup/styles/PopupStyles.min.css?v=2.00023\"/> ';\r\n\r\n const helpContent = responseJson?.Content?.Content ?? `Couldn't load help content!!`;\r\n return htmlStr + helpContent;\r\n } catch (err) {\r\n const error = `helpInfo callout operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n","import { orchestrator } from 'satcheljs';\r\nimport { onNavigateBack } from '../actions';\r\n\r\norchestrator(onNavigateBack, msg => {\r\n if (msg.routeHistory && msg.returnUrl) {\r\n msg.routeHistory.push(msg.returnUrl);\r\n } else {\r\n window.history.back();\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { NOTIFICATION_DISMISS_TIMEOUT } from '../../constants/AppConstants';\r\nimport { onNotificationChanged, onNotificationRemoved } from '../actions';\r\n\r\norchestrator(onNotificationChanged, async (msg) => {\r\n if (!msg.notification.suppressAutoDismiss) {\r\n setTimeout(() => onNotificationRemoved(msg.notification), NOTIFICATION_DISMISS_TIMEOUT);\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { setAdUnitsData } from '../../pages/ad-management/Adunit/@data/mutatorActions';\r\nimport { setPropertyData } from '../../pages/ad-management/Property/Manage/__data__/mutatorActions';\r\nimport { onPublisherChanged } from '../actions';\r\nimport { Publisher } from '../store/schema';\r\nimport { StoragePublisherKey } from '../store/store';\r\n\r\norchestrator(onPublisherChanged, async (msg) => {\r\n // Clear ad units and properties cached data when publisher changes\r\n setAdUnitsData();\r\n setPropertyData();\r\n\r\n let publisher = msg.publisher;\r\n\r\n if (!publisher) {\r\n localStorage.removeItem(StoragePublisherKey);\r\n } else {\r\n // Create a new instance just with name and id, to avoid exposing sensitive publisher information through cache\r\n publisher = new Publisher(publisher.id, publisher.name);\r\n publisher.publisherTier = msg.publisher?.publisherTier;\r\n publisher.enableDefaultTythonV2Reporting = msg.publisher?.enableDefaultTythonV2Reporting;\r\n localStorage.setItem(StoragePublisherKey, JSON.stringify(publisher));\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Account, getEntity, isInternalUser, isTythonSelfServeUser, onAccountChanged, onUserContextChanged, PublisherTier } from '..';\r\nimport { Log } from '../../../logging/src/Log';\r\nimport { RouteName } from '../../pages/ad-management/@data';\r\nimport { onDoNotRenderDefaultPageChanged } from '../../pages/ad-management/@data/actions';\r\nimport { RoutePrefix } from '../../Routes';\r\nimport { isLocationPubCenter } from '../../utils/UrlUtils';\r\nimport {\r\n handleDomainRedirection,\r\n onLoadingChanged,\r\n onPublisherChanged,\r\n onPublisherSelected,\r\n redirectToReportingDashboard,\r\n} from '../actions';\r\nimport { setUserRolesInCache } from '../services/UserRoleService';\r\nimport { Publisher } from '../store/schema';\r\nimport { UserType } from '../store/schema/enums/UserType';\r\nimport { getAppStore } from '../store/store';\r\n\r\norchestrator(onPublisherSelected, async (msg) => {\r\n const { userContext, defaultPublisher } = getAppStore();\r\n const publisherId = parseInt(msg.id, 10);\r\n\r\n const isInternalUserLogin = isInternalUser();\r\n\r\n Log.debug(`Setting publisher context in store for Publisher: ${publisherId}`);\r\n\r\n if (!userContext || isNaN(publisherId)) {\r\n return;\r\n }\r\n\r\n let { publisher } = getAppStore();\r\n\r\n if (isInternalUserLogin && publisher && publisher.id === publisherId) {\r\n console.log('OnPublisherSelected - internal user, publisher context correctly set');\r\n return;\r\n }\r\n\r\n if (publisher && publisher.id === publisherId && publisher.publisherTier) {\r\n // If publisherTier not equal to SelfServe3rdParty, redirect to reporting dashboard\r\n if (publisher.publisherTier !== PublisherTier.SelfServe3rdParty) {\r\n console.log('OnPublisherSelected - Non-tython user, redirecting to reporting dashboard');\r\n redirectToReportingDashboard();\r\n return;\r\n }\r\n\r\n // If it's tython publisher and if userContext is correctly set, no need to reset it.\r\n if (publisher.publisherTier === PublisherTier.SelfServe3rdParty && isTythonSelfServeUser()) {\r\n Log.write('OnPublisherSelected - Tython user, publisher and user context correctly set');\r\n\r\n if (isLocationPubCenter()) {\r\n console.log('OnPublisherSelected - Tython user, redirecting to new domain');\r\n handleDomainRedirection(userContext?.userName ?? userContext.email);\r\n }\r\n return;\r\n }\r\n }\r\n\r\n onLoadingChanged(true);\r\n onDoNotRenderDefaultPageChanged(true);\r\n\r\n publisher = new Publisher(publisherId);\r\n\r\n try {\r\n publisher = (await getEntity([publisher], userContext)) as Publisher;\r\n publisher.className = new Publisher().className;\r\n\r\n if (publisher) {\r\n onPublisherChanged(publisher);\r\n\r\n /* To provide different user experience for Tython/self-serve publishers, leveraging the PublisherTier value.\r\n TODO post MVP: Remove this dependency on PublisherTier and set the userType flag based on user role\r\n defaultPublisher value is defined for external users who are mostly scoped to perform operations under a publisher shell */\r\n if (defaultPublisher && publisher.id === defaultPublisher && publisher.publisherTier === PublisherTier.SelfServe3rdParty) {\r\n if (isLocationPubCenter()) {\r\n handleDomainRedirection(userContext?.userName ?? userContext.email);\r\n }\r\n Log.write(\r\n `Recognised Tython self serve user. Updating userType to ${UserType.TythonSelfServe} and setting userRoles in cache, if not already set`\r\n );\r\n onUserContextChanged({ ...userContext, userType: UserType.TythonSelfServe });\r\n\r\n // Tython user is not recognised before this hence tython specific user role permissions are not set\r\n setUserRolesInCache(userContext.userRoles || [41]);\r\n\r\n if (publisher.defaultAccountId !== undefined) {\r\n const account = new Account(publisher.defaultAccountId);\r\n Log.write(`Setting the account to default account: ${publisher.defaultAccountId} `);\r\n onAccountChanged(account);\r\n }\r\n\r\n if (msg.routeHistory) {\r\n const homePageUrl = `/${RoutePrefix.adManagement}/${publisherId}/${RouteName.home}`;\r\n Log.write('Redirecting self-serve user to homepage');\r\n msg.routeHistory.push(homePageUrl);\r\n }\r\n } else if (defaultPublisher && publisher.id === defaultPublisher) {\r\n redirectToReportingDashboard();\r\n }\r\n } else {\r\n onPublisherChanged(undefined);\r\n }\r\n } catch (e) {\r\n Log.error('TODO: Error Handling for API Requests');\r\n } finally {\r\n onLoadingChanged(false);\r\n onDoNotRenderDefaultPageChanged(false);\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../logging/src';\r\nimport { uiConfig } from '../../config/ui.config';\r\nimport { onDoNotRenderDefaultPageChanged } from '../../pages/ad-management/@data/actions';\r\nimport { setUserPublisherContext } from '../../pages/report/@data/services/ReportService';\r\nimport { onAuthLogout, redirectToReportingDashboard } from '../actions';\r\nimport { getAppStore } from '../store/store';\r\nimport { isTythonSelfServeUser } from '../utils';\r\n\r\norchestrator(redirectToReportingDashboard, async () => {\r\n const { publisher, userContext, defaultPublisher } = getAppStore();\r\n\r\n if (userContext && publisher && publisher.id && publisher.id === defaultPublisher && !isTythonSelfServeUser()) {\r\n onDoNotRenderDefaultPageChanged(true);\r\n try {\r\n const commonSessionId = await setUserPublisherContext(userContext, publisher.id);\r\n window.location.replace(uiConfig.getReportingDashboardAddress(commonSessionId));\r\n } catch (e) {\r\n Log.write(`Recognized non-Tython MSA user, but failed to redirect to reporting dashboard.`);\r\n onAuthLogout();\r\n }\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport messages from '../../App.messages';\r\nimport { onNotificationChanged } from '../actions';\r\nimport { showTokenExpirationNotification } from '../actions/onTokenExpirationActions';\r\n\r\nconst EXPIRED_NOTIFICATION_SHOWN_STATE_KEY = 'isExpiredNotificationShown';\r\n\r\norchestrator(showTokenExpirationNotification, async () => {\r\n if ((window.history.state || {})[EXPIRED_NOTIFICATION_SHOWN_STATE_KEY]) {\r\n return;\r\n }\r\n\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.sessionExpiredLoginAgain,\r\n messageBarType: MessageBarType.info,\r\n });\r\n window.history.pushState({ [EXPIRED_NOTIFICATION_SHOWN_STATE_KEY]: true }, '');\r\n return;\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { onUserContextChanged } from '../actions';\r\nimport { getAppStore, StorageUserContextKey } from '../store/store';\r\n\r\norchestrator(onUserContextChanged, async (msg) => {\r\n const store = getAppStore();\r\n if (!store.userContext) {\r\n localStorage.clear();\r\n } else {\r\n localStorage.setItem(StorageUserContextKey, JSON.stringify(msg.userDetails));\r\n }\r\n});","export enum UserInvitationType {\r\n Default = 'Default',\r\n PubCenterSelfServeUser = 'PubCenterSelfServeUser'\r\n}\r\n","export enum UserType {\r\n // This flag can be used to provide different user experience for different user types\r\n TythonSelfServe = 1,\r\n}\r\n","/* eslint no-useless-escape: 0 */\r\nexport const DEFAULT_NON_TYTHON_TNC = `<html xmlns:v=\"urn:schemas-microsoft-com:vml\"\r\nxmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\nxmlns:w=\"urn:schemas-microsoft-com:office:word\"\r\nxmlns:m=\"http://schemas.microsoft.com/office/2004/12/omml\"\r\nxmlns=\"http://www.w3.org/TR/REC-html40\">\r\n\r\n<head>\r\n<meta http-equiv=Content-Type content=\"text/html; charset=utf-8\">\r\n<meta name=ProgId content=Word.Document>\r\n<meta name=Generator content=\"Microsoft Word 15\">\r\n<meta name=Originator content=\"Microsoft Word 15\">\r\n<link rel=File-List href=\"33333.fld/filelist.xml\">\r\n<link rel=Edit-Time-Data href=\"33333.fld/editdata.mso\">\r\n<!--[if !mso]>\r\n<style>\r\nv\\:* {behavior:url(#default#VML);}\r\no\\:* {behavior:url(#default#VML);}\r\nw\\:* {behavior:url(#default#VML);}\r\n.shape {behavior:url(#default#VML);}\r\n</style>\r\n<![endif]--><!--[if gte mso 9]><xml>\r\n <o:DocumentProperties>\r\n <o:Author>Aolin Yang</o:Author>\r\n <o:LastAuthor>Aolin Yang</o:LastAuthor>\r\n <o:Revision>3</o:Revision>\r\n <o:TotalTime>10</o:TotalTime>\r\n <o:Created>2023-04-21T22:54:00Z</o:Created>\r\n <o:LastSaved>2023-04-21T22:56:00Z</o:LastSaved>\r\n <o:Pages>1</o:Pages>\r\n <o:Words>8216</o:Words>\r\n <o:Characters>46834</o:Characters>\r\n <o:Lines>390</o:Lines>\r\n <o:Paragraphs>109</o:Paragraphs>\r\n <o:CharactersWithSpaces>54941</o:CharactersWithSpaces>\r\n <o:Version>16.00</o:Version>\r\n </o:DocumentProperties>\r\n <o:OfficeDocumentSettings>\r\n <o:AllowPNG/>\r\n </o:OfficeDocumentSettings>\r\n</xml><![endif]-->\r\n<link rel=themeData href=\"33333.fld/themedata.thmx\">\r\n<link rel=colorSchemeMapping href=\"33333.fld/colorschememapping.xml\">\r\n<!--[if gte mso 9]><xml>\r\n <w:WordDocument>\r\n <w:Zoom>150</w:Zoom>\r\n <w:SpellingState>Clean</w:SpellingState>\r\n <w:GrammarState>Clean</w:GrammarState>\r\n <w:TrackMoves>false</w:TrackMoves>\r\n <w:TrackFormatting/>\r\n <w:PunctuationKerning/>\r\n <w:ValidateAgainstSchemas/>\r\n <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>\r\n <w:IgnoreMixedContent>false</w:IgnoreMixedContent>\r\n <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>\r\n <w:DoNotPromoteQF/>\r\n <w:LidThemeOther>EN-US</w:LidThemeOther>\r\n <w:LidThemeAsian>ZH-CN</w:LidThemeAsian>\r\n <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>\r\n <w:Compatibility>\r\n <w:BreakWrappedTables/>\r\n <w:SnapToGridInCell/>\r\n <w:WrapTextWithPunct/>\r\n <w:UseAsianBreakRules/>\r\n <w:DontGrowAutofit/>\r\n <w:SplitPgBreakAndParaMark/>\r\n <w:EnableOpenTypeKerning/>\r\n <w:DontFlipMirrorIndents/>\r\n <w:OverrideTableStyleHps/>\r\n <w:UseFELayout/>\r\n </w:Compatibility>\r\n <m:mathPr>\r\n <m:mathFont m:val=\"Cambria Math\"/>\r\n <m:brkBin m:val=\"before\"/>\r\n <m:brkBinSub m:val=\"--\"/>\r\n <m:smallFrac m:val=\"off\"/>\r\n <m:dispDef/>\r\n <m:lMargin m:val=\"0\"/>\r\n <m:rMargin m:val=\"0\"/>\r\n <m:defJc m:val=\"centerGroup\"/>\r\n <m:wrapIndent m:val=\"1440\"/>\r\n <m:intLim m:val=\"subSup\"/>\r\n <m:naryLim m:val=\"undOvr\"/>\r\n </m:mathPr></w:WordDocument>\r\n</xml><![endif]--><!--[if gte mso 9]><xml>\r\n <w:LatentStyles DefLockedState=\"false\" DefUnhideWhenUsed=\"false\"\r\n DefSemiHidden=\"false\" DefQFormat=\"false\" DefPriority=\"99\"\r\n LatentStyleCount=\"376\">\r\n <w:LsdException Locked=\"false\" Priority=\"0\" QFormat=\"true\" Name=\"Normal\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"0\" QFormat=\"true\" Name=\"heading 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"0\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"heading 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"0\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"heading 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"0\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"heading 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"0\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"heading 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"0\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"heading 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"0\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"heading 7\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"0\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"heading 8\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"0\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"heading 9\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"index 1\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"index 2\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"index 3\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"index 4\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"index 5\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"index 6\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"index 7\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"index 8\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"index 9\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" Name=\"toc 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" Name=\"toc 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" Name=\"toc 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" Name=\"toc 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" Name=\"toc 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" Name=\"toc 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" Name=\"toc 7\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" Name=\"toc 8\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" Name=\"toc 9\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Normal Indent\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"footnote text\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"0\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" Name=\"annotation text\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"header\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"footer\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"index heading\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"35\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"caption\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"table of figures\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"envelope address\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"envelope return\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"footnote reference\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"annotation reference\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"line number\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"page number\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"endnote reference\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"endnote text\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"table of authorities\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"macro\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"toa heading\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List Bullet\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List Number\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List 2\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List 3\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List 4\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List 5\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List Bullet 2\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List Bullet 3\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List Bullet 4\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List Bullet 5\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List Number 2\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List Number 3\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List Number 4\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List Number 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"10\" QFormat=\"true\" Name=\"Title\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Closing\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Signature\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"1\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" Name=\"Default Paragraph Font\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Body Text\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Body Text Indent\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List Continue\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List Continue 2\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List Continue 3\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List Continue 4\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"List Continue 5\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Message Header\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"11\" QFormat=\"true\" Name=\"Subtitle\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Salutation\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Date\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Body Text First Indent\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Body Text First Indent 2\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Note Heading\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Body Text 2\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Body Text 3\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Body Text Indent 2\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Body Text Indent 3\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Block Text\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Hyperlink\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"FollowedHyperlink\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"22\" QFormat=\"true\" Name=\"Strong\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"20\" QFormat=\"true\" Name=\"Emphasis\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Document Map\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Plain Text\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"E-mail Signature\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"HTML Top of Form\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"HTML Bottom of Form\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Normal (Web)\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"HTML Acronym\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"HTML Address\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"HTML Cite\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"HTML Code\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"HTML Definition\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"HTML Keyboard\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"HTML Preformatted\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"HTML Sample\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"HTML Typewriter\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"HTML Variable\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Normal Table\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"annotation subject\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"No List\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Outline List 1\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Outline List 2\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Outline List 3\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Simple 1\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Simple 2\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Simple 3\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Classic 1\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Classic 2\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Classic 3\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Classic 4\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Colorful 1\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Colorful 2\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Colorful 3\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Columns 1\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Columns 2\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Columns 3\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Columns 4\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Columns 5\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Grid 1\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Grid 2\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Grid 3\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Grid 4\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Grid 5\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Grid 6\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Grid 7\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Grid 8\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table List 1\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table List 2\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table List 3\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table List 4\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table List 5\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table List 6\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table List 7\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table List 8\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table 3D effects 1\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table 3D effects 2\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table 3D effects 3\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Contemporary\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Elegant\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Professional\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Subtle 1\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Subtle 2\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Web 1\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Web 2\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Web 3\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Balloon Text\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"39\" Name=\"Table Grid\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Table Theme\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" Name=\"Placeholder Text\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"1\" QFormat=\"true\" Name=\"No Spacing\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"60\" Name=\"Light Shading\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"61\" Name=\"Light List\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"62\" Name=\"Light Grid\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"63\" Name=\"Medium Shading 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"64\" Name=\"Medium Shading 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"65\" Name=\"Medium List 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"66\" Name=\"Medium List 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"67\" Name=\"Medium Grid 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"68\" Name=\"Medium Grid 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"69\" Name=\"Medium Grid 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"70\" Name=\"Dark List\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"71\" Name=\"Colorful Shading\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"72\" Name=\"Colorful List\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"73\" Name=\"Colorful Grid\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"60\" Name=\"Light Shading Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"61\" Name=\"Light List Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"62\" Name=\"Light Grid Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"63\" Name=\"Medium Shading 1 Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"64\" Name=\"Medium Shading 2 Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"65\" Name=\"Medium List 1 Accent 1\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" Name=\"Revision\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"34\" QFormat=\"true\"\r\n Name=\"List Paragraph\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"29\" QFormat=\"true\" Name=\"Quote\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"30\" QFormat=\"true\"\r\n Name=\"Intense Quote\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"66\" Name=\"Medium List 2 Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"67\" Name=\"Medium Grid 1 Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"68\" Name=\"Medium Grid 2 Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"69\" Name=\"Medium Grid 3 Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"70\" Name=\"Dark List Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"71\" Name=\"Colorful Shading Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"72\" Name=\"Colorful List Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"73\" Name=\"Colorful Grid Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"60\" Name=\"Light Shading Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"61\" Name=\"Light List Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"62\" Name=\"Light Grid Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"63\" Name=\"Medium Shading 1 Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"64\" Name=\"Medium Shading 2 Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"65\" Name=\"Medium List 1 Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"66\" Name=\"Medium List 2 Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"67\" Name=\"Medium Grid 1 Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"68\" Name=\"Medium Grid 2 Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"69\" Name=\"Medium Grid 3 Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"70\" Name=\"Dark List Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"71\" Name=\"Colorful Shading Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"72\" Name=\"Colorful List Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"73\" Name=\"Colorful Grid Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"60\" Name=\"Light Shading Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"61\" Name=\"Light List Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"62\" Name=\"Light Grid Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"63\" Name=\"Medium Shading 1 Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"64\" Name=\"Medium Shading 2 Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"65\" Name=\"Medium List 1 Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"66\" Name=\"Medium List 2 Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"67\" Name=\"Medium Grid 1 Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"68\" Name=\"Medium Grid 2 Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"69\" Name=\"Medium Grid 3 Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"70\" Name=\"Dark List Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"71\" Name=\"Colorful Shading Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"72\" Name=\"Colorful List Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"73\" Name=\"Colorful Grid Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"60\" Name=\"Light Shading Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"61\" Name=\"Light List Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"62\" Name=\"Light Grid Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"63\" Name=\"Medium Shading 1 Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"64\" Name=\"Medium Shading 2 Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"65\" Name=\"Medium List 1 Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"66\" Name=\"Medium List 2 Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"67\" Name=\"Medium Grid 1 Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"68\" Name=\"Medium Grid 2 Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"69\" Name=\"Medium Grid 3 Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"70\" Name=\"Dark List Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"71\" Name=\"Colorful Shading Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"72\" Name=\"Colorful List Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"73\" Name=\"Colorful Grid Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"60\" Name=\"Light Shading Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"61\" Name=\"Light List Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"62\" Name=\"Light Grid Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"63\" Name=\"Medium Shading 1 Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"64\" Name=\"Medium Shading 2 Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"65\" Name=\"Medium List 1 Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"66\" Name=\"Medium List 2 Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"67\" Name=\"Medium Grid 1 Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"68\" Name=\"Medium Grid 2 Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"69\" Name=\"Medium Grid 3 Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"70\" Name=\"Dark List Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"71\" Name=\"Colorful Shading Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"72\" Name=\"Colorful List Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"73\" Name=\"Colorful Grid Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"60\" Name=\"Light Shading Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"61\" Name=\"Light List Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"62\" Name=\"Light Grid Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"63\" Name=\"Medium Shading 1 Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"64\" Name=\"Medium Shading 2 Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"65\" Name=\"Medium List 1 Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"66\" Name=\"Medium List 2 Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"67\" Name=\"Medium Grid 1 Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"68\" Name=\"Medium Grid 2 Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"69\" Name=\"Medium Grid 3 Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"70\" Name=\"Dark List Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"71\" Name=\"Colorful Shading Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"72\" Name=\"Colorful List Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"73\" Name=\"Colorful Grid Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"19\" QFormat=\"true\"\r\n Name=\"Subtle Emphasis\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"21\" QFormat=\"true\"\r\n Name=\"Intense Emphasis\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"31\" QFormat=\"true\"\r\n Name=\"Subtle Reference\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"32\" QFormat=\"true\"\r\n Name=\"Intense Reference\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"33\" QFormat=\"true\" Name=\"Book Title\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"37\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" Name=\"Bibliography\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\r\n UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"TOC Heading\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"41\" Name=\"Plain Table 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"42\" Name=\"Plain Table 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"43\" Name=\"Plain Table 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"44\" Name=\"Plain Table 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"45\" Name=\"Plain Table 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"40\" Name=\"Grid Table Light\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"46\" Name=\"Grid Table 1 Light\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"Grid Table 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"Grid Table 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"Grid Table 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"Grid Table 5 Dark\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"51\" Name=\"Grid Table 6 Colorful\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"52\" Name=\"Grid Table 7 Colorful\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"46\"\r\n Name=\"Grid Table 1 Light Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"Grid Table 2 Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"Grid Table 3 Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"Grid Table 4 Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"Grid Table 5 Dark Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"51\"\r\n Name=\"Grid Table 6 Colorful Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"52\"\r\n Name=\"Grid Table 7 Colorful Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"46\"\r\n Name=\"Grid Table 1 Light Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"Grid Table 2 Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"Grid Table 3 Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"Grid Table 4 Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"Grid Table 5 Dark Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"51\"\r\n Name=\"Grid Table 6 Colorful Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"52\"\r\n Name=\"Grid Table 7 Colorful Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"46\"\r\n Name=\"Grid Table 1 Light Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"Grid Table 2 Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"Grid Table 3 Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"Grid Table 4 Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"Grid Table 5 Dark Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"51\"\r\n Name=\"Grid Table 6 Colorful Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"52\"\r\n Name=\"Grid Table 7 Colorful Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"46\"\r\n Name=\"Grid Table 1 Light Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"Grid Table 2 Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"Grid Table 3 Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"Grid Table 4 Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"Grid Table 5 Dark Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"51\"\r\n Name=\"Grid Table 6 Colorful Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"52\"\r\n Name=\"Grid Table 7 Colorful Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"46\"\r\n Name=\"Grid Table 1 Light Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"Grid Table 2 Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"Grid Table 3 Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"Grid Table 4 Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"Grid Table 5 Dark Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"51\"\r\n Name=\"Grid Table 6 Colorful Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"52\"\r\n Name=\"Grid Table 7 Colorful Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"46\"\r\n Name=\"Grid Table 1 Light Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"Grid Table 2 Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"Grid Table 3 Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"Grid Table 4 Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"Grid Table 5 Dark Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"51\"\r\n Name=\"Grid Table 6 Colorful Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"52\"\r\n Name=\"Grid Table 7 Colorful Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"46\" Name=\"List Table 1 Light\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"List Table 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"List Table 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"List Table 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"List Table 5 Dark\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"51\" Name=\"List Table 6 Colorful\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"52\" Name=\"List Table 7 Colorful\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"46\"\r\n Name=\"List Table 1 Light Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"List Table 2 Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"List Table 3 Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"List Table 4 Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"List Table 5 Dark Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"51\"\r\n Name=\"List Table 6 Colorful Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"52\"\r\n Name=\"List Table 7 Colorful Accent 1\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"46\"\r\n Name=\"List Table 1 Light Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"List Table 2 Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"List Table 3 Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"List Table 4 Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"List Table 5 Dark Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"51\"\r\n Name=\"List Table 6 Colorful Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"52\"\r\n Name=\"List Table 7 Colorful Accent 2\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"46\"\r\n Name=\"List Table 1 Light Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"List Table 2 Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"List Table 3 Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"List Table 4 Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"List Table 5 Dark Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"51\"\r\n Name=\"List Table 6 Colorful Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"52\"\r\n Name=\"List Table 7 Colorful Accent 3\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"46\"\r\n Name=\"List Table 1 Light Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"List Table 2 Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"List Table 3 Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"List Table 4 Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"List Table 5 Dark Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"51\"\r\n Name=\"List Table 6 Colorful Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"52\"\r\n Name=\"List Table 7 Colorful Accent 4\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"46\"\r\n Name=\"List Table 1 Light Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"List Table 2 Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"List Table 3 Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"List Table 4 Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"List Table 5 Dark Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"51\"\r\n Name=\"List Table 6 Colorful Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"52\"\r\n Name=\"List Table 7 Colorful Accent 5\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"46\"\r\n Name=\"List Table 1 Light Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"List Table 2 Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"List Table 3 Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"List Table 4 Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"List Table 5 Dark Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"51\"\r\n Name=\"List Table 6 Colorful Accent 6\"/>\r\n <w:LsdException Locked=\"false\" Priority=\"52\"\r\n Name=\"List Table 7 Colorful Accent 6\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Mention\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Smart Hyperlink\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Hashtag\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Unresolved Mention\"/>\r\n <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\r\n Name=\"Smart Link\"/>\r\n </w:LatentStyles>\r\n</xml><![endif]-->\r\n<style>\r\n<!--\r\n /* Font Definitions */\r\n @font-face\r\n\t{font-family:\"Cambria Math\";\r\n\tpanose-1:2 4 5 3 5 4 6 3 2 4;\r\n\tmso-font-charset:0;\r\n\tmso-generic-font-family:roman;\r\n\tmso-font-pitch:variable;\r\n\tmso-font-signature:-536870145 1107305727 0 0 415 0;}\r\n@font-face\r\n\t{font-family:DengXian;\r\n\tpanose-1:2 1 6 0 3 1 1 1 1 1;\r\n\tmso-font-alt:ç‰çº¿;\r\n\tmso-font-charset:134;\r\n\tmso-generic-font-family:auto;\r\n\tmso-font-pitch:variable;\r\n\tmso-font-signature:-1610612033 953122042 22 0 262159 0;}\r\n@font-face\r\n\t{font-family:Calibri;\r\n\tpanose-1:2 15 5 2 2 2 4 3 2 4;\r\n\tmso-font-charset:0;\r\n\tmso-generic-font-family:swiss;\r\n\tmso-font-pitch:variable;\r\n\tmso-font-signature:-469750017 -1073732485 9 0 511 0;}\r\n@font-face\r\n\t{font-family:\"\\@DengXian\";\r\n\tpanose-1:2 1 6 0 3 1 1 1 1 1;\r\n\tmso-font-charset:134;\r\n\tmso-generic-font-family:auto;\r\n\tmso-font-pitch:variable;\r\n\tmso-font-signature:-1610612033 953122042 22 0 262159 0;}\r\n /* Style Definitions */\r\n p.MsoNormal, li.MsoNormal, div.MsoNormal\r\n\t{mso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-parent:\"\";\r\n\tmargin-top:0in;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:8.0pt;\r\n\tmargin-left:0in;\r\n\tline-height:107%;\r\n\tmso-pagination:widow-orphan;\r\n\tfont-size:11.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-ascii-font-family:Calibri;\r\n\tmso-ascii-theme-font:minor-latin;\r\n\tmso-fareast-font-family:Calibri;\r\n\tmso-fareast-theme-font:minor-latin;\r\n\tmso-hansi-font-family:Calibri;\r\n\tmso-hansi-theme-font:minor-latin;\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-bidi-theme-font:minor-bidi;\r\n\tmso-fareast-language:EN-US;}\r\nh1\r\n\t{mso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-link:\"Heading 1 Char\";\r\n\tmso-style-next:Normal;\r\n\tmargin-top:12.0pt;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:12.0pt;\r\n\tmargin-left:.5in;\r\n\ttext-align:justify;\r\n\ttext-justify:inter-ideograph;\r\n\ttext-indent:0in;\r\n\tmso-pagination:none;\r\n\tmso-outline-level:1;\r\n\tmso-list:l1 level1 lfo2;\r\n\ttab-stops:1.0in;\r\n\tfont-size:11.0pt;\r\n\tmso-bidi-font-size:12.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-ascii-font-family:Calibri;\r\n\tmso-ascii-theme-font:minor-latin;\r\n\tmso-hansi-font-family:Calibri;\r\n\tmso-hansi-theme-font:minor-latin;\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-bidi-theme-font:minor-bidi;\r\n\ttext-transform:uppercase;\r\n\tmso-font-kerning:0pt;\r\n\tmso-fareast-language:EN-US;\r\n\tmso-bidi-font-weight:normal;}\r\nh2\r\n\t{mso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-parent:\"\";\r\n\tmso-style-link:\"Heading 2 Char\";\r\n\tmargin-top:6.0pt;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:6.0pt;\r\n\tmargin-left:27.0pt;\r\n\ttext-align:justify;\r\n\ttext-justify:inter-ideograph;\r\n\ttext-indent:-.25in;\r\n\tmso-pagination:widow-orphan;\r\n\tmso-outline-level:2;\r\n\tmso-list:l1 level2 lfo2;\r\n\tmso-layout-grid-align:none;\r\n\tfont-size:11.0pt;\r\n\tmso-bidi-font-size:14.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-bidi-font-family:Arial;\r\n\tmso-fareast-language:EN-US;\r\n\tmso-bidi-font-style:italic;}\r\nh3\r\n\t{mso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-parent:\"Heading 2\";\r\n\tmso-style-link:\"Heading 3 Char\";\r\n\tmargin-top:6.0pt;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:12.0pt;\r\n\tmargin-left:49.5pt;\r\n\ttext-align:justify;\r\n\ttext-justify:inter-ideograph;\r\n\ttext-indent:-.25in;\r\n\tmso-pagination:widow-orphan;\r\n\tmso-outline-level:3;\r\n\tmso-list:l1 level3 lfo2;\r\n\ttab-stops:45.0pt;\r\n\tmso-layout-grid-align:none;\r\n\tfont-size:11.0pt;\r\n\tmso-bidi-font-size:12.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-font-kerning:16.0pt;\r\n\tmso-fareast-language:EN-US;\r\n\tfont-weight:normal;\r\n\tmso-bidi-font-weight:bold;\r\n\tmso-bidi-font-style:italic;\r\n\ttext-decoration:underline;\r\n\ttext-underline:single;}\r\nh4\r\n\t{mso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-link:\"Heading 4 Char\";\r\n\tmso-style-next:Normal;\r\n\tmargin-top:0in;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:6.0pt;\r\n\tmargin-left:175.5pt;\r\n\ttext-align:justify;\r\n\ttext-justify:inter-ideograph;\r\n\ttext-indent:-.25in;\r\n\tmso-pagination:widow-orphan;\r\n\tmso-outline-level:4;\r\n\tmso-list:l1 level4 lfo2;\r\n\tmso-layout-grid-align:none;\r\n\tfont-size:11.0pt;\r\n\tmso-bidi-font-size:14.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-fareast-language:EN-US;\r\n\tfont-weight:normal;\r\n\tmso-bidi-font-weight:bold;}\r\nh5\r\n\t{mso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-link:\"Heading 5 Char\";\r\n\tmso-style-next:Normal;\r\n\tmargin-top:0in;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:12.0pt;\r\n\tmargin-left:1.25in;\r\n\ttext-align:justify;\r\n\ttext-justify:inter-ideograph;\r\n\ttext-indent:-.25in;\r\n\tmso-pagination:widow-orphan;\r\n\tmso-outline-level:5;\r\n\tmso-list:l1 level5 lfo2;\r\n\tmso-layout-grid-align:none;\r\n\tfont-size:11.0pt;\r\n\tmso-bidi-font-size:13.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-fareast-language:EN-US;\r\n\tfont-weight:normal;\r\n\tmso-bidi-font-weight:bold;\r\n\tmso-bidi-font-style:italic;}\r\nh6\r\n\t{mso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-link:\"Heading 6 Char\";\r\n\tmso-style-next:Normal;\r\n\tmargin-top:0in;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:12.0pt;\r\n\tmargin-left:1.5in;\r\n\ttext-align:justify;\r\n\ttext-justify:inter-ideograph;\r\n\ttext-indent:-.25in;\r\n\tmso-pagination:widow-orphan;\r\n\tmso-outline-level:6;\r\n\tmso-list:l1 level6 lfo2;\r\n\tmso-layout-grid-align:none;\r\n\tfont-size:11.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-fareast-language:EN-US;\r\n\tfont-weight:normal;\r\n\tmso-bidi-font-weight:bold;}\r\np.MsoHeading7, li.MsoHeading7, div.MsoHeading7\r\n\t{mso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-link:\"Heading 7 Char\";\r\n\tmso-style-next:Normal;\r\n\tmargin-top:0in;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:12.0pt;\r\n\tmargin-left:1.75in;\r\n\ttext-align:justify;\r\n\ttext-justify:inter-ideograph;\r\n\ttext-indent:-.25in;\r\n\tmso-pagination:widow-orphan;\r\n\tmso-outline-level:7;\r\n\tmso-list:l1 level7 lfo2;\r\n\tmso-layout-grid-align:none;\r\n\tfont-size:10.0pt;\r\n\tmso-bidi-font-size:12.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-fareast-language:EN-US;}\r\np.MsoHeading8, li.MsoHeading8, div.MsoHeading8\r\n\t{mso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-link:\"Heading 8 Char\";\r\n\tmso-style-next:Normal;\r\n\tmargin-top:0in;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:12.0pt;\r\n\tmargin-left:2.0in;\r\n\ttext-align:justify;\r\n\ttext-justify:inter-ideograph;\r\n\ttext-indent:-.25in;\r\n\tmso-pagination:widow-orphan;\r\n\tmso-outline-level:8;\r\n\tmso-list:l1 level8 lfo2;\r\n\tmso-layout-grid-align:none;\r\n\tfont-size:10.0pt;\r\n\tmso-bidi-font-size:12.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-fareast-language:EN-US;\r\n\tmso-bidi-font-style:italic;}\r\np.MsoHeading9, li.MsoHeading9, div.MsoHeading9\r\n\t{mso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-link:\"Heading 9 Char\";\r\n\tmso-style-next:Normal;\r\n\tmargin-top:0in;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:12.0pt;\r\n\tmargin-left:2.25in;\r\n\ttext-align:justify;\r\n\ttext-justify:inter-ideograph;\r\n\ttext-indent:-.25in;\r\n\tmso-pagination:widow-orphan;\r\n\tmso-outline-level:9;\r\n\tmso-list:l1 level9 lfo2;\r\n\tmso-layout-grid-align:none;\r\n\tfont-size:9.0pt;\r\n\tmso-bidi-font-size:11.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-bidi-font-family:Arial;\r\n\tmso-fareast-language:EN-US;}\r\np.MsoCommentText, li.MsoCommentText, div.MsoCommentText\r\n\t{mso-style-link:\"Comment Text Char\";\r\n\tmargin-top:0in;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:8.0pt;\r\n\tmargin-left:0in;\r\n\tmso-pagination:widow-orphan;\r\n\tfont-size:10.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-ascii-font-family:Calibri;\r\n\tmso-ascii-theme-font:minor-latin;\r\n\tmso-fareast-font-family:Calibri;\r\n\tmso-fareast-theme-font:minor-latin;\r\n\tmso-hansi-font-family:Calibri;\r\n\tmso-hansi-theme-font:minor-latin;\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-bidi-theme-font:minor-bidi;\r\n\tmso-fareast-language:EN-US;}\r\np.MsoFooter, li.MsoFooter, div.MsoFooter\r\n\t{mso-style-priority:99;\r\n\tmso-style-link:\"Footer Char\";\r\n\tmargin:0in;\r\n\tmso-pagination:widow-orphan;\r\n\ttab-stops:center 3.25in right 6.5in;\r\n\tfont-size:11.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-ascii-font-family:Calibri;\r\n\tmso-ascii-theme-font:minor-latin;\r\n\tmso-fareast-font-family:Calibri;\r\n\tmso-fareast-theme-font:minor-latin;\r\n\tmso-hansi-font-family:Calibri;\r\n\tmso-hansi-theme-font:minor-latin;\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-bidi-theme-font:minor-bidi;\r\n\tmso-fareast-language:EN-US;}\r\na:link, span.MsoHyperlink\r\n\t{mso-style-priority:99;\r\n\tcolor:blue;\r\n\ttext-decoration:underline;\r\n\ttext-underline:single;}\r\na:visited, span.MsoHyperlinkFollowed\r\n\t{mso-style-noshow:yes;\r\n\tmso-style-priority:99;\r\n\tcolor:#954F72;\r\n\tmso-themecolor:followedhyperlink;\r\n\ttext-decoration:underline;\r\n\ttext-underline:single;}\r\np.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph\r\n\t{mso-style-priority:34;\r\n\tmso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmargin-top:0in;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:8.0pt;\r\n\tmargin-left:.5in;\r\n\tmso-add-space:auto;\r\n\tline-height:107%;\r\n\tmso-pagination:widow-orphan;\r\n\tfont-size:11.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-ascii-font-family:Calibri;\r\n\tmso-ascii-theme-font:minor-latin;\r\n\tmso-fareast-font-family:Calibri;\r\n\tmso-fareast-theme-font:minor-latin;\r\n\tmso-hansi-font-family:Calibri;\r\n\tmso-hansi-theme-font:minor-latin;\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-bidi-theme-font:minor-bidi;\r\n\tmso-fareast-language:EN-US;}\r\np.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst\r\n\t{mso-style-priority:34;\r\n\tmso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-type:export-only;\r\n\tmargin-top:0in;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:0in;\r\n\tmargin-left:.5in;\r\n\tmso-add-space:auto;\r\n\tline-height:107%;\r\n\tmso-pagination:widow-orphan;\r\n\tfont-size:11.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-ascii-font-family:Calibri;\r\n\tmso-ascii-theme-font:minor-latin;\r\n\tmso-fareast-font-family:Calibri;\r\n\tmso-fareast-theme-font:minor-latin;\r\n\tmso-hansi-font-family:Calibri;\r\n\tmso-hansi-theme-font:minor-latin;\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-bidi-theme-font:minor-bidi;\r\n\tmso-fareast-language:EN-US;}\r\np.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle\r\n\t{mso-style-priority:34;\r\n\tmso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-type:export-only;\r\n\tmargin-top:0in;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:0in;\r\n\tmargin-left:.5in;\r\n\tmso-add-space:auto;\r\n\tline-height:107%;\r\n\tmso-pagination:widow-orphan;\r\n\tfont-size:11.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-ascii-font-family:Calibri;\r\n\tmso-ascii-theme-font:minor-latin;\r\n\tmso-fareast-font-family:Calibri;\r\n\tmso-fareast-theme-font:minor-latin;\r\n\tmso-hansi-font-family:Calibri;\r\n\tmso-hansi-theme-font:minor-latin;\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-bidi-theme-font:minor-bidi;\r\n\tmso-fareast-language:EN-US;}\r\np.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast\r\n\t{mso-style-priority:34;\r\n\tmso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-type:export-only;\r\n\tmargin-top:0in;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:8.0pt;\r\n\tmargin-left:.5in;\r\n\tmso-add-space:auto;\r\n\tline-height:107%;\r\n\tmso-pagination:widow-orphan;\r\n\tfont-size:11.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-ascii-font-family:Calibri;\r\n\tmso-ascii-theme-font:minor-latin;\r\n\tmso-fareast-font-family:Calibri;\r\n\tmso-fareast-theme-font:minor-latin;\r\n\tmso-hansi-font-family:Calibri;\r\n\tmso-hansi-theme-font:minor-latin;\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-bidi-theme-font:minor-bidi;\r\n\tmso-fareast-language:EN-US;}\r\nspan.Heading1Char\r\n\t{mso-style-name:\"Heading 1 Char\";\r\n\tmso-style-unhide:no;\r\n\tmso-style-locked:yes;\r\n\tmso-style-link:\"Heading 1\";\r\n\tmso-ansi-font-size:11.0pt;\r\n\ttext-transform:uppercase;\r\n\tmso-font-kerning:0pt;\r\n\tmso-ligatures:none;\r\n\tmso-fareast-language:EN-US;\r\n\tfont-weight:bold;\r\n\tmso-bidi-font-weight:normal;}\r\nspan.Heading2Char\r\n\t{mso-style-name:\"Heading 2 Char\";\r\n\tmso-style-unhide:no;\r\n\tmso-style-locked:yes;\r\n\tmso-style-link:\"Heading 2\";\r\n\tmso-ansi-font-size:11.0pt;\r\n\tmso-bidi-font-size:14.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-ascii-font-family:Calibri;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-hansi-font-family:Calibri;\r\n\tmso-bidi-font-family:Arial;\r\n\tmso-font-kerning:0pt;\r\n\tmso-ligatures:none;\r\n\tmso-fareast-language:EN-US;\r\n\tfont-weight:bold;\r\n\tmso-bidi-font-style:italic;}\r\nspan.Heading3Char\r\n\t{mso-style-name:\"Heading 3 Char\";\r\n\tmso-style-unhide:no;\r\n\tmso-style-locked:yes;\r\n\tmso-style-link:\"Heading 3\";\r\n\tmso-ansi-font-size:11.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-ascii-font-family:Calibri;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-hansi-font-family:Calibri;\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-font-kerning:16.0pt;\r\n\tmso-ligatures:none;\r\n\tmso-fareast-language:EN-US;\r\n\tmso-bidi-font-weight:bold;\r\n\tmso-bidi-font-style:italic;\r\n\ttext-decoration:underline;\r\n\ttext-underline:single;}\r\nspan.Heading4Char\r\n\t{mso-style-name:\"Heading 4 Char\";\r\n\tmso-style-unhide:no;\r\n\tmso-style-locked:yes;\r\n\tmso-style-link:\"Heading 4\";\r\n\tmso-ansi-font-size:11.0pt;\r\n\tmso-bidi-font-size:14.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-ascii-font-family:Calibri;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-hansi-font-family:Calibri;\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-font-kerning:0pt;\r\n\tmso-ligatures:none;\r\n\tmso-fareast-language:EN-US;\r\n\tmso-bidi-font-weight:bold;}\r\nspan.Heading5Char\r\n\t{mso-style-name:\"Heading 5 Char\";\r\n\tmso-style-unhide:no;\r\n\tmso-style-locked:yes;\r\n\tmso-style-link:\"Heading 5\";\r\n\tmso-ansi-font-size:11.0pt;\r\n\tmso-bidi-font-size:13.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-ascii-font-family:Calibri;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-hansi-font-family:Calibri;\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-font-kerning:0pt;\r\n\tmso-ligatures:none;\r\n\tmso-fareast-language:EN-US;\r\n\tmso-bidi-font-weight:bold;\r\n\tmso-bidi-font-style:italic;}\r\nspan.Heading6Char\r\n\t{mso-style-name:\"Heading 6 Char\";\r\n\tmso-style-unhide:no;\r\n\tmso-style-locked:yes;\r\n\tmso-style-link:\"Heading 6\";\r\n\tmso-ansi-font-size:11.0pt;\r\n\tmso-bidi-font-size:11.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-ascii-font-family:Calibri;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-hansi-font-family:Calibri;\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-font-kerning:0pt;\r\n\tmso-ligatures:none;\r\n\tmso-fareast-language:EN-US;\r\n\tmso-bidi-font-weight:bold;}\r\nspan.Heading7Char\r\n\t{mso-style-name:\"Heading 7 Char\";\r\n\tmso-style-unhide:no;\r\n\tmso-style-locked:yes;\r\n\tmso-style-link:\"Heading 7\";\r\n\tmso-ansi-font-size:10.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-ascii-font-family:Calibri;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-hansi-font-family:Calibri;\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-font-kerning:0pt;\r\n\tmso-ligatures:none;\r\n\tmso-fareast-language:EN-US;}\r\nspan.Heading8Char\r\n\t{mso-style-name:\"Heading 8 Char\";\r\n\tmso-style-unhide:no;\r\n\tmso-style-locked:yes;\r\n\tmso-style-link:\"Heading 8\";\r\n\tmso-ansi-font-size:10.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-ascii-font-family:Calibri;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-hansi-font-family:Calibri;\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-font-kerning:0pt;\r\n\tmso-ligatures:none;\r\n\tmso-fareast-language:EN-US;\r\n\tmso-bidi-font-style:italic;}\r\nspan.Heading9Char\r\n\t{mso-style-name:\"Heading 9 Char\";\r\n\tmso-style-unhide:no;\r\n\tmso-style-locked:yes;\r\n\tmso-style-link:\"Heading 9\";\r\n\tmso-ansi-font-size:9.0pt;\r\n\tmso-bidi-font-size:11.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-ascii-font-family:Calibri;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-hansi-font-family:Calibri;\r\n\tmso-bidi-font-family:Arial;\r\n\tmso-font-kerning:0pt;\r\n\tmso-ligatures:none;\r\n\tmso-fareast-language:EN-US;}\r\nspan.CommentTextChar\r\n\t{mso-style-name:\"Comment Text Char\";\r\n\tmso-style-unhide:no;\r\n\tmso-style-locked:yes;\r\n\tmso-style-link:\"Comment Text\";\r\n\tmso-ansi-font-size:10.0pt;\r\n\tmso-bidi-font-size:10.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-fareast-font-family:Calibri;\r\n\tmso-fareast-theme-font:minor-latin;\r\n\tmso-font-kerning:0pt;\r\n\tmso-ligatures:none;\r\n\tmso-fareast-language:EN-US;}\r\nspan.FooterChar\r\n\t{mso-style-name:\"Footer Char\";\r\n\tmso-style-priority:99;\r\n\tmso-style-unhide:no;\r\n\tmso-style-locked:yes;\r\n\tmso-style-link:Footer;\r\n\tmso-ansi-font-size:11.0pt;\r\n\tmso-bidi-font-size:11.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-fareast-font-family:Calibri;\r\n\tmso-fareast-theme-font:minor-latin;\r\n\tmso-font-kerning:0pt;\r\n\tmso-ligatures:none;\r\n\tmso-fareast-language:EN-US;}\r\np.OutHead1, li.OutHead1, div.OutHead1\r\n\t{mso-style-name:OutHead1;\r\n\tmso-style-priority:1;\r\n\tmso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-next:Normal;\r\n\tmargin-top:6.0pt;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:0in;\r\n\tmargin-left:.5in;\r\n\ttext-align:justify;\r\n\ttext-justify:inter-ideograph;\r\n\ttext-indent:-.5in;\r\n\tmso-pagination:widow-orphan;\r\n\tmso-outline-level:1;\r\n\tmso-list:l2 level1 lfo1;\r\n\ttab-stops:list .5in;\r\n\tfont-size:11.0pt;\r\n\tmso-bidi-font-size:10.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tcolor:black;\r\n\tmso-fareast-language:EN-US;}\r\np.OutHead2, li.OutHead2, div.OutHead2\r\n\t{mso-style-name:OutHead2;\r\n\tmso-style-priority:1;\r\n\tmso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-next:Normal;\r\n\tmargin-top:6.0pt;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:0in;\r\n\tmargin-left:.5in;\r\n\ttext-align:justify;\r\n\ttext-justify:inter-ideograph;\r\n\ttext-indent:-.5in;\r\n\tmso-pagination:widow-orphan;\r\n\tmso-outline-level:2;\r\n\tmso-list:l2 level2 lfo1;\r\n\ttab-stops:list .5in;\r\n\tfont-size:11.0pt;\r\n\tmso-bidi-font-size:10.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tcolor:black;\r\n\tmso-fareast-language:EN-US;}\r\np.OutHead3, li.OutHead3, div.OutHead3\r\n\t{mso-style-name:OutHead3;\r\n\tmso-style-priority:1;\r\n\tmso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-next:Normal;\r\n\tmargin-top:6.0pt;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:0in;\r\n\tmargin-left:1.0in;\r\n\ttext-align:justify;\r\n\ttext-justify:inter-ideograph;\r\n\ttext-indent:-.5in;\r\n\tmso-pagination:widow-orphan;\r\n\tmso-outline-level:3;\r\n\tmso-list:l2 level3 lfo1;\r\n\ttab-stops:list 1.0in;\r\n\tfont-size:11.0pt;\r\n\tmso-bidi-font-size:10.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tcolor:black;\r\n\tmso-fareast-language:EN-US;}\r\np.OutHead4, li.OutHead4, div.OutHead4\r\n\t{mso-style-name:OutHead4;\r\n\tmso-style-priority:1;\r\n\tmso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-next:Normal;\r\n\tmargin-top:0in;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:12.0pt;\r\n\tmargin-left:1.0in;\r\n\ttext-indent:-.25in;\r\n\tmso-pagination:widow-orphan;\r\n\tpage-break-after:avoid;\r\n\tmso-outline-level:4;\r\n\tmso-list:l2 level4 lfo1;\r\n\ttab-stops:list 1.0in;\r\n\tfont-size:11.0pt;\r\n\tmso-bidi-font-size:10.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tcolor:black;\r\n\tmso-fareast-language:EN-US;\r\n\tfont-weight:bold;\r\n\tmso-bidi-font-weight:normal;}\r\np.OutHead5, li.OutHead5, div.OutHead5\r\n\t{mso-style-name:OutHead5;\r\n\tmso-style-priority:1;\r\n\tmso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-next:Normal;\r\n\tmargin-top:0in;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:12.0pt;\r\n\tmargin-left:2.5in;\r\n\ttext-indent:-.5in;\r\n\tmso-pagination:widow-orphan;\r\n\tpage-break-after:avoid;\r\n\tmso-outline-level:5;\r\n\tmso-list:l2 level5 lfo1;\r\n\ttab-stops:list 2.5in;\r\n\tfont-size:11.0pt;\r\n\tmso-bidi-font-size:10.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tcolor:black;\r\n\tmso-fareast-language:EN-US;\r\n\tfont-weight:bold;\r\n\tmso-bidi-font-weight:normal;}\r\np.OutHead6, li.OutHead6, div.OutHead6\r\n\t{mso-style-name:OutHead6;\r\n\tmso-style-priority:1;\r\n\tmso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-next:Normal;\r\n\tmargin-top:0in;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:12.0pt;\r\n\tmargin-left:3.0in;\r\n\ttext-indent:-.5in;\r\n\tmso-pagination:widow-orphan;\r\n\tpage-break-after:avoid;\r\n\tmso-outline-level:6;\r\n\tmso-list:l2 level6 lfo1;\r\n\ttab-stops:list 3.0in;\r\n\tfont-size:11.0pt;\r\n\tmso-bidi-font-size:10.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tcolor:black;\r\n\tmso-fareast-language:EN-US;\r\n\tfont-weight:bold;\r\n\tmso-bidi-font-weight:normal;}\r\np.OutHead7, li.OutHead7, div.OutHead7\r\n\t{mso-style-name:OutHead7;\r\n\tmso-style-priority:1;\r\n\tmso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-next:Normal;\r\n\tmargin-top:0in;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:12.0pt;\r\n\tmargin-left:3.5in;\r\n\ttext-indent:-.5in;\r\n\tmso-pagination:widow-orphan;\r\n\tpage-break-after:avoid;\r\n\tmso-outline-level:7;\r\n\tmso-list:l2 level7 lfo1;\r\n\ttab-stops:list 3.5in;\r\n\tfont-size:11.0pt;\r\n\tmso-bidi-font-size:10.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tcolor:black;\r\n\tmso-fareast-language:EN-US;\r\n\tfont-weight:bold;\r\n\tmso-bidi-font-weight:normal;}\r\np.OutHead8, li.OutHead8, div.OutHead8\r\n\t{mso-style-name:OutHead8;\r\n\tmso-style-priority:1;\r\n\tmso-style-unhide:no;\r\n\tmso-style-qformat:yes;\r\n\tmso-style-next:Normal;\r\n\tmargin-top:0in;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:12.0pt;\r\n\tmargin-left:4.0in;\r\n\ttext-indent:-.5in;\r\n\tmso-pagination:widow-orphan;\r\n\tpage-break-after:avoid;\r\n\tmso-outline-level:8;\r\n\tmso-list:l2 level8 lfo1;\r\n\ttab-stops:list 4.0in;\r\n\tfont-size:11.0pt;\r\n\tmso-bidi-font-size:10.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-fareast-font-family:\"Times New Roman\";\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tcolor:black;\r\n\tmso-fareast-language:EN-US;\r\n\tfont-weight:bold;\r\n\tmso-bidi-font-weight:normal;}\r\nspan.normaltextrun\r\n\t{mso-style-name:normaltextrun;\r\n\tmso-style-priority:1;\r\n\tmso-style-unhide:no;}\r\nspan.eop\r\n\t{mso-style-name:eop;\r\n\tmso-style-priority:1;\r\n\tmso-style-unhide:no;}\r\nspan.SpellE\r\n\t{mso-style-name:\"\";\r\n\tmso-spl-e:yes;}\r\nspan.GramE\r\n\t{mso-style-name:\"\";\r\n\tmso-gram-e:yes;}\r\n.MsoChpDefault\r\n\t{mso-style-type:export-only;\r\n\tmso-default-props:yes;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-ascii-font-family:Calibri;\r\n\tmso-ascii-theme-font:minor-latin;\r\n\tmso-fareast-font-family:DengXian;\r\n\tmso-fareast-theme-font:minor-fareast;\r\n\tmso-hansi-font-family:Calibri;\r\n\tmso-hansi-theme-font:minor-latin;\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-bidi-theme-font:minor-bidi;}\r\n /* Page Definitions */\r\n @page\r\n\t{mso-footnote-separator:url(\"33333.fld/header.html\") fs;\r\n\tmso-footnote-continuation-separator:url(\"33333.fld/header.html\") fcs;\r\n\tmso-endnote-separator:url(\"33333.fld/header.html\") es;\r\n\tmso-endnote-continuation-separator:url(\"33333.fld/header.html\") ecs;}\r\n@page WordSection1\r\n\t{size:8.5in 11.0in;\r\n\tmargin:1.0in 1.0in 1.0in 1.0in;\r\n\tmso-header-margin:.5in;\r\n\tmso-footer-margin:.5in;\r\n\tmso-even-footer:url(\"33333.fld/header.html\") ef1;\r\n\tmso-footer:url(\"33333.fld/header.html\") f1;\r\n\tmso-first-footer:url(\"33333.fld/header.html\") ff1;\r\n\tmso-paper-source:0;}\r\ndiv.WordSection1\r\n\t{page:WordSection1;}\r\n /* List Definitions */\r\n @list l0\r\n\t{mso-list-id:255947117;\r\n\tmso-list-type:hybrid;\r\n\tmso-list-template-ids:1311002444 796035260 -1765366880 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}\r\n@list l0:level1\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-text:\"%1\\)\";\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:1.0in;\r\n\ttext-indent:-.5in;}\r\n@list l0:level2\r\n\t{mso-level-number-format:alpha-lower;\r\n\tmso-level-text:\"%2\\)\";\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:92.0pt;\r\n\ttext-indent:-20.0pt;\r\n\tmso-ansi-font-weight:bold;}\r\n@list l0:level3\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:right;\r\n\tmargin-left:1.75in;\r\n\ttext-indent:-9.0pt;}\r\n@list l0:level4\r\n\t{mso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:2.25in;\r\n\ttext-indent:-.25in;}\r\n@list l0:level5\r\n\t{mso-level-number-format:alpha-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:2.75in;\r\n\ttext-indent:-.25in;}\r\n@list l0:level6\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:right;\r\n\tmargin-left:3.25in;\r\n\ttext-indent:-9.0pt;}\r\n@list l0:level7\r\n\t{mso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:3.75in;\r\n\ttext-indent:-.25in;}\r\n@list l0:level8\r\n\t{mso-level-number-format:alpha-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:4.25in;\r\n\ttext-indent:-.25in;}\r\n@list l0:level9\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:right;\r\n\tmargin-left:4.75in;\r\n\ttext-indent:-9.0pt;}\r\n@list l1\r\n\t{mso-list-id:582490527;\r\n\tmso-list-template-ids:-1777312264;}\r\n@list l1:level1\r\n\t{mso-level-style-link:\"Heading 1\";\r\n\tmso-level-text:\"Section %1\";\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:0in;\r\n\ttext-indent:0in;\r\n\tfont-variant:normal !important;\r\n\tcolor:black;\r\n\tmso-text-animation:none;\r\n\tmso-hide:none;\r\n\ttext-transform:none;\r\n\tposition:relative;\r\n\ttop:0pt;\r\n\tmso-text-raise:0pt;\r\n\tletter-spacing:0pt;\r\n\tmso-font-kerning:0pt;\r\n\tmso-ansi-font-weight:bold;\r\n\tmso-ansi-font-style:normal;\r\n\tmso-no-proof:no;\r\n\ttext-decoration:none;\r\n\ttext-underline:none;\r\n\ttext-decoration:none;\r\n\ttext-line-through:none;\r\n\tvertical-align:baseline;}\r\n@list l1:level2\r\n\t{mso-level-style-link:\"Heading 2\";\r\n\tmso-level-text:\"%1\\.%2\";\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:27.0pt;\r\n\ttext-indent:-.25in;\r\n\tmso-ansi-font-size:11.0pt;\r\n\tmso-ansi-font-weight:bold;\r\n\tmso-ansi-font-style:normal;\r\n\ttext-decoration:none;\r\n\ttext-line-through:none;}\r\n@list l1:level3\r\n\t{mso-level-number-format:alpha-lower;\r\n\tmso-level-style-link:\"Heading 3\";\r\n\tmso-level-text:\"\\(%3\\)\";\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:49.5pt;\r\n\ttext-indent:-.25in;\r\n\tmso-ansi-font-size:11.0pt;\r\n\ttext-transform:none;\r\n\ttext-decoration:none;\r\n\ttext-underline:none;\r\n\ttext-decoration:none;\r\n\ttext-line-through:none;\r\n\tvertical-align:baseline;}\r\n@list l1:level4\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-style-link:\"Heading 4\";\r\n\tmso-level-text:\"\\(%4\\)\";\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:175.5pt;\r\n\ttext-indent:-.25in;\r\n\tmso-ansi-font-size:13.5pt;\r\n\tmso-bidi-font-size:13.5pt;\r\n\ttext-decoration:none;\r\n\ttext-underline:none;\r\n\ttext-decoration:none;\r\n\ttext-line-through:none;}\r\n@list l1:level5\r\n\t{mso-level-style-link:\"Heading 5\";\r\n\tmso-level-text:\"%5\\)\";\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:1.25in;\r\n\ttext-indent:-.25in;\r\n\tmso-ansi-font-size:11.0pt;\r\n\ttext-decoration:none;\r\n\ttext-underline:none;\r\n\ttext-decoration:none;\r\n\ttext-line-through:none;}\r\n@list l1:level6\r\n\t{mso-level-style-link:\"Heading 6\";\r\n\tmso-level-text:\"%1\\.%2\\.%3\\.%4\\.%5\\.%6\";\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:1.5in;\r\n\ttext-indent:-.25in;\r\n\tmso-ansi-font-size:11.0pt;\r\n\ttext-decoration:none;\r\n\ttext-underline:none;\r\n\ttext-decoration:none;\r\n\ttext-line-through:none;}\r\n@list l1:level7\r\n\t{mso-level-style-link:\"Heading 7\";\r\n\tmso-level-text:\"%1\\.%2\\.%3\\.%4\\.%5\\.%6\\.%7\";\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:1.75in;\r\n\ttext-indent:-.25in;\r\n\tmso-ansi-font-size:11.0pt;\r\n\ttext-decoration:none;\r\n\ttext-underline:none;\r\n\ttext-decoration:none;\r\n\ttext-line-through:none;}\r\n@list l1:level8\r\n\t{mso-level-style-link:\"Heading 8\";\r\n\tmso-level-text:\"%1\\.%2\\.%3\\.%4\\.%5\\.%6\\.%7\\.%8\";\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:2.0in;\r\n\ttext-indent:-.25in;\r\n\tmso-ansi-font-size:11.0pt;\r\n\ttext-decoration:none;\r\n\ttext-underline:none;\r\n\ttext-decoration:none;\r\n\ttext-line-through:none;}\r\n@list l1:level9\r\n\t{mso-level-style-link:\"Heading 9\";\r\n\tmso-level-text:\"%1\\.%2\\.%3\\.%4\\.%5\\.%6\\.%7\\.%8\\.%9\";\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:2.25in;\r\n\ttext-indent:-.25in;\r\n\tmso-ansi-font-size:11.0pt;\r\n\ttext-decoration:none;\r\n\ttext-underline:none;\r\n\ttext-decoration:none;\r\n\ttext-line-through:none;}\r\n@list l2\r\n\t{mso-list-id:876699326;\r\n\tmso-list-template-ids:993452568;}\r\n@list l2:level1\r\n\t{mso-level-style-link:OutHead1;\r\n\tmso-level-tab-stop:.5in;\r\n\tmso-level-number-position:left;\r\n\ttext-indent:-.5in;\r\n\tmso-ansi-font-size:11.0pt;\r\n\tmso-bidi-font-size:11.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tfont-variant:normal !important;\r\n\tmso-text-animation:none;\r\n\ttext-transform:uppercase;\r\n\ttext-effect:none;\r\n\ttext-shadow:none;\r\n\ttext-effect:none;\r\n\ttext-effect:none;\r\n\tmso-ansi-font-weight:bold;\r\n\tmso-ansi-font-style:normal;\r\n\ttext-decoration:none;\r\n\ttext-underline:none;\r\n\ttext-decoration:none;\r\n\ttext-line-through:none;\r\n\tvertical-align:baseline;}\r\n@list l2:level2\r\n\t{mso-level-style-link:OutHead2;\r\n\tmso-level-legal-format:yes;\r\n\tmso-level-text:\"%1\\.%2\\.\";\r\n\tmso-level-tab-stop:.5in;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:.5in;\r\n\ttext-indent:-.5in;\r\n\tmso-ansi-font-size:11.0pt;\r\n\tmso-bidi-font-size:11.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tfont-variant:normal !important;\r\n\tmso-text-animation:none;\r\n\ttext-transform:none;\r\n\ttext-effect:none;\r\n\ttext-shadow:none;\r\n\ttext-effect:none;\r\n\ttext-effect:none;\r\n\tmso-ansi-font-weight:bold;\r\n\tmso-ansi-font-style:normal;\r\n\ttext-decoration:none;\r\n\ttext-underline:none;\r\n\ttext-decoration:none;\r\n\ttext-line-through:none;\r\n\tvertical-align:baseline;}\r\n@list l2:level3\r\n\t{mso-level-style-link:OutHead3;\r\n\tmso-level-legal-format:yes;\r\n\tmso-level-text:\"%1\\.%2\\.%3\\.\";\r\n\tmso-level-tab-stop:1.0in;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:1.0in;\r\n\ttext-indent:-.5in;\r\n\tmso-ansi-font-size:11.0pt;\r\n\tmso-bidi-font-size:11.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tfont-variant:normal !important;\r\n\tmso-text-animation:none;\r\n\ttext-transform:none;\r\n\ttext-effect:none;\r\n\ttext-shadow:none;\r\n\ttext-effect:none;\r\n\ttext-effect:none;\r\n\tmso-ansi-font-weight:normal;\r\n\tmso-bidi-font-weight:bold;\r\n\tmso-ansi-font-style:normal;\r\n\ttext-decoration:none;\r\n\ttext-underline:none;\r\n\ttext-decoration:none;\r\n\ttext-line-through:none;\r\n\tvertical-align:baseline;}\r\n@list l2:level4\r\n\t{mso-level-style-link:OutHead4;\r\n\tmso-level-legal-format:yes;\r\n\tmso-level-text:\"%1\\.%2\\.%4\\.\";\r\n\tmso-level-tab-stop:1.0in;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:1.0in;\r\n\ttext-indent:-.25in;\r\n\tmso-ansi-font-size:12.0pt;\r\n\tfont-family:\"Times New Roman\",serif;\r\n\tfont-variant:normal !important;\r\n\tmso-text-animation:none;\r\n\ttext-transform:none;\r\n\ttext-effect:none;\r\n\ttext-shadow:none;\r\n\ttext-effect:none;\r\n\ttext-effect:none;\r\n\tmso-ansi-font-weight:bold;\r\n\tmso-ansi-font-style:normal;\r\n\ttext-decoration:none;\r\n\ttext-underline:none;\r\n\ttext-decoration:none;\r\n\ttext-line-through:none;\r\n\tvertical-align:baseline;}\r\n@list l2:level5\r\n\t{mso-level-style-link:OutHead5;\r\n\tmso-level-text:\"\\(%5\\)\";\r\n\tmso-level-tab-stop:2.5in;\r\n\tmso-level-number-position:left;\r\n\ttext-indent:-.5in;\r\n\tmso-ansi-font-size:12.0pt;\r\n\tfont-family:\"Times New Roman\",serif;\r\n\tfont-variant:normal !important;\r\n\tmso-text-animation:none;\r\n\ttext-transform:none;\r\n\ttext-effect:none;\r\n\ttext-shadow:none;\r\n\ttext-effect:none;\r\n\ttext-effect:none;\r\n\tmso-ansi-font-weight:bold;\r\n\tmso-ansi-font-style:normal;\r\n\ttext-decoration:none;\r\n\ttext-underline:none;\r\n\ttext-decoration:none;\r\n\ttext-line-through:none;\r\n\tvertical-align:baseline;}\r\n@list l2:level6\r\n\t{mso-level-number-format:alpha-lower;\r\n\tmso-level-style-link:OutHead6;\r\n\tmso-level-text:\"\\(%6\\)\";\r\n\tmso-level-tab-stop:3.0in;\r\n\tmso-level-number-position:left;\r\n\ttext-indent:-.5in;\r\n\tmso-ansi-font-size:12.0pt;\r\n\tfont-family:\"Times New Roman\",serif;\r\n\tfont-variant:normal !important;\r\n\tmso-text-animation:none;\r\n\ttext-transform:none;\r\n\ttext-effect:none;\r\n\ttext-shadow:none;\r\n\ttext-effect:none;\r\n\ttext-effect:none;\r\n\tmso-ansi-font-weight:bold;\r\n\tmso-ansi-font-style:normal;\r\n\ttext-decoration:none;\r\n\ttext-underline:none;\r\n\ttext-decoration:none;\r\n\ttext-line-through:none;\r\n\tvertical-align:baseline;}\r\n@list l2:level7\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-style-link:OutHead7;\r\n\tmso-level-text:\"%7\\)\";\r\n\tmso-level-tab-stop:3.5in;\r\n\tmso-level-number-position:left;\r\n\ttext-indent:-.5in;\r\n\tmso-ansi-font-size:12.0pt;\r\n\tfont-family:\"Times New Roman\",serif;\r\n\tfont-variant:normal !important;\r\n\tmso-text-animation:none;\r\n\ttext-transform:none;\r\n\ttext-effect:none;\r\n\ttext-shadow:none;\r\n\ttext-effect:none;\r\n\ttext-effect:none;\r\n\tmso-ansi-font-weight:bold;\r\n\tmso-ansi-font-style:normal;\r\n\ttext-decoration:none;\r\n\ttext-underline:none;\r\n\ttext-decoration:none;\r\n\ttext-line-through:none;\r\n\tvertical-align:baseline;}\r\n@list l2:level8\r\n\t{mso-level-number-format:alpha-lower;\r\n\tmso-level-style-link:OutHead8;\r\n\tmso-level-text:\"%8\\)\";\r\n\tmso-level-tab-stop:4.0in;\r\n\tmso-level-number-position:left;\r\n\ttext-indent:-.5in;\r\n\tmso-ansi-font-size:12.0pt;\r\n\tfont-family:\"Times New Roman\",serif;\r\n\tfont-variant:normal !important;\r\n\tmso-text-animation:none;\r\n\ttext-transform:none;\r\n\ttext-effect:none;\r\n\ttext-shadow:none;\r\n\ttext-effect:none;\r\n\ttext-effect:none;\r\n\tmso-ansi-font-weight:bold;\r\n\tmso-ansi-font-style:normal;\r\n\ttext-decoration:none;\r\n\ttext-underline:none;\r\n\ttext-decoration:none;\r\n\ttext-line-through:none;\r\n\tvertical-align:baseline;}\r\n@list l2:level9\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-tab-stop:2.25in;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:2.25in;\r\n\ttext-indent:-.25in;}\r\n@list l3\r\n\t{mso-list-id:884752434;\r\n\tmso-list-type:hybrid;\r\n\tmso-list-template-ids:565467318 -1 2042009676 -1 -1 -1 -1 -1 -1 -1;}\r\n@list l3:level1\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-text:\"%1\\)\";\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:1.0in;\r\n\ttext-indent:-.5in;}\r\n@list l3:level2\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-text:\"%2\\)\";\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:.75in;\r\n\ttext-indent:-.25in;}\r\n@list l3:level3\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:right;\r\n\tmargin-left:1.75in;\r\n\ttext-indent:-9.0pt;}\r\n@list l3:level4\r\n\t{mso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:2.25in;\r\n\ttext-indent:-.25in;}\r\n@list l3:level5\r\n\t{mso-level-number-format:alpha-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:2.75in;\r\n\ttext-indent:-.25in;}\r\n@list l3:level6\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:right;\r\n\tmargin-left:3.25in;\r\n\ttext-indent:-9.0pt;}\r\n@list l3:level7\r\n\t{mso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:3.75in;\r\n\ttext-indent:-.25in;}\r\n@list l3:level8\r\n\t{mso-level-number-format:alpha-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:4.25in;\r\n\ttext-indent:-.25in;}\r\n@list l3:level9\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:right;\r\n\tmargin-left:4.75in;\r\n\ttext-indent:-9.0pt;}\r\n@list l4\r\n\t{mso-list-id:957879444;\r\n\tmso-list-type:hybrid;\r\n\tmso-list-template-ids:-2135918686 -1 67698689 -1 -1 -1 -1 -1 -1 -1;}\r\n@list l4:level1\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-text:\"%1\\)\";\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:1.0in;\r\n\ttext-indent:-.5in;}\r\n@list l4:level2\r\n\t{mso-level-number-format:bullet;\r\n\tmso-level-text:ï‚·;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:1.25in;\r\n\ttext-indent:-.25in;\r\n\tfont-family:Symbol;}\r\n@list l4:level3\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:right;\r\n\tmargin-left:1.75in;\r\n\ttext-indent:-9.0pt;}\r\n@list l4:level4\r\n\t{mso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:2.25in;\r\n\ttext-indent:-.25in;}\r\n@list l4:level5\r\n\t{mso-level-number-format:alpha-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:2.75in;\r\n\ttext-indent:-.25in;}\r\n@list l4:level6\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:right;\r\n\tmargin-left:3.25in;\r\n\ttext-indent:-9.0pt;}\r\n@list l4:level7\r\n\t{mso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:3.75in;\r\n\ttext-indent:-.25in;}\r\n@list l4:level8\r\n\t{mso-level-number-format:alpha-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:4.25in;\r\n\ttext-indent:-.25in;}\r\n@list l4:level9\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:right;\r\n\tmargin-left:4.75in;\r\n\ttext-indent:-9.0pt;}\r\n@list l5\r\n\t{mso-list-id:1865241303;\r\n\tmso-list-type:hybrid;\r\n\tmso-list-template-ids:878460456 2042009676 1153736034 1142858962 -2106013266 -1037651666 -1431029476 1977495350 -1972974876 409270202;}\r\n@list l5:level1\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-text:\"%1\\)\";\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:.75in;\r\n\ttext-indent:-.25in;}\r\n@list l5:level2\r\n\t{mso-level-number-format:alpha-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:1.25in;\r\n\ttext-indent:-.25in;}\r\n@list l5:level3\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:right;\r\n\tmargin-left:1.75in;\r\n\ttext-indent:-9.0pt;}\r\n@list l5:level4\r\n\t{mso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:2.25in;\r\n\ttext-indent:-.25in;}\r\n@list l5:level5\r\n\t{mso-level-number-format:alpha-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:2.75in;\r\n\ttext-indent:-.25in;}\r\n@list l5:level6\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:right;\r\n\tmargin-left:3.25in;\r\n\ttext-indent:-9.0pt;}\r\n@list l5:level7\r\n\t{mso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:3.75in;\r\n\ttext-indent:-.25in;}\r\n@list l5:level8\r\n\t{mso-level-number-format:alpha-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:left;\r\n\tmargin-left:4.25in;\r\n\ttext-indent:-.25in;}\r\n@list l5:level9\r\n\t{mso-level-number-format:roman-lower;\r\n\tmso-level-tab-stop:none;\r\n\tmso-level-number-position:right;\r\n\tmargin-left:4.75in;\r\n\ttext-indent:-9.0pt;}\r\nol\r\n\t{margin-bottom:0in;}\r\nul\r\n\t{margin-bottom:0in;}\r\n-->\r\n</style>\r\n<!--[if gte mso 10]>\r\n<style>\r\n /* Style Definitions */\r\n table.MsoNormalTable\r\n\t{mso-style-name:\"Table Normal\";\r\n\tmso-tstyle-rowband-size:0;\r\n\tmso-tstyle-colband-size:0;\r\n\tmso-style-noshow:yes;\r\n\tmso-style-priority:99;\r\n\tmso-style-parent:\"\";\r\n\tmso-padding-alt:0in 5.4pt 0in 5.4pt;\r\n\tmso-para-margin:0in;\r\n\tmso-pagination:widow-orphan;\r\n\tfont-size:12.0pt;\r\n\tfont-family:\"Calibri\",sans-serif;\r\n\tmso-ascii-font-family:Calibri;\r\n\tmso-ascii-theme-font:minor-latin;\r\n\tmso-hansi-font-family:Calibri;\r\n\tmso-hansi-theme-font:minor-latin;\r\n\tmso-bidi-font-family:\"Times New Roman\";\r\n\tmso-bidi-theme-font:minor-bidi;\r\n\tmso-font-kerning:1.0pt;\r\n\tmso-ligatures:standardcontextual;}\r\n</style>\r\n<![endif]-->\r\n</head>\r\n\r\n<body lang=EN-US link=blue vlink=\"#954F72\" style='tab-interval:.5in;word-wrap:\r\nbreak-word'>\r\n\r\n<div class=WordSection1>\r\n\r\n<p class=MsoNormal style='margin-top:12.0pt;line-height:normal'><b><span\r\nstyle='mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>Microsoft pubCenter Publisher Terms and\r\nConditions</span></b><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'><o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='margin-top:12.0pt;text-align:justify;text-justify:\r\ninter-ideograph;line-height:normal'><b><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>IF YOUR PRINCIPAL PLACE OF BUSINESS IS\r\nIN THE UNITED STATES, SECTION 19 CONTAINS A BINDING ARBITRATION CLAUSE AND\r\nCLASS ACTION WAIVER. IT AFFECTS YOUR RIGHTS ABOUT HOW TO RESOLVE ANY DISPUTE\r\nWITH MICROSOFT. PLEASE READ IT.</span></b><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'><o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='line-height:normal'><b><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>1. INTRODUCTION. </span></b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>These publisher terms and\r\nconditions are an agreement (“<b>Agreement</b>â€) between you ("<b>You</b>")\r\nand Microsoft.<span style='mso-spacerun:yes'> </span></span><strong><span\r\nstyle='font-size:10.0pt;font-family:\"Calibri\",sans-serif;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128;background:white'>“Microsoft†</span></strong><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-hansi-font-family:\r\nCalibri;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;\r\nmso-themetint:128;background:white'>means Microsoft Online, Inc. (6880 Sierra\r\nCenter Parkway, Reno, NV 89511 USA) unless your principal place of business is\r\nin (a) India in which case “Microsoft†means Microsoft Corporation (India)\r\nPrivate Limited (Level 10, Tower C, Epitome, Building No. 5, DLF Cyber City,\r\nPhase 3, Gurugram 122002 – Haryana, India), (b) Brazil in which case “Microsoftâ€\r\nmeans Microsoft do <span class=SpellE>Brasil</span> <span class=SpellE>Importação</span>\r\ne <span class=SpellE>Comércio</span> de Software e Video Games Ltda., enrolled\r\nwith the CNPJ under No. 04.712.500/0001-07 (Av. <span class=SpellE>Presidente</span>\r\n<span class=SpellE>Juscelino</span> <span class=SpellE>Kubitscheck</span> 1909,\r\nTorre Sul, 18 Andar, conj. 181 – Vila Nova <span class=SpellE>Conceição</span>,\r\nCEP: 04543-907 São Paulo/SP <span class=SpellE>Brasil</span>), or (c) Europe,\r\nthe Middle East,</span><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'> or<span style='background:white'>\r\nAfrica (“EMEAâ€) or Asia-Pacific (“APACâ€) in which case “Microsoft†means\r\nMicrosoft Ireland Operations Limited (One Microsoft Place, South County\r\nBusiness Park, <span class=SpellE>Leopardstown</span>, Dublin, Ireland 18, D18\r\nP521)</span></span><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>. <span style='mso-spacerun:yes'> </span>This Agreement incorporates by\r\nreference the terms of the Microsoft Services Agreement\r\n(https://www.microsoft.com/en-us/servicesagreement/); provided, however, in the\r\nevent of any conflict between the terms of the Microsoft Services Agreement\r\nthat are applicable to You and this Agreement, the terms of this Agreement\r\nshall control.<span style='mso-spacerun:yes'> </span>This Agreement applies to\r\nYour participation in or use of one or more of the following offerings\r\navailable through Microsoft pubCenter (collectively, "pubCenter\r\nPrograms"), including the following Microsoft pubCenter offerings: <span\r\nstyle='mso-spacerun:yes'> </span>(a) the Microsoft pubCenter offering for web\r\npublishers (“<b>pubCenter Program for Web Publishers</b>â€); (b) the Microsoft\r\npubCenter offering for mobile application developers (“<b>pubCenter Program for\r\nMobile App Developers</b>â€); (c) the Microsoft pubCenter offering for Windows\r\napplications developers (“<b>pubCenter Program for Win App Developers</b>â€);\r\nand (d) the Microsoft pubCenter offering for Xbox applications developers (“<b>pubCenter\r\nProgram for Xbox App Developers</b>â€).<span style='mso-spacerun:yes'> </span>Notwithstanding\r\nthe foregoing, (a) if You have separately negotiated an agreement with\r\nMicrosoft covering a pubCenter Program, that separately negotiated agreement\r\ncontinues to apply with respect to the applicable pubCenter Program, or (b) if\r\nYou have another type of separately negotiated agreement with Microsoft (i.e.,\r\nnot specifically covering a pubCenter Program) that separately negotiated\r\nagreement shall apply to the extent it conflicts with the terms of this\r\nAgreement. <o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>2. MICROSOFT PUBCENTER</span></b><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>. Subject to Your compliance with this\r\nAgreement and such other rules, policies, requirements, and procedures as\r\nMicrosoft may publish on the pubCenter website located at </span><span\r\nstyle='font-size:8.0pt'><a href=\"http://pubcenter.microsoft.com/\"><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>http://pubcenter.microsoft.com</span></a></span><u><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'> </span></u><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>(the "<b>pubCenter\r\nSite</b>â€) or as published at</span><span style='font-size:8.0pt;mso-ascii-font-family:\r\nCalibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'> </span><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>https://about.ads.microsoft.com/en-us/policies/home\r\n(“</span><span style='font-size:8.0pt'><a\r\nhref=\"https://about.ads.microsoft.com/en-us/policies/home\"><span\r\nstyle='font-size:10.0pt;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:\r\ntext1;mso-themetint:128'>Policies and Guidelines - Microsoft Advertising</span></a></span><span\r\nstyle='font-size:8.0pt;mso-ascii-font-family:Calibri;mso-hansi-font-family:\r\nCalibri;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;\r\nmso-themetint:128'>â€)</span><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'> or as otherwise made available to<span style='mso-spacerun:yes'> \r\n</span>You from time to time (the “<b>Policies</b>â€), You may access\r\nthe pubCenter Programs through the pubCenter website. You may access the\r\npubCenter Site solely to manage Your accounts for the pubCenter\r\nPrograms (“<b>Accounts</b>â€) for the purpose(s) described hereunder. You may\r\nalso authorize third parties (“<b>Agents</b>â€) to access the pubCenter Site and\r\nmanage Your Accounts on Your behalf; provided, however that You will be jointly\r\nand severally responsible for the activities of Your Agents in association with\r\nthe use of the pubCenter Site.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>3. PUBCENTER CREDENTIALS.</span></b><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'> You </span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-hansi-font-family:\r\nCalibri;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;\r\nmso-themetint:128;background:white'>agree not to use any false, <span\r\nclass=GramE>inaccurate</span> or misleading information when signing up for\r\nYour Accounts, and You </span><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>must protect any passwords or other credentials associated with Your\r\nAccounts (“<b>Credentials</b>â€), keep the Credentials confidential and take\r\nfull and sole responsibility for any use of Your Credentials and any activities\r\noccurred under Your Account. You must <span class=GramE>keep all required\r\nregistration and other Account related information up to date at all times</span>.\r\nIf You suspect any improper or unauthorized use of Your Accounts or\r\nother security issues that may affect a pubCenter Program, <span class=GramE>You</span>\r\nmust contact Microsoft immediately at </span><span style='font-size:8.0pt'><a\r\nhref=\"mailto:pubhelp@microsoft.com\"><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128;text-decoration:none;text-underline:none'>pubhelp@microsoft.com</span></a></span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'> or another email address\r\nspecified by Microsoft.<span style='mso-spacerun:yes'> </span></span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-hansi-font-family:\r\nCalibri;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;\r\nmso-themetint:128;background:white'>If we reasonably suspect that Your Accounts\r\nare at risk of being used by a third party fraudulently (for example, as a\r\nresult of an Account compromise), or if Microsoft discovers a security breach\r\nthat is affecting a pubCenter Program, Microsoft may take actions that\r\nMicrosoft deems necessary to address or minimize the impact of the security\r\nissue, including but not limited to suspending Your Account until You can\r\nreclaim ownership,</span><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'> requiring you to update your<span\r\nstyle='background:white'> </span>Credentials, <span style='background:white'>or\r\nstop delivering advertising.</span> You agree to cooperate in a timely manner\r\nwith reasonable requests from Microsoft in connection with any security or data\r\nincidents. </span><span style='font-size:6.5pt;mso-ascii-font-family:Calibri;\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128;background:white'> </span><b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'><o:p></o:p></span></b></p>\r\n\r\n<p class=MsoCommentText><b><span style='mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>4. USE OF PUBCENTER PROGRAMS. <o:p></o:p></span></b></p>\r\n\r\n<p class=MsoCommentText style='margin-bottom:0in'><span class=GramE><b><span\r\nstyle='mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>a</span></b><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>)When</span></span><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'> accessing and using the\r\npubCenter Programs, You agree to comply with the terms of this Agreement, the\r\nPolicies, and all applicable laws and regulations. You may access and use only\r\nthe pubCenter Programs for which You have been approved by Microsoft.\r\nApproval for Your access and use of a pubCenter Program is at Microsoft’s sole\r\ndiscretion and does not provide You with any right to access and use\r\nany other pubCenter Program without separate Microsoft approval. In addition, <span\r\nclass=GramE>You</span> agree to access and use the pubCenter Programs,\r\nincluding any associated tags, APIs, or code, (a) only in accordance with\r\nMicrosoft’s technical specifications and (b) only with Your websites (“<b>Websites</b>â€),\r\nmobile applications (“<b>Mobile Apps</b>â€), Xbox applications (“<b>Xbox\r\nApps</b>â€) and Windows applications (“<b>Win Apps</b>â€) that have been approved\r\nby Microsoft and properly registered with the pubCenter Programs. You also\r\nagree to the Microsoft API terms of use at </span><span style='font-size:6.5pt'><a\r\nhref=\"https://learn.microsoft.com/en-us/legal/microsoft-apis/terms-of-use\"><span\r\nstyle='font-size:10.0pt;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:\r\ntext1;mso-themetint:128'>https://learn.microsoft.com/en-us/legal/microsoft-apis/terms-of-use</span></a></span><span\r\nstyle='mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>, if applicable to your access or use.\r\nFor the purposes of this Agreement, Websites, Mobile Apps, Xbox Apps, and Win\r\nApps are referred to collectively as <b>“Properties.</b>â€<span\r\nstyle='mso-spacerun:yes'> </span></span><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:DengXian;mso-fareast-theme-font:minor-fareast;\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>You acknowledge that Microsoft’s\r\napproval of a <span class=GramE>Property</span> is not a certification or\r\nendorsement of that Property.<span style='mso-spacerun:yes'> </span>Your\r\nProperties shall <span class=GramE>at all times</span> comply with the\r\nPolicies.</span><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'><o:p></o:p></span></p>\r\n\r\n<p class=MsoCommentText style='margin-bottom:0in'><span class=GramE><b><span\r\nstyle='mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>b</span></b><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>)<u>Advertisers</u></span></span><u><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>’ Right to <span class=SpellE>Opt</span> In or <span class=SpellE>Opt</span>\r\nOut</span></u><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>. Microsoft may provide\r\nadvertisers with a list of Properties and publisher names for the purpose of\r\nallowing advertisers to identify certain Properties and publishers on which it\r\ndoes or does not wish to place its ads.<span style='mso-spacerun:yes'> \r\n</span>Microsoft will not be required to disclose to You whether any individual\r\nadvertiser chose to exercise this right <span class=GramE>with regard to</span>\r\nYou or Your Properties.<o:p></o:p></span></p>\r\n\r\n<p class=MsoCommentText style='margin-bottom:0in'><b><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>c</span></b><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>)</span><span\r\nstyle='font-size:4.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'> </span><u><span\r\nstyle='mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>Cooperation</span></u><span\r\nstyle='mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>. You will provide, via\r\ntelephone and e-mail, <span class=GramE>cooperation</span> and assistance that\r\nMicrosoft reasonably requests related to customer service, billing and\r\ncollections for the advertisers associated with the ads that Microsoft sells\r\nwithin Your Properties.<o:p></o:p></span></p>\r\n\r\n<p class=MsoCommentText style='margin-bottom:0in'><b><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>d</span></b><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>)Implementation\r\nResponsibilities. You will:<o:p></o:p></span></p>\r\n\r\n<p class=MsoListParagraphCxSpFirst style='margin-top:0in;margin-right:0in;\r\nmargin-bottom:0in;margin-left:1.0in;mso-add-space:auto;text-align:justify;\r\ntext-justify:inter-ideograph;text-indent:-.5in;line-height:normal;mso-list:\r\nl0 level1 lfo4'><![if !supportLists]><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:Calibri;mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'><span style='mso-list:Ignore'>i)<span style='font:7.0pt \"Times New Roman\"'> \r\n</span></span></span><![endif]><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>Deploy identifiers or other technologies designated by Microsoft (“<b>Microsoft\r\nAds SDK</b>â€), and </span><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:DengXian;mso-fareast-theme-font:minor-fareast;\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>provide information that Microsoft\r\nreasonably requests, in accordance with Microsoft’s technical requirements and <span\r\nclass=GramE>instructions<span style='mso-fareast-font-family:\"Times New Roman\"'>;</span></span></span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'><o:p></o:p></span></p>\r\n\r\n<p class=MsoListParagraphCxSpMiddle style='margin-top:0in;margin-right:0in;\r\nmargin-bottom:0in;margin-left:1.0in;mso-add-space:auto;text-align:justify;\r\ntext-justify:inter-ideograph;text-indent:-.5in;line-height:normal;mso-list:\r\nl0 level1 lfo4'><![if !supportLists]><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:Calibri;mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'><span style='mso-list:Ignore'>ii)<span style='font:7.0pt \"Times New Roman\"'> \r\n</span></span></span><![endif]><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>test on Your Property the deployment of ad formats and browsers\r\nspecified by <span class=GramE>Microsoft;</span><o:p></o:p></span></p>\r\n\r\n<p class=MsoListParagraphCxSpMiddle style='margin-top:0in;margin-right:0in;\r\nmargin-bottom:0in;margin-left:1.0in;mso-add-space:auto;text-align:justify;\r\ntext-justify:inter-ideograph;text-indent:-.5in;line-height:normal;mso-list:\r\nl0 level1 lfo4'><![if !supportLists]><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:Calibri;mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'><span style='mso-list:Ignore'>iii)<span style='font:7.0pt \"Times New Roman\"'> \r\n</span></span></span><![endif]><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>in a timely manner, make reasonable efforts to cooperate to resolve\r\nproblems identified during testing of Your <span class=GramE>Property;</span><o:p></o:p></span></p>\r\n\r\n<p class=MsoListParagraphCxSpMiddle style='margin-top:0in;margin-right:0in;\r\nmargin-bottom:0in;margin-left:1.0in;mso-add-space:auto;text-align:justify;\r\ntext-justify:inter-ideograph;text-indent:-.5in;line-height:normal;mso-list:\r\nl0 level1 lfo4'><![if !supportLists]><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:Calibri;mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'><span style='mso-list:Ignore'>iv)<span style='font:7.0pt \"Times New Roman\"'> \r\n</span></span></span><![endif]><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>incorporate into Your Property all guidance, specifications, placement\r\nguidelines, documentation and other consultation related to ads (e.g.,\r\nplacement, sizes, experiences, formats, etc.) that Microsoft provides to You\r\n(if any<span class=GramE>);</span><o:p></o:p></span></p>\r\n\r\n<p class=MsoListParagraphCxSpMiddle style='margin-top:0in;margin-right:0in;\r\nmargin-bottom:0in;margin-left:1.0in;mso-add-space:auto;text-align:justify;\r\ntext-justify:inter-ideograph;text-indent:-.5in;line-height:normal;mso-list:\r\nl0 level1 lfo4'><![if !supportLists]><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:Calibri;mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'><span style='mso-list:Ignore'>v)<span style='font:7.0pt \"Times New Roman\"'> \r\n</span></span></span><![endif]><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>cooperate in good faith with Microsoft’s reasonable requests to\r\noptimize and test modifications to the Microsoft Ads SDK to improve performance;\r\nand<o:p></o:p></span></p>\r\n\r\n<p class=MsoListParagraphCxSpLast style='margin-top:0in;margin-right:0in;\r\nmargin-bottom:0in;margin-left:1.0in;mso-add-space:auto;text-align:justify;\r\ntext-justify:inter-ideograph;text-indent:-.5in;line-height:normal;mso-list:\r\nl0 level1 lfo4'><![if !supportLists]><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:Calibri;mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'><span style='mso-list:Ignore'>vi)<span style='font:7.0pt \"Times New Roman\"'> \r\n</span></span></span><![endif]><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>implement updates that Microsoft makes to the Microsoft Ads SDK\r\nwithin 60 days after Microsoft makes the update available to You.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='margin-bottom:0in;text-align:justify;text-justify:\r\ninter-ideograph;line-height:normal'><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'><o:p> </o:p></span></p>\r\n\r\n<p class=MsoNormal style='margin-bottom:0in;text-align:justify;text-justify:\r\ninter-ideograph;line-height:normal'><span class=GramE><b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>e</span></b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>)Traffic</span></span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'> Quality and Ad\r\nPerformance.</span><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:DengXian;mso-fareast-theme-font:minor-fareast;\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'><span style='mso-spacerun:yes'> \r\n</span></span><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'><o:p></o:p></span></p>\r\n\r\n<h4 style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.75in;\r\nmso-list:none'><a name=\"_Hlk510784399\"><span style='font-size:10.0pt;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'><o:p> </o:p></span></a></h4>\r\n\r\n<h4 style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.75in;\r\nmso-list:l5 level1 lfo3'><span style='mso-bookmark:_Hlk510784399'><![if !supportLists]><span\r\nstyle='font-size:10.0pt;mso-fareast-font-family:Calibri;mso-bidi-font-family:\r\nCalibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:128'><span\r\nstyle='mso-list:Ignore'>i)<span style='font:7.0pt \"Times New Roman\"'> \r\n</span></span></span><![endif]><span style='font-size:10.0pt;mso-bidi-font-family:\r\nCalibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>Microsoft may\r\nrequire that a quality score be maintained for traffic from Your Properties, in\r\na manner and method determined by Microsoft.<o:p></o:p></span></span></h4>\r\n\r\n<h4 style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.75in;\r\nmso-list:l5 level1 lfo3;mso-layout-grid-align:auto'><span style='mso-bookmark:\r\n_Hlk510784399'><![if !supportLists]><span style='font-size:10.0pt;mso-fareast-font-family:\r\nCalibri;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;\r\nmso-themetint:128'><span style='mso-list:Ignore'>ii)<span style='font:7.0pt \"Times New Roman\"'> \r\n</span></span></span><![endif]><span style='font-size:10.0pt;mso-bidi-font-family:\r\nCalibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>You will manage\r\ntraffic quality using methods </span></span><span style='font-size:10.0pt;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>to track each traffic source when made available by Microsoft. You will\r\nmaintain traffic quality levels as set by Microsoft. <o:p></o:p></span></h4>\r\n\r\n<h4 style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:1.0in;\r\ntext-indent:-.5in;mso-list:none;mso-layout-grid-align:auto'><span\r\nstyle='font-size:10.0pt;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:\r\ntext1;mso-themetint:128'>iii) <span style='mso-spacerun:yes'>  </span><span\r\nstyle='mso-spacerun:yes'> </span>Microsoft may warn You or suspend a <span\r\nclass=GramE>Property</span> if that Property has fallen below acceptable levels\r\nof quality. If You have received such warning or suspension, <span class=GramE>You</span>\r\nwill not directly or indirectly use, distribute, or offer the ad inventory in\r\nyour Properties for Microsoft ads through any third party within the Microsoft\r\nAdvertising network. You will minimize automated, <span class=GramE>fraudulent</span>\r\nand lower quality traffic. Microsoft will determine the validity and\r\nquality of all traffic in its sole discretion.<o:p></o:p></span></h4>\r\n\r\n<h3 style='margin-top:0in;margin-right:0in;margin-bottom:8.0pt;margin-left:\r\n0in;text-indent:0in;mso-pagination:none;mso-list:none'><span\r\nclass=Heading3Char><b><span style='font-size:10.0pt;mso-fareast-font-family:\r\nDengXian;mso-fareast-theme-font:minor-fareast;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128;mso-bidi-font-style:normal;\r\ntext-decoration:none;text-underline:none'>f</span></b></span><span\r\nclass=Heading3Char><span style='font-size:10.0pt;mso-fareast-font-family:DengXian;\r\nmso-fareast-theme-font:minor-fareast;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128;mso-bidi-font-weight:normal;mso-bidi-font-style:\r\nnormal;text-decoration:none;text-underline:none'>)</span></span><span\r\nstyle='font-size:8.0pt;mso-bidi-font-size:9.0pt;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128;text-decoration:none;\r\ntext-underline:none'> </span><span class=Heading3Char><span style='font-size:\r\n10.0pt;mso-fareast-font-family:DengXian;mso-fareast-theme-font:minor-fareast;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128;mso-bidi-font-weight:normal;mso-bidi-font-style:normal;text-decoration:\r\nnone;text-underline:none'>Performance.</span></span><span style='font-size:\r\n10.0pt;mso-fareast-font-family:DengXian;mso-fareast-theme-font:minor-fareast;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128;text-decoration:none;text-underline:none'> The parties will monitor the\r\nperformance of each Property displaying ads served by a pubCenter Program,\r\nincluding user acceptance and overall deal performance (e.g., volume,\r\nmonetization, and revenue). If either party reasonably believes a <span\r\nclass=GramE>Property</span> is performing below standards, the parties will\r\ncooperate and use commercially reasonable efforts to modify the Property to\r\nimprove its performance.<span style='mso-spacerun:yes'> </span>If such efforts\r\ndo not improve the Property’s performance to Microsoft’s reasonable\r\nsatisfaction, </span><span class=GramE><span style='font-size:10.0pt;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128;text-decoration:none;text-underline:none'>You</span></span><span\r\nstyle='font-size:10.0pt;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:\r\ntext1;mso-themetint:128;text-decoration:none;text-underline:none'> will promptly\r\nremove the poor-quality traffic and You will not directly or indirectly use,\r\ndistribute, or offer such ad inventory for Microsoft ads through any third\r\nparty within the Microsoft Advertising network.</span><span style='font-size:\r\n10.0pt;mso-fareast-font-family:DengXian;mso-fareast-theme-font:minor-fareast;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128;text-decoration:none;text-underline:none'><o:p></o:p></span></h3>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'><o:p> </o:p></span></p>\r\n\r\n<p class=MsoNormal style='margin-left:.4in;text-align:justify;text-justify:\r\ninter-ideograph;text-indent:-.4in;line-height:normal'><b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>5. GENERAL\r\nPROHIBITIONS. </span></b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>You will not do any of the following:<o:p></o:p></span></p>\r\n\r\n<p class=MsoCommentText style='margin-bottom:0in'><b><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>a</span></b><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>) work around any\r\ntechnical limitations of the pubCenter Site or any pubCenter Program or\r\nintroduce or use any device, software, or routine that interferes or attempts\r\nto interfere with the operation of the pubCenter Site or any pubCenter Program,\r\nor otherwise attempt to access either of the foregoing in any ways other than\r\nthose authorized by <span class=GramE>Microsoft;</span><o:p></o:p></span></p>\r\n\r\n<p class=MsoCommentText style='margin-bottom:0in'><b><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>b</span></b><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>) use any pubCenter\r\nProgram to display advertising anywhere other than on a <span class=GramE>Property</span>\r\nthat has been approved by Microsoft and properly registered with the applicable\r\npubCenter Program;<o:p></o:p></span></p>\r\n\r\n<p class=MsoCommentText style='margin-bottom:0in'><b><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>c</span></b><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>) cache, store, copy,\r\ndistribute, or redirect any advertising delivered by any pubCenter <span\r\nclass=GramE>Program;</span><o:p></o:p></span></p>\r\n\r\n<p class=MsoCommentText style='margin-bottom:0in'><b><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>d</span></b><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>) directly or indirectly </span><span\r\nstyle='mso-ascii-font-family:Calibri;mso-fareast-font-family:DengXian;\r\nmso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;mso-bidi-font-family:\r\nCalibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>implement or\r\ndistribute ad inventory, or </span><span style='mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>generate, or authorize or encourage others to generate, </span><span\r\nstyle='mso-ascii-font-family:Calibri;mso-fareast-font-family:DengXian;\r\nmso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;mso-bidi-font-family:\r\nCalibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>revenue hereunder\r\nthrough any automated, deceptive, fraudulent or other invalid means including\r\nbut not limited to repeated manual clicks, the use of robots or other automated\r\nquery tools or computer-generated search/page requests, clicks that are\r\nprohibited under any guidelines provided by Microsoft or the terms of this Agreement,\r\nor the unauthorized use of other search engine optimization services or\r\nsoftware,</span><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'> or through the use of\r\nincentives (e.g. awarding users cash, points prizes, contest entries, etc.);<o:p></o:p></span></p>\r\n\r\n<p class=MsoCommentText style='margin-bottom:0in'><b><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>e</span></b><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>) edit, resize, modify,\r\nfilter, obscure, hide, make transparent, or reorder any advertising (including\r\ntheir associated links) delivered by any pubCenter <span class=GramE>Program;</span><o:p></o:p></span></p>\r\n\r\n<p class=MsoCommentText style='margin-bottom:0in'><b><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>f</span></b><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>) display advertising\r\nfrom any pubCenter Program in Properties that do not have distinct, substantial\r\nand legitimate content and purpose other than the display of <span class=GramE>advertising;</span><o:p></o:p></span></p>\r\n\r\n<p class=MsoCommentText style='margin-bottom:0in'><b><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>g</span></b><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>) collect or use any user\r\nidentifier created or provided to You by Microsoft for any purpose other than\r\npassing such identifier to a pubCenter Program as part of Your use of that\r\npubCenter <span class=GramE>Program;</span><o:p></o:p></span></p>\r\n\r\n<p class=MsoCommentText style='margin-bottom:0in'><b><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>h</span></b><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>) frame, minimize,\r\nremove, redirect, delay (e.g., insert interstitial ads or <span class=SpellE><span\r\nclass=GramE>pop up</span></span> windows) or otherwise inhibit or modify any\r\nadvertisements served by a pubCenter Program into your Properties or the\r\ndisplay of any web page accessed by the links included with specific\r\nadvertising; <o:p></o:p></span></p>\r\n\r\n<p class=MsoCommentText style='margin-bottom:0in'><span class=SpellE><b><span\r\nstyle='mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>i</span></b></span><span\r\nstyle='mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>) take any action that imposes an\r\nunreasonably or disproportionately large burden on Microsoft infrastructure,\r\nincluding the pubCenter Site or a pubCenter <span class=GramE>Program;</span> <o:p></o:p></span></p>\r\n\r\n<p class=MsoCommentText style='margin-bottom:0in'><b><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>j</span></b><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>) display advertising\r\nfrom any pubCenter Program on any portion of your Properties that violate any\r\napplicable law, statute, ordinance or regulation (including export control), or\r\nincludes materials or links to materials that are unlawful (including the sale\r\nof counterfeit goods or copyright piracy), obscene, pornographic,\r\ndiscriminatory, misleading, deceptive, false, gambling related or religious,\r\nthat constitute hate speech or defamation, or otherwise contain materials that\r\ndo not comply with the Policies or other Microsoft policies; or that infringe\r\non any third party’s proprietary rights;<span style='mso-spacerun:yes'> \r\n</span><o:p></o:p></span></p>\r\n\r\n<p class=MsoCommentText style='margin-bottom:0in'><b><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>k</span></b><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>) display advertising on\r\nany portion of your <span class=GramE>Properties</span> that are generated by\r\nadware, spyware or P2P applications; <o:p></o:p></span></p>\r\n\r\n<p class=MsoCommentText style='margin-bottom:0in'><b><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>l</span></b><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>) store, distribute, copy\r\nor otherwise use or repurpose data that You receive from Microsoft for any\r\npurpose other than to display ads in accordance with this <span class=GramE>Agreement;</span>\r\n<o:p></o:p></span></p>\r\n\r\n<p class=MsoCommentText style='margin-bottom:0in'><b><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>m</span></b><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>) display\r\nadvertising from any pubCenter Program on any portion of your <span\r\nclass=GramE>Properties</span> that would download any type of unauthorized or\r\nunlawful program to a computer or other device, or link a user to a website\r\nintended to download this type of software; or <o:p></o:p></span></p>\r\n\r\n<p class=MsoCommentText style='margin-bottom:0in'><b><span style='mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>n</span></b><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>) allow any ad tags\r\n(within ads served by Microsoft) or the Microsoft Ads SDK to (A) be used by a\r\nthird party, (B) be placed anywhere other than Your Properties, or (C) display\r\nads anywhere other than on Your Property. <o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>If You engage in any of the activities prohibited by this Section 5 or\r\notherwise prohibited by Microsoft, or your Property violates this Section 5 or\r\nanother Microsoft requirement or the Policies, then without limiting any other\r\nrights and remedies Microsoft may have under this Agreement, Microsoft may, as\r\nMicrosoft deems appropriate under the circumstances, do any of the following\r\nincluding in order to manage advertiser satisfaction issues: credit\r\nadvertisers for ad impressions; receive “make goods†from You; withhold or\r\ndeduct payments due to You for the time period within which Microsoft\r\ndetermines, after reasonable investigation, the prohibited action occurred; or\r\nsuspend or terminate Your Account.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>6. REPORTS. </span></b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>As part of a pubCenter Program, Microsoft may provide You with\r\naccess to online reporting systems to view and use a variety of online reports\r\nrelated to Your use of the pubCenter Program. You may not publicly publish or\r\notherwise distribute or disclose any of these reports to third parties and may\r\nonly use these reports for Your internal business purposes. These and\r\nsimilar reports are considered “Confidential Information†as defined in Section\r\n[30].<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>7. ADVERTISER PREFERENCES. </span></b><span style='font-size:\r\n10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>As part of some pubCenter Programs,\r\nMicrosoft may provide You with functionality and features that allow\r\nYou to specify Your preference regarding the display of advertising from\r\ncertain advertisers or groups of advertisers on or in Your Properties. If this\r\nfunctionality is provided through a pubCenter Program, it will\r\nbe Your responsibility to specify and maintain Your preferences.\r\nHowever, Microsoft does not guarantee that all advertising served on or in Your\r\nProperties will meet or otherwise be subject to the preferences that You specify.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='margin-bottom:0in;text-align:justify;text-justify:\r\ninter-ideograph;line-height:normal'><b><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>8. INVOICING AND PAYMENT. <o:p></o:p></span></b></p>\r\n\r\n<p class=MsoNormal style='margin-bottom:0in;text-align:justify;text-justify:\r\ninter-ideograph;line-height:normal'><span class=GramE><b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>a</span></b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>)<u>Payments</u></span></span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>.<span\r\nstyle='mso-spacerun:yes'> </span>On a monthly basis, Microsoft will\r\npay You in arrears on a net-45 basis for advertising displayed on or\r\nin Your Properties based upon the then-current payment schedules if <span\r\nclass=GramE>Your</span> earned balance equals or exceeds $100 USD (the “<b>Payment\r\n</b><b style='mso-bidi-font-weight:normal'>Threshold</b>â€). If <span\r\nclass=GramE>Your</span> earned balance equals less than the Payment Threshold,\r\nMicrosoft may elect to defer such payments (without penalty or late fee) to the\r\nnext applicable payment date that the payment due is greater than the Payment\r\nThreshold or, if such amount has not increased in the trailing twelve month\r\nperiod, cancel such payment permanently without notice. Microsoft may\r\nupdate the timing of the payments, payment schedules, or minimum payment\r\namounts at any time upon notice.<span style='mso-spacerun:yes'> </span></span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\nDengXian;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>If a negative amount is due to You (for example, as result of a prior\r\nperiod adjustment for invalid Paid Search Ad traffic), Microsoft may, in its\r\nsole discretion, (<span class=SpellE>i</span>) invoice You for the negative\r\namount, which You will pay within 45 days of receipt, or (ii) offset such\r\namount against future payments.<span style='mso-spacerun:yes'> </span></span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>In addition,\r\nif You receive a payment that was not due to You, Microsoft may\r\nreverse or seek return of that payment and You agree to cooperate with\r\nMicrosoft (or its’ Payment Processor) in our efforts to do this. Microsoft may\r\nalso reduce or offset Your earned balance without notice, to adjust\r\nfor any previous overpayment. You acknowledge that the amount You <span\r\nclass=GramE>actually receive</span> will depend in part on the rates and fees\r\nimposed by Your bank or the Payment Processor (as defined herein) and on any\r\napplicable tax withholding requirements by U.S. legislation and the domestic\r\nlegislation of Your domicile. You must provide Microsoft (or the Payment\r\nProcessor) with all financial, tax and banking information requested <span\r\nclass=GramE>in order to</span> make payment of amounts owed under this\r\nAgreement. Microsoft will notify You of any changes to the required\r\ninformation. Failure to provide such information within 60 days after creation\r\nof Your Account or failure to keep such information current and accurate may\r\nresult in the closing of Your Account by Microsoft and forfeiture of amounts\r\nowed to You under this Agreement. <o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='margin-bottom:0in;text-align:justify;text-justify:\r\ninter-ideograph;line-height:normal'><span class=GramE><b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>b</span></b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>)<u>Data</u></span></span><u><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'> for Calculating\r\nPayments; </span></u><u><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:DengXian;mso-fareast-theme-font:minor-fareast;\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>Unauthorized or Fraudulent Revenue from\r\nAds Served by a pubCenter Program</span></u><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:DengXian;mso-fareast-theme-font:\r\nminor-fareast;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>.<span\r\nstyle='mso-spacerun:yes'> </span></span><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>To the extent that payment is based on\r\nthe number of clicks, impressions, or actions generated by advertising that is\r\ndisplayed on or in Your Properties, reports generated by the applicable\r\npubCenter Programs will be the sole measurement for purposes of invoicing and\r\npayment.<span style='mso-spacerun:yes'> </span>Impressions, clicks, or other\r\nor actions generated by advertising that a pubCenter Program registers as\r\ncoming from IP addresses owned or controlled by You, or clicks associated with\r\nYour violation of this Agreement, the Policies or other applicable Microsoft\r\nrequirements, are not valid impressions, clicks, or actions.<span\r\nstyle='mso-spacerun:yes'> </span>In response to Microsoft’s request, <span\r\nclass=GramE>You</span> will provide to Microsoft information relating to\r\nthe pubCenter Program for Your Properties, including user IP addresses,\r\nreferring URL (HTTP Referrer), user agent, and time of submission (as\r\napplicable).<b> </b></span><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:DengXian;mso-fareast-theme-font:minor-fareast;\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>Microsoft will determine whether the\r\ndata calculating the number of clicks, impressions, or actions is valid, and\r\nMicrosoft will not owe You payment in connection with any data that Microsoft\r\njudges to have been generated through invalid means or in any manner that\r\nviolates the Agreement or is otherwise inaccurate.<span\r\nstyle='mso-spacerun:yes'> </span></span><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>MICROSOFT MAKES NO PROMISES OR\r\nGUARANTEES REGARDING (A) THE NUMBER OF ADVERTISEMENTS YOU MAY EXPECT TO BE\r\nDISPLAYED ON OR IN YOUR PROPERTIES BY A PUBCENTER PROGRAM OR (B) THE AMOUNT OF\r\nANY PAYMENTS YOU MAY RECEIVE.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='margin-bottom:0in;text-align:justify;text-justify:\r\ninter-ideograph;line-height:normal'><b style='mso-bidi-font-weight:normal'><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>c</span></b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>)<u>Currency</u>.<span\r\nstyle='mso-spacerun:yes'> </span></span><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:\r\nCalibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:128;mso-bidi-font-weight:\r\nbold'>All amounts owed by Microsoft under this Agreement will be expressed and\r\npaid in the currency chosen by You in your Account; the Account may limit the\r\nchoice of currencies available for selection.<span style='mso-spacerun:yes'> \r\n</span>If amounts owed by Microsoft under this Agreement are described in this\r\nAgreement in one currency and You choose a different currency, then at time of\r\npayment Microsoft will convert its payment amounts to the equivalent amount in\r\nYour chosen currency</span><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'> based on Microsoft’s standard\r\npractices. </span><b><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'><o:p></o:p></span></b></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>IF YOU RESIDE IN CHINA</span></b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>, Microsoft may remit payment to You in US dollars only. You are\r\nsolely responsible for obtaining the qualifications and/or completing relevant\r\nnecessary filings or registrations with the government authorities as required\r\nby the applicable law, <span class=GramE>in order to</span> accept payments in\r\nU.S dollars and convert the payment into Your local currency.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='margin-bottom:0in;line-height:normal'><b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>9. PAYMENT\r\nPROCESSING. <o:p></o:p></span></b></p>\r\n\r\n<p class=MsoNormal style='margin-bottom:0in;line-height:normal'><span\r\nclass=GramE><b style='mso-bidi-font-weight:normal'><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>a</span></b><span style='font-size:\r\n10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>)You</span></span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'> may only receive\r\npayments if You reside in one of our supported pubCenter countries that\r\nare qualified to receive payments. <b style='mso-bidi-font-weight:normal'> </b>\r\n<b style='mso-bidi-font-weight:normal'>MICROSOFT TAKES NO RESPONSIBILITY FOR\r\nAND DISCLAIMS ANY OBLIGATIONS TO MAKE PAYMENTS TO PUBLISHERS WHO ARE OPERATING\r\nOUTSIDE OF OUR SUPPORTED COUNTRIES.</b> <o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='margin-bottom:0in;line-height:normal'><span\r\nclass=GramE><b><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>b</span></b><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>)</span><b style='mso-bidi-font-weight:normal'><span style='font-size:\r\n10.0pt;mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:\r\nCalibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>Third</span></b></span><b\r\nstyle='mso-bidi-font-weight:normal'><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>-Party Payment Processor<span\r\nstyle='mso-bidi-font-weight:bold'>.<span style='mso-spacerun:yes'> </span></span></span></b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-hansi-font-family:\r\nCalibri;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;\r\nmso-themetint:128'>All payments are processed by a Microsoft-designated\r\nthird-party payment processor (“<b>Payment Processor</b>â€).<span\r\nstyle='mso-spacerun:yes'> </span>Microsoft may share information about You\r\nwith the Payment Processor and other third parties <span class=GramE>in order\r\nto</span> provide the payments.<span style='mso-spacerun:yes'>   </span></span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'><o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='margin-bottom:0in;text-indent:.5in;line-height:normal'><span\r\nclass=SpellE><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>i</span></span><span style='font-size:\r\n10.0pt;mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:\r\nCalibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>)<span\r\nstyle='mso-tab-count:1'>               </span><b>Terms Applicable to Use of\r\nStripe as Payment Processor</b>.<span style='mso-spacerun:yes'> </span>Payment\r\nprocessing services provided by Stripe are subject to the<span\r\nstyle='background:white'> </span></span><span style='font-size:8.0pt'><a\r\nhref=\"https://stripe.com/connect-account/legal/full\"><span style='font-size:\r\n10.0pt;mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:\r\nCalibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:128;border:none windowtext 1.0pt;\r\nmso-border-alt:none windowtext 0in;padding:0in;background:white;text-decoration:\r\nnone;text-underline:none'>Stripe Connected Account Agreement</span></a></span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-hansi-font-family:\r\nCalibri;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;\r\nmso-themetint:128;background:white'>, </span><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:\r\nCalibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>which includes\r\nthe<span style='background:white'> </span></span><span style='font-size:\r\n8.0pt'><a href=\"https://stripe.com/legal\"><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:\r\nCalibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:128;border:none windowtext 1.0pt;\r\nmso-border-alt:none windowtext 0in;padding:0in;background:white;text-decoration:\r\nnone;text-underline:none'>Stripe Terms of Service</span></a></span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-hansi-font-family:\r\nCalibri;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;\r\nmso-themetint:128;background:white'> </span><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:\r\nCalibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>(collectively,\r\nthe “<b>Stripe Services Agreement</b>â€).<span style='mso-spacerun:yes'> \r\n</span>By agreeing to this Agreement and using Stripe as Payment Processor, <a\r\nname=\"_Int_WqBpYLpe\"></a><span class=GramE><span style='mso-bookmark:_Int_WqBpYLpe'>You</span></span><span\r\nstyle='mso-bookmark:_Int_WqBpYLpe'></span> agree to be bound by the Stripe\r\nServices Agreement, as the same may be modified by Stripe from time to\r\ntime.<span style='mso-spacerun:yes'> </span>As a condition of Microsoft\r\nenabling payment processing services through Stripe, <span class=GramE>You</span>\r\nagrees to provide Microsoft accurate and complete information about You and its\r\nbusiness, and You authorize Microsoft to share such information and transaction\r\ninformation related to Your use of the payment processing services provided by\r\nStripe. </span><span style='font-size:8.0pt;mso-ascii-font-family:Calibri;\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'><o:p></o:p></span></p>\r\n\r\n<p class=OutHead2 style='text-indent:0in;mso-list:none;tab-stops:.5in'><span\r\nstyle='font-size:10.0pt;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:\r\ntext1;mso-themetint:128'>ii)<span style='mso-tab-count:1'>             </span><b>Terms\r\nApplicable to Use of Other Payment Processors</b>.<span\r\nstyle='mso-spacerun:yes'> </span>Microsoft reserves the right to change or add\r\nPayment Processors at any time in Microsoft’s sole discretion.<span\r\nstyle='mso-spacerun:yes'> </span>Your continued engagement in the pubCenter\r\nProgram may require Your agreement to additional terms specific to additional\r\nor other Payment Processors. <o:p></o:p></span></p>\r\n\r\n<p class=OutHead1 style='margin-left:0in;text-indent:0in;mso-list:none;\r\ntab-stops:.5in'><b style='mso-bidi-font-weight:normal'><span style='font-size:\r\n10.0pt;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;\r\nmso-themetint:128'>c)<span style='mso-bidi-font-weight:bold'> </span>Payment\r\nProcessor Onboarding<span style='mso-bidi-font-weight:bold'>.<span\r\nstyle='mso-spacerun:yes'> </span></span></span></b><span style='font-size:\r\n10.0pt;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;\r\nmso-themetint:128'>To enable payments, <a name=\"_Int_zsklxzjJ\"></a><span\r\nclass=GramE><span style='mso-bookmark:_Int_zsklxzjJ'>You</span></span><span\r\nstyle='mso-bookmark:_Int_zsklxzjJ'></span> must have, or obtain, an appropriate\r\naccount with a Payment Processor (“<b>Payment Processor Account</b>â€), complete\r\nany onboarding requirements the Payment Processor or Microsoft may have, and connect\r\nYour Payment Processor Account with Your pubCenter Account.<span\r\nstyle='mso-spacerun:yes'> </span>Microsoft is not responsible for Payment\r\nProcessor’s decisions about whether to create or maintain a Payment Processor\r\nAccount for You.<span style='mso-spacerun:yes'> </span>You are solely\r\nresponsible for maintaining Your Payment Processor Account, including the\r\naccuracy and completeness of all information related to such account, whether\r\nprovided to the Payment Processor or to Microsoft.<span\r\nstyle='mso-spacerun:yes'> </span>You acknowledge and understand that the\r\nPayment Processor or Microsoft may, in their sole discretion, suspend or\r\nterminate Your ability to receive payments through Your Payment Processor\r\nAccount.<span style='mso-spacerun:yes'> </span>You must maintain the security\r\nof Your Payment Processor Account and promptly notify Microsoft if You discover\r\nor suspect that someone has accessed Your Payment Processor Account without\r\npermission.<span style='mso-spacerun:yes'> </span>You are solely responsible\r\nfor all activities that occur under or through Your Payment Processor Account\r\nwhether such actions were taken by You or not.<span style='mso-spacerun:yes'> \r\n</span>You authorize Microsoft to take certain actions through Your Payment\r\nProcessor Account as permitted under the Agreement and the additional terms You\r\nagree to with the Payment Processor including communicating information about\r\ntransactions conducted through the Payment Processor Account such as charges, refunds,\r\nadjustments, and the handling of disputes. <o:p></o:p></span></p>\r\n\r\n<p class=OutHead1 style='margin-left:0in;text-indent:0in;mso-list:none;\r\ntab-stops:.5in'><b style='mso-bidi-font-weight:normal'><span style='font-size:\r\n10.0pt;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;\r\nmso-themetint:128'>d</span></b><span style='font-size:10.0pt;mso-bidi-font-family:\r\nCalibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:128;mso-bidi-font-weight:\r\nbold'>)</span><b style='mso-bidi-font-weight:normal'><span style='font-size:\r\n10.0pt;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;\r\nmso-themetint:128'>Violation of Payment Processor Agreements<span\r\nstyle='mso-bidi-font-weight:bold'>.<span style='mso-spacerun:yes'> </span></span></span></b><span\r\nstyle='font-size:10.0pt;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:\r\ntext1;mso-themetint:128'>If Microsoft receives notice that Your activity\r\nviolates its agreements with the Payment Processor, Microsoft may in its sole\r\ndiscretion <span class=GramE>take action</span> against Your account to comply\r\nwith Microsoft’s obligations to the Payment Processor.<span\r\nstyle='mso-spacerun:yes'> </span>Such actions may include canceling\r\ntransactions, disabling Your connection to the Payment Processor, and/or\r\nsuspending Your access to or use of the pubCenter Programs. <o:p></o:p></span></p>\r\n\r\n<p class=OutHead1 style='margin-left:0in;text-indent:0in;mso-list:none;\r\ntab-stops:.5in'><span class=GramE><b><span style='font-size:10.0pt;mso-bidi-font-family:\r\nCalibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>e</span></b><span\r\nstyle='font-size:10.0pt;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:\r\ntext1;mso-themetint:128'>)<b style='mso-bidi-font-weight:normal'>Your</b></span></span><b\r\nstyle='mso-bidi-font-weight:normal'><span style='font-size:10.0pt;mso-bidi-font-family:\r\nCalibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:128'> Acknowledgment<span\r\nstyle='mso-bidi-font-weight:bold'>.<span style='mso-spacerun:yes'> </span></span></span></b><span\r\nstyle='font-size:10.0pt;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:\r\ntext1;mso-themetint:128'>You agree and acknowledge that: <o:p></o:p></span></p>\r\n\r\n<p class=OutHead2 style='text-indent:0in;mso-list:none;tab-stops:.5in'><span\r\nclass=SpellE><span style='font-size:10.0pt;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>i</span></span><span\r\nstyle='font-size:10.0pt;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:\r\ntext1;mso-themetint:128'>)<span style='mso-tab-count:1'>               </span>Notwithstanding\r\nanything to the contrary herein (including the section regarding assignment and\r\nsublicensing), Microsoft will have no responsibility or liability for any\r\nlosses or damages relating to or arising out of the Payment Processor’s\r\nservices, including but not limited to the receipt or transmission of payments,\r\nlosses or damages from misdirected or lost payments, breaches of security,\r\nchargebacks, fraud, theft of funds, violations of banking, money-laundering,\r\nprivacy, or any other laws relating to or arising out of the use of the Payment\r\nProcessor’s services; <o:p></o:p></span></p>\r\n\r\n<p class=OutHead2 style='text-indent:0in;mso-list:none;tab-stops:.5in'><span\r\nstyle='font-size:10.0pt;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:\r\ntext1;mso-themetint:128'>ii)<span style='mso-tab-count:1'>             </span>Nothing\r\nherein is intended to limit any rights You may have against the Payment <span\r\nclass=GramE>Processor;</span><o:p></o:p></span></p>\r\n\r\n<p class=OutHead2 style='text-indent:0in;mso-list:none;tab-stops:.5in'><span\r\nstyle='font-size:10.0pt;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:\r\ntext1;mso-themetint:128'>iii)<span style='mso-tab-count:1'>            </span>Designation\r\nof any Payment Processor does not represent an endorsement by Microsoft of the\r\nPayment Processor or its services, and You will rely on Your own diligence <span\r\nclass=GramE>with regard to</span> the Payment Processor, and You agree that You\r\nwill not state or imply any such endorsement by Microsoft<a\r\nname=\"_heading=h.ihv636\"></a>; and<b style='mso-bidi-font-weight:normal'><o:p></o:p></b></span></p>\r\n\r\n<p class=OutHead2 style='margin-bottom:8.0pt;text-indent:0in;mso-list:none;\r\ntab-stops:.5in'><span style='font-size:10.0pt;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>iv)<span\r\nstyle='mso-tab-count:1'>            </span>Microsoft is not a bank or other\r\ndepository institution, payment institution, a money transmitter or a money\r\nservices business and does not offer any banking, money transmission or payment\r\nservices. <a name=\"_heading=h.4i7ojhp\"></a><a name=\"_heading=h.1mrcu09\"></a><b\r\nstyle='mso-bidi-font-weight:normal'><o:p></o:p></b></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>10. TAXES. </span></b><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:\r\nCalibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>Each party will\r\nbear its own taxes in connection with the transactions under this Agreement,\r\nand all such taxes (including but not limited to net income or gross receipts\r\ntaxes, and taxes arising from sales between a party and its customers) will be\r\nthe financial responsibility of the party who is obligated by operation of law\r\nto pay such tax.<span style='mso-spacerun:yes'> </span>Each party will pay to\r\nthe other party any sales, use or value added taxes that are owed by that party\r\nsolely as a result of entering into this Agreement and which are required to be\r\ncollected under applicable law.<span style='mso-spacerun:yes'> </span>A party\r\nmay provide to the other party a valid exemption certificate, in which case the\r\nother party will not collect the taxes covered by such certificate.<span\r\nstyle='mso-spacerun:yes'> </span>If any taxes are required to be withheld on\r\npayments made by one party to the other, the paying party will deduct such\r\ntaxes from the amount otherwise owed and pay them to the appropriate taxing\r\nauthority.<span style='mso-spacerun:yes'> </span>The paying party will secure\r\nand deliver to the other party an official receipt for those withholdings and\r\nother documents reasonably requested by the other party in order to claim a\r\nforeign tax credit or refund.<span style='mso-spacerun:yes'> </span>The\r\nparties will use reasonable efforts to ensure that any taxes withheld are\r\nminimized to the extent possible under applicable law.</span><b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'><o:p></o:p></span></b></p>\r\n\r\n<p class=MsoNormal style='margin-bottom:0in;text-align:justify;text-justify:\r\ninter-ideograph;line-height:normal'><b style='mso-bidi-font-weight:normal'><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>11. DATA AND <span\r\nstyle='mso-bidi-font-weight:bold'>TRADEMARKS.</span> </span></b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'><o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='margin-bottom:0in;text-align:justify;text-justify:\r\ninter-ideograph;line-height:normal'><b><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>a) </span></b><span style='font-size:\r\n10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>Microsoft will collect data\r\nabout Your use of a pubCenter Program and its performance in\r\nconnection with Your Properties. As between You and Microsoft, Microsoft owns\r\nand controls all data collected in connection with pubCenter Programs or from\r\nMicrosoft online properties, apps, and other technology like our tags, pixels,\r\nor other unique tracking codes (“<b>pubCenter Data</b>â€). You understand and\r\nacknowledge that Microsoft uses pubCenter Data for its own purposes, including\r\nto (a) generate aggregated reports that may be viewed by Microsoft’s clients\r\nand partners, (b) improve the pubCenter Program and other Microsoft advertising\r\nproducts and services and optimize their performance and (c) provide campaign\r\nreporting to advertisers whose advertising was displayed on Your Properties or\r\notherwise related to reporting and performance analysis. In addition, with\r\nrespect to the pubCenter Program for Mobile App Developers and the pubCenter\r\nProgram for Win App Developers, Microsoft will have the right to, without any\r\nadditional consent or approval from You, share with advertisers and partners\r\n(e.g., ad networks or exchanges) information specific to Your Mobile\r\nApps and Win Apps including, without limitation, the Mobile App’s or Win App’s\r\nname, Your name as publisher of the Mobile App or Win App, impression data and\r\ntargeting availability.<b style='mso-bidi-font-weight:normal'> </b>You\r\nexpressly agree to worldwide disclosure and transfer of data described in this\r\nSection 11 to Microsoft without any charge.<span style='mso-spacerun:yes'> \r\n</span>If Microsoft makes available to You reports or other\r\ninformation related to Your Properties, upon Microsoft’s request, <span\r\nclass=GramE>You</span> will provide screenshots or other representations\r\nof such reports and information to Microsoft, and You agree that Microsoft may\r\ncopy, distribute and otherwise use these reports and information solely to\r\nprovide and promote the pubCenter Program, and promote Microsoft’s relationship\r\nwith You to potential advertisers.<span style='mso-spacerun:yes'> \r\n</span>Microsoft does not share personal information that may be contained in\r\npubCenter Data collected <span class=GramE>as a result of</span> Your use of\r\npubCenter Programs with third parties in any way that identifies individuals\r\npersonally. To the extent such pubCenter Data is also personal information, we\r\ncollect, use, and disclose such data as described in the Microsoft Privacy\r\nStatement available at https://privacy.microsoft.com/en-us/privacystatement.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>b</span></b><b style='mso-bidi-font-weight:normal'><span style='font-size:\r\n10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>) </span></b><span style='font-size:\r\n10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>You grant to Microsoft a worldwide,\r\nnonexclusive, royalty-free, fully paid-up license to display and otherwise use\r\nYour trademarks and trade names that You provide to Microsoft in writing\r\n(including via email) (the “<b style='mso-bidi-font-weight:normal'>Publisher\r\nMarks</b>â€) for the purposes of providing and promoting the pubCenter\r\nPrograms. Microsoft will comply with Your trademark usage\r\nguidelines that You provide to Microsoft in writing. All goodwill,\r\nrights, and benefits in the Publisher Marks that arise from Microsoft’s use\r\nunder this Agreement will inure solely to You. <o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>12. PRIVACY. </span></b><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>Nothing in this Agreement provides for\r\nthe collection or transfer between You and Microsoft of any\r\npersonally identifying information of an end user without the express\r\nconsent of the end user. You must maintain and comply with a posted privacy\r\npolicy on Your Properties and must use the pubCenter Programs and all\r\nother Microsoft technologies in a manner consistent with this privacy policy.\r\nYou assume all liability for the collection, use and disclosure of data related\r\nto users of Your Properties and You will comply with all applicable\r\nlaws and regulations in Your collection, use and disclosure of this data.\r\nMicrosoft does not intend to share any personally identifying information\r\nunder this Agreement with You. However, to the extent that Microsoft does share\r\nany information with You that could be considered “personal information†or\r\n“personal data†under the California Consumer Privacy Act ("<b>CCPA</b>â€),\r\nthe General Data Protection Regulation (“<b>GDPR</b>â€), or any other applicable\r\nprivacy law, You are prohibited from: (<span class=SpellE>i</span>) selling or\r\nsharing such personal information unless the consumer is first provided notice\r\nand an opportunity to opt out of the sale or sharing in the United States; or\r\n(ii) retaining, using, or disclosing such personal information for any purpose\r\nother than for the specific purpose intended when it was shared. You will\r\ncomply with all applicable obligations under the CCPA, GDPR and other\r\napplicable privacy laws and will provide the level of privacy protection\r\nrequired of your business. You will notify Microsoft if you determine that you\r\ncan no longer comply with this section of the Agreement, and you will maintain\r\nreasonable security procedures and practices appropriate to the nature of the\r\npersonal information to protect the personal information from unauthorized or\r\nillegal access, destruction, use, modification, or disclosure. <a\r\nname=\"_Ref267068822\"><o:p></o:p></a></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><span style='mso-bookmark:_Ref267068822'><b\r\nstyle='mso-bidi-font-weight:normal'><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>13.</span></b></span><b style='mso-bidi-font-weight:normal'><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'> CONSUMER\r\nNOTICES. </span></b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>You will maintain a privacy policy, along with consumer privacy notices\r\nthat refer to Your privacy policy, that are all prominently visible\r\non or in Your Properties and <span class=GramE>all of</span> Your websites.\r\nYour privacy policies and notices must be based on then-current laws,\r\nregulations and industry best practices and must include at a minimum: (a) a\r\nfull, accurate and clear disclosure regarding the placement, use and reading of\r\ncookies (if applicable) and related technologies, and any collection, sharing\r\nand use of data related to activity by users; (b) Your use of Microsoft and/or\r\nother third party ad providers and a pubCenter Program for the delivery of\r\nadvertising and data collection by Microsoft and/or other third party ad\r\nproviders in connection with the pubCenter Program; (c) explicitly\r\nobtain affirmative user consent prior to collecting or using user-related\r\ninformation; and (d) a disclosure that users may choose to not participate\r\nin Microsoft’s or other third-party ad providers’ personalized advertising\r\nservices, along with a clear, meaningful and prominent link (such as in the\r\nfooter of its website) to Microsoft-specified web address at </span><span\r\nstyle='font-size:8.0pt'><a href=\"https://choice.live.com/AdvertisementChoice/\"><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>https://choice.live.com/AdvertisementChoice/</span></a></span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'> or other industry\r\nopt-out tools approved by Microsoft where users may "opt out" of such\r\npersonalized advertising services. Currently approved industry\r\nopt-outs include without limitation, www.networkadvertising.org/ or the\r\nSelf-Regulatory Program for Behavioral Advertising Consumer Choice opt-out page\r\nlocated at </span><span style='font-size:8.0pt'><a\r\nhref=\"http://www.aboutads.info/\"><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>www.AboutAds.info</span></a></span><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'> for the US and Canada or </span><span\r\nstyle='font-size:8.0pt'><a href=\"http://www.youronlinechoices.eu/\"><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>http://www.youronlinechoices.eu/</span></a></span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'> for Europe, or the\r\napplicable laws and regulations in the People’s Republic of China in this\r\nregard. If at any time after acceptance of these terms specific US\r\nand/or legislation of any country applicable to You or Your Properties provides\r\nfor additional legal requirements to Your Properties or relevant activities (e.g.,\r\ndata collection), You agree to immediately adjust Your Properties so that they\r\nbecome compliant with all applicable legislation regardless of any notice from\r\nMicrosoft in this regard. You agree that You are solely liable for\r\ncomplying with <span class=GramE>any and all</span> applicable legislation from\r\nthe countries where Your Properties are developed and intended to be made\r\navailable or legislation that is otherwise applicable to You.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><a name=\"_Ref270378698\"><b style='mso-bidi-font-weight:\r\nnormal'><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>14.</span></b></a><b\r\nstyle='mso-bidi-font-weight:normal'><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'> SUPPORT AND FEEDBACK. </span></b><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>Microsoft is not obligated to provide\r\nany technical or other support to You for the pubCenter Programs.\r\nIf You give feedback about the pubCenter Programs to Microsoft, then\r\nYou grant to Microsoft, without charge, the right to use, share, and\r\ncommercialize Your feedback in any way and for any purpose. You also grant to third\r\nparties, without charge, any patent rights necessary for their products, <span\r\nclass=GramE>technologies</span> and services to use or interface with any\r\nspecific parts of a Microsoft software or service that\r\nincorporates Your feedback. You will not give feedback that is subject\r\nto a license that requires Microsoft to license its software or documentation\r\nto third parties because Microsoft includes Your feedback in our\r\nsoftware or documentation. These rights that You grant to Microsoft and third\r\nparties in this Section 14 will survive any termination of this Agreement or\r\nany termination of Your rights to use the pubCenter Programs. In addition,\r\nif You receive any feedback, comments, or complaints from users of\r\nYour Properties about any advertising delivered by the pubCenter Programs, <span\r\nclass=GramE>You</span> will promptly forward this information to </span><span\r\nstyle='font-size:8.0pt'><a href=\"mailto:pubhelp@microsoft.com\"><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>pubhelp@microsoft.com</span></a></span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b style='mso-bidi-font-weight:normal'><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>15. USE OF\r\nTHIRD-PARTY ADVERTISING PLATFORMS. </span></b><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'><span\r\nstyle='mso-spacerun:yes'> </span>You have the option of authorizing the serving\r\nof ads from third-party advertising serving platforms (e.g., Google AdSense)\r\nwith whom you have an account (the “<b style='mso-bidi-font-weight:normal'>Third\r\nParty Platform Program</b>â€).<span style='mso-spacerun:yes'> </span>If you\r\nwould like to participate in the <span class=GramE>Third Party</span> Platform\r\nProgram, you will need to configure the settings for ad placement in your\r\nAccount, supply the requested authentication and authorization, and comply with\r\nthe third party platform’s applicable terms and policies (including privacy\r\nrules).<span style='mso-spacerun:yes'> </span>If you have elected to\r\nparticipate in the <span class=GramE>Third Party</span> Platform Program, you\r\nwill be prompted to log into your account with the third party platform and to\r\nauthorize Microsoft to have access to such account and data to facilitate ad\r\nserving and other related activities (e.g., reporting). Microsoft will have no\r\nresponsibility or liability for any losses or damages relating to or arising\r\nout of use of the <span class=GramE>Third Party</span> Platform Program or its\r\nfunctionality in connection with a pubCenter Program.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b style='mso-bidi-font-weight:normal'><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>16.PUBLICITY/INFORMATION\r\nREQUESTS.</span></b><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'> You may not cause or permit to be released any publicity,\r\nadvertisement, news release, public announcement, or denial or confirmation of\r\nthe same, in whatever form, regarding any aspect of this Agreement or the\r\nrelationship between You and Microsoft, without Microsoft’s prior\r\nwritten consent. In addition, <span class=GramE>You</span> may not\r\nuse Microsoft’s name, trade name, service marks, trademarks, trade dress or\r\nlogo in publicity releases, advertising or similar activities without\r\nMicrosoft’s prior written consent and compliance with the Microsoft Trademark\r\nGuidelines.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>17. RESERVATION OF RIGHTS. </span></b><span style='font-size:\r\n10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>Microsoft retains ownership of all\r\nintellectual property rights associated with the pubCenter Programs and the\r\npubCenter Site, its technology and any enhancements or modifications thereof.\r\nAs between Microsoft and You, <span class=GramE>You</span> retain all\r\nintellectual property rights in the contents of Your Properties, other than\r\nsuch content as Microsoft or its clients may supply. Microsoft’s clients will\r\nretain all right to the advertising displayed on Your Properties.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='margin-bottom:0in;text-align:justify;text-justify:\r\ninter-ideograph;line-height:normal'><b><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>18. WARRANTIES. </span></b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>At all times during the\r\nterm of this Agreement,<b> </b><span class=GramE>You</span> represent,\r\nwarrant and undertake to Microsoft that:<o:p></o:p></span></p>\r\n\r\n<p class=MsoListParagraphCxSpFirst style='margin-top:0in;margin-right:0in;\r\nmargin-bottom:0in;margin-left:.75in;mso-add-space:auto;text-indent:-.25in;\r\nline-height:normal;mso-list:l3 level2 lfo6;tab-stops:45.0pt'><![if !supportLists]><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\nCalibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'><span style='mso-list:Ignore'>i)<span\r\nstyle='font:7.0pt \"Times New Roman\"'> </span></span></span><![endif]><b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'><span\r\nstyle='mso-spacerun:yes'>   </span></span></b><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>You have the power and authority to\r\nenter into this Agreement and to fully perform Your obligations under this <span\r\nclass=GramE>Agreement;</span><o:p></o:p></span></p>\r\n\r\n<p class=MsoListParagraphCxSpMiddle style='margin-top:0in;margin-right:0in;\r\nmargin-bottom:0in;margin-left:.75in;mso-add-space:auto;text-indent:-.25in;\r\nline-height:normal;mso-list:l3 level2 lfo6;tab-stops:45.0pt'><![if !supportLists]><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\nCalibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'><span style='mso-list:Ignore'>ii)<span\r\nstyle='font:7.0pt \"Times New Roman\"'> </span></span></span><![endif]><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>You are a business or\r\nsole proprietor and not a <span class=GramE>consumer;</span><o:p></o:p></span></p>\r\n\r\n<p class=MsoListParagraphCxSpMiddle style='margin-top:0in;margin-right:0in;\r\nmargin-bottom:0in;margin-left:.75in;mso-add-space:auto;text-indent:-.25in;\r\nline-height:normal;mso-list:l3 level2 lfo6;tab-stops:45.0pt'><![if !supportLists]><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\nCalibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'><span style='mso-list:Ignore'>iii)<span\r\nstyle='font:7.0pt \"Times New Roman\"'> </span></span></span><![endif]><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>You are authorized to act\r\non behalf of any third party for which You facilitate participation in the\r\npubCenter <span class=GramE>Programs;</span><o:p></o:p></span></p>\r\n\r\n<p class=MsoListParagraphCxSpMiddle style='margin-top:0in;margin-right:0in;\r\nmargin-bottom:0in;margin-left:.75in;mso-add-space:auto;text-indent:-.25in;\r\nline-height:normal;mso-list:l3 level2 lfo6;tab-stops:45.0pt'><![if !supportLists]><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\nCalibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'><span style='mso-list:Ignore'>iv)<span\r\nstyle='font:7.0pt \"Times New Roman\"'> </span></span></span><![endif]><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>You have obtained any and\r\nall consents, approvals or licenses (including written consents of third\r\nparties where applicable) required for the display of advertising by a\r\npubCenter Program on or in Your Properties, including without limitation, the\r\ninternet content provider permit, as <span class=GramE>applicable;</span><o:p></o:p></span></p>\r\n\r\n<p class=MsoListParagraphCxSpMiddle style='margin-top:0in;margin-right:0in;\r\nmargin-bottom:0in;margin-left:.75in;mso-add-space:auto;text-indent:-.25in;\r\nline-height:normal;mso-list:l3 level2 lfo6;tab-stops:45.0pt'><![if !supportLists]><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\nCalibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'><span style='mso-list:Ignore'>v)<span\r\nstyle='font:7.0pt \"Times New Roman\"'> </span></span></span><![endif]><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>Your <span class=GramE>Properties</span>,\r\nincluding all activities carried on or through Your Properties, comply with all\r\napplicable laws and regulations;<o:p></o:p></span></p>\r\n\r\n<p class=MsoListParagraphCxSpMiddle style='margin-top:0in;margin-right:0in;\r\nmargin-bottom:0in;margin-left:.75in;mso-add-space:auto;text-indent:-.25in;\r\nline-height:normal;mso-list:l3 level2 lfo6;tab-stops:45.0pt'><![if !supportLists]><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\nCalibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'><span style='mso-list:Ignore'>vi)<span\r\nstyle='font:7.0pt \"Times New Roman\"'> </span></span></span><![endif]><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>Your <span class=GramE>Properties</span>\r\n(including the content available on or through Your Properties) do not\r\ninfringe, misappropriate or otherwise violate any third-party intellectual\r\nproperty right;<o:p></o:p></span></p>\r\n\r\n<p class=MsoListParagraphCxSpMiddle style='margin-top:0in;margin-right:0in;\r\nmargin-bottom:0in;margin-left:.75in;mso-add-space:auto;text-indent:-.25in;\r\nline-height:normal;mso-list:l3 level2 lfo6;tab-stops:45.0pt'><![if !supportLists]><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\nCalibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'><span style='mso-list:Ignore'>vii)<span\r\nstyle='font:7.0pt \"Times New Roman\"'> </span></span></span><![endif]><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>Your <span class=GramE>Properties</span>\r\ndo not violate the rights of any person or entity, including, without\r\nlimitation, rights of publicity or privacy, and are not defamatory, </span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\nCalibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>misleading, false, libelous, obscene,\r\nunlawful, or injurious to any third party</span><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>;<o:p></o:p></span></p>\r\n\r\n<p class=MsoListParagraphCxSpMiddle style='margin-top:0in;margin-right:0in;\r\nmargin-bottom:0in;margin-left:.75in;mso-add-space:auto;text-indent:-.25in;\r\nline-height:normal;mso-list:l3 level2 lfo6;tab-stops:45.0pt'><![if !supportLists]><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\nCalibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'><span style='mso-list:Ignore'>viii)<span\r\nstyle='font:7.0pt \"Times New Roman\"'> </span></span></span><![endif]><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>Your transfer and\r\ndisclosures of data to Microsoft are compliant with all applicable data\r\nprotection laws; and<o:p></o:p></span></p>\r\n\r\n<p class=MsoListParagraphCxSpLast style='margin-left:.75in;mso-add-space:auto;\r\ntext-indent:-.25in;line-height:normal;mso-list:l3 level2 lfo6;tab-stops:45.0pt'><![if !supportLists]><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\nCalibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'><span style='mso-list:Ignore'>ix)<span\r\nstyle='font:7.0pt \"Times New Roman\"'> </span></span></span><![endif]><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>The\r\ninformation You provide to Microsoft under or in connection with this\r\nAgreement is true, accurate, current, and complete and not misleading.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>If the person agreeing to these terms is an individual acting on behalf of\r\na business or sole proprietorship, such person hereby represents and warrants\r\nthat they are authorized to act on behalf of such business or sole\r\nproprietorship and that they are at least the older of 18 years of age or the\r\nage of majority in their applicable jurisdiction.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b style='mso-bidi-font-weight:normal'><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>19. BINDING\r\nARBITRATION AND CLASS ACTION WAIVER IF YOUR PRINCIPAL PLACE OF BUSINESS IS IN\r\nTHE UNITED STATES. </span></b><strong><span style='font-size:10.0pt;\r\nfont-family:\"Calibri\",sans-serif;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>We hope we never have a dispute, but if we do, You and we agree to try for\r\n60 days to work it out informally. If we can’t, You and we agree to binding\r\nindividual arbitration before the American Arbitration Association (“AAAâ€)\r\nunder the Federal Arbitration Act, and not to sue in court in front of a judge\r\nor jury. Instead, a neutral arbitrator will decide. Class action lawsuits,\r\nclass-wide arbitrations, private attorney-general actions, and any other\r\nproceeding where someone acts in a representative capacity aren’t allowed. Nor\r\nis combining individual proceedings without the consent of all parties.<span\r\nstyle='mso-spacerun:yes'> </span></span></strong><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>This Section applies to any dispute<b\r\nstyle='mso-bidi-font-weight:normal'> EXCEPT DISPUTES RELATING TO THE\r\nENFORCEMENT OR VALIDITY OF YOUR, YOUR LICENSORS’, MICROSOFT’S, OR MICROSOFT’S\r\nLICENSORS’ INTELLECTUAL PROPERTY RIGHTS. </b>The term “dispute†means any\r\ndispute, action, or other controversy between You and Microsoft\r\nconcerning the pubCenter Programs (including their price) or this Agreement,\r\nwhether in contract, warranty, tort, statute, regulation, ordinance, or any\r\nother legal or equitable basis. “Dispute†will be given the broadest possible\r\nmeaning allowable under law.</span><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'><o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>The complete Arbitration Agreement and\r\nClass Action Waiver contains more terms and is at </span></b><span\r\nstyle='font-size:8.0pt'><a\r\nhref=\"https://about.ads.microsoft.com/en-us/resources/policies/class-action-waiver-and-binding-arbitration\"><span\r\nstyle='font-size:10.0pt;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:\r\ntext1;mso-themetint:128'>https://about.ads.microsoft.com/en-us/resources/policies/class-action-waiver-and-binding-arbitration</span></a></span><b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-hansi-font-family:\r\nCalibri;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;\r\nmso-themetint:128'>. You and we agree to it. Please read it.</span></b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'><o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><a name=\"_Ref299921916\"><b><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>20.</span></b></a><b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'> DISCLAIMER OF\r\nWARRANTIES. </span></b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>MICROSOFT PROVIDES THE PUBCENTER SITE AND PUBCENTER PROGRAMS\r\n"AS-IS," "WITH ALL FAULTS," AND "AS AVAILABLE."\r\nYOU BEAR THE RISK OF USING THE PUBCENTER SITE AND PUBCENTER PROGRAMS TO DISPLAY\r\nADVERTISING ON OR IN YOUR PROPERTIES. TO THE MAXIMUM EXTENT PERMITTED BY LOCAL\r\nLAW, MICROSOFT EXCLUDES ANY EXPRESS, <span class=GramE>STATUTORY</span> OR\r\nIMPLIED WARRANTIES OR CONDITIONS, INCLUDING THOSE OF PRODUCT LIABILITY,\r\nMERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, WORKMANLIKE\r\nEFFORT, TITLE, AND NON-INFRINGEMENT, RELATING TO THE PUBCENTER SITE AND\r\nPUBCENTER PROGRAMS. </span><strong><span style='font-size:10.0pt;font-family:\r\n\"Calibri\",sans-serif;color:#7F7F7F;mso-themecolor:text1;mso-themetint:128;\r\nborder:none windowtext 1.0pt;mso-border-alt:none windowtext 0in;padding:0in;\r\nbackground:white;font-weight:normal'>YOU MAY HAVE CERTAIN RIGHTS UNDER YOUR\r\nLOCAL LAW. NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS, IF THEY\r\nARE APPLICABLE. </span></strong><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>WITHOUT LIMITING ANY OF THE FOREGOING, </span><strong><span\r\nstyle='font-size:10.0pt;font-family:\"Calibri\",sans-serif;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128;border:none windowtext 1.0pt;mso-border-alt:\r\nnone windowtext 0in;padding:0in;background:white;font-weight:normal;mso-bidi-font-weight:\r\nbold'>YOU ACKNOWLEDGE THAT COMPUTER AND TELECOMMUNICATIONS SYSTEMS ARE NOT\r\nFAULT-FREE AND OCCASIONAL PERIODS OF</span></strong><strong><span\r\nstyle='font-size:10.0pt;font-family:\"Calibri\",sans-serif;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128;border:none windowtext 1.0pt;mso-border-alt:\r\nnone windowtext 0in;padding:0in;background:white;mso-bidi-font-weight:normal'> </span></strong><strong><span\r\nstyle='font-size:10.0pt;font-family:\"Calibri\",sans-serif;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128;border:none windowtext 1.0pt;mso-border-alt:\r\nnone windowtext 0in;padding:0in;background:white;font-weight:normal;mso-bidi-font-weight:\r\nbold'>DOWNTIME OCCUR.</span></strong><strong><span style='font-size:6.5pt;\r\nfont-family:\"Calibri\",sans-serif;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128;border:none windowtext 1.0pt;mso-border-alt:none windowtext 0in;padding:\r\n0in;background:white'><span style='mso-spacerun:yes'> </span></span></strong><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>MICROSOFT EXPRESSLY\r\nDISCLAIMS ANY WARRANTIES OR CONDITIONS THAT ACCESS TO OR USE OF THE PUBCENTER\r\nSITE AND PUBCENTER PROGRAMS WILL BE UNINTERRUPTED, SECURE, OR ERROR FREE. <o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal;vertical-align:top'><span lang=EN-AU style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128;mso-ansi-language:EN-AU'>IF YOU LIVE IN\r\nAUSTRALIA, there are guarantees that are implied under the Australian Consumer\r\nLaw that may apply to the goods and services supplied to You as part\r\nof the <span class=SpellE>pubCenter</span> Programs (the “<b>AU Guarantees</b>â€).\r\nShould the AU Guarantees apply to You, then these AU Guarantees are not\r\nincluded in the disclaimers and exclusions specified by this Section 20. For\r\nthose <span class=SpellE>pubCenter</span> Programs that include services\r\n(rather than goods), should Microsoft breach any of the AU Guarantees, <span\r\nclass=GramE>Your</span> remedy is limited to receiving the supply of the\r\nservice again or the payment of the cost of having the services supplied again.\r\nFor those <span class=SpellE>pubCenter</span> Programs that includes goods\r\n(which includes computer software), the goods come with AU Guarantees that\r\ncannot be excluded under the Australian Consumer Law and You are entitled to a\r\nreplacement or refund for a major failure and compensation for any other\r\nreasonably foreseeable loss or damage. You are also entitled to have the goods\r\nrepaired or replaced if the goods fail to be of acceptable quality and the\r\nfailure does not amount to a major failure. In the case of software, the\r\nrepair of goods may not be practicable, and a replacement will be provided if\r\nthis is the case. For any AU Guarantees related issues, please\r\ncontact </span><span style='font-size:8.0pt'><a\r\nhref=\"mailto:pubhelp@microsoft.com\"><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>pubhelp@microsoft.com</span></a></span><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><a name=\"_Ref299921012\"><b style='mso-bidi-font-weight:\r\nnormal'><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>21.</span></b></a><b\r\nstyle='mso-bidi-font-weight:normal'><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'> EXCLUSIONS AND LIMITATION OF LIABILITY. </span></b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>TO THE MAXIMUM EXTENT\r\nPERMITTED BY LAW, IN NO EVENT WILL MICROSOFT BE LIABLE TO YOU FOR ANY INDIRECT,\r\nINCIDENTAL, CONSEQUENTIAL, PUNITIVE, SPECIAL, OR EXEMPLARY DAMAGES ARISING OUT\r\nOF OR THAT RELATE IN ANY WAY TO THIS AGREEMENT OR ITS PERFORMANCE. THIS\r\nEXCLUSION WILL APPLY REGARDLESS OF THE LEGAL THEORY UPON WHICH ANY CLAIM FOR\r\nSUCH DAMAGES IS BASED, WHETHER MICROSOFT HAD BEEN ADVISED OF THE POSSIBILITY OF\r\nSUCH DAMAGES, WHETHER SUCH DAMAGES WERE REASONABLY FORESEEABLE, OR WHETHER\r\nAPPLICATION OF THE EXCLUSION CAUSES ANY REMEDY TO FAIL OF ITS ESSENTIAL PURPOSE.\r\nIN ADDITION, MICROSOFT WILL NOT BE LIABLE TO YOU FOR DAMAGES OR LOSSES OF ANY\r\nCLASS OR KIND IN EXCESS OF AMOUNTS REMAINING DUE AND PAYABLE TO YOU UNDER A\r\nPUBCENTER PROGRAM. HOWEVER, NONE OF THE FORGOING LIMITATIONS WILL APPLY TO\r\nMICROSOFT’S INDEMNIFICATION OBLIGATION UNDER SECTION 22 (INDEMNIFCATION). </span><b><span\r\nlang=EN-GB style='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128;mso-ansi-language:EN-GB'>NOTHING\r\n</span></b><b style='mso-bidi-font-weight:normal'><span lang=EN-GB\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128;mso-ansi-language:EN-GB'>IN<span\r\nstyle='mso-bidi-font-weight:bold'> THIS</span> SECTION 21 WILL AFFECT THE\r\nSTATUTORY RIGHTS OF ANY CONSUMER TO EXCLUDE OR RESTRICT LIABILITY FOR DEATH OR\r\nPERSONAL INJURY ARISING FROM MICROSOFT’S NEGLIGENCE, FRAUD, OR GROSS NEGLIGENCE\r\nOR WILLFUL INTENT. SOME OR ALL OF THESE LIMITATIONS OR EXCLUSIONS MAY NOT APPLY\r\nTO YOU IF YOUR STATE, PROVINCE, OR COUNTRY DOES NOT ALLOW THE\r\nEXCLUSION OR LIMITATION OF INCIDENTAL, CONSEQUENTIAL OR OTHER DAMAGES.</span></b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'><o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='margin-top:0in;margin-right:0in;margin-bottom:0in;\r\nmargin-left:.4in;text-align:justify;text-justify:inter-ideograph;text-indent:\r\n-.4in;line-height:normal'><b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>22. INDEMNIFICATION.</span></b><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'><o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='margin-bottom:0in;text-align:justify;text-justify:\r\ninter-ideograph;line-height:normal'><b><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>a</span></b><span style='font-size:\r\n10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>) <b>By You. </b>You will\r\ndefend, indemnify and hold Microsoft and Microsoft’s affiliates, agents and\r\nemployees, harmless from all losses, damages, liability and expenses (including\r\nreasonable attorneys' fees) from any third-party claims, proceedings or suits\r\nresulting from or related to (<span class=SpellE>i</span>) any improper use by\r\nYou or Your Agents of the pubCenter Programs, (ii) any access or use by third\r\nparties of the pubCenter Programs through Your Account or with Your\r\nCredentials; (iii) any improper use of any tags, IDs, code, or the Microsoft\r\nAds SDK related to the pubCenter Programs that are provided to You, (iv) Your\r\nbreach of the Policies, Your warranties or any other term or provision of this\r\nAgreement; (v) Your Properties and (vi) Your collection, use and disclosure of\r\nuser related data.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='margin-bottom:0in;text-align:justify;text-justify:\r\ninter-ideograph;line-height:normal'><b style='mso-bidi-font-weight:normal'><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>b</span></b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>) <b\r\nstyle='mso-bidi-font-weight:normal'>By Microsoft. </b>Microsoft will\r\ndefend, <span class=GramE>indemnify</span> and hold You harmless from and\r\nagainst any and all losses, damages, liability and expenses from any\r\nthird-party claims, proceedings, or suits that arise out of a claim that the\r\npubCenter Programs or pubCenter Site, when accessed or used in accordance with\r\nthis Agreement and all applicable Microsoft policies and technical\r\nrequirements, infringes the intellectual property rights of any third party.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b style='mso-bidi-font-weight:normal'><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>c</span></b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>) <b\r\nstyle='mso-bidi-font-weight:normal'>Requirements For Indemnification. </b>In\r\nconnection with any claims subject to the indemnification obligations above,\r\nthe party receiving indemnification (“<b style='mso-bidi-font-weight:normal'>Indemnified\r\nParty</b>â€) will (<span class=SpellE>i</span>) give the other party (“<b\r\nstyle='mso-bidi-font-weight:normal'>Indemnifying Party</b>â€) prompt written\r\nnotice of the claim, (ii) cooperate with the Indemnifying Party (at the\r\nIndemnifying Party's expense) in connection with the defense and settlement of\r\nthe claim, and (iii) permit the Indemnifying Party (through mutually agreed\r\ncounsel) to answer and defend the claim. The Indemnifying Party will not settle\r\nthe claim against the Indemnified Party without the Indemnified Party's prior\r\nwritten consent.<span style='mso-spacerun:yes'> </span></span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-hansi-font-family:\r\nCalibri;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;\r\nmso-themetint:128'>The Indemnifying Party will not be responsible for any\r\nsettlement made by the Indemnified Party without the Indemnifying Party’s\r\nconsent.</span><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'> The Indemnified Party (at its cost) may participate in the defense and\r\nsettlement of the claim with counsel of its own choosing. <a\r\nname=\"_Ref298984492\"><o:p></o:p></a></span></p>\r\n\r\n<p class=MsoCommentText><span style='mso-bookmark:_Ref298984492'><b><span\r\nstyle='mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>23.</span></b></span><b><span\r\nstyle='mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'> TERM AND TERMINATION. </span></b><span\r\nstyle='mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>The term of this Agreement will become\r\neffective upon Your access of either the pubCenter Site or a\r\npubCenter Program and continue until terminated by either You or Microsoft as\r\nprovided by this Section 23.<b> </b>You may cancel Your Accounts and\r\nterminate this Agreement at any time by providing written notice to Microsoft.\r\nMicrosoft will have the right to terminate or suspend, entirely or in part,\r\nYour use of the pubCenter Site and pubCenter Programs at any time upon notice\r\nwith respect to either all or some of Your Properties without cause or\r\nexplanation. In addition, if Microsoft reasonably believes that You have\r\nbreached this Agreement or that any of Your Properties are in violation of any\r\napplicable laws, regulations or Microsoft policies (whether internal or\r\nexternal), then Microsoft will have the right to immediately terminate or\r\nsuspend, entirely or in part, Your use of the pubCenter Site and pubCenter\r\nPrograms with respect to either all or some of Your Properties. Except for\r\npayments due and payable to You under a pubCenter Program, Microsoft\r\nwill have no liability to You for any termination or suspension under this\r\nSection 23.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b style='mso-bidi-font-weight:normal'><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>24. CONTACTS AND\r\nNOTICE. </span></b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>You must identify an individual to serve as the primary contact under this\r\nAgreement. This primary contact will be the default administrator for this\r\nAgreement and will receive all notices unless You change the primary\r\ncontact by updating Your Account information through the pubCenter Site.\r\nMicrosoft may provide notice to You via email or through the\r\npubCenter Site. All notices that You provide to Microsoft under this\r\nAgreement must be sent to </span><span style='font-size:8.0pt'><a\r\nhref=\"mailto:pubhelp@microsoft.com\"><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>pubhelp@microsoft.com</span></a></span><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>. Microsoft may\r\ndisclose Your or Your designated agent’s business contact information\r\nas necessary for Microsoft to administer this Agreement through its affiliates\r\nand other third parties that help Microsoft administer this Agreement.<a\r\nname=\"_Ref270379359\"></a><a name=\"_Ref270379320\"></a><o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b style='mso-bidi-font-weight:normal'><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>25. ASSIGNMENT AND\r\nSUBLICENSE.</span></b><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'> Microsoft may assign this Agreement to a Microsoft affiliate at any\r\ntime. You may not assign this Agreement or any rights or obligations hereunder\r\nwithout the prior written consent of Microsoft. Microsoft may also delegate its\r\nrights under this Agreement to third parties to assist Microsoft in performing\r\nits obligations under this Agreement, <span class=GramE>provided that</span>\r\nMicrosoft will be responsible for the performance of those third parties\r\nsubject to the terms of this Agreement.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b style='mso-bidi-font-weight:normal'><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>26. VENUE, CHOICE OF\r\nLAW. </span></b><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>If you live in (or, if a business, your principal place of business is in)\r\nthe United States, the laws of the state where you live (or, if a business,\r\nwhere your principal place of business is located) govern all claims,\r\nregardless of conflict of laws principles, except that the Federal Arbitration\r\nAct governs all provisions relating to arbitration. If your principal place of\r\nbusiness is in any other country, Nevada, USA law governs, regardless of\r\nconflict of laws principles. You and Microsoft irrevocably consent to the exclusive\r\njurisdiction and venue of the state or federal courts in King County,\r\nWashington, USA for all disputes arising out of or relating to this Agreement\r\nor a pubCenter Program that are heard in court (not arbitration and not small\r\nclaims court).<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>27. SURVIVAL; NON-EXCLUSIVITY. </span></b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>Sections of this\r\nAgreement that, by their terms, require performance after the termination or\r\nexpiration of this Agreement will survive. This Agreement is nonexclusive, and\r\nnothing in this Agreement may be construed as restricting Microsoft from\r\noffering the pubCenter Programs or any other Microsoft product or service to\r\nany third party.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>28.</span></b><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'> <b>UPDATES. </b>Microsoft may update this Agreement at any time\r\nin its sole discretion by providing You with notice of the update (“<b>Update\r\nNotice</b>â€). Following Microsoft’s provision to You of an Update\r\nNotice, by continuing to access and use either the pubCenter Site or a\r\npubCenter Program You agree to be bound by the updated version of this\r\nAgreement referenced in the Update Notice. If You do not agree with\r\nan update, do not continue to <span class=GramE>access</span> and use the\r\npubCenter Site and pubCenter Programs and immediately notify Microsoft that You\r\nare terminating this Agreement. Your continued access or use of either the\r\npubCenter Site or a pubCenter Program binds You to any updates to\r\nthis Agreement specified in an Update Notice.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><b><span style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>29.</span></b><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'> <b>LANGUAGE. </b></span><span lang=EN-CA style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128;mso-ansi-language:EN-CA'>It is the\r\nexpress wish of the parties that this Agreement and all related documents be in\r\nEnglish. </span><span lang=FR-CH style='font-size:10.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128;mso-ansi-language:FR-CH'>C’est la volonté expresse des parties que la\r\nprésente convention ainsi que les documents qui s’y rattachent soient rédigés\r\nen anglais.<o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal;mso-pagination:none'><b><span lang=FR-CH style='font-size:\r\n10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128;mso-ansi-language:FR-CH'>30.</span></b><span\r\nlang=FR-CH style='font-size:8.0pt;mso-ascii-font-family:Calibri;mso-hansi-font-family:\r\nCalibri;mso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;\r\nmso-themetint:128'> </span><b><span style='font-size:4.0pt;mso-ascii-font-family:\r\nCalibri;mso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128;text-transform:uppercase'> </span></b><b style='mso-bidi-font-weight:\r\nnormal'><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128;text-transform:uppercase'>Confidentiality</span></b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>.<span\r\nstyle='mso-spacerun:yes'> </span>Neither party will disclose the other’s\r\nConfidential Information to third parties. Each party will use the\r\nother’s Confidential Information only for purposes of the business\r\nrelationship. Each party agrees to take reasonable steps to protect the other’s\r\nConfidential Information. A party may disclose the other’s\r\nConfidential Information to its affiliates, <span class=GramE>employees</span>\r\nand contractors only, so long as the disclosing party remains responsible for\r\nany unauthorized use or disclosure. These disclosures may be made only on a\r\nneed-to-know basis, subject to the obligations of this Section. “<b>Confidential\r\nInformation</b>†means non-public information, know-how and trade secrets in\r\nany form, which is designated as confidential, or a reasonable person\r\nreasonably should understand to be confidential. The following types of\r\ninformation, however marked, are not confidential information: information that\r\n(<span class=SpellE>i</span>) is, or becomes, publicly available without a\r\nbreach of this Agreement; (ii) is lawfully known to the receiver of the information\r\nwithout an obligation to keep it confidential; (iii) is received from another\r\nsource who can disclose it lawfully and without an obligation to keep it\r\nconfidential; (iv) is independently developed without reference to the other\r\nparty’s Confidential Information; or (v) is a comment or suggestion one party\r\nvolunteers about the other’s business, products or services. Each\r\nparty may disclose the other’s Confidential Information if required to comply\r\nwith a court order or other government demand that has the force of law. Before\r\ndoing so, the receiving party must seek the highest level of protection\r\navailable and, when possible, give the disclosing party enough prior notice to\r\nprovide a reasonable chance to seek a protective order for its Confidential Information.</span><span\r\nstyle='font-size:8.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\nCalibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'><o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal;mso-pagination:none'><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>If You and Microsoft Corporation have\r\nentered into a standard Microsoft Corporation Non-Disclosure Agreement (“<b>NDA</b>â€),\r\nthen the terms most favorable to Microsoft between this Agreement and the NDA\r\nwill prevail. <o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal;mso-pagination:none'><b><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>31</span></b><span style='font-size:\r\n10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>.<b style='mso-bidi-font-weight:normal'>Export\r\n<span style='mso-bidi-font-weight:bold'>Controls</span></b>. The Parties acknowledge\r\nthat the devices, services, software, and related technology (“Itemsâ€) may be\r\nsubject to U.S. and other countries’ export jurisdictions. Each Party will\r\ncomply with all laws and regulations applicable to the import or export of the\r\nItems, including but not limited to trade laws such as the U.S. Export\r\nAdministration Regulations and International Traffic in Arms Regulations, and\r\nsanctions regulations administered by the U.S. Office of Foreign Assets Control\r\n(“OFACâ€) (“trade lawsâ€). You will not take any action that causes us to violate\r\nU.S. or other applicable trade laws. <span class=GramE>In the event that</span>\r\nyou learn of a potential violation of trade laws relating to the performance of\r\nthis Agreement, or a potential violation of the terms in this subsection, it\r\nwill alert us as soon as possible, but in no event more than 14 days after\r\nacquiring this knowledge. We may suspend or terminate this Agreement to the\r\nextent that we reasonably conclude that performance would cause us to violate\r\nU.S. or other applicable trade laws, including those described above, or put it\r\nat risk of becoming the subject of economic sanctions under such laws.<span\r\nclass=normaltextrun><b style='mso-bidi-font-weight:normal'> </b> For\r\nadditional information related to exporting, see </span></span><span\r\nstyle='font-size:8.0pt'><a href=\"http://www.microsoft.com/exporting\"><span\r\nstyle='font-size:10.0pt;mso-fareast-font-family:Calibri;mso-bidi-font-family:\r\nCalibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>http://www.microsoft.com/exporting</span></a></span><span\r\nclass=normaltextrun><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'>.</span></span><span class=eop><b style='mso-bidi-font-weight:normal'><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'> </span></b></span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'><o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='line-height:normal;mso-pagination:none;page-break-after:\r\navoid'><b style='mso-bidi-font-weight:normal'><span style='font-size:10.0pt;\r\nmso-ascii-font-family:Calibri;mso-fareast-font-family:\"Times New Roman\";\r\nmso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>32. Anti-Bribery/Anti-Corruption. </span></b><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>You represent and warrant\r\nthat you have reviewed and will comply with the Anti-Corruption Policy for Microsoft\r\nRepresentatives available at </span><span style='font-size:8.0pt'><a\r\nhref=\"http://www.microsoft.com/en-us/Legal/Compliance/anticorruption\"><span\r\nstyle='mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri;color:#7F7F7F;\r\nmso-themecolor:text1;mso-themetint:128'>http://www.microsoft.com/en-us/Legal/Compliance/anticorruption</span></a></span><span\r\nstyle='font-size:10.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:\r\n\"Times New Roman\";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;\r\ncolor:#7F7F7F;mso-themecolor:text1;mso-themetint:128'>. You will provide annual\r\ntraining to your employees who resell, distribute, or market Microsoft products\r\nor services on compliance with Anti-Corruption Laws. You <span\r\nclass=GramE>represents</span> and warrants that this Anti-Corruption training\r\nhas been provided to its employees and, if not, you agree to participate annually\r\nin online Anti-Corruption training made available free of charge by us and\r\ncertify its completion, understanding, and compliance with the Anti-Corruption\r\nPolicy for Microsoft Representatives. <o:p></o:p></span></p>\r\n\r\n<p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph;\r\nline-height:normal'><span style='font-size:10.0pt;mso-ascii-font-family:Calibri;\r\nmso-fareast-font-family:\"Times New Roman\";mso-hansi-font-family:Calibri;\r\nmso-bidi-font-family:Calibri;color:#7F7F7F;mso-themecolor:text1;mso-themetint:\r\n128'><o:p> </o:p></span></p>\r\n\r\n<p class=MsoNormal><span style='font-size:8.0pt;line-height:107%'><o:p> </o:p></span></p>\r\n\r\n<p class=MsoNormal><span style='font-size:8.0pt;line-height:107%'><o:p> </o:p></span></p>\r\n\r\n<p class=MsoNormal><span style='font-size:8.0pt;line-height:107%'><o:p> </o:p></span></p>\r\n\r\n</div>\r\n\r\n</body>\r\n\r\n</html>\r\n`;\r\n\r\n// TODO - replace with actual TnC for tython experience once they are ready from business side\r\nexport const DEFAULT_TNC = `\r\n default TnC for Tython Experience\r\n`;\r\n","import { action } from 'mobx';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../logging/src/Log';\r\nimport { isNotAuthorizedUser, upperCaseCountryCode } from '../../../../@data';\r\nimport { uiConfig } from '../../../../config/ui.config';\r\nimport { EN_LOCALE_KEY, UNAUTHORIZED_LOCAL_STORAGE_LOCALE } from '../../../../constants';\r\nimport { onFetchTnC } from '../actions';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onFetchTnC, async (msg) => {\r\n const tncStore = getStore();\r\n const authorizedUserLocale = upperCaseCountryCode(msg.locale ?? EN_LOCALE_KEY);\r\n const unauthorizedUserLocale = upperCaseCountryCode(localStorage.getItem(UNAUTHORIZED_LOCAL_STORAGE_LOCALE) ?? EN_LOCALE_KEY);\r\n const TnCLocale = isNotAuthorizedUser() ? unauthorizedUserLocale : authorizedUserLocale;\r\n\r\n const url = uiConfig.getApiBaseAddress() + `/terms/getLatestByLocales?locales=${TnCLocale}`; // getLatest\r\n\r\n let response: Response;\r\n try {\r\n response = await fetch(url, {\r\n method: 'GET',\r\n });\r\n\r\n const responseJson = await response.json();\r\n\r\n if (response.ok) {\r\n const { releaseDate, version, localContent } = responseJson.data;\r\n action(() => {\r\n tncStore.content = localContent[TnCLocale];\r\n tncStore.latestTnCReleaseDate = releaseDate;\r\n tncStore.latestTnCVersion = version;\r\n })();\r\n } else {\r\n return Log.error(`Fetch latest Terms and Conditions failed. Error: ${JSON.stringify(responseJson.errors)}`);\r\n }\r\n } catch (e) {\r\n Log.error(e);\r\n } finally {\r\n action(() => {\r\n tncStore.isDataLoaded = true;\r\n })();\r\n }\r\n});\r\n","import { FeedbackType } from '../../../../layout/PageLayout/header-panels/FeedbackPanel/@data/store/schema/enums/FeedbackType';\r\nimport { Model } from './Model';\r\n\r\nexport class Feedback extends Model {\r\n public apiPath = undefined;\r\n public className = 'feedback';\r\n public type?: FeedbackType;\r\n public title?: string;\r\n public description?: string;\r\n public email?: string;\r\n}\r\n","import { Model } from '.';\r\nimport { User } from './User';\r\n\r\nexport class UserCreateFromInvitation extends Model {\r\n public apiPath = 'livelogin/userCreateFromInvitation';\r\n public className = 'userCreateFromInvitation';\r\n\r\n public user?: User;\r\n public invitationCode?: string;\r\n public termsAndConditionsAccepted?: boolean;\r\n}\r\n","import { getReportPageStore } from './store';\r\n\r\nexport function getColumnMembers() {\r\n return getReportPageStore().columnMembers;\r\n}\r\n\r\nexport function getReportType() {\r\n return getReportPageStore().reportType;\r\n}\r\n","module.exports = __webpack_public_path__ + \"static/media/connectApp.89604c58.svg\";","module.exports = __webpack_public_path__ + \"static/media/connectSite.2b017668.svg\";","import { action, mutatorAction } from 'satcheljs';\r\nimport { ISubGeography } from '../..';\r\nimport { getMetaDataStore } from '../store/store';\r\n\r\nexport const fetchStatesOfCountry = action('fetchStatesOfCountry', (country: string) => ({ country }));\r\n\r\nexport const setStatesOfCountry = mutatorAction('setStatesOfCountry', (country: string, states: ISubGeography[]) => {\r\n const metadataStore = getMetaDataStore();\r\n if (!metadataStore.raw?.states) {\r\n metadataStore.raw.states = {};\r\n }\r\n\r\n metadataStore.raw.states[country] = states;\r\n});\r\n","import { DefaultButton, IButtonProps, PrimaryButton } from '@fluentui/react/lib/Button';\r\nimport { Dialog, DialogFooter, DialogType } from '@fluentui/react/lib/Dialog';\r\nimport React from 'react';\r\n\r\nexport interface IPopupProps {\r\n popUpTitle?: string;\r\n popUpDescription?: string;\r\n children?: JSX.Element;\r\n customButton?: JSX.Element;\r\n primaryButtonAriaLabel?: string;\r\n secondaryButtonAriaLabel?: string;\r\n isShown: boolean;\r\n isCloseButtonHidden?: boolean;\r\n onPopupDismiss: () => void;\r\n onPrimaryButtonClick?: IButtonProps['onClick'];\r\n onSecondaryButtonClick?: IButtonProps['onClick'];\r\n isPrimaryButtonDisabled?: boolean;\r\n}\r\n\r\nexport const PopupCard = ({\r\n popUpTitle,\r\n popUpDescription,\r\n children,\r\n customButton,\r\n primaryButtonAriaLabel,\r\n secondaryButtonAriaLabel,\r\n isShown,\r\n isCloseButtonHidden = false,\r\n isPrimaryButtonDisabled,\r\n onPrimaryButtonClick,\r\n onSecondaryButtonClick,\r\n onPopupDismiss,\r\n}: IPopupProps) => {\r\n return (\r\n <Dialog\r\n hidden={isShown === false}\r\n onDismiss={onPopupDismiss}\r\n dialogContentProps={{\r\n type: isCloseButtonHidden === true ? DialogType.normal : DialogType.close,\r\n title: popUpTitle,\r\n subText: popUpDescription,\r\n }}\r\n modalProps={{\r\n isBlocking: false,\r\n }}\r\n minWidth={500}\r\n >\r\n {children}\r\n\r\n <DialogFooter>\r\n {customButton}\r\n {primaryButtonAriaLabel && onPrimaryButtonClick && (\r\n <PrimaryButton\r\n onClick={onPrimaryButtonClick}\r\n disabled={isPrimaryButtonDisabled}\r\n data-test-id={`confirm-popup-${primaryButtonAriaLabel}`}\r\n >\r\n {primaryButtonAriaLabel}\r\n </PrimaryButton>\r\n )}\r\n {secondaryButtonAriaLabel && onSecondaryButtonClick && (\r\n <DefaultButton onClick={onSecondaryButtonClick} data-test-id={`confirm-popup-${secondaryButtonAriaLabel}`}>\r\n {secondaryButtonAriaLabel}\r\n </DefaultButton>\r\n )}\r\n </DialogFooter>\r\n </Dialog>\r\n );\r\n};\r\n","import { Environment } from \"./Environment\";\r\nimport { ILogManager } from \"./ILogManager\";\r\nimport { LoggingUtils } from \"./LoggingUtils\";\r\nimport { LogType } from \"./LogType\";\r\n\r\n\r\nexport class ConsoleLoggerManager implements ILogManager {\r\n public log(logType: LogType, logMessage: string | number | object): void {\r\n this._consoleLog(logType, logMessage);\r\n }\r\n\r\n private _getContextMessage(logType: LogType, logMessage: string | number | object): String {\r\n const contextMsg = logType + ': ' + JSON.stringify(logMessage);\r\n return contextMsg;\r\n }\r\n\r\n private _consoleLog(logType: LogType, logMessage: string | number | object) {\r\n const contextMsg = this._getContextMessage(logType, logMessage);\r\n const environment = LoggingUtils.getEnvironment();\r\n\r\n switch(logType) {\r\n case LogType.DEBUG: {\r\n if (environment === Environment.TEST || environment === Environment.SI) {\r\n console.log(contextMsg);\r\n }\r\n break;\r\n }\r\n\r\n case LogType.INFO: {\r\n if (environment === Environment.TEST || environment === Environment.SI) {\r\n // tslint:disable-next-line: no-console\r\n console.info(contextMsg);\r\n }\r\n break;\r\n }\r\n\r\n case LogType.WARN: {\r\n if (environment === Environment.TEST || environment === Environment.SI) {\r\n // tslint:disable-next-line: no-console\r\n console.warn(contextMsg);\r\n }\r\n break;\r\n }\r\n\r\n case LogType.ERROR: {\r\n console.error(contextMsg);\r\n break;\r\n }\r\n\r\n default: {\r\n console.log(contextMsg);\r\n break;\r\n }\r\n }\r\n }\r\n}","import { getAppStore } from '../../app/@data/store/store';\r\nimport { ILogUserContext } from './ILogUserContext';\r\n\r\nexport class DefaultLogUserContext implements ILogUserContext {\r\n public publisherId: number;\r\n public publisherName: string;\r\n public userName: string;\r\n public userId: number;\r\n public userEmail: string;\r\n public userContext;\r\n\r\n // future enhancements\r\n public trackingId: string;\r\n public url: string;\r\n\r\n constructor() {\r\n const pubObj = getAppStore().publisher;\r\n if (pubObj !== undefined) {\r\n this.publisherName = pubObj.name ? JSON.stringify(pubObj.name) : 'undefined';\r\n this.publisherId = pubObj.id ? pubObj.id : 0;\r\n }\r\n\r\n this.userContext = getAppStore().userContext;\r\n this.userName = this.userContext?.name;\r\n this.userId = this.userContext?.id;\r\n this.userEmail = this.userContext?.email ?? this.userContext?.username ?? undefined;\r\n }\r\n}\r\n","export enum LifeCycleStatus {\r\n Active = 'Active',\r\n Inactive = 'Inactive',\r\n Paused = 'Paused',\r\n Deleted = 'Deleted',\r\n}\r\n","import { EvidenceStatus } from '../enums';\r\nimport { Model } from './Model';\r\n\r\nexport class AppealHistory extends Model {\r\n public className = 'appeals';\r\n public apiPath = undefined;\r\n public rootRejectionCode: string;\r\n public latestEvidenceDocumentType: string;\r\n public scanStatus: EvidenceStatus;\r\n public submissionStatus: EvidenceStatus;\r\n public reviewStatus: string;\r\n public evidenceSubmissionHistory: EvidenceSubmissionHistory[];\r\n}\r\n\r\nexport class EvidenceSubmissionHistory {\r\n public customerDocumentName: string;\r\n public customerDocumentFileSizeBytes: number;\r\n public uploadedDateTime: Date;\r\n public submittedByUserId: string;\r\n public submittedByUserName: string;\r\n public evidenceDocumentType: string;\r\n}\r\n","import { Model } from './Model';\r\n\r\nexport class WelcomeToPubcenterEmail extends Model {\r\n public apiPath = \"sendWelcomeEmail\";\r\n public className = 'welcomeToPubcenterEmail';\r\n}","import { action } from 'satcheljs';\r\n\r\nexport const onIsAcceptInviteFlowChanged = action('onIsAcceptInviteFlowChanged', (isAcceptInviteFlow: boolean) => ({ isAcceptInviteFlow }));\r\n\r\nexport const onUserInvitationCodeChanged = action('onUserInvitationCodeChanged', (invitationCode: string) => ({ invitationCode }));\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onSavingChanged = action('onSavingChanged', (saving: boolean) => ({ saving }));\r\n","export function pluralize(name: string): string {\r\n if (name === '') {\r\n return '';\r\n }\r\n return name.endsWith('y') ? `${name.slice(0, -1)}ies` : name.endsWith('s') ? `${name}es` : `${name}s`;\r\n}\r\n\r\nexport function singularize(name: string): string {\r\n if (name === '') {\r\n return '';\r\n }\r\n return name.endsWith('ies')\r\n ? `${name.slice(0, -3)}y`\r\n : name.endsWith('es')\r\n ? `${name.slice(0, -2)}`\r\n : name.endsWith('s')\r\n ? `${name.slice(0, -1)}`\r\n : name;\r\n}\r\n\r\nexport function isEmpty(str: string | undefined): boolean {\r\n return typeof str === 'undefined' || !str || 0 === str.length;\r\n}\r\n\r\nexport function buildHtmlId(id: string) {\r\n return id.replace(/[\\s.]/g, '');\r\n}\r\n\r\n/**\r\n * Converts ',', '\\r' and '\\n' separated string to list of strings\r\n * Examples:\r\n * \"'example.com\\nexample.org\\nexample.net\\n'\" => ['example.com', 'example.org', 'example.net']\r\n * \"'example.com,example.org,example.net'\" => ['example.com', 'example.org', 'example.net']\r\n */\r\nexport function stringToList(str: string | undefined): string[] {\r\n const resultList: string[] = [];\r\n if (str !== undefined || str === '') {\r\n str\r\n .replace(/(\\r|\\n)/gm, ',') // replaces newline and carriage return characters with commas\r\n .split(',') // splits string into array of strings, using comma as the delimiter\r\n .map((s) => s.trim()) // trims whitespace from each string\r\n .filter((u) => u.length > 0) // removes empty strings\r\n .forEach((u) => resultList.push(u.trim())); // trims whitespace from each string\r\n }\r\n\r\n return resultList;\r\n}\r\n","export function hasAdQualityAccess(id?: number): boolean {\r\n if (process.env.REACT_APP_ENV === 'production' && id === 17160724) {\r\n return true;\r\n } else if ((process.env.REACT_APP_ENV === 'test' || process.env.REACT_APP_ENV === 'staging') && (id === 204461 || id === 279554782)) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n","import { getAppStore, getEntity, Publisher } from '../../../../../@data';\r\n\r\nexport async function fetchPublisherProfileDetails(publisher: Publisher): Promise<Publisher> {\r\n const { userContext } = getAppStore();\r\n\r\n const publisherProfileDetails = await getEntity<Publisher>([publisher], userContext);\r\n return publisherProfileDetails;\r\n}\r\n","import { FormattedMessage, InjectedIntl } from 'react-intl';\r\nimport { action, mutator, mutatorAction } from 'satcheljs';\r\nimport { RouteName, getAdManagementStore } from '../store/store';\r\n\r\nexport const onCurrentRouteChanged = action(\r\n 'onCurrentRouteChanged',\r\n (currentRoute: RouteName, formatMessage: InjectedIntl['formatMessage'], intlMessageId?: FormattedMessage.MessageDescriptor) => ({\r\n currentRoute,\r\n formatMessage,\r\n intlMessageId,\r\n })\r\n);\r\n\r\nmutator(onCurrentRouteChanged, ({ currentRoute }) => {\r\n getAdManagementStore().currentRoute = currentRoute;\r\n});\r\n\r\nexport const onPanelOpenChanged = mutatorAction('onPanelOpenChanged', (panelIsOpen: boolean) => {\r\n getAdManagementStore().panelIsOpen = panelIsOpen;\r\n});\r\n\r\nexport const onDoNotRenderDefaultPageChanged = mutatorAction('onDoNotRenderDefaultPageChanged', (doNotRenderDefaultPage: boolean) => {\r\n getAdManagementStore().doNotRenderDefaultPage = doNotRenderDefaultPage;\r\n});\r\n","import { useEffect, useState } from 'react';\r\nimport { AdUnit, constructUrl, getAppStore, Publisher } from '../@data';\r\n\r\nlet isAdBlockerDetectRun = false;\r\n\r\n// NOTE: Source: https://github.com/aruniverse/adblock-detect-react/blob/master/adblock-detect-react/src/hooks/useDetectAdBlock.ts\r\nexport const useDetectAdBlock = () => {\r\n const [adBlockDetected, setAdBlockDetected] = useState(false);\r\n const { publisher } = getAppStore();\r\n\r\n // We use the pubcenter fetch adunits API endpoint to detect ad blockers\r\n // If the request is blocked then we assume an ad blocker is present\r\n useEffect(() => {\r\n if (isAdBlockerDetectRun) {\r\n return;\r\n }\r\n\r\n const url = constructUrl([new Publisher(publisher?.id)], AdUnit, new URLSearchParams([['extendedInfo', 'true']]));\r\n fetch(url, {\r\n method: 'HEAD',\r\n mode: 'no-cors',\r\n cache: 'no-store',\r\n })\r\n .catch(() => {\r\n setAdBlockDetected(true);\r\n })\r\n .finally(() => {\r\n isAdBlockerDetectRun = true;\r\n });\r\n }, [publisher]);\r\n\r\n return adBlockDetected;\r\n};\r\n","import { RefObject, useEffect } from 'react';\r\n\r\n/**\r\n * Hook that alerts clicks outside of the passed ref\r\n */\r\nfunction useOnClickOutside<T extends HTMLElement>(ref: RefObject<T>, handler: (event: MouseEvent | TouchEvent) => void): void {\r\n useEffect(() => {\r\n const listener = (event: MouseEvent | TouchEvent) => {\r\n // Do nothing if clicking ref's element or descendent elements\r\n if (!ref.current || ref.current.contains(event.target as Node)) {\r\n return;\r\n }\r\n\r\n handler(event);\r\n };\r\n\r\n // Bind the event listener\r\n document.addEventListener('mousedown', listener);\r\n document.addEventListener('touchstart', listener);\r\n\r\n return () => {\r\n // Unbind the event listener on clean up\r\n document.removeEventListener('mousedown', listener);\r\n document.removeEventListener('touchstart', listener);\r\n };\r\n }, [ref, handler]); // Only re-run if ref or handler changes\r\n}\r\n\r\nexport default useOnClickOutside;\r\n","import { ICustomColumn } from '../../types';\r\n\r\nexport function sortItemsBasedOnColumn<ItemType>(items: ItemType[], column?: ICustomColumn): ItemType[] {\r\n if (!column) {\r\n return items;\r\n }\r\n\r\n if (!items || !items[0]) {\r\n return [];\r\n }\r\n\r\n const { sortFunction, sortableValue, isSortedDescending, fieldName } = column;\r\n\r\n // Use the sorting function if provided\r\n if (typeof sortFunction === 'function') {\r\n return items.sort((a, b) => sortFunction(a, b));\r\n }\r\n\r\n const sortedItems = items.concat([]).sort((a: ItemType, b: ItemType) => {\r\n const firstValue = getSortableValue(a, fieldName, sortableValue);\r\n const secondValue = getSortableValue(b, fieldName, sortableValue);\r\n\r\n if (firstValue === undefined && secondValue !== undefined) {\r\n return 1;\r\n } else if (secondValue === undefined) {\r\n return -1;\r\n }\r\n\r\n if (typeof firstValue === 'string' && typeof secondValue === 'string') {\r\n if (isSortedDescending) {\r\n return firstValue.toLowerCase() > secondValue.toLowerCase() ? -1 : 1;\r\n } else {\r\n return firstValue.toLowerCase() > secondValue.toLowerCase() ? 1 : -1;\r\n }\r\n } else {\r\n if (isSortedDescending) {\r\n return firstValue > secondValue ? -1 : 1;\r\n } else {\r\n return firstValue > secondValue ? 1 : -1;\r\n }\r\n }\r\n });\r\n return sortedItems;\r\n}\r\n\r\nfunction getSortableValue(item, fieldName, sortableValue) {\r\n // Use the sortableValue function if provided\r\n return sortableValue ? sortableValue(item) : item[fieldName || ''];\r\n}\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onPublisherDeleted = action('onPublisherDeleted');\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onUserSelfDeleted = action('onUserSelfDeleted');\r\n","import { FontWeights, getTheme, ITheme, keyframes, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../theme';\r\nimport { noPointerEvents } from '../../utils/GlobalStyleUtils';\r\n\r\nexport interface IGridWithCustomColumnStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\nexport interface IGridWithCustomColumnStyles {\r\n detailsListStyles?: string;\r\n detailsHeaderRootStyle?: string;\r\n detailsRowRootStyle?: string;\r\n headingRootStyle?: string;\r\n disabledRowStyle?: string;\r\n}\r\n\r\nexport const getStyles = (props: IGridWithCustomColumnStyleProps): IGridWithCustomColumnStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { spacing, palette, fonts } = theme;\r\n\r\n return mergeStyleSets({\r\n detailsListStyles: {\r\n fontWeight: FontWeights.regular,\r\n padding: 0,\r\n marginRight: '-1px',\r\n },\r\n detailsHeaderRootStyle: {\r\n fontWeight: FontWeights.regular,\r\n padding: 0,\r\n borderTop: `1px solid ${palette.neutralPrimary}`,\r\n borderBottom: `1px solid ${palette.neutralPrimary}`,\r\n '.ms-DetailsHeader-cell:not(:last-child)': {\r\n marginRight: '-1px',\r\n },\r\n },\r\n detailsRowRootStyle: {\r\n ...fonts.size14,\r\n '.ms-DetailsRow-cell:not(:last-child)': {\r\n marginRight: '-1px',\r\n borderBottom: 'none',\r\n },\r\n '.ms-DetailsRow-cell:(:last-child)': {\r\n borderBottom: 'none',\r\n },\r\n '.ms-DetailsRow-fields.updated': {\r\n animation: keyframes({\r\n '50%': {\r\n backgroundColor: palette.themeLighter,\r\n },\r\n }),\r\n animationDuration: '300ms',\r\n },\r\n },\r\n disabledRowStyle: {\r\n ...noPointerEvents,\r\n },\r\n headingRootStyle: {\r\n margin: `${spacing.size32} 0 ${spacing.size12}`,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): IGridWithCustomColumnStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { action } from 'satcheljs';\r\n\r\nexport const fetchPublisherEvaluationStatusAction = action('fetchPublisherEvaluationStatusAction', ({ cache = true } = {}) => ({ cache }));\r\n","import { IAccountPaymentInformation, IAdDeliverySetting, IAdExtensionOption, IMarket } from '../interfaces';\r\nimport { Model } from './Model';\r\n\r\nexport class Account extends Model {\r\n public apiPath = undefined;\r\n public className = 'accounts';\r\n public number?: number;\r\n public countryCode?: string;\r\n public currency?: string;\r\n public currencyCode?: string;\r\n public languageCode?: string;\r\n public primaryContactUserId?: number;\r\n public primaryContactUsername?: string;\r\n public createdDateTime?: string;\r\n public lastModifiedDateTime?: string;\r\n public lastModifiedBy?: string;\r\n public eTag?: string;\r\n public additionalMarkets?: IMarket[];\r\n public supportedSearchMarkets?: string[];\r\n public supportedMobileSearchMarkets?: string[];\r\n public enabledFeatures?: string[];\r\n public adDeliverySettings?: IAdDeliverySetting[];\r\n public timeZoneId?: number;\r\n public revenueShare?: number;\r\n public allowRichAdsInSearch?: boolean;\r\n public adExtensionOptions?: IAdExtensionOption[];\r\n public storeIds?: number[];\r\n public partnerCodes?: string[];\r\n public formCodes?: string[];\r\n public startDistributionPlacementCodes?: string[];\r\n public startDistributionOCIDL2s?: string[];\r\n public startDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentage?: number;\r\n public paymentInformation?: IAccountPaymentInformation;\r\n}\r\n","import { MediaType } from '..';\r\nimport { Model } from './Model';\r\n\r\nexport class AccountSKU extends Model {\r\n public apiPath = undefined;\r\n public className = 'accountSku';\r\n public accountId: number;\r\n public medium: MediaType;\r\n public sku: string;\r\n}\r\n","import { AdPropertyType, AdUnitServingTier, AdUnitType, PublisherGroupConfig } from '../enums';\r\nimport { IAdUnitClassification, IAttribute } from '../interfaces';\r\nimport { AdSenseAdUnitStatus } from './AdSenseAdUnitStatus';\r\nimport { Model } from './Model';\r\n\r\nexport class AdUnit extends Model {\r\n public apiPath = undefined;\r\n public className = 'adunits';\r\n public classification: IAdUnitClassification;\r\n public attributes?: IAttribute;\r\n public channelIds: number[];\r\n public publisherGroupConfiguration?: PublisherGroupConfig;\r\n public storeIds?: number[];\r\n public adUnitType?: AdUnitType;\r\n public overrideNetworkAffiliation?: boolean;\r\n public accountId?: number;\r\n public accountName?: string;\r\n public adPropertyType?: AdPropertyType;\r\n public etag?: string;\r\n public servingCostTier?: AdUnitServingTier;\r\n public partnerCodes?: string[];\r\n public propertyId?: number;\r\n public propertyUrl?: string;\r\n public mediatedWithAdSense: AdSenseAdUnitStatus;\r\n public creationDate: string;\r\n public taxonomy: string;\r\n public requireImpressionFeedbackForBillableTraffic?: boolean;\r\n}\r\n","import { AuditType, UserRole } from '../enums';\r\nimport { Model } from './Model';\r\n\r\nexport class AuditLog extends Model {\r\n public className = 'auditlogs';\r\n public apiPath = undefined;\r\n public modifiedAt: string;\r\n public publisherId: string;\r\n public auditType: AuditType;\r\n public entityType: string;\r\n public entityId: string;\r\n public entityName: string;\r\n public modifiedBy: string;\r\n public userEmail: string;\r\n public userRoles: UserRole[];\r\n public changes: AuditLogChange[];\r\n}\r\n\r\nexport class AuditLogChange {\r\n public attributeChanged: string;\r\n public oldValue: string;\r\n public newValue: string;\r\n public log?: string;\r\n}\r\n\r\nexport class AuditLogResponse {\r\n public changeLogs: AuditLog[];\r\n public pageNumber: number;\r\n public pageSize: number;\r\n public totalPages: number;\r\n public totalRecords: number;\r\n}\r\n","import { ChannelType } from '../enums';\r\nimport { Model } from './Model';\r\n\r\nexport class Channel extends Model {\r\n public apiPath = undefined;\r\n public className = 'channels';\r\n public accountId?: number;\r\n public associatedAdUnitIds?: number[];\r\n public associatedFilterIds?: number[];\r\n public associatedAdUnitCount?: number;\r\n public associatedFilterCount?: number;\r\n public type?: ChannelType = ChannelType.CUSTOM;\r\n public defaultCategoryIds?: number[];\r\n public defaultKeywords?: string[];\r\n public urls?: string[] = [];\r\n public eTag?: string;\r\n}\r\n","import { Model } from './Model';\r\n\r\nexport class EntityEvaluation extends Model {\r\n public className = 'entityEvaluation';\r\n public apiPath = undefined;\r\n}\r\n","import { Model } from './Model';\r\n\r\nexport class EntityPreferences extends Model {\r\n public apiPath = undefined;\r\n public className = 'preferences';\r\n public entityId: number;\r\n public notificationPreferences: NotificationPreferences;\r\n public systemPreferences: SystemPreferences;\r\n public tncSignatureStatus: TnCSignatureStatus;\r\n public showFRECards?: boolean;\r\n}\r\n\r\nexport class NotificationPreferences {\r\n public notifications: NotificationPreference[];\r\n}\r\n\r\nexport class NotificationPreference {\r\n public type: NotificationType;\r\n public enabled: boolean;\r\n}\r\n\r\nexport enum NotificationType {\r\n BillingAlert = 0,\r\n ServingStatus = 1,\r\n ProfileReview = 2,\r\n InvitedUser = 3,\r\n}\r\n\r\nexport class SystemPreferences {\r\n public locale?: string;\r\n public currency?: string;\r\n public countryCode?: string;\r\n}\r\n\r\nexport class TnCSignatureStatus {\r\n public acceptedVersion: string;\r\n public signatureDate: string;\r\n public isLatestAccepted: boolean;\r\n}\r\n","import { FilterScope } from '../enums';\r\nimport { Model } from './Model';\r\n\r\nexport class Filter extends Model {\r\n public apiPath = undefined;\r\n public className = 'filters';\r\n public appendOnly?: boolean;\r\n public associatedChannelIds?: number[];\r\n public associatedChannelCount?: number;\r\n public blockedAdKeywords?: string[];\r\n public blockedQueryKeywords?: string[];\r\n public blockedUrls?: string[];\r\n public filterScope?: FilterScope;\r\n public scopeId?: number;\r\n public blockedUrlCount?: number;\r\n public blockedAdKeywordCount?: number;\r\n public blockedQueryKeywordCount?: number;\r\n public startTime?: string;\r\n public endTime?: string;\r\n public startTimeStamp?: number;\r\n public endTimeStamp?: number;\r\n}\r\n","import { Model } from './Model';\r\n\r\nexport class FilterDownloader extends Model {\r\n public apiPath = undefined;\r\n public className = 'filterdownloader';\r\n public downloadUrl?: string;\r\n public blockedItemsCount?: number;\r\n}\r\n","import { Model } from './Model';\r\n\r\nexport class IPRange extends Model {\r\n public apiPath = undefined;\r\n public className = 'ipAddress';\r\n public minIPAddress?: string;\r\n public maxIPAddress?: string;\r\n}\r\n","// tslint:disable: max-line-length\r\n\r\nimport { TemplateType } from '..';\r\nimport { Model } from './Model';\r\n\r\nexport class NativeAdTemplate extends Model {\r\n public apiPath = undefined;\r\n public className = 'templates';\r\n\r\n public type: TemplateType;\r\n public adUnitId: number;\r\n public numberOfAds: number;\r\n public assets: Asset[];\r\n public renderingConfig: RenderingConfig;\r\n}\r\n\r\nexport class Asset {\r\n public required: number;\r\n public title?: Title;\r\n public img?: Image;\r\n public data?: Data;\r\n}\r\n\r\nexport class RenderingConfig {\r\n public customHtml?: string;\r\n public customCss?: string;\r\n public simplifiedHtml?: string;\r\n public drConfig: string;\r\n public gridRowCount: number;\r\n public gridColumnCount: number;\r\n public imageWidthPercentage?: number;\r\n public adCardWidth?: number;\r\n public gamAdUnit: GamAdUnit;\r\n}\r\n\r\nexport class GamAdUnit {\r\n public path?: string\r\n public isActive?: boolean\r\n public keyValuesName?: string\r\n public creativeId?: number\r\n}\r\n\r\nexport class Title {\r\n public len: number;\r\n}\r\n\r\nexport class Image {\r\n public type: ImageAssetType;\r\n public w: number;\r\n public h: number;\r\n}\r\n\r\nexport class Data {\r\n public type: DataAssetType;\r\n // len is an optional field based on openRTB spec\r\n public len?: number;\r\n}\r\n\r\nexport enum ImageAssetType {\r\n /**\r\n * Values from https://msasg.visualstudio.com/ContentServices/_git/ICE.Service.Monetization?path=/src/ICE.Service.Monetization.Rtb.Contracts/AssetImageType.cs&_a=contents&version=GBmaster\r\n */\r\n\r\n Thumbnail = 1,\r\n Large = 3,\r\n\r\n // TODO: Deprecated post-MSX to Xandr migration?\r\n TransparentImage = 500,\r\n\r\n /** Used to request unbounded number of images */\r\n // TODO: Deprecated post-MSX to Xandr migration?\r\n MultipleImages = 600,\r\n}\r\n\r\nexport enum DataAssetType {\r\n /**\r\n * Values from: https://msasg.visualstudio.com/ContentServices/_git/ICE.Service.Monetization?path=/src/ICE.Service.Monetization.Rtb.Contracts/AssetDataType.cs&_a=contents&version=GBmaster\r\n */\r\n\r\n /** Sponsored By message where response should contain the brand name of the sponsor. */\r\n Sponsored = 1,\r\n\r\n /**\r\n * Descriptive text associated with the product or service being advertised.\r\n * Longer length of text in response may be truncated or ellipsed by the exchange.\r\n */\r\n Description = 2,\r\n\r\n /**\r\n * Rating of the product being offered to the user.\r\n * For example an app’s rating in an app store from 0-5.\r\n */\r\n Rating = 3,\r\n\r\n /** Number of social ratings or “likes†of the product being offered to the user */\r\n Likes = 4,\r\n\r\n /** Number downloads/installs of this product */\r\n Downloads = 5,\r\n\r\n /**\r\n * Price for product / app / in-app purchase.\r\n * Value should include currency symbol in localised format.\r\n */\r\n Price = 6,\r\n\r\n /**\r\n * Sale price that can be used together with price to indicate a discounted price compared to a regular price.\r\n * Value should include currency symbol in localised format.\r\n */\r\n Saleprice = 7,\r\n\r\n /** Phone number */\r\n Phone = 8,\r\n\r\n /** Address */\r\n Address = 9,\r\n\r\n /** Additional descriptive text associated with the product or service being advertised */\r\n Description2 = 10,\r\n\r\n /**\r\n * Display URL for the text ad. To be used when sponsoring entity doesn’t own the content.\r\n * IE sponsored by BRAND on SITE (where SITE is transmitted in this field).\r\n */\r\n DisplayUrl = 11,\r\n\r\n /** CTA description - descriptive text describing a ‘call to action’ button for the destination URL. */\r\n CTAText = 12,\r\n\r\n /** Installment Price */\r\n // TODO: Deprecated post-MSX to Xandr migration?\r\n InstallmentPrice = 500,\r\n\r\n /** Price Drop */\r\n // TODO: Deprecated post-MSX to Xandr migration?\r\n PriceDrop = 501,\r\n\r\n /**\r\n * Presence of this asset means the decoration is available, no check on its value details.\r\n * Value is set to \"true\" when freeshipping is available.\r\n */\r\n // TODO: Deprecated post-MSX to Xandr migration?\r\n FreeShipping = 502,\r\n\r\n /** Top Viewed */\r\n // TODO: Deprecated post-MSX to Xandr migration?\r\n TopViewed = 503,\r\n\r\n /** Sold */\r\n // TODO: Deprecated post-MSX to Xandr migration?\r\n Sold = 504,\r\n\r\n /** Special Offer */\r\n // TODO: Deprecated post-MSX to Xandr migration?\r\n SpecialOffer = 505,\r\n\r\n /** Elite Badge */\r\n // TODO: Deprecated post-MSX to Xandr migration?\r\n EliteBadge = 506,\r\n\r\n /** Condition */\r\n // TODO: Deprecated post-MSX to Xandr migration?\r\n Condition = 507,\r\n\r\n /** Local Inventory Ad */\r\n // TODO: Deprecated post-MSX to Xandr migration?\r\n LIA = 508,\r\n\r\n /** Curbside Pickup */\r\n // TODO: Deprecated post-MSX to Xandr migration?\r\n CurbsidePickup = 509,\r\n\r\n /** Review */\r\n // TODO: Deprecated post-MSX to Xandr migration?\r\n Review = 510,\r\n\r\n /** Short Title */\r\n // TODO: Deprecated post-MSX to Xandr migration?\r\n ShortTitle = 511,\r\n\r\n /** Return Policy */\r\n // TODO: Deprecated post-MSX to Xandr migration?\r\n ReturnPolicy = 512,\r\n\r\n /** Disclaimer Text */\r\n // TODO: Deprecated post-MSX to Xandr migration?\r\n DisclaimerText = 513,\r\n}\r\n","import { NotificationPreferences } from './EntityPreferences';\r\nimport { Model } from './Model';\r\n\r\nexport class NotificationPreferencesUpdate extends Model {\r\n public apiPath = undefined;\r\n public className = 'updateNotificationPreferences';\r\n public notificationPreferences: NotificationPreferences;\r\n}\r\n","import { Model } from './Model';\r\n\r\nexport class PhoneVerificationVerifyCode extends Model {\r\n public apiPath = 'tokenVerification/verifyCode';\r\n public className = 'verifyCode';\r\n public requestId: string;\r\n public code: string;\r\n public data: IPhoneVerificationData;\r\n}\r\n\r\nexport class PhoneVerificationGenerateCode extends Model {\r\n public apiPath = 'tokenVerification/generateCode';\r\n public className = 'generateCode';\r\n public phoneNumberWithCountryCode?: string;\r\n public email?: string;\r\n public locale: string;\r\n public verificationMediumType: PhoneVerificationMediumType;\r\n public data: IPhoneVerificationData;\r\n}\r\n\r\nexport interface IPhoneVerificationData {\r\n requestId: string;\r\n status: string;\r\n statusId: number;\r\n subStatus: string;\r\n createdDateTime: string;\r\n}\r\n\r\nexport enum PhoneVerificationMediumType {\r\n email = 'Email',\r\n phoneSms = 'PhoneSms',\r\n phoneCall = 'PhoneVoice',\r\n}\r\n\r\n// Might need to make Status/SubStatus enum\r\nexport enum PhoneVerificationSubStatus {\r\n codeMismatched = 'Code mismatched',\r\n codeMatched = 'Code matched',\r\n codeSent = 'Code sent',\r\n deliveryFailed = 'Code delivery failed',\r\n expired = 'Expired',\r\n}\r\nexport enum VerificationStatus {\r\n PASS = 'Pass',\r\n FAILED = 'Fail',\r\n IN_PROGRESS = 'In progress',\r\n}\r\n","import { ClarityStatus, ClarityType, PropertyApprovalStatus } from '../enums';\r\nimport { Model } from './Model';\r\nimport { PropertyServingConfigs } from './ServingConfigs';\r\n\r\nexport enum InventoryPlatformType {\r\n Web = 'Web',\r\n UWP = 'UWP',\r\n}\r\nexport class Property extends Model {\r\n public apiPath = undefined;\r\n public className = 'properties';\r\n public approvalStatus: PropertyApprovalStatus;\r\n public approvalStatusComments: string;\r\n public disapprovalReasonId?: number;\r\n public lastStatusChangedTime: string;\r\n public lastUpdatedTimeStamp: string;\r\n public propertyId?: number;\r\n public propertyName: string;\r\n public publisherId: number;\r\n public url: string;\r\n public eTag?: string;\r\n public associatedAdUnitIds?: number[];\r\n public enableMicrosoftClarity?: boolean;\r\n public clarityProjectId?: string;\r\n public clarityProjectIdForTython?: string;\r\n public clarityStatus?: ClarityStatus;\r\n public clarityType?: ClarityType;\r\n public servingConfig?: PropertyServingConfigs;\r\n public MicrosoftStoreAppId?: string | null;\r\n public PartnerCenterSellerId?: string | null;\r\n public COPPAAgreement?: boolean | null;\r\n public inventoryPlatformType?: InventoryPlatformType;\r\n}\r\n","import { IPRange } from '.';\r\nimport { EntityLimitTier, FeatureOverideTier, NetworkAffiliation, Partner, PublisherTier, ServiceLevel } from '../enums';\r\nimport { PublisherType } from '../enums/PublisherType';\r\nimport { IAddress, IAllowedMarket } from '../interfaces';\r\nimport { Model } from './Model';\r\n\r\nexport interface IPublisherExtendedProperties {\r\n primaryContactUserId?: number;\r\n organizationEmailAddress?: string;\r\n organizationUrl?: string;\r\n ceoName?: string;\r\n}\r\n\r\nexport class Publisher extends Model {\r\n public apiPath = undefined;\r\n public className = 'publishers';\r\n public address?: IAddress;\r\n public allowDistributionReporting?: boolean;\r\n public allowDistributionV2Reporting?: boolean;\r\n public allowStartDistributionReporting?: boolean;\r\n public allowStartDistributionContentReporting?: boolean;\r\n public allowEndorReporting?: boolean;\r\n public allowMediationReporting?: boolean;\r\n public allowedMarkets?: IAllowedMarket[];\r\n public allowMobileSearchAdUnit?: boolean;\r\n public allowNativeReporting?: boolean;\r\n public allowSyndicationReporting?: boolean;\r\n public allowWebAdUnit?: boolean;\r\n public allowPaidSearchReportingApi?: boolean;\r\n public allowPaidSearchReportingDashboard?: boolean;\r\n public allowDynamicPropertyRegistration?: boolean;\r\n public enableDefaultTythonV2Reporting?: boolean;\r\n public createdDateTime?: string;\r\n public defaultAccountId?: number;\r\n public entityLimitTier?: EntityLimitTier;\r\n public eTag?: string;\r\n public financialStatus?: string;\r\n public ipRanges?: IPRange[];\r\n public lastModifiedBy?: string;\r\n public lastModifiedDateTime?: string;\r\n public networkAffiliation?: NetworkAffiliation;\r\n public overrideFeatureTier?: FeatureOverideTier;\r\n public partner?: Partner;\r\n public propertyAutoApproved?: boolean;\r\n public publisherMarket?: string;\r\n public publisherTier?: PublisherTier;\r\n public serviceLevel?: ServiceLevel;\r\n public extendedProperties?: IPublisherExtendedProperties;\r\n public publisherType?: PublisherType;\r\n\r\n // NOTE: Does not sound right for API to expose this field. This should have been a derived/computed field.\r\n // Pending on @srivatsa\r\n public profileComplete?: boolean;\r\n}\r\n","import {\r\n EntityLimitTier,\r\n FeatureOverideTier,\r\n IAddress,\r\n IAllowedMarket,\r\n NetworkAffiliation,\r\n Partner,\r\n PublisherPromotionalEmail,\r\n PublisherTier,\r\n ServiceLevel,\r\n} from '..';\r\nimport { PublisherType } from '../enums/PublisherType';\r\nimport { Model } from './Model';\r\n\r\nexport class PublisherCreate extends Model {\r\n public apiPath = 'support/publishers/register';\r\n public className = 'publishers';\r\n public address?: IAddress;\r\n public allowDistributionReporting?: boolean;\r\n public allowDistributionV2Reporting?: boolean;\r\n public allowStartDistributionReporting?: boolean;\r\n public allowStartDistributionContentReporting?: boolean;\r\n public allowSelectTierReporting?: boolean;\r\n public allowMediationReporting?: boolean;\r\n public allowedMarkets?: IAllowedMarket[];\r\n public allowMobileSearchAdUnit?: boolean;\r\n public allowNativeReporting?: boolean;\r\n public allowSyndicationReporting?: boolean;\r\n public allowPaidSearchReportingApi?: boolean;\r\n public allowPaidSearchReportingDashboard?: boolean;\r\n public enableDefaultTythonV2Reporting?: boolean;\r\n public allowWebAdUnit?: boolean;\r\n public entityLimitTier?: EntityLimitTier;\r\n public networkAffiliation?: NetworkAffiliation;\r\n public overrideFeatureTier?: FeatureOverideTier;\r\n public partner?: Partner;\r\n public propertyAutoApproved?: boolean;\r\n public publisherTier?: PublisherTier;\r\n public serviceLevel?: ServiceLevel;\r\n public publisherMarket?: string;\r\n public financialStatus?: string;\r\n public publisherType?: PublisherType;\r\n public promotionalEmail?: typeof PublisherPromotionalEmail[keyof typeof PublisherPromotionalEmail];\r\n}\r\n","import { Model } from './Model';\r\n\r\nexport class PublisherSearch extends Model {\r\n public apiPath = 'support/publishers/search';\r\n public className = 'publisherSearchSummaries';\r\n public publisherId: number;\r\n public publisherName?: string;\r\n}","import { Publisher, User } from '.';\r\nimport { Model } from './Model';\r\n\r\nexport class SelfServePublisher extends Model {\r\n public apiPath = undefined;\r\n public className = 'publishers';\r\n\r\n public publisher?: Publisher;\r\n public user?: User;\r\n}\r\n","import { AdTypes, NativeAdProperties } from '../../../../pages/ad-management/Adunit/TythonAdunit/CreateAdunit/types';\r\nimport { Model } from './Model';\r\n\r\nexport type TythonAdUnitServingConfig = {\r\n adUnitId?: number;\r\n accountId: number;\r\n propertyId: number;\r\n adUnitName: string;\r\n adTypes: AdTypes;\r\n nativeProperties: NativeAdProperties;\r\n};\r\n\r\nexport class TythonAdUnit extends Model {\r\n public apiPath = '';\r\n public className = 'servingConfig';\r\n public servingConfig?: TythonAdUnitServingConfig;\r\n /**\r\n * data for api return type in ad unit serving config endpoint\r\n */\r\n public data: { servingConfig: TythonAdUnitServingConfig };\r\n}\r\n","import { AdTypes, NativeAdProperties } from '../../../../pages/ad-management/Adunit/TythonAdunit/CreateAdunit/types';\r\nimport { Model } from './Model';\r\n\r\nexport class TythonAdUnits extends Model {\r\n public apiPath = undefined;\r\n public className = 'adUnitServingConfigs';\r\n public adunit?: {\r\n adUnitId?: number;\r\n accountId: number;\r\n propertyId: number;\r\n name: string;\r\n adTypes: AdTypes;\r\n nativeProperties: NativeAdProperties;\r\n };\r\n}\r\n","import { Model } from './Model';\r\n\r\nexport class UpdateStatus extends Model {\r\n public apiPath = undefined;\r\n public className = 'updateStatus';\r\n}","import { Model } from '.';\r\nimport { SecretQuestion } from '../enums';\r\nimport { IAddress, IContactInfo, INamePair, IUserRoleDetail } from '../interfaces';\r\n\r\nexport class User extends Model {\r\n public apiPath = undefined;\r\n public className = 'users';\r\n public contactByPost?: boolean;\r\n public contactByPhone?: boolean;\r\n public contactByEmail?: boolean;\r\n public contactInfo?: IContactInfo;\r\n public email?: string;\r\n public language?: string;\r\n public username?: string;\r\n public secretQuestion?: SecretQuestion;\r\n public postalAddress?: IAddress;\r\n public userRoleDetails?: IUserRoleDetail[];\r\n public windowsLiveIdUsername?: string;\r\n public userRoleDetailsETag?: string;\r\n public name?: INamePair;\r\n public phoneNumber?: string;\r\n}\r\n","import { Model } from '.';\r\nimport { IAddress } from '../interfaces';\r\n\r\nexport class UpdateUserContactDetails extends Model {\r\n public apiPath = undefined;\r\n public className = 'updateUserContact';\r\n public postalAddress?: IAddress;\r\n public userId: number;\r\n public phone?: string;\r\n}\r\n","import { TokenType, UserType } from '../enums';\r\n\r\nexport class UserContext {\r\n public className = 'userContext';\r\n public firstName?: string;\r\n public lastName?: string;\r\n public name?: string;\r\n public userName?: string;\r\n public email?: string;\r\n public token?: string;\r\n public tokenType?: TokenType;\r\n public userType?: UserType;\r\n public userRoles?: number[];\r\n public error?: string;\r\n public id: number;\r\n\r\n constructor(userName?: string, email?: string, tokenType?: TokenType) {\r\n this.name = userName;\r\n this.email = email;\r\n this.tokenType = tokenType || TokenType.PubCenterAADToken;\r\n }\r\n}\r\n","import { Model } from '.';\r\nimport { IUserRoleDetail } from '..';\r\nimport { UserInvitationType } from '../enums/UserInvitationType';\r\n\r\nexport class UserInvitation extends Model {\r\n public apiPath = undefined;\r\n public className = 'userInvitations';\r\n public accountIds?: number[];\r\n public publisherId?: number;\r\n public email?: string;\r\n public expirationDate?: Date | string;\r\n public firstName?: string;\r\n public lastName?: string;\r\n public lcid?: number;\r\n public roleIds?: number[];\r\n public entityRoles?: IUserRoleDetail[];\r\n public get fullName(): string {\r\n return this.firstName + ' ' + this.lastName;\r\n }\r\n public userInvitationType?: UserInvitationType;\r\n}\r\n","import { Model } from '.';\r\n\r\nexport class UserInvitationResend extends Model {\r\n public apiPath = undefined;\r\n public className = 'resend';\r\n}\r\n","import { Model } from '.';\r\nimport { IUserRoleDetail } from '..';\r\n\r\nexport class UserRoleUpdate extends Model {\r\n public apiPath = undefined;\r\n public className = 'updateRoles';\r\n public addedRoles?: IUserRoleDetail[];\r\n public removedRoles?: IUserRoleDetail[];\r\n public eTag?: string;\r\n}\r\n\r\nexport class FetchDevTokenStatus extends Model {\r\n public apiPath = undefined;\r\n public className = 'fetchApiDevTokenStatus';\r\n public TokenExists?: boolean;\r\n public ApiDevToken?: string;\r\n}\r\n\r\nexport class GenerateDevToken extends Model {\r\n public apiPath = undefined;\r\n public className = 'generateApiDevToken';\r\n public ApiDevToken?: string;\r\n}\r\n","import { Model } from './Model';\r\n\r\nexport class UserUpdateLanguage extends Model {\r\n public apiPath = undefined;\r\n public className = 'updateUserLanguage';\r\n public userId: number;\r\n public language: string;\r\n}\r\n","export class XPayJwtTokenRequest {\r\n public publisherId: number;\r\n public countryCode: string;\r\n}\r\n","import { action } from 'satcheljs';\r\nimport { Model } from '../../../../@data';\r\nimport { IGridQuery } from '../../GridV2.types';\r\n\r\nexport const onGridPageV2Initialized = action(\r\n 'onGridPageV2Initialized',\r\n (data: Model[], entity: new () => Model, query?: IGridQuery<Model>) => ({ data, entity, query })\r\n);\r\n","import { orchestrator } from 'satcheljs';\r\nimport {\r\n Account,\r\n LifeCycleStatus,\r\n Model,\r\n NotificationLabel,\r\n NotificationSeverity,\r\n Publisher,\r\n UpdateStatus,\r\n deleteEntity,\r\n getAppStore,\r\n onNotificationCardAdded,\r\n patchEntity,\r\n} from '../../../../@data';\r\nimport {\r\n onPopupOpenChanged,\r\n showErrorToastNotification,\r\n showLoadingToastNotification,\r\n showSuccessToastNotification,\r\n} from '../../../../@data/mutatorActions';\r\nimport { PopupType } from '../../../../@data/store/schema/enums/PopupType';\r\nimport AppMessages from '../../../../App.messages';\r\nimport notificationMessages from '../../../../NotificationsPanel.Types.messages';\r\nimport { getSuccessNotificationChangingStatus } from '../../../../utils';\r\nimport messages from '../../GridV2.messages';\r\nimport { onChangeItemsStatus } from '../actions/commandBarActions';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onChangeItemsStatus, async (msg) => {\r\n onPopupOpenChanged(PopupType.None);\r\n const { entity } = getStore();\r\n const status = msg.status;\r\n const selectedItems = msg.selectedItems;\r\n\r\n const showErrorMessage = () => {\r\n showErrorToastNotification({ textMessageDescriptor: messages.gridDataSubmittingChangingStatusFailed });\r\n onNotificationCardAdded({\r\n // tslint:disable-next-line: no-any\r\n severity: NotificationSeverity.Error,\r\n titleMessageDescriptor: notificationMessages.ChangingItemStatusFailureTitle,\r\n contentMessageDescriptor: notificationMessages.ChangingItemStatusFailureContent,\r\n notificationLabel: NotificationLabel.ChangingItemStatusFailure,\r\n });\r\n };\r\n\r\n const updateSucceeded = (result, entityInstance, ids) => {\r\n if (result) {\r\n const gridData = [...getStore().data];\r\n\r\n selectedItems.forEach((selItem) => {\r\n const itemCopy = { ...selItem } as Model;\r\n const index = gridData?.findIndex((dataItem) => dataItem.id === selItem.id);\r\n itemCopy.status = status;\r\n if (index !== -1) {\r\n gridData[index] = itemCopy;\r\n }\r\n });\r\n\r\n msg.setData?.(gridData);\r\n msg.onItemsStatusChanged?.(selectedItems, status);\r\n\r\n const commandText = status === LifeCycleStatus.Inactive ? AppMessages.deactivate.defaultMessage : AppMessages.activate.defaultMessage;\r\n // const notification = getSuccessNotification(commandText!, selectedItems, entityInstance, ids);\r\n const notification = getSuccessNotificationChangingStatus(commandText, selectedItems, entityInstance, msg.formatMessage, ids);\r\n showSuccessToastNotification({ text: notification });\r\n }\r\n };\r\n\r\n if (entity && selectedItems && status) {\r\n const { userContext, publisher } = getAppStore();\r\n\r\n if (userContext && publisher) {\r\n const ids = encodeURI(selectedItems.map((item) => item.id).join(','));\r\n\r\n let entityInstance = new entity();\r\n try {\r\n let result;\r\n if (entityInstance instanceof Account) {\r\n entityInstance.id = selectedItems[0].id;\r\n const updateParams = new URLSearchParams([['status', status]]);\r\n showLoadingToastNotification({\r\n textMessageDescriptor: messages.gridDataSubmittingChangingStatus,\r\n onDismiss: async () => {\r\n try {\r\n result = await patchEntity([publisher, entityInstance], UpdateStatus, undefined, userContext, updateParams);\r\n updateSucceeded(result, entityInstance, ids);\r\n } catch (e) {\r\n showErrorMessage();\r\n }\r\n },\r\n });\r\n } else if (entityInstance instanceof Publisher) {\r\n entityInstance = new Publisher(selectedItems[0].id);\r\n showLoadingToastNotification({\r\n textMessageDescriptor: messages.gridDataSubmittingChangingStatus,\r\n onDismiss: async () => {\r\n try {\r\n result = await deleteEntity([entityInstance], undefined, userContext);\r\n updateSucceeded(result, entityInstance, ids);\r\n } catch (e) {\r\n showErrorMessage();\r\n }\r\n },\r\n });\r\n } else {\r\n const updateParams = new URLSearchParams([\r\n ['ids', ids],\r\n ['status', status],\r\n ]);\r\n showLoadingToastNotification({\r\n textMessageDescriptor: messages.gridDataSubmittingChangingStatus,\r\n onDismiss: async () => {\r\n try {\r\n result = await patchEntity([publisher, entityInstance], UpdateStatus, undefined, userContext, updateParams);\r\n updateSucceeded(result, entityInstance, ids);\r\n } catch (e) {\r\n showErrorMessage();\r\n }\r\n },\r\n });\r\n }\r\n } catch (e) {\r\n showErrorMessage();\r\n }\r\n }\r\n }\r\n onPopupOpenChanged(PopupType.None);\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport {\r\n Model,\r\n NotificationLabel,\r\n NotificationSeverity,\r\n PopupType,\r\n Publisher,\r\n PublisherSearch,\r\n deleteEntity,\r\n getAppStore,\r\n onNotificationCardAdded,\r\n onPopupOpenChanged,\r\n showErrorToastNotification,\r\n showLoadingToastNotification,\r\n showSuccessToastNotification,\r\n} from '../../../../@data';\r\n\r\nimport notificationMessages from '../../../../NotificationsPanel.Types.messages';\r\nimport { getSuccessNotificationDeleteItem } from '../../../../utils';\r\nimport messages from '../../GridV2.messages';\r\nimport { onDeleteItem } from '../actions/commandBarActions';\r\nimport { setSelectedItems } from '../mutatorActions';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onDeleteItem, async (msg) => {\r\n onPopupOpenChanged(PopupType.None);\r\n\r\n const { entity } = getStore();\r\n const selectedItem = msg.selectedItem as Model;\r\n\r\n const showErrorMessage = () => {\r\n showErrorToastNotification({ textMessageDescriptor: messages.gridDataDeletingItemFailed });\r\n onNotificationCardAdded({\r\n // tslint:disable-next-line: no-any\r\n severity: NotificationSeverity.Error,\r\n titleMessageDescriptor: notificationMessages.DeletingItemFailureTitle,\r\n contentMessageDescriptor: notificationMessages.DeletingItemFailureContent,\r\n notificationLabel: NotificationLabel.DeletingItemFailure,\r\n });\r\n };\r\n\r\n const deleteSucceeded = async (result, entityInstance, formatMessage) => {\r\n if (result) {\r\n const items = getStore().data;\r\n if (items) {\r\n const copiedItems = items.filter((item) => item.id !== entityInstance.id);\r\n msg.deleteAction?.(copiedItems);\r\n msg.setData?.(copiedItems);\r\n await msg.postDeleteAction?.([msg.selectedItem]);\r\n }\r\n setSelectedItems([]);\r\n\r\n showSuccessToastNotification({ text: getSuccessNotificationDeleteItem([selectedItem], entityInstance, formatMessage) });\r\n }\r\n };\r\n\r\n if (entity && selectedItem) {\r\n const { userContext, publisher } = getAppStore();\r\n\r\n if (userContext && publisher) {\r\n let entityInstance = new entity();\r\n entityInstance.id = selectedItem.id;\r\n if (entityInstance instanceof PublisherSearch) {\r\n entityInstance = new Publisher();\r\n entityInstance.id = (selectedItem as PublisherSearch).publisherId;\r\n selectedItem.name = (selectedItem as PublisherSearch).publisherName;\r\n }\r\n\r\n await msg.preDeleteAction?.([msg.selectedItem]);\r\n\r\n try {\r\n let result;\r\n if (entityInstance instanceof Publisher) {\r\n showLoadingToastNotification({\r\n textMessageDescriptor: messages.gridDataDeletingItem,\r\n onDismiss: async () => {\r\n try {\r\n result = await deleteEntity([entityInstance], undefined, userContext);\r\n await deleteSucceeded(result, entityInstance, msg.formatMessage);\r\n } catch (e) {\r\n showErrorMessage();\r\n }\r\n },\r\n });\r\n } else {\r\n showLoadingToastNotification({\r\n textMessageDescriptor: messages.gridDataDeletingItem,\r\n onDismiss: async () => {\r\n try {\r\n result = await deleteEntity([publisher, entityInstance], undefined, userContext);\r\n await deleteSucceeded(result, entityInstance, msg.formatMessage);\r\n } catch (e) {\r\n showErrorMessage();\r\n }\r\n },\r\n });\r\n }\r\n } catch (e) {\r\n showErrorMessage();\r\n }\r\n }\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport {\r\n Account,\r\n AdUnit,\r\n Filter,\r\n Model,\r\n NotificationLabel,\r\n NotificationSeverity,\r\n Publisher,\r\n PublisherSearch,\r\n getAppStore,\r\n onNotificationCardAdded,\r\n showLoadingToastNotification,\r\n} from '../../../../@data';\r\nimport { onPopupOpenChanged, showErrorToastNotification, showSuccessToastNotification } from '../../../../@data/mutatorActions';\r\nimport { PopupType } from '../../../../@data/store/schema/enums/PopupType';\r\nimport notificationMessages from '../../../../NotificationsPanel.Types.messages';\r\nimport { getSuccessNotificationDuplicateItem } from '../../../../utils';\r\nimport messages from '../../GridV2.messages';\r\nimport { ISelectableRow } from '../../GridV2.types';\r\nimport { onDuplicateItem } from '../actions/commandBarActions';\r\nimport { setLoading } from '../mutatorActions';\r\nimport { duplicateAccount, duplicateData } from '../services/GridService';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onDuplicateItem, async (msg) => {\r\n onPopupOpenChanged(PopupType.None);\r\n\r\n const { entity } = getStore();\r\n\r\n const selectedItem = msg.selectedItem;\r\n\r\n const showErrorMessage = () => {\r\n // TODO: Figure out how to internationalize orchestrators. #1632176\r\n showErrorToastNotification({ textMessageDescriptor: messages.gridDataDuplicatingFailed });\r\n onNotificationCardAdded({\r\n // tslint:disable-next-line: no-any\r\n severity: NotificationSeverity.Error,\r\n titleMessageDescriptor: notificationMessages.DuplicateGridItemFailureTitle,\r\n contentMessageDescriptor: notificationMessages.DuplicateGridItemFailureContent,\r\n notificationLabel: NotificationLabel.DuplicateGridItemFailure,\r\n });\r\n };\r\n\r\n const duplicateSucceeded = (newEntity, entityInstance, formatMessage) => {\r\n if (newEntity) {\r\n const selectedEntity: Model = { ...msg.selectedItem, className: msg.selectedItem.className, apiPath: msg.selectedItem.apiPath };\r\n selectedEntity.name = selectedItem.name + ' (copy)';\r\n selectedEntity.id = newEntity.id;\r\n\r\n msg.setData?.([...(msg.data || []), selectedEntity].map((item) => ({ ...item, isSelected: false } as ISelectableRow)));\r\n msg.onDuplicateAction?.([selectedEntity]);\r\n\r\n // const commandText = AppMessages.duplicate.defaultMessage;\r\n // showSuccessToastNotification({ text: getSuccessNotification(commandText!, [newEntity], entityInstance) });\r\n showSuccessToastNotification({ text: getSuccessNotificationDuplicateItem([selectedItem], entityInstance, formatMessage) });\r\n }\r\n };\r\n\r\n if (entity && selectedItem) {\r\n const { userContext, publisher } = getAppStore();\r\n\r\n if (userContext && publisher) {\r\n let entityInstance = new entity();\r\n try {\r\n const id = encodeURI('' + selectedItem.id);\r\n if (entityInstance instanceof PublisherSearch) {\r\n entityInstance = new Publisher();\r\n }\r\n const enparams = new URLSearchParams([['ids', id]]);\r\n if (entityInstance instanceof AdUnit || entityInstance instanceof Filter) {\r\n enparams.append('type', 'Search');\r\n }\r\n if (entityInstance instanceof AdUnit) {\r\n enparams.append('details', 'true');\r\n }\r\n\r\n let newEntity;\r\n if (entityInstance instanceof Account) {\r\n showLoadingToastNotification({\r\n textMessageDescriptor: messages.gridDataDuplicating,\r\n onDismiss: async () => {\r\n try {\r\n newEntity = await duplicateAccount(publisher, selectedItem.id!, userContext);\r\n duplicateSucceeded(newEntity, entityInstance, msg.formatMessage);\r\n } catch (e) {\r\n showErrorMessage();\r\n }\r\n },\r\n });\r\n } else {\r\n showLoadingToastNotification({\r\n textMessageDescriptor: messages.gridDataDuplicating,\r\n onDismiss: async () => {\r\n try {\r\n newEntity = await duplicateData([publisher], userContext, entity, enparams);\r\n duplicateSucceeded(newEntity, entityInstance, msg.formatMessage);\r\n } catch (e) {\r\n showErrorMessage();\r\n }\r\n },\r\n });\r\n }\r\n } catch (e) {\r\n showErrorMessage();\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n }\r\n});\r\n","import { Account, getEntity, listEntity, Model, postEntity, Publisher, UserContext } from '../../../../@data';\r\nimport { restoreTypeWithObject } from '../../../../utils';\r\n\r\nexport async function getData(models: Model[], userContext: UserContext, entity?: new () => Model, params?: URLSearchParams) {\r\n return await listEntity(models, userContext, entity, params);\r\n}\r\n\r\nexport async function duplicateData(models: Model[], userContext: UserContext, entityType: new () => Model, params?: URLSearchParams) {\r\n let result: Model;\r\n try {\r\n result = await getEntity<Model>(models, userContext, entityType, params);\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n\r\n if (result) {\r\n let entityToDuplicate = result[0] as Model;\r\n entityToDuplicate.id = undefined;\r\n entityToDuplicate.name += ' (copy)';\r\n entityToDuplicate.eTag = undefined;\r\n entityToDuplicate = restoreTypeWithObject(new entityType(), entityToDuplicate)!;\r\n\r\n return await postEntity(models, entityType, entityToDuplicate, userContext);\r\n }\r\n}\r\n\r\nexport async function duplicateAccount(publisher: Publisher, accountIdToDuplicate: number, userContext: UserContext) {\r\n let result: Model;\r\n try {\r\n const account = new Account(accountIdToDuplicate);\r\n result = await getEntity([publisher, account], userContext);\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n\r\n if (result) {\r\n let entityToDuplicate = result as Model;\r\n entityToDuplicate.id = undefined;\r\n entityToDuplicate.name += ' (copy)';\r\n entityToDuplicate.eTag = undefined;\r\n entityToDuplicate = restoreTypeWithObject(new Account(), entityToDuplicate)!;\r\n return await postEntity([publisher], Account, entityToDuplicate, userContext);\r\n }\r\n}\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../logging/src';\r\nimport { onGridPageV2Initialized } from '../actions/gridActions';\r\nimport { setData, setEntity, setQuery } from '../mutatorActions';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onGridPageV2Initialized, ({ data, entity, query }) => {\r\n const store = getStore();\r\n let initialize = false;\r\n\r\n if (query && store.query !== query) {\r\n setQuery(query);\r\n initialize = true;\r\n }\r\n\r\n if (store.entity !== entity) {\r\n initialize = true;\r\n setEntity(entity);\r\n }\r\n\r\n if (JSON.stringify(store.data) !== JSON.stringify(data)) {\r\n setData(data);\r\n initialize = true;\r\n }\r\n\r\n if (initialize) {\r\n Log.debug('onGridPageV2Initialized');\r\n }\r\n});\r\n","import React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { LifeCycleStatus, Model, PopupType } from '../../../@data';\r\nimport AppMessages from '../../../App.messages';\r\nimport { PopupCard } from '../../../components/Popup';\r\nimport { injectIntlAndObserver } from '../../../utils';\r\nimport { onChangeItemsStatus } from '../@data/actions/commandBarActions';\r\nimport { setDialogType } from '../@data/mutatorActions';\r\nimport { getStore } from '../@data/store/store';\r\nimport { IDestructiveDialogLabelsProps } from '../GridV2.types';\r\n\r\nexport interface IDeactivateConfirmationDialogProps extends InjectedIntlProps {\r\n deactivateLabels?: IDestructiveDialogLabelsProps;\r\n setData?: (data?: Model[]) => void;\r\n data: Model[];\r\n // tslint:disable-next-line: no-any\r\n selectedItems: any[];\r\n onItemsStatusChanged?: (items?: Model[], status?: LifeCycleStatus) => void;\r\n onDismiss?: () => void;\r\n}\r\n\r\nexport const DeactivateConfirmationDialog = injectIntlAndObserver(function DeactivateConfirmationDialogComp({\r\n intl: { formatMessage },\r\n deactivateLabels,\r\n setData,\r\n data,\r\n selectedItems,\r\n onItemsStatusChanged,\r\n onDismiss,\r\n}: IDeactivateConfirmationDialogProps): JSX.Element | null {\r\n const { dialogType } = getStore();\r\n\r\n const onDialogDismissed = () => {\r\n setDialogType(PopupType.None);\r\n onDismiss?.();\r\n };\r\n\r\n const handleDeactivateButtonClick = () => {\r\n onChangeItemsStatus(selectedItems, LifeCycleStatus.Inactive, data, formatMessage, setData, onItemsStatusChanged);\r\n setDialogType(PopupType.None);\r\n };\r\n\r\n return (\r\n <PopupCard\r\n isShown={dialogType === PopupType.DeactivateConfirmation}\r\n popUpTitle={formatMessage(deactivateLabels ? deactivateLabels.title : AppMessages.deactivateGenericTitle)}\r\n popUpDescription={deactivateLabels?.description ? formatMessage(deactivateLabels.description) : undefined}\r\n onPopupDismiss={onDialogDismissed}\r\n onPrimaryButtonClick={handleDeactivateButtonClick}\r\n onSecondaryButtonClick={onDialogDismissed}\r\n primaryButtonAriaLabel={formatMessage(AppMessages.deactivate)}\r\n secondaryButtonAriaLabel={formatMessage(AppMessages.cancel)}\r\n />\r\n );\r\n});\r\n","import React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { Model, PopupType } from '../../../@data';\r\nimport AppMessages from '../../../App.messages';\r\nimport { PopupCard } from '../../../components/Popup';\r\nimport { injectIntlAndObserver } from '../../../utils';\r\nimport { onDeleteItem } from '../@data/actions/commandBarActions';\r\nimport { setDialogType } from '../@data/mutatorActions';\r\nimport { getStore } from '../@data/store/store';\r\nimport { IDestructiveDialogLabelsProps } from '../GridV2.types';\r\n\r\nexport interface IDeleteConfirmationDialogProps extends InjectedIntlProps {\r\n deleteLabels?: IDestructiveDialogLabelsProps;\r\n setData?: (data?: Model[]) => void;\r\n data: Model[];\r\n selectedItems: Model[];\r\n preDeleteAction?: (items: Model[]) => void;\r\n deleteAction?: (items: Model[]) => void;\r\n postDeleteAction?: (items: Model[]) => void;\r\n}\r\n\r\nexport const DeleteConfirmationDialog = injectIntlAndObserver(function DeleteConfirmationDialogComp({\r\n intl: { formatMessage },\r\n deleteLabels,\r\n setData,\r\n data,\r\n selectedItems,\r\n preDeleteAction,\r\n deleteAction,\r\n postDeleteAction,\r\n}: IDeleteConfirmationDialogProps): JSX.Element | null {\r\n const { dialogType } = getStore();\r\n\r\n const onDialogDismissed = () => setDialogType(PopupType.None);\r\n\r\n const handleDeleteButtonClick = () => {\r\n onDeleteItem(selectedItems[0], data, formatMessage, setData, preDeleteAction, deleteAction, postDeleteAction);\r\n onDialogDismissed();\r\n };\r\n\r\n return (\r\n <PopupCard\r\n isShown={dialogType === PopupType.DeleteConfirmation}\r\n popUpTitle={formatMessage(deleteLabels ? deleteLabels.title : AppMessages.deleteGenericTitle)}\r\n popUpDescription={deleteLabels?.description ? formatMessage(deleteLabels.description) : undefined}\r\n onPopupDismiss={onDialogDismissed}\r\n onPrimaryButtonClick={handleDeleteButtonClick}\r\n onSecondaryButtonClick={onDialogDismissed}\r\n primaryButtonAriaLabel={formatMessage(AppMessages.delete)}\r\n secondaryButtonAriaLabel={formatMessage(AppMessages.cancel)}\r\n />\r\n );\r\n});\r\n","import { Checkbox, DefaultButton, List, mergeStyleSets, Panel, PanelType, PrimaryButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { CustomPanelType, isTythonSelfServeUser } from '../../../@data';\r\nimport AppMessages from '../../../App.messages';\r\nimport { IconTooltip } from '../../../components/IconTooltip/IconTooltip';\r\nimport { APP_NAME_NEW, APP_NAME_PUBCENTER } from '../../../constants/AppConstants';\r\nimport { injectIntlAndObserver } from '../../../utils';\r\nimport { setPanelType } from '../@data/mutatorActions';\r\nimport { getStore } from '../@data/store/store';\r\nimport messages from '../GridV2.messages';\r\nimport { getClassNames } from '../GridV2.styles';\r\nimport { IColumnVisibilityMapping, IGridV2Column } from '../GridV2.types';\r\n\r\nexport interface IModifyColumnsPanelProps extends InjectedIntlProps {\r\n columns: IGridV2Column[];\r\n hideDescription?: boolean;\r\n changeColumnsVisibility: (changeColumnsVisibility: IColumnVisibilityMapping[]) => void;\r\n}\r\n\r\nexport const ModifyColumnsPanel = injectIntlAndObserver(function ModifyColumnsPanelComponent({\r\n intl,\r\n columns,\r\n hideDescription,\r\n changeColumnsVisibility,\r\n}: IModifyColumnsPanelProps) {\r\n const classNames = mergeStyleSets(getClassNames());\r\n\r\n const { formatMessage } = intl;\r\n const columnVisibilityMappings: IColumnVisibilityMapping[] = [];\r\n const { panelType } = getStore();\r\n\r\n const columnVisibilityChange = (column: IGridV2Column, value?: boolean) => {\r\n columnVisibilityMappings.push({ columnKey: column.key, isVisible: !!value });\r\n };\r\n\r\n const onModifyColumnsPanelHide = () => setPanelType(CustomPanelType.None);\r\n\r\n const handleModifyColumnsClicked = () => {\r\n changeColumnsVisibility(columnVisibilityMappings);\r\n onModifyColumnsPanelHide();\r\n };\r\n\r\n return (\r\n <Panel\r\n isOpen={panelType === CustomPanelType.ModifyColumns}\r\n type={PanelType.smallFixedFar}\r\n isLightDismiss\r\n onDismiss={onModifyColumnsPanelHide}\r\n headerText={formatMessage(AppMessages.modifyColumns)}\r\n closeButtonAriaLabel={formatMessage(AppMessages.panelCloseButtonAriaDesc)}\r\n styles={classNames.subComponentStyles.modifyColumnPanel}\r\n isFooterAtBottom={true}\r\n onRenderFooterContent={() => {\r\n return (\r\n <div className={classNames.panelButton}>\r\n <PrimaryButton\r\n onClick={handleModifyColumnsClicked}\r\n text={formatMessage(AppMessages.updateColumns)}\r\n ariaDescription={formatMessage(messages.modifyColumnsPanelApplyButtonAriaDesc)}\r\n />\r\n <DefaultButton onClick={onModifyColumnsPanelHide} text={formatMessage(AppMessages.cancel)} />\r\n </div>\r\n );\r\n }}\r\n >\r\n {!hideDescription && (\r\n <span className={classNames.modifyColumnDescription}>\r\n {formatMessage(AppMessages.modifyColumnsDescription, { appName: isTythonSelfServeUser() ? APP_NAME_NEW : APP_NAME_PUBCENTER })}\r\n </span>\r\n )}\r\n <List\r\n items={columns}\r\n onRenderCell={(column: IGridV2Column) => {\r\n return (\r\n <div className={classNames.columnCheckboxWrapper}>\r\n <Checkbox\r\n label={column.name}\r\n defaultChecked={column.isVisible}\r\n onChange={(_, value) => columnVisibilityChange(column, value)}\r\n disabled={column.isShowingDisabled}\r\n styles={classNames.subComponentStyles.columnCheckbox}\r\n />\r\n {column.incompatibleProps?.isIncompatible && (\r\n <div className={classNames.columnTooltip}>\r\n <IconTooltip tooltipMessage={column.incompatibleProps.incompatibleWontMessage || ''} iconName={'warning'} />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }}\r\n />\r\n </Panel>\r\n );\r\n});\r\n","import { IStyleFunctionOrObject } from '@fluentui/merge-styles';\r\nimport { getTheme, IButtonStyles, ICommandBarStyleProps, ICommandBarStyles } from '@fluentui/react';\r\nimport { IPubCenterFonts, IPubcenterPalette, IPubcenterSpacing } from '../../../../../theme';\r\n\r\nexport const getCustomCommandBarStyles = (\r\n itemsSelected: boolean,\r\n itemsCount: number\r\n): IStyleFunctionOrObject<ICommandBarStyleProps, ICommandBarStyles> => {\r\n const theme = getTheme();\r\n const palette = theme.palette as IPubcenterPalette;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n const overflowSetStyles = {\r\n backgroundColor: palette.white,\r\n gridGap: spacing.size4,\r\n };\r\n\r\n const styles = {\r\n root: {\r\n backgroundColor: palette.white,\r\n alignItems: 'center',\r\n height: spacing.size50,\r\n padding: '0',\r\n [`& .ms-OverflowSet-item:nth-child(${itemsCount})`]: {\r\n display: 'flex',\r\n flexGrow: itemsSelected ? 0 : 1,\r\n },\r\n },\r\n primarySet: {\r\n ...overflowSetStyles,\r\n },\r\n secondarySet: {\r\n ...overflowSetStyles,\r\n },\r\n };\r\n\r\n if (itemsCount === 0 && !itemsSelected) {\r\n styles.root['justify-content'] = 'flex-end';\r\n styles.primarySet['flex-grow'] = 0;\r\n }\r\n\r\n if (itemsSelected) {\r\n styles.root.backgroundColor = palette.themePrimary;\r\n styles.primarySet.backgroundColor = palette.themePrimary;\r\n styles.secondarySet.backgroundColor = palette.themePrimary;\r\n /* tslint:disable:no-string-literal */\r\n styles.secondarySet['height'] = '100%';\r\n }\r\n\r\n return styles;\r\n};\r\n\r\nexport const getButtonStyles = (): IButtonStyles => {\r\n const theme = getTheme();\r\n const { semanticColors: s, palette: p } = theme;\r\n const { size14 } = theme.fonts as IPubCenterFonts;\r\n\r\n return {\r\n root: {\r\n backgroundColor: s.primaryButtonBackground,\r\n color: s.primaryButtonText,\r\n ...size14,\r\n selectors: {\r\n '&:focus': {\r\n border: 'none',\r\n outlineColor: p.white,\r\n backgroundColor: 'black',\r\n },\r\n }, // UM_TODO: focus box is black, not getting reflected\r\n },\r\n rootHovered: {\r\n backgroundColor: s.primaryButtonBackgroundHovered,\r\n color: s.primaryButtonTextHovered,\r\n },\r\n rootPressed: {\r\n backgroundColor: s.primaryButtonBackgroundPressed,\r\n color: s.primaryButtonTextPressed,\r\n },\r\n rootFocused: {\r\n backgroundColor: s.primaryButtonBackgroundHovered,\r\n color: s.primaryButtonTextHovered,\r\n },\r\n rootExpandedHovered: {\r\n backgroundColor: s.primaryButtonBackground,\r\n color: s.primaryButtonText,\r\n },\r\n rootHasMenu: {\r\n backgroundColor: s.primaryButtonBackground,\r\n color: s.primaryButtonText,\r\n },\r\n icon: {\r\n backgroundColor: s.primaryButtonBackground,\r\n color: s.primaryButtonText,\r\n },\r\n iconHovered: {\r\n backgroundColor: s.primaryButtonBackgroundHovered,\r\n color: s.primaryButtonTextHovered,\r\n },\r\n iconExpanded: {\r\n backgroundColor: s.primaryButtonBackground,\r\n color: s.primaryButtonText,\r\n },\r\n iconExpandedHovered: {\r\n backgroundColor: s.primaryButtonBackground,\r\n color: s.primaryButtonText,\r\n },\r\n iconPressed: {\r\n backgroundColor: s.primaryButtonBackgroundPressed,\r\n color: s.primaryButtonTextPressed,\r\n },\r\n menuIcon: {\r\n backgroundColor: s.primaryButtonBackground,\r\n color: s.primaryButtonText,\r\n },\r\n menuIconHovered: {\r\n backgroundColor: s.primaryButtonBackgroundHovered,\r\n color: s.primaryButtonTextHovered,\r\n },\r\n menuIconPressed: {\r\n backgroundColor: s.primaryButtonBackgroundPressed,\r\n color: s.primaryButtonTextPressed,\r\n },\r\n menuIconExpandedHovered: {\r\n backgroundColor: s.primaryButtonBackground,\r\n color: s.primaryButtonText,\r\n },\r\n menuIconExpanded: {\r\n backgroundColor: s.primaryButtonBackground,\r\n color: s.primaryButtonText,\r\n },\r\n };\r\n};\r\n\r\nexport const getCountMenuStyles = () => {\r\n const theme = getTheme();\r\n const palette = theme.palette as IPubcenterPalette;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return {\r\n borderRight: `1px solid ${palette.white}`,\r\n margin: `${spacing.size10} 0`,\r\n padding: `${spacing.size4} ${spacing.size10}`,\r\n color: palette.white,\r\n };\r\n};\r\n","import { Callout, IconButton, SearchBox } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { getStore } from '../../../GridPageV2/@data/store/store';\r\nimport { setIsSearchCalloutVisible } from '../../@data/mutatorActions';\r\n\r\ninterface ISearchBoxCallOut {\r\n placeHolder?: string;\r\n handleSearch?: (val: string) => void;\r\n}\r\n\r\nexport const SearchBoxCallOut = function SearchBoxCallOutComponent(props: ISearchBoxCallOut) {\r\n const { placeHolder, handleSearch } = props;\r\n const { searchWord, isSearchCalloutVisible } = getStore();\r\n\r\n return (\r\n <>\r\n <IconButton\r\n id={'gridSearchIcon'}\r\n onClick={() => setIsSearchCalloutVisible(!isSearchCalloutVisible)}\r\n iconProps={{ iconName: 'Search' }}\r\n />\r\n {isSearchCalloutVisible && (\r\n <Callout\r\n style={{\r\n padding: '10px 15px',\r\n }}\r\n target={'#gridSearchIcon'}\r\n isBeakVisible={false}\r\n onDismiss={() => setIsSearchCalloutVisible(false)}\r\n directionalHint={5}\r\n >\r\n <SearchBox\r\n value={searchWord}\r\n placeholder={placeHolder ? placeHolder : ''}\r\n onChange={(_, val: string) => handleSearch?.(val)}\r\n onClear={() => handleSearch?.('')}\r\n ariaLabel={placeHolder}\r\n autoFocus={isSearchCalloutVisible}\r\n />\r\n </Callout>\r\n )}\r\n </>\r\n );\r\n};\r\n","import {\r\n CommandBarButton,\r\n IButtonProps,\r\n ICommandBarItemProps,\r\n IComponentAs,\r\n IComponentAsProps,\r\n IContextualMenuProps,\r\n PrimaryButton,\r\n SearchBox,\r\n} from '@fluentui/react';\r\nimport React from 'react';\r\nimport { CustomPanelType, LifeCycleStatus, PopupType, PublisherSearch, getAppStore } from '../../../../../@data';\r\nimport { hasCreateAccess, hasDeleteAccess, hasUpdateAccess } from '../../../../../@data/services/UserRoleService';\r\nimport { getAccessPermission } from '../../../../../@data/utils/getAccessPermission';\r\nimport { default as AppMessages, default as appMessages } from '../../../../../App.messages';\r\nimport { useWindowSize } from '../../../../../hooks';\r\nimport { getStore as getWindowStore } from '../../../../../hooks/useWindowSize/store/store';\r\nimport { onChangeItemsStatus, onDownloadButtonClicked, onDuplicateItem } from '../../../@data/actions/commandBarActions';\r\nimport '../../../@data/mutatorActions';\r\nimport { setDialogType, setFilterMenuCalloutStatus, setPanelType } from '../../../@data/mutatorActions';\r\nimport '../../../@data/orchestrators';\r\nimport { getStore } from '../../../@data/store/store';\r\nimport messages from '../../../GridV2.messages';\r\nimport { CommandBarActions, DownloadOption, GridSelectionMode, IDataGridCommandBarItemProps } from '../../../GridV2.types';\r\nimport { ICustomCommandBarProps } from '../../../components/CustomCommandBar/CustomCommandBar';\r\nimport { SearchBoxCallOut } from '../../SearchBoxCallOut/SearchBoxCallOut';\r\nimport { getButtonStyles, getCountMenuStyles } from '../CustomCommandBar.styles';\r\n\r\nconst { windowStoreSerializer } = useWindowSize();\r\n\r\nexport function getDefaultCommandBarItems(props: ICustomCommandBarProps): IDataGridCommandBarItemProps[] {\r\n if (!props.commandBarProps) {\r\n return [];\r\n }\r\n const { isGridReady, intl, history, match, columns, data, setData, entity, commandBarProps, handleSearch } = props;\r\n const { primaryButtonLabel, searchBoxPlaceholder, primaryButtonUrl, onDuplicateItems, onItemsStatusChanged } = commandBarProps;\r\n const accessPermission = getAccessPermission(entity);\r\n const { formatMessage } = intl;\r\n\r\n const commandBarItems: IDataGridCommandBarItemProps[] = [];\r\n const { isWindowSmallSize, isWindowExtraSmallSize } = windowStoreSerializer(getWindowStore());\r\n\r\n const downloadItems = (type: DownloadOption) => {\r\n const entityInstance = new entity();\r\n const publisherName = getAppStore().publisher?.name ?? '';\r\n\r\n const filename = `${publisherName}-${entityInstance.className}.csv`;\r\n onDownloadButtonClicked(formatMessage, data || [], filename, columns, type);\r\n };\r\n const menuProps: IContextualMenuProps = {\r\n shouldFocusOnMount: true,\r\n items: [\r\n {\r\n key: 'selected',\r\n text: formatMessage(appMessages.downloadSelected),\r\n onClick: () => downloadItems(DownloadOption.selection),\r\n ariaDescription: formatMessage(appMessages.downloadSelectedCmdBtnAriaDesc),\r\n disabled: getStore().selectedItems.length === 0,\r\n },\r\n {\r\n key: 'page',\r\n text: formatMessage(appMessages.downloadPage),\r\n onClick: () => downloadItems(DownloadOption.page),\r\n ariaDescribedBy: formatMessage(appMessages.downloadPageCmdBtnAriaDesc),\r\n },\r\n {\r\n key: 'all',\r\n text: formatMessage(appMessages.downloadAll),\r\n onClick: () => downloadItems(DownloadOption.all),\r\n ariaDescribedBy: formatMessage(appMessages.downloadAllCmdBtnAriaDesc),\r\n },\r\n ],\r\n };\r\n\r\n if (primaryButtonLabel) {\r\n commandBarItems.push({\r\n key: CommandBarActions.new,\r\n name: formatMessage(primaryButtonLabel),\r\n commandBarButtonAs: () => (\r\n <PrimaryButton\r\n iconProps={{ iconName: 'Add' }}\r\n text={isWindowExtraSmallSize ? '' : formatMessage(primaryButtonLabel)}\r\n onClick={() => {\r\n history.push(primaryButtonUrl || `${match.url}/create`);\r\n }}\r\n disabled={!(isGridReady && hasCreateAccess(accessPermission))}\r\n role=\"link\"\r\n />\r\n ),\r\n iconProps: { iconName: 'Add' },\r\n onClick: () => {\r\n history.push(`${match.url}/create`);\r\n },\r\n disabled: !(isGridReady && hasCreateAccess(accessPermission)),\r\n selectionModes: [GridSelectionMode.None],\r\n ariaDescription: formatMessage(messages.createCmdbtnAriaDesc, { label: formatMessage(primaryButtonLabel) }),\r\n });\r\n }\r\n\r\n if (handleSearch) {\r\n commandBarItems.push({\r\n key: CommandBarActions.searchBox,\r\n commandBarButtonAs: () => {\r\n return isWindowSmallSize || isWindowExtraSmallSize ? (\r\n <SearchBoxCallOut placeHolder={searchBoxPlaceholder ? formatMessage(searchBoxPlaceholder) : ''} handleSearch={handleSearch} />\r\n ) : (\r\n <SearchBox\r\n value={getStore().searchWord}\r\n placeholder={searchBoxPlaceholder ? formatMessage(searchBoxPlaceholder) : ''}\r\n onChange={(_, val: string) => handleSearch?.(val)}\r\n onClear={() => handleSearch('')}\r\n ariaLabel={formatMessage(messages.searchBoxPlaceholder)}\r\n disabled={!isGridReady}\r\n />\r\n );\r\n },\r\n renderedInOverflow: false,\r\n selectionModes: [GridSelectionMode.None],\r\n });\r\n }\r\n\r\n commandBarItems.push(\r\n ...[\r\n {\r\n key: 'count',\r\n commandBarButtonAs: () => {\r\n const { selectedItems } = getStore();\r\n return <div style={getCountMenuStyles()}>{formatMessage(AppMessages.selectedCount, { count: selectedItems.length })}</div>;\r\n },\r\n selectionModes: [GridSelectionMode.Single, GridSelectionMode.Multiple],\r\n },\r\n {\r\n id: 'addFilterButton',\r\n key: CommandBarActions.addFilter,\r\n name: formatMessage(appMessages.addFilter),\r\n iconProps: { iconName: 'Filter' },\r\n iconOnly: isWindowSmallSize || isWindowExtraSmallSize,\r\n onClick: () => setFilterMenuCalloutStatus(true),\r\n commandBarButtonAs: addFilterButton,\r\n ariaDescription: formatMessage(messages.addFilterCmdBtnAriaDesc),\r\n buttonStyles: getStore().selectedItems.length > 0 ? getButtonStyles() : undefined,\r\n disabled: !isGridReady,\r\n selectionModes: [GridSelectionMode.None],\r\n },\r\n {\r\n key: CommandBarActions.edit,\r\n name: formatMessage(appMessages.edit),\r\n iconProps: {\r\n iconName: 'Edit',\r\n },\r\n ariaDescription: formatMessage(messages.editCmdBtnAriaDesc),\r\n onClick: () => {\r\n const { selectedItems } = getStore();\r\n if (selectedItems.length > 0) {\r\n if (selectedItems[0].id) {\r\n history.push(`${match.url}/edit/${selectedItems[0].id}`);\r\n } else {\r\n history.push(`${match.url}/edit`);\r\n }\r\n }\r\n },\r\n /* In case of Publisher, edit is disabled if publisher is inactive */\r\n selectionStatus: new entity() instanceof PublisherSearch ? LifeCycleStatus.Active : undefined,\r\n disabled: !hasUpdateAccess(accessPermission),\r\n buttonStyles: getStore().selectedItems.length > 0 ? getButtonStyles() : undefined,\r\n selectionModes: [GridSelectionMode.Single],\r\n },\r\n {\r\n key: CommandBarActions.delete,\r\n name: formatMessage(appMessages.delete),\r\n iconProps: {\r\n iconName: 'Delete',\r\n },\r\n ariaDescription: formatMessage(messages.deleteCmdBtnAriaDesc),\r\n onClick: () => setDialogType(PopupType.DeleteConfirmation),\r\n buttonStyles: getStore().selectedItems.length > 0 ? getButtonStyles() : undefined,\r\n disabled: !hasDeleteAccess(accessPermission),\r\n selectionModes: [GridSelectionMode.Single],\r\n },\r\n {\r\n key: CommandBarActions.activate,\r\n name: formatMessage(appMessages.activate),\r\n iconProps: {\r\n iconName: 'ActivateOrders',\r\n },\r\n ariaDescription: formatMessage(messages.activateCmdBtnAriaDesc),\r\n selectionStatus: LifeCycleStatus.Inactive,\r\n onClick: () => {\r\n const { selectedItems, data: dataStore } = getStore();\r\n onChangeItemsStatus(selectedItems, LifeCycleStatus.Active, dataStore, formatMessage, setData, onItemsStatusChanged);\r\n },\r\n buttonStyles: getStore().selectedItems.length > 0 ? getButtonStyles() : undefined,\r\n disabled: !hasUpdateAccess(accessPermission),\r\n selectionModes: entity.name === 'Account' ? [GridSelectionMode.Single] : [GridSelectionMode.Single, GridSelectionMode.Multiple],\r\n },\r\n {\r\n key: CommandBarActions.deactivate,\r\n name: formatMessage(appMessages.deactivate),\r\n iconProps: {\r\n iconName: 'DeactivateOrders',\r\n },\r\n ariaDescription: formatMessage(messages.deactivateCmdBtnAriaDesc),\r\n onClick: () => setDialogType(PopupType.DeactivateConfirmation),\r\n buttonStyles: getStore().selectedItems.length > 0 ? getButtonStyles() : undefined,\r\n selectionStatus: LifeCycleStatus.Active,\r\n disabled: !hasUpdateAccess(accessPermission),\r\n selectionModes: entity.name === 'Account' ? [GridSelectionMode.Single] : [GridSelectionMode.Single, GridSelectionMode.Multiple],\r\n },\r\n {\r\n key: CommandBarActions.duplicate,\r\n name: formatMessage(appMessages.duplicate),\r\n iconProps: {\r\n iconName: 'Copy',\r\n },\r\n ariaDescription: formatMessage(messages.copyCmdBtnAriaDesc),\r\n onClick: () => {\r\n const { selectedItems } = getStore();\r\n if (selectedItems.length === 1) {\r\n onDuplicateItem(selectedItems[0], data, formatMessage, setData, onDuplicateItems);\r\n }\r\n },\r\n buttonStyles: getStore().selectedItems.length > 0 ? getButtonStyles() : undefined,\r\n disabled: !hasCreateAccess(accessPermission),\r\n selectionModes: [GridSelectionMode.Single],\r\n },\r\n {\r\n key: CommandBarActions.download,\r\n name: formatMessage(appMessages.download),\r\n iconProps: {\r\n iconName: 'Download',\r\n },\r\n ariaDescription: formatMessage(appMessages.downloadCmdBtnAriaDesc),\r\n subMenuProps: menuProps,\r\n disabled: !isGridReady,\r\n buttonStyles: getStore().selectedItems.length > 0 ? getButtonStyles() : undefined,\r\n selectionModes: [GridSelectionMode.None],\r\n },\r\n {\r\n key: CommandBarActions.modifyColumns,\r\n name: formatMessage(appMessages.modifyColumns),\r\n iconProps: {\r\n iconName: 'TripleColumnEdit',\r\n },\r\n ariaDescription: formatMessage(messages.modifyColumnsCmdBtnAriaDesc),\r\n onClick: () => setPanelType(CustomPanelType.ModifyColumns),\r\n buttonStyles: getStore().selectedItems.length > 0 ? getButtonStyles() : undefined,\r\n selectionModes: [GridSelectionMode.None],\r\n disabled: !isGridReady,\r\n },\r\n ]\r\n );\r\n\r\n return commandBarItems;\r\n}\r\n\r\nexport const addFilterButton: IComponentAs<ICommandBarItemProps> = (commandBarItemProps: IComponentAsProps<ICommandBarItemProps>) => {\r\n const { ...buttonProps } = commandBarItemProps;\r\n const castButtonProps = buttonProps as IButtonProps;\r\n\r\n return (\r\n <CommandBarButton\r\n {...castButtonProps}\r\n aria-haspopup={true}\r\n aria-expanded={document.body.contains(document.getElementById('filterMenuDialog'))}\r\n />\r\n );\r\n};\r\n","import { Model } from '../../../../../@data';\r\nimport AppMessages from '../../../../../App.messages';\r\nimport { getStore } from '../../../@data/store/store';\r\nimport {\r\n Direction,\r\n GridSelectionMode,\r\n IDataGridCommandBarItemProps,\r\n IDataGridCommandBarProps,\r\n IGridPageCommandBarPlacement,\r\n} from '../../../GridV2.types';\r\nimport { ICustomCommandBarProps } from '../../../components/CustomCommandBar/CustomCommandBar';\r\nimport { getButtonStyles } from '../CustomCommandBar.styles';\r\nimport { getDefaultCommandBarFarItems } from './getDefaultCommandBarFarItems';\r\nimport { getDefaultCommandBarItems } from './getDefaultCommandBarItems';\r\nimport { getSelectionMode } from './getSelectionMode';\r\n\r\nexport function buildCommandBarProps(props: ICustomCommandBarProps): IDataGridCommandBarProps {\r\n const { includeActions, includeFarActions, excludeActions, getCustomCommandBarItems } = props.commandBarProps || {};\r\n\r\n const customCommandBarItems = getCustomCommandBarItems?.(() => (getStore().selectedItems as Model[]) || []);\r\n const defaultCommandBarItems = getDefaultCommandBarItems(props);\r\n const defaultFarCommandBarItems = getDefaultCommandBarFarItems(props);\r\n\r\n let items: IDataGridCommandBarItemProps[] = [];\r\n let farItems: IDataGridCommandBarItemProps[] = [];\r\n const overflowButtonProps = { ariaLabel: props.intl.formatMessage(AppMessages.moreOptionsButtonAriaLabel) };\r\n\r\n // This will only include the given list of actions from defaultCommandBarItems\r\n includeActions?.forEach((includeKey) => {\r\n items.push(...defaultCommandBarItems.filter((item) => item.key === includeKey));\r\n });\r\n\r\n // This will only include the given list of actions from defaultCommandBarItems\r\n includeFarActions?.forEach((includeKey) => {\r\n items.push(...defaultCommandBarItems.filter((item) => item.key === includeKey));\r\n farItems.push(...defaultFarCommandBarItems.filter((item) => item.key === includeKey));\r\n });\r\n\r\n // This will exclude the given actions from defaultCommandBarItems\r\n excludeActions?.forEach((excludeKey) => {\r\n items = items.filter((item) => item.key !== excludeKey);\r\n farItems = farItems.filter((item) => item.key !== excludeKey);\r\n });\r\n\r\n customCommandBarItems?.forEach((customItem) => {\r\n const placement = customItem.placement;\r\n if (!customItem.buttonStyles) {\r\n customItem.buttonStyles = getStore().selectedItems.length > 0 ? getButtonStyles() : undefined;\r\n }\r\n\r\n // If placement details are given, then insert at specified placement\r\n if (placement) {\r\n items = insertCommandBarItem(items, customItem, placement);\r\n } else {\r\n // no placement details provided insert at the end of left sided command bar items\r\n items.push(customItem);\r\n }\r\n });\r\n\r\n const countItem = defaultCommandBarItems.find((item) => item.key === 'count');\r\n if (countItem) {\r\n items.unshift(countItem);\r\n }\r\n const cancelItem = defaultFarCommandBarItems.find((item) => item.key === 'Cancel');\r\n if (cancelItem) {\r\n farItems.push(cancelItem);\r\n }\r\n\r\n const commandBarProps: IDataGridCommandBarProps = { items: items, farItems: farItems, overflowButtonProps: overflowButtonProps };\r\n\r\n const mode = getSelectionMode(getStore().selectedItems.length);\r\n commandBarProps.items = getItemsBasedOnModeAndStatus(commandBarProps.items, mode, getStore().selectedItems);\r\n commandBarProps.farItems = getItemsBasedOnModeAndStatus(commandBarProps.farItems || [], mode, getStore().selectedItems) || [];\r\n\r\n return commandBarProps;\r\n}\r\n\r\nfunction insertCommandBarItem(\r\n items: IDataGridCommandBarItemProps[],\r\n customItem: IDataGridCommandBarItemProps,\r\n placement: IGridPageCommandBarPlacement\r\n): IDataGridCommandBarItemProps[] {\r\n // If key not specificed, insert based on direction either before or after rest of the items\r\n if (!placement.key) {\r\n switch (placement.direction) {\r\n case Direction.before:\r\n items.unshift(customItem);\r\n break;\r\n default:\r\n case Direction.after:\r\n items.push(customItem);\r\n break;\r\n }\r\n } else {\r\n const keyItem = items.find((item) => item.key === placement.key);\r\n let indextoAdd = 0;\r\n\r\n if (keyItem) {\r\n const keyPosition = items.findIndex((item) => item === keyItem);\r\n indextoAdd = keyPosition;\r\n switch (placement.direction) {\r\n case Direction.before:\r\n if (keyPosition === 0) {\r\n indextoAdd = 0;\r\n }\r\n break;\r\n default:\r\n case Direction.after:\r\n indextoAdd++;\r\n break;\r\n }\r\n items.splice(indextoAdd, 0, customItem);\r\n }\r\n }\r\n\r\n return items;\r\n}\r\n\r\nfunction getItemsBasedOnModeAndStatus(items: IDataGridCommandBarItemProps[], mode: GridSelectionMode, selectedItems?: Model[]) {\r\n const hasSelection = (item) => !item.selectionModes || item.selectionModes.includes(mode);\r\n const hasStatusSelection = (item) =>\r\n !item.selectionStatus || (selectedItems && selectedItems.some((dataRow) => dataRow.status === item.selectionStatus));\r\n return items.filter((item) => hasSelection(item) && hasStatusSelection(item));\r\n}\r\n","import { IContextualMenuProps } from '@fluentui/react';\r\nimport { getAppStore } from '../../../../../@data';\r\nimport AppMessages, { default as appMessages } from '../../../../../App.messages';\r\nimport { onDownloadButtonClicked } from '../../../@data/actions/commandBarActions';\r\nimport '../../../@data/mutatorActions';\r\nimport '../../../@data/orchestrators';\r\nimport { getStore } from '../../../@data/store/store';\r\nimport { CommandBarActions, DownloadOption, GridSelectionMode, IDataGridCommandBarItemProps } from '../../../GridV2.types';\r\nimport { ICustomCommandBarProps } from '../../../components/CustomCommandBar/CustomCommandBar';\r\nimport { getButtonStyles } from '../CustomCommandBar.styles';\r\n\r\nexport function getDefaultCommandBarFarItems(props: ICustomCommandBarProps): IDataGridCommandBarItemProps[] {\r\n if (!props.commandBarProps) {\r\n return [];\r\n }\r\n const { formatMessage } = props.intl;\r\n const { isGridReady, columns, entity } = props;\r\n\r\n const farItems: IDataGridCommandBarItemProps[] = [];\r\n\r\n const downloadItems = (type: DownloadOption) => {\r\n const entityInstance = new entity();\r\n const publisherName = getAppStore().publisher?.name ?? '';\r\n\r\n const filename = `${publisherName}-${entityInstance.className}.csv`;\r\n onDownloadButtonClicked(formatMessage, getStore().data || [], filename, columns, type);\r\n };\r\n const downloadSubMenuProps: IContextualMenuProps = {\r\n shouldFocusOnMount: true,\r\n items: [\r\n {\r\n key: 'selected',\r\n text: formatMessage(appMessages.downloadSelected),\r\n onClick: () => downloadItems(DownloadOption.selection),\r\n ariaDescription: formatMessage(appMessages.downloadSelectedCmdBtnAriaDesc),\r\n },\r\n {\r\n key: 'page',\r\n text: formatMessage(appMessages.downloadPage),\r\n onClick: () => downloadItems(DownloadOption.page),\r\n ariaDescribedBy: formatMessage(appMessages.downloadPageCmdBtnAriaDesc),\r\n },\r\n {\r\n key: 'all',\r\n text: formatMessage(appMessages.downloadAll),\r\n onClick: () => downloadItems(DownloadOption.all),\r\n ariaDescribedBy: formatMessage(appMessages.downloadAllCmdBtnAriaDesc),\r\n },\r\n ],\r\n };\r\n\r\n farItems.push(\r\n ...[\r\n {\r\n id: 'CancelButton',\r\n key: 'Cancel',\r\n name: formatMessage(AppMessages.cancel),\r\n iconProps: {\r\n iconName: 'Cancel',\r\n },\r\n buttonStyles: getButtonStyles(),\r\n onClick: () => props.cancelSelection(),\r\n selectionModes: [GridSelectionMode.Single, GridSelectionMode.Multiple],\r\n },\r\n {\r\n key: CommandBarActions.download,\r\n name: formatMessage(appMessages.download),\r\n iconProps: {\r\n iconName: 'Download',\r\n },\r\n subMenuProps: downloadSubMenuProps,\r\n ariaDescription: formatMessage(appMessages.downloadCmdBtnAriaDesc),\r\n disabled: !isGridReady,\r\n buttonStyles: getStore().selectedItems.length > 0 ? getButtonStyles() : undefined,\r\n selectionModes: [GridSelectionMode.Single, GridSelectionMode.Multiple],\r\n },\r\n ]\r\n );\r\n\r\n return farItems;\r\n}\r\n","import { GridSelectionMode } from '../../../GridV2.types';\r\n\r\nexport function getSelectionMode(selectionCount: Number): GridSelectionMode {\r\n switch (selectionCount) {\r\n case 0:\r\n return GridSelectionMode.None;\r\n case 1:\r\n return GridSelectionMode.Single;\r\n default:\r\n return GridSelectionMode.Multiple;\r\n }\r\n}\r\n","import { CommandBar } from '@fluentui/react';\r\nimport React, { useEffect, useMemo, useRef } from 'react';\r\nimport { Model } from '../../../../@data';\r\nimport { GridFilter } from '../../../../components/GridFilter/GridFilter';\r\nimport { IRouterWithIntl, injectIntlAndObserver } from '../../../../utils';\r\nimport { setFilterMenuCalloutStatus } from '../../@data/mutatorActions';\r\nimport { getStore } from '../../@data/store/store';\r\nimport { IBuildCommandBarProps, IColumnVisibilityMapping, IDataGridCommandBarProps, IGridV2Column } from '../../GridV2.types';\r\nimport { DeactivateConfirmationDialog } from '../DeactivateConfirmationDialog';\r\nimport { DeleteConfirmationDialog } from '../DeleteConfirmationDialog';\r\nimport { ModifyColumnsPanel } from '../ModifyColumnsPanel';\r\nimport { getCustomCommandBarStyles } from './CustomCommandBar.styles';\r\nimport { buildCommandBarProps } from './utils';\r\n\r\nexport interface ICustomCommandBarProps extends IRouterWithIntl {\r\n entity: new () => Model;\r\n columns: IGridV2Column[];\r\n commandBarProps?: IBuildCommandBarProps<Model>;\r\n isGridReady?: boolean;\r\n // tslint:disable-next-line: no-any\r\n data: any[];\r\n cancelSelection: () => void;\r\n setData?: (data?: Model[]) => void;\r\n handleSearch?: (value: string) => void;\r\n filterMenuCalloutOpen?: boolean;\r\n handleGridFilter: (filterConditions) => Model[];\r\n changeColumnsVisibility: (columnsVisibility: IColumnVisibilityMapping[]) => void;\r\n}\r\n\r\nexport const CustomCommandBar = injectIntlAndObserver(function CustomCommandBarComponent(props: ICustomCommandBarProps): JSX.Element {\r\n const commandBarRef = useRef(null);\r\n const { selectedItems, isSearchCalloutVisible } = getStore();\r\n const {\r\n commandBarProps,\r\n data,\r\n setData,\r\n isGridReady,\r\n columns,\r\n intl,\r\n filterMenuCalloutOpen,\r\n changeColumnsVisibility,\r\n handleGridFilter,\r\n } = props;\r\n const {\r\n filterItems,\r\n deleteLabels,\r\n deactivateLabels,\r\n onDeactivateDialogDismiss,\r\n onPreDeleteItems,\r\n onDeleteItems,\r\n onPostDeleteItems,\r\n onItemsStatusChanged,\r\n includeActions,\r\n hideModifyColumnsDescription,\r\n } = commandBarProps || {};\r\n const commandBarItems: IDataGridCommandBarProps = useMemo(\r\n () => buildCommandBarProps(props),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [selectedItems, columns, data, isSearchCalloutVisible, isGridReady]\r\n );\r\n\r\n /**\r\n * to pass 1CS we would need add \"aria-busy\" attribute in the commandbar wrapper to enhance accessibility UI,\r\n * which fluentUI doesn't provide such mechanism for <CommandBar /> component\r\n */\r\n useEffect(() => {\r\n if (commandBarRef.current) {\r\n const commandBarWrapper = document.querySelectorAll('div[role=\"menubar\"]')?.[0];\r\n if (commandBarWrapper && !commandBarWrapper.hasAttribute('aria-busy')) {\r\n commandBarWrapper.setAttribute('aria-busy', 'true');\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [commandBarRef.current]);\r\n\r\n return commandBarItems ? (\r\n <>\r\n <CommandBar\r\n {...commandBarItems}\r\n styles={getCustomCommandBarStyles(!!selectedItems?.length, includeActions?.length || 0)}\r\n componentRef={commandBarRef}\r\n data-test-id=\"grid-command-bar\"\r\n />\r\n\r\n {filterItems && (\r\n <GridFilter\r\n intl={intl}\r\n filterItems={filterItems || []}\r\n onFilterMenuCalloutClose={() => setFilterMenuCalloutStatus(false)}\r\n filterMenuCalloutOpen={filterMenuCalloutOpen}\r\n onFilterApplied={handleGridFilter}\r\n />\r\n )}\r\n\r\n <ModifyColumnsPanel\r\n columns={columns}\r\n changeColumnsVisibility={changeColumnsVisibility}\r\n hideDescription={hideModifyColumnsDescription}\r\n />\r\n <DeleteConfirmationDialog\r\n data={data}\r\n setData={setData}\r\n deleteLabels={deleteLabels}\r\n selectedItems={selectedItems}\r\n preDeleteAction={onPreDeleteItems}\r\n deleteAction={onDeleteItems}\r\n postDeleteAction={onPostDeleteItems}\r\n />\r\n <DeactivateConfirmationDialog\r\n data={data}\r\n setData={setData}\r\n deactivateLabels={deactivateLabels}\r\n selectedItems={selectedItems}\r\n onItemsStatusChanged={onItemsStatusChanged}\r\n onDismiss={onDeactivateDialogDismiss}\r\n />\r\n </>\r\n ) : (\r\n <></>\r\n );\r\n});\r\n","import { useState } from 'react';\r\nimport { IGridV2Column, ISelectableRow } from '../GridV2.types';\r\n\r\nfunction flattenNestedObject(obj, parentKey = '') {\r\n let result = {};\r\n\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n const newKey = parentKey ? `${parentKey}.${key}` : key;\r\n\r\n if (typeof obj[key] === 'object' && !Array.isArray(obj[key])) {\r\n const nestedValues = flattenNestedObject(obj[key], newKey);\r\n result = { ...result, ...nestedValues };\r\n } else {\r\n result[newKey] = obj[key];\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// tslint:disable-next-line: no-any\r\nexport const useSearchableGrid = (columns: IGridV2Column[], items: any[], updateSearchWord?: (word: string) => void) => {\r\n const [searchWord, setSearchWord] = useState('');\r\n\r\n function handleSearch(value: string): ISelectableRow[] {\r\n setSearchWord(value);\r\n updateSearchWord?.(value);\r\n const filteredItems = items.filter((item) => {\r\n item = flattenNestedObject(item);\r\n\r\n // if any column has a search function, then return true\r\n if (columns.filter((col) => col.isVisible && col.searchFunction).some((col) => col?.searchFunction?.(item, value))) {\r\n return true;\r\n }\r\n\r\n return Object.entries(item)\r\n .map(([IKey, IValue]) => {\r\n const column = columns.find((i) => i.key === IKey && i.isVisible);\r\n return IValue && column?.isSearchable && String(IValue).toLowerCase().includes(value.toLowerCase());\r\n })\r\n .some(Boolean);\r\n });\r\n\r\n return filteredItems;\r\n }\r\n\r\n return { handleSearch, searchWord };\r\n};\r\n","import { Model } from '../../../@data';\r\nimport { FilterCondition } from '../../../@data/store/schema/enums/FilterCondition';\r\nimport { FilterType, IFilterDetails } from '../../../components/GridFilter/GridFilter.types';\r\nimport { ISelectableRow } from '../GridV2.types';\r\n\r\nexport const applyFilters = (\r\n // tslint:disable-next-line: no-any\r\n items: any[],\r\n filterConditions: IFilterDetails[],\r\n setAppliedFilters,\r\n // tslint:disable-next-line: no-any\r\n customApplyFilterFn?: (filterDetails: IFilterDetails[], items: any[]) => any[],\r\n shouldApplyFilter = true\r\n): ISelectableRow[] => {\r\n let filteredItems: ISelectableRow[] = items;\r\n\r\n if (!customApplyFilterFn) {\r\n filterConditions.forEach((filterCol) => {\r\n if (filterCol.customFunction) {\r\n filteredItems = filteredItems.filter((dataRow: Model) =>\r\n filterCol.customFunction ? filterCol.customFunction(dataRow, filterCol) : false\r\n );\r\n } else {\r\n filteredItems = applyFilter(filteredItems, filterCol);\r\n }\r\n });\r\n }\r\n\r\n if (customApplyFilterFn && shouldApplyFilter) {\r\n filteredItems = customApplyFilterFn(filterConditions, items);\r\n }\r\n\r\n setAppliedFilters(filterConditions);\r\n return filteredItems;\r\n};\r\n\r\n// tslint:disable-next-line: no-any\r\nfunction applyFilter(items: any[], filterColumn: IFilterDetails): ISelectableRow[] {\r\n if (filterColumn.columnName !== undefined) {\r\n const filteredItems = items.filter((item: object) => {\r\n const val = item[filterColumn.columnName || ''];\r\n\r\n switch (filterColumn.filterType) {\r\n case FilterType.custom:\r\n return filterColumn.filterCondition ? val === filterColumn.filterCondition : true;\r\n\r\n case FilterType.date: {\r\n const dateVal = new Date(val);\r\n const { startDate, endDate } = filterColumn;\r\n\r\n if (startDate || endDate) {\r\n if (startDate && endDate) {\r\n return dateVal >= startDate && dateVal <= endDate;\r\n }\r\n if (endDate) {\r\n return dateVal <= endDate;\r\n }\r\n if (startDate) {\r\n return dateVal >= startDate;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n case FilterType.relational: {\r\n const numVal = Number(val);\r\n\r\n if (filterColumn.filterText) {\r\n const filterNumVal = Number(filterColumn.filterText);\r\n switch (filterColumn.filterCondition) {\r\n case FilterCondition.Equals:\r\n return numVal === filterNumVal;\r\n case FilterCondition.DoesNotEqual:\r\n return numVal !== filterNumVal;\r\n case FilterCondition.GreaterThan:\r\n return numVal > filterNumVal;\r\n case FilterCondition.GreaterThanEqual:\r\n return numVal >= filterNumVal;\r\n case FilterCondition.LessThan:\r\n return numVal < filterNumVal;\r\n case FilterCondition.LessThanEqual:\r\n return numVal <= filterNumVal;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n case FilterType.string: {\r\n const filterVal = filterColumn.filterText!.toLocaleLowerCase();\r\n const strVal = String(val).toLocaleLowerCase();\r\n switch (filterColumn.filterCondition) {\r\n case FilterCondition.Contains:\r\n return strVal.indexOf(filterVal) !== -1;\r\n case FilterCondition.DoesNotContain:\r\n return strVal.indexOf(filterVal) === -1;\r\n case FilterCondition.BeginsWith:\r\n return strVal.indexOf(filterVal) === 0;\r\n case FilterCondition.EndsWith: {\r\n const lastIndex = strVal.lastIndexOf(filterVal);\r\n return lastIndex === strVal.length - filterVal.length;\r\n }\r\n case FilterCondition.Equals:\r\n return strVal === filterVal;\r\n case FilterCondition.DoesNotEqual:\r\n return strVal !== filterVal;\r\n }\r\n }\r\n }\r\n return val.toLocaleLowerCase().indexOf(filterColumn.filterText!.toLocaleLowerCase()) !== -1;\r\n });\r\n\r\n return filteredItems;\r\n }\r\n // in case column name is not passed, filter cannot be applied.\r\n return items;\r\n}\r\n","import { ICustomColumn } from '../../../types';\r\n\r\nfunction flattenNestedObject(obj, parentKey = '') {\r\n let result = {};\r\n\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n const newKey = parentKey ? `${parentKey}.${key}` : key;\r\n\r\n if (typeof obj[key] === 'object' && !Array.isArray(obj[key])) {\r\n const nestedValues = flattenNestedObject(obj[key], newKey);\r\n result = { ...result, ...nestedValues };\r\n } else {\r\n result[newKey] = obj[key];\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction unflattenObject(flatObj) {\r\n const result = {};\r\n\r\n for (const key in flatObj) {\r\n if (flatObj.hasOwnProperty(key)) {\r\n const keys = key.split('.');\r\n let nestedObj = result;\r\n\r\n for (let i = 0; i < keys.length; i++) {\r\n const currentKey = keys[i];\r\n if (i === keys.length - 1) {\r\n nestedObj[currentKey] = flatObj[key];\r\n } else {\r\n nestedObj[currentKey] = nestedObj[currentKey] || {};\r\n nestedObj = nestedObj[currentKey];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function sortItemsBasedOnColumn<ItemType>(items: ItemType[], column?: ICustomColumn): ItemType[] {\r\n if (!column) {\r\n return items;\r\n }\r\n\r\n if (!items || !items[0]) {\r\n return [];\r\n }\r\n\r\n const { sortFunction, sortableValue, isSortedDescending, fieldName } = column;\r\n\r\n // Use the sorting function if provided\r\n if (typeof sortFunction === 'function') {\r\n return items.sort((a, b) => sortFunction(a, b, isSortedDescending));\r\n }\r\n\r\n let itemsCopy = [...items];\r\n\r\n itemsCopy = itemsCopy.map((item) => {\r\n return flattenNestedObject(item) as ItemType;\r\n });\r\n\r\n const sortedItems = itemsCopy.concat([]).sort((a: ItemType, b: ItemType) => {\r\n const firstValue = getSortableValue(a, fieldName, sortableValue);\r\n const secondValue = getSortableValue(b, fieldName, sortableValue);\r\n\r\n if (firstValue === undefined && secondValue !== undefined) {\r\n return 1;\r\n } else if (secondValue === undefined) {\r\n return -1;\r\n }\r\n\r\n if (typeof firstValue === 'string' && typeof secondValue === 'string') {\r\n if (isSortedDescending) {\r\n return firstValue.toLowerCase() > secondValue.toLowerCase() ? -1 : 1;\r\n } else {\r\n return firstValue.toLowerCase() > secondValue.toLowerCase() ? 1 : -1;\r\n }\r\n } else {\r\n if (isSortedDescending) {\r\n return firstValue > secondValue ? -1 : 1;\r\n } else {\r\n return firstValue > secondValue ? 1 : -1;\r\n }\r\n }\r\n });\r\n\r\n return sortedItems.map((item) => {\r\n return unflattenObject(item) as ItemType;\r\n });\r\n}\r\n\r\nfunction getSortableValue(item, fieldName, sortableValue) {\r\n // Use the sortableValue function if provided\r\n return sortableValue ? sortableValue(item) : item[fieldName || ''];\r\n}\r\n","import { useEffect } from 'react';\r\nimport { Model } from '../../../@data';\r\nimport { onNumberOfPagesChanged, onPageNumberChanged } from '../@data/mutatorActions';\r\nimport { getStore } from '../@data/store/store';\r\nimport { IPaginationProps, ISelectableRow } from '../GridV2.types';\r\n\r\nexport const usePagination = (items: ISelectableRow[], paginationProps?: IPaginationProps) => {\r\n const { paginator } = getStore();\r\n\r\n const paginateData = (pageNumber?: number, pageSize?: number) => {\r\n const dataLength = items?.length;\r\n if (dataLength && pageNumber && pageSize) {\r\n return items?.slice((pageNumber - 1) * pageSize, pageNumber * pageSize) || [];\r\n } else {\r\n return items || [];\r\n }\r\n };\r\n\r\n const initializePagination = (filteredRowsUsingFilter: Model[]) => {\r\n if (paginationProps && paginationProps.shouldGridHandlePagination) {\r\n onPageNumberChanged(1);\r\n onNumberOfPagesChanged(Math.ceil(filteredRowsUsingFilter.length / paginator.currentPageSize));\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (paginationProps === undefined) {\r\n return;\r\n }\r\n\r\n if (paginationProps.numberOfPages) {\r\n onNumberOfPagesChanged(paginationProps.numberOfPages);\r\n } else if (paginationProps.shouldGridHandlePagination) {\r\n onNumberOfPagesChanged(Math.ceil(items.length / paginator.currentPageSize));\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [paginationProps]);\r\n\r\n return { paginateData, initializePagination };\r\n};\r\n","import {\r\n CheckboxVisibility,\r\n ConstrainMode,\r\n DetailsListLayoutMode,\r\n MessageBar,\r\n SelectionMode,\r\n ShimmeredDetailsList,\r\n Spinner,\r\n mergeStyleSets,\r\n} from '@fluentui/react';\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Model, getAppStore, onHelpInfoCalloutOpened, onHelpInfoChanged } from '../../@data';\r\nimport '../../@data/orchestrators';\r\nimport AppMessages from '../../App.messages';\r\nimport { FormTitle } from '../../components/Form';\r\nimport { IFilterDetails } from '../../components/GridFilter/GridFilter.types';\r\nimport { Main } from '../../components/Main/Main';\r\nimport { ZeroResults } from '../../components/ZeroResults/ZeroResults';\r\nimport { PAGINATION_PAGE_SIZES } from '../../constants/AppConstants';\r\nimport { injectIntlAndObserver } from '../../utils';\r\nimport { IGridV2Props, ISelectableRow, getClassNames } from './';\r\nimport { onGridPageV2Initialized } from './@data/actions/gridActions';\r\nimport './@data/mutatorActions';\r\nimport { onPageNumberChanged, onPageSizeChanged, setSearchWord, setSelectedItems } from './@data/mutatorActions';\r\nimport './@data/orchestrators';\r\nimport { getStore } from './@data/store/store';\r\nimport { RenderHeaderCheckbox, RenderRowCheckbox } from './components/CustomCheckbox';\r\nimport { CustomCommandBar } from './components/CustomCommandBar/CustomCommandBar';\r\nimport { Pagination } from './components/Pagination';\r\nimport { PaginationDisplay } from './components/Pagination/Pagination.types';\r\nimport { useSortableGridColumns } from './hooks';\r\nimport { usePagination } from './hooks/usePagination';\r\nimport { useSearchableGrid } from './hooks/useSearchableGrid';\r\nimport { useSelectionGrid } from './hooks/useSelectionGrid';\r\nimport { applyFilters } from './utils/FilteringUtils';\r\n\r\nexport const GridV2 = injectIntlAndObserver(function GridV2Component(props: IGridV2Props<Model>) {\r\n const {\r\n intl,\r\n pageTitle,\r\n notGridReadyLabel,\r\n isGridReady,\r\n isDataLoading,\r\n dataGridProps,\r\n commandBarProps,\r\n entity,\r\n styleProps,\r\n paginationProps,\r\n msgBarProps,\r\n children,\r\n bypassFiltrationAndSearching,\r\n bypassGridResetting,\r\n } = props;\r\n const { data, selectedRows, gridV2Columns, onColumnsChanged, onSelectionChanged, identifier, setData, hideDisableStyle } = dataGridProps;\r\n const rowIdentifier = identifier || 'id';\r\n const { dataQueryProps, customApplyFilterFn } = commandBarProps || {};\r\n const isSelectionDisabled = dataGridProps?.selectionMode === SelectionMode.none;\r\n const { root, titleContainer } = mergeStyleSets(getClassNames(), styleProps);\r\n\r\n const { filterMenuCalloutOpen, paginator } = getStore();\r\n const { helpInfo, publisher, account, locale } = getAppStore();\r\n\r\n const [gridRows, setGridRows] = useState<ISelectableRow[]>(\r\n data.map(\r\n (item) =>\r\n ({\r\n ...item,\r\n isSelected: selectedRows?.find((row) => row[rowIdentifier] === item[rowIdentifier])?.['isSelected'] || false,\r\n } as ISelectableRow)\r\n )\r\n );\r\n const [appliedFilters, setAppliedFilters] = useState<IFilterDetails[]>([]);\r\n const rowRef = useRef(null);\r\n\r\n const handleGridFilter = (filterConditions) => applyFilters(data, filterConditions, setAppliedFilters, customApplyFilterFn);\r\n const { gridColumns, handleColumnHeaderClick, changeColumnsVisibility } = useSortableGridColumns(\r\n gridV2Columns,\r\n gridRows,\r\n setGridRows,\r\n onColumnsChanged\r\n );\r\n const { handleSearch, searchWord } = useSearchableGrid(gridColumns, data, setSearchWord);\r\n const { selection, getKey } = useSelectionGrid(rowIdentifier, dataGridProps.selectionMode, setGridRows, onSelectionChanged);\r\n const { paginateData, initializePagination } = usePagination(gridRows, paginationProps);\r\n\r\n const removeAllSelectedItems = () => {\r\n setGridRows(gridRows.map((item) => ({ ...item, isSelected: false } as ISelectableRow)));\r\n setSelectedItems([]);\r\n selection.setAllSelected(false);\r\n };\r\n\r\n const resetGrid = () => {\r\n onPageNumberChanged(1);\r\n onPageSizeChanged(PAGINATION_PAGE_SIZES[0]);\r\n removeAllSelectedItems();\r\n };\r\n\r\n const defaultRenderZeroItemsComponent = () => {\r\n return (\r\n <ZeroResults\r\n showDefaultImage\r\n title={isGridReady ? dataGridProps?.noEntityFound && intl.formatMessage(dataGridProps.noEntityFound) : notGridReadyLabel}\r\n />\r\n );\r\n };\r\n\r\n const getVisibleColumns = () => gridColumns.filter((col) => col.isVisible);\r\n\r\n /**\r\n * replace tabindex=-1 to aria-hidden=\"true\" for accessibility enhancements\r\n */\r\n useEffect(() => {\r\n if (rowRef.current) {\r\n const checkboxWrappers = document.querySelectorAll('div[role=\"checkbox\"]');\r\n const headerRowWrapper = document.querySelector('div[role=\"row\"][aria-label=\"List Header\"]');\r\n if (checkboxWrappers.length) {\r\n for (let i = 0; i < checkboxWrappers.length; i++) {\r\n if (checkboxWrappers[i].hasAttribute('tabindex')) {\r\n checkboxWrappers[i].removeAttribute('tabindex');\r\n }\r\n }\r\n }\r\n if (headerRowWrapper && !headerRowWrapper.hasAttribute('aria-busy')) {\r\n headerRowWrapper.setAttribute('aria-busy', 'true');\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [rowRef.current, gridRows]);\r\n\r\n useEffect(() => {\r\n onGridPageV2Initialized(data, entity, dataQueryProps);\r\n }, [dataQueryProps, data, entity]);\r\n\r\n useEffect(() => {\r\n if (bypassFiltrationAndSearching && bypassGridResetting) {\r\n return;\r\n }\r\n const filteredRowsUsingSearch = handleSearch(searchWord);\r\n const filteredRowsUsingFilter = applyFilters(filteredRowsUsingSearch, appliedFilters, setAppliedFilters, customApplyFilterFn, false);\r\n setGridRows(filteredRowsUsingFilter);\r\n initializePagination(filteredRowsUsingFilter);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [data, appliedFilters, searchWord]);\r\n\r\n useEffect(() => {\r\n setGridRows(\r\n data.map(\r\n (item) =>\r\n ({\r\n ...item,\r\n isSelected: selectedRows?.find((row) => row[rowIdentifier] === item[rowIdentifier])?.['isSelected'] || false,\r\n } as ISelectableRow)\r\n )\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [data]);\r\n\r\n useEffect(() => {\r\n if (bypassFiltrationAndSearching && bypassGridResetting) {\r\n return;\r\n }\r\n resetGrid();\r\n return () => resetGrid();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [publisher, account]);\r\n\r\n return (\r\n <Main className={root}>\r\n {pageTitle && (\r\n <div className={titleContainer}>\r\n <FormTitle\r\n {...pageTitle}\r\n intl={intl}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened(pageTitle.helpId!, locale)}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n styles={pageTitle.styleProps}\r\n />\r\n {isDataLoading ? <Spinner /> : <></>}\r\n </div>\r\n )}\r\n\r\n {commandBarProps && (\r\n <CustomCommandBar\r\n history={props.history}\r\n location={props.location}\r\n match={props.match}\r\n entity={props.entity}\r\n columns={gridColumns}\r\n commandBarProps={commandBarProps}\r\n data={gridRows}\r\n setData={setData}\r\n cancelSelection={removeAllSelectedItems}\r\n handleSearch={handleSearch}\r\n isGridReady={isGridReady}\r\n changeColumnsVisibility={changeColumnsVisibility}\r\n filterMenuCalloutOpen={filterMenuCalloutOpen}\r\n handleGridFilter={handleGridFilter}\r\n />\r\n )}\r\n\r\n {msgBarProps && isGridReady && (\r\n <MessageBar className={msgBarProps.className} messageBarType={msgBarProps.messageBarType} onDismiss={msgBarProps.onDismiss}>\r\n {msgBarProps.children}\r\n </MessageBar>\r\n )}\r\n\r\n {!(dataGridProps && dataGridProps.renderEmptyGrid) && data.length === 0 && isGridReady ? (\r\n dataGridProps?.renderZeroItemsComponent ?? defaultRenderZeroItemsComponent()\r\n ) : (\r\n <ShimmeredDetailsList\r\n constrainMode={dataGridProps?.constrainMode ?? ConstrainMode.horizontalConstrained}\r\n enableShimmer={!isGridReady}\r\n shimmerLines={dataGridProps?.shimmerLines}\r\n selectionPreservedOnEmptyClick={true}\r\n ariaLabelForGrid={pageTitle?.title ?? intl.formatMessage(AppMessages.ariaLabelForGrid)}\r\n ariaLabelForListHeader={intl.formatMessage(AppMessages.ariaLabelForListHeader)}\r\n ariaLabelForSelectionColumn={intl.formatMessage(AppMessages.ariaLabelForSelectionColumn)}\r\n ariaLabelForSelectAllCheckbox={intl.formatMessage(AppMessages.ariaLabelForSelectAllCheckBox)}\r\n ariaLabelForShimmer={intl.formatMessage(AppMessages.ariaLabelForShimmer)}\r\n checkButtonAriaLabel={intl.formatMessage(AppMessages.checkBoxLabel)}\r\n checkButtonGroupAriaLabel={intl.formatMessage(AppMessages.checkButtonGroupAriaLabel)}\r\n items={\r\n paginationProps?.shouldGridHandlePagination ? paginateData(paginator.currentPageNumber, paginator.currentPageSize) : gridRows\r\n }\r\n selection={dataGridProps?.selectionMode !== SelectionMode.none ? selection : undefined}\r\n setKey={rowIdentifier}\r\n getKey={getKey}\r\n columns={getVisibleColumns().sort((a, b) => (a.columnOrder || 1) - (b.columnOrder || 0))}\r\n onColumnHeaderClick={handleColumnHeaderClick}\r\n selectionMode={dataGridProps?.selectionMode || SelectionMode.multiple}\r\n layoutMode={DetailsListLayoutMode.justified}\r\n checkboxVisibility={isSelectionDisabled ? CheckboxVisibility.hidden : CheckboxVisibility.always}\r\n onRenderDetailsHeader={(headerProps) => RenderHeaderCheckbox(selection, headerProps)}\r\n onRenderRow={(detailsRowProps) => RenderRowCheckbox(rowIdentifier, selection, detailsRowProps, hideDisableStyle)}\r\n componentRef={rowRef}\r\n />\r\n )}\r\n\r\n {isGridReady && data.length !== 0 && paginationProps && paginationProps.showPagination !== false && (\r\n <Pagination\r\n intl={props.intl}\r\n display={PaginationDisplay.Navigation}\r\n totalPageCount={paginator.numberOfPages}\r\n currentPageNumber={paginator.currentPageNumber}\r\n pageSize={paginator.currentPageSize}\r\n onPageNumberChange={onPageNumberChanged}\r\n onPageSizeChange={onPageSizeChanged}\r\n />\r\n )}\r\n\r\n {children}\r\n </Main>\r\n );\r\n});\r\n","import React, { useEffect, useState } from 'react';\r\nimport { IColumnVisibilityMapping, IGridV2Column } from '../GridV2.types';\r\nimport { sortItemsBasedOnColumn } from '../utils';\r\n\r\nexport function useSortableGridColumns<ItemType>(\r\n columns: IGridV2Column[],\r\n items: ItemType[],\r\n onSortItems?: (items: ItemType[]) => void,\r\n onColumnsChanged?: (columns: IGridV2Column[]) => void,\r\n onCleanupSortItems?: () => void\r\n) {\r\n const [gridColumns, setGridColumns] = useState<IGridV2Column[]>(columns);\r\n\r\n const changeColumnsVisibility = (colsVisMap: IColumnVisibilityMapping[]) => {\r\n const newColumns = [...gridColumns];\r\n colsVisMap.forEach((colVisMap) => {\r\n const gridColumn = newColumns.find((col) => col.key === colVisMap.columnKey);\r\n\r\n if (gridColumn) {\r\n gridColumn.isVisible = colVisMap.isVisible;\r\n }\r\n });\r\n setGridColumns(newColumns);\r\n onColumnsChanged?.(newColumns);\r\n };\r\n\r\n function handleColumnHeaderClick(ev?: React.MouseEvent<HTMLElement>, column?: IGridV2Column) {\r\n if (!column || column.suppressSorting) {\r\n return;\r\n }\r\n ev?.stopPropagation();\r\n\r\n const newColumns = gridColumns.slice();\r\n const currColumn = newColumns.filter((currCol) => column.key === currCol.key)[0];\r\n\r\n newColumns.forEach((col: IGridV2Column) => {\r\n if (col === currColumn) {\r\n currColumn.isSortedDescending = !currColumn.isSortedDescending;\r\n currColumn.isSorted = true;\r\n } else {\r\n col.isSorted = false;\r\n col.isSortedDescending = undefined;\r\n }\r\n });\r\n\r\n setGridColumns(newColumns);\r\n const sortedItems = sortItemsBasedOnColumn(items, currColumn);\r\n onSortItems?.(sortedItems);\r\n }\r\n\r\n useEffect(() => {\r\n if (JSON.stringify(columns) === JSON.stringify(gridColumns)) {\r\n return;\r\n }\r\n setGridColumns(columns);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [JSON.stringify(columns)]);\r\n\r\n useEffect(() => {\r\n return () => onCleanupSortItems?.();\r\n }, [onCleanupSortItems]);\r\n\r\n return { gridColumns, handleColumnHeaderClick, changeColumnsVisibility };\r\n}\r\n","import { Selection, SelectionMode } from '@fluentui/react';\r\nimport { useMemo } from 'react';\r\nimport { Model } from '../../../@data';\r\nimport { setSelectedItems } from '../@data/mutatorActions';\r\nimport { getStore } from '../@data/store/store';\r\n\r\nexport const useSelectionGrid = (\r\n id: string,\r\n mode?: SelectionMode,\r\n setGridRows?,\r\n onSelectionRefChanged?: (selectedItems: Model[]) => void\r\n) => {\r\n // tslint:disable-next-line: no-any\r\n const getKey = (item: any): string => item?.[id];\r\n\r\n const selection: Selection = useMemo(\r\n () =>\r\n new Selection({\r\n onItemsChanged() {\r\n selection?.getItems().forEach((row) => selection?.setKeySelected(row?.[id], row?.['isSelected'], true));\r\n },\r\n onSelectionChanged() {\r\n if (mode === SelectionMode.single) {\r\n let selectedRow: Model | undefined = selection.getSelection()[0] as Model;\r\n if (selection.getSelection()[0] === undefined && getStore().selectedItems[0] !== undefined) {\r\n if (selection.getItems().find((row) => row?.[id] === getStore().selectedItems[0]?.[id]) !== undefined) {\r\n selectedRow = undefined;\r\n } else {\r\n selectedRow = getStore().selectedItems[0];\r\n }\r\n }\r\n setGridRows((gridRows) => {\r\n const rowsWithUpdatedSelectionStatus = gridRows.map((row) => {\r\n return row?.[id] === selectedRow?.[id] ? { ...row, isSelected: true } : { ...row, isSelected: false };\r\n });\r\n setSelectedItems(rowsWithUpdatedSelectionStatus.filter((row) => row?.['isSelected'] === true));\r\n onSelectionRefChanged?.(rowsWithUpdatedSelectionStatus);\r\n return rowsWithUpdatedSelectionStatus;\r\n });\r\n } else {\r\n const activeRows = selection.getItems().map((row) => {\r\n return { ...row, isSelected: selection.getSelection().includes(row) };\r\n });\r\n\r\n setGridRows((gridRows) => {\r\n const rowsWithUpdatedSelectionStatus = gridRows.map((row) => {\r\n const rowToBeSwapped = activeRows.find((r) => r?.[id] === row?.[id]);\r\n if (rowToBeSwapped) {\r\n return rowToBeSwapped;\r\n }\r\n return row;\r\n });\r\n setSelectedItems(rowsWithUpdatedSelectionStatus.filter((row) => row?.['isSelected'] === true));\r\n onSelectionRefChanged?.(rowsWithUpdatedSelectionStatus);\r\n return rowsWithUpdatedSelectionStatus;\r\n });\r\n }\r\n },\r\n getKey,\r\n }),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n []\r\n );\r\n\r\n return { selection, getKey };\r\n};\r\n","import {\r\n Checkbox,\r\n DetailsHeader,\r\n DetailsRow,\r\n IDetailsCheckboxProps,\r\n IDetailsColumnRenderTooltipProps,\r\n IDetailsHeaderProps,\r\n IDetailsRowProps,\r\n mergeStyleSets,\r\n Selection,\r\n Shimmer,\r\n TooltipHost,\r\n} from '@fluentui/react';\r\nimport React from 'react';\r\nimport { getClassNames } from '../GridV2.styles';\r\nimport { IGridV2Column } from '../GridV2.types';\r\n\r\nexport const RenderHeaderCheckbox = (selection: Selection, headerProps?: IDetailsHeaderProps): JSX.Element | null => {\r\n if (!headerProps) {\r\n return null;\r\n }\r\n\r\n const { detailsHeaderRootStyle } = mergeStyleSets(getClassNames());\r\n\r\n return (\r\n <DetailsHeader\r\n {...headerProps}\r\n styles={{ root: detailsHeaderRootStyle }}\r\n onRenderColumnHeaderTooltip={(tooltipHostProps: IDetailsColumnRenderTooltipProps) => {\r\n return <TooltipHost {...tooltipHostProps} />;\r\n }}\r\n onRenderDetailsCheckbox={(props: IDetailsCheckboxProps, defaultRender) => {\r\n return (\r\n <Checkbox\r\n checked={selection.getItems().every((x) => x?.['isSelected'] === true)}\r\n ariaLabel={'ToggleAll'}\r\n onChange={(_, checked) => selection.setAllSelected(!checked)}\r\n />\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport const RenderRowCheckbox = (\r\n id: string,\r\n selection: Selection,\r\n detailsRowProps?: IDetailsRowProps,\r\n hideDisableStyle?: boolean\r\n): JSX.Element | null => {\r\n if (!detailsRowProps) {\r\n return null;\r\n }\r\n\r\n const { item } = detailsRowProps ?? {};\r\n const { detailsRowRootStyle, disabledRowStyle, checkCell } = mergeStyleSets(getClassNames());\r\n\r\n return (\r\n <DetailsRow\r\n data-testid=\"grid-item\"\r\n disabled={item?.isDisabled && !hideDisableStyle}\r\n {...detailsRowProps}\r\n styles={({ disabled }) => ({ root: `${detailsRowRootStyle} ${disabled && !hideDisableStyle ? disabledRowStyle : ''}` })}\r\n checkboxCellClassName={checkCell}\r\n onRenderItemColumn={(itemToRender, _, column: IGridV2Column) => {\r\n return column.isLoading ? (\r\n <Shimmer styles={{ root: { display: 'flex', alignItems: 'center', height: '100%' }, shimmerWrapper: { height: '7px' } }} />\r\n ) : (\r\n column.onRenderData?.(itemToRender) || itemToRender[column.fieldName!]\r\n );\r\n }}\r\n onRenderDetailsCheckbox={(props: IDetailsCheckboxProps, defaultRender) => {\r\n return (\r\n <Checkbox\r\n checked={props.checked}\r\n ariaLabel={`Toggle-Select-Row`}\r\n onChange={() => {\r\n const index = selection.getItems()?.findIndex((row) => row?.[id] === item?.[id]);\r\n if (index !== -1) {\r\n selection.toggleIndexSelected(index);\r\n }\r\n }}\r\n />\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n","import { boolean, object, string } from 'yup';\r\nimport { IUserViewModel } from './IUserViewModel';\r\n\r\nexport function userAcceptInvitationErrorModel() {\r\n return object<IUserViewModel>().shape({\r\n firstName: string()\r\n .trim()\r\n .required(),\r\n lastName: string()\r\n .trim()\r\n .required(),\r\n emailAddress: string()\r\n .email()\r\n .required(),\r\n language: string().required(),\r\n contactByPhone: boolean(),\r\n contactByEmail: boolean(),\r\n phoneNumber: string().when('contactByPhone', {\r\n is: true,\r\n then: string().required()\r\n })\r\n });\r\n}\r\n","export const ariaConfig = {\r\n transmitProfile: 'AWT_REAL_TIME',\r\n\r\n // ARIA Project tokens for different envs\r\n // aria project name - PubcenterUINext-Dev\r\n // https://portal.aria.ms/project/13b6d1306d984c86b48a95df1443daa3/home\r\n ariaTokenTest: '13b6d1306d984c86b48a95df1443daa3-8bd3a776-3812-45d6-93b3-a9944af0602c-7250',\r\n\r\n // dev/SI/staging refer to the same env\r\n // aria project name - PubcenterUINext-SI\r\n // https://portal.aria.ms/project/8729f29d43a04e89bdfb2f7d9c2c22c1/home\r\n ariaTokenSI: '8729f29d43a04e89bdfb2f7d9c2c22c1-72910d57-9c8c-4929-ba85-adaedc15b808-7236',\r\n\r\n // aria project name - PubcenterUINext-BCP\r\n // https://portal.aria.ms/project/4730aa7b426443bca86a435110589367/home\r\n ariaTokenBCP: '4730aa7b426443bca86a435110589367-2a3d4128-5cf8-492c-a50b-2bcc1edac9a0-7040',\r\n\r\n // aria project name - PubcenterUINext-Prod\r\n // https://portal.aria.ms/project/ec1ea72e6f7f4f34a02a6fc2d1fa1280/home\r\n ariaTokenProd: 'ec1ea72e6f7f4f34a02a6fc2d1fa1280-679679fb-85d9-4a00-b895-fc8382c6cd17-7344',\r\n}","export enum UserConstants {\r\n publisherId = 'publisherId',\r\n publisherName = 'publisherName',\r\n userId = 'userId',\r\n userName = 'userName',\r\n trackingId = 'trackingId',\r\n url = 'url',\r\n sessionId = 'sessionId',\r\n logMessage = 'logMessage',\r\n logLevel = 'logLevel',\r\n userEmail = 'userEmail',\r\n}\r\n","import { AWTEventPriority, AWTEventProperties, AWTLogManager, AWTSessionState } from '@aria/webjs-sdk';\r\nimport { ariaConfig } from './Aria.Config';\r\nimport { Environment } from './Environment';\r\nimport { ILogManager } from \"./ILogManager\";\r\nimport { ILogUserContext } from \"./ILogUserContext\";\r\nimport { LoggingUtils } from \"./LoggingUtils\";\r\nimport { LogType } from \"./LogType\";\r\nimport { UserConstants } from \"./UserConstants\";\r\n\r\nexport class AriaLoggerManager implements ILogManager {\r\n private static AriaLogger;\r\n\r\n private static _getAriaToken(logParams): string {\r\n let ariaToken = '';\r\n // Read aria token from logParams, if its non empty\r\n if (Object.keys(logParams).length !== 0) {\r\n ariaToken = logParams.ariaToken;\r\n return ariaToken;\r\n }\r\n\r\n const environment = LoggingUtils.getEnvironment();\r\n\r\n switch (environment) {\r\n case Environment.TEST:\r\n ariaToken = ariaConfig.ariaTokenTest;\r\n break;\r\n\r\n case Environment.SI:\r\n ariaToken = ariaConfig.ariaTokenSI;\r\n break;\r\n\r\n case Environment.BCP:\r\n ariaToken = ariaConfig.ariaTokenBCP;\r\n break;\r\n\r\n case Environment.PROD:\r\n ariaToken = ariaConfig.ariaTokenProd;\r\n break;\r\n\r\n default:\r\n ariaToken = ariaConfig.ariaTokenSI;\r\n break;\r\n }\r\n\r\n return ariaToken;\r\n }\r\n\r\n private static _initalizeAriaEnv(ariaToken, AriaLogger) {\r\n try{\r\n AWTLogManager.initialize(ariaToken);\r\n AWTLogManager.setTransmitProfile(ariaConfig.transmitProfile);\r\n\r\n if(AriaLogger === undefined) {\r\n AriaLogger = AWTLogManager.getLogger(ariaToken);\r\n }\r\n\r\n // Initialize the session\r\n // This enables populating 'sessionID' into the ARIA logs\r\n AriaLogger.logSession(AWTSessionState.Started);\r\n } catch (e) {\r\n console.log('Failed to initialize ARIA environment with error ', e);\r\n }\r\n\r\n return AriaLogger;\r\n }\r\n\r\n constructor(logParams) {\r\n const ariaToken = AriaLoggerManager._getAriaToken(logParams);\r\n AriaLoggerManager.AriaLogger = AriaLoggerManager._initalizeAriaEnv(ariaToken, AriaLoggerManager.AriaLogger);\r\n }\r\n\r\n public log(logType: LogType, logMessage: string | number | object, logUserContext: ILogUserContext): void {\r\n this._ariaLog(logType, logMessage, logUserContext);\r\n }\r\n\r\n private _setProperties(logUserContext: ILogUserContext, eventProperties: AWTEventProperties): void {\r\n eventProperties.setProperty(UserConstants.publisherId, logUserContext.publisherId);\r\n eventProperties.setProperty(UserConstants.publisherName, logUserContext.publisherName);\r\n eventProperties.setProperty(UserConstants.userName, logUserContext.userName);\r\n eventProperties.setProperty(UserConstants.userId, logUserContext.userId);\r\n eventProperties.setProperty(UserConstants.userEmail, logUserContext.userEmail);\r\n }\r\n\r\n private _ariaLog(logType: LogType, logMessage: string | number | object, logUserContext: ILogUserContext): void {\r\n const eventProperties = new AWTEventProperties(logType);\r\n this._setProperties(logUserContext, eventProperties);\r\n eventProperties.setProperty(UserConstants.logMessage, JSON.stringify(logMessage));\r\n\r\n switch(logType) {\r\n\r\n case 'DEBUG': {\r\n eventProperties.setEventPriority(AWTEventPriority.Normal);\r\n eventProperties.setProperty(UserConstants.logLevel, 'DEBUG');\r\n break;\r\n }\r\n\r\n case 'INFO': {\r\n eventProperties.setEventPriority(AWTEventPriority.Normal);\r\n eventProperties.setProperty(UserConstants.logLevel, 'INFO');\r\n break;\r\n }\r\n\r\n case 'WARN': {\r\n eventProperties.setEventPriority(AWTEventPriority.High);\r\n eventProperties.setProperty(UserConstants.logLevel, 'WARN');\r\n break;\r\n }\r\n\r\n case 'ERROR': {\r\n eventProperties.setEventPriority(AWTEventPriority.Immediate_sync);\r\n eventProperties.setProperty(UserConstants.logLevel, 'ERROR');\r\n break;\r\n }\r\n\r\n default: {\r\n eventProperties.setEventPriority(AWTEventPriority.Normal);\r\n break;\r\n }\r\n }\r\n\r\n AriaLoggerManager.AriaLogger.logEvent(eventProperties);\r\n };\r\n}","import { action } from 'satcheljs';\r\n\r\nexport const onLoadingChanged = action('onLoadingChanged', (isLoading: boolean) => ({ isLoading }));\r\nexport const onFeatureFlagChanged = action('onFeatureFlagChanged', (isFeatureEnabled: boolean) => ({ isFeatureEnabled }));\r\n","import { mutator } from 'satcheljs';\r\nimport { onFeatureFlagChanged, onLoadingChanged } from '../actions/windowsFeatureFlagActions';\r\nimport { getStore } from '../store/store';\r\n\r\nmutator(onLoadingChanged, (msg) => {\r\n const store = getStore();\r\n store.isLoading = msg.isLoading;\r\n});\r\n\r\nmutator(onFeatureFlagChanged, (msg) => {\r\n const store = getStore();\r\n store.isFeatureEnabled = msg.isFeatureEnabled;\r\n});\r\n","import { useEffect, useRef } from 'react';\r\nimport { isTythonSelfServeUser } from '../../@data';\r\nimport { onFeatureFlagChanged } from './actions/windowsFeatureFlagActions';\r\nimport './mutators/windowsFeatureFlagMutators';\r\nimport { useWindowsAppFeatureFlagType } from './types';\r\n\r\nconst useWindowsAppFeatureFlag: useWindowsAppFeatureFlagType = (userContext, publisher) => {\r\n const isFeatureFlagInitialized = useRef(false);\r\n\r\n /**\r\n * TODO: Integrate fetch feature flag by publisher id when api is ready to use\r\n */\r\n // const fetchWindowsAppFeatureFlagByPublisherId = async (publisherId: string) => {\r\n // const url = `${uiConfig.getApiBaseAddress('1.2')}/publishers/${publisherId}/WindowsAppEnable`;\r\n // onLoadingChanged(true);\r\n // try {\r\n // const headers = await buildRequestHeadersWithAuthToken(url, userContext);\r\n // const response = await fetch(url, { method: 'GET', headers });\r\n // if (!response.ok) {\r\n // console.error(`HTTP error! status: ${response.status}`);\r\n // }\r\n // const featureFlag = await response.json();\r\n // // onFeatureFlagChanged(featureFlag)\r\n // } catch (error) {\r\n // // mark publisher as disabled for testing 321792029,322468545\r\n // // tython-test-user-may13@outlook-int.com, tython-test-user-may22@outlook-int.com\r\n // onFeatureFlagChanged(!['321792029', 321792029, '322468545', 322468545].includes(publisher?.id!));\r\n // console.error(error);\r\n // } finally {\r\n // onLoadingChanged(false);\r\n // }\r\n // };\r\n\r\n const ENABLED_PUBLISHERS_PROD = ['253874386'];\r\n const DISABLED_PUBLISHERS_NON_PROD = ['321792029', '322468545'];\r\n useEffect(() => {\r\n if (!isFeatureFlagInitialized.current && userContext && publisher?.id && isTythonSelfServeUser()) {\r\n isFeatureFlagInitialized.current = true;\r\n /**\r\n * TODO: call fetch feature flag once api ready\r\n * fetchWindowsAppFeatureFlagByPublisherId(publisher.id);\r\n */\r\n const isProdEnv = process.env.REACT_APP_ENV === 'production';\r\n if (isProdEnv) {\r\n onFeatureFlagChanged(ENABLED_PUBLISHERS_PROD.includes(publisher.id!.toString()));\r\n } else {\r\n onFeatureFlagChanged(!DISABLED_PUBLISHERS_NON_PROD.includes(publisher.id!.toString()));\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [userContext, publisher]);\r\n};\r\n\r\nexport default useWindowsAppFeatureFlag;\r\n","/* istanbul ignore file */\r\nimport '@bingads-webui-help/apex';\r\nimport $ from 'jquery';\r\nimport { uiConfig } from '../../config/ui.config';\r\n\r\nlet prevLocale;\r\n\r\nexport function initApexPlatform(supportButton, locale) {\r\n if (prevLocale !== locale) {\r\n const apexInitOptions = {\r\n // The project name, ask the writers team for your project name\r\n Project: 'PubCenter_v4', // 2024-03-11-06-31-14-PubCenter-v4\r\n // The language of help content, ask the writers team for supported languages of your project\r\n Market: locale,\r\n EndPoint: uiConfig.getApexInitUrl(),\r\n // Set it to true to enable inline help popup\r\n InitPopup: true,\r\n // Whether to init on ready, need to set to false for basic usage\r\n InitOnReady: false,\r\n SupportOptions: { template: supportButton },\r\n };\r\n\r\n $.fn.InitApexPlatform(apexInitOptions);\r\n prevLocale = locale;\r\n }\r\n}\r\n","/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport { css, Icon, Link, PrimaryButton } from '@fluentui/react';\r\nimport { Link as V2Link } from '@fluentui/react-components';\r\nimport React from 'react';\r\nimport { IHeaderItem } from '../../components/Header/Header.types';\r\nimport { InlineAnchorProps, IUseCMUIExperience, QueryArticleAnchorProps, QueryArticleButtonProps } from './index.types';\r\nimport { initApexPlatform } from './init-apex';\r\n\r\n/**\r\n * This is a custom hook to integrate Microsoft Advertising - Campaign Management UI(CMUI) help experience\r\n * This hook @returns 2 core components CMUIInlineHelpAnchor and CMUIPopupArticleByIdAnchor\r\n *\r\n * <CMUIInlineHelpAnchor /> will render a hover card with given `topic` content at absolute position, PM will\r\n * share topic string\r\n * <CMUIPopupArticleByIdAnchor /> will render a anchor tag to support click open the popup help panel and render\r\n * content of the given `query` article\r\n *\r\n * @example\r\n * const { CMUIInlineHelpAnchor, CMUIPopupArticleByIdAnchor } = useCMUIHelpExperience();\r\n *\r\n * <CMUIInlineHelpAnchor name=\"Inline Help Button\" topic=\"pop_PCv4_ServingStatus\" className={this._classNames....} />\r\n * @param name is required\r\n * @param topic is required to map the expected inline help content\r\n *\r\n * <CMUIPopupArticleByIdAnchor query=\"ext07502\" name=\"query by id\" className={this._classNames....} />\r\n * @param name is required\r\n * @param query is required to map the expected pop up article id\r\n *\r\n * @reference\r\n * https://msasg.visualstudio.com/Bing_Ads/_artifacts/feed/BingAdsWebUISharedComponents/Npm/@bingads-webui-help%2Fapex/overview\r\n */\r\nexport const useCMUIHelpExperience = (): IUseCMUIExperience => {\r\n const CMUI_HELP_BUTTON_ID = '#helpbutton';\r\n\r\n const popupClickHandler = (evt) => {\r\n window?.PopupController?.PopupJsClick(evt.target);\r\n };\r\n\r\n const initCMUIHelpButtonEventListener = () => {\r\n const helpButtons = document.querySelectorAll(CMUI_HELP_BUTTON_ID);\r\n for (let i = 0; i < helpButtons.length; i++) {\r\n helpButtons[i].addEventListener('click', popupClickHandler);\r\n }\r\n };\r\n\r\n const removeCMUIHelpButtonEventListener = () => {\r\n const helpButtons = document.querySelectorAll(CMUI_HELP_BUTTON_ID);\r\n for (let i = 0; i < helpButtons.length; i++) {\r\n helpButtons[i].removeEventListener('click', popupClickHandler);\r\n }\r\n };\r\n\r\n // for now header help icon only expose to Tython flow mvp users\r\n const CMUIHeaderMenuItemSerializer = (isTythonSelfServeUser: boolean, items: IHeaderItem[] | undefined) => {\r\n const headerHelpIconProps = {\r\n key: 'HelpIcon',\r\n title: 'Help',\r\n icon: 'Help',\r\n className: 'HelpTopic',\r\n query: 'ext07501',\r\n shouldOverflowUnderExtraSmallScreen: true,\r\n };\r\n if (isTythonSelfServeUser && !items?.some((i) => i.key === headerHelpIconProps.key)) {\r\n if (items) {\r\n items.unshift(headerHelpIconProps);\r\n } else {\r\n items = [headerHelpIconProps];\r\n }\r\n }\r\n return items;\r\n };\r\n\r\n const CMUIInlineHelpAnchor = (props: InlineAnchorProps) => {\r\n const eleRef = React.createRef<HTMLAnchorElement>();\r\n\r\n const onClick = React.useCallback((event: React.MouseEvent<HTMLAnchorElement>) => {\r\n event.preventDefault();\r\n if (eleRef.current) {\r\n window.PopupController.PopupJsClick(eleRef.current);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const { topic, name, className, iconName } = props;\r\n const iconStyle: React.CSSProperties = {\r\n fontSize: '16px',\r\n margin: '0px 4px',\r\n height: '16px',\r\n lineHeight: '16px',\r\n textAlign: 'center',\r\n flexShrink: 0,\r\n color: 'rgb(0, 120, 212)',\r\n };\r\n\r\n return (\r\n <a className={className} ref={eleRef} id=\"helpbutton\" tabIndex={0} type=\"helppopup\" onClick={onClick} href=\"#\" topic={topic.trim()}>\r\n {name && name}\r\n {iconName && <Icon iconName={iconName} style={iconStyle} />}\r\n </a>\r\n );\r\n };\r\n\r\n const CMUIPopupArticleByIdAnchor = (props: QueryArticleAnchorProps) => {\r\n const { query, name, className, disabled, useV2Link = false } = props;\r\n if (useV2Link) {\r\n return (\r\n <V2Link href=\"/#\" query={query} className={css('HelpTopic', className)} disabled={disabled}>\r\n {name}\r\n </V2Link>\r\n );\r\n }\r\n\r\n return (\r\n <Link href=\"/#\" query={query} className={css('HelpTopic', className)}>\r\n {name}\r\n </Link>\r\n );\r\n };\r\n\r\n const CMUIPopupArticleUsingButton = (props: QueryArticleButtonProps) => {\r\n const { query, className, anchorStyle, formatMessage, buttonText, buttonStyle } = props;\r\n return (\r\n <>\r\n <a\r\n hidden={true}\r\n href=\"/#\"\r\n query={query}\r\n id=\"helpbutton\"\r\n className={css(className, anchorStyle)}\r\n // style={{ textDecoration: 'none', color: 'black' }}\r\n >\r\n Learn more\r\n </a>\r\n <PrimaryButton\r\n text={formatMessage(buttonText)}\r\n className={buttonStyle}\r\n onClick={() => {\r\n document.getElementById('helpbutton')?.click();\r\n }}\r\n tabIndex={0}\r\n />\r\n </>\r\n );\r\n };\r\n\r\n return {\r\n CMUIHeaderMenuItemSerializer,\r\n CMUIPopupArticleUsingButton,\r\n CMUIInlineHelpAnchor,\r\n CMUIPopupArticleByIdAnchor,\r\n initCMUIHelpButtonEventListener,\r\n init: initApexPlatform,\r\n removeCMUIHelpButtonEventListener,\r\n };\r\n};\r\n","import { AnimationClassNames, FontWeights } from '@fluentui/react';\r\nimport { IPubcenterSpacing } from '../../../theme';\r\nimport { IMultiSelectPickerStyleProps, IMultiSelectPickerStyles } from './MultiSelectPicker.types';\r\n\r\n// TODO: Implement Focused States #1636116 (errorMessage focus too)\r\nexport const getStyles = (props: IMultiSelectPickerStyleProps): IMultiSelectPickerStyles => {\r\n const { theme, height, hasErrorMessage } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const defaultHeight = 260;\r\n const { semanticColors } = theme;\r\n\r\n return {\r\n root: ['ms-MultiSelectPicker'],\r\n picker: {\r\n height: height || defaultHeight,\r\n display: 'flex',\r\n flexDirection: 'row',\r\n marginTop: spacing.size8,\r\n width: 580,\r\n },\r\n itemsPane: [\r\n {\r\n display: 'flex',\r\n flex: 1,\r\n flexGrow: 1,\r\n overflow: 'hidden',\r\n flexDirection: 'column',\r\n borderWidth: 1,\r\n borderStyle: 'solid',\r\n borderColor: '#B3B0AD',\r\n selectors: {\r\n ':first-child': {\r\n marginRight: spacing.size16,\r\n },\r\n },\r\n },\r\n hasErrorMessage && {\r\n borderColor: semanticColors.errorText,\r\n selectors: {\r\n '&:focus, &:hover': {\r\n borderColor: semanticColors.errorText,\r\n },\r\n },\r\n },\r\n ],\r\n header: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'space-between',\r\n marginTop: spacing.size8,\r\n marginBottom: spacing.size8,\r\n },\r\n headerLabel: [\r\n 'ms-font-m',\r\n {\r\n fontWeight: FontWeights.semibold,\r\n marginLeft: spacing.size8,\r\n padding: 0,\r\n },\r\n ],\r\n textButton: {\r\n display: 'flex',\r\n alignSelf: 'flex-end',\r\n marginRight: spacing.size8,\r\n },\r\n errorMessage: [\r\n 'ms-MultiSelectPicker-errorMessage',\r\n AnimationClassNames.slideDownIn20,\r\n theme.fonts.small,\r\n {\r\n color: semanticColors.errorText,\r\n margin: 0,\r\n paddingTop: 5,\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n ],\r\n list: {\r\n flex: 1,\r\n overflowY: 'auto',\r\n },\r\n disabledPanel: {\r\n backgroundColor: theme.palette.neutralLighter,\r\n },\r\n listItem: {\r\n display: 'flex',\r\n paddingLeft: spacing.size8,\r\n paddingRight: spacing.size8,\r\n height: spacing.size36,\r\n lineHeight: spacing.size36,\r\n cursor: 'pointer',\r\n selectors: {\r\n ':hover': {\r\n backgroundColor: theme.palette.neutralLighter,\r\n },\r\n },\r\n },\r\n disabledListItem: {\r\n backgroundColor: theme.palette.neutralLight,\r\n },\r\n listItemLabel: [\r\n 'ms-font-m',\r\n {\r\n flex: 1,\r\n textOverflow: 'ellipsis',\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n },\r\n ],\r\n subComponentStyles: {\r\n search: {\r\n root: {\r\n height: spacing.size48,\r\n },\r\n },\r\n iconButton: {\r\n root: [\r\n 'ms-font-m',\r\n {\r\n color: theme.palette.themePrimary,\r\n },\r\n ],\r\n },\r\n },\r\n };\r\n};\r\n","import { styled } from '@fluentui/react';\r\nimport { MultiSelectPickerBase } from './MultiSelectPicker.base';\r\nimport { getStyles } from './MultiSelectPicker.styles';\r\nimport { IMultiSelectPickerProps, IMultiSelectPickerStyleProps, IMultiSelectPickerStyles } from './MultiSelectPicker.types';\r\n\r\n// Use Fabric Base guidelines since this might be contributed back to Fabric.\r\nexport const MultiSelectPicker = styled<IMultiSelectPickerProps, IMultiSelectPickerStyleProps, IMultiSelectPickerStyles>(\r\n MultiSelectPickerBase,\r\n getStyles,\r\n undefined,\r\n {\r\n scope: 'MultiSelectPicker',\r\n }\r\n);\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages ({\r\n addAllButtonAriaDescription: {\r\n id: 'multiSelectPicker.addAllButtonDescription',\r\n defaultMessage: 'Click to add all available items'\r\n },\r\n removeAllButtonAriaDescription: {\r\n id: 'multiSelectPicker.removeAllButtonAriaDescription',\r\n defaultMessage: 'Click to remove all selected items'\r\n },\r\n filteredItemsLabel: {\r\n id: 'multiSelectPicker.filteredItemsLabel',\r\n defaultMessage: 'Available items: {count}',\r\n },\r\n selectedItemsLabel: {\r\n id: 'multiSelectPicker.selectedItemsLabel',\r\n defaultMessage: 'Selected: {count}',\r\n },\r\n createButtonAriaDesciption: {\r\n id: 'multiSelectPicker.CreateButtonAriaDescription',\r\n defaultMessage: 'Click this button to {label} within this page'\r\n },\r\n searchBoxPlaceholder: {\r\n id: 'multiSelectPicker.seachBoxPlaceholder',\r\n defaultMessage: 'Search available items',\r\n },\r\n addIconAriaLabel:{\r\n id: 'multiSelectPicker.addIconAriaLabel',\r\n defaultMessage: 'Add item',\r\n },\r\n removeIconAriaLabel: {\r\n id: 'multiSelectPicker.removeIconAriaLabel',\r\n defaultMessage: 'Remove item',\r\n },\r\n removeAllButtonLabel: {\r\n id: 'multiSelectPicker.removeAll',\r\n defaultMessage: 'Remove all',\r\n },\r\n addAllButtonLabel: {\r\n id: 'multiSelectPicker.addAll',\r\n defaultMessage: 'Add all',\r\n },\r\n availableItemsListBoxAriaLabel: {\r\n id:'multiSelectPicker.availableItemsListBoxAriaLabel',\r\n defaultMessage: 'Available items',\r\n },\r\n selectedItemsPaneAriaLabel: {\r\n id: 'multiSelectPicker.selectedItemsPaneAriaLabel',\r\n defaultMessage: 'Selected items'\r\n }\r\n});","import {\r\n ActionButton,\r\n BaseComponent,\r\n classNamesFunction,\r\n DelayedRender,\r\n FocusZone,\r\n FocusZoneDirection,\r\n getId,\r\n Icon,\r\n IProcessedStyleSet,\r\n Label,\r\n Link,\r\n nullRender,\r\n SearchBox,\r\n css,\r\n} from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { isButtonPressKey } from '../../utils/AccessibilityUtils';\r\nimport { getScreenReaderTextStyles } from '../../utils/GlobalStyleUtils';\r\nimport messages from './MultiSelectPicker.messages';\r\nimport { IIdNamePair, IMultiSelectPickerProps, IMultiSelectPickerStyleProps, IMultiSelectPickerStyles } from './MultiSelectPicker.types';\r\n\r\nconst getClassNames = classNamesFunction<IMultiSelectPickerStyleProps, IMultiSelectPickerStyles>();\r\n\r\nexport interface IMultiSelectPickerState {\r\n filteredItems: IIdNamePair[];\r\n selectedItems: IIdNamePair[];\r\n}\r\n\r\nexport class MultiSelectPickerBase extends BaseComponent<IMultiSelectPickerProps, IMultiSelectPickerState> {\r\n private _classNames: IProcessedStyleSet<IMultiSelectPickerStyles>;\r\n private _label: string = getId('multiSelectPickerLabel');\r\n\r\n constructor(props: IMultiSelectPickerProps) {\r\n super(props);\r\n\r\n const availableItems = [...this.props.items];\r\n const selectedItems = this._getIntersection(this.props.items, this.props.initialSelectedItems || []);\r\n selectedItems.forEach((item) => {\r\n availableItems.find((i) => i.id === item.id)!!.isSelected = true;\r\n });\r\n\r\n this.state = {\r\n filteredItems: availableItems,\r\n selectedItems: selectedItems,\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: IMultiSelectPickerProps) {\r\n let initialSelectedItems = this.state.selectedItems;\r\n\r\n if (this.props.initialSelectedItems !== prevProps.initialSelectedItems) {\r\n initialSelectedItems = this.props.initialSelectedItems || [];\r\n }\r\n\r\n if (this.props.items !== prevProps.items || this.props.initialSelectedItems !== prevProps.initialSelectedItems) {\r\n // Make sure only the selected ones which still exists remain selected.\r\n const intersectedSelectedItems = this._getIntersection(initialSelectedItems, this.props.items);\r\n const availableItems = [...this.props.items];\r\n\r\n intersectedSelectedItems.forEach((item) => {\r\n availableItems.find((i) => i.id === item.id)!!.isSelected = true;\r\n });\r\n\r\n this.setState({\r\n filteredItems: availableItems,\r\n selectedItems: intersectedSelectedItems,\r\n });\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n styles,\r\n theme,\r\n errorMessage,\r\n label,\r\n onRenderLabel = this._onRenderLabel,\r\n ariaDescription,\r\n enableCreateButton,\r\n createButtonLabel,\r\n onCreateButtonClick,\r\n disabled,\r\n } = this.props;\r\n this._classNames = getClassNames(styles, { theme: theme!, hasErrorMessage: !!errorMessage });\r\n const pickerAriaDescriptionId = getId('pickerAriaDescription');\r\n\r\n const { formatMessage } = this.props.intl;\r\n\r\n return (\r\n <div className={this._classNames.root}>\r\n {onRenderLabel(this.props, this._onRenderLabel)}\r\n {enableCreateButton && (\r\n <ActionButton\r\n iconProps={{ iconName: 'add' }}\r\n onClick={onCreateButtonClick}\r\n disabled={disabled}\r\n ariaDescription={createButtonLabel ? formatMessage(messages.createButtonAriaDesciption, { label: createButtonLabel }) : ''}\r\n >\r\n {createButtonLabel}\r\n </ActionButton>\r\n )}\r\n <div\r\n className={this._classNames.picker}\r\n role=\"form\"\r\n {...(label ? { 'aria-labelledby': this._label } : {})}\r\n aria-describedby={pickerAriaDescriptionId}\r\n >\r\n {this._renderItemsPane()}\r\n {this._renderSelectedItemsPane()}\r\n <span id={pickerAriaDescriptionId} style={getScreenReaderTextStyles()}>\r\n {ariaDescription}\r\n </span>\r\n </div>\r\n {errorMessage && (\r\n <div role=\"alert\">\r\n <DelayedRender>\r\n <p className={this._classNames.errorMessage}>\r\n <span data-automation-id=\"error-message\">{errorMessage}</span>\r\n </p>\r\n </DelayedRender>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n private _onRenderLabel = (props: IMultiSelectPickerProps): JSX.Element | null => {\r\n const { label, required } = props;\r\n\r\n if (label) {\r\n return (\r\n <Label id={this._label} required={required}>\r\n {props.label}\r\n </Label>\r\n );\r\n }\r\n\r\n return null;\r\n };\r\n\r\n private _renderSelectedItemsPane = (): JSX.Element => {\r\n const { selectedItems } = this.state;\r\n const { disabled } = this.props;\r\n const selectedCount = selectedItems.length;\r\n const { formatMessage } = this.props.intl;\r\n const removeAllAriaDescriptionId = getId('removeAllAriaDescription');\r\n\r\n let renderRemoveAll = nullRender();\r\n if (selectedCount > 0) {\r\n renderRemoveAll = (\r\n <>\r\n <Link\r\n className={this._classNames.textButton}\r\n onClick={this._onRemoveAll}\r\n disabled={this.props.disabled}\r\n aria-describedby={removeAllAriaDescriptionId}\r\n >\r\n {formatMessage(messages.removeAllButtonLabel)}\r\n </Link>\r\n\r\n <span id={removeAllAriaDescriptionId} style={getScreenReaderTextStyles()}>\r\n {this.props.intl.formatMessage(messages.removeAllButtonAriaDescription)}\r\n </span>\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <div className={css(this._classNames.itemsPane, disabled ? this._classNames.disabledPanel : '')} role=\"presentation\">\r\n <Label className={css(this._classNames.headerLabel, this._classNames.header)}>\r\n {formatMessage(messages.selectedItemsLabel, { count: selectedCount })}\r\n </Label>\r\n {renderRemoveAll}\r\n\r\n <FocusZone\r\n role=\"listbox\"\r\n className={this._classNames.list}\r\n aria-label={formatMessage(messages.selectedItemsPaneAriaLabel)}\r\n direction={FocusZoneDirection.vertical}\r\n isCircularNavigation={true}\r\n >\r\n {selectedItems.map((item: IIdNamePair, index: number) => (\r\n <div\r\n className={this._classNames.listItem}\r\n id={getId('multiSelectPickerSelItem')}\r\n key={'multiSelectPickerItem' + index}\r\n role=\"option\"\r\n aria-selected={true}\r\n onClick={!disabled ? this._onItemRemovedClick : undefined}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key) && !disabled && this._onItemRemovedClick(ev)}\r\n data-list-index={index}\r\n data-is-focusable={!disabled}\r\n tabIndex={!disabled ? 0 : -1}\r\n >\r\n <span className={this._classNames.listItemLabel}>{item.name}</span>\r\n <Icon\r\n iconName={'remove'}\r\n ariaLabel={formatMessage(messages.removeIconAriaLabel)}\r\n styles={this._classNames.subComponentStyles.iconButton}\r\n />\r\n </div>\r\n ))}\r\n </FocusZone>\r\n </div>\r\n );\r\n };\r\n\r\n private _renderItemsPane = (): JSX.Element => {\r\n const { disabled } = this.props;\r\n const { formatMessage } = this.props.intl;\r\n const { filteredItems } = this.state;\r\n const addAllAriaDescriptionId = getId('addAllAriaDescription');\r\n\r\n let renderAddAll = nullRender();\r\n if (filteredItems.length > 0) {\r\n renderAddAll = (\r\n <>\r\n <Link\r\n className={this._classNames.textButton}\r\n onClick={this._onAddAll}\r\n disabled={disabled}\r\n aria-describedby={addAllAriaDescriptionId}\r\n >\r\n {formatMessage(messages.addAllButtonLabel)}\r\n </Link>\r\n\r\n <span id={addAllAriaDescriptionId} style={getScreenReaderTextStyles()}>\r\n {this.props.intl.formatMessage(messages.addAllButtonAriaDescription)}\r\n </span>\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <div className={css(this._classNames.itemsPane, disabled ? this._classNames.disabledPanel : '')} role=\"presentation\">\r\n <SearchBox\r\n styles={this._classNames.subComponentStyles.search}\r\n underlined={true}\r\n placeholder={formatMessage(messages.searchBoxPlaceholder)}\r\n onChange={(_, value: string) => this._onSearchChange(value)}\r\n />\r\n <div className={this._classNames.header}>\r\n <Label className={this._classNames.headerLabel}>\r\n {formatMessage(messages.filteredItemsLabel, { count: filteredItems.length })}\r\n </Label>\r\n {renderAddAll}\r\n </div>\r\n <FocusZone\r\n className={this._classNames.list}\r\n role=\"listbox\"\r\n aria-multiselectable={true}\r\n aria-label={formatMessage(messages.availableItemsListBoxAriaLabel)}\r\n direction={FocusZoneDirection.vertical}\r\n isCircularNavigation={true}\r\n >\r\n {filteredItems.map((item: IIdNamePair, index: number) => (\r\n <div\r\n className={css(this._classNames.listItem, item.isSelected ? this._classNames.disabledListItem : '')}\r\n id={getId('multiSelectPickerItem')}\r\n key={'multiSelectPickerItem' + index}\r\n role=\"option\"\r\n aria-selected={item.isSelected}\r\n onClick={!disabled && !item.isSelected ? this._onItemAddedClick : undefined}\r\n onKeyDown={(ev) => {\r\n if (isButtonPressKey(ev.key)) {\r\n if (!disabled && !item.isSelected) {\r\n this._onItemAddedClick(ev);\r\n }\r\n }\r\n }}\r\n data-is-focusable={!disabled && !item.isSelected}\r\n data-list-index={index}\r\n tabIndex={!disabled ? 0 : -1}\r\n >\r\n <span className={this._classNames.listItemLabel}>{item.name}</span>\r\n {!item.isSelected && (\r\n <Icon\r\n iconName={'add'}\r\n ariaLabel={formatMessage(messages.addIconAriaLabel)}\r\n styles={this._classNames.subComponentStyles.iconButton}\r\n />\r\n )}\r\n </div>\r\n ))}\r\n </FocusZone>\r\n </div>\r\n );\r\n };\r\n\r\n private _onSearchChange = (query: string): void => {\r\n const queryName = query.toLocaleLowerCase();\r\n this.setState({\r\n filteredItems: this.props.items.filter((item) => {\r\n const name = item.name;\r\n return name.toLocaleLowerCase().indexOf(queryName) !== -1;\r\n }),\r\n });\r\n };\r\n\r\n private _getItemAtElement(\r\n item: IIdNamePair[],\r\n ev: React.MouseEvent<HTMLDivElement> | React.KeyboardEvent<HTMLDivElement>\r\n ): IIdNamePair | undefined {\r\n const el = ev.currentTarget as HTMLDivElement;\r\n\r\n if (el.getAttribute('data-list-index')) {\r\n const index = Number(el.getAttribute('data-list-index'));\r\n return item[index];\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private _onItemRemovedClick = (ev: React.MouseEvent<HTMLDivElement> | React.KeyboardEvent<HTMLDivElement>): void => {\r\n const selectedItems = [...this.state.selectedItems];\r\n const filteredItems = [...this.state.filteredItems];\r\n const item = this._getItemAtElement(selectedItems, ev);\r\n\r\n if (item) {\r\n const remainingSelectedItems = selectedItems.filter((i) => i !== item);\r\n\r\n filteredItems.forEach((i) => {\r\n if (i.id === item.id) {\r\n i.isSelected = false;\r\n }\r\n });\r\n\r\n this.setState({\r\n selectedItems: remainingSelectedItems,\r\n filteredItems: filteredItems,\r\n });\r\n\r\n if (this.props.onSelectedItems) {\r\n this.props.onSelectedItems(remainingSelectedItems);\r\n }\r\n }\r\n };\r\n\r\n private _onItemAddedClick = (ev: React.MouseEvent<HTMLDivElement> | React.KeyboardEvent<HTMLDivElement>): void => {\r\n const filterItems = [...this.state.filteredItems];\r\n const item = this._getItemAtElement(filterItems, ev);\r\n\r\n if (item && !this.state.selectedItems.find((i) => i.id === item.id)) {\r\n const selectedItems = [...this.state.selectedItems, item];\r\n\r\n item.isSelected = true;\r\n\r\n this.setState({\r\n selectedItems: selectedItems,\r\n filteredItems: filterItems,\r\n });\r\n\r\n if (this.props.onSelectedItems) {\r\n this.props.onSelectedItems(selectedItems);\r\n }\r\n }\r\n };\r\n\r\n private _getIntersection = (collectionA: IIdNamePair[], collectionB: IIdNamePair[]) => {\r\n return collectionA.filter((selectedItem) => collectionB.some((item) => selectedItem.id === item.id));\r\n };\r\n\r\n private _onRemoveAll = (ev: React.MouseEvent<HTMLElement>): void => {\r\n const filterItems = [...this.state.filteredItems];\r\n filterItems.map((item) => (item.isSelected = false));\r\n\r\n // reset items isSelected props on removeAll clicked;\r\n this.props.items.map((item) => (item.isSelected = false));\r\n this.setState({\r\n selectedItems: [],\r\n filteredItems: filterItems,\r\n });\r\n\r\n if (this.props.onSelectedItems) {\r\n this.props.onSelectedItems([]);\r\n }\r\n };\r\n\r\n private _onAddAll = (): void => {\r\n const selectedItems = [...this.state.selectedItems];\r\n const filterItems = [...this.state.filteredItems];\r\n\r\n filterItems.forEach((item) => {\r\n if (!item.isSelected) {\r\n selectedItems.push(item);\r\n }\r\n item.isSelected = true;\r\n });\r\n\r\n this.setState({\r\n selectedItems: selectedItems,\r\n filteredItems: filterItems,\r\n });\r\n\r\n if (this.props.onSelectedItems) {\r\n this.props.onSelectedItems(selectedItems);\r\n }\r\n };\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n loadAccountStatusFailed: {\r\n id: 'loadAccountStatus.failed',\r\n defaultMessage: 'We’re unable to load your account status.',\r\n },\r\n failedToLoadPublisherStatus: {\r\n id: 'accountData.failedToLoadPublisherStatus',\r\n defaultMessage: 'Failed to fetch publisher status. Please retry after sometime.',\r\n },\r\n});\r\n","import { ApiError, handleApiErrors, handleError, UserContext } from '../../../../@data';\r\nimport { buildRequestHeadersWithAuthToken } from '../../../../@data/utils/requestUtils';\r\nimport { uiConfig } from '../../../../config/ui.config';\r\n\r\nexport async function setUserPublisherContext(userContext: UserContext, publisherId: number): Promise<string> {\r\n const url = uiConfig.getApiBaseAddress() + '/user/context';\r\n const headers = await buildRequestHeadersWithAuthToken(url, userContext);\r\n\r\n headers.append('targetCustomerId', JSON.stringify(publisherId));\r\n\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n });\r\n\r\n const responseJson = await response.json();\r\n\r\n if (!response.ok) {\r\n return handleApiErrors(response, url);\r\n }\r\n\r\n const sessionId = responseJson.data.commonSessionId as string;\r\n return Promise.resolve(sessionId as string);\r\n } catch (err) {\r\n const error = `Failed to fetch user scopes for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n","module.exports = __webpack_public_path__ + \"static/media/HorizontalBottomAdPreview.ade3c98f.svg\";","module.exports = __webpack_public_path__ + \"static/media/HorizontalUpperAdPreview.30341d67.svg\";","module.exports = __webpack_public_path__ + \"static/media/SquareBottomAdPreview.104777b9.svg\";","module.exports = __webpack_public_path__ + \"static/media/SquareLeftAdPreview.200be276.svg\";","module.exports = __webpack_public_path__ + \"static/media/VerticalBottomAdPreview.61ec7927.svg\";","module.exports = __webpack_public_path__ + \"static/media/VerticalLeftAdPreview.bad374d2.svg\";","module.exports = __webpack_public_path__ + \"static/media/AutoFitHeight.17b37715.svg\";","module.exports = __webpack_public_path__ + \"static/media/AutoFitWidth.cc56f341.svg\";","module.exports = __webpack_public_path__ + \"static/media/AdUnitStep1.b072ddc2.svg\";","module.exports = __webpack_public_path__ + \"static/media/AdUnitStep2.ab0df0a4.svg\";","module.exports = __webpack_public_path__ + \"static/media/ProfileStep1.1f2568b7.svg\";","module.exports = __webpack_public_path__ + \"static/media/ProfileStep2.c3d5a7bd.svg\";","module.exports = __webpack_public_path__ + \"static/media/ProfileStep3.fdf91708.svg\";","module.exports = __webpack_public_path__ + \"static/media/SiteStep1.9c9d332e.svg\";","module.exports = __webpack_public_path__ + \"static/media/SiteStep2.3253c414.svg\";","module.exports = __webpack_public_path__ + \"static/media/SiteStep3.b1df8a7d.svg\";","module.exports = __webpack_public_path__ + \"static/media/adBlock.63613aca.svg\";","module.exports = __webpack_public_path__ + \"static/media/adsTxt.30e52a8d.svg\";","module.exports = __webpack_public_path__ + \"static/media/mediation.e26df186.svg\";","module.exports = __webpack_public_path__ + \"static/media/mediationIcon.13ff8f01.svg\";","module.exports = __webpack_public_path__ + \"static/media/payment.211f62c0.svg\";","import { DirectionalHint, HoverCard, HoverCardType, mergeStyleSets } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { getClassNames } from '../GridV2.styles';\r\n\r\ninterface ICellInfoCalloutProps {\r\n children: JSX.Element;\r\n placement?: DirectionalHint;\r\n calloutContent: JSX.Element | null;\r\n}\r\n\r\nexport const CellInfoCallout = (props: ICellInfoCalloutProps) => {\r\n const { children, placement = DirectionalHint.leftTopEdge, calloutContent } = props;\r\n const { calloutFocusable } = mergeStyleSets(getClassNames());\r\n\r\n return (\r\n <HoverCard\r\n style={{\r\n width: 360,\r\n padding: '20px 15px',\r\n }}\r\n className={calloutFocusable}\r\n plainCardProps={{\r\n directionalHint: placement,\r\n calloutProps: {\r\n isBeakVisible: true,\r\n },\r\n onRenderPlainCard: () => calloutContent,\r\n }}\r\n cardDismissDelay={200}\r\n instantOpenOnClick\r\n type={HoverCardType.plain}\r\n trapFocus={true}\r\n setInitialFocus\r\n >\r\n {children}\r\n </HoverCard>\r\n );\r\n};\r\n","module.exports = __webpack_public_path__ + \"static/media/emailLogo.e3207688.svg\";","module.exports = __webpack_public_path__ + \"static/media/emailSentLogo.425fe58f.svg\";","import { InjectedIntl } from 'react-intl';\r\nimport { action, mutatorAction } from 'satcheljs';\r\nimport { RouteName, getPageStore } from '../store/store';\r\n\r\nexport const onCurrentRouteChanged = action(\r\n 'onCurrentRouteChanged',\r\n (currentRoute: RouteName, formatMessage: InjectedIntl['formatMessage']) => ({ currentRoute, formatMessage })\r\n);\r\n\r\nexport const onPanelOpenChanged = mutatorAction('onPanelOpenChanged', (panelIsOpen: boolean) => {\r\n getPageStore().panelIsOpen = panelIsOpen;\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { onCurrentRouteChanged } from '../actions';\r\nimport { getPageStore } from '../store/store';\r\n\r\nmutator(onCurrentRouteChanged, msg => {\r\n getPageStore().currentRoute = msg.currentRoute;\r\n});\r\n","import { action } from 'satcheljs';\r\nimport { Account, IStringDictionary } from '../../../../../@data';\r\nimport { IAccountViewModel } from '../store/schema';\r\n\r\nexport const onAccountChanged = action('onAccountChanged', (account: IAccountViewModel) => ({ account }));\r\n\r\nexport const onRawChanged = action('onRawChanged', (value?: Account) => ({ value }));\r\n\r\nexport const onAccountErrorChanged = action('onAccountErrorChanged', (values?: IStringDictionary) => ({ values }));\r\n\r\nexport const onFetchAccountsLoading = action('onFetchAccountsLoading', (isLoading: boolean) => ({ isLoading }));\r\n\r\nexport const onFetchingAccountsData = action('onFetchingAccountsData', (isFetchingData: boolean) => ({ isFetchingData }));\r\n\r\nexport const onAccountsFetched = action('onAccountsFetched', (items: Account[]) => ({ items }));\r\n","import { IDropdownOption } from '@fluentui/react';\r\nimport { History } from 'history';\r\nimport { action } from 'satcheljs';\r\nimport { FormState } from '../../../../../components/Form';\r\n\r\nexport const onFormInitialized = action('onFormInitialized', (mode: FormState, publisherId: string, entityId?: string) => ({\r\n mode,\r\n publisherId,\r\n entityId,\r\n}));\r\n\r\nexport const onFormCancelled = action('onFormCancelled');\r\n\r\nexport const onFormCleared = action('onFormCleared');\r\n\r\nexport const onFormSubmitted = action('onFormSubmitted', (mode: FormState, routeHistory?: History) => ({ mode, routeHistory }));\r\n\r\nexport const onAccountIdChanged = action('onAccountIdChanged', (value: number) => ({ value }));\r\n\r\nexport const onAccountSkuFormMediumChanged = action('onAccountSkuFormMediumChanged', (value: IDropdownOption) => ({ value }));\r\n\r\nexport const onAccountSkuFormSkuChanged = action('onAccountSkuFormSkuChanged', (value: IDropdownOption) => ({ value }));\r\n\r\nexport const onAccountSkuFormCleared = action('onAccountSkuFormCleared');\r\n\r\nexport const onAccountSkuFormSubmitted = action('onAccountSkuFormSubmitted', (mode: FormState, accountId: number) => ({ mode, accountId }));\r\n\r\nexport const onFormAccountNameChanged = action('onFormAccountNameChanged', (value?: string) => ({ value }));\r\n\r\nexport const onFormAccountCurrencyChanged = action('onFormAccountCurrencyChanged', (value?: string) => ({ value }));\r\n\r\nexport const onFormAccountLanguageChanged = action('onFormAccountLanguageChanged', (value: IDropdownOption) => ({ value }));\r\n\r\nexport const onFormAccountPrimaryContactChanged = action('onFormAccountPrimaryContactChanged', (value: IDropdownOption) => ({ value }));\r\n\r\nexport const onFormAccountCountryChanged = action('onFormAccountCountryChanged', (value?: IDropdownOption) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormAccountTimezoneChanged = action('onFormAccountTimezoneChanged', (value?: IDropdownOption) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormAccountPaymentOptionChanged = action('onFormAccountPaymentOptionChanged', (value?: IDropdownOption) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormAccountFinancialStatusChanged = action('onFormAccountFinancialStatusChanged', (value?: IDropdownOption) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormAccountPaymentLifeCycleStatusChanged = action(\r\n 'onFormAccountPaymentLifeCycleStatusChanged',\r\n (value?: IDropdownOption) => ({\r\n value,\r\n })\r\n);\r\n\r\nexport const onFormAccountOperationRatioChanged = action('onFormAccountOperationRatioChanged', (value?: string) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormAccountAllowPassedURLChanged = action('onFormAccountAllowPassedURLChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormAccountAllowPassedKeywordChanged = action('onFormAccountAllowPassedKeywordChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormAccountAllowCrawlingChanged = action('onFormAccountAllowCrawlingChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\nexport const onFormAccountAllowAdultAdsChanged = action('onFormAccountAllowAdultAdsChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormAccountAllowGlobalDefaultKeywordsChanged = action(\r\n 'onFormAccountAllowGlobalDefaultKeywordsChanged',\r\n (value?: boolean) => ({\r\n value,\r\n })\r\n);\r\n\r\nexport const onFormAccountAllowMeteredCallExtensionsChanged = action(\r\n 'onFormAccountAllowMeteredCallExtensionsChanged',\r\n (value?: boolean) => ({\r\n value,\r\n })\r\n);\r\n\r\nexport const onFormAccountAllowLocationExtensionsChanged = action('onFormAccountAllowLocationExtensionsChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormAccountAllowPhoneExtensionsChanged = action('onFormAccountAllowPhoneExtensionsChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormAccountAllowMerchantRatingExtensionsChanged = action(\r\n 'onFormAccountAllowMerchantRatingExtensionsChanged',\r\n (value?: boolean) => ({\r\n value,\r\n })\r\n);\r\n\r\nexport const onFormAccountAllowLocalExtensionsChanged = action('onFormAccountAllowLocalExtensionsChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormAccountAllowCallExtensionsChanged = action('onFormAccountAllowCallExtensionsChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormAccountAllowSiteLinkExtensionsChanged = action('onFormAccountAllowSiteLinkExtensionsChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormAccountStoreIdsChanged = action('onFormAccountStoreIdsChanged', (values?: string) => ({ values }));\r\n\r\nexport const onFormAccountPartnerCodesChanged = action('onFormAccountPartnerCodesChanged', (values?: string) => ({ values }));\r\n\r\nexport const onFormAccountFormCodesChanged = action('onFormAccountFormCodesChanged', (values?: string) => ({ values }));\r\n\r\nexport const onFormAccountStartDistributionPlacementCodesChanged = action(\r\n 'onFormAccountStartDistributionPlacementCodesChanged',\r\n (values?: string) => ({ values })\r\n);\r\n\r\nexport const onFormAccountStartDistributionOCIDL2sChanged = action('onFormAccountStartDistributionOCIDL2sChanged', (values?: string) => ({\r\n values,\r\n}));\r\n\r\nexport const onFormAccountStartDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentageChanged = action(\r\n 'onFormAccountStartDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentageChanged',\r\n (value?: string) => ({ value })\r\n);\r\n","import { action } from 'satcheljs';\r\nimport { AccountSKU } from '../../../../../@data';\r\nimport { ISkuSidePanelProps } from '../../Create/CreateAccount.types';\r\nimport { IAccountSkuViewModel } from '../store/schema/IAccountSkuViewModel';\r\n\r\nexport const onAccountSkuSidePanelInitialized = action('onAccountSkuSidePanelInitialized', (value?: ISkuSidePanelProps) => ({ value }));\r\n\r\nexport const onAccountSkuChanged = action('onAccountSkuChanged', (value?: IAccountSkuViewModel) => ({ value }));\r\n\r\nexport const onAccountSkusChanged = action('onAccountSkusChanged', (value?: AccountSKU[]) => {\r\n return { value };\r\n});\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onManagePageInitialized = action('onManagePageInitialized');\r\n","import { createStore } from 'satcheljs';\r\nimport { IAccountViewState } from './schema/IAccountViewState';\r\n\r\nexport const getStore = createStore<IAccountViewState>('AccountState', {\r\n active: {},\r\n errors: {},\r\n enablePrivateMarketplace: false,\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { Account } from '../../../../../@data';\r\nimport { mergeTypeWithObject } from '../../../../../utils';\r\nimport {\r\n onAccountChanged,\r\n onAccountErrorChanged,\r\n onAccountSkuChanged,\r\n onAccountSkusChanged,\r\n onAccountsFetched,\r\n onFetchAccountsLoading,\r\n onFetchingAccountsData,\r\n onRawChanged,\r\n} from '../actions';\r\nimport { getStore } from '../store/store';\r\n\r\nmutator(onAccountChanged, (msg) => {\r\n getStore().active = msg.account;\r\n});\r\n\r\nmutator(onAccountSkuChanged, (msg) => {\r\n getStore().accountSku = msg.value;\r\n});\r\n\r\nmutator(onAccountSkusChanged, (msg) => {\r\n getStore().active.skus = msg.value;\r\n});\r\n\r\nmutator(onRawChanged, (msg) => {\r\n getStore().raw = mergeTypeWithObject(new Account(), msg.value);\r\n});\r\n\r\nmutator(onAccountErrorChanged, (msg) => {\r\n getStore().errors = msg.values || {};\r\n});\r\n\r\nmutator(onFetchAccountsLoading, (msg) => {\r\n getStore().isLoading = msg.isLoading;\r\n});\r\n\r\nmutator(onFetchingAccountsData, (msg) => {\r\n getStore().isFetchingData = msg.isFetchingData;\r\n});\r\n\r\nmutator(onAccountsFetched, (msg) => {\r\n getStore().accounts = msg.items;\r\n});\r\n","export const countryToCurrencyMap = {\r\n AE: 'EUR',\r\n AF: 'USD',\r\n AG: 'XCD',\r\n AL: 'USD',\r\n AM: 'USD',\r\n AO: 'USD',\r\n AR: 'USD',\r\n AT: 'EUR',\r\n AU: 'AUD',\r\n AZ: 'AZN',\r\n BA: 'USD',\r\n BD: 'BDT',\r\n BE: 'EUR',\r\n BF: 'XOF',\r\n BG: 'BGN',\r\n BH: 'BHD',\r\n BI: 'USD',\r\n BJ: 'XOF',\r\n BO: 'USD',\r\n BR: 'USD',\r\n BW: 'BWP',\r\n BY: 'USD',\r\n CA: 'CAD',\r\n CD: 'USD',\r\n CF: 'XAF',\r\n CG: 'XAF',\r\n CH: 'CHF',\r\n CI: 'XOF',\r\n CL: 'CLP',\r\n CM: 'XAF',\r\n CN: 'USD',\r\n CO: 'COP',\r\n CR: 'CRC',\r\n CY: 'EUR',\r\n CZ: 'CZK',\r\n DE: 'EUR',\r\n DK: 'DKK',\r\n DM: 'XCD',\r\n DO: 'DOP',\r\n DZ: 'USD',\r\n EC: 'USD',\r\n EE: 'EUR',\r\n EG: 'EGP',\r\n ER: 'USD',\r\n ES: 'EUR',\r\n ET: 'ETB',\r\n FI: 'EUR',\r\n FJ: 'FJD',\r\n FR: 'EUR',\r\n GB: 'GBP',\r\n GE: 'USD',\r\n GH: 'GHS',\r\n GN: 'USD',\r\n GR: 'EUR',\r\n GT: 'GTQ',\r\n HK: 'HKD',\r\n HN: 'USD',\r\n HR: 'HRK',\r\n HT: 'USD',\r\n HU: 'HUF',\r\n ID: 'IDR',\r\n IE: 'EUR',\r\n IL: 'ILS',\r\n IN: 'INR',\r\n IQ: 'USD',\r\n IS: 'USD',\r\n IT: 'EUR',\r\n JM: 'JMD',\r\n JO: 'JOD',\r\n JP: 'JPY',\r\n KE: 'KES',\r\n KH: 'USD',\r\n KM: 'USD',\r\n KR: 'KRW',\r\n KW: 'KWD',\r\n KZ: 'KZT',\r\n LA: 'USD',\r\n LB: 'LBP',\r\n LI: 'CHF',\r\n LK: 'LKR',\r\n LR: 'USD',\r\n LT: 'EUR',\r\n LU: 'EUR',\r\n LV: 'LVL',\r\n MA: 'MAD',\r\n MC: 'EUR',\r\n ME: 'EUR',\r\n MG: 'USD',\r\n MK: 'USD',\r\n ML: 'XOF',\r\n MN: 'USD',\r\n MT: 'EUR',\r\n MU: 'MUR',\r\n MW: 'MWK',\r\n MX: 'MXN',\r\n MY: 'USD',\r\n MZ: 'USD',\r\n NE: 'XOF',\r\n NG: 'NGN',\r\n NI: 'USD',\r\n NL: 'EUR',\r\n NO: 'NOK',\r\n NP: 'USD',\r\n NZ: 'NZD',\r\n OM: 'OMR',\r\n PA: 'USD',\r\n PE: 'PEN',\r\n PH: 'PHP',\r\n PK: 'PKR',\r\n PL: 'PLN',\r\n PT: 'EUR',\r\n PY: 'USD',\r\n QA: 'QAR',\r\n RO: 'USD',\r\n RS: 'USD',\r\n RU: 'RUB',\r\n RW: 'RWF',\r\n SA: 'SAR',\r\n SE: 'SEK',\r\n SG: 'SGD',\r\n SI: 'EUR',\r\n SK: 'EUR',\r\n SL: 'USD',\r\n SN: 'XOF',\r\n SO: 'USD',\r\n SV: 'USD',\r\n TD: 'XAF',\r\n TG: 'XOF',\r\n TH: 'THB',\r\n TJ: 'USD',\r\n TL: 'USD',\r\n TM: 'USD',\r\n TN: 'TND',\r\n TO: 'TOP',\r\n TR: 'TRY',\r\n TT: 'TTD',\r\n TW: 'TWD',\r\n TZ: 'TZS',\r\n UA: 'USD',\r\n UG: 'UGX',\r\n US: 'USD',\r\n UY: 'UYU',\r\n UZ: 'USD',\r\n VC: 'XCD',\r\n VE: 'USD',\r\n VN: 'VND',\r\n ZA: 'ZAR',\r\n ZM: 'ZMW',\r\n ZW: 'USD'\r\n};\r\n","import { mutator } from 'satcheljs';\r\nimport { MediaType, PaymentInstrumentLifeCycleStatus, PaymentOption } from '../../../../../@data';\r\nimport { FinancialStatus } from '../../../../../@data/store/schema/enums/FinancialStatus';\r\nimport { countryToCurrencyMap } from '../../../../../config/countryToCurrencyMapper.config';\r\nimport {\r\n onAccountIdChanged,\r\n onAccountSkuFormCleared,\r\n onAccountSkuFormMediumChanged,\r\n onAccountSkuFormSkuChanged,\r\n onFormAccountAllowAdultAdsChanged,\r\n onFormAccountAllowCallExtensionsChanged,\r\n onFormAccountAllowCrawlingChanged,\r\n onFormAccountAllowGlobalDefaultKeywordsChanged,\r\n onFormAccountAllowLocalExtensionsChanged,\r\n onFormAccountAllowLocationExtensionsChanged,\r\n onFormAccountAllowMerchantRatingExtensionsChanged,\r\n onFormAccountAllowMeteredCallExtensionsChanged,\r\n onFormAccountAllowPassedKeywordChanged,\r\n onFormAccountAllowPassedURLChanged,\r\n onFormAccountAllowPhoneExtensionsChanged,\r\n onFormAccountAllowSiteLinkExtensionsChanged,\r\n onFormAccountCountryChanged,\r\n onFormAccountCurrencyChanged,\r\n onFormAccountFinancialStatusChanged,\r\n onFormAccountFormCodesChanged,\r\n onFormAccountLanguageChanged,\r\n onFormAccountNameChanged,\r\n onFormAccountOperationRatioChanged,\r\n onFormAccountPartnerCodesChanged,\r\n onFormAccountPaymentLifeCycleStatusChanged,\r\n onFormAccountPaymentOptionChanged,\r\n onFormAccountPrimaryContactChanged,\r\n onFormAccountStartDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentageChanged,\r\n onFormAccountStartDistributionOCIDL2sChanged,\r\n onFormAccountStartDistributionPlacementCodesChanged,\r\n onFormAccountStoreIdsChanged,\r\n onFormAccountTimezoneChanged,\r\n onFormCleared,\r\n} from '../actions';\r\nimport { getStore } from '../store/store';\r\n\r\nmutator(onAccountIdChanged, (msg) => {\r\n getStore().active.id = msg.value;\r\n});\r\n\r\nmutator(onFormAccountNameChanged, (msg) => {\r\n getStore().active.name = msg.value;\r\n});\r\n\r\nmutator(onFormAccountCurrencyChanged, (msg) => {\r\n const countyCode = getStore().active.countryCode!;\r\n getStore().active.currencyCode = countryToCurrencyMap[countyCode];\r\n});\r\n\r\nmutator(onFormCleared, () => {\r\n getStore().active = {};\r\n});\r\n\r\nmutator(onAccountSkuFormMediumChanged, (msg) => {\r\n getStore().accountSku!.medium = msg.value.key as MediaType;\r\n});\r\n\r\nmutator(onAccountSkuFormSkuChanged, (msg) => {\r\n getStore().accountSku!.sku = msg.value.key as string;\r\n});\r\n\r\nmutator(onAccountSkuFormCleared, () => {\r\n getStore().accountSku = undefined;\r\n});\r\n\r\nmutator(onFormAccountCountryChanged, (msg) => {\r\n getStore().active.countryCode = msg.value!!.key as string;\r\n});\r\n\r\nmutator(onFormAccountLanguageChanged, (msg) => {\r\n getStore().active.languageCode = msg.value.key as string;\r\n});\r\n\r\nmutator(onFormAccountPrimaryContactChanged, (msg) => {\r\n getStore().active.primaryContactUserId = msg.value.key as number;\r\n});\r\n\r\nmutator(onFormAccountTimezoneChanged, (msg) => {\r\n getStore().active.timeZoneId = msg.value!!.key as number;\r\n});\r\n\r\nmutator(onFormAccountPaymentOptionChanged, (msg) => {\r\n getStore().active.paymentOption = msg.value!!.key as PaymentOption;\r\n});\r\n\r\nmutator(onFormAccountFinancialStatusChanged, (msg) => {\r\n getStore().active.financialStatus = msg.value!!.key as FinancialStatus;\r\n});\r\n\r\nmutator(onFormAccountPaymentLifeCycleStatusChanged, (msg) => {\r\n getStore().active.paymentLifeCycleStatus = msg.value!!.key as PaymentInstrumentLifeCycleStatus;\r\n});\r\n\r\nmutator(onFormAccountOperationRatioChanged, (msg) => {\r\n getStore().active.operationRatio = Number(msg.value as string);\r\n});\r\n\r\nmutator(onFormAccountAllowPassedURLChanged, (msg) => {\r\n getStore().active.allowPassedURL = msg.value;\r\n});\r\n\r\nmutator(onFormAccountAllowPassedKeywordChanged, (msg) => {\r\n getStore().active.allowPassedKeyword = msg.value;\r\n});\r\n\r\nmutator(onFormAccountAllowCrawlingChanged, (msg) => {\r\n getStore().active.allowCrawling = msg.value;\r\n});\r\n\r\nmutator(onFormAccountAllowAdultAdsChanged, (msg) => {\r\n getStore().active.allowAdultAds = msg.value;\r\n});\r\n\r\nmutator(onFormAccountAllowGlobalDefaultKeywordsChanged, (msg) => {\r\n getStore().active.allowGlobalDefaultKeywords = msg.value;\r\n});\r\n\r\nmutator(onFormAccountAllowMeteredCallExtensionsChanged, (msg) => {\r\n getStore().active.allowMeteredCallExtensions = msg.value;\r\n});\r\n\r\nmutator(onFormAccountAllowLocationExtensionsChanged, (msg) => {\r\n getStore().active.allowLocationExtensions = msg.value;\r\n});\r\n\r\nmutator(onFormAccountAllowPhoneExtensionsChanged, (msg) => {\r\n getStore().active.allowPhoneExtensions = msg.value;\r\n});\r\n\r\nmutator(onFormAccountAllowMerchantRatingExtensionsChanged, (msg) => {\r\n getStore().active.allowMerchantRatingExtensions = msg.value;\r\n});\r\n\r\nmutator(onFormAccountAllowLocalExtensionsChanged, (msg) => {\r\n getStore().active.allowLocalExtensions = msg.value;\r\n});\r\n\r\nmutator(onFormAccountAllowCallExtensionsChanged, (msg) => {\r\n getStore().active.allowCallExtensions = msg.value;\r\n});\r\n\r\nmutator(onFormAccountAllowSiteLinkExtensionsChanged, (msg) => {\r\n getStore().active.allowSiteLinkExtensions = msg.value;\r\n});\r\n\r\nmutator(onFormAccountStoreIdsChanged, (msg) => {\r\n getStore().active.storeIds = msg.values;\r\n});\r\n\r\nmutator(onFormAccountPartnerCodesChanged, (msg) => {\r\n getStore().active.partnerCodes = msg.values;\r\n});\r\n\r\nmutator(onFormAccountFormCodesChanged, (msg) => {\r\n getStore().active.formCodes = msg.values;\r\n});\r\n\r\nmutator(onFormAccountStartDistributionPlacementCodesChanged, (msg) => {\r\n getStore().active.startDistributionPlacementCodes = msg.values;\r\n});\r\n\r\nmutator(onFormAccountStartDistributionOCIDL2sChanged, (msg) => {\r\n getStore().active.startDistributionOCIDL2s = msg.values;\r\n});\r\n\r\nmutator(onFormAccountStartDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentageChanged, (msg) => {\r\n getStore().active.startDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentage =\r\n msg.value !== null && msg.value !== undefined ? (isNaN(parseFloat(msg.value)) ? undefined : parseFloat(msg.value)) : undefined;\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { AccountSKU, getAppStore, onNotificationChanged, onSavingChanged, postEntity, putEntity } from '../../../../../@data';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport { onAccountSkuFormCleared, onAccountSkuFormSubmitted, onAccountSkusChanged } from '../actions';\r\nimport { fetchAllMediumAccountSkus } from '../services/AccountService';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onAccountSkuFormSubmitted, async (msg) => {\r\n const { publisher, userContext } = getAppStore();\r\n const { accountSku } = getStore();\r\n\r\n let notification: INotificationBarItem = {};\r\n\r\n if (publisher && accountSku) {\r\n const body: AccountSKU = {\r\n accountId: accountSku.accountId || msg.accountId,\r\n medium: accountSku.medium!,\r\n sku: accountSku.sku!,\r\n apiPath: undefined,\r\n className: 'accountSku',\r\n };\r\n\r\n onSavingChanged(true);\r\n\r\n try {\r\n if (msg.mode === FormState.InPageEdit) {\r\n await putEntity([publisher], body, userContext, AccountSKU);\r\n notification = {\r\n text: `Edited account SKU mapping ${accountSku.accountId} success`,\r\n messageBarType: MessageBarType.success,\r\n };\r\n } else if (msg.mode === FormState.InPageCreate) {\r\n await postEntity([publisher], AccountSKU, body, userContext);\r\n\r\n notification = {\r\n text: `Created new account SKU mapping ${msg.accountId} success`,\r\n messageBarType: MessageBarType.success,\r\n };\r\n }\r\n const accountSkus = await fetchAllMediumAccountSkus(publisher, String(body.accountId), userContext);\r\n onAccountSkusChanged(accountSkus.mediumMappedSkus);\r\n onAccountSkuFormCleared();\r\n } catch (e) {\r\n notification = {\r\n text: `Submitting the account SKU mapping form \"${FormState[msg.mode]}\" caught an error \"${e}\"`,\r\n messageBarType: MessageBarType.error,\r\n };\r\n } finally {\r\n onSavingChanged(false);\r\n }\r\n } else {\r\n notification = {\r\n text: `Account SKU mapping \"${FormState[msg.mode]}\" is invalid.`,\r\n messageBarType: MessageBarType.warning,\r\n };\r\n }\r\n onNotificationChanged(notification);\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { onLoadingChanged } from '../../../../../@data';\r\nimport { getSupportedAccountSkus } from '../../../../../@data/services/MetadataService';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { onPanelOpenChanged } from '../../../@data/actions';\r\nimport { onAccountSkuChanged, onAccountSkuSidePanelInitialized } from '../actions';\r\nimport { IAccountSkuViewModel } from '../store/schema/IAccountSkuViewModel';\r\n\r\norchestrator(onAccountSkuSidePanelInitialized, async (msg) => {\r\n const panelProps = msg.value;\r\n\r\n if (panelProps) {\r\n onLoadingChanged(true);\r\n const accountSku: IAccountSkuViewModel = {};\r\n if (panelProps.mode === FormState.InPageEdit) {\r\n if (panelProps.selectedAccountSku) {\r\n accountSku.accountId = panelProps.selectedAccountSku.accountId;\r\n accountSku.medium = panelProps.selectedAccountSku.medium;\r\n accountSku.sku = panelProps.selectedAccountSku.sku;\r\n accountSku.listOfMediums = [panelProps.selectedAccountSku.medium.toString()];\r\n }\r\n } else {\r\n accountSku.listOfMediums = panelProps.nonSKUMappedMediums;\r\n }\r\n\r\n accountSku.availableSkus = await getSupportedAccountSkus();\r\n\r\n onAccountSkuChanged(accountSku);\r\n onLoadingChanged(false);\r\n onPanelOpenChanged(true);\r\n } else {\r\n // error handling\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { onFormCancelled, onFormCleared } from '../actions';\r\n\r\norchestrator(onFormCancelled, async () => {\r\n onFormCleared();\r\n});","export enum AdExtensionType {\r\n SiteLink = 'SiteLink',\r\n Phone = 'Phone',\r\n Local = 'Local',\r\n Location = 'Location',\r\n Call = 'Call',\r\n MeteredCall = 'MeteredCall',\r\n MerchantRatings = 'MerchantRatings'\r\n}\r\n","export enum FinancialStatus {\r\n // Proposed = 'Proposed',\r\n // PendingCreditCheck = 'PendingCreditCheck',\r\n NoHold = 'NoHold',\r\n Hold = 'Hold',\r\n // SoldToOnly = 'SoldToOnly',\r\n // CreditHold = 'CreditHold',\r\n // CreditWarning = 'CreditWarning',\r\n TaxOnHold = 'TaxOnHold',\r\n UserHold = 'UserHold'\r\n // WriteOff = 'WriteOff'\r\n}\r\n","import { IChoiceGroupOption } from '@fluentui/react';\r\nimport { mutatorAction } from 'satcheljs';\r\nimport { PrivateMarketplace } from '../../../../../@data';\r\nimport { getStore } from '../store/store';\r\n\r\nexport const onAccountPrivateMarketplaceChanged = mutatorAction(\r\n 'onAccountPrivateMarketplaceChanged',\r\n (privateMarketplace: IChoiceGroupOption) => {\r\n getStore().privateMarketplace = privateMarketplace.key as PrivateMarketplace;\r\n getStore().enablePrivateMarketplace = true;\r\n }\r\n);\r\n\r\nexport const onAccountEnablePrivateMarketplaceChanged = mutatorAction(\r\n 'onAccountEnablePrivateMarketplaceChanged',\r\n (enablePrivateMarketplace: boolean) => {\r\n getStore().enablePrivateMarketplace = enablePrivateMarketplace;\r\n }\r\n);\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport {\r\n getAppStore,\r\n getEntity,\r\n LifeCycleStatus,\r\n onLoadingChanged,\r\n onLoadingSetting,\r\n onLoadingWaiting,\r\n onNotificationChanged,\r\n PaymentInstrumentLifeCycleStatus,\r\n PaymentOption,\r\n Publisher,\r\n} from '../../../../../@data';\r\nimport { getSupportedCountries, getSupportedLanguages, getSupportedTimezones } from '../../../../../@data/services/MetadataService';\r\nimport { AccountProfileFeature } from '../../../../../@data/store/schema/enums/AccountProfileFeature';\r\nimport { AdExtensionType } from '../../../../../@data/store/schema/enums/AdExtensionType';\r\nimport { FinancialStatus } from '../../../../../@data/store/schema/enums/FinancialStatus';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { countryToCurrencyMap } from '../../../../../config/countryToCurrencyMapper.config';\r\nimport { setPublisherContext } from '../../../@data/service/PartnerManagementService';\r\nimport { onAccountChanged, onFormInitialized, onRawChanged } from '../actions';\r\nimport { onAccountEnablePrivateMarketplaceChanged } from '../mutatorActions';\r\nimport { fetchAccountById, fetchAllAvailableUsers, fetchAllMediumAccountSkus } from '../services/AccountService';\r\nimport { IAccountViewModel } from '../store/schema';\r\n\r\norchestrator(onFormInitialized, async (msg) => {\r\n const { userContext } = getAppStore();\r\n try {\r\n const publisherId = parseInt(msg.publisherId, 10);\r\n if (!isNaN(publisherId)) {\r\n const publisher = new Publisher(publisherId);\r\n const account: IAccountViewModel = {};\r\n setPublisherContext(publisher);\r\n onLoadingChanged(true);\r\n onLoadingSetting(false);\r\n const timeout = 30000;\r\n const id = setTimeout(() => onLoadingWaiting(true), timeout);\r\n\r\n const rawPublisher = await getEntity<Publisher>([publisher], userContext);\r\n account.availableLanguages = await getSupportedLanguages();\r\n account.availableTimezones = await getSupportedTimezones();\r\n account.availableCountries = await getSupportedCountries(rawPublisher.serviceLevel!);\r\n account.availableUsers = await fetchAllAvailableUsers(publisher, userContext);\r\n account.isDistributionReportingApplicable = rawPublisher.allowDistributionReporting || rawPublisher.allowDistributionV2Reporting;\r\n clearTimeout(id);\r\n account.isStartDistributionReportingApplicable = rawPublisher.allowStartDistributionReporting;\r\n account.isStartDistributionContentReportingApplicable = rawPublisher.allowStartDistributionContentReporting;\r\n\r\n account.primaryContactUserId = account.availableUsers && account.availableUsers.length > 0 ? account.availableUsers[0].id : undefined;\r\n account.languageCode = account.availableLanguages && account.availableLanguages.length > 0 ? 'EN' : undefined;\r\n account.countryCode = account.availableCountries && account.availableCountries.length > 0 ? 'US' : undefined;\r\n account.currencyCode = account.countryCode && countryToCurrencyMap[account.countryCode];\r\n account.timeZoneId = account.availableTimezones && account.availableTimezones.length > 0 ? 75 : undefined;\r\n\r\n account.status = LifeCycleStatus.Active;\r\n account.paymentOption = PaymentOption.MonthlyThreshold;\r\n account.financialStatus = FinancialStatus.TaxOnHold;\r\n account.paymentLifeCycleStatus = PaymentInstrumentLifeCycleStatus.Validated;\r\n account.revenueSharePercentage = 100;\r\n account.operationRatio = 0;\r\n account.allowGlobalDefaultKeywords = true;\r\n account.allowPassedKeyword = true;\r\n account.allowCallExtensions = true;\r\n account.allowSiteLinkExtensions = true;\r\n account.allowLocationExtensions = true;\r\n account.allowMeteredCallExtensions = true;\r\n account.allowMerchantRatingExtensions = true;\r\n\r\n if (msg.mode === FormState.Edit && msg.entityId) {\r\n const rawaccount = await fetchAccountById(publisher, msg.entityId, userContext);\r\n const accountSkuInfo = await fetchAllMediumAccountSkus(publisher, msg.entityId, userContext);\r\n\r\n account.id = rawaccount.id;\r\n account.name = String(rawaccount.name);\r\n account.number = rawaccount.number;\r\n account.primaryContactUserId = rawaccount.primaryContactUserId;\r\n account.status = rawaccount.status;\r\n account.countryCode = rawaccount.countryCode;\r\n account.languageCode = rawaccount.languageCode;\r\n account.currencyCode = rawaccount.currencyCode;\r\n account.timeZoneId = rawaccount.timeZoneId;\r\n account.adDeliverySettings = rawaccount.adDeliverySettings;\r\n account.additionalMarkets = rawaccount.additionalMarkets;\r\n\r\n if (rawaccount.paymentInformation) {\r\n account.financialStatus = rawaccount.paymentInformation.financialStatus;\r\n account.paymentLifeCycleStatus = rawaccount.paymentInformation.paymentInstrumentationLifeCycleStatus;\r\n account.paymentOption = rawaccount.paymentInformation.paymentOption;\r\n account.operationRatio = rawaccount.paymentInformation.operationCostRatio;\r\n account.revenueSharePercentage = rawaccount.paymentInformation.revenueSharePercentage;\r\n }\r\n\r\n if (rawaccount.enabledFeatures) {\r\n account.allowGlobalDefaultKeywords = rawaccount.enabledFeatures.some(\r\n (enFeature) => enFeature === AccountProfileFeature.EnableGlobalDefaultKeywords\r\n );\r\n account.allowAdultAds = rawaccount.enabledFeatures.some((enFeature) => enFeature === AccountProfileFeature.EnableAdultAds);\r\n account.allowCrawling = rawaccount.enabledFeatures.some((enFeature) => enFeature === AccountProfileFeature.EnableCrawling);\r\n account.allowPassedURL = rawaccount.enabledFeatures.some((enFeature) => enFeature === AccountProfileFeature.EnablePassedUrls);\r\n account.allowPassedKeyword = rawaccount.enabledFeatures.some(\r\n (enFeature) => enFeature === AccountProfileFeature.EnablePassedKeywords\r\n );\r\n }\r\n\r\n if (rawaccount.adExtensionOptions) {\r\n account.allowSiteLinkExtensions = rawaccount.adExtensionOptions.some(\r\n (adExtension) => adExtension.type === AdExtensionType.SiteLink && adExtension.enabled === true\r\n );\r\n account.allowPhoneExtensions = rawaccount.adExtensionOptions.some(\r\n (adExtension) => adExtension.type === AdExtensionType.Phone && adExtension.enabled === true\r\n );\r\n account.allowLocalExtensions = rawaccount.adExtensionOptions.some(\r\n (adExtension) => adExtension.type === AdExtensionType.Local && adExtension.enabled === true\r\n );\r\n account.allowLocationExtensions = rawaccount.adExtensionOptions.some(\r\n (adExtension) => adExtension.type === AdExtensionType.Location && adExtension.enabled === true\r\n );\r\n account.allowMeteredCallExtensions = rawaccount.adExtensionOptions.some(\r\n (adExtension) => adExtension.type === AdExtensionType.MeteredCall && adExtension.enabled === true\r\n );\r\n account.allowMerchantRatingExtensions = rawaccount.adExtensionOptions.some(\r\n (adExtension) => adExtension.type === AdExtensionType.MerchantRatings && adExtension.enabled === true\r\n );\r\n account.allowCallExtensions = rawaccount.adExtensionOptions.some(\r\n (adExtension) => adExtension.type === AdExtensionType.Call && adExtension.enabled === true\r\n );\r\n }\r\n\r\n if (rawaccount.storeIds && rawaccount.storeIds.length > 0) {\r\n account.storeIds = rawaccount.storeIds.join('\\n');\r\n }\r\n if (rawaccount.partnerCodes && rawaccount.partnerCodes.length > 0) {\r\n account.partnerCodes = rawaccount.partnerCodes.join('\\n');\r\n }\r\n if (rawaccount.formCodes && rawaccount.formCodes.length > 0) {\r\n account.formCodes = rawaccount.formCodes.join('\\n');\r\n }\r\n if (rawaccount.startDistributionPlacementCodes && rawaccount.startDistributionPlacementCodes.length > 0) {\r\n account.startDistributionPlacementCodes = rawaccount.startDistributionPlacementCodes.join('\\n');\r\n }\r\n if (rawaccount.startDistributionOCIDL2s && rawaccount.startDistributionOCIDL2s.length > 0) {\r\n account.startDistributionOCIDL2s = rawaccount.startDistributionOCIDL2s.join('\\n');\r\n }\r\n account.startDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentage =\r\n rawaccount.startDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentage;\r\n account.skus = accountSkuInfo.mediumMappedSkus;\r\n account.nonSKUMappedMediums = accountSkuInfo.nonMappedMediums;\r\n\r\n const privateMarketplace = rawaccount.storeIds && rawaccount.storeIds.length !== 0 ? rawaccount.storeIds.length !== 0 : false;\r\n onAccountEnablePrivateMarketplaceChanged(privateMarketplace);\r\n\r\n onRawChanged(rawaccount);\r\n } else {\r\n onRawChanged();\r\n }\r\n\r\n onAccountChanged(account);\r\n } else {\r\n onNotificationChanged({\r\n text: `You have arrived in an invalid state, please report.`,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n } catch (e) {\r\n onNotificationChanged({\r\n text: 'Failed to load entity',\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport {\r\n Account,\r\n AccountProfileFeature,\r\n getAppStore,\r\n onNavigateBack,\r\n onNotificationChanged,\r\n onSavingChanged,\r\n postEntity,\r\n putEntity,\r\n} from '../../../../../@data';\r\nimport { AdExtensionType } from '../../../../../@data/store/schema/enums/AdExtensionType';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport { validateSchema } from '../../../../../utils';\r\nimport { RouteName } from '../../../@data';\r\nimport { createReturnUrl } from '../../../@data/service/PartnerManagementService';\r\nimport { onAccountErrorChanged, onAccountIdChanged, onFormCleared, onFormSubmitted } from '../actions';\r\nimport { accountErrorModel } from '../store/schema/AccountErrorModel';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onFormSubmitted, async (msg) => {\r\n const { publisher, userContext } = getAppStore();\r\n const { active, raw } = getStore();\r\n\r\n let notification: INotificationBarItem = {};\r\n\r\n if (publisher) {\r\n const body: Account = {\r\n ...raw,\r\n id: active.id,\r\n name: active.name,\r\n apiPath: undefined,\r\n className: 'accounts',\r\n };\r\n\r\n try {\r\n await validateSchema(accountErrorModel(), active);\r\n onAccountErrorChanged();\r\n } catch (e) {\r\n onAccountErrorChanged(e);\r\n onNotificationChanged({\r\n text: `Account - You have ${Object.keys(e).length} errors in the form, please fix them to continue.`,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n return;\r\n }\r\n\r\n onSavingChanged(true);\r\n body.status = active.status;\r\n body.countryCode = active.countryCode;\r\n body.primaryContactUserId = active.primaryContactUserId;\r\n body.currencyCode = active.currencyCode;\r\n body.languageCode = active.languageCode;\r\n body.adDeliverySettings = active.adDeliverySettings;\r\n body.additionalMarkets = active.additionalMarkets;\r\n\r\n body.timeZoneId = active.timeZoneId;\r\n body.adExtensionOptions = [];\r\n\r\n if (active.allowCallExtensions) {\r\n body.adExtensionOptions.push({\r\n type: AdExtensionType.Call,\r\n enabled: active.allowCallExtensions,\r\n });\r\n }\r\n\r\n if (active.allowSiteLinkExtensions) {\r\n body.adExtensionOptions.push({\r\n type: AdExtensionType.SiteLink,\r\n enabled: active.allowSiteLinkExtensions,\r\n });\r\n }\r\n\r\n if (active.allowPhoneExtensions) {\r\n body.adExtensionOptions.push({\r\n type: AdExtensionType.Phone,\r\n enabled: active.allowPhoneExtensions,\r\n });\r\n }\r\n\r\n if (active.allowLocalExtensions) {\r\n body.adExtensionOptions.push({\r\n type: AdExtensionType.Local,\r\n enabled: active.allowLocalExtensions,\r\n });\r\n }\r\n\r\n if (active.allowLocationExtensions) {\r\n body.adExtensionOptions.push({\r\n type: AdExtensionType.Location,\r\n enabled: active.allowLocationExtensions,\r\n });\r\n }\r\n\r\n if (active.allowMeteredCallExtensions) {\r\n body.adExtensionOptions.push({\r\n type: AdExtensionType.MeteredCall,\r\n enabled: active.allowMeteredCallExtensions,\r\n });\r\n }\r\n\r\n if (active.allowMerchantRatingExtensions) {\r\n body.adExtensionOptions.push({\r\n type: AdExtensionType.MerchantRatings,\r\n enabled: active.allowMerchantRatingExtensions,\r\n });\r\n }\r\n\r\n body.enabledFeatures = [];\r\n if (active.allowGlobalDefaultKeywords) {\r\n body.enabledFeatures.push(AccountProfileFeature.EnableGlobalDefaultKeywords);\r\n }\r\n if (active.allowAdultAds) {\r\n body.enabledFeatures.push(AccountProfileFeature.EnableAdultAds);\r\n }\r\n if (active.allowCrawling) {\r\n body.enabledFeatures.push(AccountProfileFeature.EnableCrawling);\r\n }\r\n if (active.allowPassedURL) {\r\n body.enabledFeatures.push(AccountProfileFeature.EnablePassedUrls);\r\n }\r\n if (active.allowPassedKeyword) {\r\n body.enabledFeatures.push(AccountProfileFeature.EnablePassedKeywords);\r\n }\r\n\r\n body.paymentInformation = {\r\n financialStatus: active.financialStatus!,\r\n paymentOption: active.paymentOption!,\r\n paymentInstrumentationLifeCycleStatus: active.paymentLifeCycleStatus!,\r\n operationCostRatio: active.operationRatio!,\r\n revenueSharePercentage: active.revenueSharePercentage!,\r\n };\r\n\r\n body.storeIds = active.storeIds\r\n ? active.storeIds\r\n .split('\\n')\r\n .filter((i) => i !== '' && i !== '\\r')\r\n .map((id) => +id)\r\n : [];\r\n\r\n body.partnerCodes = active.partnerCodes\r\n ? active.partnerCodes\r\n .split('\\n')\r\n .filter((i) => i !== '' && i !== '\\r')\r\n .map((code) => code.trim())\r\n : [];\r\n\r\n body.formCodes = active.formCodes\r\n ? active.formCodes\r\n .split('\\n')\r\n .filter((i) => i !== '' && i !== '\\r')\r\n .map((code) => code.trim())\r\n : [];\r\n\r\n body.startDistributionPlacementCodes = active.startDistributionPlacementCodes\r\n ? active.startDistributionPlacementCodes\r\n .split('\\n')\r\n .filter((i) => i !== '' && i !== '\\r')\r\n .map((code) => code.trim())\r\n : [];\r\n\r\n body.startDistributionOCIDL2s = active.startDistributionOCIDL2s\r\n ? active.startDistributionOCIDL2s\r\n .split('\\n')\r\n .filter((i) => i !== '' && i !== '\\r')\r\n .map((code) => code.trim())\r\n : [];\r\n\r\n body.startDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentage =\r\n active.startDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentage;\r\n\r\n try {\r\n let entity: Account | undefined;\r\n\r\n if (msg.mode === FormState.Edit) {\r\n const account = new Account(active.id);\r\n entity = await putEntity([publisher, account], body, userContext);\r\n notification = {\r\n text: `Edited account ${entity.id} success`,\r\n messageBarType: MessageBarType.success,\r\n };\r\n } else {\r\n entity = await postEntity([publisher], Account, body, userContext);\r\n\r\n if (entity && entity.id) {\r\n onAccountIdChanged(entity.id);\r\n }\r\n notification = {\r\n text: `Created new account ${entity.id} success`,\r\n messageBarType: MessageBarType.success,\r\n };\r\n }\r\n\r\n // return to manage page\r\n const returnUrl = createReturnUrl(RouteName.account, String(publisher.id));\r\n onNavigateBack(msg.routeHistory, returnUrl);\r\n onFormCleared();\r\n } catch (e) {\r\n notification = {\r\n text: `Submitting the account form \"${FormState[msg.mode]}\" caught an error \"${e}\"`,\r\n messageBarType: MessageBarType.error,\r\n };\r\n } finally {\r\n onSavingChanged(false);\r\n }\r\n } else {\r\n notification = {\r\n text: `Account form \"${FormState[msg.mode]}\" is invalid id ${active.id}`,\r\n messageBarType: MessageBarType.warning,\r\n };\r\n }\r\n onNotificationChanged(notification);\r\n});\r\n","import { number, object, string } from 'yup';\r\nimport { IAccountViewModel } from '.';\r\nimport { StringListSchemaYupType } from '../../../../../../utils/validation';\r\n\r\nexport function accountErrorModel() {\r\n return object<IAccountViewModel>().shape({\r\n name: string().trim().required(),\r\n storeIds: new StringListSchemaYupType().of(number().integer()),\r\n partnerCodes: new StringListSchemaYupType().of(string()),\r\n formCodes: new StringListSchemaYupType().of(string()),\r\n startDistributionPlacementCodes: new StringListSchemaYupType().of(string()),\r\n startDistributionOCIDL2s: new StringListSchemaYupType().of(string()),\r\n operationRatio: number().integer(),\r\n revenueSharePercentage: number().integer(),\r\n startDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentage: number().max(100.0).min(0.0)\r\n .when(\"startDistributionPlacementCodes\", (placementCodes, schema) => {\r\n // Revenue share % is only required when placement codes are selected.\r\n if (placementCodes !== null && placementCodes !== undefined && placementCodes.length > 0) {\r\n return schema.required();\r\n } else {\r\n return schema;\r\n }}),\r\n });\r\n}\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { Account, getAppStore, listEntity, onNotificationChanged } from '../../../../../@data';\r\nimport { onAccountsFetched, onFetchAccountsLoading, onFetchingAccountsData } from '../actions';\r\nimport { onManagePageInitialized } from '../actions/onManagePageInitialized';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onManagePageInitialized, async () => {\r\n try {\r\n const { publisher, userContext } = getAppStore();\r\n const accounts = getStore().accounts;\r\n\r\n if (publisher) {\r\n if (accounts === undefined || accounts.length === 0) {\r\n onFetchAccountsLoading(true);\r\n }\r\n onFetchingAccountsData(true);\r\n\r\n const params = new URLSearchParams([['details', 'true']]);\r\n const data = await listEntity([publisher], userContext, Account, params);\r\n data.map((account) => {\r\n const item = account as Account;\r\n if (!!item.createdDateTime) {\r\n item.createdDateTime = new Date(item.createdDateTime).toISOString();\r\n }\r\n return item;\r\n });\r\n onAccountsFetched(data);\r\n }\r\n } catch (error) {\r\n Log.error(error);\r\n onNotificationChanged({ messageBarType: MessageBarType.error, text: 'Failed to load accounts' });\r\n } finally {\r\n onFetchAccountsLoading(false);\r\n onFetchingAccountsData(false);\r\n }\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n PaidSearch: { id: 'app.MediaType.PaidSearch', defaultMessage: 'Paid Search' },\r\n MobilePaidSearch: { id: 'app.MediaType.MobilePaidSearch', defaultMessage: 'Mobile Paid Search' },\r\n Native: { id: 'app.MediaType.Native', defaultMessage: 'Native' },\r\n AudienceAds: { id: 'app.MediaType.AudienceAds', defaultMessage: 'Audience Ads' },\r\n LinkedInAds: { id: 'app.MediaType.LinkedInAds', defaultMessage: 'LinkedIn Ads' },\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n createPageTitle: {\r\n id: 'partnermanagement.account.createPageTitle',\r\n defaultMessage: 'Create Account',\r\n },\r\n editPageTitle: {\r\n id: 'partnermanagement.account.editPageTitle',\r\n defaultMessage: 'Edit Account',\r\n },\r\n updateAccount: {\r\n id: 'partnermanagement.account.updateAccount',\r\n defaultMessage: 'Update Account',\r\n },\r\n accountName: {\r\n id: 'partnermanagement.account.accountName',\r\n defaultMessage: 'Account name',\r\n },\r\n primaryContact: {\r\n id: 'partnermanagement.account.primaryContact',\r\n defaultMessage: 'Primary Contact',\r\n },\r\n publisherName: {\r\n id: 'partnermanagement.account.publisherName',\r\n defaultMessage: 'Publisher name',\r\n },\r\n accountNumber: {\r\n id: 'partnermanagement.account.accountNumber',\r\n defaultMessage: 'Account Number',\r\n },\r\n accountContentDeliverySetting: {\r\n id: 'partnermanagement.account.accountContentDeliverySetting',\r\n defaultMessage: 'Account content delivery setting',\r\n },\r\n accountContentDeliverySettingInfo: {\r\n id: 'partnermanagement.account.accountContentDeliverySettingInfo',\r\n defaultMessage: 'These content delivery settings will be applied to all ad types for this account.',\r\n },\r\n adCountryPolicy: {\r\n id: 'partnermanagement.account.adCountryPolicy',\r\n defaultMessage: 'Ad country/region policy',\r\n },\r\n adLanguage: {\r\n id: 'partnermanagement.account.adLanguage',\r\n defaultMessage: 'Ad Language',\r\n },\r\n accountContentSettingType: {\r\n id: 'partnermanagement.account.accountContentSettingType',\r\n defaultMessage: 'Setting type',\r\n },\r\n accountContentSettingTypeSimple: {\r\n id: 'partnermanagement.account.accountContentSettingTypeSimple',\r\n defaultMessage: 'Simple settings',\r\n },\r\n accountContentSettingTypeAdvanced: {\r\n id: 'partnermanagement.account.accountContentSettingTypeAdvanced',\r\n defaultMessage: 'Advanced settings',\r\n },\r\n allowedMarketsTitle: {\r\n id: 'partnermanagement.account.allowedMarketsTitle',\r\n defaultMessage: 'Allowed markets',\r\n },\r\n allowedMarketsOptionAll: {\r\n id: 'partnermanagement.account.allowedMarketsOptionAll',\r\n defaultMessage: 'Managed at account level',\r\n },\r\n skuTitle: {\r\n id: 'partnermanagement.account.skuTitle',\r\n defaultMessage: 'SKUs',\r\n },\r\n createSku: {\r\n id: 'partnermanagement.account.createSku',\r\n defaultMessage: 'Create SKU Mapping',\r\n },\r\n editSku: {\r\n id: 'partnermanagement.account.editSku',\r\n defaultMessage: 'Edit SKU Mapping',\r\n },\r\n skuCategory: {\r\n id: 'partnermanagement.account.skuCategory',\r\n defaultMessage: 'SKU category',\r\n },\r\n skuCode: {\r\n id: 'partnermanagement.account.skuCode',\r\n defaultMessage: 'SKU code',\r\n },\r\n advancedAccountTitle: {\r\n id: 'partnermanagement.account.advancedAccountTitle',\r\n defaultMessage: 'Advanced account attributes',\r\n },\r\n paymentOption: {\r\n id: 'partnermanagement.account.paymentOption',\r\n defaultMessage: 'Payment option',\r\n },\r\n paymentOptionMonthlyThreshold: {\r\n id: 'partnermanagement.account.paymentOptionMonthlyThreshold',\r\n defaultMessage: 'Monthly Threshold',\r\n },\r\n paymentOptionNoPay: {\r\n id: 'partnermanagement.account.paymentOptionNoPay',\r\n defaultMessage: 'No Pay',\r\n },\r\n lifecycleStatusCreated: {\r\n id: 'partnermanagement.account.lifecycleStatusCreated',\r\n defaultMessage: 'Created',\r\n },\r\n lifecycleStatusSubmitted: {\r\n id: 'partnermanagement.account.lifecycleStatusSubmitted',\r\n defaultMessage: 'Submitted',\r\n },\r\n lifecycleStatusPending: {\r\n id: 'partnermanagement.account.lifecycleStatusPending',\r\n defaultMessage: 'Pending',\r\n },\r\n lifecycleStatusFailed: {\r\n id: 'partnermanagement.account.lifecycleStatusFailed',\r\n defaultMessage: 'Failed',\r\n },\r\n lifecycleStatusPinFailed: {\r\n id: 'partnermanagement.account.lifecycleStatusPinFailed',\r\n defaultMessage: 'Pin Failed',\r\n },\r\n lifecycleStatusBlacklisted: {\r\n id: 'partnermanagement.account.lifecycleStatusBlacklisted',\r\n defaultMessage: 'Blacklisted',\r\n },\r\n lifecycleStatusSuccess: {\r\n id: 'partnermanagement.account.lifecycleStatusSuccess',\r\n defaultMessage: 'Success',\r\n },\r\n lifecycleStatusValidated: {\r\n id: 'partnermanagement.account.lifecycleStatusValidated',\r\n defaultMessage: 'Validated',\r\n },\r\n\r\n financialStatusLabel: {\r\n id: 'partnermanagement.account.financialStatusLabel',\r\n defaultMessage: 'Financial status',\r\n },\r\n financialStatusNoHold: {\r\n id: 'partnermanagement.account.financialStatusNoHold',\r\n defaultMessage: 'No Hold',\r\n },\r\n financialStatusHold: {\r\n id: 'partnermanagement.account.financialStatusHold',\r\n defaultMessage: 'CSO Hold',\r\n },\r\n financialStatusTaxOnHold: {\r\n id: 'partnermanagement.account.financialStatusTaxOnHold',\r\n defaultMessage: 'Tax On Hold',\r\n },\r\n financialStatusUserHold: {\r\n id: 'partnermanagement.account.financialStatusUserHold',\r\n defaultMessage: 'User Hold',\r\n },\r\n lifecycleStatusLabel: {\r\n id: 'partnermanagement.account.lifecycleStatusLabel',\r\n defaultMessage: 'Payment Lifecycle status',\r\n },\r\n revenueSharePercentageLabel: {\r\n id: 'partnermanagement.account.revenueSharePercentageLabel',\r\n defaultMessage: 'Revenue share percentage',\r\n },\r\n operationCostRationLabel: {\r\n id: 'partnermanagement.account.operationCostRationLabel',\r\n defaultMessage: 'Operation cost ratio',\r\n },\r\n accountLevelattributesLabel: {\r\n id: 'partnermanagement.account.accountLevelattributesLabel',\r\n defaultMessage: 'Account level attributes',\r\n },\r\n accountLevelattributesDesc: {\r\n id: 'partnermanagement.account.accountLevelattributesDesc',\r\n defaultMessage: 'Select account level attributes',\r\n },\r\n enableAdunitDebugging: {\r\n id: 'partnermanagement.account.enableAdunitDebugging',\r\n defaultMessage: 'Enable ad unit debugging',\r\n },\r\n enablePassedURLs: {\r\n id: 'partnermanagement.account.enablePassedURLs',\r\n defaultMessage: 'Enable passed URLs',\r\n },\r\n enablePassedKeywords: {\r\n id: 'partnermanagement.account.enablePassedKeywords',\r\n defaultMessage: 'Enable passed keywords',\r\n },\r\n donotCrawl: {\r\n id: 'partnermanagement.account.donotCrawl',\r\n defaultMessage: 'Do not crawl',\r\n },\r\n enableGlobalDefaultKeywords: {\r\n id: 'partnermanagement.account.enableGlobalDefaultKeywords',\r\n defaultMessage: 'Enable global default keywords',\r\n },\r\n enableAdultAds: {\r\n id: 'partnermanagement.account.enableAdultAds',\r\n defaultMessage: 'Enable adult ads',\r\n },\r\n enableRAIS: {\r\n id: 'partnermanagement.account.enableRAIS',\r\n defaultMessage: 'Enable RAIS for search ad units',\r\n },\r\n phoneExtension: {\r\n id: 'partnermanagement.account.phoneExtension',\r\n defaultMessage: 'Phone extensions',\r\n },\r\n enableSiteLink: {\r\n id: 'partnermanagement.account.enableSiteLink ',\r\n defaultMessage: 'Enable SiteLink extensions',\r\n },\r\n localExtension: {\r\n id: 'partnermanagement.account.localExtension',\r\n defaultMessage: 'Local extensions',\r\n },\r\n locationExtension: {\r\n id: 'partnermanagement.account.locationExtension',\r\n defaultMessage: 'Location extensions',\r\n },\r\n callExtension: {\r\n id: 'partnermanagement.account.callExtension',\r\n defaultMessage: 'Call extension',\r\n },\r\n meteredCallExtensions: {\r\n id: 'partnermanagement.account.meteredCallExtensions',\r\n defaultMessage: 'Metered call extensions',\r\n },\r\n meteredRatingExtensions: {\r\n id: 'partnermanagement.account.meteredRatingExtensions',\r\n defaultMessage: 'Merchant rating extensions',\r\n },\r\n createAccount: {\r\n id: 'partnermanagement.account.createAccount',\r\n defaultMessage: 'Create Account',\r\n },\r\n storeIdLabel: {\r\n id: 'partnermanagement.account.storeIdLabel',\r\n defaultMessage: 'Store IDs',\r\n },\r\n storeIdExampleText: {\r\n id: 'partnermanagement.account.storeIdExample',\r\n defaultMessage: 'Example Store ID 1, enter one per line',\r\n },\r\n partnerCodeLabel: {\r\n id: 'partnermanagement.account.partnerCodeLabel',\r\n defaultMessage: 'Partner Codes for Distribution Reporting',\r\n },\r\n partnerCodeText: {\r\n id: 'partnermanagement.account.partnerCodeText',\r\n defaultMessage: 'Example Partner Code ABC123, enter one per line',\r\n },\r\n formCodeLabel: {\r\n id: 'partnermanagement.account.formCodeLabel',\r\n defaultMessage: 'Form Codes for Distribution Reporting',\r\n },\r\n formCodeText: {\r\n id: 'partnermanagement.account.FormCodeText',\r\n defaultMessage: 'Example Form Code ABC123, enter one per line',\r\n },\r\n startDistributionPlacementCodeLabel: {\r\n id: 'partnermanagement.account.startDistributionPlacementCodeLabel',\r\n defaultMessage: 'Placement Codes for Start Distribution Reporting',\r\n },\r\n startDistributionPlacementCodeText: {\r\n id: 'partnermanagement.account.startDistributionPlacementCodeText',\r\n defaultMessage: 'Example Placement Code ABC123, enter one per line',\r\n },\r\n startDistributionOCIDL2Label: {\r\n id: 'partnermanagement.account.startDistributionOCIDL2Label',\r\n defaultMessage: 'OCIDL2 for Start Distribution Content Reporting',\r\n },\r\n startDistributionOCIDL2Text: {\r\n id: 'partnermanagement.account.startDistributionOCIDL2Text',\r\n defaultMessage: 'Example OCIDL2 ThirdParty_ABC123, enter one per line',\r\n },\r\n startDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentageText: {\r\n id: 'partnermanagement.account.startDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentageText',\r\n defaultMessage: 'Start Distribution Native Ads in Feeds & Headlines Revenue Share Percentage',\r\n },\r\n privateMarketplace: {\r\n id: 'partnermanagement.account.privateMarketplace',\r\n defaultMessage: 'Enable Private Marketplace',\r\n },\r\n inHousePromotions: {\r\n id: 'partnermanagement.account.inHousePromotions',\r\n defaultMessage: 'Sponsored Product Ads Stores',\r\n },\r\n boost: {\r\n id: 'partnermanagement.account.boost',\r\n defaultMessage: 'Boost Advertiser Accounts',\r\n },\r\n boostIdsLabel: {\r\n id: 'partnermanagement.account.boostIdsLabel',\r\n defaultMessage: 'Advertiser Account IDs',\r\n },\r\n boostIdsExampleText: {\r\n id: 'partnermanagement.account.boostIdsExampleText',\r\n defaultMessage: 'Example Account ID 1, enter one per line',\r\n },\r\n privateMarketplaceIdsLabel: {\r\n id: 'partnermanagement.account.privateMarketplaceIdsLabel',\r\n defaultMessage: 'Private Marketplace IDs',\r\n },\r\n privateMarketplaceExampleText: {\r\n id: 'partnermanagement.account.privateMarketplaceIdsExampleText',\r\n defaultMessage: 'Example ID 1, enter one per line',\r\n },\r\n});\r\n","import { IDropdownStyles } from '@fluentui/react';\r\nimport { IPubcenterSpacing } from '../../../../../theme';\r\nimport { ICreateAccountStyleProps, ICreateAccountStyles } from './CreateAccount.types';\r\n\r\nexport const getStyles = (props: ICreateAccountStyleProps): ICreateAccountStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return {\r\n root: {\r\n marginTop: theme.spacing.m,\r\n marginLeft: theme.spacing.m,\r\n },\r\n datagrid: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '300px',\r\n flex: 1,\r\n },\r\n\r\n subComponentStyles: {\r\n checkbox: {\r\n root: {\r\n marginBottom: spacing.size8,\r\n },\r\n },\r\n dropdown: ({\r\n dropdown: [\r\n {\r\n height: 46,\r\n },\r\n ],\r\n } as unknown) as IDropdownStyles,\r\n },\r\n };\r\n};\r\n","import {\r\n Checkbox,\r\n ChoiceGroup,\r\n classNamesFunction,\r\n ComboBox,\r\n Dropdown,\r\n getTheme,\r\n IComboBoxOption,\r\n IDropdownOption,\r\n IProcessedStyleSet,\r\n nullRender,\r\n Panel,\r\n PanelType,\r\n TextField,\r\n} from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport {\r\n AccountSKU,\r\n getAppStore,\r\n onHelpInfoCalloutOpened,\r\n onHelpInfoChanged,\r\n onNavigateBack,\r\n PaymentInstrumentLifeCycleStatus,\r\n PaymentOption,\r\n PrivateMarketplace,\r\n User,\r\n} from '../../../../@data';\r\nimport { completeAccess, hasReadAccess, hasUpdateAccess, UserRoleEntity, userRoleKey } from '../../../../@data/services/UserRoleService';\r\nimport { FinancialStatus } from '../../../../@data/store/schema/enums/FinancialStatus';\r\nimport { Account as AccountAccessPermissions } from '../../../../@data/store/schema/userrolemodels/Account';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { DataGrid, DataGridSelectionMode, IDataGrid, IDataGridCommandBarProps } from '../../../../components/DataGrid';\r\nimport { FormItem, FormSection, FormState } from '../../../../components/Form';\r\nimport { FormLabel } from '../../../../components/Form/FormLabel';\r\nimport { countryToCurrencyMap } from '../../../../config/countryToCurrencyMapper.config';\r\n\r\nimport {\r\n COUNTRIES_LANGUAGE_MAPPING,\r\n CURRENCIES_LANGUAGE_MAPPING,\r\n LANGUAGES_LANGUAGE_MAPPING,\r\n TIMEZONE_LANGUAGE_MAPPING,\r\n} from '../../../../globalization';\r\nimport { DetailPage } from '../../../../layout/DetailPage/DetailPage';\r\nimport { IDataGridColumn } from '../../../../layout/GridPageV2';\r\nimport MediaTypeMessages from '../../../../MediaType.messages';\r\nimport { injectIntlWithObserver } from '../../../../utils';\r\nimport { getPageStore, RouteName } from '../../@data';\r\nimport { onPanelOpenChanged } from '../../@data/actions';\r\nimport { createReturnUrl } from '../../@data/service/PartnerManagementService';\r\nimport { IAccountViewModel } from '../@data';\r\nimport {\r\n onAccountSkuFormMediumChanged,\r\n onAccountSkuFormSkuChanged,\r\n onAccountSkuFormSubmitted,\r\n onAccountSkuSidePanelInitialized,\r\n onFormAccountAllowAdultAdsChanged,\r\n onFormAccountAllowCallExtensionsChanged,\r\n onFormAccountAllowCrawlingChanged,\r\n onFormAccountAllowGlobalDefaultKeywordsChanged,\r\n onFormAccountAllowLocalExtensionsChanged,\r\n onFormAccountAllowLocationExtensionsChanged,\r\n onFormAccountAllowMerchantRatingExtensionsChanged,\r\n onFormAccountAllowMeteredCallExtensionsChanged,\r\n onFormAccountAllowPassedKeywordChanged,\r\n onFormAccountAllowPassedURLChanged,\r\n onFormAccountAllowPhoneExtensionsChanged,\r\n onFormAccountAllowSiteLinkExtensionsChanged,\r\n onFormAccountCountryChanged,\r\n onFormAccountCurrencyChanged,\r\n onFormAccountFinancialStatusChanged,\r\n onFormAccountFormCodesChanged,\r\n onFormAccountLanguageChanged,\r\n onFormAccountNameChanged,\r\n onFormAccountOperationRatioChanged,\r\n onFormAccountPartnerCodesChanged,\r\n onFormAccountPaymentLifeCycleStatusChanged,\r\n onFormAccountPaymentOptionChanged,\r\n onFormAccountPrimaryContactChanged,\r\n onFormAccountStartDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentageChanged,\r\n onFormAccountStartDistributionOCIDL2sChanged,\r\n onFormAccountStartDistributionPlacementCodesChanged,\r\n onFormAccountStoreIdsChanged,\r\n onFormAccountTimezoneChanged,\r\n onFormCancelled,\r\n onFormInitialized,\r\n onFormSubmitted,\r\n} from '../@data/actions';\r\nimport { onAccountPrivateMarketplaceChanged } from '../@data/mutatorActions';\r\nimport { getStore } from '../@data/store/store';\r\nimport messages from './CreateAccount.messages';\r\nimport { getStyles } from './CreateAccount.styles';\r\nimport {\r\n ICreateAccountProps,\r\n ICreateAccountStyleProps,\r\n ICreateAccountStyles,\r\n IFormInitializationState,\r\n ISkuSidePanelProps,\r\n} from './CreateAccount.types';\r\n\r\nconst getClassNames = classNamesFunction<ICreateAccountStyleProps, ICreateAccountStyles>();\r\n\r\nexport const CreateAccount = injectIntlWithObserver(\r\n class extends React.Component<ICreateAccountProps, IFormInitializationState> {\r\n private _classNames: IProcessedStyleSet<ICreateAccountStyles>;\r\n private _datagrid = React.createRef<IDataGrid>();\r\n\r\n constructor(props: ICreateAccountProps) {\r\n super(props);\r\n this.state = {\r\n initializeForm: true,\r\n skuPanelFormState: FormState.InPageCreate,\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n const publisherId = this.props.match.params.publisherId;\r\n const entityId = this.props.match.params.accountId;\r\n this.setState({ id: entityId });\r\n if (publisherId) {\r\n onFormInitialized(this.props.mode, publisherId, entityId);\r\n }\r\n }\r\n\r\n public componentDidUpdate() {\r\n const publisherId = this.props.match.params.publisherId;\r\n const entityId = this.props.match.params.accountId;\r\n if (this.state.initializeForm && this.state.id !== entityId) {\r\n this.setState({ id: entityId });\r\n if (publisherId) {\r\n onFormInitialized(this.props.mode, publisherId, entityId);\r\n }\r\n }\r\n }\r\n\r\n public render() {\r\n const theme = getTheme();\r\n this._classNames = getClassNames(getStyles, { theme });\r\n const appStore = getAppStore();\r\n const store = getStore();\r\n const activeAccount = store.active;\r\n const activePublisher = appStore.publisher;\r\n const publisherId = this.props.match.params.publisherId;\r\n const { formatMessage } = this.props.intl;\r\n const accountAccessPermissions = this._getAccountAccessPermission();\r\n const CURRENCY = CURRENCIES_LANGUAGE_MAPPING[appStore.locale];\r\n return (\r\n <DetailPage\r\n titleLabel={this.props.mode === FormState.Edit ? formatMessage(messages.editPageTitle) : formatMessage(messages.createPageTitle)}\r\n helpId={'pop_PCv4_AccountCreate'}\r\n submitLabel={formatMessage(this.props.mode === FormState.Edit ? messages.updateAccount : messages.createPageTitle)}\r\n onSubmit={() => this._onSubmit(publisherId)}\r\n onCancel={() => this._onCancel(publisherId)}\r\n onNavClick={() => this._onCancel(publisherId)}\r\n saving={getAppStore().saving}\r\n pageMode={this.props.mode}\r\n >\r\n <FormItem>\r\n <TextField\r\n label={formatMessage(messages.publisherName)}\r\n ariaLabel={formatMessage(messages.publisherName)}\r\n required={true}\r\n value={activePublisher && String(activePublisher.name)}\r\n placeholder=\"\"\r\n disabled={true}\r\n />\r\n </FormItem>\r\n {this.props.mode === FormState.Edit && (\r\n <FormItem>\r\n <TextField\r\n label={formatMessage(messages.accountNumber)}\r\n ariaLabel={formatMessage(messages.accountNumber)}\r\n required={true}\r\n value={activeAccount.number ? String(activeAccount.number) : ''}\r\n placeholder=\"\"\r\n disabled={true}\r\n />\r\n </FormItem>\r\n )}\r\n <FormItem>\r\n <TextField\r\n label={formatMessage(messages.accountName)}\r\n ariaLabel={formatMessage(messages.accountName)}\r\n errorMessage={store.errors.name}\r\n value={activeAccount.name}\r\n required={true}\r\n onChange={(_, value) => onFormAccountNameChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.accountName\r\n )}\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <Dropdown\r\n label={formatMessage(messages.primaryContact)}\r\n ariaLabel={formatMessage(messages.primaryContact)}\r\n options={this._createPrimaryContactDropDown(activeAccount.availableUsers!)}\r\n required={true}\r\n defaultSelectedKey={activeAccount.primaryContactUserId}\r\n onChange={(_, value) => onFormAccountPrimaryContactChanged(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.primaryContact\r\n )}\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <Dropdown\r\n label={formatMessage(AppMessages.language)}\r\n ariaLabel={formatMessage(AppMessages.language)}\r\n options={this._createLanguageDropDown(activeAccount.availableLanguages!)}\r\n required={true}\r\n defaultSelectedKey={activeAccount.languageCode}\r\n onChange={(_, value) => onFormAccountLanguageChanged(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.lanuage\r\n )}\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <ComboBox\r\n useComboBoxAsMenuWidth={true}\r\n autoComplete=\"on\"\r\n label={formatMessage(AppMessages.countryOrRegion)}\r\n ariaLabel={formatMessage(AppMessages.countryOrRegion)}\r\n options={this._createCountryDropDown(activeAccount.availableCountries!)}\r\n required={true}\r\n selectedKey={activeAccount.countryCode}\r\n onChange={(_, value) => onFormAccountCountryChanged(value!)}\r\n disabled={this.props.mode === FormState.Edit}\r\n tabIndex={this.props.mode === FormState.Edit ? -1 : undefined}\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <TextField\r\n label={formatMessage(AppMessages.currency)}\r\n ariaLabel={formatMessage(AppMessages.currency)}\r\n required={true}\r\n value={activeAccount.countryCode && CURRENCY[countryToCurrencyMap[activeAccount.countryCode]]}\r\n placeholder=\"\"\r\n disabled={true}\r\n onChange={(_, value) => onFormAccountCurrencyChanged(value!)}\r\n />\r\n </FormItem>\r\n <FormItem formWidth={440}>\r\n <Dropdown\r\n label={formatMessage(AppMessages.timezoneLabel)}\r\n ariaLabel={formatMessage(AppMessages.timezoneLabel)}\r\n required={true}\r\n options={this._createTimezoneDropDown(activeAccount.availableTimezones!)}\r\n defaultSelectedKey={activeAccount.timeZoneId}\r\n onChange={(_, value) => onFormAccountTimezoneChanged(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.timeZone\r\n )}\r\n />\r\n </FormItem>\r\n {hasReadAccess(accountAccessPermissions === null ? completeAccess : accountAccessPermissions.accountLevelAttribute) && (\r\n <FormSection title={formatMessage(messages.advancedAccountTitle)}>\r\n {this._advancedAccountAttributes(activeAccount, accountAccessPermissions)}\r\n </FormSection>\r\n )}\r\n\r\n {this.props.mode === FormState.Edit &&\r\n hasReadAccess(accountAccessPermissions === null ? completeAccess : accountAccessPermissions.SKUs) && (\r\n <>\r\n <FormSection title={formatMessage(messages.skuTitle)}>{this._SKUs(activeAccount, accountAccessPermissions)}</FormSection>\r\n <Panel\r\n isOpen={getPageStore().panelIsOpen}\r\n type={PanelType.medium}\r\n onDismiss={() => onPanelOpenChanged(false)}\r\n closeButtonAriaLabel={formatMessage(AppMessages.close)}\r\n >\r\n {this._createSkuPanel(this.state.skuPanelFormState, activeAccount.id!)}\r\n </Panel>\r\n </>\r\n )}\r\n </DetailPage>\r\n );\r\n }\r\n\r\n private _createSkuPanel = (mode: FormState, accountId: number): JSX.Element | null => {\r\n const { formatMessage } = this.props.intl;\r\n const accountSku = getStore().accountSku!;\r\n if (accountSku) {\r\n return (\r\n <DetailPage\r\n helpId={'pop_PCv4_SkuCreate'}\r\n titleLabel={formatMessage(mode === FormState.InPageEdit ? messages.editSku : messages.createSku)}\r\n submitLabel={formatMessage(mode === FormState.InPageEdit ? messages.editSku : messages.createSku)}\r\n onSubmit={() => this._onAccountSkuSubmit(mode, accountId)}\r\n onCancel={() => onPanelOpenChanged(false)}\r\n saving={getAppStore().saving}\r\n pageMode={mode}\r\n >\r\n <FormItem>\r\n <Dropdown\r\n label={formatMessage(messages.skuCategory)}\r\n ariaLabel={formatMessage(messages.skuCategory)}\r\n required={true}\r\n options={this._createMediaTypeDropdown(accountSku.listOfMediums!)}\r\n defaultSelectedKey={accountSku.medium!}\r\n disabled={mode === FormState.InPageEdit}\r\n onChange={(_, value) => onAccountSkuFormMediumChanged(value!)}\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <Dropdown\r\n label={formatMessage(messages.skuCode)}\r\n ariaLabel={formatMessage(messages.skuCode)}\r\n required={true}\r\n options={this._createSkuDropDown(accountSku.availableSkus!)}\r\n defaultSelectedKey={accountSku.sku!}\r\n onChange={(_, value) => onAccountSkuFormSkuChanged(value!)}\r\n />\r\n </FormItem>\r\n </DetailPage>\r\n );\r\n }\r\n return nullRender();\r\n };\r\n\r\n private _onAccountSkuSubmit(mode: FormState, accountId: number): void {\r\n onAccountSkuFormSubmitted(mode, accountId);\r\n onPanelOpenChanged(false);\r\n }\r\n\r\n private _createSkuDropDown(skus: string[]): IDropdownOption[] {\r\n const availableAccountSkus: IDropdownOption[] = [];\r\n if (skus) {\r\n skus.forEach((sku) => {\r\n availableAccountSkus!.push({\r\n key: sku,\r\n text: sku,\r\n ariaLabel: sku,\r\n });\r\n });\r\n }\r\n return availableAccountSkus;\r\n }\r\n\r\n private _advancedAccountAttributes = (\r\n activeAccount: IAccountViewModel,\r\n accountAccessPermissions: AccountAccessPermissions | null\r\n ): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const helpInfo = getAppStore().helpInfo;\r\n\r\n const paymentLifeCycleStatusOptions: IDropdownOption[] = [\r\n {\r\n key: PaymentInstrumentLifeCycleStatus.Blacklisted,\r\n text: formatMessage(messages.lifecycleStatusBlacklisted),\r\n ariaLabel: formatMessage(messages.lifecycleStatusBlacklisted),\r\n },\r\n {\r\n key: PaymentInstrumentLifeCycleStatus.Created,\r\n text: formatMessage(messages.lifecycleStatusCreated),\r\n ariaLabel: formatMessage(messages.lifecycleStatusCreated),\r\n },\r\n {\r\n key: PaymentInstrumentLifeCycleStatus.PinFailed,\r\n text: formatMessage(messages.lifecycleStatusPinFailed),\r\n ariaLabel: formatMessage(messages.lifecycleStatusPinFailed),\r\n },\r\n {\r\n key: PaymentInstrumentLifeCycleStatus.Failed,\r\n text: formatMessage(messages.lifecycleStatusFailed),\r\n ariaLabel: formatMessage(messages.lifecycleStatusFailed),\r\n },\r\n {\r\n key: PaymentInstrumentLifeCycleStatus.Pending,\r\n text: formatMessage(messages.lifecycleStatusPending),\r\n ariaLabel: formatMessage(messages.lifecycleStatusPending),\r\n },\r\n {\r\n key: PaymentInstrumentLifeCycleStatus.Success,\r\n text: formatMessage(messages.lifecycleStatusSuccess),\r\n ariaLabel: formatMessage(messages.lifecycleStatusSuccess),\r\n },\r\n {\r\n key: PaymentInstrumentLifeCycleStatus.Submitted,\r\n text: formatMessage(messages.lifecycleStatusSubmitted),\r\n ariaLabel: formatMessage(messages.lifecycleStatusSubmitted),\r\n },\r\n {\r\n key: PaymentInstrumentLifeCycleStatus.Validated,\r\n text: formatMessage(messages.lifecycleStatusValidated),\r\n ariaLabel: formatMessage(messages.lifecycleStatusValidated),\r\n },\r\n ];\r\n\r\n const paymentOptionOptions: IDropdownOption[] = [\r\n {\r\n key: PaymentOption.MonthlyThreshold,\r\n text: formatMessage(messages.paymentOptionMonthlyThreshold),\r\n ariaLabel: formatMessage(messages.paymentOptionMonthlyThreshold),\r\n },\r\n {\r\n key: PaymentOption.NoPay,\r\n text: formatMessage(messages.paymentOptionNoPay),\r\n ariaLabel: formatMessage(messages.paymentOptionNoPay),\r\n },\r\n ];\r\n return (\r\n <FormItem formWidth={440}>\r\n <FormItem>\r\n <Dropdown\r\n label={formatMessage(messages.paymentOption)}\r\n ariaLabel={formatMessage(messages.paymentOption)}\r\n required={true}\r\n options={paymentOptionOptions}\r\n defaultSelectedKey={activeAccount.paymentOption}\r\n onChange={(_, value) => onFormAccountPaymentOptionChanged(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.paymentOption\r\n )}\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <Dropdown\r\n label={formatMessage(messages.financialStatusLabel)}\r\n ariaLabel={formatMessage(messages.financialStatusLabel)}\r\n required={true}\r\n options={[\r\n {\r\n key: FinancialStatus.NoHold,\r\n text: formatMessage(messages.financialStatusNoHold),\r\n ariaLabel: formatMessage(messages.financialStatusNoHold),\r\n },\r\n {\r\n key: FinancialStatus.Hold,\r\n text: formatMessage(messages.financialStatusHold),\r\n ariaLabel: formatMessage(messages.financialStatusHold),\r\n },\r\n {\r\n key: FinancialStatus.TaxOnHold,\r\n text: formatMessage(messages.financialStatusTaxOnHold),\r\n ariaLabel: formatMessage(messages.financialStatusTaxOnHold),\r\n },\r\n {\r\n key: FinancialStatus.UserHold,\r\n text: formatMessage(messages.financialStatusUserHold),\r\n ariaLabel: formatMessage(messages.financialStatusUserHold),\r\n },\r\n ]}\r\n defaultSelectedKey={activeAccount.financialStatus ? activeAccount.financialStatus : FinancialStatus.TaxOnHold}\r\n onChange={(_, value) => onFormAccountFinancialStatusChanged(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.financialStatus\r\n )}\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <Dropdown\r\n label={formatMessage(messages.lifecycleStatusLabel)}\r\n ariaLabel={formatMessage(messages.lifecycleStatusLabel)}\r\n required={true}\r\n options={paymentLifeCycleStatusOptions}\r\n defaultSelectedKey={\r\n activeAccount.paymentLifeCycleStatus ? activeAccount.paymentLifeCycleStatus : PaymentInstrumentLifeCycleStatus.Validated\r\n }\r\n onChange={(_, value) => onFormAccountPaymentLifeCycleStatusChanged(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.paymentLifecycle\r\n )}\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <TextField\r\n defaultValue={activeAccount.revenueSharePercentage !== undefined ? String(activeAccount.revenueSharePercentage) : '100'}\r\n label={formatMessage(messages.revenueSharePercentageLabel)}\r\n ariaLabel={formatMessage(messages.revenueSharePercentageLabel)}\r\n errorMessage={getStore().errors.revenueSharePercentage}\r\n required={true}\r\n disabled={true}\r\n />\r\n <span>%</span>\r\n </FormItem>\r\n <FormItem>\r\n <TextField\r\n defaultValue={activeAccount.operationRatio ? String(activeAccount.operationRatio) : '0'}\r\n label={formatMessage(messages.operationCostRationLabel)}\r\n ariaLabel={formatMessage(messages.operationCostRationLabel)}\r\n errorMessage={getStore().errors.operationRatio}\r\n onChange={(_, value) => onFormAccountOperationRatioChanged(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.operationCostRation\r\n )}\r\n />\r\n </FormItem>\r\n\r\n <FormItem role=\"region\" ariaLabelledBy=\"accountLvlattrLabel\" ariaDescription={formatMessage(messages.accountLevelattributesDesc)}>\r\n <FormLabel\r\n id=\"accountLvlattrLabel\"\r\n labelContent={formatMessage(messages.accountLevelattributesLabel)}\r\n noInfoButton={true}\r\n intl={this.props.intl}\r\n />\r\n <Checkbox\r\n label={formatMessage(messages.enablePassedURLs)}\r\n ariaLabel={formatMessage(messages.enablePassedURLs)}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n checked={!!activeAccount.allowPassedURL}\r\n onChange={(_, value) => onFormAccountAllowPassedURLChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.accountLevelAttribute\r\n )}\r\n />\r\n <Checkbox\r\n label={formatMessage(messages.enablePassedKeywords)}\r\n ariaLabel={formatMessage(messages.enablePassedKeywords)}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n checked={!!activeAccount.allowPassedKeyword}\r\n onChange={(_, value) => onFormAccountAllowPassedKeywordChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.accountLevelAttribute\r\n )}\r\n />\r\n <Checkbox\r\n label={formatMessage(messages.donotCrawl)}\r\n ariaLabel={formatMessage(messages.donotCrawl)}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n checked={!!activeAccount.allowCrawling}\r\n onChange={(_, value) => onFormAccountAllowCrawlingChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.accountLevelAttribute\r\n )}\r\n />\r\n <Checkbox\r\n label={formatMessage(messages.enableAdultAds)}\r\n ariaLabel={formatMessage(messages.enableAdultAds)}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n checked={!!activeAccount.allowAdultAds}\r\n onChange={(_, value) => onFormAccountAllowAdultAdsChanged(value)}\r\n />\r\n <Checkbox\r\n label={formatMessage(messages.enableGlobalDefaultKeywords)}\r\n ariaLabel={formatMessage(messages.enableGlobalDefaultKeywords)}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n checked={!!activeAccount.allowGlobalDefaultKeywords}\r\n onChange={(_, value) => onFormAccountAllowGlobalDefaultKeywordsChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.accountLevelAttribute\r\n )}\r\n />\r\n <Checkbox\r\n label={formatMessage(messages.enableSiteLink)}\r\n ariaLabel={formatMessage(messages.enableSiteLink)}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n checked={!!activeAccount.allowSiteLinkExtensions}\r\n onChange={(_, value) => onFormAccountAllowSiteLinkExtensionsChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.accountLevelAttribute\r\n )}\r\n />\r\n <Checkbox\r\n label={formatMessage(messages.meteredCallExtensions)}\r\n ariaLabel={formatMessage(messages.meteredCallExtensions)}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n checked={!!activeAccount.allowMeteredCallExtensions}\r\n onChange={(_, value) => onFormAccountAllowMeteredCallExtensionsChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.accountLevelAttribute\r\n )}\r\n />\r\n <Checkbox\r\n label={formatMessage(messages.locationExtension)}\r\n ariaLabel={formatMessage(messages.locationExtension)}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n checked={!!activeAccount.allowLocationExtensions}\r\n onChange={(_, value) => onFormAccountAllowLocationExtensionsChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.accountLevelAttribute\r\n )}\r\n />\r\n <Checkbox\r\n label={formatMessage(messages.phoneExtension)}\r\n ariaLabel={formatMessage(messages.phoneExtension)}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n checked={!!activeAccount.allowPhoneExtensions}\r\n onChange={(_, value) => onFormAccountAllowPhoneExtensionsChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.accountLevelAttribute\r\n )}\r\n />\r\n <Checkbox\r\n label={formatMessage(messages.meteredRatingExtensions)}\r\n ariaLabel={formatMessage(messages.meteredRatingExtensions)}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n checked={!!activeAccount.allowMerchantRatingExtensions}\r\n onChange={(_, value) => onFormAccountAllowMerchantRatingExtensionsChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.accountLevelAttribute\r\n )}\r\n />\r\n <Checkbox\r\n label={formatMessage(messages.localExtension)}\r\n ariaLabel={formatMessage(messages.localExtension)}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n checked={!!activeAccount.allowLocalExtensions}\r\n onChange={(_, value) => onFormAccountAllowLocalExtensionsChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.accountLevelAttribute\r\n )}\r\n />\r\n <Checkbox\r\n label={formatMessage(messages.callExtension)}\r\n ariaLabel={formatMessage(messages.callExtension)}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n checked={!!activeAccount.allowCallExtensions}\r\n onChange={(_, value) => onFormAccountAllowCallExtensionsChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.accountLevelAttribute\r\n )}\r\n />\r\n </FormItem>\r\n <FormItem role=\"region\" ariaLabel={formatMessage(messages.privateMarketplace)}>\r\n <FormLabel\r\n id=\"privateMarketplaceLabel\"\r\n labelContent={formatMessage(messages.privateMarketplace)}\r\n intl={this.props.intl}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_AdUnitsPromotions')}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n />\r\n <ChoiceGroup\r\n aria-activedescendant={formatMessage(messages.inHousePromotions)}\r\n ariaLabelledBy={'privateMarketplaceLabel'}\r\n selectedKey={getStore().privateMarketplace}\r\n options={[\r\n {\r\n id: formatMessage(messages.inHousePromotions),\r\n key: PrivateMarketplace.InHouse,\r\n text: formatMessage(messages.inHousePromotions),\r\n },\r\n {\r\n id: formatMessage(messages.boost),\r\n key: PrivateMarketplace.Boost,\r\n text: formatMessage(messages.boost),\r\n },\r\n ]}\r\n onChange={(_, value) => onAccountPrivateMarketplaceChanged(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.accountLevelAttribute\r\n )}\r\n />\r\n </FormItem>\r\n {getStore().enablePrivateMarketplace && (\r\n <FormItem formWidth={440}>\r\n <TextField\r\n multiline={true}\r\n placeholder={formatMessage(this._getAdvertisersWhitelistTextFieldPlaceholder())}\r\n errorMessage={getStore().errors.storeIds}\r\n aria-labelledby=\"storeIdLabel\"\r\n onRenderLabel={() => {\r\n return (\r\n <FormLabel\r\n id=\"storeIdLabel\"\r\n labelContent={formatMessage(this._getAdvertisersWhitelistTextFieldLabel())}\r\n intl={this.props.intl}\r\n noInfoButton={true}\r\n />\r\n );\r\n }}\r\n value={activeAccount.storeIds}\r\n onChange={(_, value) => onFormAccountStoreIdsChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.inHousePromotion\r\n )}\r\n />\r\n </FormItem>\r\n )}\r\n\r\n {getStore().active.isDistributionReportingApplicable && (\r\n <FormItem formWidth={440}>\r\n <TextField\r\n multiline={true}\r\n placeholder={formatMessage(messages.partnerCodeText)}\r\n errorMessage={getStore().errors.partnerCodes}\r\n aria-labelledby=\"partnerCodeLabel\"\r\n onRenderLabel={() => {\r\n return (\r\n <FormLabel\r\n id=\"partnerCodeLabel\"\r\n labelContent={formatMessage(messages.partnerCodeLabel)}\r\n noInfoButton={true}\r\n intl={this.props.intl}\r\n />\r\n );\r\n }}\r\n value={activeAccount.partnerCodes}\r\n onChange={(_, value) => onFormAccountPartnerCodesChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.partnerCodesforDistributionReport\r\n )}\r\n />\r\n </FormItem>\r\n )}\r\n\r\n {getStore().active.isDistributionReportingApplicable && (\r\n <FormItem formWidth={440}>\r\n <TextField\r\n multiline={true}\r\n placeholder={formatMessage(messages.formCodeText)}\r\n errorMessage={getStore().errors.formCodes}\r\n aria-labelledby=\"formCodeLabel\"\r\n onRenderLabel={() => {\r\n return (\r\n <FormLabel\r\n id=\"formCodeLabel\"\r\n labelContent={formatMessage(messages.formCodeLabel)}\r\n noInfoButton={true}\r\n intl={this.props.intl}\r\n />\r\n );\r\n }}\r\n value={activeAccount.formCodes}\r\n onChange={(_, value) => onFormAccountFormCodesChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.formCodesforDistributionReport\r\n )}\r\n />\r\n </FormItem>\r\n )}\r\n\r\n {getStore().active.isStartDistributionReportingApplicable && (\r\n <FormItem formWidth={440}>\r\n <TextField\r\n multiline={true}\r\n placeholder={formatMessage(messages.startDistributionPlacementCodeText)}\r\n errorMessage={getStore().errors.startDistributionPlacementCodes}\r\n aria-labelledby=\"startDistributionPlacementCodeLabel\"\r\n onRenderLabel={() => {\r\n return (\r\n <FormLabel\r\n id=\"startDistributionPlacementCodeLabel\"\r\n labelContent={formatMessage(messages.startDistributionPlacementCodeLabel)}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_AdUnitsPromotions')}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n intl={this.props.intl}\r\n />\r\n );\r\n }}\r\n value={activeAccount.startDistributionPlacementCodes}\r\n onChange={(_, value) => onFormAccountStartDistributionPlacementCodesChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.startDistributionReporting\r\n )}\r\n />\r\n </FormItem>\r\n )}\r\n\r\n {getStore().active.isStartDistributionReportingApplicable && (\r\n <FormItem>\r\n <TextField\r\n defaultValue={\r\n activeAccount.startDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentage !== undefined\r\n ? String(activeAccount.startDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentage)\r\n : ''\r\n }\r\n label={formatMessage(messages.startDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentageText)}\r\n ariaLabel={formatMessage(messages.startDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentageText)}\r\n errorMessage={getStore().errors.startDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentage}\r\n onChange={(_, value) => onFormAccountStartDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentageChanged(value)}\r\n required={this._isStartDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentageRequired()}\r\n disabled={this._isStartDistributionNativeAdsInFeedsAndHeadlinesRevenuePercentageShareDisabled()}\r\n />\r\n <span>%</span>\r\n </FormItem>\r\n )}\r\n {getStore().active.isStartDistributionContentReportingApplicable && (\r\n <FormItem formWidth={440}>\r\n <TextField\r\n multiline={true}\r\n placeholder={formatMessage(messages.startDistributionOCIDL2Text)}\r\n errorMessage={getStore().errors.startDistributionOCIDL2s}\r\n aria-labelledby=\"startDistributionOCIDL2Label\"\r\n onRenderLabel={() => {\r\n return (\r\n <FormLabel\r\n id=\"startDistributionOCIDL2Label\"\r\n labelContent={formatMessage(messages.startDistributionOCIDL2Label)}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_AdUnitsPromotions')}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n intl={this.props.intl}\r\n />\r\n );\r\n }}\r\n value={activeAccount.startDistributionOCIDL2s}\r\n onChange={(_, value) => onFormAccountStartDistributionOCIDL2sChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.startDistributionReporting\r\n )}\r\n />\r\n </FormItem>\r\n )}\r\n </FormItem>\r\n );\r\n };\r\n private _getAdvertisersWhitelistTextFieldLabel = () => {\r\n const store = getStore();\r\n return store.privateMarketplace === PrivateMarketplace.InHouse\r\n ? messages.storeIdLabel\r\n : store.privateMarketplace === PrivateMarketplace.Boost\r\n ? messages.boostIdsLabel\r\n : messages.privateMarketplaceIdsLabel;\r\n };\r\n private _getAdvertisersWhitelistTextFieldPlaceholder = () => {\r\n const store = getStore();\r\n return store.privateMarketplace === PrivateMarketplace.InHouse\r\n ? messages.storeIdExampleText\r\n : store.privateMarketplace === PrivateMarketplace.Boost\r\n ? messages.boostIdsExampleText\r\n : messages.privateMarketplaceExampleText;\r\n };\r\n private _createMediaTypeDropdown(existingMediums: string[]): IDropdownOption[] {\r\n const { formatMessage } = this.props.intl;\r\n const availableMediaTypes: IDropdownOption[] = [];\r\n\r\n existingMediums.forEach((mediaType) => {\r\n if (MediaTypeMessages[mediaType]) {\r\n availableMediaTypes!.push({\r\n key: mediaType,\r\n text: formatMessage(MediaTypeMessages[mediaType]),\r\n ariaLabel: formatMessage(MediaTypeMessages[mediaType]),\r\n });\r\n }\r\n });\r\n\r\n return availableMediaTypes;\r\n }\r\n\r\n private _createTimezoneDropDown(timezones: number[]): IDropdownOption[] {\r\n const availableTimezones: IDropdownOption[] = [];\r\n const TIMEZONE = TIMEZONE_LANGUAGE_MAPPING[getAppStore().locale];\r\n\r\n if (timezones) {\r\n timezones.forEach((timezoneId) => {\r\n if (TIMEZONE[timezoneId]) {\r\n availableTimezones!.push({\r\n key: timezoneId,\r\n text: TIMEZONE[timezoneId],\r\n ariaLabel: TIMEZONE[timezoneId],\r\n });\r\n }\r\n });\r\n }\r\n\r\n return availableTimezones;\r\n }\r\n\r\n private _createLanguageDropDown(languages: string[]): IDropdownOption[] {\r\n const availableLanguages: IDropdownOption[] = [];\r\n const LANGUAGES = LANGUAGES_LANGUAGE_MAPPING[getAppStore().locale];\r\n\r\n if (languages) {\r\n languages.forEach((languageCode) => {\r\n if (LANGUAGES[languageCode]) {\r\n availableLanguages!.push({\r\n key: languageCode,\r\n text: LANGUAGES[languageCode],\r\n ariaLabel: LANGUAGES[languageCode],\r\n });\r\n }\r\n });\r\n }\r\n\r\n return availableLanguages;\r\n }\r\n\r\n private _createPrimaryContactDropDown(users: User[]): IDropdownOption[] {\r\n const availableUsers: IDropdownOption[] = [];\r\n\r\n if (users) {\r\n users.forEach((user) => {\r\n availableUsers!.push({\r\n key: user.id!,\r\n text: user.username as string,\r\n ariaLabel: user.username as string,\r\n });\r\n });\r\n }\r\n\r\n return availableUsers;\r\n }\r\n\r\n private _createCountryDropDown(countries: string[]): IComboBoxOption[] {\r\n const availableCountrys: IComboBoxOption[] = [];\r\n const countriesWithLocalLang = COUNTRIES_LANGUAGE_MAPPING[getAppStore().locale];\r\n\r\n if (countries) {\r\n countries.forEach((countryCode) => {\r\n if (countriesWithLocalLang[countryCode]) {\r\n availableCountrys!.push({\r\n key: countryCode,\r\n text: countriesWithLocalLang[countryCode],\r\n ariaLabel: countriesWithLocalLang[countryCode],\r\n });\r\n }\r\n });\r\n }\r\n availableCountrys.sort((a, b) => {\r\n const firstValue = a.text;\r\n const secondValue = b.text;\r\n\r\n return firstValue.toLowerCase() > secondValue.toLowerCase() ? 1 : -1;\r\n });\r\n return availableCountrys;\r\n }\r\n\r\n private _SKUs = (activeAccount: IAccountViewModel, accountAccessPermissions: AccountAccessPermissions | null): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const appStore = getAppStore();\r\n const _gridDefaultColumns: IDataGridColumn[] = [\r\n { columnName: 'medium', friendlyName: 'Category', isVisible: true },\r\n { columnName: 'sku', friendlyName: 'SKU code', isVisible: true },\r\n ];\r\n const _commandBarProps: IDataGridCommandBarProps = {\r\n items: [\r\n {\r\n key: 'new',\r\n name: formatMessage(messages.createSku),\r\n ariaLabel: formatMessage(messages.createSku),\r\n iconProps: {\r\n iconName: 'Add',\r\n ariaLabel: 'Add',\r\n },\r\n selectionModes: [DataGridSelectionMode.None],\r\n disabled: activeAccount.nonSKUMappedMediums && activeAccount.nonSKUMappedMediums.length === 0,\r\n onClick: () => {\r\n this.setState({ skuPanelFormState: FormState.InPageCreate });\r\n const skuSidePanel: ISkuSidePanelProps = {\r\n mode: FormState.InPageCreate,\r\n accountSkus: activeAccount.skus,\r\n nonSKUMappedMediums: activeAccount.nonSKUMappedMediums,\r\n };\r\n onAccountSkuSidePanelInitialized(skuSidePanel);\r\n },\r\n },\r\n {\r\n key: 'edit',\r\n name: formatMessage(AppMessages.edit),\r\n ariaLabel: formatMessage(AppMessages.edit),\r\n iconProps: {\r\n iconName: 'Edit',\r\n ariaLabel: 'Edit',\r\n },\r\n onClick: () => {\r\n const item = this._getSelectionItems();\r\n if (item) {\r\n this.setState({ skuPanelFormState: FormState.InPageEdit });\r\n const skuSidePanel: ISkuSidePanelProps = {\r\n mode: FormState.InPageEdit,\r\n selectedAccountSku: item[0],\r\n };\r\n onAccountSkuSidePanelInitialized(skuSidePanel);\r\n }\r\n },\r\n selectionModes: [DataGridSelectionMode.Single],\r\n },\r\n ],\r\n };\r\n return (\r\n <div className={this._classNames.datagrid}>\r\n <DataGrid\r\n intl={this.props.intl}\r\n helpInfo={appStore.helpInfo}\r\n componentRef={this._datagrid}\r\n commandBarProps={_commandBarProps}\r\n dataIsLoading={false}\r\n detailListProps={{\r\n items: activeAccount.skus !== undefined ? activeAccount.skus!.filter((accountSku) => accountSku.medium !== undefined) : [],\r\n columns: _gridDefaultColumns,\r\n }}\r\n />\r\n </div>\r\n );\r\n };\r\n\r\n private _getSelectionItems() {\r\n if (this._datagrid.current) {\r\n const currentSelection = this._datagrid.current.getSelection();\r\n const selectedIndices = currentSelection.getSelectedIndices();\r\n const items = currentSelection.getItems();\r\n\r\n const selectedItems: AccountSKU[] = [];\r\n selectedIndices.map((selectedIndex) => selectedItems.push(items[selectedIndex] as AccountSKU));\r\n return selectedItems;\r\n }\r\n return null;\r\n }\r\n\r\n private _onSubmit = (publisherId?: string): void => {\r\n this.setState({ initializeForm: false });\r\n onFormSubmitted(this.props.mode, this.props.history);\r\n };\r\n\r\n private _onCancel = (publisherId?: string): void => {\r\n this.setState({ initializeForm: false });\r\n onFormCancelled();\r\n const returnUrl = createReturnUrl(RouteName.account, publisherId);\r\n onNavigateBack(this.props.history, returnUrl);\r\n };\r\n\r\n private _getAccountAccessPermission(): AccountAccessPermissions | null {\r\n const userRoles = localStorage.getItem(userRoleKey);\r\n if (userRoles === null) {\r\n return null;\r\n }\r\n const userRolesJSON = JSON.parse(userRoles);\r\n\r\n for (const value in userRolesJSON) {\r\n if (value === UserRoleEntity.Account) {\r\n return JSON.parse(userRolesJSON[value]);\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _isStartDistributionNativeAdsInFeedsAndHeadlinesRevenueSharePercentageRequired(): boolean {\r\n const placementCodeText = getStore().active.startDistributionPlacementCodes;\r\n const hasStartDistributionPlacementCodes =\r\n placementCodeText !== null && placementCodeText !== undefined && placementCodeText.trim().length > 0;\r\n const isRevShareDisabled = this._isStartDistributionNativeAdsInFeedsAndHeadlinesRevenuePercentageShareDisabled();\r\n return hasStartDistributionPlacementCodes && !isRevShareDisabled;\r\n }\r\n\r\n private _isStartDistributionNativeAdsInFeedsAndHeadlinesRevenuePercentageShareDisabled(): boolean {\r\n const accountAccessPermissions = this._getAccountAccessPermission();\r\n return this._isDisabled(\r\n this.props.mode,\r\n accountAccessPermissions === null ? completeAccess : accountAccessPermissions.startDistributionReporting\r\n );\r\n }\r\n\r\n private _isDisabled(mode: FormState, permission: number): boolean {\r\n if (mode === FormState.Create || mode === FormState.InPageCreate) {\r\n return false;\r\n }\r\n\r\n return !hasUpdateAccess(permission);\r\n }\r\n }\r\n);\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n create: {\r\n id: 'account.create',\r\n defaultMessage: 'Create Account',\r\n },\r\n notFound: {\r\n id: 'account.notFound',\r\n defaultMessage: 'No accounts found for this publisher, create one.',\r\n },\r\n name: {\r\n id: 'account.name',\r\n defaultMessage: 'Account name',\r\n },\r\n id: {\r\n id: 'account.id',\r\n defaultMessage: 'Account ID',\r\n },\r\n number: {\r\n id: 'account.number',\r\n defaultMessage: 'Account Number',\r\n },\r\n contact: {\r\n id: 'account.contact',\r\n defaultMessage: 'Primary contact',\r\n },\r\n numAdUnits: {\r\n id: 'account.numAdUnits',\r\n defaultMessage: '# of ad units',\r\n },\r\n adunitnames: {\r\n id: 'account.adunitnames',\r\n defaultMessage: 'Ad unit names',\r\n },\r\n createdDate: {\r\n id: 'account.createdDate',\r\n defaultMessage: 'Date Created',\r\n },\r\n accounts: {\r\n id: 'account',\r\n defaultMessage: 'Accounts',\r\n },\r\n noPublisherSelected: {\r\n id: 'publisher.noPublisherSelected',\r\n defaultMessage: 'A publisher isn’t selected yet. To start managing accounts, search for a publisher',\r\n },\r\n actions: {\r\n id: 'publisher.actions',\r\n defaultMessage: 'Actions',\r\n },\r\n zeroResultTitle: {\r\n id: 'publisher.zeroResultTitle',\r\n defaultMessage: 'No accounts yet',\r\n },\r\n zeroResultDescription: {\r\n id: 'publisher.zeroResultDescription',\r\n defaultMessage: 'You haven’t created any accounts yet',\r\n },\r\n});\r\n","import { Model, getAppStore } from '../../../../../@data';\r\nimport { CommandBarActions, IBuildCommandBarProps } from '../../../../../layout/GridPageV2';\r\nimport { getStore } from '../../@data';\r\nimport messages from '../ManagePage.messages';\r\n\r\nexport function getCommandBarItems(): IBuildCommandBarProps<Model> | undefined {\r\n const { publisher } = getAppStore();\r\n const { accounts, isLoading } = getStore();\r\n\r\n const commandBarItems =\r\n (accounts && accounts.length !== 0 && publisher) || isLoading\r\n ? {\r\n primaryButtonLabel: messages.create,\r\n includeActions: [CommandBarActions.new],\r\n includeFarActions: [\r\n CommandBarActions.searchBox,\r\n CommandBarActions.edit,\r\n CommandBarActions.activate,\r\n CommandBarActions.deactivate,\r\n CommandBarActions.duplicate,\r\n CommandBarActions.download,\r\n CommandBarActions.modifyColumns,\r\n ],\r\n }\r\n : undefined;\r\n\r\n return commandBarItems;\r\n}\r\n","import * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { Account, getAppStore } from '../../../../@data';\r\nimport { ZeroResults } from '../../../../components/ZeroResults/ZeroResults';\r\nimport { useWindowSize } from '../../../../hooks';\r\nimport { getStore as getWindowSizeStore } from '../../../../hooks/useWindowSize/store/store';\r\nimport { GridPageLayout } from '../../../../layout/GridPageLayout/GridPageLayout';\r\nimport { GridV2, IGridV2Column } from '../../../../layout/GridPageV2';\r\nimport { IRouterWithIntl, injectIntlWithObserver } from '../../../../utils/ReactUtils';\r\nimport { RouteName } from '../../@data';\r\nimport { getStore } from '../@data';\r\nimport { onAccountsFetched, onManagePageInitialized } from '../@data/actions';\r\nimport messages from './ManagePage.messages';\r\nimport { getCommandBarItems } from './utils/getCommandBarItems';\r\nimport { getGridColumns } from './utils/getGridColumns';\r\n\r\nexport const ManagePage = injectIntlWithObserver(function AccountManagePage(props: IRouterWithIntl) {\r\n const { publisher } = getAppStore();\r\n const { accounts, isLoading, isFetchingData } = getStore();\r\n const { formatMessage } = props.intl;\r\n const { windowStoreSerializer } = useWindowSize();\r\n const { isWindowRegularSize } = windowStoreSerializer(getWindowSizeStore());\r\n const gridDefaultColumns: IGridV2Column[] = getGridColumns(formatMessage, isWindowRegularSize, props.history);\r\n\r\n const NoResultComponent = (\r\n <ZeroResults\r\n showDefaultImage\r\n title={!!publisher ? formatMessage(messages.zeroResultTitle) : undefined}\r\n description={formatMessage(!!publisher ? messages.zeroResultDescription : messages.noPublisherSelected)}\r\n buttonText={!!publisher ? formatMessage(messages.create) : undefined}\r\n href={`${RouteName.account}/create`}\r\n />\r\n );\r\n\r\n useEffect(() => {\r\n onManagePageInitialized();\r\n // eslint-disable-next-line\r\n }, [publisher]);\r\n\r\n return (\r\n <GridPageLayout>\r\n <GridV2\r\n history={props.history}\r\n location={props.location}\r\n match={props.match}\r\n entity={Account}\r\n pageTitle={{ title: formatMessage(messages.accounts), helpId: 'pop_PCv4_Accounts' }}\r\n commandBarProps={getCommandBarItems()}\r\n dataGridProps={{\r\n gridV2Columns: gridDefaultColumns,\r\n data: publisher ? accounts || [] : [],\r\n setData: onAccountsFetched,\r\n shimmerLines: 10,\r\n renderZeroItemsComponent: NoResultComponent,\r\n }}\r\n isGridReady={!isLoading}\r\n isDataLoading={isFetchingData}\r\n paginationProps={{\r\n shouldGridHandlePagination: true,\r\n }}\r\n />\r\n </GridPageLayout>\r\n );\r\n});\r\n","import { CommandBarButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { Account, getAccessPermission, getAppStore } from '../../../../../@data';\r\nimport { hasUpdateAccess } from '../../../../../@data/services/UserRoleService';\r\nimport AppMessages from '../../../../../App.messages';\r\nimport { IGridV2Column } from '../../../../../layout/GridPageV2';\r\nimport messages from '../ManagePage.messages';\r\n\r\nexport function getGridColumns(formatMessage, isWindowRegularSize, routeHistory): IGridV2Column[] {\r\n const { publisher } = getAppStore();\r\n\r\n const columns: IGridV2Column[] = [\r\n {\r\n columnOrder: 1,\r\n key: 'name',\r\n fieldName: 'name',\r\n name: formatMessage(messages.name),\r\n minWidth: 200,\r\n maxWidth: 200,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n suppressSorting: false,\r\n },\r\n {\r\n columnOrder: 2,\r\n key: 'id',\r\n fieldName: 'id',\r\n name: formatMessage(messages.id),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n },\r\n {\r\n columnOrder: 3,\r\n key: 'number',\r\n fieldName: 'number',\r\n name: formatMessage(messages.number),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 4,\r\n key: 'status',\r\n fieldName: 'status',\r\n name: formatMessage(AppMessages.status),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 6,\r\n key: 'primaryContactUsername',\r\n fieldName: 'primaryContactUsername',\r\n name: formatMessage(messages.contact),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 7,\r\n key: 'createdDateTime',\r\n fieldName: 'createdDateTime',\r\n name: formatMessage(messages.createdDate),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 8,\r\n key: 'actions',\r\n name: formatMessage(messages.actions),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isPadded: true,\r\n isSearchable: true,\r\n isVisible: true,\r\n suppressSorting: true,\r\n onRender: (item: Account) => {\r\n const accessPermission = getAccessPermission(item);\r\n\r\n return (\r\n <CommandBarButton\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'edit' }}\r\n ariaLabel={formatMessage(AppMessages.edit)}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.edit) : ''}\r\n disabled={!hasUpdateAccess(accessPermission) || publisher === undefined}\r\n onClick={() => routeHistory.push(`/partner-management/${publisher?.id}/account/edit/${item.id}`)}\r\n />\r\n );\r\n },\r\n },\r\n ];\r\n\r\n return columns;\r\n}\r\n","import * as React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { Route, RouteComponentProps } from 'react-router-dom';\r\nimport { RoutePrefix } from '../../../Routes';\r\nimport { FormState } from '../../../components/Form';\r\nimport { RouteName } from '../@data';\r\nimport { onCurrentRouteChanged } from '../@data/actions';\r\nimport './@data/mutators';\r\nimport './@data/orchestrators';\r\nimport { CreateAccount } from './Create/CreateAccount';\r\nimport { ManagePage } from './Manage/ManagePage';\r\n\r\nexport const AccountPage = injectIntl(function AccountPageComponent({ match, intl }: RouteComponentProps & InjectedIntlProps): JSX.Element {\r\n React.useEffect(() => {\r\n onCurrentRouteChanged(RouteName.account, intl.formatMessage);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <React.Fragment>\r\n <Route exact path={`${match.url}`} component={ManagePage} />\r\n <Route\r\n path={`/${RoutePrefix.partnerManagement}/:publisherId/${RouteName[RouteName.account]}/create`}\r\n render={(props) => <CreateAccount {...props} mode={FormState.Create} />}\r\n />\r\n <Route\r\n path={`/${RoutePrefix.partnerManagement}/:publisherId/${RouteName[RouteName.account]}/edit/:accountId`}\r\n render={(props) => <CreateAccount {...props} mode={FormState.Edit} />}\r\n />\r\n </React.Fragment>\r\n );\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n title: {\r\n id: 'partnermanagement.title',\r\n defaultMessage: 'Partner Management Index',\r\n }\r\n});","import * as React from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport { IIndexPageProps } from './IndexPage.types';\r\n\r\nimport messages from './IndexPage.messages';\r\n\r\nexport const IndexPage = injectIntl(class extends React.Component<IIndexPageProps> {\r\n public render(): JSX.Element {\r\n return <h1>{this.props.intl.formatMessage(messages.title)}</h1>;\r\n }\r\n});","import { nullRender } from '@fluentui/react';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { getAppStore, onAccountChanged, onPublisherChanged, onPublisherSelected, Publisher } from '../../@data';\r\nimport { PublisherAccountPicker } from '../../layout/PublisherAccountPicker/PublisherAccountPicker';\r\nimport { defaultRoute, getPageStore, RouteName } from './@data';\r\nimport { IPartnerManagementHeaderProps } from './PartnerManagement.types';\r\n\r\nexport const PartnerManagementHeader = observer(\r\n class extends React.Component<IPartnerManagementHeaderProps> {\r\n public componentDidMount() {\r\n const defaultPublisherId = getAppStore().defaultPublisher;\r\n const publisherId = [0, 3000, 3001, 3002, 3003, 3004].includes(defaultPublisherId === undefined ? 0 : defaultPublisherId)\r\n ? this.props.match.params.publisherId\r\n : String(defaultPublisherId);\r\n onPublisherSelected(publisherId);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const appStore = getAppStore();\r\n const store = getPageStore();\r\n const accessiblePublishers = appStore.accessiblePublishers;\r\n\r\n if (store.loading) {\r\n return nullRender();\r\n }\r\n\r\n return (\r\n <PublisherAccountPicker\r\n {...this.props}\r\n onChange={this._onPublisherAccountChanged}\r\n publisher={appStore.publisher}\r\n isAccountHidden={this.props.isAccountHidden}\r\n isAccountSelectionDisabled={this.props.isAccountSelectionDisabled}\r\n isPublisherSelectionDisabled={accessiblePublishers && accessiblePublishers.length === 1}\r\n />\r\n );\r\n }\r\n\r\n private _onPublisherAccountChanged = (publisher?: Publisher) => {\r\n const store = getPageStore();\r\n const currentRoute = RouteName[store.currentRoute || defaultRoute];\r\n\r\n const publisherId = publisher ? publisher.id : 0;\r\n\r\n if (publisherId !== 0) {\r\n this.props.history.push(`/partner-management/${publisherId}/${currentRoute}`);\r\n } else {\r\n this.props.history.push(`/partner-management/${currentRoute}`);\r\n }\r\n onPublisherChanged(publisher);\r\n\r\n if (publisher === undefined) {\r\n // reset account in store. To avoid API calls with the account of old publisher\r\n onAccountChanged(undefined);\r\n }\r\n };\r\n }\r\n);\r\n","import { orchestrator } from 'satcheljs';\r\nimport { APP_NAME_NEW, PUBCENTER_TITLE } from '../../../../constants/AppConstants';\r\nimport { isLocationPubCenter } from '../../../../utils';\r\nimport { getRoutes } from '../../PartnerManagementRouter';\r\nimport { onCurrentRouteChanged } from '../actions';\r\n\r\norchestrator(onCurrentRouteChanged, ({ currentRoute, formatMessage }) => {\r\n const pageName = formatMessage ? getRoutes(formatMessage).find((route) => route.key === currentRoute)?.text : currentRoute.toString();\r\n const appName = isLocationPubCenter() ? PUBCENTER_TITLE : APP_NAME_NEW;\r\n document.title = `${appName} - ${pageName}`;\r\n});\r\n","import { action } from 'satcheljs';\r\nimport { IStringDictionary, Model, Publisher } from '../../../../../@data';\r\nimport { IPublisherViewModel } from '../store';\r\n\r\nexport const onRawChanged = action('onRawChanged', (value?: Publisher) => ({ value }));\r\n\r\nexport const onPublisherChanged = action('onPublisherChanged', (publisher: IPublisherViewModel) => ({ publisher }));\r\n\r\nexport const onPublisherErrorChanged = action('onPublisherErrorChanged', (values?: IStringDictionary) => ({ values }));\r\n\r\nexport const onFetchPublishersLoading = action('onFetchPublishersLoading', (isLoading: boolean) => ({ isLoading }));\r\n\r\nexport const onFetchingPublishersData = action('onFetchingPublishersData', (isFetchingData: boolean) => ({ isFetchingData }));\r\n\r\nexport const onPublishersFetched = action('onPublishersFetched', (items: Publisher[] | Model[]) => ({ items }));\r\n","import { createStore } from 'satcheljs';\r\nimport { IPublisherViewState } from './schema/IPublisherViewState';\r\n\r\nexport const getStore = createStore<IPublisherViewState>('PublisherState', {\r\n active: {},\r\n errors: {}\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { Publisher } from '../../../../../@data';\r\nimport { mergeTypeWithObject } from '../../../../../utils/ObjectUtils';\r\nimport {\r\n onFetchPublishersLoading,\r\n onFetchingPublishersData,\r\n onPublisherChanged,\r\n onPublisherErrorChanged,\r\n onPublishersFetched,\r\n onRawChanged,\r\n} from '../actions/onPublisherChanged';\r\nimport { getStore } from '../store/store';\r\n\r\nmutator(onRawChanged, (msg) => {\r\n getStore().raw = mergeTypeWithObject(new Publisher(), msg.value);\r\n});\r\n\r\nmutator(onPublisherChanged, (msg) => {\r\n getStore().active = msg.publisher;\r\n});\r\n\r\nmutator(onPublisherErrorChanged, (msg) => {\r\n getStore().errors = msg.values || {};\r\n});\r\n\r\nmutator(onFetchPublishersLoading, (msg) => {\r\n getStore().isLoading = msg.isLoading;\r\n});\r\n\r\nmutator(onFetchingPublishersData, (msg) => {\r\n getStore().isFetchingData = msg.isFetchingData;\r\n});\r\n\r\nmutator(onPublishersFetched, (msg) => {\r\n getStore().publishers = msg.items;\r\n});\r\n","import { action } from 'satcheljs';\r\n\r\nexport const onManagePageInitialized = action('onManagePageInitialized');\r\n","import { IChoiceGroupOption, IComboBoxOption, IDropdownOption } from '@fluentui/react';\r\nimport { History } from 'history';\r\nimport { action } from 'satcheljs';\r\nimport { IPRange, ISubGeography, PublisherCreate } from '../../../../../@data';\r\nimport { FormState } from '../../../../../components/Form';\r\n\r\nexport const onFormPublisherPartnerChanged = action('onFormPublisherPartnerChanged', (value: IDropdownOption) => ({ value }));\r\n\r\nexport const onFormIdChanged = action('onFormIdChanged', (value: number) => ({ value }));\r\n\r\nexport const onFormPublisherNameChanged = action('onFormPublisherNameChanged', (value?: string) => ({ value }));\r\n\r\nexport const onFormPublisherNetworkChanged = action('onFormPublisherNetworkChanged', (value: IChoiceGroupOption) => ({ value }));\r\n\r\nexport const onFormPublisherAddressLine1Changed = action('onFormPublisherAddressLine1Changed', (value?: string) => ({ value }));\r\n\r\nexport const onFormPublisherAddressLine2Changed = action('onFormPublisherAddressLine2Changed', (value?: string) => ({ value }));\r\n\r\nexport const onFormPublisherAddressCityChanged = action('onFormPublisherAddressCityChanged', (value?: string) => ({ value }));\r\n\r\nexport const onFormPublisherAddressCountryChanged = action('onFormPublisherAddressCountryChanged', (value?: IComboBoxOption) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherAddressCountryCodeChanged = action('onFormPublisherAddressCountryCodeChanged', (value?: IComboBoxOption) => {\r\n return {\r\n value,\r\n };\r\n});\r\n\r\nexport const onFormPublisherAddressStateChanged = action('onFormPublisherAddressStateChanged', (value?: IDropdownOption) => ({ value }));\r\n\r\nexport const onFormPublisherAddressStateListsChanged = action('onFormPublisherAddressStateListsChanged', (value?: ISubGeography[]) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherAddressZipcodeChanged = action('onFormPublisherAddressZipcodeChanged', (value?: string) => ({ value }));\r\n\r\nexport const onFormPublisherTierChanged = action('onFormPublisherTierChanged', (value: IDropdownOption) => ({ value }));\r\n\r\nexport const onFormPublisherOverrideTierChanged = action('onFormPublisherOverrideTierChanged', (value: IDropdownOption) => ({ value }));\r\n\r\nexport const onFormPublisherEntityLimitTierChanged = action('onFormPublisherEntityLimitTierChanged', (value: IDropdownOption) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherServiceLevelChanged = action('onFormPublisherServiceLevelChanged', (value: IDropdownOption) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherWebAdunitsChanged = action('onFormPublisherWebAdunitsChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherMobileSearchChanged = action('onFormPublisherMobileSearchChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherDistributionChanged = action('onFormPublisherDistributionChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherDistributionV2Changed = action('onFormPublisherDistributionV2Changed', (value?: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherStartDistributionChanged = action('onFormPublisherStartDistributionChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherStartDistributionContentChanged = action(\r\n 'onFormPublisherStartDistributionContentChanged',\r\n (value?: boolean) => ({\r\n value,\r\n })\r\n);\r\n\r\nexport const onFormPublisherSelectTierChanged = action('onFormPublisherSelectTierChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherMediationChanged = action('onFormPublisherMediationChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherNativeChanged = action('onFormPublisherNativeChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherSyndicationChanged = action('onFormPublisherSyndicationChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherPropertyAutoChanged = action('onFormPublisherPropertyAutoChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\nexport const onFormPublisherPSReportingAPIChanged = action('onFormPublisherPSReportingAPIChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\nexport const onFormPublisherPSDashboardChanged = action('onFormPublisherPSDashboardChanged', (value?: boolean) => ({\r\n value,\r\n}));\r\nexport const onFormPublisherEnableDefaultTythonV2Changed = action('onFormPublisherEnableDefaultTythonV2Changed', (value?: boolean) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherDynamicPropertyRegistrationChanged = action(\r\n 'onFormPublisherDynamicPropertyRegistrationChanged',\r\n (value?: boolean) => ({\r\n value,\r\n })\r\n);\r\n\r\nexport const onFormPublisherIpNameChanged = action('onFormPublisherIpNameChanged', (value?: string) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherMinimumIpChanged = action('onFormPublisherMinimumIpChanged', (value?: string) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherMaximumIpChanged = action('onFormPublisherMaximumIpChanged', (value?: string) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherIpChanged = action('onFormPublisherIpChanged', (value: IPRange[], mode: FormState) => ({\r\n value,\r\n mode,\r\n}));\r\n\r\nexport const onFormPublisherIpRangesChanged = action('onFormPublisherIpRangesChanged', (value?: IPRange[]) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherAccountName = action('onFormPublisherAccountName', (value: string) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherAccountLanguage = action('onFormPublisherAccountLanguage', (value: IDropdownOption) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherAccountCountry = action('onFormPublisherAccountCountry', (value: IDropdownOption) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormPublisherAccountCurrency = action('onFormPublisherAccountCurrency', (value?: string) => ({ value }));\r\n\r\nexport const onFormPublisherAccountTimezoneChanged = action('onFormPublisherAccountTimezoneChanged', (value?: IDropdownOption) => ({\r\n value,\r\n}));\r\n\r\nexport const onFormInitialized = action('onFormInitialized', (mode: FormState, publisherId?: string, entityId?: string) => ({\r\n mode,\r\n publisherId,\r\n entityId,\r\n}));\r\n\r\nexport const onFormEditted = action('onFormEditted', (routeHistory?: History) => ({ routeHistory }));\r\n\r\nexport const onFormCancelled = action('onFormCancelled');\r\n\r\nexport const onFormCleared = action('onFormCleared');\r\n\r\nexport const onFormCreated = action('onFormCreated', (routeHistory?: History) => ({ routeHistory }));\r\n\r\nexport const onPanelCleared = action('onPanelCleared');\r\n\r\nexport const onPublisherCreated = action('onPublisherCreated', (publisher: PublisherCreate) => ({ publisher }));\r\n","import { mutator } from 'satcheljs';\r\nimport { EntityLimitTier, FeatureOverideTier, NetworkAffiliation, Partner, PublisherTier, ServiceLevel } from '../../../../../@data';\r\nimport { countryToCurrencyMap } from '../../../../../config/countryToCurrencyMapper.config';\r\nimport {\r\n onFormCleared,\r\n onFormIdChanged,\r\n onFormPublisherAccountCountry,\r\n onFormPublisherAccountLanguage,\r\n onFormPublisherAccountName,\r\n onFormPublisherAccountTimezoneChanged,\r\n onFormPublisherAddressCityChanged,\r\n onFormPublisherAddressCountryChanged,\r\n onFormPublisherAddressLine1Changed,\r\n onFormPublisherAddressLine2Changed,\r\n onFormPublisherAddressStateChanged,\r\n onFormPublisherAddressStateListsChanged,\r\n onFormPublisherAddressZipcodeChanged,\r\n onFormPublisherDistributionChanged,\r\n onFormPublisherDistributionV2Changed,\r\n onFormPublisherDynamicPropertyRegistrationChanged,\r\n onFormPublisherEnableDefaultTythonV2Changed,\r\n onFormPublisherEntityLimitTierChanged,\r\n onFormPublisherIpNameChanged,\r\n onFormPublisherIpRangesChanged,\r\n onFormPublisherMaximumIpChanged,\r\n onFormPublisherMediationChanged,\r\n onFormPublisherMinimumIpChanged,\r\n onFormPublisherMobileSearchChanged,\r\n onFormPublisherNameChanged,\r\n onFormPublisherNativeChanged,\r\n onFormPublisherNetworkChanged,\r\n onFormPublisherOverrideTierChanged,\r\n onFormPublisherPSDashboardChanged,\r\n onFormPublisherPSReportingAPIChanged,\r\n onFormPublisherPartnerChanged,\r\n onFormPublisherPropertyAutoChanged,\r\n onFormPublisherSelectTierChanged,\r\n onFormPublisherServiceLevelChanged,\r\n onFormPublisherStartDistributionChanged,\r\n onFormPublisherStartDistributionContentChanged,\r\n onFormPublisherSyndicationChanged,\r\n onFormPublisherTierChanged,\r\n onFormPublisherWebAdunitsChanged,\r\n onPanelCleared,\r\n} from '../actions';\r\nimport { getStore } from '../store/store';\r\n\r\nmutator(onFormPublisherPartnerChanged, (msg) => {\r\n getStore().active.partner = msg.value.key as Partner;\r\n});\r\n\r\nmutator(onFormIdChanged, (msg) => {\r\n getStore().active.id = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherNameChanged, (msg) => {\r\n getStore().active.name = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherNetworkChanged, (msg) => {\r\n getStore().active.networkAffiliation = msg.value.key as NetworkAffiliation;\r\n});\r\n\r\nmutator(onFormPublisherAddressLine1Changed, (msg) => {\r\n getStore().active.addressLine1 = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherAddressLine2Changed, (msg) => {\r\n getStore().active.addressLine2 = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherAddressCityChanged, (msg) => {\r\n getStore().active.city = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherAddressCountryChanged, (msg) => {\r\n getStore().active.country = msg.value!.key as string;\r\n});\r\n\r\nmutator(onFormPublisherAddressStateChanged, (msg) => {\r\n getStore().active.state = msg.value!.key as string;\r\n});\r\n\r\nmutator(onFormPublisherAddressStateListsChanged, (msg) => {\r\n getStore().active.availableStates = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherAddressZipcodeChanged, (msg) => {\r\n getStore().active.postalcode = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherTierChanged, (msg) => {\r\n getStore().active.publisherTier = msg.value.key as PublisherTier;\r\n});\r\n\r\nmutator(onFormPublisherOverrideTierChanged, (msg) => {\r\n getStore().active.overrideFeatureTier = msg.value.key as FeatureOverideTier;\r\n});\r\n\r\nmutator(onFormPublisherEntityLimitTierChanged, (msg) => {\r\n getStore().active.entityLimitTier = msg.value.key as EntityLimitTier;\r\n});\r\n\r\nmutator(onFormPublisherServiceLevelChanged, (msg) => {\r\n getStore().active.serviceLevel = msg.value.key as ServiceLevel;\r\n});\r\n\r\nmutator(onFormPublisherWebAdunitsChanged, (msg) => {\r\n getStore().active.allowWebAdUnit = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherMobileSearchChanged, (msg) => {\r\n getStore().active.allowMobileSearchAdUnit = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherDistributionChanged, (msg) => {\r\n getStore().active.allowDistributionReporting = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherDistributionV2Changed, (msg) => {\r\n getStore().active.allowDistributionV2Reporting = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherStartDistributionChanged, (msg) => {\r\n getStore().active.allowStartDistributionReporting = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherStartDistributionContentChanged, (msg) => {\r\n getStore().active.allowStartDistributionContentReporting = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherEnableDefaultTythonV2Changed, (msg) => {\r\n getStore().active.enableDefaultTythonV2Reporting = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherSelectTierChanged, (msg) => {\r\n getStore().active.allowSelectTierReporting = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherMediationChanged, (msg) => {\r\n getStore().active.allowMediationReporting = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherNativeChanged, (msg) => {\r\n getStore().active.allowNativeReporting = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherSyndicationChanged, (msg) => {\r\n getStore().active.allowSyndicationReporting = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherPropertyAutoChanged, (msg) => {\r\n getStore().active.propertyAutoApproved = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherPSReportingAPIChanged, (msg) => {\r\n getStore().active.allowPaidSearchReportingApi = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherPSDashboardChanged, (msg) => {\r\n getStore().active.allowPaidSearchReportingDashboard = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherDynamicPropertyRegistrationChanged, (msg) => {\r\n getStore().active.allowDynamicPropertyRegistration = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherIpNameChanged, (msg) => {\r\n getStore().active.ipAddressName = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherMinimumIpChanged, (msg) => {\r\n getStore().active.minIPAddress = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherMaximumIpChanged, (msg) => {\r\n getStore().active.maxIPAddress = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherIpRangesChanged, (msg) => {\r\n getStore().active.ipAddressGrid = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherAccountName, (msg) => {\r\n getStore().active.accountName = msg.value;\r\n});\r\n\r\nmutator(onFormPublisherAccountLanguage, (msg) => {\r\n getStore().active.accountLanguage = msg.value.key as string;\r\n});\r\n\r\nmutator(onFormPublisherAccountTimezoneChanged, (msg) => {\r\n getStore().active.accountTimezoneId = msg.value!.key as number;\r\n});\r\n\r\nmutator(onFormPublisherAccountCountry, (msg) => {\r\n getStore().active.accountCountry = msg.value.key as string;\r\n getStore().active.accountCurrency = countryToCurrencyMap[msg.value.key as string];\r\n});\r\n\r\nmutator(onFormCleared, () => {\r\n getStore().active = {};\r\n});\r\n\r\nmutator(onPanelCleared, () => {\r\n getStore().active.ipAddressName = undefined;\r\n getStore().active.maxIPAddress = undefined;\r\n getStore().active.minIPAddress = undefined;\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { ISubGeography } from '../../../../../@data';\r\nimport { getSupportedSubGeographies } from '../../../../../@data/services/MetadataService';\r\nimport {\r\n onFormPublisherAddressCountryChanged,\r\n onFormPublisherAddressCountryCodeChanged,\r\n onFormPublisherAddressStateListsChanged\r\n} from '../actions';\r\n\r\norchestrator(onFormPublisherAddressCountryCodeChanged, async msg => {\r\n onFormPublisherAddressCountryChanged(msg.value);\r\n let availableStateList: ISubGeography[] = [];\r\n if (msg.value) {\r\n availableStateList = await getSupportedSubGeographies(msg.value.key as string);\r\n }\r\n onFormPublisherAddressStateListsChanged(availableStateList);\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { onFormCancelled, onFormCleared } from '../actions';\r\n\r\norchestrator(onFormCancelled, () => {\r\n onFormCleared();\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport {\r\n Account,\r\n AccountProfileFeature,\r\n EntityLimitTier,\r\n FeatureOverideTier,\r\n getAppStore,\r\n IAddress,\r\n LifeCycleStatus,\r\n onNavigateBack,\r\n onNotificationChanged,\r\n onSavingChanged,\r\n PaymentInstrumentLifeCycleStatus,\r\n PaymentOption,\r\n postEntity,\r\n Publisher,\r\n PublisherCreate,\r\n PublisherTier,\r\n ServiceLevel,\r\n} from '../../../../../@data';\r\nimport { AdExtensionType } from '../../../../../@data/store/schema/enums/AdExtensionType';\r\nimport { FinancialStatus } from '../../../../../@data/store/schema/enums/FinancialStatus';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport { countryToCurrencyMap } from '../../../../../config/countryToCurrencyMapper.config';\r\nimport { validateSchema } from '../../../../../utils';\r\nimport { RouteName } from '../../../@data';\r\nimport { createReturnUrl, setPublisherContext } from '../../../@data/service/PartnerManagementService';\r\nimport { onFormCleared, onFormCreated, onFormIdChanged, onPublisherCreated, onPublisherErrorChanged } from '../actions';\r\nimport { getStore, publisherCreateErrorModel } from '../store';\r\n\r\norchestrator(onFormCreated, async (msg) => {\r\n const { userContext } = getAppStore();\r\n const { active } = getStore();\r\n\r\n let notification: INotificationBarItem = {};\r\n\r\n const publisherBody = new PublisherCreate();\r\n\r\n const accountBody = new Account();\r\n\r\n try {\r\n await validateSchema(publisherCreateErrorModel(), active);\r\n onPublisherErrorChanged();\r\n } catch (e) {\r\n onPublisherErrorChanged(e);\r\n onNotificationChanged({\r\n text: `Publisher - You have ${Object.keys(e).length} errors in the form, please fix them to continue.`,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n return;\r\n }\r\n\r\n onSavingChanged(true);\r\n\r\n const address: IAddress = {\r\n line1: active.addressLine1,\r\n line2: active.addressLine2,\r\n city: active.city,\r\n country: active.country,\r\n stateOrProvince: active.state,\r\n postalCode: active.postalcode,\r\n };\r\n\r\n publisherBody.partner = active.partner;\r\n publisherBody.networkAffiliation = active.networkAffiliation;\r\n publisherBody.address = address;\r\n publisherBody.name = active.name;\r\n\r\n publisherBody.publisherTier = PublisherTier.ManagedPremium;\r\n publisherBody.overrideFeatureTier = FeatureOverideTier.ManagedPremium;\r\n publisherBody.entityLimitTier = EntityLimitTier.Small;\r\n publisherBody.serviceLevel = ServiceLevel.Premium;\r\n publisherBody.allowWebAdUnit = true;\r\n publisherBody.allowNativeReporting = true;\r\n publisherBody.allowSyndicationReporting = true;\r\n publisherBody.allowDistributionReporting = false;\r\n publisherBody.allowDistributionV2Reporting = true;\r\n publisherBody.allowStartDistributionReporting = false;\r\n publisherBody.allowStartDistributionContentReporting = false;\r\n publisherBody.allowSelectTierReporting = false;\r\n publisherBody.allowMediationReporting = false;\r\n publisherBody.allowPaidSearchReportingDashboard = true;\r\n publisherBody.allowPaidSearchReportingApi = false;\r\n publisherBody.enableDefaultTythonV2Reporting = false;\r\n publisherBody.propertyAutoApproved = true;\r\n publisherBody.financialStatus = FinancialStatus.NoHold;\r\n\r\n accountBody.name = active.accountName;\r\n accountBody.languageCode = active.accountLanguage;\r\n accountBody.countryCode = active.accountCountry;\r\n accountBody.timeZoneId = active.accountTimezoneId;\r\n accountBody.currencyCode = countryToCurrencyMap[active.accountCountry!];\r\n accountBody.status = LifeCycleStatus.Active;\r\n accountBody.primaryContactUserId = userContext!.id;\r\n accountBody.primaryContactUsername = userContext!.email;\r\n accountBody.enabledFeatures = [AccountProfileFeature.EnableGlobalDefaultKeywords, AccountProfileFeature.EnablePassedKeywords];\r\n accountBody.adExtensionOptions = [\r\n {\r\n type: AdExtensionType.Call,\r\n enabled: true,\r\n },\r\n {\r\n type: AdExtensionType.SiteLink,\r\n enabled: true,\r\n },\r\n {\r\n type: AdExtensionType.Location,\r\n enabled: true,\r\n },\r\n {\r\n type: AdExtensionType.MeteredCall,\r\n enabled: true,\r\n },\r\n {\r\n type: AdExtensionType.MerchantRatings,\r\n enabled: true,\r\n },\r\n ];\r\n accountBody.paymentInformation = {\r\n financialStatus: FinancialStatus.TaxOnHold,\r\n revenueSharePercentage: 100,\r\n paymentOption: PaymentOption.MonthlyThreshold,\r\n paymentInstrumentationLifeCycleStatus: PaymentInstrumentLifeCycleStatus.Validated,\r\n operationCostRatio: 0,\r\n };\r\n\r\n try {\r\n let publisherEntity: PublisherCreate | undefined;\r\n let publisher: Publisher | undefined;\r\n let accountEntity: Account | undefined;\r\n\r\n publisherEntity = await postEntity([], PublisherCreate, publisherBody, userContext);\r\n\r\n // NOTE: This action is a no-op for now but future side-effects should be handled by the orchestrator/mutator of this action separately.\r\n onPublisherCreated(publisherEntity);\r\n publisher = new Publisher();\r\n publisher.id = publisherEntity.id;\r\n accountEntity = await postEntity([publisher], Account, accountBody, userContext);\r\n\r\n if (publisherEntity && publisherEntity.id && accountEntity) {\r\n onFormIdChanged(publisherEntity.id);\r\n }\r\n notification = {\r\n text: `Created new publisher success`,\r\n messageBarType: MessageBarType.success,\r\n };\r\n\r\n // return to manage page\r\n setPublisherContext(publisher);\r\n const returnUrl = createReturnUrl(RouteName.publisher, String(publisherEntity.id));\r\n onNavigateBack(msg.routeHistory, returnUrl);\r\n onFormCleared();\r\n } catch (e) {\r\n notification = {\r\n text: `Submitting the publisher form create caught an error \"${e}\"`,\r\n messageBarType: MessageBarType.error,\r\n };\r\n } finally {\r\n onSavingChanged(false);\r\n }\r\n\r\n onNotificationChanged(notification);\r\n});\r\n","import { mixed, object, string } from 'yup';\r\nimport { NetworkAffiliation } from '../../../../../../@data';\r\nimport { IPublisherViewModel } from './IPublisherViewModel';\r\n\r\nexport function publisherCreateErrorModel() {\r\n return object<IPublisherViewModel>().shape({\r\n name: string()\r\n .trim()\r\n .required(),\r\n partner: string().required(),\r\n networkAffiliation: mixed()\r\n .oneOf([NetworkAffiliation.Syndicated, NetworkAffiliation.OwnedAndOperated])\r\n .required(),\r\n addressLine1: string().required(),\r\n addressLine2: string(),\r\n city: string().required(),\r\n state: string().required(),\r\n country: string().required(),\r\n accountName: string()\r\n .required()\r\n .min(3)\r\n .max(100),\r\n accountLanguage: string().required(),\r\n accountCountry: string().required(),\r\n accountCurrency: string().required()\r\n });\r\n}\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { getAppStore, IAddress, onNavigateBack, onNotificationChanged, onSavingChanged, Publisher, putEntity } from '../../../../../@data';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport { validateSchema } from '../../../../../utils';\r\nimport { RouteName } from '../../../@data';\r\nimport { createReturnUrl } from '../../../@data/service/PartnerManagementService';\r\nimport { onFormCleared, onFormEditted, onPublisherErrorChanged } from '../actions';\r\nimport { getStore, publisherEditErrorModel } from '../store';\r\n\r\norchestrator(onFormEditted, async (msg) => {\r\n const { publisher, userContext } = getAppStore();\r\n const { active, raw } = getStore();\r\n\r\n let notification: INotificationBarItem = {};\r\n\r\n if (publisher && raw) {\r\n const body: Publisher = {\r\n ...raw,\r\n id: active.id,\r\n name: active.name,\r\n };\r\n try {\r\n await validateSchema(publisherEditErrorModel(), active);\r\n onPublisherErrorChanged();\r\n } catch (e) {\r\n onPublisherErrorChanged(e);\r\n onNotificationChanged({\r\n text: `Publisher - You have ${Object.keys(e).length} errors in the form, please fix them to continue.`,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n return;\r\n }\r\n\r\n onSavingChanged(true);\r\n\r\n const address: IAddress = {\r\n ...raw.address,\r\n line1: active.addressLine1,\r\n line2: active.addressLine2,\r\n city: active.city,\r\n country: active.country,\r\n stateOrProvince: active.state,\r\n postalCode: active.postalcode,\r\n };\r\n\r\n body.partner = active.partner;\r\n body.networkAffiliation = active.networkAffiliation;\r\n body.address = address;\r\n body.publisherTier = active.publisherTier;\r\n body.overrideFeatureTier = active.overrideFeatureTier;\r\n body.entityLimitTier = active.entityLimitTier;\r\n body.serviceLevel = active.serviceLevel;\r\n body.allowWebAdUnit = active.allowWebAdUnit;\r\n body.allowMobileSearchAdUnit = active.allowMobileSearchAdUnit;\r\n body.allowDistributionReporting = active.allowDistributionReporting;\r\n body.allowDistributionV2Reporting = active.allowDistributionV2Reporting;\r\n body.allowStartDistributionReporting = active.allowStartDistributionReporting;\r\n body.allowStartDistributionContentReporting = active.allowStartDistributionContentReporting;\r\n body.allowEndorReporting = active.allowSelectTierReporting;\r\n body.allowMediationReporting = active.allowMediationReporting;\r\n body.allowNativeReporting = active.allowNativeReporting;\r\n body.allowSyndicationReporting = active.allowSyndicationReporting;\r\n body.propertyAutoApproved = active.propertyAutoApproved;\r\n body.allowPaidSearchReportingApi = active.allowPaidSearchReportingApi;\r\n body.allowPaidSearchReportingDashboard = active.allowPaidSearchReportingDashboard;\r\n body.allowDynamicPropertyRegistration = active.allowDynamicPropertyRegistration;\r\n body.enableDefaultTythonV2Reporting = active.enableDefaultTythonV2Reporting;\r\n body.ipRanges = active.ipAddressGrid;\r\n body.financialStatus = active.financialStatus;\r\n body.allowedMarkets = active.allowedMarkets;\r\n try {\r\n let entity: Publisher | undefined;\r\n\r\n entity = await putEntity<Publisher>([publisher], body, userContext);\r\n\r\n notification = {\r\n text: `Edited publisher ${entity.id} success`,\r\n messageBarType: MessageBarType.success,\r\n };\r\n\r\n // return to manage page\r\n const returnUrl = createReturnUrl(RouteName.publisher, String(publisher.id));\r\n onNavigateBack(msg.routeHistory, returnUrl);\r\n onFormCleared();\r\n } catch (e) {\r\n notification = {\r\n text: `Submitting the publisher form edit caught an error \"${e}\"`,\r\n messageBarType: MessageBarType.error,\r\n };\r\n } finally {\r\n onSavingChanged(false);\r\n }\r\n } else {\r\n notification = {\r\n text: `Publisher form edit is invalid id ${active.id}`,\r\n messageBarType: MessageBarType.warning,\r\n };\r\n }\r\n onNotificationChanged(notification);\r\n});\r\n","import { mixed, object, string } from 'yup';\r\nimport { NetworkAffiliation } from '../../../../../../@data';\r\nimport { IPublisherViewModel } from './IPublisherViewModel';\r\n\r\nexport function publisherEditErrorModel() {\r\n return object<IPublisherViewModel>().shape({\r\n name: string()\r\n .trim()\r\n .required(),\r\n partner: string().required(),\r\n networkAffiliation: mixed()\r\n .oneOf([NetworkAffiliation.Syndicated, NetworkAffiliation.OwnedAndOperated])\r\n .required(),\r\n addressLine1: string().required(),\r\n addressLine2: string(),\r\n city: string().required(),\r\n state: string().required(),\r\n country: string().required()\r\n });\r\n}\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport {\r\n getEntity,\r\n ISubGeography,\r\n NetworkAffiliation,\r\n onLoadingChanged,\r\n onLoadingSetting,\r\n onLoadingWaiting,\r\n onNotificationChanged,\r\n Partner,\r\n Publisher,\r\n} from '../../../../../@data';\r\nimport {\r\n getSupportedCountries,\r\n getSupportedLanguages,\r\n getSupportedSubGeographies,\r\n getSupportedTimezones,\r\n} from '../../../../../@data/services/MetadataService';\r\nimport { getAppStore } from '../../../../../@data/store/store';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { setPublisherContext } from '../../../@data/service/PartnerManagementService';\r\nimport { onFormInitialized, onPublisherChanged, onPublisherErrorChanged, onRawChanged } from '../actions';\r\nimport '../mutators/PublisherChanged';\r\nimport { IPublisherViewModel } from '../store/schema/IPublisherViewModel';\r\n\r\norchestrator(onFormInitialized, async (msg) => {\r\n const { userContext } = getAppStore();\r\n\r\n try {\r\n onLoadingChanged(true);\r\n onLoadingSetting(false);\r\n const timeout = 30000;\r\n const id = setTimeout(() => onLoadingWaiting(true), timeout);\r\n\r\n const metadata = await Promise.all([\r\n getSupportedSubGeographies('US'),\r\n getSupportedCountries(),\r\n getSupportedLanguages(),\r\n getSupportedTimezones(),\r\n ]);\r\n\r\n clearTimeout(id);\r\n\r\n const defaultUSStates = metadata[0];\r\n const viewModel: IPublisherViewModel = {\r\n availableCountries: metadata[1],\r\n accountAvailableLanguages: metadata[2],\r\n availableTimezones: metadata[3],\r\n partner: Partner.Yahoo,\r\n country: 'US',\r\n availableStates: defaultUSStates,\r\n state: 'AL',\r\n networkAffiliation: NetworkAffiliation.OwnedAndOperated,\r\n accountLanguage: 'EN',\r\n accountCountry: 'US',\r\n accountCurrency: 'USD',\r\n accountTimezoneId: 75,\r\n };\r\n\r\n if (msg.entityId && !isNaN(parseInt(msg.entityId, 10))) {\r\n const publisher = new Publisher(parseInt(msg.entityId, 10));\r\n\r\n setPublisherContext(publisher);\r\n onPublisherErrorChanged();\r\n\r\n if (msg.mode === FormState.Edit) {\r\n const raw = await getEntity<Publisher>([publisher], userContext);\r\n\r\n let availableStates: ISubGeography[] = [];\r\n\r\n if (raw.address && raw.address.country) {\r\n availableStates = await getSupportedSubGeographies(raw.address.country);\r\n }\r\n\r\n viewModel.partner = raw.partner;\r\n viewModel.id = raw.id;\r\n viewModel.name = String(raw.name);\r\n viewModel.networkAffiliation = raw.networkAffiliation;\r\n viewModel.addressLine1 = raw.address ? raw.address.line1 : '';\r\n viewModel.addressLine2 = raw.address ? raw.address.line2 : '';\r\n viewModel.city = raw.address ? raw.address.city : '';\r\n viewModel.state = raw.address ? raw.address.stateOrProvince : '';\r\n viewModel.availableStates = availableStates;\r\n viewModel.country = raw.address ? raw.address.country : '';\r\n viewModel.postalcode = raw.address ? raw.address.postalCode : '';\r\n viewModel.publisherTier = raw.publisherTier;\r\n viewModel.overrideFeatureTier = raw.overrideFeatureTier;\r\n viewModel.entityLimitTier = raw.entityLimitTier;\r\n viewModel.serviceLevel = raw.serviceLevel;\r\n viewModel.allowWebAdUnit = raw.allowWebAdUnit;\r\n viewModel.allowMobileSearchAdUnit = raw.allowMobileSearchAdUnit;\r\n viewModel.allowDistributionReporting = raw.allowDistributionReporting;\r\n viewModel.allowDistributionV2Reporting = raw.allowDistributionV2Reporting;\r\n viewModel.allowStartDistributionReporting = raw.allowStartDistributionReporting;\r\n viewModel.allowStartDistributionContentReporting = raw.allowStartDistributionContentReporting;\r\n viewModel.allowSelectTierReporting = raw.allowEndorReporting;\r\n viewModel.allowMediationReporting = raw.allowMediationReporting;\r\n viewModel.allowNativeReporting = raw.allowNativeReporting;\r\n viewModel.allowSyndicationReporting = raw.allowSyndicationReporting;\r\n viewModel.propertyAutoApproved = raw.propertyAutoApproved;\r\n viewModel.allowPaidSearchReportingApi = raw.allowPaidSearchReportingApi;\r\n viewModel.allowPaidSearchReportingDashboard = raw.allowPaidSearchReportingDashboard;\r\n viewModel.allowDynamicPropertyRegistration = raw.allowDynamicPropertyRegistration;\r\n viewModel.enableDefaultTythonV2Reporting = raw.enableDefaultTythonV2Reporting;\r\n viewModel.ipAddressGrid = raw.ipRanges;\r\n viewModel.financialStatus = raw.financialStatus;\r\n viewModel.allowedMarkets = raw.allowedMarkets;\r\n\r\n onRawChanged(raw);\r\n } else {\r\n onRawChanged();\r\n }\r\n }\r\n\r\n onPublisherChanged(viewModel);\r\n } catch (e) {\r\n onNotificationChanged({\r\n text: 'Failed to load entity',\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { IPRange } from '../../../../../@data';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { validateSchema } from '../../../../../utils';\r\nimport { onPanelOpenChanged } from '../../../@data/actions';\r\nimport { onFormPublisherIpChanged, onFormPublisherIpRangesChanged, onPanelCleared, onPublisherErrorChanged } from '../actions';\r\nimport { getStore, publisherIPAddressViewModel } from '../store';\r\n\r\norchestrator(onFormPublisherIpChanged, async (msg) => {\r\n const { active } = getStore();\r\n const newIpRangeGrid: IPRange[] = [];\r\n const newIpAddress = new IPRange();\r\n newIpAddress.name = active.ipAddressName;\r\n newIpAddress.minIPAddress = active.minIPAddress;\r\n newIpAddress.maxIPAddress = active.maxIPAddress;\r\n\r\n try {\r\n await validateSchema(publisherIPAddressViewModel(), active);\r\n onPublisherErrorChanged();\r\n } catch (e) {\r\n onPublisherErrorChanged(e);\r\n return;\r\n }\r\n\r\n if (msg.mode === FormState.Delete || msg.mode === FormState.InPageEdit) {\r\n active.ipAddressGrid!!.forEach((ip) => {\r\n if (ip.name !== msg.value[0].name) {\r\n newIpRangeGrid.push(ip);\r\n }\r\n });\r\n } else {\r\n if (active.ipAddressGrid) {\r\n active.ipAddressGrid.forEach((i) => newIpRangeGrid.push(i));\r\n }\r\n }\r\n\r\n if (msg.mode !== FormState.Delete) {\r\n newIpRangeGrid.push(newIpAddress);\r\n }\r\n\r\n onFormPublisherIpRangesChanged(newIpRangeGrid);\r\n onPanelOpenChanged(false);\r\n onPanelCleared();\r\n});\r\n","import { object, string } from 'yup';\r\nimport { IPublisherViewModel } from './IPublisherViewModel';\r\n\r\nexport function publisherIPAddressViewModel() {\r\n return object<IPublisherViewModel>().shape({\r\n ipAddressName: string().trim().required(),\r\n minIPAddress: string().trim().required(),\r\n maxIPAddress: string().trim().required(),\r\n });\r\n}\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { getAppStore, getEntity, onNotificationChanged, Publisher } from '../../../../../@data';\r\nimport { onFetchingPublishersData, onFetchPublishersLoading, onPublishersFetched } from '../actions';\r\nimport { onManagePageInitialized } from '../actions/onManagePageInitialized';\r\nimport { getStore } from '../store';\r\n\r\norchestrator(onManagePageInitialized, async () => {\r\n try {\r\n const { publisher, userContext } = getAppStore();\r\n const publishers = getStore().publishers;\r\n\r\n if (publishers === undefined || publishers.length === 0) {\r\n onFetchPublishersLoading(true);\r\n }\r\n onFetchingPublishersData(true);\r\n\r\n if (userContext && publisher) {\r\n const data = await getEntity([publisher], userContext);\r\n const fetchedPublisher: Publisher = {\r\n apiPath: undefined,\r\n className: 'publishers',\r\n id: data.id,\r\n name: data.name?.toString(),\r\n status: data.status,\r\n };\r\n onPublishersFetched([fetchedPublisher]);\r\n } else {\r\n onPublishersFetched([]);\r\n }\r\n } catch (error) {\r\n Log.error(error);\r\n onNotificationChanged({ messageBarType: MessageBarType.error, text: 'Failed to load publishers' });\r\n } finally {\r\n onFetchPublishersLoading(false);\r\n onFetchingPublishersData(false);\r\n }\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n createPageTitle: {\r\n id: 'partnermanagement.publisher.createPageTitle',\r\n defaultMessage: 'Create publisher',\r\n },\r\n editPageTitle: {\r\n id: 'partnermanagement.publisher.editPageTitle',\r\n defaultMessage: 'Edit publisher',\r\n },\r\n updatePublisher: {\r\n id: 'partnermanagement.publisher.updatePublisher',\r\n defaultMessage: 'Update publisher',\r\n },\r\n partner: {\r\n id: 'partnermanagement.publisher.partner',\r\n defaultMessage: 'Partner',\r\n },\r\n publisherName: {\r\n id: 'partnermanagement.publisher.publisherName',\r\n defaultMessage: 'Publisher name',\r\n },\r\n publisherId: {\r\n id: 'partnermanagement.publisher.publisherId',\r\n defaultMessage: 'Publisher id',\r\n },\r\n networkAffiliationLabel: {\r\n id: 'partnermanagement.publisher.networkAffiliationLabel',\r\n defaultMessage: 'Network affiliation',\r\n },\r\n networkAffiliationOptionPartnerOwned: {\r\n id: 'partnermanagement.publisher.networkAffiliationOptionPartnerOwned',\r\n defaultMessage: 'Partner owned (O&O)',\r\n },\r\n networkAffiliationOptionSyndicated: {\r\n id: 'partnermanagement.publisher.networkAffiliationOptionSyndicated',\r\n defaultMessage: 'Syndicated partner',\r\n },\r\n publisherAddressTitle: {\r\n id: 'partnermanagement.publisher.publisherAddressTitle',\r\n defaultMessage: 'Publisher address',\r\n },\r\n publisherAddressLine2: {\r\n id: 'partnermanagement.publisher.publisherAddressLine2',\r\n defaultMessage: 'Publisher address line 2',\r\n },\r\n allowedMarketsForAllTitle: {\r\n id: 'partnermanagement.publisher.allowedMarketsForAllTitle',\r\n defaultMessage: 'Allowed markets for all accounts',\r\n },\r\n allowedMarketsForSelectedTitle: {\r\n id: 'partnermanagement.publisher.allowedMarketsForSelectedTitle',\r\n defaultMessage: 'Allowed markets for selected accounts',\r\n },\r\n createAnAccountTitle: {\r\n id: 'partnermanagement.publisher.createAnAccountTitle',\r\n defaultMessage: 'Create an account',\r\n },\r\n createAnAccountInfo: {\r\n id: 'partnermanagement.publisher.createAnAccountInfo',\r\n defaultMessage: 'At least one account is required for all new publishers. A new Account ID will be created for this account.',\r\n },\r\n accountName: {\r\n id: 'partnermanagement.publisher.accountName',\r\n defaultMessage: 'Account Name',\r\n },\r\n contentDeliverySetting: {\r\n id: 'partnermanagement.publisher.contentDeliverySetting',\r\n defaultMessage: 'Account content delivery settings',\r\n },\r\n adCountryPolicy: {\r\n id: 'partnermanagement.publisher.adCountryPolicy',\r\n defaultMessage: 'Ad country/region policy',\r\n },\r\n adLanguage: {\r\n id: 'partnermanagement.publisher.adLanguage',\r\n defaultMessage: 'Ad Language',\r\n },\r\n createPublisher: {\r\n id: 'partnermanagement.publisher.createPublisher',\r\n defaultMessage: 'Create publisher',\r\n },\r\n editPublisher: {\r\n id: 'partnermanagement.publisher.editPublisher',\r\n defaultMessage: 'Save changes',\r\n },\r\n microsoft: {\r\n id: 'partnermanagement.publisher.microsoft',\r\n defaultMessage: 'Microsoft',\r\n },\r\n yahoo: {\r\n id: 'partnermanagement.publisher.yahoo',\r\n defaultMessage: 'Yahoo',\r\n },\r\n advancedpublihserattributes: {\r\n id: 'partnermanagement.publisher.advancedpublisherattributes',\r\n defaultMessage: 'Advanced publisher attributes',\r\n },\r\n publishertier: {\r\n id: 'partnermanagement.publisher.publisherTier',\r\n defaultMessage: 'Publisher tier',\r\n },\r\n publisherTierInternalPremium: {\r\n id: 'partnermanagement.publisher.publisherTier.internalPremium',\r\n defaultMessage: 'Internal premium',\r\n },\r\n publisherTierManagedPremium: {\r\n id: 'partnermanagement.publisher.publisherTier.managedPremium',\r\n defaultMessage: 'Managed premium',\r\n },\r\n publishertierSelfServeStandard: {\r\n id: 'partnermanagement.publisher.publisherTier.selfServeStandard',\r\n defaultMessage: 'Self-serve standard',\r\n },\r\n publishertierSelfServe3rdParty: {\r\n id: 'partnermanagement.publisher.publisherTier.SelfServe3rdParty',\r\n defaultMessage: 'Self Serve 3rd Party',\r\n },\r\n publishertierSelfServe1stParty: {\r\n id: 'partnermanagement.publisher.publisherTier.SelfServe1stParty',\r\n defaultMessage: 'Self Serve 1st Party',\r\n },\r\n publishertierSelfServe1stPartyBoost: {\r\n id: 'partnermanagement.publisher.publisherTier.SelfServe1stPartyBoost',\r\n defaultMessage: 'Self Serve 1st Party Boost',\r\n },\r\n publisherFeatureOverrideTier: {\r\n id: 'partnermanagement.publisher.featureOverrideTier',\r\n defaultMessage: 'Publisher override tier',\r\n },\r\n publisherFeatureOverrideTierInternalPremium: {\r\n id: 'partnermanagement.publisher.featuretier.internalPremium',\r\n defaultMessage: 'Internal premium',\r\n },\r\n publisherFeatureOverrideTierManagedPremium: {\r\n id: 'partnermanagement.publisher.featuretier.managedPremium',\r\n defaultMessage: 'Managed premium',\r\n },\r\n publisherFeatureOverrideTierSelfServeStandard: {\r\n id: 'partnermanagement.publisher.featuretier.selfServeStandard',\r\n defaultMessage: 'Self-serve standard',\r\n },\r\n publisherFeatureOverrideTierAPI: {\r\n id: 'partnermanagement.publisher.featuretier.API',\r\n defaultMessage: 'API',\r\n },\r\n publisherFeatureOverrideTierSelfServeExperiment: {\r\n id: 'partnermanagement.publisher.featuretier.selfserveexperiment',\r\n defaultMessage: 'Self-serve experiment',\r\n },\r\n publisherFeatureOverrideTierSelfServeSearch: {\r\n id: 'partnermanagement.publisher.featuretier.selfserveSearch',\r\n defaultMessage: 'Self-serve search',\r\n },\r\n publisherEntityLimit: {\r\n id: 'partnermanagement.publisher.entitylimit',\r\n defaultMessage: 'Select entity limit tier',\r\n },\r\n publisherEntityLimitInfinite: {\r\n id: 'partnermanagement.publisher.entitylimit.infinite',\r\n defaultMessage: 'Infinite',\r\n },\r\n publisherEntityLimitSmall: {\r\n id: 'partnermanagement.publisher.entitylimit.small',\r\n defaultMessage: 'Small',\r\n },\r\n publisherEntityLimitMedium: {\r\n id: 'partnermanagement.publisher.entitylimit.medium',\r\n defaultMessage: 'Medium',\r\n },\r\n publisherEntityLimitLarge: {\r\n id: 'partnermanagement.publisher.entitylimit.large',\r\n defaultMessage: 'Large',\r\n },\r\n publisherEntityLimitNetwork: {\r\n id: 'partnermanagement.publisher.entitylimit.network',\r\n defaultMessage: 'Network',\r\n },\r\n publisherServiceLevel: {\r\n id: 'partnermanagement.publisher.servicelevel',\r\n defaultMessage: 'Service level',\r\n },\r\n publisherServiceLevelPremium: {\r\n id: 'partnermanagement.publisher.servicelevel.premium',\r\n defaultMessage: 'Premium',\r\n },\r\n publisherServiceLevelSelfServe: {\r\n id: 'partnermanagement.publisher.servicelevel.selfserve',\r\n defaultMessage: 'Self-serve',\r\n },\r\n publisherServiceLevelSelfServeTrusted: {\r\n id: 'partnermanagement.publisher.servicelevel.selfservetrusted',\r\n defaultMessage: 'Self-serve trusted',\r\n },\r\n publisherServiceLevelInternal: {\r\n id: 'partnermanagement.publisher.servicelevel.internal',\r\n defaultMessage: 'Internal',\r\n },\r\n publisherServiceLevelSelect: {\r\n id: 'partnermanagement.publisher.servicelevel.select',\r\n defaultMessage: 'Select',\r\n },\r\n publisherAllowedFeatures: {\r\n id: 'partnermanagement.publisher.allowedfeatures',\r\n defaultMessage: 'Allowed for this publisher',\r\n },\r\n publisherAllowedFeaturesWebAdUnits: {\r\n id: 'partnermanagement.publisher.allowedfeatures.webadunits',\r\n defaultMessage: 'Web ad units',\r\n },\r\n publisherAllowedFeaturesMobileSearchAdunit: {\r\n id: 'partnermanagement.publisher.allowedfeatures.MobileSearchAdunit',\r\n defaultMessage: 'Mobile search ad units',\r\n },\r\n publisherAllowedFeaturesDistributionReport: {\r\n id: 'partnermanagement.publisher.allowedfeatures.DistributionReport',\r\n defaultMessage: 'Distribution reporting',\r\n },\r\n publisherAllowedFeaturesDistributionV2Report: {\r\n id: 'partnermanagement.publisher.allowedfeatures.DistributionV2Report',\r\n defaultMessage: 'Distribution V2 reporting',\r\n },\r\n publisherAllowedFeaturesStartDistributionReport: {\r\n id: 'partnermanagement.publisher.allowedfeatures.StartDistributionReport',\r\n defaultMessage: 'Start Distribution reporting',\r\n },\r\n publisherAllowedFeaturesStartDistributionContentReport: {\r\n id: 'partnermanagement.publisher.allowedfeatures.StartDistributionContentReport',\r\n defaultMessage: 'Start Distribution Content reporting',\r\n },\r\n publisherEnableDefaultTythonV2Report: {\r\n id: 'partnermanagement.publisher.allowedfeatures.EnableDefaultTythonV2Report',\r\n defaultMessage: 'Default Tython V2 reporting',\r\n },\r\n publisherAllowedFeaturesSelectTierReport: {\r\n id: 'partnermanagement.publisher.allowedfeatures.SelectTierReport',\r\n defaultMessage: 'Select Tier reporting',\r\n },\r\n publisherAllowedFeaturesNativeReport: {\r\n id: 'partnermanagement.publisher.allowedfeatures.NativeReport',\r\n defaultMessage: 'Native reporting',\r\n },\r\n publisherAllowedFeaturesMediationReport: {\r\n id: 'partnermanagement.publisher.allowedfeatures.MediationReport',\r\n defaultMessage: 'RTB/Mediation reporting',\r\n },\r\n publisherAllowedFeaturesSyndicationReport: {\r\n id: 'partnermanagement.publisher.allowedfeatures.SyndicationReport',\r\n defaultMessage: 'Syndication reporting',\r\n },\r\n publisherAllowedFeaturesPropertyAutoApproved: {\r\n id: 'partnermanagement.publisher.allowedfeatures.PropertyAutoApproved ',\r\n defaultMessage: 'Property auto approved',\r\n },\r\n publisherAllowedFeaturesPaidSearchReportingApi: {\r\n id: 'partnermanagement.publisher.allowedfeatures.PaidSearchReportingApi ',\r\n defaultMessage: 'PaidSearch Reporting API',\r\n },\r\n publisherAllowedFeaturesPaidSearchDashboard: {\r\n id: 'partnermanagement.publisher.allowedfeatures.PaidSearchDashboard ',\r\n defaultMessage: 'PaidSearch Dashboard',\r\n },\r\n publisherAllowedFeaturesDynamicSites: {\r\n id: 'partnermanagement.publisher.allowedfeatures.DynamicSites',\r\n defaultMessage: 'Dynamic sites / app registration',\r\n },\r\n publisherIPAddress: {\r\n id: 'partnermanagement.publisher.ipaddress',\r\n defaultMessage: 'IP address ranges for API authentication',\r\n },\r\n publisherIPAddressRange: {\r\n id: 'partnermanagement.publisher.ipaddressrange',\r\n defaultMessage: 'Create IP address range',\r\n },\r\n publisherAdCallFeatures: {\r\n id: 'partnermanagement.publisher.adcallfeatures',\r\n defaultMessage: 'Allowed ad call features',\r\n },\r\n publisherAdCallFeaturesAskPrice: {\r\n id: 'partnermanagement.publisher.adcallfeatures.askprice',\r\n defaultMessage: 'Ask Price',\r\n },\r\n publisherAdCallFeaturesOnBehalf: {\r\n id: 'partnermanagement.publisher.adcallfeatures.onbehalf',\r\n defaultMessage: 'On behalf',\r\n },\r\n publisherAdCallFeaturesReferrer: {\r\n id: 'partnermanagement.publisher.adcallfeatures.referer',\r\n defaultMessage: 'Referrer',\r\n },\r\n publisherAdCallFeaturesPaidSearchAPI: {\r\n id: 'partnermanagement.publisher.adcallfeatures.paidsearchAPI',\r\n defaultMessage: 'Paid search API',\r\n },\r\n publisherAdCallFeaturesOutputType: {\r\n id: 'partnermanagement.publisher.adcallfeatures.outputtype',\r\n defaultMessage: 'Output type',\r\n },\r\n publisherAdCallFeaturesLogImpression: {\r\n id: 'partnermanagement.publisher.adcallfeatures.logimpression',\r\n defaultMessage: 'Log impression',\r\n },\r\n publisherAdCallFeaturesIPForwording: {\r\n id: 'partnermanagement.publisher.adcallfeatures.ipforwarding',\r\n defaultMessage: 'IP Forwarding',\r\n },\r\n publisherAdCallFeaturesNetworkOptimizer: {\r\n id: 'partnermanagement.publisher.adcallfeatures.networkoptimizer',\r\n defaultMessage: 'Network optimizer',\r\n },\r\n publisherAdCallFeaturesAdECN: {\r\n id: 'partnermanagement.publisher.adcallfeatures.adecn',\r\n defaultMessage: 'AdECN',\r\n },\r\n publisherAdCallFeaturesContextualAPI: {\r\n id: 'partnermanagement.publisher.adcallfeatures.contextualapi',\r\n defaultMessage: 'Contextual API',\r\n },\r\n IPAddressCreateTitle: {\r\n id: 'partnermanagement.publisher.IPAddressCreateTitle',\r\n defaultMessage: 'Create IP address range',\r\n },\r\n IPAddressEditTitle: {\r\n id: 'partnermanagement.publisher.IPAddressEditTitle',\r\n defaultMessage: 'Edit IP address range',\r\n },\r\n IPAddressRangeName: {\r\n id: 'partnermanagement.publisher.IPAddressRangeName',\r\n defaultMessage: 'IP address range name',\r\n },\r\n IPAddressMinimum: {\r\n id: 'partnermanagement.publisher.IPAddressMinimum',\r\n defaultMessage: 'Minimum IP address',\r\n },\r\n IPAddressMaximum: {\r\n id: 'partnermanagement.publisher.IPAddressMaximum',\r\n defaultMessage: 'Maximum IP address',\r\n },\r\n IPAddressType: {\r\n id: 'partnermanagement.publisher.IPAddressType',\r\n defaultMessage: 'Type',\r\n },\r\n IPAddressIPV4: {\r\n id: 'partnermanagement.publisher.IPAddressIPV4',\r\n defaultMessage: 'IPV4',\r\n },\r\n IPAddressIPV6: {\r\n id: 'partnermanagement.publisher.IPAddressIPV6',\r\n defaultMessage: 'IPV6',\r\n },\r\n publisherAllowedFeaturesDesc: {\r\n id: 'partnermanagement.publisher.publisherAllowedFeaturesDesc',\r\n defaultMessage: 'Select the features to be allowed for publisher',\r\n },\r\n});\r\n","import { IPubcenterSpacing } from '../../../../../theme';\r\nimport { ICreatePublisherStyleProps, ICreatePublisherStyles } from './CreatePublisher.types';\r\n\r\nexport const getStyles = (props: ICreatePublisherStyleProps): ICreatePublisherStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return {\r\n root: {\r\n marginTop: theme.spacing.m,\r\n marginLeft: theme.spacing.m\r\n },\r\n ipGrid: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '400px',\r\n flex: 1\r\n },\r\n subComponentStyles: {\r\n servingTierChoiceGroup: {\r\n flexContainer: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'flex-start',\r\n selectors: {\r\n '.ms-ChoiceField': {\r\n marginRight: theme.spacing.m\r\n }\r\n }\r\n }\r\n },\r\n formSection: {\r\n root: {\r\n borderBottomWidth: 0\r\n }\r\n },\r\n checkbox: {\r\n root: {\r\n marginBottom: spacing.size8\r\n }\r\n }\r\n }\r\n };\r\n};\r\n","import {\r\n Checkbox,\r\n ChoiceGroup,\r\n classNamesFunction,\r\n ComboBox,\r\n Dropdown,\r\n getTheme,\r\n IComboBoxOption,\r\n IDropdownOption,\r\n IProcessedStyleSet,\r\n Panel,\r\n PanelType,\r\n TextField,\r\n} from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport {\r\n EntityLimitTier,\r\n FeatureOverideTier,\r\n getAppStore,\r\n IPRange,\r\n ISubGeography,\r\n NetworkAffiliation,\r\n onNavigateBack,\r\n Partner,\r\n PublisherTier,\r\n} from '../../../../@data';\r\nimport { completeAccess, hasReadAccess, hasUpdateAccess, UserRoleEntity, userRoleKey } from '../../../../@data/services/UserRoleService';\r\nimport { Publisher as PublisherAccessPermissions } from '../../../../@data/store/schema/userrolemodels/Publisher';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { DataGrid, DataGridSelectionMode, IDataGrid, IDataGridCommandBarProps } from '../../../../components/DataGrid';\r\nimport { FormItem, FormSection, FormState } from '../../../../components/Form';\r\nimport { FormLabel } from '../../../../components/Form/FormLabel';\r\nimport { countryToCurrencyMap } from '../../../../config/countryToCurrencyMapper.config';\r\n\r\nimport {\r\n COUNTRIES_LANGUAGE_MAPPING,\r\n CURRENCIES_LANGUAGE_MAPPING,\r\n LANGUAGES_LANGUAGE_MAPPING,\r\n TIMEZONE_LANGUAGE_MAPPING,\r\n} from '../../../../globalization';\r\nimport { DetailPage } from '../../../../layout/DetailPage/DetailPage';\r\nimport { IDataGridColumn } from '../../../../layout/GridPageV2';\r\nimport gridPageMessages from '../../../../layout/GridPageV2/GridV2.messages';\r\nimport { getScreenReaderTextStyles } from '../../../../utils/GlobalStyleUtils';\r\nimport { injectIntlWithObserver } from '../../../../utils/ReactUtils';\r\nimport { onPanelOpenChanged } from '../../@data/actions';\r\nimport { createReturnUrl } from '../../@data/service/PartnerManagementService';\r\nimport { getPageStore, RouteName } from '../../@data/store/store';\r\nimport {\r\n onFormCancelled,\r\n onFormCreated,\r\n onFormEditted,\r\n onFormInitialized,\r\n onFormPublisherAccountCountry,\r\n onFormPublisherAccountLanguage,\r\n onFormPublisherAccountName,\r\n onFormPublisherAccountTimezoneChanged,\r\n onFormPublisherAddressCityChanged,\r\n onFormPublisherAddressCountryCodeChanged,\r\n onFormPublisherAddressLine1Changed,\r\n onFormPublisherAddressLine2Changed,\r\n onFormPublisherAddressStateChanged,\r\n onFormPublisherAddressZipcodeChanged,\r\n onFormPublisherDistributionChanged,\r\n onFormPublisherDistributionV2Changed,\r\n onFormPublisherDynamicPropertyRegistrationChanged,\r\n onFormPublisherEnableDefaultTythonV2Changed,\r\n onFormPublisherEntityLimitTierChanged,\r\n onFormPublisherIpChanged,\r\n onFormPublisherIpNameChanged,\r\n onFormPublisherMaximumIpChanged,\r\n onFormPublisherMediationChanged,\r\n onFormPublisherMinimumIpChanged,\r\n onFormPublisherMobileSearchChanged,\r\n onFormPublisherNameChanged,\r\n onFormPublisherNativeChanged,\r\n onFormPublisherNetworkChanged,\r\n onFormPublisherOverrideTierChanged,\r\n onFormPublisherPartnerChanged,\r\n onFormPublisherPropertyAutoChanged,\r\n onFormPublisherPSDashboardChanged,\r\n onFormPublisherPSReportingAPIChanged,\r\n onFormPublisherSelectTierChanged,\r\n onFormPublisherServiceLevelChanged,\r\n onFormPublisherStartDistributionChanged,\r\n onFormPublisherStartDistributionContentChanged,\r\n onFormPublisherSyndicationChanged,\r\n onFormPublisherTierChanged,\r\n onFormPublisherWebAdunitsChanged,\r\n onPanelCleared,\r\n} from '../@data/actions/onPublisherFormsChanged';\r\nimport '../@data/mutators/PublisherChanged';\r\nimport '../@data/orchestrators/formInitialized';\r\nimport { getStore } from '../@data/store';\r\nimport messages from './CreatePublisher.messages';\r\nimport { getStyles } from './CreatePublisher.styles';\r\nimport {\r\n ICreatePublisherProps,\r\n ICreatePublisherStyleProps,\r\n ICreatePublisherStyles,\r\n IFormInitializationState,\r\n} from './CreatePublisher.types';\r\n\r\nconst getClassNames = classNamesFunction<ICreatePublisherStyleProps, ICreatePublisherStyles>();\r\n\r\nexport const CreatePublisher = injectIntlWithObserver(\r\n class extends React.Component<ICreatePublisherProps, IFormInitializationState> {\r\n private _classNames: IProcessedStyleSet<ICreatePublisherStyles>;\r\n private _datagrid = React.createRef<IDataGrid>();\r\n\r\n constructor(props: ICreatePublisherProps) {\r\n super(props);\r\n this.state = {\r\n initializeForm: true,\r\n ipPanelFormState: FormState.InPageCreate,\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n const publisherId = this.props.match.params.publisherId;\r\n const entityId = this.props.match.params.id;\r\n this.setState({ id: entityId });\r\n\r\n onFormInitialized(this.props.mode, publisherId, entityId);\r\n }\r\n\r\n public componentDidUpdate() {\r\n const publisherId = this.props.match.params.publisherId;\r\n const entityId = this.props.match.params.id;\r\n if (this.state.initializeForm && this.state.id !== entityId) {\r\n this.setState({ id: entityId });\r\n\r\n onFormInitialized(this.props.mode, publisherId, entityId);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { formatMessage } = this.props.intl;\r\n const theme = getTheme();\r\n this._classNames = getClassNames(getStyles, { theme });\r\n\r\n const publisherId = this.props.match.params.publisherId;\r\n const store = getStore();\r\n const publisherAccessPermissions = this._getPublisherAccessPermission();\r\n\r\n return (\r\n <DetailPage\r\n titleLabel={this.props.mode === FormState.Edit ? formatMessage(messages.editPageTitle) : formatMessage(messages.createPageTitle)}\r\n helpId={'pop_PCv4_PublisherCreate'}\r\n submitLabel={formatMessage(this.props.mode === FormState.Edit ? messages.updatePublisher : messages.createPageTitle)}\r\n onSubmit={() => this._onSubmit(this.props.mode, publisherId)}\r\n onCancel={() => this._onCancel(publisherId)}\r\n onNavClick={() => this._onCancel(publisherId)}\r\n saving={getAppStore().saving}\r\n pageMode={this.props.mode}\r\n >\r\n <FormItem>\r\n <ComboBox\r\n useComboBoxAsMenuWidth={true}\r\n autoComplete=\"on\"\r\n label={formatMessage(messages.partner)}\r\n required={true}\r\n selectedKey={store.active.partner}\r\n options={[\r\n { key: Partner.Microsoft, text: formatMessage(messages.microsoft) },\r\n { key: Partner.Yahoo, text: formatMessage(messages.yahoo) },\r\n ]}\r\n disabled={\r\n this.props.mode === FormState.Edit ||\r\n (publisherAccessPermissions ? !hasUpdateAccess(publisherAccessPermissions.partner) : false)\r\n }\r\n // Removing comboBox from tab order when it's disabled. When enabled tabIndex is set to undefined to prevent double tabbing\r\n tabIndex={\r\n this.props.mode === FormState.Edit ||\r\n (publisherAccessPermissions ? !hasUpdateAccess(publisherAccessPermissions.partner) : false)\r\n ? -1\r\n : undefined\r\n }\r\n errorMessage={store.errors.partner}\r\n onChange={(_, value) => onFormPublisherPartnerChanged(value!)}\r\n />\r\n </FormItem>\r\n <FormItem formWidth={440}>\r\n <TextField\r\n label={formatMessage(messages.publisherName)}\r\n ariaLabel={formatMessage(messages.publisherName)}\r\n required={true}\r\n value={store.active.name}\r\n disabled={this.props.mode === FormState.Edit}\r\n onChange={(_, value) => onFormPublisherNameChanged(value)}\r\n errorMessage={store.errors.name}\r\n />\r\n </FormItem>\r\n {store.active.id && (\r\n <FormItem>\r\n <TextField\r\n label={formatMessage(messages.publisherId)}\r\n ariaLabel={formatMessage(messages.publisherId)}\r\n required={true}\r\n disabled={true}\r\n defaultValue={String(store.active.id)}\r\n />\r\n </FormItem>\r\n )}\r\n <FormItem formWidth={440}>\r\n <ChoiceGroup\r\n aria-activedescendant={formatMessage(messages.networkAffiliationOptionPartnerOwned)}\r\n label={formatMessage(messages.networkAffiliationLabel)}\r\n ariaLabelledBy={'NetworkAffiliation'}\r\n required={true}\r\n selectedKey={store.active.networkAffiliation ?? NetworkAffiliation.OwnedAndOperated}\r\n options={[\r\n {\r\n id: formatMessage(messages.networkAffiliationOptionPartnerOwned),\r\n key: NetworkAffiliation.OwnedAndOperated,\r\n text: formatMessage(messages.networkAffiliationOptionPartnerOwned),\r\n },\r\n {\r\n id: formatMessage(messages.networkAffiliationOptionSyndicated),\r\n key: NetworkAffiliation.Syndicated,\r\n text: formatMessage(messages.networkAffiliationOptionSyndicated),\r\n },\r\n ]}\r\n styles={this._classNames.subComponentStyles.servingTierChoiceGroup}\r\n onChange={(_, value) => onFormPublisherNetworkChanged(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.networkAffiliation\r\n )}\r\n />\r\n <span id=\"NetworkAffiliation\" style={getScreenReaderTextStyles()}>\r\n {formatMessage(messages.networkAffiliationLabel)}\r\n </span>\r\n </FormItem>\r\n <FormSection\r\n expanded={true}\r\n title={formatMessage(messages.publisherAddressTitle)}\r\n styles={this._classNames.subComponentStyles.formSection}\r\n >\r\n {this._publisherAddress(publisherAccessPermissions)}\r\n </FormSection>\r\n {this.props.mode === FormState.Edit && (\r\n <FormSection\r\n title={formatMessage(messages.advancedpublihserattributes)}\r\n styles={this._classNames.subComponentStyles.formSection}\r\n >\r\n {this._advancedpublisherAttributes(publisherAccessPermissions)}\r\n </FormSection>\r\n )}\r\n {this.props.mode === FormState.Create && (\r\n <FormSection\r\n expanded={true}\r\n title={formatMessage(messages.createAnAccountTitle)}\r\n styles={this._classNames.subComponentStyles.formSection}\r\n >\r\n {this._createAccount(publisherAccessPermissions)}\r\n </FormSection>\r\n )}\r\n <Panel\r\n isOpen={getPageStore().panelIsOpen}\r\n type={PanelType.medium}\r\n onDismiss={() => onPanelOpenChanged(false)}\r\n closeButtonAriaLabel={formatMessage(AppMessages.close)}\r\n >\r\n {this._createIPAddress(this._getSelectionItems(), this.state.ipPanelFormState, publisherAccessPermissions)}\r\n </Panel>\r\n </DetailPage>\r\n );\r\n }\r\n\r\n private _publisherAddress = (publisherAccessPermissions: PublisherAccessPermissions | null): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const store = getStore();\r\n return (\r\n <>\r\n <FormItem formWidth={440}>\r\n <TextField\r\n label={formatMessage(AppMessages.address)}\r\n ariaLabel={formatMessage(AppMessages.address)}\r\n value={store.active.addressLine1}\r\n required={true}\r\n onChange={(_, value) => onFormPublisherAddressLine1Changed(value)}\r\n errorMessage={store.errors.addressLine1}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.address\r\n )}\r\n />\r\n </FormItem>\r\n <FormItem formWidth={440}>\r\n <TextField\r\n value={store.active.addressLine2}\r\n ariaLabel={formatMessage(messages.publisherAddressLine2)}\r\n onChange={(_, value) => onFormPublisherAddressLine2Changed(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.address\r\n )}\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <TextField\r\n label={formatMessage(AppMessages.city)}\r\n ariaLabel={formatMessage(AppMessages.city)}\r\n value={store.active.city}\r\n required={true}\r\n errorMessage={store.errors.city}\r\n onChange={(_, value) => onFormPublisherAddressCityChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.address\r\n )}\r\n />\r\n </FormItem>\r\n <FormItem formWidth={440}>\r\n <ComboBox\r\n useComboBoxAsMenuWidth={true}\r\n autoComplete=\"on\"\r\n label={formatMessage(AppMessages.countryOrRegion)}\r\n required={true}\r\n errorMessage={store.errors.country}\r\n options={this._createCountryDropDown(store.active.availableCountries!)}\r\n selectedKey={store.active.country}\r\n onChange={(_, value) => onFormPublisherAddressCountryCodeChanged(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.address\r\n )}\r\n tabIndex={\r\n this._isDisabled(this.props.mode, publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.address)\r\n ? -1\r\n : undefined\r\n }\r\n />\r\n </FormItem>\r\n <FormItem formWidth={440}>\r\n <ComboBox\r\n useComboBoxAsMenuWidth={true}\r\n autoComplete=\"on\"\r\n required={true}\r\n errorMessage={store.errors.state}\r\n label={formatMessage(AppMessages.stateOrProvince)}\r\n options={this._createStateOrProvinceDropDown(store.active.availableStates!)}\r\n selectedKey={store.active.state}\r\n onChange={(_, value) => onFormPublisherAddressStateChanged(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.address\r\n )}\r\n tabIndex={\r\n this._isDisabled(this.props.mode, publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.address)\r\n ? -1\r\n : undefined\r\n }\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <TextField\r\n label={formatMessage(AppMessages.zipcode)}\r\n ariaLabel={formatMessage(AppMessages.zipcode)}\r\n value={store.active.postalcode}\r\n required={true}\r\n onChange={(_, value) => onFormPublisherAddressZipcodeChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.address\r\n )}\r\n />\r\n </FormItem>\r\n </>\r\n );\r\n };\r\n\r\n private _advancedpublisherAttributes = (publisherAccessPermissions: PublisherAccessPermissions | null): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const store = getStore();\r\n\r\n const publisherTierDropdownOption: IComboBoxOption[] = [\r\n {\r\n key: PublisherTier.InternalPremium,\r\n text: formatMessage(messages.publisherTierInternalPremium),\r\n },\r\n {\r\n key: PublisherTier.ManagedPremium,\r\n text: formatMessage(messages.publisherTierManagedPremium),\r\n },\r\n {\r\n key: PublisherTier.SelfServeStandard,\r\n text: formatMessage(messages.publishertierSelfServeStandard),\r\n },\r\n {\r\n key: PublisherTier.SelfServe3rdParty,\r\n text: formatMessage(messages.publishertierSelfServe3rdParty),\r\n },\r\n {\r\n key: PublisherTier.SelfServe1stParty,\r\n text: formatMessage(messages.publishertierSelfServe1stParty),\r\n },\r\n {\r\n key: PublisherTier.SelfServe1stPartyBoost,\r\n text: formatMessage(messages.publishertierSelfServe1stPartyBoost),\r\n },\r\n ];\r\n\r\n const featureOverrideTierOption: IComboBoxOption[] = [\r\n {\r\n key: FeatureOverideTier.InternalPremium,\r\n text: formatMessage(messages.publisherFeatureOverrideTierInternalPremium),\r\n },\r\n {\r\n key: FeatureOverideTier.ManagedPremium,\r\n text: formatMessage(messages.publisherFeatureOverrideTierManagedPremium),\r\n },\r\n {\r\n key: FeatureOverideTier.SelfServeStandard,\r\n text: formatMessage(messages.publisherFeatureOverrideTierSelfServeStandard),\r\n },\r\n {\r\n key: FeatureOverideTier.Api,\r\n text: formatMessage(messages.publisherFeatureOverrideTierAPI),\r\n },\r\n {\r\n key: FeatureOverideTier.SelfServeExperiment,\r\n text: formatMessage(messages.publisherFeatureOverrideTierSelfServeExperiment),\r\n },\r\n {\r\n key: FeatureOverideTier.SelfServeSearch,\r\n text: formatMessage(messages.publisherFeatureOverrideTierSelfServeSearch),\r\n },\r\n ];\r\n\r\n const entityLimitTierOption: IComboBoxOption[] = [\r\n {\r\n key: EntityLimitTier.Infinite,\r\n text: formatMessage(messages.publisherEntityLimitInfinite),\r\n },\r\n {\r\n key: EntityLimitTier.Small,\r\n text: formatMessage(messages.publisherEntityLimitSmall),\r\n },\r\n {\r\n key: EntityLimitTier.Medium,\r\n text: formatMessage(messages.publisherEntityLimitMedium),\r\n },\r\n {\r\n key: EntityLimitTier.Large,\r\n text: formatMessage(messages.publisherEntityLimitLarge),\r\n },\r\n {\r\n key: EntityLimitTier.Network,\r\n text: formatMessage(messages.publisherEntityLimitNetwork),\r\n },\r\n ];\r\n\r\n const publisherServiceLevelOption: IComboBoxOption[] = [\r\n {\r\n key: 'Premium',\r\n text: formatMessage(messages.publisherServiceLevelPremium),\r\n },\r\n {\r\n key: 'SelfServe',\r\n text: formatMessage(messages.publisherServiceLevelSelfServe),\r\n },\r\n {\r\n key: 'trusted',\r\n text: formatMessage(messages.publisherServiceLevelSelfServeTrusted),\r\n },\r\n {\r\n key: 'internal',\r\n text: formatMessage(messages.publisherServiceLevelInternal),\r\n },\r\n {\r\n key: 'select',\r\n text: formatMessage(messages.publisherServiceLevelSelect),\r\n },\r\n ];\r\n\r\n return (\r\n <>\r\n {hasReadAccess(publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.publisherTier) && (\r\n <FormItem>\r\n <ComboBox\r\n useComboBoxAsMenuWidth={true}\r\n autoComplete=\"on\"\r\n label={formatMessage(messages.publishertier)}\r\n selectedKey={store.active.publisherTier}\r\n required={true}\r\n options={publisherTierDropdownOption}\r\n onChange={(_, value) => onFormPublisherTierChanged(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.publisherTier\r\n )}\r\n tabIndex={\r\n this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.publisherTier\r\n )\r\n ? -1\r\n : undefined\r\n }\r\n />\r\n </FormItem>\r\n )}\r\n {hasReadAccess(publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.overrideFeatureTier) && (\r\n <FormItem>\r\n <ComboBox\r\n useComboBoxAsMenuWidth={true}\r\n autoComplete=\"on\"\r\n label={formatMessage(messages.publisherFeatureOverrideTier)}\r\n selectedKey={store.active.overrideFeatureTier}\r\n required={true}\r\n options={featureOverrideTierOption}\r\n onChange={(_, value) => onFormPublisherOverrideTierChanged(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.overrideFeatureTier\r\n )}\r\n tabIndex={\r\n this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.overrideFeatureTier\r\n )\r\n ? -1\r\n : undefined\r\n }\r\n />\r\n </FormItem>\r\n )}\r\n {hasReadAccess(publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.entityLimitTier) && (\r\n <FormItem>\r\n <ComboBox\r\n useComboBoxAsMenuWidth={true}\r\n autoComplete=\"on\"\r\n label={formatMessage(messages.publisherEntityLimit)}\r\n selectedKey={store.active.entityLimitTier}\r\n required={true}\r\n options={entityLimitTierOption}\r\n onChange={(_, value) => onFormPublisherEntityLimitTierChanged(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.entityLimitTier\r\n )}\r\n tabIndex={\r\n this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.entityLimitTier\r\n )\r\n ? -1\r\n : undefined\r\n }\r\n />\r\n </FormItem>\r\n )}\r\n {hasReadAccess(publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.serviceLevel) && (\r\n <FormItem>\r\n <ComboBox\r\n useComboBoxAsMenuWidth={true}\r\n autoComplete=\"on\"\r\n label={formatMessage(messages.publisherServiceLevel)}\r\n selectedKey={store.active.serviceLevel}\r\n required={true}\r\n options={publisherServiceLevelOption}\r\n onChange={(_, value) => onFormPublisherServiceLevelChanged(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.serviceLevel\r\n )}\r\n tabIndex={\r\n this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.serviceLevel\r\n )\r\n ? -1\r\n : undefined\r\n }\r\n />\r\n </FormItem>\r\n )}\r\n\r\n <FormItem\r\n formWidth={440}\r\n role=\"region\"\r\n ariaLabelledBy=\"pubAlwdFeaturesLabel\"\r\n ariaDescription={formatMessage(messages.publisherAllowedFeaturesDesc)}\r\n >\r\n <FormLabel\r\n id=\"pubAlwdFeaturesLabel\"\r\n labelContent={formatMessage(messages.publisherAllowedFeatures)}\r\n noInfoButton={true}\r\n intl={this.props.intl}\r\n />\r\n {hasReadAccess(publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowWebAdUnit) && (\r\n <Checkbox\r\n label={formatMessage(messages.publisherAllowedFeaturesWebAdUnits)}\r\n ariaLabel={formatMessage(messages.publisherAllowedFeaturesWebAdUnits)}\r\n checked={!!store.active.allowWebAdUnit}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n onChange={(_, value) => onFormPublisherWebAdunitsChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowWebAdUnit\r\n )}\r\n />\r\n )}\r\n {hasReadAccess(publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowMobileSearchAdUnit) && (\r\n <Checkbox\r\n label={formatMessage(messages.publisherAllowedFeaturesMobileSearchAdunit)}\r\n ariaLabel={formatMessage(messages.publisherAllowedFeaturesMobileSearchAdunit)}\r\n checked={!!store.active.allowMobileSearchAdUnit}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n onChange={(_, value) => onFormPublisherMobileSearchChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowMobileSearchAdUnit\r\n )}\r\n />\r\n )}\r\n {hasReadAccess(\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowDistributionReporting\r\n ) && (\r\n <Checkbox\r\n label={formatMessage(messages.publisherAllowedFeaturesDistributionReport)}\r\n ariaLabel={formatMessage(messages.publisherAllowedFeaturesDistributionReport)}\r\n checked={!!store.active.allowDistributionReporting}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n onChange={(_, value) => onFormPublisherDistributionChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowDistributionReporting\r\n )}\r\n />\r\n )}\r\n {hasReadAccess(\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowDistributionV2Reporting\r\n ) && (\r\n <Checkbox\r\n label={formatMessage(messages.publisherAllowedFeaturesDistributionV2Report)}\r\n ariaLabel={formatMessage(messages.publisherAllowedFeaturesDistributionV2Report)}\r\n checked={!!store.active.allowDistributionV2Reporting}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n onChange={(_, value) => onFormPublisherDistributionV2Changed(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowDistributionV2Reporting\r\n )}\r\n />\r\n )}\r\n {hasReadAccess(\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowStartDistributionReporting\r\n ) && (\r\n <Checkbox\r\n label={formatMessage(messages.publisherAllowedFeaturesStartDistributionReport)}\r\n ariaLabel={formatMessage(messages.publisherAllowedFeaturesStartDistributionReport)}\r\n checked={!!store.active.allowStartDistributionReporting}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n onChange={(_, value) => onFormPublisherStartDistributionChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowStartDistributionReporting\r\n )}\r\n />\r\n )}\r\n {hasReadAccess(\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowStartDistributionContentReporting\r\n ) && (\r\n <Checkbox\r\n label={formatMessage(messages.publisherAllowedFeaturesStartDistributionContentReport)}\r\n ariaLabel={formatMessage(messages.publisherAllowedFeaturesStartDistributionContentReport)}\r\n checked={!!store.active.allowStartDistributionContentReporting}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n onChange={(_, value) => onFormPublisherStartDistributionContentChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowStartDistributionContentReporting\r\n )}\r\n />\r\n )}\r\n {hasReadAccess(publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowNativeReporting) && (\r\n <Checkbox\r\n label={formatMessage(messages.publisherAllowedFeaturesNativeReport)}\r\n ariaLabel={formatMessage(messages.publisherAllowedFeaturesNativeReport)}\r\n checked={!!store.active.allowNativeReporting}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n onChange={(_, value) => onFormPublisherNativeChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowNativeReporting\r\n )}\r\n />\r\n )}\r\n {hasReadAccess(publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowSyndicationReporting) && (\r\n <Checkbox\r\n label={formatMessage(messages.publisherAllowedFeaturesSyndicationReport)}\r\n ariaLabel={formatMessage(messages.publisherAllowedFeaturesSyndicationReport)}\r\n checked={!!store.active.allowSyndicationReporting}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n onChange={(_, value) => onFormPublisherSyndicationChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowSyndicationReporting\r\n )}\r\n />\r\n )}\r\n {hasReadAccess(publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowSelectTierReporting) && (\r\n <Checkbox\r\n label={formatMessage(messages.publisherAllowedFeaturesSelectTierReport)}\r\n ariaLabel={formatMessage(messages.publisherAllowedFeaturesSelectTierReport)}\r\n checked={!!store.active.allowSelectTierReporting}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n onChange={(_, value) => onFormPublisherSelectTierChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowSelectTierReporting\r\n )}\r\n />\r\n )}\r\n {hasReadAccess(\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.publisherAllowedFeaturesPropertyAutoApproved\r\n ) && (\r\n <Checkbox\r\n label={formatMessage(messages.publisherAllowedFeaturesPropertyAutoApproved)}\r\n ariaLabel={formatMessage(messages.publisherAllowedFeaturesPropertyAutoApproved)}\r\n checked={!!store.active.propertyAutoApproved}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n onChange={(_, value) => onFormPublisherPropertyAutoChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null\r\n ? completeAccess\r\n : publisherAccessPermissions.publisherAllowedFeaturesPropertyAutoApproved\r\n )}\r\n />\r\n )}\r\n {hasReadAccess(\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowPaidSearchReportingApi\r\n ) && (\r\n <Checkbox\r\n label={formatMessage(messages.publisherAllowedFeaturesPaidSearchReportingApi)}\r\n ariaLabel={formatMessage(messages.publisherAllowedFeaturesPaidSearchReportingApi)}\r\n checked={!!store.active.allowPaidSearchReportingApi}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n onChange={(_, value) => onFormPublisherPSReportingAPIChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowPaidSearchReportingApi\r\n )}\r\n />\r\n )}\r\n {hasReadAccess(\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowPaidSearchReportingDashboard\r\n ) && (\r\n <Checkbox\r\n label={formatMessage(messages.publisherAllowedFeaturesPaidSearchDashboard)}\r\n ariaLabel={formatMessage(messages.publisherAllowedFeaturesPaidSearchDashboard)}\r\n checked={!!store.active.allowPaidSearchReportingDashboard}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n onChange={(_, value) => onFormPublisherPSDashboardChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowPaidSearchReportingDashboard\r\n )}\r\n />\r\n )}\r\n {hasReadAccess(\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowDynamicPropertyRegistration\r\n ) && (\r\n <Checkbox\r\n label={formatMessage(messages.publisherAllowedFeaturesDynamicSites)}\r\n ariaLabel={formatMessage(messages.publisherAllowedFeaturesDynamicSites)}\r\n checked={!!store.active.allowDynamicPropertyRegistration}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n onChange={(_, value) => onFormPublisherDynamicPropertyRegistrationChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowDynamicPropertyRegistration\r\n )}\r\n />\r\n )}\r\n {hasReadAccess(publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowMediationReporting) && (\r\n <Checkbox\r\n label={formatMessage(messages.publisherAllowedFeaturesMediationReport)}\r\n ariaLabel={formatMessage(messages.publisherAllowedFeaturesMediationReport)}\r\n checked={!!store.active.allowMediationReporting}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n onChange={(_, value) => onFormPublisherMediationChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.allowMediationReporting\r\n )}\r\n />\r\n )}\r\n {hasReadAccess(\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.enableDefaultTythonV2Reporting\r\n ) &&\r\n store.active.publisherTier === PublisherTier.SelfServe3rdParty && (\r\n <Checkbox\r\n label={formatMessage(messages.publisherEnableDefaultTythonV2Report)}\r\n ariaLabel={formatMessage(messages.publisherEnableDefaultTythonV2Report)}\r\n checked={!!store.active.enableDefaultTythonV2Reporting}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n onChange={(_, value) => onFormPublisherEnableDefaultTythonV2Changed(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.enableDefaultTythonV2Reporting\r\n )}\r\n />\r\n )}\r\n </FormItem>\r\n {hasReadAccess(publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.ipRanges) && (\r\n <FormItem formWidth={660}>\r\n <FormLabel labelContent={formatMessage(messages.publisherIPAddress)} noInfoButton={true} intl={this.props.intl} />\r\n\r\n {this._IPGrid(publisherAccessPermissions)}\r\n </FormItem>\r\n )}\r\n </>\r\n );\r\n };\r\n\r\n private _createAccount = (publisherAccessPermissions: PublisherAccessPermissions | null): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const store = getStore();\r\n const CURRENCY = CURRENCIES_LANGUAGE_MAPPING[getAppStore().locale];\r\n\r\n return (\r\n <>\r\n <span>{formatMessage(messages.createAnAccountInfo)}</span>\r\n <FormItem formWidth={440}>\r\n <TextField\r\n label={formatMessage(messages.accountName)}\r\n ariaLabel={formatMessage(messages.accountName)}\r\n required={true}\r\n errorMessage={store.errors.accountName}\r\n onChange={(_, value) => onFormPublisherAccountName(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.newAccount\r\n )}\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <ComboBox\r\n useComboBoxAsMenuWidth={true}\r\n autoComplete=\"on\"\r\n label={formatMessage(AppMessages.language)}\r\n options={this._createLanguageDropDown(store.active.accountAvailableLanguages!)}\r\n selectedKey={store.active.accountLanguage}\r\n required={true}\r\n errorMessage={store.errors.accountLanguage}\r\n onChange={(_, value) => onFormPublisherAccountLanguage(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.newAccount\r\n )}\r\n tabIndex={\r\n this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.newAccount\r\n )\r\n ? -1\r\n : undefined\r\n }\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <ComboBox\r\n useComboBoxAsMenuWidth={true}\r\n autoComplete=\"on\"\r\n label={formatMessage(AppMessages.countryOrRegion)}\r\n options={this._createCountryDropDown(store.active.availableCountries!)}\r\n selectedKey={store.active.accountCountry}\r\n required={true}\r\n errorMessage={store.errors.accountCountry}\r\n onChange={(_, value) => onFormPublisherAccountCountry(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.newAccount\r\n )}\r\n tabIndex={\r\n this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.newAccount\r\n )\r\n ? -1\r\n : undefined\r\n }\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <TextField\r\n label={formatMessage(AppMessages.currency)}\r\n ariaLabel={formatMessage(AppMessages.currency)}\r\n required={true}\r\n value={store.active.accountCountry && CURRENCY[countryToCurrencyMap[store.active.accountCountry]]}\r\n placeholder=\"\"\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.newAccount\r\n )}\r\n // onChange={(_, value) => onFormPublisherAccountCurrency(value!!)}\r\n errorMessage={store.errors.accountCurrency}\r\n />\r\n </FormItem>\r\n <FormItem formWidth={440}>\r\n <Dropdown\r\n label={formatMessage(AppMessages.timezoneLabel)}\r\n ariaLabel={formatMessage(AppMessages.timezoneLabel)}\r\n required={true}\r\n options={this._createTimezoneDropDown(store.active.availableTimezones!)}\r\n defaultSelectedKey={store.active.accountTimezoneId}\r\n onChange={(_, value) => onFormPublisherAccountTimezoneChanged(value!)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.newAccount\r\n )}\r\n />\r\n </FormItem>\r\n </>\r\n );\r\n };\r\n\r\n private _createIPAddress = (\r\n data: IPRange[] | null,\r\n mode: FormState,\r\n publisherAccessPermissions: PublisherAccessPermissions | null\r\n ): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const store = getStore();\r\n\r\n return (\r\n <DetailPage\r\n titleLabel={formatMessage(mode === FormState.InPageEdit ? messages.IPAddressEditTitle : messages.IPAddressCreateTitle)}\r\n helpId={'pop_PCv4_IPAddressCreate'}\r\n submitLabel={formatMessage(mode === FormState.InPageEdit ? messages.IPAddressEditTitle : messages.IPAddressCreateTitle)}\r\n onSubmit={() => {\r\n onFormPublisherIpChanged(data ? data : [], mode);\r\n }}\r\n onCancel={() => {\r\n onPanelCleared();\r\n onPanelOpenChanged(false);\r\n }}\r\n saving={getAppStore().saving}\r\n pageMode={mode}\r\n >\r\n <FormItem formWidth={440}>\r\n <TextField\r\n label={formatMessage(messages.IPAddressRangeName)}\r\n ariaLabel={formatMessage(messages.IPAddressRangeName)}\r\n required={true}\r\n value={store.active.ipAddressName}\r\n errorMessage={store.errors.ipAddressName}\r\n onChange={(_, value) => onFormPublisherIpNameChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.ipRanges\r\n )}\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <TextField\r\n label={formatMessage(messages.IPAddressMinimum)}\r\n ariaLabel={formatMessage(messages.IPAddressMinimum)}\r\n required={true}\r\n value={store.active.minIPAddress}\r\n errorMessage={store.errors.minIPAddress}\r\n onChange={(_, value) => onFormPublisherMinimumIpChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.ipRanges\r\n )}\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <TextField\r\n label={formatMessage(messages.IPAddressMaximum)}\r\n ariaLabel={formatMessage(messages.IPAddressMaximum)}\r\n required={true}\r\n value={store.active.maxIPAddress}\r\n errorMessage={store.errors.maxIPAddress}\r\n onChange={(_, value) => onFormPublisherMaximumIpChanged(value)}\r\n disabled={this._isDisabled(\r\n this.props.mode,\r\n publisherAccessPermissions === null ? completeAccess : publisherAccessPermissions.ipRanges\r\n )}\r\n />\r\n </FormItem>\r\n </DetailPage>\r\n );\r\n };\r\n\r\n private _IPGrid = (publisherAccessPermissions: PublisherAccessPermissions | null): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const store = getStore();\r\n const appStore = getAppStore();\r\n\r\n const _gridDefaultColumns: IDataGridColumn[] = [\r\n { columnName: 'name', friendlyName: 'Name', isVisible: true },\r\n { columnName: 'minIPAddress', friendlyName: 'Minimum IP address', isVisible: true },\r\n { columnName: 'maxIPAddress', friendlyName: 'Maximum IP address', isVisible: true },\r\n ];\r\n const _commandBarProps: IDataGridCommandBarProps = {\r\n items: [\r\n {\r\n key: 'new',\r\n name: formatMessage(messages.publisherIPAddressRange),\r\n iconProps: {\r\n iconName: 'Add',\r\n ariaLabel: 'Add',\r\n },\r\n onClick: () => {\r\n this.setState({ ipPanelFormState: FormState.InPageCreate });\r\n onPanelOpenChanged(true);\r\n },\r\n selectionModes: [DataGridSelectionMode.None],\r\n ariaDescription: formatMessage(gridPageMessages.createCmdbtnAriaDesc, {\r\n label: formatMessage(messages.publisherIPAddressRange),\r\n }),\r\n },\r\n {\r\n key: 'edit',\r\n name: formatMessage(AppMessages.edit),\r\n iconProps: {\r\n iconName: 'Edit',\r\n ariaLabel: 'Edit',\r\n },\r\n onClick: () => {\r\n const item = this._getSelectionItems();\r\n if (item && item[0]) {\r\n onFormPublisherIpNameChanged(item[0].name!.toString());\r\n onFormPublisherMinimumIpChanged(item[0].minIPAddress);\r\n onFormPublisherMaximumIpChanged(item[0].maxIPAddress);\r\n }\r\n this.setState({ ipPanelFormState: FormState.InPageEdit });\r\n onPanelOpenChanged(true);\r\n },\r\n selectionModes: [DataGridSelectionMode.Single],\r\n ariaDescription: formatMessage(gridPageMessages.editCmdBtnAriaDesc),\r\n },\r\n {\r\n key: 'delete',\r\n name: formatMessage(AppMessages.delete),\r\n onClick: () => {\r\n const item = this._getSelectionItems();\r\n onFormPublisherIpChanged(item ? item : [], FormState.Delete);\r\n },\r\n iconProps: {\r\n iconName: 'Delete',\r\n ariaLabel: 'Delete',\r\n },\r\n selectionModes: [DataGridSelectionMode.Single],\r\n ariaDescription: formatMessage(gridPageMessages.deleteCmdBtnAriaDesc),\r\n },\r\n ],\r\n };\r\n return (\r\n <div className={this._classNames.ipGrid}>\r\n <DataGrid\r\n intl={this.props.intl}\r\n helpInfo={appStore.helpInfo}\r\n componentRef={this._datagrid}\r\n commandBarProps={_commandBarProps}\r\n dataIsLoading={false}\r\n detailListProps={{\r\n items: store.active.ipAddressGrid !== undefined ? store.active.ipAddressGrid : [],\r\n columns: _gridDefaultColumns,\r\n }}\r\n />\r\n </div>\r\n );\r\n };\r\n\r\n private _getSelectionItems() {\r\n if (this._datagrid.current) {\r\n const currentSelection = this._datagrid.current.getSelection();\r\n const selectedIndices = currentSelection.getSelectedIndices();\r\n const items = currentSelection.getItems();\r\n\r\n const selectedItems: IPRange[] = [];\r\n selectedIndices.map((selectedIndex) => selectedItems.push(items[selectedIndex] as IPRange));\r\n return selectedItems;\r\n }\r\n return null;\r\n }\r\n\r\n private _createCountryDropDown(countries: string[]): IComboBoxOption[] {\r\n const availableCountrys: IComboBoxOption[] = [];\r\n const countriesWithLocalLang = COUNTRIES_LANGUAGE_MAPPING[getAppStore().locale];\r\n\r\n if (countries) {\r\n countries.forEach((countryCode) => {\r\n if (countriesWithLocalLang[countryCode]) {\r\n availableCountrys!.push({\r\n key: countryCode,\r\n text: countriesWithLocalLang[countryCode],\r\n });\r\n }\r\n });\r\n }\r\n availableCountrys.sort((a, b) => {\r\n const firstValue = a.text;\r\n const secondValue = b.text;\r\n\r\n return firstValue.toLowerCase() > secondValue.toLowerCase() ? 1 : -1;\r\n });\r\n return availableCountrys;\r\n }\r\n\r\n private _createTimezoneDropDown(timezones: number[]): IDropdownOption[] {\r\n const availableTimezones: IDropdownOption[] = [];\r\n const TIMEZONE = TIMEZONE_LANGUAGE_MAPPING[getAppStore().locale];\r\n\r\n if (timezones) {\r\n timezones.forEach((timezoneId) => {\r\n if (TIMEZONE[timezoneId]) {\r\n availableTimezones!.push({\r\n key: timezoneId,\r\n text: TIMEZONE[timezoneId],\r\n });\r\n }\r\n });\r\n }\r\n\r\n return availableTimezones;\r\n }\r\n\r\n private _createStateOrProvinceDropDown(states: ISubGeography[]): IComboBoxOption[] {\r\n const availableStates: IComboBoxOption[] = [];\r\n if (states) {\r\n states.forEach((stateOrProvince) => {\r\n availableStates!.push({\r\n key: stateOrProvince.code,\r\n text: stateOrProvince.name,\r\n });\r\n });\r\n }\r\n availableStates.sort((a, b) => {\r\n const firstValue = a.text;\r\n const secondValue = b.text;\r\n\r\n return firstValue.toLowerCase() > secondValue.toLowerCase() ? 1 : -1;\r\n });\r\n return availableStates;\r\n }\r\n\r\n private _createLanguageDropDown(languages: string[]): IComboBoxOption[] {\r\n const availableLanguages: IComboBoxOption[] = [];\r\n const LANGUAGES = LANGUAGES_LANGUAGE_MAPPING[getAppStore().locale];\r\n\r\n if (languages) {\r\n languages.forEach((languageCode) => {\r\n if (LANGUAGES[languageCode]) {\r\n availableLanguages!.push({\r\n key: languageCode,\r\n text: LANGUAGES[languageCode],\r\n });\r\n }\r\n });\r\n }\r\n\r\n return availableLanguages;\r\n }\r\n\r\n private _onSubmit = (mode: FormState, publisherId?: string): void => {\r\n this.setState({ initializeForm: false });\r\n if (mode === FormState.Create) {\r\n onFormCreated(this.props.history);\r\n } else if (mode === FormState.Edit) {\r\n onFormEditted(this.props.history);\r\n }\r\n };\r\n\r\n private _onCancel = (publisherId?: string): void => {\r\n this.setState({ initializeForm: false });\r\n onFormCancelled();\r\n const returnUrl = createReturnUrl(RouteName.publisher, publisherId);\r\n onNavigateBack(this.props.history, returnUrl);\r\n };\r\n\r\n private _getPublisherAccessPermission(): PublisherAccessPermissions | null {\r\n const userRoles = localStorage.getItem(userRoleKey);\r\n if (userRoles === null) {\r\n return null;\r\n }\r\n const userRolesJSON = JSON.parse(userRoles);\r\n\r\n for (const value in userRolesJSON) {\r\n if (value === UserRoleEntity.Publisher) {\r\n return JSON.parse(userRolesJSON[value]);\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _isDisabled(mode: FormState, permission: number): boolean {\r\n if (mode === FormState.Create || mode === FormState.InPageCreate) {\r\n return false;\r\n }\r\n\r\n return !hasUpdateAccess(permission);\r\n }\r\n }\r\n);\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n create: {\r\n id: 'publisher.create',\r\n defaultMessage: 'Create publisher',\r\n },\r\n deactivateTitle: {\r\n id: 'publisher.deactivateTitle',\r\n defaultMessage: 'Do you want to deactivate publisher(s)?',\r\n },\r\n notFound: {\r\n id: 'publisher.notFound',\r\n defaultMessage: 'No publishers found, create one.',\r\n },\r\n name: {\r\n id: 'publisher.name',\r\n defaultMessage: 'Publisher name',\r\n },\r\n id: {\r\n id: 'publisher.id',\r\n defaultMessage: 'Publisher ID',\r\n },\r\n impressions: {\r\n id: 'publisher.impressions',\r\n defaultMessage: 'Impressions prev.month',\r\n },\r\n accountNumber: {\r\n id: 'publisher.accountNumber',\r\n defaultMessage: '# of accounts',\r\n },\r\n status: {\r\n id: 'publisher.status',\r\n defaultMessage: 'Status',\r\n },\r\n joinDate: {\r\n id: 'publisher.joinDate',\r\n defaultMessage: 'Join date',\r\n },\r\n noPublisherSelected: {\r\n id: 'publisher.noPublisherSelected',\r\n defaultMessage: 'A publisher isn’t selected yet. To start managing publishers, search for a publisher',\r\n },\r\n actions: {\r\n id: 'publisher.actions',\r\n defaultMessage: 'Actions',\r\n },\r\n zeroResultTitle: {\r\n id: 'publisher.zeroResultTitle',\r\n defaultMessage: 'No publishers yet',\r\n },\r\n zeroResultDescription: {\r\n id: 'publisher.zeroResultDescription',\r\n defaultMessage: 'You haven’t created any publishers yet',\r\n },\r\n});\r\n","import { Model, getAppStore } from '../../../../../@data';\r\nimport { CommandBarActions, IBuildCommandBarProps } from '../../../../../layout/GridPageV2';\r\nimport { getStore } from '../../@data/store';\r\nimport messages from '../ManagePage.messages';\r\n\r\nexport function getCommandBarItems(): IBuildCommandBarProps<Model> | undefined {\r\n const { publisher } = getAppStore();\r\n const { publishers, isLoading } = getStore();\r\n\r\n const commandBarItems: IBuildCommandBarProps<Model> | undefined =\r\n (publishers && publishers.length !== 0 && publisher) || isLoading\r\n ? {\r\n primaryButtonLabel: messages.create,\r\n includeActions: [CommandBarActions.new],\r\n includeFarActions: [\r\n CommandBarActions.searchBox,\r\n CommandBarActions.edit,\r\n CommandBarActions.deactivate,\r\n CommandBarActions.download,\r\n CommandBarActions.modifyColumns,\r\n ],\r\n deactivateLabels: {\r\n title: messages.deactivateTitle,\r\n },\r\n }\r\n : undefined;\r\n\r\n return commandBarItems;\r\n}\r\n","import { SelectionMode } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { getAppStore, Publisher } from '../../../../@data';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { ZeroResults } from '../../../../components/ZeroResults/ZeroResults';\r\nimport { useWindowSize } from '../../../../hooks';\r\nimport { getStore as getWindowSizeStore } from '../../../../hooks/useWindowSize/store/store';\r\nimport { GridPageLayout } from '../../../../layout/GridPageLayout/GridPageLayout';\r\nimport { GridV2, IGridV2Column } from '../../../../layout/GridPageV2';\r\nimport { RoutePrefix } from '../../../../Routes';\r\nimport { injectIntlWithObserver, IRouterWithIntl } from '../../../../utils/ReactUtils';\r\nimport { RouteName } from '../../@data';\r\nimport { onManagePageInitialized, onPublishersFetched } from '../@data/actions';\r\nimport { getStore } from '../@data/store';\r\nimport messages from './ManagePage.messages';\r\nimport { getCommandBarItems } from './utils/getCommandBarItems';\r\nimport { getGridColumns } from './utils/getGridColumns';\r\n\r\nexport const ManagePage = injectIntlWithObserver(function PublisherManagePage(props: IRouterWithIntl) {\r\n const { publisher } = getAppStore();\r\n const { publishers, isLoading, isFetchingData } = getStore();\r\n const { formatMessage } = props.intl;\r\n const { windowStoreSerializer } = useWindowSize();\r\n const { isWindowRegularSize } = windowStoreSerializer(getWindowSizeStore());\r\n const gridDefaultColumns: IGridV2Column[] = getGridColumns(formatMessage, isWindowRegularSize, props.history);\r\n\r\n const NoResultComponent = (\r\n <ZeroResults\r\n showDefaultImage\r\n title={!!publisher ? formatMessage(messages.zeroResultTitle) : undefined}\r\n description={formatMessage(!!publisher ? messages.zeroResultDescription : messages.noPublisherSelected)}\r\n buttonText={formatMessage(messages.create)}\r\n onButtonClick={!!publisher ? () => props.history.push(`${RoutePrefix.partnerManagement}/${RouteName.publisher}/create`) : undefined}\r\n />\r\n );\r\n\r\n useEffect(() => {\r\n onManagePageInitialized();\r\n // eslint-disable-next-line\r\n }, [publisher]);\r\n\r\n return (\r\n <GridPageLayout>\r\n <GridV2\r\n history={props.history}\r\n location={props.location}\r\n match={props.match}\r\n entity={Publisher}\r\n pageTitle={{ title: formatMessage(AppMessages.publishers), helpId: 'pop_PCv4_Publishers' }}\r\n commandBarProps={getCommandBarItems()}\r\n dataGridProps={{\r\n gridV2Columns: gridDefaultColumns,\r\n data: publisher ? publishers || [] : [],\r\n setData: onPublishersFetched,\r\n shimmerLines: 10,\r\n selectionMode: SelectionMode.single,\r\n renderZeroItemsComponent: NoResultComponent,\r\n }}\r\n isGridReady={!isLoading}\r\n isDataLoading={isFetchingData}\r\n paginationProps={{\r\n shouldGridHandlePagination: true,\r\n }}\r\n />\r\n </GridPageLayout>\r\n );\r\n});\r\n","import { CommandBarButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { Publisher, getAccessPermission, getAppStore } from '../../../../../@data';\r\nimport { hasUpdateAccess } from '../../../../../@data/services/UserRoleService';\r\nimport AppMessages from '../../../../../App.messages';\r\nimport { IGridV2Column } from '../../../../../layout/GridPageV2';\r\nimport messages from '../ManagePage.messages';\r\n\r\nexport function getGridColumns(formatMessage, isWindowRegularSize, routeHistory): IGridV2Column[] {\r\n const { publisher } = getAppStore();\r\n\r\n const columns: IGridV2Column[] = [\r\n {\r\n columnOrder: 1,\r\n key: 'name',\r\n fieldName: 'name',\r\n name: formatMessage(messages.name),\r\n minWidth: 200,\r\n maxWidth: 200,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n suppressSorting: false,\r\n },\r\n {\r\n columnOrder: 2,\r\n key: 'id',\r\n fieldName: 'id',\r\n name: formatMessage(messages.id),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n },\r\n {\r\n columnOrder: 3,\r\n key: 'status',\r\n fieldName: 'status',\r\n name: formatMessage(AppMessages.status),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 4,\r\n key: 'actions',\r\n name: formatMessage(messages.actions),\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isPadded: true,\r\n isSearchable: true,\r\n isVisible: true,\r\n suppressSorting: true,\r\n onRender: (item: Publisher) => {\r\n const accessPermission = getAccessPermission(item);\r\n\r\n return (\r\n <CommandBarButton\r\n id={`adunitCallout-${item.id}`}\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'edit' }}\r\n ariaLabel={formatMessage(AppMessages.edit)}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.edit) : ''}\r\n disabled={!hasUpdateAccess(accessPermission) || publisher === undefined}\r\n onClick={() => routeHistory.push(`/partner-management/${publisher?.id}/publisher/edit/${item.id}`)}\r\n />\r\n );\r\n },\r\n },\r\n ];\r\n\r\n return columns;\r\n}\r\n","import * as React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { Route, RouteComponentProps } from 'react-router-dom';\r\nimport { RoutePrefix } from '../../../Routes';\r\nimport { FormState } from '../../../components/Form';\r\nimport { RouteName } from '../@data';\r\nimport { onCurrentRouteChanged } from '../@data/actions';\r\nimport '../@data/orchestrators';\r\nimport './@data/mutators';\r\nimport './@data/orchestrators';\r\nimport { CreatePublisher } from './Create/CreatePublisher';\r\nimport { ManagePage } from './Manage/ManagePage';\r\n\r\nexport const PublisherPage = injectIntl(function PublisherPageComponent({\r\n match,\r\n intl,\r\n}: RouteComponentProps & InjectedIntlProps): JSX.Element {\r\n React.useEffect(() => {\r\n onCurrentRouteChanged(RouteName.publisher, intl.formatMessage);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <React.Fragment>\r\n <Route exact path={`${match.url}`} component={ManagePage} />\r\n <Route path={`${match.url}/create`} render={(props) => <CreatePublisher {...props} mode={FormState.Create} />} />\r\n <Route\r\n path={`/${RoutePrefix.partnerManagement}/:publisherId/${RouteName[RouteName.publisher]}/edit/:id`}\r\n render={(props) => <CreatePublisher {...props} mode={FormState.Edit} />}\r\n />\r\n </React.Fragment>\r\n );\r\n});\r\n","import { IAccountRoleStyleProps, IAccountRoleStyles } from './AccountRole.types';\r\n\r\nexport const getStyles = (props: IAccountRoleStyleProps): IAccountRoleStyles => {\r\n return {\r\n option: {\r\n display: 'flex',\r\n flexDirection: 'row'\r\n },\r\n optionTitle: {\r\n width: 220\r\n }\r\n };\r\n};\r\n","import { ChoiceGroup, classNamesFunction, getTheme, IProcessedStyleSet } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport { IIdNamePair, MultiSelectPicker } from '../../../../components/MultiSelectPicker';\r\nimport { getStore } from '../@data';\r\nimport messages from '../UserPage.messages';\r\nimport { getStyles } from './AccountRole.styles';\r\nimport { IAccountRoleProps, IAccountRoleStyleProps, IAccountRoleStyles } from './AccountRole.types';\r\n\r\nconst getClassNames = classNamesFunction<IAccountRoleStyleProps, IAccountRoleStyles>();\r\n\r\nexport const AccountRole = injectIntl(\r\n class extends React.Component<IAccountRoleProps> {\r\n private _classNames: IProcessedStyleSet<IAccountRoleStyles>;\r\n public render() {\r\n this._classNames = getClassNames(getStyles, { theme: getTheme() });\r\n const { formatMessage } = this.props.intl;\r\n const { defaultSelectedKey, onChange } = this.props;\r\n const { active } = getStore();\r\n\r\n let initialSelectedItems: IIdNamePair[] | undefined;\r\n let isAccountLevelRole = false;\r\n switch (defaultSelectedKey) {\r\n case 'AccountManager':\r\n initialSelectedItems = active.AccountManagerAccountsSelected;\r\n isAccountLevelRole = true;\r\n break;\r\n case 'ReportUser':\r\n initialSelectedItems = active.ReportUserAccounstSelected;\r\n isAccountLevelRole = true;\r\n break;\r\n case 'AdViewer':\r\n initialSelectedItems = active.AdViewAccountsSelected;\r\n isAccountLevelRole = true;\r\n break;\r\n case 'ListManager':\r\n initialSelectedItems = active.ListManagerAccountsSelected;\r\n isAccountLevelRole = true;\r\n break;\r\n default:\r\n initialSelectedItems = undefined;\r\n }\r\n return (\r\n <>\r\n <ChoiceGroup\r\n label={formatMessage(messages.accountRole)}\r\n required={true}\r\n options={[\r\n {\r\n key: 'AccountManager',\r\n text: formatMessage(messages.accountManager),\r\n ariaLabel: formatMessage(messages.accountManager),\r\n onRenderField: (props, render) => {\r\n return (\r\n <div className={this._classNames.option}>\r\n <div className={this._classNames.optionTitle}>{render!(props)}</div>\r\n <span>{formatMessage(messages.accountManagerDescription)}</span>\r\n </div>\r\n );\r\n },\r\n },\r\n {\r\n key: 'ReportUser',\r\n text: formatMessage(messages.reportUser),\r\n ariaLabel: formatMessage(messages.reportUser),\r\n onRenderField: (props, render) => {\r\n return (\r\n <div className={this._classNames.option}>\r\n <div className={this._classNames.optionTitle}>{render!(props)}</div>\r\n <span>{formatMessage(messages.reportUserDescription)}</span>\r\n </div>\r\n );\r\n },\r\n },\r\n {\r\n key: 'ListManager',\r\n text: formatMessage(messages.listManager),\r\n ariaLabel: formatMessage(messages.listManager),\r\n onRenderField: (props, render) => {\r\n return (\r\n <div className={this._classNames.option}>\r\n <div className={this._classNames.optionTitle}>{render!(props)}</div>\r\n <span>{formatMessage(messages.listManagerDescription)}</span>\r\n </div>\r\n );\r\n },\r\n },\r\n {\r\n key: 'AdViewer',\r\n text: formatMessage(messages.adViewer),\r\n ariaLabel: formatMessage(messages.adViewer),\r\n onRenderField: (props, render) => {\r\n return (\r\n <div className={this._classNames.option}>\r\n <div className={this._classNames.optionTitle}> {render!(props)}</div>\r\n <span>{formatMessage(messages.adViewerDescription)}</span>\r\n </div>\r\n );\r\n },\r\n },\r\n {\r\n key: 'PublisherAdmin',\r\n text: formatMessage(messages.administrator),\r\n ariaLabel: formatMessage(messages.administrator),\r\n onRenderField: (props, render) => {\r\n return (\r\n <div className={this._classNames.option}>\r\n <div className={this._classNames.optionTitle}>{render!(props)}</div>\r\n <span>{formatMessage(messages.administratorDescription)}</span>\r\n </div>\r\n );\r\n },\r\n },\r\n {\r\n key: 'SuperAdmin',\r\n text: formatMessage(messages.superAdmin),\r\n ariaLabel: formatMessage(messages.superAdmin),\r\n onRenderField: (props, render) => {\r\n return (\r\n <div className={this._classNames.option}>\r\n <div className={this._classNames.optionTitle}>{render!(props)}</div>\r\n <span>{formatMessage(messages.superAdminDescription)}</span>\r\n </div>\r\n );\r\n },\r\n },\r\n ]}\r\n selectedKey={defaultSelectedKey || 'AdViewer'}\r\n onChange={onChange}\r\n />\r\n {isAccountLevelRole && (\r\n <MultiSelectPicker\r\n {...this.props}\r\n ariaDescription={formatMessage(messages.accountMultiSelectPickerAriaDesc)}\r\n items={this.props.accountList || []}\r\n disabled={false}\r\n initialSelectedItems={initialSelectedItems}\r\n errorMessage={this.props.errorMessage}\r\n onSelectedItems={(items) => this.props.onSelectedItems(items)}\r\n />\r\n )}\r\n </>\r\n );\r\n }\r\n }\r\n);\r\n","import { IPubcenterSpacing } from '../../../../../theme';\r\nimport { IInviteUserStyleProps, IInviteUserStyles } from './InviteUser.types';\r\n\r\nexport const getStyles = (props: IInviteUserStyleProps): IInviteUserStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return {\r\n subComponentStyles: {\r\n checkbox: {\r\n root: {\r\n marginBottom: spacing.size8\r\n }\r\n }\r\n }\r\n };\r\n};\r\n","import { Checkbox, classNamesFunction, ComboBox, getTheme, IComboBoxOption, IProcessedStyleSet, TextField } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { getAppStore, onHelpInfoCalloutOpened, onHelpInfoChanged, onNavigateBack } from '../../../../@data';\r\nimport { FormItem, FormState } from '../../../../components/Form';\r\nimport { FormLabel } from '../../../../components/Form/FormLabel';\r\nimport { userLocales } from '../../../../config/locale';\r\n\r\nimport { LOCALE_LANGUAGE_MAPPING } from '../../../../globalization';\r\nimport { DetailPage } from '../../../../layout/DetailPage/DetailPage';\r\nimport { injectIntlWithObserver } from '../../../../utils';\r\nimport { RouteName } from '../../@data';\r\nimport { createReturnUrl } from '../../@data/service/PartnerManagementService';\r\nimport { getStore } from '../@data';\r\nimport {\r\n onFormAccountRoleChanged,\r\n onFormCancelled,\r\n onFormEmailAddressChanged,\r\n onFormFirstNameChanged,\r\n onFormInitialized,\r\n onFormLastNameChanged,\r\n onFormRoleAccountListChanged,\r\n onFormSubmitted,\r\n onFormUserLocaleChanged,\r\n onFormUsernameChanged,\r\n} from '../@data/actions';\r\nimport { AccountRole } from '../AccountRole/AccountRole';\r\nimport messages from '../UserPage.messages';\r\nimport { getStyles } from './InviteUser.styles';\r\nimport { IFormInitializationState, IInviteUserProps, IInviteUserStyleProps, IInviteUserStyles } from './InviteUser.types';\r\n\r\nconst getClassNames = classNamesFunction<IInviteUserStyleProps, IInviteUserStyles>();\r\n\r\nexport const InviteUser = injectIntlWithObserver(\r\n class extends React.Component<IInviteUserProps, IFormInitializationState> {\r\n private _classNames: IProcessedStyleSet<IInviteUserStyles>;\r\n constructor(props: IInviteUserProps) {\r\n super(props);\r\n this.state = {\r\n initializeForm: true,\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n const publisherId = this.props.match.params.publisherId;\r\n const entityId = this.props.match.params.id;\r\n this.setState({ id: entityId });\r\n if (publisherId) {\r\n onFormInitialized(this.props.mode, publisherId, entityId);\r\n }\r\n }\r\n\r\n public componentDidUpdate() {\r\n const publisherId = this.props.match.params.publisherId;\r\n const entityId = this.props.match.params.id;\r\n if (this.state.initializeForm && this.state.id !== entityId) {\r\n this.setState({ id: entityId });\r\n if (publisherId) {\r\n onFormInitialized(this.props.mode, publisherId, entityId);\r\n }\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { formatMessage } = this.props.intl;\r\n const theme = getTheme();\r\n this._classNames = getClassNames(getStyles, { theme });\r\n\r\n const publisherId = this.props.match.params.publisherId;\r\n const store = getStore();\r\n const helpInfo = getAppStore().helpInfo;\r\n return (\r\n <DetailPage\r\n titleLabel={this.props.mode === FormState.Edit ? formatMessage(messages.editPageTitle) : formatMessage(messages.createPageTitle)}\r\n helpId={'pop_PCv4_UserInvite'}\r\n submitLabel={formatMessage(this.props.mode === FormState.Edit ? messages.updateUser : messages.createPageTitle)}\r\n onSubmit={() => this._onSubmit(publisherId)}\r\n onCancel={() => this._onCancel(publisherId)}\r\n onNavClick={() => this._onCancel(publisherId)}\r\n saving={getAppStore().saving}\r\n pageMode={this.props.mode}\r\n >\r\n <>\r\n <FormItem>\r\n <TextField\r\n required={true}\r\n label={formatMessage(messages.firstName)}\r\n ariaLabel={formatMessage(messages.firstName)}\r\n value={store.active.firstName}\r\n onChange={(_, value) => onFormFirstNameChanged(value)}\r\n errorMessage={store.errors.firstName}\r\n disabled={store.active.isLegacyUser || this.props.mode === FormState.Edit}\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <TextField\r\n required={true}\r\n label={formatMessage(messages.lastName)}\r\n ariaLabel={formatMessage(messages.lastName)}\r\n value={store.active.lastName}\r\n onChange={(_, value) => onFormLastNameChanged(value)}\r\n errorMessage={store.errors.lastName}\r\n disabled={store.active.isLegacyUser || this.props.mode === FormState.Edit}\r\n />\r\n </FormItem>\r\n <FormItem formWidth={440}>\r\n <TextField\r\n required={true}\r\n label={formatMessage(messages.emailAddress)}\r\n ariaLabel={formatMessage(messages.emailAddress)}\r\n value={store.active.emailAddress}\r\n onChange={(_, value) => onFormEmailAddressChanged(value)}\r\n errorMessage={store.errors.emailAddress}\r\n disabled={store.active.isLegacyUser || this.props.mode === FormState.Edit}\r\n />\r\n </FormItem>\r\n </>\r\n\r\n {store.active.isLegacyUser && (\r\n <>\r\n <FormItem>\r\n <TextField\r\n label={formatMessage(messages.telephoneNumber)}\r\n ariaLabel={formatMessage(messages.telephoneNumber)}\r\n value={store.active.phoneNumber}\r\n disabled={true}\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <TextField\r\n label={formatMessage(messages.faxNumber)}\r\n ariaLabel={formatMessage(messages.faxNumber)}\r\n value={store.active.faxNumber}\r\n disabled={true}\r\n />\r\n </FormItem>\r\n </>\r\n )}\r\n {store.active.isLegacyUser && (\r\n <FormItem>\r\n <TextField\r\n label={formatMessage(messages.userName)}\r\n ariaLabel={formatMessage(messages.userName)}\r\n required={true}\r\n value={store.active.userName}\r\n onChange={(_, value) => onFormUsernameChanged(value)}\r\n errorMessage={store.errors.userName}\r\n disabled={this.props.mode === FormState.Edit}\r\n />\r\n </FormItem>\r\n )}\r\n {store.active.isLegacyUser && (\r\n <FormItem>\r\n <ComboBox\r\n useComboBoxAsMenuWidth={true}\r\n autoComplete=\"on\"\r\n label={formatMessage(messages.preferredLanguage)}\r\n ariaLabel={formatMessage(messages.preferredLanguage)}\r\n required={true}\r\n options={this._createLocaleOptions(false)}\r\n selectedKey={store.active.language}\r\n disabled={store.active.isLegacyUser}\r\n tabIndex={store.active.isLegacyUser ? -1 : undefined}\r\n />\r\n </FormItem>\r\n )}\r\n {!store.active.isLegacyUser && (\r\n <FormItem>\r\n <ComboBox\r\n useComboBoxAsMenuWidth={true}\r\n autoComplete=\"on\"\r\n label={formatMessage(messages.preferredLanguage)}\r\n ariaLabel={formatMessage(messages.preferredLanguage)}\r\n required={true}\r\n options={this._createLocaleOptions(true)}\r\n selectedKey={store.active.localeId}\r\n errorMessage={store.errors.localeId}\r\n onChange={(_, value) => onFormUserLocaleChanged(value)}\r\n disabled={this.props.mode === FormState.Edit}\r\n tabIndex={this.props.mode === FormState.Edit ? -1 : undefined}\r\n />\r\n </FormItem>\r\n )}\r\n <FormItem formWidth={800}>\r\n <AccountRole\r\n defaultSelectedKey={store.active.accountRole}\r\n accountList={store.active.accountsList}\r\n accountManagerAccountsSelected={store.active.AccountManagerAccountsSelected}\r\n reportUserAccounstSelected={store.active.ReportUserAccounstSelected}\r\n adViewAccountsSelected={store.active.AdViewAccountsSelected}\r\n listManagerAccountsSelected={store.active.ListManagerAccountsSelected}\r\n onChange={(_, value) => onFormAccountRoleChanged(value!)}\r\n onSelectedItems={(items) => onFormRoleAccountListChanged(items)}\r\n errorMessage={\r\n store.errors.AccountManagerAccountsSelected ||\r\n store.errors.ReportUserAccounstSelected ||\r\n store.errors.ListManagerAccountsSelected ||\r\n store.errors.AdViewAccountsSelected\r\n }\r\n />\r\n </FormItem>\r\n {store.active.isLegacyUser && (\r\n <>\r\n <FormItem>\r\n <FormLabel\r\n labelContent={formatMessage(messages.marketingContactSetting)}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('')}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n intl={this.props.intl}\r\n />\r\n <Checkbox\r\n label={formatMessage(messages.email)}\r\n ariaLabel={formatMessage(messages.email)}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n checked={!!store.active.contactByEmail}\r\n disabled={true}\r\n />\r\n <Checkbox\r\n label={formatMessage(messages.phone)}\r\n ariaLabel={formatMessage(messages.phone)}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n checked={!!store.active.contactByPhone}\r\n disabled={true}\r\n />\r\n <Checkbox\r\n label={formatMessage(messages.postalMail)}\r\n ariaLabel={formatMessage(messages.postalMail)}\r\n styles={this._classNames.subComponentStyles.checkbox}\r\n checked={store.active.contactByPost}\r\n disabled={true}\r\n />\r\n </FormItem>\r\n </>\r\n )}\r\n </DetailPage>\r\n );\r\n }\r\n\r\n private _createLocaleOptions(isId: boolean): IComboBoxOption[] {\r\n const availableLocales: IComboBoxOption[] = [];\r\n const LOCALE = LOCALE_LANGUAGE_MAPPING[getAppStore().locale];\r\n\r\n Object.keys(userLocales).forEach((userLocale) => {\r\n availableLocales!.push({\r\n key: isId ? parseInt(userLocale, 10) : userLocales[userLocale],\r\n text: LOCALE[userLocale],\r\n ariaLabel: LOCALE[userLocale],\r\n });\r\n });\r\n\r\n availableLocales.sort((a, b) => {\r\n const firstValue = a.text;\r\n const secondValue = b.text;\r\n\r\n return firstValue.toLowerCase() > secondValue.toLowerCase() ? 1 : -1;\r\n });\r\n return availableLocales;\r\n }\r\n\r\n private _onSubmit = (publisherId?: string): void => {\r\n this.setState({ initializeForm: false });\r\n onFormSubmitted(this.props.mode, this.props.history);\r\n };\r\n\r\n private _onCancel = (publisherId?: string): void => {\r\n this.setState({ initializeForm: false });\r\n onFormCancelled();\r\n const returnUrl = createReturnUrl(RouteName.user, publisherId);\r\n onNavigateBack(this.props.history, returnUrl);\r\n };\r\n }\r\n);\r\n","import { FontSizes, FontWeights, classNamesFunction } from '@fluentui/react';\r\nimport { IPubcenterSpacing } from '../../../../../theme';\r\nimport { IManagePageStyleProps, IManagePageStyles } from './ManagePage.types';\r\n\r\nexport const getStyles = (props: IManagePageStyleProps): IManagePageStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return {\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: 'inherit',\r\n flex: 1,\r\n marginLeft: spacing.size32,\r\n marginTop: spacing.size32,\r\n marginRight: spacing.size32,\r\n },\r\n tokenPanelsubTitle: {\r\n marginTop: spacing.size8,\r\n fontWeight: FontWeights.semibold,\r\n fontSize: FontSizes.medium,\r\n },\r\n tokenPanelsubTitleValue: {\r\n marginTop: spacing.size12,\r\n fontSize: FontSizes.medium,\r\n },\r\n tokenPanelDevToken: {\r\n width: '160px',\r\n height: '40px',\r\n backgroundColor: theme.palette.white,\r\n selectors: {\r\n ':hover': {\r\n background: theme.palette.neutralLighter,\r\n },\r\n },\r\n },\r\n tokenPanelAgreement: {\r\n width: 'inherit',\r\n display: 'flex',\r\n alignItems: 'center',\r\n backgroundColor: theme.palette.themeLighterAlt,\r\n fontSize: theme.fonts.small.fontSize,\r\n marginTop: spacing.size12,\r\n paddingTop: spacing.size12,\r\n paddingBottom: spacing.size12,\r\n paddingRight: spacing.size6,\r\n paddingLeft: spacing.size6,\r\n },\r\n tokenPanelAgreementBtn: {\r\n color: theme.palette.red,\r\n selectors: {\r\n ':hover': {\r\n color: theme.palette.red,\r\n },\r\n },\r\n },\r\n tokenPanelInfoButton: {\r\n float: 'left',\r\n },\r\n tokenPanelAgreementText: {\r\n backgroundColor: theme.palette.themeLighterAlt,\r\n width: 'inherit',\r\n },\r\n tokenSpinner: {\r\n width: '200px',\r\n marginTop: '10px',\r\n },\r\n tokenFetchFail: {\r\n width: '430px',\r\n color: theme.palette.red,\r\n },\r\n };\r\n};\r\n\r\nexport const getClassNames = classNamesFunction<IManagePageStyleProps, IManagePageStyles>();\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n invite: {\r\n id: 'user.invite',\r\n defaultMessage: 'Invite User',\r\n },\r\n notFound: {\r\n id: 'user.notFound',\r\n defaultMessage: 'No users found for this publisher, create one.',\r\n },\r\n notInvitationFound: {\r\n id: 'user.notInvitationFound',\r\n defaultMessage: 'No user invitations found for this publisher, create one.',\r\n },\r\n name: {\r\n id: 'userpage.name',\r\n defaultMessage: 'Name',\r\n },\r\n emailAddress: {\r\n id: 'userpage.emailAddress',\r\n defaultMessage: 'E-mail address',\r\n },\r\n resendInvitation: {\r\n id: 'userpage.resendInvitation',\r\n defaultMessage: 'Re-send',\r\n },\r\n deleteInvitation: {\r\n id: 'userpage.deleteInvitation',\r\n defaultMessage: 'Delete Invitation',\r\n },\r\n deleteInvitationDescription: {\r\n id: 'userpage.deleteInvitationDescription',\r\n defaultMessage: 'Are you sure you want to delete invitation?',\r\n },\r\n noPublisherSelected: {\r\n id: 'user.noPublisherSelected',\r\n defaultMessage: 'Select a publisher.',\r\n },\r\n deactivateTitle: {\r\n id: 'user.deactivateTitle',\r\n defaultMessage: 'Do you want to deactivate user(s)?',\r\n },\r\n username: {\r\n id: 'user.userName',\r\n defaultMessage: 'User name',\r\n },\r\n dateJoined: {\r\n id: 'user.dateJoined',\r\n defaultMessage: 'Date joined',\r\n },\r\n userRole: {\r\n id: 'user.userRole',\r\n defaultMessage: 'Role',\r\n },\r\n lastActivity: {\r\n id: 'user.lastActivity',\r\n defaultMessage: 'Last activity',\r\n },\r\n dateExpires: {\r\n id: 'user.dateExpires',\r\n defaultMessage: 'Date Expires',\r\n },\r\n tokenPanelUserNameLabel: {\r\n id: 'app.tokenPanelUserNameLabel',\r\n defaultMessage: 'User name',\r\n },\r\n tokenPanelEmailLabel: {\r\n id: 'app.tokenPanelEmailLabel',\r\n defaultMessage: 'E-mail address',\r\n },\r\n developerTokenLabel: {\r\n id: 'app.developerTokenLabel',\r\n defaultMessage: 'Developer Token',\r\n },\r\n tokenServiceAgreementLabelPrefix: {\r\n id: 'app.tokenServiceAgreementLabelPrefix',\r\n defaultMessage:\r\n 'By accessing the Microsoft pubCenter API, you agree that the Microsoft pubCenter API is part of the services made available to you under the Microsoft Developer Services Agreement (see ',\r\n },\r\n tokenServiceAgreementLabelLink: {\r\n id: 'app.tokenServiceAgreementLabelLink',\r\n defaultMessage: 'https://go.microsoft.com/fwlink/?linkid=861648',\r\n },\r\n tokenServiceAgreementLabelSuffix: {\r\n id: 'app.tokenServiceAgreementLabelSuffix',\r\n defaultMessage: ' or a succesor location (the “Agreementâ€)) and accept the terms and conditions in the agreement.',\r\n },\r\n tokenStatusLabel: {\r\n id: 'app.tokenStatusLabel',\r\n defaultMessage: 'Token Status',\r\n },\r\n tokenPanelGenerateButtonAriaDesc: {\r\n id: 'app.tokenPanelGenerateButtonAriaDesc',\r\n defaultMessage: 'Click to generate a new token for this user',\r\n },\r\n tokenPanelGenerateButtonLabel: {\r\n id: 'app.tokenPanelGenerateButtonLabel',\r\n defaultMessage: 'Generate Token',\r\n },\r\n tokenPanelFetchFailLabel: {\r\n id: 'app.tokenPanelFetchFailLabel',\r\n defaultMessage: 'Fetching dev token failed. Please reopen this panel to try again',\r\n },\r\n zeroResultTitleUser: {\r\n id: 'channel.zeroResultTitle',\r\n defaultMessage: 'No users yet',\r\n },\r\n zeroResultTitleUserInvitations: {\r\n id: 'channel.zeroResultTitleUserInvitations',\r\n defaultMessage: 'No user invitations yet',\r\n },\r\n zeroResultDescription: {\r\n id: 'channel.zeroResultDescription',\r\n defaultMessage: 'You haven’t created any channel yet',\r\n },\r\n});\r\n","import { PrimaryButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { Model, getAppStore } from '../../../../../../@data';\r\nimport { FormState } from '../../../../../../components/Form';\r\nimport { CommandBarActions, Direction, GridSelectionMode, IBuildCommandBarProps } from '../../../../../../layout/GridPageV2';\r\nimport { getStore } from '../../../@data';\r\nimport { onUserInvitationChanged, onUserInvitationsChanged } from '../../../@data/actions';\r\nimport messages from '../../ManagePage.messages';\r\n\r\nexport function getCommandBarItems(formatMessage, history, match): IBuildCommandBarProps<Model> | undefined {\r\n const { publisher } = getAppStore();\r\n const { userInvitations, isFetchingUserInvitationsLoading } = getStore();\r\n\r\n const commandBarItems =\r\n (userInvitations && userInvitations.length !== 0 && publisher) || isFetchingUserInvitationsLoading\r\n ? {\r\n includeActions: [CommandBarActions.custom],\r\n includeFarActions: [CommandBarActions.searchBox, CommandBarActions.delete, CommandBarActions.modifyColumns],\r\n onPostDeleteItems: (deletedItem) => {\r\n onUserInvitationsChanged(userInvitations.filter((row) => row.id !== deletedItem[0].id));\r\n },\r\n getCustomCommandBarItems: (getSelectedItems) => {\r\n return [\r\n {\r\n key: 'inviteUser',\r\n name: formatMessage(messages.invite),\r\n iconProps: {\r\n iconName: 'Add',\r\n ariaLabel: 'Add',\r\n },\r\n commandBarButtonAs: () => (\r\n <PrimaryButton\r\n iconProps={{ iconName: 'Add' }}\r\n text={formatMessage(messages.invite)}\r\n onClick={() => history.push(`${match.url}/create`)}\r\n disabled={isFetchingUserInvitationsLoading}\r\n />\r\n ),\r\n placement: { direction: Direction.before },\r\n selectionModes: [GridSelectionMode.None],\r\n disabled: isFetchingUserInvitationsLoading,\r\n },\r\n {\r\n key: 'resend',\r\n name: formatMessage(messages.resendInvitation),\r\n ariaLabel: formatMessage(messages.resendInvitation),\r\n iconProps: {\r\n iconName: 'Undo',\r\n ariaLabel: 'Undo',\r\n },\r\n placement: { direction: Direction.before },\r\n onClick: () => {\r\n const items = getSelectedItems();\r\n onUserInvitationChanged(FormState.Resend, items ? items[0] : undefined);\r\n },\r\n selectionModes: [GridSelectionMode.Single],\r\n },\r\n ];\r\n },\r\n }\r\n : undefined;\r\n\r\n return commandBarItems;\r\n}\r\n","import { SelectionMode } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { getAppStore, UserInvitation } from '../../../../../@data';\r\nimport AppMessages from '../../../../../App.messages';\r\nimport { ZeroResults } from '../../../../../components/ZeroResults/ZeroResults';\r\nimport { useCanvasTextWidth, useWindowSize } from '../../../../../hooks';\r\nimport { getStore as getWindowSizeStore } from '../../../../../hooks/useWindowSize/store/store';\r\nimport { GridV2, IGridV2Column } from '../../../../../layout/GridPageV2';\r\nimport { RoutePrefix } from '../../../../../Routes';\r\nimport { injectIntlWithObserver, IRouterWithIntl } from '../../../../../utils';\r\nimport { RouteName } from '../../../@data';\r\nimport { getStore } from '../../@data';\r\nimport { onUserInvitationsChanged, onUserInvitationsGridInitialized } from '../../@data/actions';\r\nimport messages from '../ManagePage.messages';\r\nimport { getCommandBarItems } from './utils/getCommandBarItems';\r\nimport { getGridColumns } from './utils/getGridColumns';\r\n\r\nexport const UserInvitationsGrid = injectIntlWithObserver((props: IRouterWithIntl) => {\r\n const { publisher } = getAppStore();\r\n const { userInvitations, isFetchingUserInvitationsLoading, isFetchingUserInvitations } = getStore();\r\n const { formatMessage } = props.intl;\r\n const { windowStoreSerializer } = useWindowSize();\r\n const { isWindowRegularSize } = windowStoreSerializer(getWindowSizeStore());\r\n\r\n const longestEmail = React.useMemo(\r\n () => userInvitations?.map((user) => user.email || '').reduce((a, b) => (a.length > b.length ? a : b), '') || '',\r\n [userInvitations]\r\n );\r\n const gridDefaultColumns: IGridV2Column[] = getGridColumns(formatMessage, isWindowRegularSize, useCanvasTextWidth(longestEmail));\r\n\r\n const NoResultComponent = (\r\n <ZeroResults\r\n showDefaultImage\r\n title={!!publisher ? formatMessage(messages.zeroResultTitleUserInvitations) : undefined}\r\n description={formatMessage(!!publisher ? messages.notInvitationFound : messages.noPublisherSelected)}\r\n buttonText={formatMessage(messages.invite)}\r\n onButtonClick={\r\n !!publisher ? () => props.history.push(`/${RoutePrefix.partnerManagement}/${publisher?.id}/${RouteName.user}/create`) : undefined\r\n }\r\n />\r\n );\r\n\r\n useEffect(() => {\r\n onUserInvitationsGridInitialized(gridDefaultColumns);\r\n // eslint-disable-next-line\r\n }, [publisher]);\r\n\r\n return (\r\n <GridV2\r\n {...props}\r\n entity={UserInvitation}\r\n pageTitle={{ title: formatMessage(AppMessages.userInvitations), helpId: 'pop_PCv4_UserInvite' }}\r\n commandBarProps={getCommandBarItems(formatMessage, props.history, props.match)}\r\n dataGridProps={{\r\n gridV2Columns: gridDefaultColumns,\r\n data: publisher ? userInvitations || [] : [],\r\n setData: onUserInvitationsChanged,\r\n shimmerLines: 10,\r\n selectionMode: SelectionMode.single,\r\n renderZeroItemsComponent: NoResultComponent,\r\n }}\r\n isGridReady={!isFetchingUserInvitationsLoading}\r\n isDataLoading={isFetchingUserInvitations}\r\n paginationProps={{\r\n shouldGridHandlePagination: true,\r\n }}\r\n />\r\n );\r\n});\r\n","import { CommandBarButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { PopupType, UserInvitation, getAccessPermission } from '../../../../../../@data';\r\nimport { hasDeleteAccess } from '../../../../../../@data/services/UserRoleService';\r\nimport AppMessages from '../../../../../../App.messages';\r\nimport { IGridV2Column } from '../../../../../../layout/GridPageV2';\r\nimport { setDialogType } from '../../../../../../layout/GridPageV2/@data/mutatorActions';\r\nimport messages from '../../ManagePage.messages';\r\n\r\nexport function getGridColumns(formatMessage, isWindowRegularSize, longestEmailLength): IGridV2Column[] {\r\n const columns: IGridV2Column[] = [\r\n {\r\n columnOrder: 0,\r\n key: 'firstName',\r\n fieldName: 'firstName',\r\n name: formatMessage(messages.name),\r\n minWidth: 100,\r\n maxWidth: 200,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n suppressSorting: false,\r\n },\r\n {\r\n columnOrder: 1,\r\n key: 'email',\r\n fieldName: 'email',\r\n name: formatMessage(messages.emailAddress),\r\n minWidth: longestEmailLength,\r\n maxWidth: longestEmailLength + 10,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n },\r\n {\r\n columnOrder: 2,\r\n key: 'expirationDate',\r\n fieldName: 'expirationDate',\r\n name: formatMessage(messages.dateExpires),\r\n minWidth: 200,\r\n maxWidth: 200,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n isResizable: true,\r\n },\r\n {\r\n columnOrder: 3,\r\n key: 'actions',\r\n name: formatMessage(AppMessages.actions),\r\n minWidth: 150,\r\n maxWidth: 200,\r\n isPadded: true,\r\n isSearchable: true,\r\n isVisible: true,\r\n suppressSorting: true,\r\n isResizable: true,\r\n onRender: (item: UserInvitation) => {\r\n const accessPermission = getAccessPermission(item);\r\n\r\n return (\r\n <CommandBarButton\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'Delete' }}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.delete) : ''}\r\n onClick={() => setDialogType(PopupType.DeleteConfirmation)}\r\n disabled={!hasDeleteAccess(accessPermission)}\r\n />\r\n );\r\n },\r\n },\r\n ];\r\n\r\n return columns;\r\n}\r\n","import { ActionButton, IconButton, Panel, PanelType, PrimaryButton, Spinner, getTheme } from '@fluentui/react';\r\nimport React, { useState } from 'react';\r\nimport AppMessages from '../../../../../../App.messages';\r\nimport { COPY_BUTTON_TIMEOUT } from '../../../../../../constants/AppConstants';\r\nimport { IRouterWithIntl, injectIntlWithObserver } from '../../../../../../utils';\r\nimport { getStore } from '../../../@data';\r\nimport { onDevTokenPanelHide } from '../../../@data/actions';\r\nimport messages from '../../ManagePage.messages';\r\nimport { getClassNames, getStyles } from '../../ManagePage.styles';\r\nimport { DevTokenFetch } from '../../ManagePage.types';\r\n\r\nexport const DevTokenPanel = injectIntlWithObserver((props: IRouterWithIntl) => {\r\n const [copyButtonType, setCopyButtonType] = useState('Copy');\r\n const { devTokenPanelParams } = getStore();\r\n if (!devTokenPanelParams || devTokenPanelParams.panelClosed) {\r\n return <></>;\r\n }\r\n const classNames = getClassNames(getStyles, { theme: getTheme() });\r\n const { formatMessage } = props.intl;\r\n\r\n const onCopyTokenClick = (copyText) => {\r\n navigator.clipboard.writeText(copyText);\r\n setCopyButtonType('Accept');\r\n setTimeout(() => {\r\n setCopyButtonType('Copy');\r\n }, COPY_BUTTON_TIMEOUT);\r\n };\r\n\r\n return (\r\n <Panel\r\n isOpen={true}\r\n type={PanelType.medium}\r\n onDismiss={() => onDevTokenPanelHide()}\r\n headerText={formatMessage(messages.tokenStatusLabel)}\r\n closeButtonAriaLabel={formatMessage(AppMessages.panelCloseButtonAriaDesc)}\r\n >\r\n <div className={classNames.tokenPanelsubTitle}>{formatMessage(messages.tokenPanelUserNameLabel)}</div>\r\n <div className={classNames.tokenPanelsubTitleValue}>{devTokenPanelParams.userName ? devTokenPanelParams.userName : ''}</div>\r\n <div className={classNames.tokenPanelsubTitle}>{formatMessage(messages.tokenPanelEmailLabel)}</div>\r\n <div className={classNames.tokenPanelsubTitleValue}>{devTokenPanelParams.email ? devTokenPanelParams.email : ''}</div>\r\n <div className={classNames.tokenPanelsubTitle}>{formatMessage(messages.developerTokenLabel)}</div>\r\n <div>\r\n {!devTokenPanelParams.developerToken ||\r\n devTokenPanelParams.developerToken === DevTokenFetch.TokenNotFound ||\r\n devTokenPanelParams.developerToken === DevTokenFetch.ApiCallFailed ? (\r\n <div>\r\n {devTokenPanelParams.developerToken === DevTokenFetch.TokenNotFound ||\r\n devTokenPanelParams.developerToken === DevTokenFetch.ApiCallFailed ? (\r\n <div>\r\n {devTokenPanelParams.developerToken === DevTokenFetch.TokenNotFound ? (\r\n <PrimaryButton\r\n className={classNames.tokenPanelsubTitle}\r\n onClick={() => {\r\n devTokenPanelParams.onGenerateDevToken();\r\n }}\r\n text={formatMessage(messages.tokenPanelGenerateButtonLabel)}\r\n ariaDescription={formatMessage(messages.tokenPanelGenerateButtonAriaDesc)}\r\n />\r\n ) : (\r\n <div className={classNames.tokenFetchFail}>\r\n <IconButton iconProps={{ iconName: 'Warning' }} className={classNames.tokenPanelAgreementBtn} />\r\n <span>{formatMessage(messages.tokenPanelFetchFailLabel)}</span>\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n <div className={classNames.tokenSpinner}>\r\n <Spinner label={devTokenPanelParams.SpinnerText} ariaLive=\"assertive\" labelPosition=\"right\" />\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n <div className={classNames.tokenPanelDevToken}>\r\n <span id=\"devToken\">{devTokenPanelParams.developerToken}</span>\r\n <ActionButton\r\n menuIconProps={{ iconName: copyButtonType }}\r\n title=\"Copy\"\r\n onClick={() => onCopyTokenClick(devTokenPanelParams.developerToken)}\r\n className=\"button\"\r\n />\r\n </div>\r\n )}\r\n </div>\r\n <div className={classNames.tokenPanelAgreement}>\r\n <div className={classNames.tokenPanelInfoButton}>\r\n <IconButton iconProps={{ iconName: 'Info' }} />\r\n </div>\r\n <div className={classNames.tokenPanelAgreementText}>\r\n {formatMessage(messages.tokenServiceAgreementLabelPrefix)}\r\n <a href={formatMessage(messages.tokenServiceAgreementLabelLink)}>{formatMessage(messages.tokenServiceAgreementLabelLink)}</a>\r\n {formatMessage(messages.tokenServiceAgreementLabelSuffix)}\r\n </div>\r\n </div>\r\n </Panel>\r\n );\r\n});\r\n","import { Model, getAccessPermission, getAppStore } from '../../../../../../@data';\r\nimport { hasCreateAccess } from '../../../../../../@data/services/UserRoleService';\r\nimport { CommandBarActions, Direction, GridSelectionMode, IBuildCommandBarProps } from '../../../../../../layout/GridPageV2';\r\nimport { getStore } from '../../../@data';\r\nimport { onDevTokenPanelShown, onFetchDevTokenStatus, onGenerateDevTokenStatus } from '../../../@data/actions';\r\nimport messages from '../../ManagePage.messages';\r\nimport { IDevTokenPanelParams } from '../../ManagePage.types';\r\n\r\nexport function getCommandBarItems(formatMessage): IBuildCommandBarProps<Model> | undefined {\r\n const { publisher } = getAppStore();\r\n const { users, isFetchingUsersLoading } = getStore();\r\n\r\n const commandBarItems =\r\n (users && users.length !== 0 && publisher) || isFetchingUsersLoading\r\n ? {\r\n includeFarActions: [\r\n CommandBarActions.searchBox,\r\n CommandBarActions.edit,\r\n CommandBarActions.delete,\r\n CommandBarActions.tokenStatus,\r\n CommandBarActions.download,\r\n CommandBarActions.modifyColumns,\r\n ],\r\n getCustomCommandBarItems: (getSelectedItems) => {\r\n const accessPermission = getAccessPermission(getSelectedItems[0]);\r\n\r\n return [\r\n {\r\n key: CommandBarActions.tokenStatus,\r\n name: formatMessage(messages.tokenStatusLabel),\r\n ariaLabel: formatMessage(messages.tokenStatusLabel),\r\n iconProps: {\r\n iconName: 'BranchCompare',\r\n },\r\n placement: { direction: Direction.after },\r\n onClick: () => {\r\n const items = getSelectedItems();\r\n if (items) {\r\n onFetchDevTokenStatus(items[0]);\r\n const devTokenPanelDisplayParams: IDevTokenPanelParams = {\r\n /* tslint:disable:no-string-literal */\r\n userName: items[0]['username'],\r\n email: items[0]['email'],\r\n developerToken: items[0]['developerToken'],\r\n panelClosed: false,\r\n SpinnerText: 'Fetching Developer token...',\r\n onGenerateDevToken: () => onGenerateDevTokenStatus(items[0]),\r\n };\r\n onDevTokenPanelShown(devTokenPanelDisplayParams);\r\n }\r\n },\r\n selectionModes: [GridSelectionMode.Single],\r\n disabled: !hasCreateAccess(accessPermission),\r\n },\r\n ];\r\n },\r\n }\r\n : undefined;\r\n\r\n return commandBarItems;\r\n}\r\n","import { SelectionMode } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { useEffect, useMemo } from 'react';\r\nimport { User, getAppStore } from '../../../../../@data';\r\nimport AppMessages from '../../../../../App.messages';\r\nimport { ZeroResults } from '../../../../../components/ZeroResults/ZeroResults';\r\nimport { useCanvasTextWidth, useWindowSize } from '../../../../../hooks';\r\nimport { getStore as getWindowSizeStore } from '../../../../../hooks/useWindowSize/store/store';\r\nimport { GridV2, IGridV2Column } from '../../../../../layout/GridPageV2';\r\nimport { IRouterWithIntl, injectIntlWithObserver } from '../../../../../utils';\r\nimport { getStore } from '../../@data';\r\nimport { onManagePageInitialized, onUsersChanged } from '../../@data/actions';\r\nimport messages from '../ManagePage.messages';\r\nimport { DevTokenPanel } from './components/DevTokenPanel';\r\nimport { getCommandBarItems } from './utils/getCommandBarItems';\r\nimport { getGridColumns } from './utils/getGridColumns';\r\n\r\nexport const UsersGrid = injectIntlWithObserver((props: IRouterWithIntl) => {\r\n const { publisher } = getAppStore();\r\n const { users, isFetchingUsersLoading, isFetchingUsers } = getStore();\r\n const { formatMessage } = props.intl;\r\n const { windowStoreSerializer } = useWindowSize();\r\n const { isWindowRegularSize } = windowStoreSerializer(getWindowSizeStore());\r\n\r\n const longestEmail = useMemo(() => users?.map((user) => user.email || '').reduce((a, b) => (a.length > b.length ? a : b), '') || '', [\r\n users,\r\n ]);\r\n const gridDefaultColumns: IGridV2Column[] = getGridColumns(\r\n formatMessage,\r\n isWindowRegularSize,\r\n props.history,\r\n useCanvasTextWidth(longestEmail)\r\n );\r\n\r\n const NoResultComponent = (\r\n <ZeroResults\r\n showDefaultImage\r\n title={!!publisher ? formatMessage(messages.zeroResultTitleUser) : undefined}\r\n description={formatMessage(!!publisher ? messages.notFound : messages.noPublisherSelected)}\r\n />\r\n );\r\n\r\n useEffect(() => {\r\n onManagePageInitialized(gridDefaultColumns);\r\n // eslint-disable-next-line\r\n }, [publisher]);\r\n\r\n return (\r\n <>\r\n <GridV2\r\n {...props}\r\n entity={User}\r\n pageTitle={{ title: formatMessage(AppMessages.users), helpId: 'pop_PCv4_Users' }}\r\n commandBarProps={getCommandBarItems(formatMessage)}\r\n dataGridProps={{\r\n gridV2Columns: gridDefaultColumns,\r\n data: publisher ? users || [] : [],\r\n setData: onUsersChanged,\r\n shimmerLines: 10,\r\n selectionMode: SelectionMode.single,\r\n renderZeroItemsComponent: NoResultComponent,\r\n }}\r\n isGridReady={!isFetchingUsersLoading}\r\n isDataLoading={isFetchingUsers}\r\n paginationProps={{\r\n shouldGridHandlePagination: true,\r\n }}\r\n />\r\n <DevTokenPanel {...props} />\r\n </>\r\n );\r\n});\r\n","import { CommandBarButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { PopupType, User, getAccessPermission, getAppStore } from '../../../../../../@data';\r\nimport { hasDeleteAccess, hasUpdateAccess } from '../../../../../../@data/services/UserRoleService';\r\nimport AppMessages from '../../../../../../App.messages';\r\nimport { IGridV2Column } from '../../../../../../layout/GridPageV2';\r\nimport { setDialogType } from '../../../../../../layout/GridPageV2/@data/mutatorActions';\r\nimport messages from '../../ManagePage.messages';\r\n\r\nexport function getGridColumns(formatMessage, isWindowRegularSize, routeHistory, longestEmailLength): IGridV2Column[] {\r\n const { publisher, entityGridColumns } = getAppStore();\r\n const gridColumns = entityGridColumns?.find((x) => x.entity === User)?.gridColumns as IGridV2Column[];\r\n\r\n const columns: IGridV2Column[] = [\r\n {\r\n columnOrder: 0,\r\n key: 'username',\r\n fieldName: 'username',\r\n name: formatMessage(messages.username),\r\n minWidth: longestEmailLength,\r\n maxWidth: longestEmailLength + 10,\r\n isSearchable: true,\r\n isVisible: gridColumns?.find((x) => x.key === 'username')?.isVisible ?? true,\r\n isExportable: true,\r\n isResizable: true,\r\n suppressSorting: false,\r\n },\r\n {\r\n columnOrder: 1,\r\n key: 'email',\r\n fieldName: 'email',\r\n name: formatMessage(messages.emailAddress),\r\n minWidth: longestEmailLength,\r\n maxWidth: longestEmailLength + 10,\r\n isSearchable: true,\r\n isVisible: gridColumns?.find((x) => x.key === 'email')?.isVisible ?? true,\r\n isExportable: true,\r\n isResizable: true,\r\n },\r\n {\r\n columnOrder: 2,\r\n key: 'status',\r\n fieldName: 'status',\r\n name: formatMessage(AppMessages.status),\r\n minWidth: 75,\r\n maxWidth: 175,\r\n isSearchable: true,\r\n isResizable: true,\r\n isVisible: gridColumns?.find((x) => x.key === 'status')?.isVisible ?? true,\r\n isExportable: true,\r\n },\r\n {\r\n columnOrder: 3,\r\n key: 'actions',\r\n name: formatMessage(AppMessages.actions),\r\n minWidth: 150,\r\n maxWidth: 200,\r\n isPadded: true,\r\n isSearchable: true,\r\n isVisible: gridColumns?.find((x) => x.key === 'actions')?.isVisible ?? true,\r\n suppressSorting: true,\r\n isResizable: true,\r\n onRender: (item: User) => {\r\n const accessPermission = getAccessPermission(item);\r\n\r\n return (\r\n <>\r\n <CommandBarButton\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'edit' }}\r\n ariaLabel={formatMessage(AppMessages.edit)}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.edit) : ''}\r\n disabled={!hasUpdateAccess(accessPermission) || publisher === undefined}\r\n onClick={() => routeHistory.push(`/partner-management/${publisher?.id}/user/edit/${item.id}`)}\r\n />\r\n <CommandBarButton\r\n styles={{ root: { background: 'transparent' } }}\r\n iconProps={{ iconName: 'Delete' }}\r\n text={isWindowRegularSize ? formatMessage(AppMessages.delete) : ''}\r\n onClick={() => setDialogType(PopupType.DeleteConfirmation)}\r\n disabled={!hasDeleteAccess(accessPermission)}\r\n />\r\n </>\r\n );\r\n },\r\n },\r\n ];\r\n\r\n return columns;\r\n}\r\n","import { getTheme } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { LayoutMode, onLayoutChanged } from '../../../../@data';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { Tabs } from '../../../../components/Tabs';\r\nimport { IRouterWithIntl, injectIntlWithObserver } from '../../../../utils/ReactUtils';\r\nimport { getClassNames, getStyles } from './ManagePage.styles';\r\nimport { UserInvitationsGrid } from './UserInvitations/UserInvitationsGrid';\r\nimport { UsersGrid } from './Users/UsersGrid';\r\n\r\nexport const ManagePage = injectIntlWithObserver((props: IRouterWithIntl) => {\r\n const { formatMessage } = props.intl;\r\n const classNames = getClassNames(getStyles, { theme: getTheme() });\r\n\r\n useEffect(() => {\r\n onLayoutChanged(LayoutMode.Default);\r\n }, []);\r\n\r\n return (\r\n <div className={classNames.root}>\r\n <Tabs\r\n tabs={[\r\n {\r\n key: 'users',\r\n headerText: formatMessage(AppMessages.users),\r\n component: <UsersGrid {...props} />,\r\n },\r\n {\r\n key: 'userInvitations',\r\n headerText: formatMessage(AppMessages.userInvitations),\r\n component: <UserInvitationsGrid {...props} />,\r\n },\r\n ]}\r\n />\r\n </div>\r\n );\r\n});\r\n","import * as React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { Route, RouteComponentProps } from 'react-router-dom';\r\nimport { RoutePrefix } from '../../../Routes';\r\nimport { FormState } from '../../../components/Form';\r\nimport { RouteName } from '../@data';\r\nimport { onCurrentRouteChanged } from '../@data/actions';\r\nimport '../@data/orchestrators';\r\nimport './@data/mutators';\r\nimport './@data/orchestrators';\r\nimport { InviteUser } from './Invite/InviteUser';\r\nimport { ManagePage } from './Manage/ManagePage';\r\n\r\nexport const UserPage = injectIntl(function UserPageComponent({ match, intl }: RouteComponentProps & InjectedIntlProps): JSX.Element {\r\n React.useEffect(() => {\r\n onCurrentRouteChanged(RouteName.user, intl.formatMessage);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <React.Fragment>\r\n <Route exact path={`${match.url}`} component={ManagePage} />\r\n <Route\r\n path={`/${RoutePrefix.partnerManagement}/:publisherId/${RouteName[RouteName.user]}/create`}\r\n render={(props) => <InviteUser {...props} mode={FormState.Create} />}\r\n />\r\n <Route\r\n path={`/${RoutePrefix.partnerManagement}/:publisherId/${RouteName[RouteName.user]}/edit/:id`}\r\n render={(props) => <InviteUser {...props} mode={FormState.Edit} />}\r\n />\r\n </React.Fragment>\r\n );\r\n});\r\n","import * as React from 'react';\r\nimport { InjectedIntl, InjectedIntlProps } from 'react-intl';\r\nimport { Redirect, Route, RouteComponentProps, Switch } from 'react-router';\r\nimport { IAppState, getAppStore } from '../../@data';\r\nimport '../../@data/orchestrators';\r\nimport { UserRoleEntity, completeAccess, hasReadAccess, userRoleKey } from '../../@data/services/UserRoleService';\r\nimport { User as UserAccessPermissions } from '../../@data/store/schema/userrolemodels/User';\r\nimport AppMessages from '../../App.messages';\r\nimport { IRoute } from '../../Routes.types';\r\nimport { ContentLayout } from '../../layout/ContentLayout/ContentLayout';\r\nimport { IMenuProps } from '../../layout/ContentLayout/ContentLayout.types';\r\nimport { injectIntlWithObserver } from '../../utils';\r\nimport { RouteName } from './@data';\r\nimport './@data/mutators';\r\nimport { AccountPage } from './Account/AccountPage';\r\nimport { IndexPage } from './Index/IndexPage';\r\nimport { PartnerManagementHeader } from './PartnerManagementHeader';\r\nimport { PublisherPage } from './Publisher/PublisherPage';\r\nimport { UserPage } from './User/UserPage';\r\n\r\nexport const getRoutes = (formatMessage: InjectedIntl['formatMessage']): IRoute[] => [\r\n {\r\n key: RouteName[RouteName.publisher],\r\n text: formatMessage(AppMessages.navPublisherManagement),\r\n icon: 'CRMReport',\r\n component: PublisherPage,\r\n },\r\n {\r\n key: RouteName[RouteName.account],\r\n text: formatMessage(AppMessages.navAccountManagement),\r\n icon: 'AccountManagement',\r\n component: AccountPage,\r\n },\r\n {\r\n key: RouteName[RouteName.user],\r\n text: formatMessage(AppMessages.navUserManagement),\r\n icon: 'Contact',\r\n component: UserPage,\r\n },\r\n];\r\n\r\nconst DefaultRoute = RouteName[RouteName.publisher];\r\n\r\nexport const PartnerManagementRouter = injectIntlWithObserver(\r\n class extends React.Component<RouteComponentProps & InjectedIntlProps> {\r\n public render(): JSX.Element {\r\n const store = getAppStore();\r\n\r\n const menuProps: IMenuProps = {\r\n ...this.props,\r\n routes: this._generateMenuRoutes(store),\r\n };\r\n\r\n return (\r\n <ContentLayout {...this.props} menuProps={menuProps} onRenderHeader={this._renderHeader}>\r\n <Redirect exact path={this.props.match.url} to={`${this.props.match.url}/${DefaultRoute}`} />\r\n {getRoutes(this.props.intl.formatMessage).map((route: IRoute, index: number) => (\r\n <Route\r\n key={index}\r\n path={[`${this.props.match.url}/${route.key}`, `${this.props.match.url}/:publisherIdentifier/${route.key}`]}\r\n component={route.component}\r\n />\r\n ))}\r\n <Route key=\"catch-all\" path={`${this.props.match.url}/:id`} component={IndexPage} />\r\n </ContentLayout>\r\n );\r\n }\r\n\r\n private _generateMenuRoutes(store: IAppState) {\r\n let keyFnc: (key: string) => string;\r\n const userAccessPermissions = this._getUserAccessPermission();\r\n\r\n if (store.publisher && store.publisher.id) {\r\n const publisherId = store.publisher.id.toString();\r\n keyFnc = (key) => {\r\n return `/${publisherId}/${key}`;\r\n };\r\n } else {\r\n keyFnc = (key) => `/${key}`;\r\n }\r\n\r\n if (!hasReadAccess(userAccessPermissions === null ? completeAccess : userAccessPermissions.accessPermission)) {\r\n return getRoutes(this.props.intl.formatMessage)\r\n .filter((route) => route.key !== RouteName.user)\r\n .map(\r\n (route) =>\r\n ({\r\n key: keyFnc(route.key),\r\n text: route.text,\r\n icon: route.icon,\r\n } as IRoute)\r\n );\r\n }\r\n // Update the menu routes according to whether the publisher/account were specified.\r\n return getRoutes(this.props.intl.formatMessage).map(\r\n (route) =>\r\n ({\r\n key: keyFnc(route.key),\r\n text: route.text,\r\n icon: route.icon,\r\n } as IRoute)\r\n );\r\n }\r\n\r\n private _renderHeader = (): JSX.Element => {\r\n // Support non pub urls as well. When nothing matched, go back to home to do the default route.\r\n return (\r\n <React.Fragment>\r\n <Switch>\r\n <Route\r\n path={`${this.props.match.url}/:publisherId`}\r\n render={(props) => <PartnerManagementHeader {...props} isAccountHidden={true} isAccountSelectionDisabled={true} />}\r\n />\r\n <Route path=\"*\" render={() => <Redirect to={this.props.match.url} />} />\r\n </Switch>\r\n </React.Fragment>\r\n );\r\n };\r\n\r\n private _getUserAccessPermission(): UserAccessPermissions | null {\r\n const userRoles = localStorage.getItem(userRoleKey);\r\n if (userRoles === null) {\r\n return null;\r\n }\r\n const userRolesJSON = JSON.parse(userRoles);\r\n\r\n for (const value in userRolesJSON) {\r\n if (value === UserRoleEntity.User) {\r\n return JSON.parse(userRolesJSON[value]);\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n }\r\n);\r\n","import { mutator } from 'satcheljs';\r\nimport { onCurrentRouteChanged } from '../actions';\r\nimport { getPageStore } from '../store/store';\r\n\r\nmutator(onCurrentRouteChanged, (msg) => {\r\n getPageStore().currentRoute = msg.currentRoute;\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { onReportingEnabled } from '../actions';\r\nimport { getPageStore } from '../store/store';\r\n\r\nmutator(onReportingEnabled, (msg) => {\r\n getPageStore().isReportEnabled = msg.isEnabled;\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { APP_NAME_NEW, PUBCENTER_TITLE } from '../../../../constants/AppConstants';\r\nimport { isLocationPubCenter } from '../../../../utils';\r\nimport { getRoutes } from '../../ReportRouter';\r\nimport { onCurrentRouteChanged } from '../actions';\r\n\r\norchestrator(onCurrentRouteChanged, ({ currentRoute, formatMessage }) => {\r\n const pageName = formatMessage ? getRoutes(formatMessage).find((route) => route.key === currentRoute)?.text : currentRoute.toString();\r\n const appName = isLocationPubCenter() ? PUBCENTER_TITLE : APP_NAME_NEW;\r\n document.title = `${appName} - ${pageName}`;\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { getAppStore, onLoadingChanged, onNotificationChanged } from '../../../../@data';\r\nimport { uiConfig } from '../../../../config/ui.config';\r\nimport messages from '../../Report.messages';\r\nimport { onReportLinkClicked } from '../actions';\r\nimport { setUserPublisherContext } from '../services/ReportService';\r\n\r\norchestrator(onReportLinkClicked, async () => {\r\n const { publisher, userContext } = getAppStore();\r\n\r\n if (publisher && publisher.id && userContext) {\r\n onLoadingChanged(true);\r\n try {\r\n const commonsession = await setUserPublisherContext(userContext, publisher.id);\r\n // open a new window\r\n window.open(uiConfig.getReportingDashboardAddress(commonsession));\r\n } catch (e) {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.reportsNotAvailableAtThisTime,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.reportInvalidState,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { getAppStore, getEntity, onLoadingChanged, onNotificationChanged, Publisher } from '../../../../@data';\r\nimport messages from '../../Report.messages';\r\nimport { onReportingEnabled, onSetPublisherReporting } from '../actions';\r\n\r\norchestrator(onSetPublisherReporting, async (msg) => {\r\n const { userContext } = getAppStore();\r\n const publisher = msg.publisher;\r\n\r\n if (publisher && publisher.id && userContext) {\r\n try {\r\n onLoadingChanged(true);\r\n const rawPublisher = await getEntity<Publisher>([publisher], userContext);\r\n if (rawPublisher.allowPaidSearchReportingDashboard) {\r\n onReportingEnabled(rawPublisher.allowPaidSearchReportingDashboard);\r\n } else {\r\n onReportingEnabled(false);\r\n }\r\n } catch (e) {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.failedToFetchPublisherReportDetails,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n textMessageDescriptor: messages.reportInvalidState,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import {\r\n ADUNIT_CHART_TYPE_BAR_BUTTON,\r\n ADUNIT_CHART_TYPE_DONUT_BUTTON,\r\n ADUNIT_CHART_TYPE_GRID_BUTTON,\r\n COUNTRY_CHART_TYPE_BAR_BUTTON,\r\n COUNTRY_CHART_TYPE_GRID_BUTTON,\r\n COUNTRY_CHART_TYPE_MAP_BUTTON,\r\n MEDIATION_CHART_TYPE_BAR_BUTTON,\r\n MEDIATION_CHART_TYPE_DONUT_BUTTON,\r\n MEDIATION_CHART_TYPE_GRID_BUTTON,\r\n PERFORMANCE_CHART_TYPE_BAR_BUTTON,\r\n PERFORMANCE_CHART_TYPE_DONUT_BUTTON,\r\n PERFORMANCE_CHART_TYPE_LINE_BUTTON,\r\n SITE_CHART_TYPE_BAR_BUTTON,\r\n SITE_CHART_TYPE_DONUT_BUTTON,\r\n SITE_CHART_TYPE_GRID_BUTTON,\r\n} from '../../../constants/DataTestIdConstants';\r\nimport { ChartTypes, IChartButton } from '../DashboardCards/ReportCard/ReportCard.types';\r\n\r\nexport const PERFORMANCE_ALLOWED_CHARTS: IChartButton[] = [\r\n { chartType: ChartTypes.LINE, disabled: false, iconName: '', dataTestId: PERFORMANCE_CHART_TYPE_LINE_BUTTON },\r\n];\r\nexport const DETAILED_PERFORMANCE_ALLOWED_CHARTS: IChartButton[] = [\r\n { chartType: ChartTypes.LINE, disabled: false, iconName: 'LineChart', dataTestId: PERFORMANCE_CHART_TYPE_LINE_BUTTON },\r\n { chartType: ChartTypes.BAR, disabled: true, iconName: 'BarChartHorizontal', dataTestId: PERFORMANCE_CHART_TYPE_BAR_BUTTON },\r\n { chartType: ChartTypes.DONUT, disabled: true, iconName: 'DonutChart', dataTestId: PERFORMANCE_CHART_TYPE_DONUT_BUTTON },\r\n];\r\nexport const ADUNIT_ALLOWED_CHARTS: IChartButton[] = [\r\n { chartType: ChartTypes.DONUT, disabled: false, iconName: 'DonutChart', dataTestId: ADUNIT_CHART_TYPE_DONUT_BUTTON },\r\n { chartType: ChartTypes.BAR, disabled: false, iconName: 'BarChartHorizontal', dataTestId: ADUNIT_CHART_TYPE_BAR_BUTTON },\r\n { chartType: ChartTypes.GRID, disabled: false, iconName: 'GridViewSmall', dataTestId: ADUNIT_CHART_TYPE_GRID_BUTTON },\r\n];\r\nexport const DETAILED_ADUNIT_ALLOWED_CHARTS: IChartButton[] = [\r\n { chartType: ChartTypes.LINE, disabled: false, iconName: 'LineChart', dataTestId: ADUNIT_CHART_TYPE_DONUT_BUTTON },\r\n { chartType: ChartTypes.DONUT, disabled: false, iconName: 'DonutChart', dataTestId: ADUNIT_CHART_TYPE_BAR_BUTTON },\r\n { chartType: ChartTypes.BAR, disabled: false, iconName: 'BarChartHorizontal', dataTestId: ADUNIT_CHART_TYPE_GRID_BUTTON },\r\n];\r\nexport const SITE_ALLOWED_CHARTS: IChartButton[] = [\r\n { chartType: ChartTypes.DONUT, disabled: false, iconName: 'DonutChart', dataTestId: SITE_CHART_TYPE_DONUT_BUTTON },\r\n { chartType: ChartTypes.BAR, disabled: false, iconName: 'BarChartHorizontal', dataTestId: SITE_CHART_TYPE_BAR_BUTTON },\r\n { chartType: ChartTypes.GRID, disabled: false, iconName: 'GridViewSmall', dataTestId: SITE_CHART_TYPE_GRID_BUTTON },\r\n];\r\nexport const DETAILED_SITE_ALLOWED_CHARTS: IChartButton[] = [\r\n { chartType: ChartTypes.LINE, disabled: false, iconName: 'LineChart', dataTestId: SITE_CHART_TYPE_DONUT_BUTTON },\r\n { chartType: ChartTypes.DONUT, disabled: false, iconName: 'DonutChart', dataTestId: SITE_CHART_TYPE_BAR_BUTTON },\r\n { chartType: ChartTypes.BAR, disabled: false, iconName: 'BarChartHorizontal', dataTestId: SITE_CHART_TYPE_GRID_BUTTON },\r\n];\r\nexport const MEDIATION_ALLOWED_CHARTS: IChartButton[] = [\r\n { chartType: ChartTypes.DONUT, disabled: false, iconName: 'DonutChart', dataTestId: MEDIATION_CHART_TYPE_DONUT_BUTTON },\r\n { chartType: ChartTypes.BAR, disabled: false, iconName: 'BarChartHorizontal', dataTestId: MEDIATION_CHART_TYPE_BAR_BUTTON },\r\n { chartType: ChartTypes.GRID, disabled: false, iconName: 'GridViewSmall', dataTestId: MEDIATION_CHART_TYPE_GRID_BUTTON },\r\n];\r\nexport const DETAILED_MEDIATION_ALLOWED_CHARTS: IChartButton[] = [\r\n { chartType: ChartTypes.LINE, disabled: false, iconName: 'LineChart', dataTestId: MEDIATION_CHART_TYPE_DONUT_BUTTON },\r\n { chartType: ChartTypes.DONUT, disabled: false, iconName: 'DonutChart', dataTestId: MEDIATION_CHART_TYPE_BAR_BUTTON },\r\n { chartType: ChartTypes.BAR, disabled: false, iconName: 'BarChartHorizontal', dataTestId: MEDIATION_CHART_TYPE_GRID_BUTTON },\r\n];\r\nexport const COUNTRY_ALLOWED_CHARTS: IChartButton[] = [\r\n { chartType: ChartTypes.MAP, disabled: false, iconName: 'World', dataTestId: COUNTRY_CHART_TYPE_MAP_BUTTON },\r\n { chartType: ChartTypes.BAR, disabled: false, iconName: 'BarChartHorizontal', dataTestId: COUNTRY_CHART_TYPE_BAR_BUTTON },\r\n { chartType: ChartTypes.GRID, disabled: false, iconName: 'GridViewSmall', dataTestId: COUNTRY_CHART_TYPE_GRID_BUTTON },\r\n];\r\nexport const DETAILED_COUNTRY_ALLOWED_CHARTS: IChartButton[] = [\r\n { chartType: ChartTypes.LINE, disabled: false, iconName: 'LineChart', dataTestId: COUNTRY_CHART_TYPE_MAP_BUTTON },\r\n { chartType: ChartTypes.MAP, disabled: false, iconName: 'World', dataTestId: COUNTRY_CHART_TYPE_BAR_BUTTON },\r\n { chartType: ChartTypes.BAR, disabled: false, iconName: 'BarChartHorizontal', dataTestId: COUNTRY_CHART_TYPE_GRID_BUTTON },\r\n];\r\n","import { TythonColumnsEnum } from '../@data/store/schema/ColumnsEnum';\r\n\r\nexport const EXCLUDED_FILTER_COLUMNS: TythonColumnsEnum[] = [TythonColumnsEnum.DateTime, TythonColumnsEnum.Date];\r\nexport const ALLOWED_MEDIATION_FILTER_COLUMNS: TythonColumnsEnum[] = [TythonColumnsEnum.AdUnitName];\r\nexport const MEDIATION_DEFAULT_COLUMNS: TythonColumnsEnum[] = [\r\n TythonColumnsEnum.AdClicks,\r\n TythonColumnsEnum.AdECPM,\r\n TythonColumnsEnum.Revenue,\r\n TythonColumnsEnum.Date,\r\n TythonColumnsEnum.AdUnitName,\r\n];\r\nexport const MEDIATION_DEFAULT_METRICS: TythonColumnsEnum[] = [TythonColumnsEnum.Revenue];\r\n\r\nexport const ADUNIT_DEFAULT_COLUMNS: TythonColumnsEnum[] = [\r\n TythonColumnsEnum.Clicks,\r\n TythonColumnsEnum.eCPM,\r\n TythonColumnsEnum.Revenue,\r\n TythonColumnsEnum.DateTime,\r\n TythonColumnsEnum.AdUnitName,\r\n];\r\nexport const ADUNIT_DEFAULT_METRICS: TythonColumnsEnum[] = [TythonColumnsEnum.Revenue];\r\n\r\nexport const SITE_DEFAULT_COLUMNS: TythonColumnsEnum[] = [\r\n TythonColumnsEnum.Clicks,\r\n TythonColumnsEnum.eCPM,\r\n TythonColumnsEnum.Revenue,\r\n TythonColumnsEnum.DateTime,\r\n TythonColumnsEnum.PropertyUrl,\r\n];\r\nexport const SITE_DEFAULT_METRICS: TythonColumnsEnum[] = [TythonColumnsEnum.Revenue];\r\n\r\nexport const PERFORMANCE_DEFAULT_METRICS: TythonColumnsEnum[] = [\r\n TythonColumnsEnum.ImpressionsServed,\r\n TythonColumnsEnum.Clicks,\r\n TythonColumnsEnum.Revenue,\r\n];\r\nexport const PERFORMANCE_DEFAULT_COLUMNS: TythonColumnsEnum[] = [\r\n TythonColumnsEnum.Clicks,\r\n TythonColumnsEnum.eCPM,\r\n TythonColumnsEnum.Revenue,\r\n TythonColumnsEnum.DateTime,\r\n TythonColumnsEnum.AdUnitName,\r\n];\r\n\r\nexport const COUNTRY_DEFAULT_COLUMNS: TythonColumnsEnum[] = [\r\n TythonColumnsEnum.Clicks,\r\n TythonColumnsEnum.eCPM,\r\n TythonColumnsEnum.Revenue,\r\n TythonColumnsEnum.DateTime,\r\n TythonColumnsEnum.Country,\r\n];\r\nexport const COUNTRY_DEFAULT_METRICS: TythonColumnsEnum[] = [TythonColumnsEnum.Revenue];\r\n\r\nexport const REPORT_ONBOARDING_RENDER_FLAG = 'isReportOnboardingExperienceTriggered';\r\nexport const REPORT_OLD_DATA_NOTIFICATION_DISMISS_FLAG = 'isOldDataNotificationDismissed';\r\n","import { useMemo } from 'react';\r\nimport { AdSenseOAuthStatus } from '../../../@data/store/schema/enums/AdSenseOAuthStatus';\r\nimport { getGoogleAdSenseStore } from '../../ad-management/Account/Settings/components/GoogleConnector/@data';\r\n\r\nexport const useMediationAvailable = () => {\r\n const { active } = getGoogleAdSenseStore();\r\n const isMediationAvailable = useMemo(() => active?.connectionStatus === AdSenseOAuthStatus.Success && active?.isMediationEnabled, [\r\n active.connectionStatus,\r\n active.isMediationEnabled,\r\n ]);\r\n return { isMediationAvailable };\r\n};\r\n","import { getDataFromURL } from '../@data/store/UrlQueryStore';\r\nimport { ReportsQueryStoreKeys } from '../@data/store/schema/ReportsQueryStoreKeys';\r\nimport { ICustomCalenderDateRange, RangeType } from '../components/CustomCalender/CustomCalender.types';\r\nimport { get7DaysExcludingToday } from '../components/CustomCalender/utils/CalenderUtils';\r\nimport { checkIfValidDateRange } from './checkIfValidDateRange';\r\n\r\nexport function getInitialDateRange() {\r\n const last7Days = get7DaysExcludingToday();\r\n let initialStartDate = last7Days[0];\r\n let initialEndDate = last7Days[last7Days.length - 1];\r\n const storedDateRange = getDataFromURL<ICustomCalenderDateRange>(ReportsQueryStoreKeys.DATE_RANGE)!;\r\n if (storedDateRange && checkIfValidDateRange(storedDateRange)) {\r\n initialStartDate = new Date(storedDateRange.startDate);\r\n initialEndDate = new Date(storedDateRange.endDate);\r\n }\r\n return { dateRange: { initialStartDate, initialEndDate }, initialDateRangeType: getInitialDateRangeType() };\r\n}\r\nexport function getInitialDateRangeType() {\r\n const storedDateRangeType = getDataFromURL<RangeType>(ReportsQueryStoreKeys.DATE_RANGE_TYPE);\r\n let initialRangeType = RangeType.Last7ExcludingToday;\r\n if (storedDateRangeType && RangeType[storedDateRangeType]) {\r\n initialRangeType = storedDateRangeType;\r\n }\r\n return initialRangeType;\r\n}\r\n","import { ICustomCalenderDateRange } from '../components/CustomCalender/CustomCalender.types';\r\n\r\nexport function checkIfValidDateRange(dateRange: ICustomCalenderDateRange) {\r\n const parsedStartDate = Date.parse(dateRange.startDate.toString());\r\n const parsedEndDate = Date.parse(dateRange.endDate.toString());\r\n if (!(parsedStartDate && parsedEndDate)) {\r\n return false;\r\n }\r\n if (parsedEndDate < parsedStartDate) {\r\n return false;\r\n }\r\n return true;\r\n}\r\n","import { getTheme, IStackTokens, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterPalette, IPubcenterSpacing, IPubcenterTheme } from '../../../../../theme';\r\nimport { IMetricMarkerProps } from './MetricMarker.types';\r\n\r\ntype StyleProperties = 'marker' | 'contentStyle' | 'markerName' | 'markerData' | 'markerWrapper' | 'tooltip';\r\ntype MetricMarkerStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: Partial<IMetricMarkerProps>): MetricMarkerStyles => {\r\n const { isActive, color, isIncompatible } = props;\r\n const theme = getTheme();\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n return mergeStyleSets({\r\n marker: {\r\n height: '40px',\r\n minHeight: '5px',\r\n maxWidth: '5px',\r\n minWidth: '5px',\r\n backgroundColor: isActive ? color : palette.neutralLight,\r\n ...(isIncompatible && { backgroundColor: palette.neutralTertiary }),\r\n },\r\n contentStyle: { display: 'flex', flexDirection: 'column', justifyContent: 'center' },\r\n markerName: { fontSize: theme.fonts.medium },\r\n markerData: { fontWeight: 'bold', fontSize: theme.fonts.large.fontSize, gap: '8px', display: 'flex' },\r\n tooltip: { fontSize: theme.fonts.medium.fontSize, pointerEvents: 'auto' },\r\n markerWrapper: {\r\n display: 'flex',\r\n gap: spacing.size12,\r\n paddingRight: spacing.size12,\r\n boxSizing: 'border-box',\r\n ':hover': {\r\n backgroundColor: palette.neutralLighter,\r\n },\r\n minWidth: '160px',\r\n ...(isIncompatible && { color: palette.neutralTertiary, pointerEvents: 'none' }),\r\n },\r\n });\r\n};\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ ...props });\r\n}\r\nexport function getStackTokens(): IStackTokens {\r\n const theme = (getTheme() as unknown) as IPubcenterTheme;\r\n const spacing = theme.spacing;\r\n\r\n return { childrenGap: spacing.size12 };\r\n}\r\n","import React from 'react';\r\nimport { IconTooltip } from '../../../../components/IconTooltip/IconTooltip';\r\nimport { injectIntlAndObserver } from '../../../../utils';\r\nimport { getClassNames } from './MetricMarker.styles';\r\nimport { IMetricMarkerIntlProps } from './MetricMarker.types';\r\n\r\nexport const MetricMarker = injectIntlAndObserver(\r\n ({ color, metricData, metricName, isActive, isIncompatible, incompatibleTooltipCantText, onClick }: IMetricMarkerIntlProps) => {\r\n const { contentStyle, marker, markerData, markerName, markerWrapper, tooltip } = getClassNames({ color, isActive, isIncompatible });\r\n\r\n return (\r\n <div onClick={!isIncompatible ? onClick : undefined} className={markerWrapper}>\r\n <div className={marker} />\r\n <div className={contentStyle}>\r\n <span className={markerData}>\r\n {isIncompatible || !metricData ? '- -' : metricData}\r\n {isIncompatible && (\r\n <span className={tooltip}>\r\n <IconTooltip tooltipMessage={incompatibleTooltipCantText || ''} iconName={'warning'} />\r\n </span>\r\n )}\r\n </span>\r\n <span className={markerName}>{metricName}</span>\r\n </div>\r\n </div>\r\n );\r\n }\r\n);\r\n","import { getTheme, IStackTokens, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterPalette, IPubcenterSpacing } from '../../../../../theme';\r\n\r\ntype StyleProperties = 'contentStyle' | 'markerWrapper' | 'listItem' | 'panelButton' | 'columnTooltip' | 'columnCheckboxWrapper';\r\ntype ChartMetricPickerStyles = Record<StyleProperties, string>;\r\nconst theme = getTheme();\r\nconst spacing = theme.spacing as IPubcenterSpacing;\r\nconst palette = theme.palette as IPubcenterPalette;\r\nexport const getStyles = (): ChartMetricPickerStyles => {\r\n return mergeStyleSets({\r\n contentStyle: { display: 'flex', flexDirection: 'column', justifyContent: 'center', width: '100%' },\r\n markerWrapper: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n ':hover': {\r\n backgroundColor: palette.neutralLighter,\r\n },\r\n minWidth: '75px',\r\n },\r\n listItem: {\r\n position: 'relative',\r\n boxSizing: 'border-box',\r\n display: 'block',\r\n minHeight: '30px',\r\n padding: spacing.size12,\r\n ':hover': {\r\n backgroundColor: palette.neutralLighter,\r\n },\r\n },\r\n panelButton: {\r\n display: 'flex',\r\n selectors: {\r\n '.ms-Button': {\r\n marginRight: spacing.size8,\r\n },\r\n },\r\n },\r\n columnTooltip: {\r\n paddingTop: spacing.size8,\r\n paddingBottom: spacing.size8,\r\n marginBottom: spacing.size8,\r\n },\r\n columnCheckboxWrapper: {\r\n display: 'flex',\r\n gap: spacing.size8,\r\n alignItems: 'center',\r\n },\r\n });\r\n};\r\n\r\nexport const customStyles = {\r\n addMetricButtonRootStyle: { width: '100%' },\r\n sidePanelStyles: {\r\n header: {\r\n marginBottom: spacing.size24,\r\n },\r\n content: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n },\r\n footer: {\r\n borderTopStyle: 'solid',\r\n borderColor: theme.palette.neutralLight,\r\n borderTopWidth: 1,\r\n },\r\n },\r\n columnCheckbox: {\r\n root: {\r\n paddingTop: spacing.size8,\r\n paddingBottom: spacing.size8,\r\n marginBottom: spacing.size8,\r\n },\r\n },\r\n};\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles();\r\n}\r\nexport function getStackTokens(): IStackTokens {\r\n return { childrenGap: spacing.size12 };\r\n}\r\n","import { IconButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { useI18n } from '../../../../../i18n/useI18n';\r\nimport { getAppStore } from '../../../../@data';\r\nimport { getStore } from '../../../ad-management/Account/Settings/@data/store/store';\r\nimport { TythonColumnsEnum } from '../../@data/store/schema/ColumnsEnum';\r\nimport { default as messages } from '../../Report.messages';\r\nimport { formatMetric } from '../../utils/metricsFormatter';\r\nimport { TythonReportingDataRow } from '../@data/store/schema';\r\nimport { MetricMarker } from '../MetricMarker/MetricMarker';\r\nimport { IMetricMarkerProps } from '../MetricMarker/MetricMarker.types';\r\nimport { ActiveMetrics } from '../ReportCard/ReportCard.types';\r\nimport { customStyles, getClassNames } from './ChartMetricPicker.styles';\r\n\r\nexport interface IChartMetricPickerProps extends InjectedIntlProps {\r\n mode?: ChartSelectionMode;\r\n summaryData?: TythonReportingDataRow;\r\n activeMetrics: ActiveMetrics;\r\n onMetricSelected: (selectedMetric: IMetricMarkerProps) => void;\r\n onEditButtonClicked: () => void;\r\n}\r\nexport enum ChartSelectionMode {\r\n SINGLE = 'single',\r\n MULTI = 'multi',\r\n}\r\nexport const ChartMetricPicker = injectIntl(\r\n ({ activeMetrics, summaryData, onMetricSelected, onEditButtonClicked, intl: { formatMessage } }: IChartMetricPickerProps) => {\r\n const { contentStyle, markerWrapper } = getClassNames();\r\n const { publisher, userContext } = getAppStore();\r\n const { systemPreferences } = getStore().active;\r\n const { locale } = useI18n({ systemPreferences, publisher, userContext });\r\n\r\n const renderMarker = (metricProps: IMetricMarkerProps): JSX.Element => {\r\n return (\r\n <MetricMarker\r\n key={metricProps.metricKey}\r\n color={metricProps.color}\r\n metricName={metricProps.metricName}\r\n metricData={formatMetric(TythonColumnsEnum[metricProps.metricKey], summaryData?.[metricProps.metricKey], locale)}\r\n isActive={metricProps.isActive}\r\n onClick={() => {\r\n onMetricSelected(metricProps);\r\n }}\r\n metricKey={''}\r\n isVisible={metricProps.isVisible}\r\n disabled={metricProps.disabled}\r\n isIncompatible={metricProps.isIncompatible}\r\n incompatibleTooltipCantText={metricProps.incompatibleTooltipCantText}\r\n incompatibleTooltipWontText={metricProps.incompatibleTooltipWontText}\r\n />\r\n );\r\n };\r\n const renderVisibleMarkers = () => {\r\n return Object.keys(activeMetrics)\r\n .filter((key) => activeMetrics[key].isVisible && !activeMetrics[key].disabled)\r\n .map((key) => renderMarker(activeMetrics[key]));\r\n };\r\n return (\r\n <>\r\n {renderVisibleMarkers()}\r\n <div className={markerWrapper}>\r\n <div className={contentStyle}>\r\n <IconButton\r\n iconProps={{ iconName: 'Edit' }}\r\n onClick={onEditButtonClicked}\r\n styles={{ root: customStyles.addMetricButtonRootStyle }}\r\n title={formatMessage(messages.metricPickerEditButtonTitle)}\r\n />\r\n </div>\r\n </div>\r\n </>\r\n );\r\n }\r\n);\r\n","import { Checkbox, DefaultButton, List, Panel, PanelType, PrimaryButton } from '@fluentui/react';\r\nimport React, { useState } from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { IconTooltip } from '../../../../components/IconTooltip/IconTooltip';\r\nimport { IMetricMarkerProps } from '../MetricMarker/MetricMarker.types';\r\nimport { ActiveMetrics } from '../ReportCard/ReportCard.types';\r\nimport { customStyles, getClassNames } from './ChartMetricPicker.styles';\r\n\r\nexport interface IMetricsSidePanelProps extends InjectedIntlProps {\r\n onMetricsChanged: (activeMetrics: ActiveMetrics) => void;\r\n activeMetrics: ActiveMetrics;\r\n isOpen: boolean;\r\n onPanelHide: () => void;\r\n}\r\n\r\nexport const MetricsSidePanel = injectIntl(\r\n ({ isOpen, activeMetrics, onPanelHide, onMetricsChanged, intl: { formatMessage } }: IMetricsSidePanelProps) => {\r\n const { panelButton, columnTooltip, columnCheckboxWrapper } = getClassNames();\r\n const [availableMetrics, setAvailableMetrics] = useState<IMetricMarkerProps[]>([]);\r\n const onRenderCell = (item: IMetricMarkerProps): JSX.Element => {\r\n return (\r\n <div className={columnCheckboxWrapper}>\r\n <Checkbox\r\n label={item.metricName}\r\n defaultChecked={item.isVisible}\r\n onChange={(_, value) => {\r\n const temp = {\r\n ...item,\r\n isVisible: !!value,\r\n isActive: !value ? false : item.isActive,\r\n };\r\n setAvailableMetrics([...availableMetrics, temp]);\r\n }}\r\n styles={customStyles.columnCheckbox}\r\n />\r\n {item.isIncompatible && (\r\n <div className={columnTooltip}>\r\n <IconTooltip tooltipMessage={item.incompatibleTooltipWontText || ''} iconName={'warning'} />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n const onSave = () => {\r\n for (const updatedMetric of availableMetrics) {\r\n activeMetrics[updatedMetric.metricKey] = { ...updatedMetric };\r\n }\r\n setAvailableMetrics([]);\r\n onMetricsChanged({ ...activeMetrics });\r\n onPanelHide();\r\n };\r\n return (\r\n <Panel\r\n isOpen={isOpen}\r\n type={PanelType.smallFixedFar}\r\n isLightDismiss\r\n onDismiss={onPanelHide}\r\n headerText={formatMessage(AppMessages.addMetrics)}\r\n closeButtonAriaLabel={formatMessage(AppMessages.panelCloseButtonAriaDesc)}\r\n isFooterAtBottom={true}\r\n styles={customStyles.sidePanelStyles}\r\n onRenderFooterContent={() => {\r\n return (\r\n <div className={panelButton}>\r\n <PrimaryButton\r\n onClick={onSave}\r\n text={formatMessage(AppMessages.save)}\r\n ariaDescription={formatMessage(AppMessages.ariaLabelForSave)}\r\n />\r\n <DefaultButton onClick={onPanelHide} text={formatMessage(AppMessages.cancel)} />\r\n </div>\r\n );\r\n }}\r\n >\r\n <List items={Object.values(activeMetrics).filter((metric) => !metric.disabled)} onRenderCell={onRenderCell} />\r\n </Panel>\r\n );\r\n }\r\n);\r\n","import { getTheme, IStackTokens, ITheme, mergeStyleSets } from '@fluentui/react';\r\nimport { AccessibilityContrast, IPubcenterPalette, IPubcenterTheme } from '../../../../../theme';\r\n\r\nexport interface IReportCardStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\ntype StyleProperties = 'active' | 'metricsDropdown' | 'cardWrapper' | 'buttonBorder' | 'cardsTitleBarStyle' | 'linkStyle';\r\ntype ReportCardStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: IReportCardStyleProps): ReportCardStyles => {\r\n const { theme } = props;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const { Activated } = AccessibilityContrast;\r\n\r\n return mergeStyleSets({\r\n active: {\r\n backgroundColor: palette.themePrimary,\r\n color: palette.themeLight,\r\n ':hover': {\r\n backgroundColor: palette.themePrimary,\r\n color: palette.themeLight,\r\n },\r\n ':active': {\r\n backgroundColor: palette.themePrimary,\r\n color: palette.themeLight,\r\n },\r\n [Activated]: {\r\n color: 'window',\r\n backgroundColor: 'windowtext',\r\n borderColor: 'windowtext',\r\n forcedColorAdjust: 'none',\r\n },\r\n },\r\n metricsDropdown: {\r\n width: '30%',\r\n paddingTop: '15px',\r\n paddingBottom: '15px',\r\n },\r\n cardWrapper: {\r\n height: '100%',\r\n },\r\n buttonBorder: {\r\n border: '1px solid',\r\n borderRadius: '2px',\r\n borderColor: palette.neutralLight,\r\n },\r\n cardsTitleBarStyle: {\r\n borderBottom: `1px solid ${palette.neutralLight}`,\r\n boxSizing: 'border-box',\r\n },\r\n linkStyle: {\r\n color: theme.palette.themePrimary,\r\n textDecoration: 'none',\r\n },\r\n });\r\n};\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\nexport function getStackTokens(): IStackTokens {\r\n const theme = (getTheme() as unknown) as IPubcenterTheme;\r\n const spacing = theme.spacing;\r\n\r\n return { childrenGap: spacing.size12 };\r\n}\r\nexport function getMetricPickerStackTokens(): IStackTokens {\r\n return { childrenGap: `40px 20px` };\r\n}\r\n","import { DefaultButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { GRAIN_SELECTOR_BUTTON } from '../../../../constants/DataTestIdConstants';\r\nimport { getReportGrainsMetadataDisplayName } from '../../utils/intlHelper';\r\nimport { IMetadataElement } from '../@data/store/schema';\r\nimport { getClassNames } from '../ReportCard/ReportCard.styles';\r\nimport { ChartGrain } from '../ReportCard/ReportCard.types';\r\nexport interface IGrainSelectorProps extends InjectedIntlProps {\r\n activeGrain: ChartGrain;\r\n activeGrainChanged: (grain: ChartGrain) => void;\r\n allowedGrains: IMetadataElement[];\r\n}\r\n\r\nexport const GrainSelector = injectIntl(\r\n ({ allowedGrains, activeGrain, activeGrainChanged, intl: { formatMessage } }: IGrainSelectorProps) => {\r\n const { active, buttonBorder } = getClassNames();\r\n return (\r\n <>\r\n <div>\r\n {allowedGrains\r\n .filter((allowedGrain) => allowedGrain.key !== ChartGrain.NONE)\r\n .map((allowedGrain) => {\r\n const isActive = activeGrain === (allowedGrain.key as ChartGrain);\r\n return (\r\n <DefaultButton\r\n data-test-id={`${GRAIN_SELECTOR_BUTTON}-${allowedGrain.key}`}\r\n key={allowedGrain.key}\r\n className={isActive ? active : buttonBorder}\r\n toggle\r\n checked={isActive}\r\n text={getReportGrainsMetadataDisplayName(allowedGrain.key, formatMessage)}\r\n onClick={() => {\r\n activeGrainChanged(allowedGrain.key as ChartGrain);\r\n }}\r\n allowDisabledFocus\r\n />\r\n );\r\n })}\r\n </div>\r\n </>\r\n );\r\n }\r\n);\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n backButtonAriaDesc: {\r\n id: 'detailPage.backButtonAriaDesc',\r\n defaultMessage: 'Click to go back to Dashboard',\r\n },\r\n breadcrumbAriaLabel: {\r\n id: 'detailPage.breadcrumbAriaLabel',\r\n defaultMessage: 'Bread crumb showing the heirarchy of reports',\r\n },\r\n exportButton: {\r\n id: 'detailPage.exportButton',\r\n defaultMessage: 'Export',\r\n },\r\n removeBreakdown: {\r\n id: 'detailPage.removeBreakdown',\r\n defaultMessage: 'Remove current break down',\r\n },\r\n generatingAndExportingPNG: {\r\n id: 'detailsPage.generatingAndExportingPNG',\r\n defaultMessage: 'Generating and exporting PNG',\r\n },\r\n});\r\n","import { getTheme, ITheme, mergeStyleSets } from '@fluentui/react';\r\n\r\nexport interface IMenuItemWarningIconStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\ntype StyleProperties = 'wrapper';\r\ntype MenuItemWarningIconStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: IMenuItemWarningIconStyleProps): MenuItemWarningIconStyles => {\r\n return mergeStyleSets({\r\n wrapper: {\r\n display: 'flex',\r\n gap: '10px',\r\n },\r\n });\r\n};\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import React from 'react';\r\nimport { IconTooltip } from '../../../../../components/IconTooltip/IconTooltip';\r\nimport { getClassNames } from './MenuItemWarningIcon.styles';\r\n\r\nexport interface IMenuItemWarningIconProps {\r\n text: string;\r\n warningMessage: string;\r\n isIncompatible: Boolean;\r\n}\r\n\r\nexport const MenuItemWarningIcon = (props: IMenuItemWarningIconProps) => {\r\n const classNames = getClassNames(props);\r\n const { warningMessage, isIncompatible, text } = props;\r\n return (\r\n <div className={classNames.wrapper}>\r\n {text}\r\n {isIncompatible && renderWarningIcon(warningMessage)}\r\n </div>\r\n );\r\n};\r\nfunction renderWarningIcon(message: string): React.ReactNode {\r\n return <IconTooltip iconName=\"warning\" tooltipMessage={message} />;\r\n}\r\n","import { getTheme, ITheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterPalette } from '../../../../../../theme';\r\n\r\nexport interface IReportDetailsGridStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\ntype StyleProperties = 'breakdownWrapper' | 'breakdownText' | 'inCompatibleColumnWrapper';\r\ntype ReportDetailsGridStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: IReportDetailsGridStyleProps): ReportDetailsGridStyles => {\r\n const theme = getTheme();\r\n const palette = theme.palette as IPubcenterPalette;\r\n return mergeStyleSets({\r\n breakdownWrapper: {\r\n display: 'flex',\r\n gap: '5px',\r\n },\r\n breakdownText: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n inCompatibleColumnWrapper: {\r\n color: palette.neutralTertiary,\r\n display: 'flex',\r\n gap: '8px',\r\n },\r\n });\r\n};\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { Dropdown, DropdownMenuItemType, IconButton, SelectionMode } from '@fluentui/react';\r\nimport React, { useState } from 'react';\r\nimport { useI18n } from '../../../../../../i18n/useI18n';\r\nimport { getAppStore } from '../../../../../@data';\r\nimport { IconTooltip } from '../../../../../components/IconTooltip/IconTooltip';\r\nimport {\r\n CommandBarActions,\r\n Direction,\r\n GridSelectionMode,\r\n GridV2,\r\n IBuildCommandBarProps,\r\n IGridPageCommandBarItemProps,\r\n IGridV2Column,\r\n} from '../../../../../layout/GridPageV2';\r\nimport { IRouterWithIntl, injectIntlAndObserver } from '../../../../../utils';\r\nimport { getStore } from '../../../../ad-management/Account/Settings/@data/store/store';\r\nimport { TythonColumnsEnum } from '../../../@data/store/schema/ColumnsEnum';\r\nimport { default as reportMessages } from '../../../Report.messages';\r\nimport { EXCLUDED_FILTER_COLUMNS } from '../../../constants/common';\r\nimport { FormatMessageFuncType, getReportColumnMetadataDisplayName } from '../../../utils/intlHelper';\r\nimport { roundMetric } from '../../../utils/metricsFormatter';\r\nimport { IMetadataElement, ReportingDataRow, TythonReportingDataRow } from '../../@data/store/schema';\r\nimport {\r\n buildGridV2Columns,\r\n getIncompatibleBreakdownMessage,\r\n getIncompatibleColumnWithBreakdownAndFilterMessage,\r\n getIncompatibleColumnWithBreakdownMessage,\r\n getIncompatibleColumnWithFilterMessage,\r\n} from '../../ReportCard/ReportCard.helpers';\r\nimport { ChartGrain } from '../../ReportCard/ReportCard.types';\r\nimport { IActiveFilter } from '../ActionBar/ActionBar';\r\nimport reportDetailsMessages from '../ReportDetailsPage.messages';\r\nimport { MenuItemWarningIcon } from '../WarningIcon/MenuItemWarningIcon';\r\nimport { getClassNames } from './ReportDetailsGrid.styles';\r\n\r\nexport interface IReportDetailsGridProps extends IRouterWithIntl {\r\n data: ReportingDataRow[];\r\n isDetailedDataLoaded: boolean;\r\n hasMinimumBreakdown: boolean;\r\n dimensions: IMetadataElement[];\r\n metrics: IMetadataElement[];\r\n currentChartGrain: ChartGrain;\r\n initialBreakdown: IMetadataElement[];\r\n defaultColumns: TythonColumnsEnum[];\r\n dateDimension: string;\r\n filters: IActiveFilter[];\r\n onBreakdownChanged: (newBreakdown: IMetadataElement[]) => void;\r\n}\r\nconst unAllowedBreakdown = EXCLUDED_FILTER_COLUMNS;\r\nconst removeKey = 'remove';\r\nexport const ReportDetailsGrid = injectIntlAndObserver<IReportDetailsGridProps>(\r\n ({\r\n data,\r\n dimensions,\r\n metrics,\r\n isDetailedDataLoaded,\r\n hasMinimumBreakdown,\r\n initialBreakdown,\r\n defaultColumns,\r\n currentChartGrain,\r\n dateDimension,\r\n filters,\r\n history,\r\n match,\r\n location,\r\n onBreakdownChanged,\r\n intl: { formatMessage },\r\n }: IReportDetailsGridProps) => {\r\n const classNames = getClassNames();\r\n const { publisher, userContext } = getAppStore();\r\n const { systemPreferences } = getStore().active;\r\n const { locale } = useI18n({ systemPreferences, publisher, userContext });\r\n const dateTimeColumn = dimensions.find((value) => value.key === TythonColumnsEnum.DateTime || value.key === TythonColumnsEnum.Date);\r\n const addDateColumn = currentChartGrain !== ChartGrain.NONE && dateTimeColumn;\r\n const breakdownList = dimensions.filter((value) => !unAllowedBreakdown.includes(value.key as TythonColumnsEnum));\r\n const formattedData = formatDate(roundMetrics(data), currentChartGrain, dateDimension, locale);\r\n const [activeDimensions, setActiveDimensions] = useState<IMetadataElement[]>(initialBreakdown);\r\n const [metricColumns] = useState(\r\n addCompatibilityProps(buildGridV2Columns([], metrics, defaultColumns, formatMessage), filters, activeDimensions)\r\n );\r\n const [dimensionColumns] = useState(\r\n buildGridV2Columns(addDateColumn ? [dateTimeColumn, ...activeDimensions] : activeDimensions, [], defaultColumns, formatMessage)\r\n );\r\n const [gridColumns, setGridColumns] = useState(applyOrdering([...dimensionColumns, ...metricColumns]));\r\n\r\n function addCompatibilityProps(\r\n metricGridColumns: IGridV2Column[],\r\n activeFilters: IActiveFilter[],\r\n activeBreakdowns: IMetadataElement[] = []\r\n ) {\r\n return metricGridColumns.map((column) => {\r\n const metricMetadata = metrics.find((metric) => metric.key === column.key);\r\n const incompatibleFields = (metricMetadata && getIncompatibleBreakdown(metricMetadata, activeBreakdowns, formatMessage)) || [];\r\n const breakdownIncompatibleMessage = getIncompatibleColumnWithBreakdownMessage(\r\n getReportColumnMetadataDisplayName(column.key, formatMessage) || '',\r\n incompatibleFields[0]\r\n );\r\n const isBreakdownIncompatible = incompatibleFields.length > 0;\r\n const incompatibleFilters = (metricMetadata && getIncompatibleFilters(metricMetadata, activeFilters, formatMessage)) || [];\r\n const filterIncompatibleMessage = getIncompatibleColumnWithFilterMessage(\r\n getReportColumnMetadataDisplayName(column.key, formatMessage) || '',\r\n incompatibleFilters[0]\r\n );\r\n const filterAndBreakdownIncompatibleMessage = getIncompatibleColumnWithBreakdownAndFilterMessage(\r\n getReportColumnMetadataDisplayName(column.key, formatMessage) || '',\r\n incompatibleFilters[0]\r\n );\r\n const isFilterIncompatible = incompatibleFilters.length > 0;\r\n const isIncompatible = isBreakdownIncompatible || isFilterIncompatible;\r\n const incompatibleMessage =\r\n isBreakdownIncompatible && isFilterIncompatible\r\n ? filterAndBreakdownIncompatibleMessage\r\n : isBreakdownIncompatible\r\n ? breakdownIncompatibleMessage\r\n : filterIncompatibleMessage;\r\n return {\r\n ...column,\r\n incompatibleProps: {\r\n isIncompatible: isIncompatible,\r\n incompatibleCantMessage: isIncompatible ? formatMessage(incompatibleMessage.cantMessage, incompatibleMessage.params) : '',\r\n incompatibleWontMessage: isIncompatible ? formatMessage(incompatibleMessage.wontMessage, incompatibleMessage.params) : '',\r\n },\r\n suppressSorting: isIncompatible,\r\n onRenderHeader: (props, defaultRender) => {\r\n return isIncompatible ? (\r\n <div className={classNames.inCompatibleColumnWrapper}>\r\n <span>{props?.column.name}</span>\r\n <IconTooltip\r\n tooltipMessage={isIncompatible ? formatMessage(incompatibleMessage.cantMessage, incompatibleMessage.params) : ''}\r\n iconName={'warning'}\r\n />\r\n </div>\r\n ) : (\r\n defaultRender(props)\r\n );\r\n },\r\n };\r\n });\r\n }\r\n const getBreakdownComponent = () => {\r\n return (\r\n <div className={classNames.breakdownWrapper}>\r\n <div className={classNames.breakdownText}>{formatMessage(reportMessages.breakDownBy)}</div>\r\n {activeDimensions.map((activeDimension, index) => {\r\n return (\r\n <Dropdown\r\n key={index}\r\n selectedKey={activeDimension.key}\r\n onChange={(event, item) => {\r\n let newActiveDimensions;\r\n if (!item) {\r\n return;\r\n }\r\n if (item.key === removeKey) {\r\n newActiveDimensions = activeDimensions.filter((active) => {\r\n return active.key !== activeDimension.key;\r\n });\r\n } else {\r\n activeDimensions[index] = {\r\n displayName: item.text,\r\n key: String(item.key),\r\n filterKey: '',\r\n incompatibleFields: activeDimension.incompatibleFields,\r\n };\r\n newActiveDimensions = activeDimensions;\r\n }\r\n onBreakdownChanged([...newActiveDimensions]);\r\n setActiveDimensions([...newActiveDimensions]);\r\n setGridColumns(\r\n applyOrdering([\r\n ...buildGridV2Columns(\r\n addDateColumn ? [dateTimeColumn, ...newActiveDimensions] : newActiveDimensions,\r\n [],\r\n defaultColumns,\r\n formatMessage\r\n ),\r\n ...addCompatibilityProps(metricColumns, filters, newActiveDimensions),\r\n ])\r\n );\r\n }}\r\n onRenderOption={(option) => {\r\n return (\r\n <>\r\n <MenuItemWarningIcon\r\n text={option?.text || ''}\r\n warningMessage={option?.data?.incompatibleMessage || ''}\r\n isIncompatible={option?.data?.isIncompatible || false}\r\n />\r\n </>\r\n );\r\n }}\r\n options={[\r\n {\r\n key: removeKey,\r\n text: formatMessage(reportDetailsMessages.removeBreakdown),\r\n disabled: hasMinimumBreakdown && activeDimensions.length <= 1,\r\n title: formatMessage(reportDetailsMessages.removeBreakdown),\r\n },\r\n { key: 'divider_1', text: '-', itemType: DropdownMenuItemType.Divider },\r\n ...breakdownList.map((breakdown) => {\r\n const incompatibleMetrics = getIncompatibleFields(breakdown, gridColumns);\r\n const incompatibleMessage = getIncompatibleBreakdownMessage(\r\n incompatibleMetrics[0],\r\n getReportColumnMetadataDisplayName(breakdown.key, formatMessage)\r\n );\r\n\r\n return {\r\n key: breakdown.key,\r\n text: getReportColumnMetadataDisplayName(breakdown.key, formatMessage),\r\n disabled: !!activeDimensions.find((active) => active.key === breakdown.key),\r\n data: {\r\n isIncompatible: incompatibleMetrics.length > 0,\r\n incompatibleMessage: formatMessage(incompatibleMessage.message, incompatibleMessage.params),\r\n },\r\n };\r\n }),\r\n ]}\r\n dropdownWidth={'auto'}\r\n />\r\n );\r\n })}\r\n {activeDimensions.length < breakdownList.length && (\r\n <IconButton\r\n menuProps={{\r\n items: breakdownList\r\n .filter((dimension) => !activeDimensions.find((active) => active.key === dimension.key))\r\n .map((dimension) => {\r\n const incompatibleMetrics = getIncompatibleFields(dimension, gridColumns);\r\n\r\n const incompatibleMessage = getIncompatibleBreakdownMessage(\r\n incompatibleMetrics[0],\r\n getReportColumnMetadataDisplayName(dimension.key, formatMessage)\r\n );\r\n return {\r\n key: dimension.key,\r\n text: getReportColumnMetadataDisplayName(dimension.key, formatMessage),\r\n onClick: () => {\r\n activeDimensions.push(dimension);\r\n setActiveDimensions([...activeDimensions]);\r\n onBreakdownChanged([...activeDimensions]);\r\n setGridColumns(\r\n applyOrdering([\r\n ...buildGridV2Columns(\r\n addDateColumn ? [dateTimeColumn, ...activeDimensions] : activeDimensions,\r\n [],\r\n defaultColumns,\r\n formatMessage\r\n ),\r\n ...addCompatibilityProps(metricColumns, filters, activeDimensions),\r\n ])\r\n );\r\n },\r\n onRenderContent: (props) => {\r\n return (\r\n <MenuItemWarningIcon\r\n text={props.item.text || ''}\r\n warningMessage={formatMessage(incompatibleMessage.message, incompatibleMessage.params)}\r\n isIncompatible={incompatibleMetrics.length > 0}\r\n />\r\n );\r\n },\r\n };\r\n }),\r\n }}\r\n iconProps={{ iconName: 'Add' }}\r\n ariaLabel=\"Add\"\r\n />\r\n )}\r\n </div>\r\n );\r\n };\r\n const commandBarProps: IBuildCommandBarProps<TythonReportingDataRow> = {\r\n includeActions: [CommandBarActions.custom],\r\n includeFarActions: [CommandBarActions.searchBox, CommandBarActions.modifyColumns],\r\n hideModifyColumnsDescription: true,\r\n getCustomCommandBarItems: () => {\r\n const commandBarItems: IGridPageCommandBarItemProps[] = [\r\n {\r\n key: 'breakdown',\r\n placement: { direction: Direction.before },\r\n commandBarButtonAs: getBreakdownComponent,\r\n selectionModes: [GridSelectionMode.None],\r\n },\r\n ];\r\n\r\n return commandBarItems;\r\n },\r\n };\r\n\r\n return (\r\n <div>\r\n <GridV2\r\n entity={ReportingDataRow}\r\n dataGridProps={{\r\n shimmerLines: 10,\r\n selectionMode: SelectionMode.none,\r\n renderEmptyGrid: true,\r\n noEntityFound: reportMessages.noData,\r\n data: redactIncompatibleFields(gridColumns, formattedData),\r\n gridV2Columns: gridColumns,\r\n onColumnsChanged(columns) {\r\n setGridColumns(columns);\r\n },\r\n }}\r\n commandBarProps={commandBarProps}\r\n isGridReady={isDetailedDataLoaded}\r\n paginationProps={{\r\n shouldGridHandlePagination: true,\r\n }}\r\n history={history}\r\n location={location}\r\n match={match}\r\n />\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nfunction redactIncompatibleFields(gridColumns: IGridV2Column[], data: ReportingDataRow[]) {\r\n const incompatibleFields = gridColumns\r\n .filter((column) => {\r\n return column.incompatibleProps?.isIncompatible && column.isVisible;\r\n })\r\n .map((column) => column.key);\r\n return data.map((row) => {\r\n const newRow = { ...row };\r\n for (const field of incompatibleFields) {\r\n newRow[field] = '--';\r\n }\r\n return newRow;\r\n });\r\n}\r\n\r\nfunction getIncompatibleFields(field: IMetadataElement, gridColumns: IGridV2Column[]) {\r\n const incompatibleSet = new Set(field.incompatibleFields);\r\n const incompatibleFields = gridColumns\r\n .filter((column) => {\r\n return incompatibleSet.has(column.key as TythonColumnsEnum) && column.isVisible;\r\n })\r\n .map((column) => column.name);\r\n return incompatibleFields;\r\n}\r\nfunction getIncompatibleFilters(field: IMetadataElement, filters: IActiveFilter[], formatMessage: FormatMessageFuncType) {\r\n const incompatibleSet = new Set(field.incompatibleFields);\r\n const incompatibleFields = filters\r\n .filter((filter) => {\r\n return incompatibleSet.has(filter.key as TythonColumnsEnum);\r\n })\r\n .map((filter) => getReportColumnMetadataDisplayName(filter.key, formatMessage));\r\n return incompatibleFields;\r\n}\r\nfunction getIncompatibleBreakdown(field: IMetadataElement, breakdownList: IMetadataElement[], formatMessage: FormatMessageFuncType) {\r\n const incompatibleSet = new Set(field.incompatibleFields);\r\n const incompatibleFields = breakdownList\r\n .filter((breakdown) => {\r\n return incompatibleSet.has(breakdown.key as TythonColumnsEnum);\r\n })\r\n .map((breakdown) => getReportColumnMetadataDisplayName(breakdown.key, formatMessage));\r\n return incompatibleFields;\r\n}\r\n\r\nfunction applyOrdering(columns: IGridV2Column[]): IGridV2Column[] {\r\n return columns.map((column, index) => {\r\n column.columnOrder = index;\r\n return column;\r\n });\r\n}\r\n\r\nexport function roundMetrics(data: ReportingDataRow[]) {\r\n return data.map((row) => {\r\n const newRow = { ...row };\r\n for (const field of Object.keys(row)) {\r\n newRow[field] = roundMetric(TythonColumnsEnum[field], row[field], true);\r\n }\r\n return newRow;\r\n });\r\n}\r\nexport function formatDate(data: TythonReportingDataRow[], currentChartGrain: ChartGrain, dateDimension: string, locale) {\r\n return data.map((row) => {\r\n if (row[dateDimension]) {\r\n const newRow = { ...row };\r\n const options: Intl.DateTimeFormatOptions = {};\r\n currentChartGrain === ChartGrain.HOURLY && (options.hour = '2-digit');\r\n if (currentChartGrain === ChartGrain.MONTHLY || currentChartGrain === ChartGrain.MONTH_AND_YEAR) {\r\n options.month = 'short';\r\n options.year = 'numeric';\r\n }\r\n currentChartGrain === ChartGrain.YEARLY && (options.year = 'numeric');\r\n const dateValue = new Date(row[dateDimension]).toLocaleDateString(locale, options);\r\n newRow[dateDimension] = dateValue;\r\n return newRow;\r\n }\r\n return row;\r\n });\r\n}\r\n","export enum Schedule {\r\n NONE,\r\n DAILY,\r\n WEEKLY,\r\n MONTHLY,\r\n}\r\n","import { getTheme, IStackTokens, ITheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterPalette, IPubcenterTheme } from '../../../../../theme';\r\n\r\ninterface IShareModalStyleProps {\r\n theme: ITheme;\r\n}\r\ntype StyleProperties = 'errorMessage';\r\ntype ShareModalStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: IShareModalStyleProps): ShareModalStyles => {\r\n const { theme } = props;\r\n const palette = theme.palette as IPubcenterPalette;\r\n return mergeStyleSets({\r\n errorMessage: {\r\n color: palette.error,\r\n },\r\n });\r\n};\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\nexport function getStackTokens(): IStackTokens {\r\n const theme = (getTheme() as unknown) as IPubcenterTheme;\r\n const spacing = theme.spacing;\r\n\r\n return { childrenGap: spacing.size12 };\r\n}\r\n","import {\r\n CompactPeoplePicker,\r\n DefaultButton,\r\n Dialog,\r\n DialogFooter,\r\n DialogType,\r\n Dropdown,\r\n IDropdownOption,\r\n Label,\r\n PrimaryButton,\r\n ValidationState,\r\n} from '@fluentui/react';\r\nimport React, { useState } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { injectIntlAndObserver, validateSchema } from '../../../../utils';\r\nimport messages from '../../Report.messages';\r\nimport { IShareViewModel } from '../@data/schema/IShareViewModel';\r\nimport { shareErrorModel } from '../@data/schema/ShareErrorModel';\r\nimport { Schedule } from '../@data/schema/ShareSchedule';\r\nimport { getClassNames } from './ShareModal.styles';\r\n\r\nexport interface IShareModalProps extends InjectedIntlProps {\r\n enabled: boolean;\r\n disableModal: () => void;\r\n}\r\nexport interface IShareModalErrors {\r\n schedule?: string;\r\n emails?: string;\r\n}\r\nconst MODAL_WIDTH = 560;\r\nexport const ShareModal = injectIntlAndObserver<IShareModalProps>(({ enabled, disableModal, intl }) => {\r\n const classNames = getClassNames();\r\n const { formatMessage } = intl;\r\n const [shareSchedule, setShareSchedule] = useState(getScheduleOptions()[0].key);\r\n const [emails, setEmails] = useState<string[]>([]);\r\n const [shareErrors, setShareErrors] = useState<IShareModalErrors>({});\r\n\r\n return (\r\n <Dialog\r\n minWidth={MODAL_WIDTH}\r\n hidden={!enabled}\r\n onDismiss={() => {\r\n disableModal();\r\n }}\r\n dialogContentProps={{\r\n type: DialogType.normal,\r\n title: 'Share',\r\n }}\r\n modalProps={{ isBlocking: false }}\r\n >\r\n <Label required>{formatMessage(messages.shareScheduleDropdownLabel)}</Label>\r\n <Dropdown\r\n options={getScheduleOptions()}\r\n defaultSelectedKey={shareSchedule}\r\n onChange={(_, option) => {\r\n if (option) {\r\n setShareSchedule(option.key);\r\n }\r\n }}\r\n ariaLabel={formatMessage(messages.shareScheduleDropdownLabel)}\r\n errorMessage={shareErrors.schedule}\r\n />\r\n <Label required>Send the report to these people</Label>\r\n <CompactPeoplePicker\r\n selectionAriaLabel={'Selected contacts'}\r\n removeButtonAriaLabel={'Remove'}\r\n onChange={(items) => {\r\n const newEmails = items\r\n ? items.map((item) => {\r\n return item.key as string;\r\n })\r\n : [];\r\n setEmails([...newEmails]);\r\n }}\r\n className={'ms-PeoplePicker'}\r\n onValidateInput={(input: string) => {\r\n if (emails.includes(input)) {\r\n return ValidationState.invalid;\r\n }\r\n return ValidationState.valid;\r\n }}\r\n inputProps={{\r\n 'aria-label': 'People Picker',\r\n }}\r\n onResolveSuggestions={() => []}\r\n />\r\n <span className={classNames.errorMessage} hidden={!shareErrors.emails}>\r\n Emails Must Have Valid Values\r\n </span>\r\n <DialogFooter>\r\n <PrimaryButton\r\n onClick={async () => {\r\n try {\r\n await validateSchema(shareErrorModel(), { schedule: shareSchedule, emails } as IShareViewModel);\r\n setShareErrors({});\r\n } catch (e) {\r\n setShareErrors({ ...shareErrors, ...e });\r\n return;\r\n }\r\n }}\r\n text=\"Save\"\r\n />\r\n <DefaultButton\r\n onClick={() => {\r\n disableModal();\r\n }}\r\n text=\"Cancel\"\r\n />\r\n </DialogFooter>\r\n </Dialog>\r\n );\r\n});\r\nexport function getScheduleOptions(): IDropdownOption[] {\r\n // TODO: Add logic to fetch correct options\r\n return [\r\n { key: Schedule.NONE, text: 'None' },\r\n { key: Schedule.DAILY, text: 'Daily' },\r\n { key: Schedule.WEEKLY, text: 'Weekly' },\r\n { key: Schedule.MONTHLY, text: 'Monthly' },\r\n ];\r\n}\r\n","import { mixed, object, string } from 'yup';\r\nimport { StringListSchemaYupType } from '../../../../../utils';\r\nimport { IShareViewModel } from './IShareViewModel';\r\nimport { Schedule } from './ShareSchedule';\r\n\r\nexport function shareErrorModel() {\r\n return object<IShareViewModel>().shape({\r\n schedule: mixed().oneOf([Schedule.NONE, Schedule.DAILY, Schedule.WEEKLY, Schedule.MONTHLY]).required(),\r\n emails: new StringListSchemaYupType().of(string().trim().email().required()).required(),\r\n });\r\n}\r\n","import { IconButton } from '@fluentui/react';\r\nimport React, { useState } from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport messages from '../../Report.messages';\r\nimport { getClassNames } from '../ReportCard/ReportCard.styles';\r\nimport { ChartGrain, ChartTypes, IChartButton } from '../ReportCard/ReportCard.types';\r\nexport interface IChartTypeSelectorProps extends InjectedIntlProps {\r\n allowedChartTypes: IChartButton[];\r\n currentChartType: ChartTypes;\r\n onChartTypeChange: (grain: ChartTypes) => void;\r\n setCurrentChartGrain: (grain: ChartGrain) => void;\r\n enableHideChartsButton?: boolean;\r\n onChartsHideClicked: (hidden: boolean) => void;\r\n}\r\n\r\nexport const ChartTypeSelector = injectIntl<IChartTypeSelectorProps>(\r\n ({\r\n currentChartType,\r\n onChartTypeChange,\r\n allowedChartTypes,\r\n setCurrentChartGrain,\r\n enableHideChartsButton,\r\n onChartsHideClicked,\r\n intl: { formatMessage },\r\n }: IChartTypeSelectorProps) => {\r\n const { active, buttonBorder } = getClassNames();\r\n const [chartsHidden, setChartsHidden] = useState(false);\r\n const onHideChartsClick = () => {\r\n const newValue = !chartsHidden;\r\n onChartsHideClicked(newValue);\r\n setChartsHidden(newValue);\r\n };\r\n return (\r\n <>\r\n {allowedChartTypes.map((chart, index) => {\r\n const onChartTypeIconClick = () => {\r\n onChartTypeChange(chart.chartType);\r\n };\r\n return (\r\n <IconButton\r\n key={index}\r\n title={formatMessage(messages.chartSelectIcon, { chartType: chart.chartType })}\r\n iconProps={{ iconName: chart.iconName }}\r\n className={currentChartType === chart.chartType && !chart.disabled && !chartsHidden ? active : buttonBorder}\r\n onClick={onChartTypeIconClick}\r\n disabled={chart.disabled || chartsHidden}\r\n data-test-id={chart.dataTestId}\r\n />\r\n );\r\n })}\r\n {!!enableHideChartsButton && (\r\n <IconButton\r\n title={formatMessage(messages.toggleChartIcon)}\r\n iconProps={{ iconName: 'blocked' }}\r\n className={chartsHidden ? active : buttonBorder}\r\n onClick={onHideChartsClick}\r\n />\r\n )}\r\n </>\r\n );\r\n }\r\n);\r\n","import { CommandBarButton } from '@fluentui/react';\r\nimport React, { RefObject } from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { showLoadingToastNotification } from '../../../../@data';\r\nimport { breakdownDate } from '../../../../utils';\r\nimport ReportMessages from '../../Report.messages';\r\nimport { ICustomCalenderDateRange } from '../../components/CustomCalender/CustomCalender.types';\r\nimport { constructName, exportToPNG } from '../../utils/exportHelper';\r\nimport { IMetadataElement, IReportPageReportData, TythonReportingDataRow } from '../@data/store/schema';\r\nimport { ChartTypeSelector } from '../ChartTypeSelector/ChartTypeSelector';\r\nimport { exportReport, getTopData } from './ReportCard.helpers';\r\nimport { ChartGrain, ChartTypes, IChartButton } from './ReportCard.types';\r\n\r\nexport interface ITopBarActionsOptionsProps extends InjectedIntlProps {\r\n dateRange: ICustomCalenderDateRange;\r\n currentChartGrain: ChartGrain;\r\n currentChartType: ChartTypes;\r\n onChartTypeChange: (type: ChartTypes) => void;\r\n setCurrentChartGrain: (type: ChartGrain) => void;\r\n setEnableShare: (enable: boolean) => void;\r\n allowedChartTypes: IChartButton[];\r\n reportData: IReportPageReportData<TythonReportingDataRow>;\r\n mainDimension?: string;\r\n selectedMetric: string;\r\n columnsMetadata: IMetadataElement[];\r\n reportName: string;\r\n enableHideChartsButton?: boolean;\r\n onChartsHideClicked: (hidden: boolean) => void;\r\n isDetailedView: boolean;\r\n cardRef: RefObject<HTMLDivElement>;\r\n sysLocale: string;\r\n}\r\n\r\nexport const TopBarActions = injectIntl(\r\n ({\r\n onChartTypeChange,\r\n setCurrentChartGrain,\r\n dateRange,\r\n currentChartType,\r\n allowedChartTypes,\r\n setEnableShare,\r\n reportData,\r\n selectedMetric,\r\n mainDimension,\r\n columnsMetadata,\r\n reportName,\r\n enableHideChartsButton,\r\n onChartsHideClicked,\r\n currentChartGrain,\r\n isDetailedView,\r\n cardRef,\r\n intl: { formatMessage },\r\n sysLocale,\r\n }: ITopBarActionsOptionsProps) => {\r\n const brokenDownStartDate = breakdownDate(dateRange.startDate, sysLocale);\r\n const brokenDownEndDate = breakdownDate(dateRange.endDate, sysLocale);\r\n const startDateString = `${brokenDownStartDate.month}-${brokenDownStartDate.day}-${brokenDownStartDate.year}`;\r\n const endDateString = `${brokenDownEndDate.month}-${brokenDownEndDate.day}-${brokenDownEndDate.year}`;\r\n const exportedFileName = constructName(reportName, currentChartGrain, startDateString, endDateString);\r\n const disableExport = !reportData.isDataLoaded || !reportData.data || reportData.data.length <= 0;\r\n return (\r\n <>\r\n {allowedChartTypes.length > 1 && (\r\n <ChartTypeSelector\r\n allowedChartTypes={allowedChartTypes}\r\n currentChartType={currentChartType}\r\n onChartTypeChange={onChartTypeChange}\r\n setCurrentChartGrain={setCurrentChartGrain}\r\n enableHideChartsButton={enableHideChartsButton}\r\n onChartsHideClicked={onChartsHideClicked}\r\n />\r\n )}\r\n {!isDetailedView && (\r\n <>\r\n <CommandBarButton\r\n iconProps={{ iconName: 'More' }}\r\n onRenderMenuIcon={() => null}\r\n menuProps={{\r\n items: [\r\n {\r\n key: 'exportCSV',\r\n text: formatMessage(ReportMessages.exportCSV),\r\n onClick: () => {\r\n const dataToExport: TythonReportingDataRow[] = getDataToExport(selectedMetric, reportData.data, mainDimension);\r\n exportReport(dataToExport, columnsMetadata, exportedFileName, formatMessage);\r\n },\r\n disabled: disableExport,\r\n },\r\n {\r\n key: 'exportPNG',\r\n text: formatMessage(ReportMessages.exportPNG),\r\n onClick: async () => {\r\n showLoadingToastNotification({\r\n text: formatMessage(ReportMessages.topBarExportPNG),\r\n onDismiss: async () => {\r\n cardRef.current && (await exportToPNG(cardRef.current, exportedFileName));\r\n },\r\n });\r\n },\r\n disabled: disableExport,\r\n },\r\n // {\r\n // key: 'share',\r\n // text: 'Share',\r\n // onClick: () => {\r\n // setEnableShare(true);\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 function getDataToExport(selectedMetric: string, data?: TythonReportingDataRow[], mainDimension?: string) {\r\n let dataToExport: TythonReportingDataRow[];\r\n if (mainDimension) {\r\n dataToExport = getTopData(data || [], selectedMetric, mainDimension).topData.map((row) => {\r\n return {\r\n [mainDimension]: row[mainDimension],\r\n [selectedMetric]: row[selectedMetric],\r\n } as TythonReportingDataRow;\r\n });\r\n } else {\r\n dataToExport = data || [];\r\n }\r\n return dataToExport;\r\n}\r\n","import { Dropdown, Stack } from '@fluentui/react';\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { useI18n } from '../../../../../i18n/useI18n';\r\nimport { getAppStore } from '../../../../@data';\r\nimport { RoutePrefix } from '../../../../Routes';\r\nimport { Card } from '../../../../components/Card/Card';\r\nimport { HighChartsWrapper } from '../../../../components/HighCharts/HighChartsLibrary';\r\nimport { CHART_WRAPPER } from '../../../../constants/DataTestIdConstants';\r\nimport { injectIntlAndObserver } from '../../../../utils';\r\nimport { getStore } from '../../../ad-management/Account/Settings/@data/store/store';\r\nimport { setDataInURL } from '../../@data/store/UrlQueryStore';\r\nimport { TythonColumnsEnum } from '../../@data/store/schema/ColumnsEnum';\r\nimport { ReportsQueryStoreKeys } from '../../@data/store/schema/ReportsQueryStoreKeys';\r\nimport { RouteName } from '../../@data/store/store';\r\nimport messages from '../../Report.messages';\r\nimport { ratioMetrics } from '../../constants/ratioMetrics';\r\nimport { IMetadataElement } from '../@data/store/schema';\r\nimport { ChartMetricPicker, ChartSelectionMode } from '../ChartMetricPicker/ChartMetricPicker';\r\nimport { MetricsSidePanel } from '../ChartMetricPicker/MetricsSidePanel';\r\nimport { GrainSelector } from '../GrainSelector/GrainSelector';\r\nimport { IMetricMarkerProps } from '../MetricMarker/MetricMarker.types';\r\nimport { ReportDetailsGrid } from '../ReportDetailsPage/ReportDetailsGrid/ReportDetailsGrid';\r\nimport { ShareModal } from '../ShareModal/ShareModal';\r\nimport {\r\n getActiveMarkers,\r\n getChart,\r\n getMetricDropdownOptions,\r\n getShimmerCustomElements,\r\n getStartingBreakdown,\r\n getStartingChartGrain,\r\n} from './ReportCard.helpers';\r\nimport { getClassNames, getMetricPickerStackTokens, getStackTokens } from './ReportCard.styles';\r\nimport { ActiveMetrics, ChartGrain, ChartTypes, IChartsOptions, IReportCardProps, ReportCardType } from './ReportCard.types';\r\nimport { TopBarActions } from './TopBarActions';\r\n\r\nexport const ReportCard = injectIntlAndObserver<IReportCardProps>(\r\n ({\r\n title,\r\n type,\r\n intl: { formatMessage },\r\n reportData,\r\n reportDetailedData,\r\n summaryData = [],\r\n isSummaryDataLoaded,\r\n reportMetadata,\r\n allowedChartTypes,\r\n defaultColumns,\r\n defaultMetrics,\r\n defaultChartGrain,\r\n allowedChartGrains,\r\n showMetricsMarkers = false,\r\n mainDimension,\r\n dateDimension,\r\n enableHideChartsButton,\r\n showDetailsReportLink,\r\n dateRange,\r\n isDetailedView,\r\n filters,\r\n hasMinimumBreakdown = false,\r\n onChartGrainChanged,\r\n onSelectedMetricChanged,\r\n onActiveMetricsChanged,\r\n onBreakDownChanged,\r\n reportCardRef,\r\n history,\r\n location,\r\n match,\r\n }: IReportCardProps) => {\r\n const classNames = getClassNames();\r\n const { publisher, userContext } = getAppStore();\r\n const { systemPreferences } = getStore().active;\r\n const { locale } = useI18n({ systemPreferences, publisher, userContext });\r\n const viewReportRoute = `/${RoutePrefix.adManagement}/${publisher?.id}/${RouteName.dashboard}/${type}/${RouteName.reportDetails}`;\r\n const startingChartType = allowedChartTypes[0] || { chartType: ChartTypes.DONUT, disabled: false, iconName: ChartTypes.DONUT };\r\n const chartGrainStoreKey = `${title}-${ReportsQueryStoreKeys.CHART_GRAIN}`;\r\n const [currentChartType, setCurrentChartType] = useState(startingChartType.chartType);\r\n const startingChartGrain = getStartingChartGrain(\r\n defaultChartGrain,\r\n allowedChartGrains,\r\n startingChartType.chartType,\r\n chartGrainStoreKey\r\n );\r\n const chartComponentRef = useRef<HighChartsWrapper.RefObject>(null);\r\n const mapChartComponentRef = useRef<HighChartsWrapper.RefObject>(null);\r\n const [currentChartGrain, setCurrentChartGrain] = useState(startingChartGrain);\r\n const [currentBreakdown, setCurrentBreakdown] = useState(getStartingBreakdown(mainDimension));\r\n const defaultSelectedMetric = defaultMetrics && defaultMetrics[0] ? defaultMetrics[0] : '';\r\n const [selectedMetric, setSelectedMetric] = useState(defaultSelectedMetric);\r\n const [enableShare, setEnableShare] = useState(false);\r\n const [showCharts, setShowCharts] = useState(true);\r\n const [showSidePanel, setShowSidePanel] = useState<boolean>(false);\r\n const [activeMetrics, setActiveMetrics] = useState<ActiveMetrics>({});\r\n\r\n const isMetadataLoaded = !!reportMetadata;\r\n const hasEmptyData = !reportData || (reportData && reportData.length <= 0);\r\n const isDataLoaded = !!reportData;\r\n const showMetricsDropdown = currentChartType !== ChartTypes.LINE;\r\n const isDetailedDataLoaded = !!reportDetailedData;\r\n\r\n const [mainDimensionMetadata, setMainDimensionMetadata] = useState<IMetadataElement>({\r\n key: '',\r\n filterKey: '',\r\n displayName: '',\r\n incompatibleFields: [],\r\n });\r\n const [selectedMetricMetadata, setSelectedMetricMetadata] = useState<IMetadataElement>({\r\n key: '',\r\n filterKey: '',\r\n displayName: '',\r\n incompatibleFields: [],\r\n });\r\n const chartsOptions: IChartsOptions = {\r\n currentChartType,\r\n currentChartGrain,\r\n reportData: reportData || [],\r\n mainDimension: mainDimensionMetadata,\r\n selectedMetric: selectedMetricMetadata,\r\n chartComponentRef,\r\n mapChartComponentRef,\r\n activeMetrics,\r\n dateDimension,\r\n countryCodeDimension: TythonColumnsEnum.CountryCode,\r\n formatMessage,\r\n };\r\n const disabledRatioMetric = useMemo(() => {\r\n return currentChartType !== ChartTypes.LINE && currentChartType !== ChartTypes.MAP && ratioMetrics.includes(String(selectedMetric));\r\n }, [currentChartType, selectedMetric]);\r\n\r\n const onChartTypeChange = (newChartType: ChartTypes): void => {\r\n if (newChartType === ChartTypes.LINE) {\r\n setCurrentChartGrain(getStartingChartGrain(defaultChartGrain, allowedChartGrains, newChartType, chartGrainStoreKey));\r\n } else {\r\n setCurrentChartGrain(ChartGrain.NONE);\r\n }\r\n setCurrentChartType(newChartType);\r\n };\r\n const getTopBarActions = (): React.ReactNode => {\r\n return (\r\n <TopBarActions\r\n currentChartType={currentChartType}\r\n onChartTypeChange={onChartTypeChange}\r\n setCurrentChartGrain={setCurrentChartGrain}\r\n setEnableShare={setEnableShare}\r\n allowedChartTypes={allowedChartTypes}\r\n reportData={{\r\n data: reportData || [],\r\n isDataLoaded: !!reportData,\r\n }}\r\n selectedMetric={selectedMetric}\r\n columnsMetadata={reportMetadata ? [...reportMetadata.metrics, ...reportMetadata.dimensions] : []}\r\n reportName={title}\r\n mainDimension={mainDimension}\r\n enableHideChartsButton={enableHideChartsButton}\r\n onChartsHideClicked={(hidden: boolean) => {\r\n setShowCharts(!hidden);\r\n }}\r\n currentChartGrain={currentChartGrain}\r\n isDetailedView={isDetailedView}\r\n cardRef={reportCardRef}\r\n dateRange={dateRange}\r\n sysLocale={locale}\r\n />\r\n );\r\n };\r\n const onActiveGrainChanged = (grain: ChartGrain) => {\r\n setDataInURL(chartGrainStoreKey, grain);\r\n setCurrentChartGrain(grain);\r\n };\r\n\r\n const stringifiedFilters = JSON.stringify(filters);\r\n useEffect(() => {\r\n if (isMetadataLoaded) {\r\n const loadedMetrics = getActiveMarkers(\r\n reportMetadata.metrics,\r\n filters,\r\n currentChartType,\r\n defaultMetrics,\r\n formatMessage,\r\n type === ReportCardType.PERFORMANCE ? '' : selectedMetric\r\n );\r\n setActiveMetrics({\r\n ...loadedMetrics,\r\n });\r\n onActiveMetricsChanged && onActiveMetricsChanged(loadedMetrics);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isMetadataLoaded, currentChartType, stringifiedFilters, locale]);\r\n\r\n useEffect(() => {\r\n if (disabledRatioMetric) {\r\n setSelectedMetric(defaultSelectedMetric);\r\n }\r\n }, [disabledRatioMetric, defaultSelectedMetric]);\r\n useEffect(() => {\r\n setMainDimensionMetadata(\r\n reportMetadata?.dimensions.find((dimension) => dimension.key === mainDimension) ||\r\n ({\r\n key: '',\r\n filterKey: '',\r\n displayName: '',\r\n incompatibleFields: [],\r\n } as IMetadataElement)\r\n );\r\n setSelectedMetricMetadata(\r\n reportMetadata?.metrics.find((metric) => metric.key === selectedMetric) ||\r\n ({\r\n key: '',\r\n filterKey: '',\r\n displayName: '',\r\n incompatibleFields: [],\r\n } as IMetadataElement)\r\n );\r\n }, [reportMetadata, mainDimension, selectedMetric]);\r\n useEffect(() => {\r\n onChartGrainChanged && onChartGrainChanged(currentChartGrain);\r\n }, [currentChartGrain, onChartGrainChanged]);\r\n useEffect(() => {\r\n onSelectedMetricChanged && onSelectedMetricChanged(selectedMetric);\r\n }, [selectedMetric, onSelectedMetricChanged]);\r\n return (\r\n <div className={classNames.cardWrapper}>\r\n <Card\r\n titleText={title}\r\n shimmerCustomElement={getShimmerCustomElements(currentChartType)}\r\n isDataLoaded={(isDataLoaded || currentChartType === ChartTypes.GRID) && Object.keys(activeMetrics).length > 0}\r\n cardTopBarActions={getTopBarActions()}\r\n styleProps={{ titleBar: classNames.cardsTitleBarStyle }}\r\n >\r\n <div ref={reportCardRef}>\r\n <Stack tokens={getStackTokens()}>\r\n {showCharts && currentChartType === ChartTypes.LINE && (\r\n <Stack horizontalAlign=\"end\">\r\n <GrainSelector\r\n activeGrain={currentChartGrain}\r\n activeGrainChanged={onActiveGrainChanged}\r\n allowedGrains={allowedChartGrains}\r\n />\r\n </Stack>\r\n )}\r\n <Stack horizontal horizontalAlign=\"start\" wrap tokens={getMetricPickerStackTokens()}>\r\n {!hasEmptyData && showMetricsDropdown && !showMetricsMarkers && (\r\n <Dropdown\r\n className={classNames.metricsDropdown}\r\n options={getMetricDropdownOptions(reportMetadata?.metrics || [], currentChartType, formatMessage)}\r\n defaultSelectedKey={selectedMetric}\r\n onChange={(_, option) => {\r\n if (option) {\r\n setSelectedMetric(String(option.key));\r\n }\r\n }}\r\n ariaLabel={formatMessage(messages.metricsDropdownLabel)}\r\n />\r\n )}\r\n {!hasEmptyData && showMetricsMarkers && showCharts && (\r\n <>\r\n <MetricsSidePanel\r\n activeMetrics={activeMetrics}\r\n isOpen={showSidePanel}\r\n onPanelHide={() => {\r\n setShowSidePanel(false);\r\n }}\r\n onMetricsChanged={(changedMetrics: ActiveMetrics) => {\r\n setActiveMetrics({ ...changedMetrics });\r\n onActiveMetricsChanged && onActiveMetricsChanged(changedMetrics);\r\n }}\r\n />\r\n <ChartMetricPicker\r\n mode={type === ReportCardType.PERFORMANCE ? ChartSelectionMode.MULTI : ChartSelectionMode.SINGLE}\r\n activeMetrics={activeMetrics}\r\n summaryData={summaryData[0]}\r\n onMetricSelected={(selected: IMetricMarkerProps) => {\r\n if (selected.disabled) {\r\n return;\r\n }\r\n if (type !== ReportCardType.PERFORMANCE) {\r\n for (const key of Object.keys(activeMetrics)) {\r\n activeMetrics[key].isActive = false;\r\n }\r\n setSelectedMetric(selected.metricKey);\r\n }\r\n selected.isActive = !selected.isActive;\r\n setActiveMetrics({ ...activeMetrics });\r\n onActiveMetricsChanged && onActiveMetricsChanged(activeMetrics);\r\n }}\r\n onEditButtonClicked={() => {\r\n setShowSidePanel(true);\r\n }}\r\n />\r\n </>\r\n )}\r\n </Stack>\r\n {reportData && showCharts && (\r\n <Stack data-test-id={`${CHART_WRAPPER}-${currentChartType}-${type}`} styles={{ root: { width: '100%' } }}>\r\n {getChart(chartsOptions, locale)}\r\n </Stack>\r\n )}\r\n </Stack>\r\n </div>\r\n {isDetailedView && (\r\n <div>\r\n <ReportDetailsGrid\r\n history={history}\r\n location={location}\r\n match={match}\r\n metrics={reportMetadata?.metrics || []}\r\n dimensions={reportMetadata?.dimensions || []}\r\n data={reportDetailedData || []}\r\n isDetailedDataLoaded={!!isDetailedDataLoaded}\r\n initialBreakdown={reportMetadata?.dimensions.filter((dimension) => currentBreakdown.includes(dimension.key)) || []}\r\n currentChartGrain={currentChartGrain}\r\n onBreakdownChanged={(newBreakdown: IMetadataElement[]) => {\r\n const updatedBreakdown = [...newBreakdown.map((breakdown) => breakdown.key)];\r\n onBreakDownChanged && onBreakDownChanged(updatedBreakdown);\r\n setCurrentBreakdown(updatedBreakdown);\r\n setDataInURL(ReportsQueryStoreKeys.BREAKDOWN, updatedBreakdown);\r\n }}\r\n defaultColumns={defaultColumns}\r\n hasMinimumBreakdown={hasMinimumBreakdown}\r\n dateDimension={dateDimension}\r\n filters={filters}\r\n />\r\n </div>\r\n )}\r\n {showDetailsReportLink && (\r\n <div>\r\n <Link className={classNames.linkStyle} to={`${viewReportRoute}${window.location.search}`}>\r\n <span>{formatMessage(messages.viewReportLink)}</span>\r\n </Link>\r\n </div>\r\n )}\r\n </Card>\r\n <ShareModal\r\n disableModal={() => {\r\n setEnableShare(false);\r\n }}\r\n enabled={enableShare}\r\n />\r\n </div>\r\n );\r\n }\r\n);\r\n","import { observer } from 'mobx-react';\r\nimport React, { RefObject, useState } from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport appMessages from '../../../../App.messages';\r\nimport { IRouterWithIntl } from '../../../../utils';\r\nimport { TythonColumnsEnum } from '../../@data/store/schema/ColumnsEnum';\r\nimport { ICustomCalenderDateRange } from '../../components/CustomCalender/CustomCalender.types';\r\nimport { ADUNIT_DEFAULT_COLUMNS, ADUNIT_DEFAULT_METRICS } from '../../constants/common';\r\nimport { useReportQuery } from '../../hooks/useReportQuery';\r\nimport { IReportsMetadata, TythonReportingDataRow } from '../@data/store/schema';\r\nimport { ReportCard } from '../ReportCard/ReportCard';\r\nimport { constructRequestBody } from '../ReportCard/ReportCard.helpers';\r\nimport { ActiveMetrics, ChartGrain, IChartButton, ReportCardType } from '../ReportCard/ReportCard.types';\r\nimport { IActiveFilter } from '../ReportDetailsPage/ActionBar/ActionBar';\r\n\r\nconst CHART_DATA_METRIC_ID = 'ad-units-chart';\r\nexport interface IAdUnitsReportCardProps extends IRouterWithIntl {\r\n dateRange: ICustomCalenderDateRange;\r\n filters: IActiveFilter[];\r\n allowedChartTypes: IChartButton[];\r\n showDetailsReportLink: boolean;\r\n enableHideChartsButton?: boolean;\r\n showMetricsMarkers?: boolean;\r\n isDetailedView: boolean;\r\n onChartGrainChanged?: (grain: ChartGrain) => void;\r\n onSelectedMetricChanged?: (metric: string) => void;\r\n onActiveMetricsChanged?: (activeMetrics: ActiveMetrics) => void;\r\n onBreakdownChanged?: (breakdown: string[]) => void;\r\n reportDetailedData?: TythonReportingDataRow[];\r\n reportCardRef: RefObject<HTMLDivElement>;\r\n reportMetadata?: IReportsMetadata;\r\n summaryData?: TythonReportingDataRow[];\r\n}\r\nexport const AdUnitsReportCard = observer(\r\n injectIntl(\r\n ({\r\n dateRange,\r\n filters,\r\n allowedChartTypes,\r\n enableHideChartsButton,\r\n showDetailsReportLink,\r\n showMetricsMarkers = false,\r\n isDetailedView,\r\n onChartGrainChanged,\r\n onSelectedMetricChanged,\r\n onActiveMetricsChanged,\r\n onBreakdownChanged,\r\n reportCardRef,\r\n intl: { formatMessage },\r\n reportMetadata,\r\n summaryData,\r\n reportDetailedData,\r\n history,\r\n location,\r\n match,\r\n }: IAdUnitsReportCardProps) => {\r\n const title = formatMessage(appMessages.adUnitsCardTitle);\r\n const mainDimension = TythonColumnsEnum.AdUnitName;\r\n const [currentChartGrain, setCurrentChartGrain] = useState(ChartGrain.DAILY);\r\n\r\n const { data: reportData } = useReportQuery(\r\n constructRequestBody(\r\n title,\r\n dateRange,\r\n currentChartGrain,\r\n isDetailedView ? filters : [],\r\n [mainDimension],\r\n reportMetadata?.metrics || []\r\n ),\r\n isDetailedView,\r\n !!reportMetadata\r\n );\r\n\r\n return (\r\n <ReportCard\r\n title={title}\r\n reportData={reportData}\r\n reportDetailedData={reportDetailedData}\r\n summaryData={summaryData}\r\n isSummaryDataLoaded={!!summaryData}\r\n allowedChartTypes={allowedChartTypes}\r\n allowedChartGrains={reportMetadata?.grains || []}\r\n dataMetrics={{ chartDataMetrics: CHART_DATA_METRIC_ID }}\r\n mainDimension={mainDimension}\r\n type={ReportCardType.ADUNIT}\r\n enableHideChartsButton={enableHideChartsButton}\r\n showDetailsReportLink={showDetailsReportLink}\r\n dateRange={dateRange}\r\n showMetricsMarkers={showMetricsMarkers}\r\n isDetailedView={isDetailedView}\r\n filters={filters}\r\n history={history}\r\n location={location}\r\n match={match}\r\n defaultColumns={ADUNIT_DEFAULT_COLUMNS}\r\n defaultMetrics={ADUNIT_DEFAULT_METRICS}\r\n hasMinimumBreakdown={true}\r\n reportMetadata={reportMetadata}\r\n dateDimension={TythonColumnsEnum.DateTime}\r\n onChartGrainChanged={(updatedGrain) => {\r\n onChartGrainChanged && onChartGrainChanged(updatedGrain);\r\n setCurrentChartGrain(updatedGrain);\r\n }}\r\n onBreakDownChanged={onBreakdownChanged}\r\n onSelectedMetricChanged={onSelectedMetricChanged}\r\n onActiveMetricsChanged={onActiveMetricsChanged}\r\n reportCardRef={reportCardRef}\r\n />\r\n );\r\n }\r\n )\r\n);\r\n","import { observer } from 'mobx-react';\r\nimport React, { RefObject, useState } from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport appMessages from '../../../../App.messages';\r\nimport { IRouterWithIntl } from '../../../../utils';\r\nimport { TythonColumnsEnum } from '../../@data/store/schema/ColumnsEnum';\r\nimport { ICustomCalenderDateRange } from '../../components/CustomCalender/CustomCalender.types';\r\nimport { COUNTRY_DEFAULT_COLUMNS, COUNTRY_DEFAULT_METRICS } from '../../constants/common';\r\nimport { useReportQuery } from '../../hooks/useReportQuery';\r\nimport { IReportsMetadata, TythonReportingDataRow } from '../@data/store/schema';\r\nimport { ReportCard } from '../ReportCard/ReportCard';\r\nimport { constructRequestBody } from '../ReportCard/ReportCard.helpers';\r\nimport { ActiveMetrics, ChartGrain, IChartButton, ReportCardType } from '../ReportCard/ReportCard.types';\r\nimport { IActiveFilter } from '../ReportDetailsPage/ActionBar/ActionBar';\r\n\r\nconst CHART_DATA_METRIC_ID = 'ad-units-chart';\r\nexport interface ICountryReportCardProps extends IRouterWithIntl {\r\n dateRange: ICustomCalenderDateRange;\r\n filters: IActiveFilter[];\r\n allowedChartTypes: IChartButton[];\r\n showDetailsReportLink: boolean;\r\n enableHideChartsButton?: boolean;\r\n showMetricsMarkers?: boolean;\r\n isDetailedView: boolean;\r\n onChartGrainChanged?: (grain: ChartGrain) => void;\r\n onSelectedMetricChanged?: (metric: string) => void;\r\n onActiveMetricsChanged?: (activeMetrics: ActiveMetrics) => void;\r\n onBreakdownChanged?: (breakdown: string[]) => void;\r\n reportDetailedData?: TythonReportingDataRow[];\r\n reportCardRef: RefObject<HTMLDivElement>;\r\n reportMetadata?: IReportsMetadata;\r\n summaryData?: TythonReportingDataRow[];\r\n}\r\nexport const CountryReportCard = observer(\r\n injectIntl(\r\n ({\r\n dateRange,\r\n filters,\r\n allowedChartTypes,\r\n enableHideChartsButton,\r\n showDetailsReportLink,\r\n showMetricsMarkers = false,\r\n isDetailedView,\r\n onChartGrainChanged,\r\n onSelectedMetricChanged,\r\n onActiveMetricsChanged,\r\n onBreakdownChanged,\r\n reportDetailedData,\r\n reportCardRef,\r\n intl: { formatMessage },\r\n reportMetadata,\r\n summaryData,\r\n history,\r\n location,\r\n match,\r\n }: ICountryReportCardProps) => {\r\n const title = formatMessage(appMessages.countryCardTitle);\r\n const mainDimension = TythonColumnsEnum.Country;\r\n const [currentChartGrain, setCurrentChartGrain] = useState(ChartGrain.DAILY);\r\n const { data: reportData } = useReportQuery(\r\n constructRequestBody(\r\n title,\r\n dateRange,\r\n currentChartGrain,\r\n isDetailedView ? filters : [],\r\n [mainDimension, TythonColumnsEnum.CountryCode],\r\n reportMetadata?.metrics || []\r\n ),\r\n isDetailedView,\r\n !!reportMetadata\r\n );\r\n return (\r\n <ReportCard\r\n title={title}\r\n reportData={reportData}\r\n reportDetailedData={reportDetailedData}\r\n summaryData={summaryData}\r\n isSummaryDataLoaded={!!summaryData}\r\n allowedChartTypes={allowedChartTypes}\r\n allowedChartGrains={reportMetadata?.grains || []}\r\n dataMetrics={{ chartDataMetrics: CHART_DATA_METRIC_ID }}\r\n mainDimension={mainDimension}\r\n type={ReportCardType.COUNTRY}\r\n enableHideChartsButton={enableHideChartsButton}\r\n showDetailsReportLink={showDetailsReportLink}\r\n dateRange={dateRange}\r\n showMetricsMarkers={showMetricsMarkers}\r\n isDetailedView={isDetailedView}\r\n filters={filters}\r\n history={history}\r\n location={location}\r\n match={match}\r\n defaultColumns={COUNTRY_DEFAULT_COLUMNS}\r\n defaultMetrics={COUNTRY_DEFAULT_METRICS}\r\n hasMinimumBreakdown={true}\r\n reportMetadata={reportMetadata}\r\n dateDimension={TythonColumnsEnum.DateTime}\r\n onChartGrainChanged={(updatedGrain) => {\r\n onChartGrainChanged && onChartGrainChanged(updatedGrain);\r\n setCurrentChartGrain(updatedGrain);\r\n }}\r\n onBreakDownChanged={onBreakdownChanged}\r\n onSelectedMetricChanged={onSelectedMetricChanged}\r\n onActiveMetricsChanged={onActiveMetricsChanged}\r\n reportCardRef={reportCardRef}\r\n />\r\n );\r\n }\r\n )\r\n);\r\n","import React, { RefObject, useState } from 'react';\r\nimport appMessages from '../../../../App.messages';\r\nimport { IRouterWithIntl, injectIntlAndObserver } from '../../../../utils';\r\nimport { TythonColumnsEnum } from '../../@data/store/schema/ColumnsEnum';\r\nimport { ICustomCalenderDateRange } from '../../components/CustomCalender/CustomCalender.types';\r\nimport { MEDIATION_DEFAULT_COLUMNS, MEDIATION_DEFAULT_METRICS } from '../../constants/common';\r\nimport { useMediationReportQuery } from '../../hooks/useReportQuery';\r\nimport { IReportsMetadata, MediationReportingDataRow } from '../@data/store/schema';\r\nimport { ReportCard } from '../ReportCard/ReportCard';\r\nimport { constructMediationRequestBody } from '../ReportCard/ReportCard.helpers';\r\nimport { ChartGrain, IChartButton, ReportCardType } from '../ReportCard/ReportCard.types';\r\nimport { IActiveFilter } from '../ReportDetailsPage/ActionBar/ActionBar';\r\n\r\nconst CHART_DATA_METRIC_ID = 'mediation-chart';\r\n\r\nexport interface IMediationReportCardProps extends IRouterWithIntl {\r\n dateRange: ICustomCalenderDateRange;\r\n filters: IActiveFilter[];\r\n allowedChartTypes: IChartButton[];\r\n showDetailsReportLink: boolean;\r\n enableHideChartsButton?: boolean;\r\n showMetricsMarkers?: boolean;\r\n isDetailedView: boolean;\r\n onChartGrainChanged?: (grain: ChartGrain) => void;\r\n onSelectedMetricChanged?: (metric: string) => void;\r\n onBreakdownChanged?: (breakdown: string[]) => void;\r\n reportDetailedData?: MediationReportingDataRow[];\r\n reportCardRef: RefObject<HTMLDivElement>;\r\n reportMetadata?: IReportsMetadata;\r\n}\r\n\r\nexport const MediationReportCard = injectIntlAndObserver<IMediationReportCardProps>(\r\n ({\r\n dateRange,\r\n filters,\r\n allowedChartTypes,\r\n enableHideChartsButton,\r\n showDetailsReportLink,\r\n showMetricsMarkers = false,\r\n isDetailedView,\r\n onChartGrainChanged,\r\n onSelectedMetricChanged,\r\n onBreakdownChanged,\r\n reportDetailedData,\r\n reportCardRef,\r\n intl: { formatMessage },\r\n reportMetadata,\r\n history,\r\n location,\r\n match,\r\n }: IMediationReportCardProps) => {\r\n const mainDimension = TythonColumnsEnum.AdUnitName;\r\n const [currentChartGrain, setCurrentChartGrain] = useState(ChartGrain.DAILY);\r\n const metrics = reportMetadata?.metrics.map((metric) => metric.key);\r\n const dimensions = [mainDimension];\r\n if (currentChartGrain !== ChartGrain.NONE) {\r\n dimensions.push(TythonColumnsEnum.Date);\r\n }\r\n const { data: reportData } = useMediationReportQuery(\r\n constructMediationRequestBody(dateRange, currentChartGrain, isDetailedView ? filters : [], dimensions, metrics),\r\n !!reportMetadata\r\n );\r\n\r\n return (\r\n <ReportCard\r\n title={formatMessage(appMessages.mediationCardTitle)}\r\n reportData={reportData}\r\n reportDetailedData={reportDetailedData}\r\n allowedChartTypes={allowedChartTypes}\r\n dataMetrics={{ chartDataMetrics: CHART_DATA_METRIC_ID }}\r\n mainDimension={mainDimension}\r\n type={ReportCardType.MEDIATION}\r\n enableHideChartsButton={enableHideChartsButton}\r\n showDetailsReportLink={showDetailsReportLink}\r\n dateRange={dateRange}\r\n showMetricsMarkers={showMetricsMarkers}\r\n isDetailedView={isDetailedView}\r\n filters={filters}\r\n history={history}\r\n location={location}\r\n match={match}\r\n defaultColumns={MEDIATION_DEFAULT_COLUMNS}\r\n defaultMetrics={MEDIATION_DEFAULT_METRICS}\r\n hasMinimumBreakdown={true}\r\n reportMetadata={reportMetadata}\r\n allowedChartGrains={reportMetadata?.grains || []}\r\n dateDimension={TythonColumnsEnum.Date}\r\n onChartGrainChanged={(updatedGrain) => {\r\n onChartGrainChanged && onChartGrainChanged(updatedGrain);\r\n setCurrentChartGrain(updatedGrain);\r\n }}\r\n onBreakDownChanged={onBreakdownChanged}\r\n onSelectedMetricChanged={onSelectedMetricChanged}\r\n reportCardRef={reportCardRef}\r\n />\r\n );\r\n }\r\n);\r\n","import React, { RefObject, useState } from 'react';\r\nimport appMessages from '../../../../App.messages';\r\nimport { IRouterWithIntl, injectIntlWithObserver } from '../../../../utils';\r\nimport { TythonColumnsEnum } from '../../@data/store/schema/ColumnsEnum';\r\nimport { ICustomCalenderDateRange } from '../../components/CustomCalender/CustomCalender.types';\r\nimport { PERFORMANCE_DEFAULT_COLUMNS, PERFORMANCE_DEFAULT_METRICS } from '../../constants/common';\r\nimport { useReportQuery } from '../../hooks/useReportQuery';\r\nimport { IReportsMetadata, TythonReportingDataRow } from '../@data/store/schema';\r\nimport { ReportCard } from '../ReportCard/ReportCard';\r\nimport { constructRequestBody } from '../ReportCard/ReportCard.helpers';\r\nimport { ActiveMetrics, ChartGrain, IChartButton, ReportCardType } from '../ReportCard/ReportCard.types';\r\nimport { IActiveFilter } from '../ReportDetailsPage/ActionBar/ActionBar';\r\n\r\nconst DATA_METRIC_ID = 'performance-report-card';\r\nconst CHART_DATA_METRIC_ID = 'performance-report-chart';\r\nexport interface IPerformanceReportCardProps extends IRouterWithIntl {\r\n allowedChartTypes: IChartButton[];\r\n showDetailsReportLink: boolean;\r\n enableHideChartsButton?: boolean;\r\n filters: IActiveFilter[];\r\n dateRange: ICustomCalenderDateRange;\r\n isDetailedView: boolean;\r\n onChartGrainChanged?: (grain: ChartGrain) => void;\r\n onSelectedMetricChanged?: (metric: string) => void;\r\n onActiveMetricsChanged?: (activeMetrics: ActiveMetrics) => void;\r\n onBreakdownChanged?: (breakdown: string[]) => void;\r\n reportDetailedData?: TythonReportingDataRow[];\r\n reportCardRef: RefObject<HTMLDivElement>;\r\n reportMetadata?: IReportsMetadata;\r\n summaryData?: TythonReportingDataRow[];\r\n}\r\nexport const PerformanceReportCard = injectIntlWithObserver<IPerformanceReportCardProps>(\r\n ({\r\n dateRange,\r\n filters,\r\n allowedChartTypes,\r\n showDetailsReportLink,\r\n enableHideChartsButton,\r\n isDetailedView,\r\n onChartGrainChanged,\r\n onSelectedMetricChanged,\r\n onActiveMetricsChanged,\r\n onBreakdownChanged,\r\n reportDetailedData,\r\n reportCardRef,\r\n intl: { formatMessage },\r\n reportMetadata,\r\n summaryData,\r\n history,\r\n location,\r\n match,\r\n }) => {\r\n const title = formatMessage(appMessages.performanceCardTitle);\r\n const [currentChartGrain, setCurrentChartGrain] = useState(ChartGrain.DAILY);\r\n const { data: reportData } = useReportQuery(\r\n constructRequestBody(title, dateRange, currentChartGrain, isDetailedView ? filters : [], [], reportMetadata?.metrics || []),\r\n isDetailedView,\r\n !!reportMetadata\r\n );\r\n return (\r\n <div data-metric={DATA_METRIC_ID}>\r\n <ReportCard\r\n title={title}\r\n allowedChartTypes={allowedChartTypes}\r\n allowedChartGrains={reportMetadata?.grains || []}\r\n defaultChartGrain={ChartGrain.DAILY}\r\n reportData={reportData}\r\n reportDetailedData={reportDetailedData}\r\n summaryData={summaryData}\r\n isSummaryDataLoaded={!!summaryData}\r\n showChartGrains\r\n showMetricsMarkers\r\n dataMetrics={{ chartDataMetrics: CHART_DATA_METRIC_ID }}\r\n type={ReportCardType.PERFORMANCE}\r\n showDetailsReportLink={showDetailsReportLink}\r\n enableHideChartsButton={enableHideChartsButton}\r\n dateRange={dateRange}\r\n isDetailedView={isDetailedView}\r\n filters={filters}\r\n history={history}\r\n location={location}\r\n match={match}\r\n defaultColumns={PERFORMANCE_DEFAULT_COLUMNS}\r\n defaultMetrics={PERFORMANCE_DEFAULT_METRICS}\r\n hasMinimumBreakdown={false}\r\n reportMetadata={reportMetadata}\r\n dateDimension={TythonColumnsEnum.DateTime}\r\n onChartGrainChanged={(updatedGrain) => {\r\n onChartGrainChanged && onChartGrainChanged(updatedGrain);\r\n setCurrentChartGrain(updatedGrain);\r\n }}\r\n onBreakDownChanged={onBreakdownChanged}\r\n onSelectedMetricChanged={onSelectedMetricChanged}\r\n onActiveMetricsChanged={onActiveMetricsChanged}\r\n reportCardRef={reportCardRef}\r\n />\r\n </div>\r\n );\r\n }\r\n);\r\n","import { observer } from 'mobx-react';\r\nimport React, { RefObject, useState } from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport appMessages from '../../../../App.messages';\r\nimport { IRouterWithIntl } from '../../../../utils';\r\nimport { TythonColumnsEnum } from '../../@data/store/schema/ColumnsEnum';\r\nimport { ICustomCalenderDateRange } from '../../components/CustomCalender/CustomCalender.types';\r\nimport { SITE_DEFAULT_COLUMNS, SITE_DEFAULT_METRICS } from '../../constants/common';\r\nimport { useReportQuery } from '../../hooks/useReportQuery';\r\nimport { IReportsMetadata, TythonReportingDataRow } from '../@data/store/schema';\r\nimport { ReportCard } from '../ReportCard/ReportCard';\r\nimport { constructRequestBody } from '../ReportCard/ReportCard.helpers';\r\nimport { ActiveMetrics, ChartGrain, IChartButton, ReportCardType } from '../ReportCard/ReportCard.types';\r\nimport { IActiveFilter } from '../ReportDetailsPage/ActionBar/ActionBar';\r\n\r\nconst CHART_DATA_METRIC_ID = 'sites-chart';\r\nexport interface ISitesReportCardProps extends IRouterWithIntl {\r\n dateRange: ICustomCalenderDateRange;\r\n filters: IActiveFilter[];\r\n allowedChartTypes: IChartButton[];\r\n showDetailsReportLink: boolean;\r\n enableHideChartsButton?: boolean;\r\n showMetricsMarkers?: boolean;\r\n isDetailedView: boolean;\r\n onChartGrainChanged?: (grain: ChartGrain) => void;\r\n onSelectedMetricChanged?: (metric: string) => void;\r\n onActiveMetricsChanged?: (activeMetrics: ActiveMetrics) => void;\r\n onBreakdownChanged?: (breakdown: string[]) => void;\r\n reportDetailedData?: TythonReportingDataRow[];\r\n reportCardRef: RefObject<HTMLDivElement>;\r\n reportMetadata?: IReportsMetadata;\r\n summaryData?: TythonReportingDataRow[];\r\n}\r\n\r\nexport const SitesReportCard = observer(\r\n injectIntl(\r\n ({\r\n dateRange,\r\n filters,\r\n allowedChartTypes,\r\n enableHideChartsButton,\r\n showDetailsReportLink,\r\n showMetricsMarkers = false,\r\n isDetailedView,\r\n onChartGrainChanged,\r\n onSelectedMetricChanged,\r\n onActiveMetricsChanged,\r\n onBreakdownChanged,\r\n reportDetailedData,\r\n reportCardRef,\r\n intl: { formatMessage },\r\n reportMetadata,\r\n summaryData,\r\n history,\r\n location,\r\n match,\r\n }: ISitesReportCardProps) => {\r\n const title = formatMessage(appMessages.sitesCardTitle);\r\n const mainDimension = TythonColumnsEnum.PropertyUrl;\r\n const [currentChartGrain, setCurrentChartGrain] = useState(ChartGrain.DAILY);\r\n const { data: reportData } = useReportQuery(\r\n constructRequestBody(\r\n title,\r\n dateRange,\r\n currentChartGrain,\r\n isDetailedView ? filters : [],\r\n [mainDimension],\r\n reportMetadata?.metrics || []\r\n ),\r\n isDetailedView,\r\n !!reportMetadata\r\n );\r\n return (\r\n <ReportCard\r\n title={title}\r\n reportData={reportData}\r\n reportDetailedData={reportDetailedData}\r\n summaryData={summaryData}\r\n isSummaryDataLoaded={!!summaryData}\r\n allowedChartTypes={allowedChartTypes}\r\n allowedChartGrains={reportMetadata?.grains || []}\r\n dataMetrics={{ chartDataMetrics: CHART_DATA_METRIC_ID }}\r\n mainDimension={mainDimension}\r\n type={ReportCardType.SITE}\r\n enableHideChartsButton={enableHideChartsButton}\r\n showDetailsReportLink={showDetailsReportLink}\r\n dateRange={dateRange}\r\n showMetricsMarkers={showMetricsMarkers}\r\n isDetailedView={isDetailedView}\r\n filters={filters}\r\n history={history}\r\n location={location}\r\n match={match}\r\n defaultColumns={SITE_DEFAULT_COLUMNS}\r\n defaultMetrics={SITE_DEFAULT_METRICS}\r\n hasMinimumBreakdown={true}\r\n reportMetadata={reportMetadata}\r\n dateDimension={TythonColumnsEnum.DateTime}\r\n onChartGrainChanged={(updatedGrain) => {\r\n onChartGrainChanged && onChartGrainChanged(updatedGrain);\r\n setCurrentChartGrain(updatedGrain);\r\n }}\r\n onBreakDownChanged={onBreakdownChanged}\r\n onSelectedMetricChanged={onSelectedMetricChanged}\r\n onActiveMetricsChanged={onActiveMetricsChanged}\r\n reportCardRef={reportCardRef}\r\n />\r\n );\r\n }\r\n )\r\n);\r\n","import { getTheme, ITheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterSpacing } from '../../../../../../../theme';\r\n\r\nexport interface IEmptyChartStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\ntype StyleProperties =\r\n | 'highlightedFilterInfoContainer'\r\n | 'filterInfoContainer'\r\n | 'filterInfoContainerUnfocused'\r\n | 'filterListPageStyle'\r\n | 'filterCloseIcon'\r\n | 'highlightedFilterInfoSelectors'\r\n | 'filterInfoSelectors'\r\n | 'filterBarFocused'\r\n | 'filterBarUnFocused'\r\n | 'filterIcon'\r\n | 'filterInfoFocused'\r\n | 'hidden'\r\n | 'filterInfoUnfocused';\r\ntype FilterListBarStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: IEmptyChartStyleProps): FilterListBarStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n return mergeStyleSets({\r\n filterBarFocused: {\r\n backgroundColor: theme.palette.neutralLighter,\r\n display: 'flex',\r\n marginBottom: spacing.size16,\r\n position: 'relative',\r\n },\r\n filterBarUnFocused: {\r\n marginBottom: spacing.size16,\r\n marginLeft: spacing.size24,\r\n display: 'flex',\r\n flexDirection: 'row',\r\n overflow: 'hidden',\r\n },\r\n filterInfoContainer: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n backgroundColor: theme.palette.neutralSecondary,\r\n margin: '8px 0 8px 16px',\r\n color: theme.palette.white,\r\n cursor: 'pointer',\r\n alignItems: 'center',\r\n },\r\n filterInfoContainerUnfocused: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n },\r\n highlightedFilterInfoContainer: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n backgroundColor: theme.palette.themePrimary,\r\n margin: '8px 0 8px 16px',\r\n color: theme.palette.white,\r\n cursor: 'pointer',\r\n },\r\n filterInfoFocused: {\r\n fontSize: theme.fonts.medium.fontSize,\r\n alignContent: 'center',\r\n padding: '4px 16px',\r\n lineHeight: '19px',\r\n display: 'inline-block',\r\n },\r\n filterInfoSelectors: {\r\n selectors: {\r\n '&:focus, &:hover': {\r\n backgroundColor: theme.palette.neutralPrimaryAlt,\r\n },\r\n },\r\n },\r\n highlightedFilterInfoSelectors: {\r\n selectors: {\r\n '&:focus, &:hover': {\r\n backgroundColor: theme.palette.themeDark,\r\n },\r\n },\r\n },\r\n filterCloseIcon: {\r\n '&:focus, &:hover': {\r\n backgroundColor: theme.palette.neutralPrimaryAlt,\r\n color: theme.palette.white,\r\n },\r\n color: theme.palette.white,\r\n },\r\n hidden: {\r\n '&:focus, &:hover, &:click': {\r\n backgroundColor: theme.palette.white,\r\n color: theme.palette.white,\r\n },\r\n color: theme.palette.white,\r\n backgroundColor: theme.palette.white,\r\n width: 0,\r\n },\r\n filterIcon: {\r\n padding: '5px 4px',\r\n color: theme.palette.themePrimary,\r\n },\r\n filterInfoUnfocused: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n color: theme.palette.themePrimary,\r\n textAlign: 'center',\r\n verticalAlign: 'center',\r\n cursor: 'pointer',\r\n padding: '3px 4px',\r\n },\r\n filterListPageStyle: {\r\n display: 'flex',\r\n flexFlow: 'row wrap',\r\n },\r\n });\r\n};\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { IconButton, css } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { isButtonPressKey } from '../../../../../../utils/AccessibilityUtils';\r\nimport { getClassNames } from './FilterListBar.styles';\r\n\r\nexport interface IFilterListItemProps {\r\n id: string;\r\n filterKey: string;\r\n title: string;\r\n isFocused: boolean;\r\n onRemove: (key: string) => void;\r\n onClick: (key: string) => void;\r\n}\r\n\r\nexport const FilterListItem = ({ id, filterKey, title, isFocused, onClick, onRemove }: IFilterListItemProps) => {\r\n const classNames = getClassNames();\r\n return (\r\n <div id={id} className={isFocused ? classNames.filterInfoContainer : classNames.filterInfoContainerUnfocused}>\r\n <div\r\n className={isFocused ? css(classNames.filterInfoFocused, classNames.filterInfoSelectors) : classNames.filterInfoUnfocused}\r\n onClick={() => {\r\n onClick(filterKey);\r\n }}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key)}\r\n role=\"button\"\r\n // tabIndex={0}\r\n data-is-focusable={true}\r\n >\r\n {title}\r\n </div>\r\n <IconButton\r\n className={isFocused ? classNames.filterCloseIcon : classNames.hidden}\r\n iconProps={{ iconName: 'Cancel' }}\r\n onClick={() => {\r\n onRemove(filterKey);\r\n }}\r\n tabIndex={0}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key)}\r\n aria-label={''}\r\n data-is-focusable={true}\r\n />\r\n </div>\r\n );\r\n};\r\n","import { FocusZone, FocusZoneDirection } from '@fluentui/react';\r\nimport { useBoolean } from '@fluentui/react-hooks';\r\nimport React, { useRef } from 'react';\r\nimport { getClassNames } from './FilterListBar.styles';\r\nimport { FilterListItem } from './FilterListItem';\r\n\r\nexport interface IFilterListBarProps {\r\n filterItems: IFilterItem[];\r\n}\r\nexport interface IFilterItem {\r\n key: string;\r\n title: string;\r\n onRemove: (key: string) => void;\r\n onClick: (key: string) => void;\r\n}\r\nconst DATA_METRIC_ID = 'filter-list-bar';\r\nexport const FilterListBar = ({ filterItems }: IFilterListBarProps) => {\r\n const classNames = getClassNames();\r\n const [isBarFocused, { setFalse: setBarUnfocused, setTrue: setBarFocused }] = useBoolean(false);\r\n const filterBarRef = useRef<HTMLDivElement>(null);\r\n return (\r\n <div\r\n tabIndex={0}\r\n ref={filterBarRef}\r\n onFocus={(ev) => {\r\n setBarFocused();\r\n }}\r\n onBlur={() => {\r\n setBarUnfocused();\r\n }}\r\n className={isBarFocused ? classNames.filterBarFocused : classNames.filterBarUnFocused}\r\n data-metric={DATA_METRIC_ID}\r\n >\r\n <FocusZone\r\n className={classNames.filterListPageStyle}\r\n direction={FocusZoneDirection.horizontal}\r\n isCircularNavigation={true}\r\n aria-label={''}\r\n aria-describedby=\"filterListAriaDescription\"\r\n >\r\n {filterItems.map((item, index) => {\r\n return (\r\n <FilterListItem\r\n key={`filterFocusedList-${index}`}\r\n filterKey={item.key}\r\n id={item.key}\r\n data-list-index={index}\r\n title={item.title}\r\n isFocused={isBarFocused}\r\n onClick={(key) => isBarFocused && item.onClick(key)}\r\n onRemove={(key) => isBarFocused && item.onRemove(key)}\r\n />\r\n );\r\n })}\r\n </FocusZone>\r\n </div>\r\n );\r\n};\r\n","import { IStackTokens, getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../../../../../theme';\r\n\r\ntype StyleProperties = 'buttonAction' | 'root' | 'cardRootStyle';\r\ntype ManageFilterStyles = Record<StyleProperties, string>;\r\ninterface IReportDetailsPageStyleProps {}\r\nconst theme = (getTheme() as unknown) as IPubcenterTheme;\r\nconst spacing = theme.spacing;\r\n\r\nexport const getStyles = (props: IReportDetailsPageStyleProps): ManageFilterStyles => {\r\n return mergeStyleSets({\r\n buttonAction: {\r\n width: '100%',\r\n },\r\n root: {\r\n padding: '20px',\r\n },\r\n cardRootStyle: {\r\n boxShadow: 0,\r\n },\r\n });\r\n};\r\nexport const formTitleStyles = {\r\n root: {\r\n marginBottom: spacing.size24,\r\n },\r\n};\r\nexport function getClassNames<PropType>(props?: PropType): ManageFilterStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\nexport function getStackTokens(): IStackTokens {\r\n return { childrenGap: spacing.size12 };\r\n}\r\n","import { Callout, DefaultButton, DirectionalHint, PrimaryButton, ShimmerElementType, ShimmerElementsGroup, Stack } from '@fluentui/react';\r\nimport { useId } from '@fluentui/react-hooks';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport appMessages from '../../../../../../App.messages';\r\nimport { Card } from '../../../../../../components/Card';\r\nimport { ICheckbox } from '../../../../../../components/CheckboxGroup';\r\nimport { CheckboxTreeWithSelectionBox, ISelection } from '../../../../../../components/CheckboxTreeWithSelectionBox';\r\nimport { injectIntlAndObserver } from '../../../../../../utils';\r\nimport { getReportColumnMetadataDisplayName } from '../../../../utils/intlHelper';\r\nimport { IMetadataElement } from '../../../@data/store/schema';\r\nimport { getClassNames, getStackTokens } from './ManageFilter.styles';\r\n\r\nexport interface IManageFilterProps extends InjectedIntlProps {\r\n onFilterApplied: (dimension: IMetadataElement, selectedFilters: ISelection[]) => void;\r\n onDismiss: () => void;\r\n initialFilterMembers: ICheckbox[];\r\n buttonId: string;\r\n isFilterOpen: boolean;\r\n areMembersLoaded: boolean;\r\n activeDimension?: IMetadataElement;\r\n isIncompatible?: boolean;\r\n inCompatibilityMessage?: string;\r\n}\r\n\r\nexport const ManageFilter = injectIntlAndObserver(\r\n ({\r\n onFilterApplied,\r\n onDismiss,\r\n initialFilterMembers,\r\n buttonId,\r\n isFilterOpen,\r\n activeDimension,\r\n intl: { formatMessage },\r\n areMembersLoaded,\r\n isIncompatible,\r\n inCompatibilityMessage,\r\n }: IManageFilterProps) => {\r\n const classNames = getClassNames();\r\n const labelId = useId('callout-label');\r\n const descriptionId = useId('callout-description');\r\n const [selectedFilters, setSelectedFilter] = useState<ISelection[]>(getSelectedFilters(initialFilterMembers));\r\n const [filterMembers, setFilterMembers] = useState<ICheckbox[]>(initialFilterMembers);\r\n\r\n const onChildCheckboxChange = (event, isChecked, item: ICheckbox) => {\r\n event?.stopPropagation();\r\n const filterKey = item?.key as string;\r\n if (!filterKey) {\r\n return;\r\n }\r\n let newSelection;\r\n if (isChecked) {\r\n selectedFilters.push({\r\n key: filterKey,\r\n title: item.label || '',\r\n isDisabled: false,\r\n });\r\n newSelection = selectedFilters;\r\n } else {\r\n newSelection = selectedFilters.filter((selected) => {\r\n return selected.key !== filterKey;\r\n });\r\n }\r\n onSelectionChanged(newSelection);\r\n };\r\n const onSelectionChanged = (newSelection: ISelection[]) => {\r\n setSelectedFilter(newSelection);\r\n setFilterMembers(\r\n filterMembers.map((filterItem) => {\r\n filterItem.checked = !!newSelection.find((value) => value.key === filterItem.key);\r\n return filterItem;\r\n })\r\n );\r\n };\r\n const onApplyClicked = () => {\r\n activeDimension && onFilterApplied(activeDimension, selectedFilters);\r\n onDismiss();\r\n };\r\n\r\n useEffect(() => {\r\n setFilterMembers(initialFilterMembers);\r\n setSelectedFilter(getSelectedFilters(initialFilterMembers));\r\n }, [initialFilterMembers]);\r\n return (\r\n <>\r\n {isFilterOpen && (\r\n <Callout\r\n ariaLabelledBy={labelId}\r\n ariaDescribedBy={descriptionId}\r\n role=\"dialog\"\r\n target={`#${buttonId}`}\r\n onDismiss={onDismiss}\r\n directionalHint={DirectionalHint.rightTopEdge}\r\n setInitialFocus\r\n isBeakVisible={false}\r\n >\r\n <div className={classNames.root}>\r\n <Card\r\n shimmerCustomElement={\r\n <ShimmerElementsGroup\r\n flexWrap\r\n width=\"100%\"\r\n shimmerElements={[{ type: ShimmerElementType.line, width: '100%', height: 20 }]}\r\n />\r\n }\r\n isDataLoaded={areMembersLoaded}\r\n titleText={getReportColumnMetadataDisplayName(activeDimension?.key || '', formatMessage) || ''}\r\n styleProps={{ rootStyle: classNames.cardRootStyle }}\r\n {...(isIncompatible && {\r\n titleIconTooltipProps: {\r\n iconName: 'warning',\r\n tooltipText: inCompatibilityMessage || '',\r\n },\r\n })}\r\n >\r\n <CheckboxTreeWithSelectionBox\r\n searchPlaceholderText={`${formatMessage(appMessages.search)} ${getReportColumnMetadataDisplayName(\r\n activeDimension?.key || '',\r\n formatMessage\r\n )}`}\r\n onChildCheckboxChange={onChildCheckboxChange}\r\n onRemoveSelection={(key) => {\r\n const newSelection = selectedFilters.filter((selected) => {\r\n return selected.key !== key;\r\n });\r\n onSelectionChanged(newSelection);\r\n }}\r\n onRemoveAllSelection={() => {\r\n onSelectionChanged([]);\r\n }}\r\n selectionList={selectedFilters}\r\n selectionTitle={''}\r\n groups={filterMembers}\r\n onParentCheckboxChange={() => {\r\n return;\r\n }}\r\n />\r\n <Stack horizontal horizontalAlign=\"space-between\" tokens={getStackTokens()}>\r\n <Stack.Item grow>\r\n <PrimaryButton onClick={onApplyClicked} className={classNames.buttonAction}>\r\n {formatMessage(appMessages.apply)}\r\n </PrimaryButton>\r\n </Stack.Item>\r\n <Stack.Item grow>\r\n <DefaultButton onClick={onDismiss} className={classNames.buttonAction}>\r\n {formatMessage(appMessages.cancel)}\r\n </DefaultButton>\r\n </Stack.Item>\r\n </Stack>\r\n </Card>\r\n </div>\r\n </Callout>\r\n )}\r\n </>\r\n );\r\n }\r\n);\r\nfunction getSelectedFilters(initialFilterMembers: ICheckbox[]): ISelection[] {\r\n return initialFilterMembers\r\n .filter((filterMember) => filterMember.checked)\r\n .map((filterMember) => {\r\n return {\r\n key: String(filterMember.key),\r\n title: filterMember.label || '',\r\n isDisabled: false,\r\n };\r\n });\r\n}\r\n","import { CommandButton, IContextualMenuItem, IContextualMenuProps, Stack } from '@fluentui/react';\r\nimport { useBoolean, useId } from '@fluentui/react-hooks';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { Card } from '../../../../../components/Card/Card';\r\nimport { ICheckbox } from '../../../../../components/CheckboxGroup';\r\nimport { ISelection } from '../../../../../components/CheckboxTreeWithSelectionBox';\r\nimport { REPORTING_DATE_RANGE_PICKER } from '../../../../../constants/DataTestIdConstants';\r\nimport { injectIntlAndObserver } from '../../../../../utils';\r\nimport { getDataFromURL, setDataInURL } from '../../../@data/store/UrlQueryStore';\r\nimport { TythonColumnsEnum } from '../../../@data/store/schema/ColumnsEnum';\r\nimport { ReportsQueryStoreKeys } from '../../../@data/store/schema/ReportsQueryStoreKeys';\r\nimport { CustomCalender } from '../../../components/CustomCalender/CustomCalender';\r\nimport { ICustomCalenderDateRange, RangeType } from '../../../components/CustomCalender/CustomCalender.types';\r\nimport { EXCLUDED_FILTER_COLUMNS } from '../../../constants/common';\r\nimport { getReportColumnMetadataDisplayName } from '../../../utils/intlHelper';\r\nimport { fetchReportDimensionColumnMembers, resetColumnMembers } from '../../@data/actions';\r\nimport { IMetadataElement } from '../../@data/store/schema';\r\nimport { getColumnMembers } from '../../@data/store/selectors';\r\nimport { getReportPageStore } from '../../@data/store/store';\r\nimport { getIncompatibleFilterMessage } from '../../ReportCard/ReportCard.helpers';\r\nimport { ActiveMetrics, ReportCardType } from '../../ReportCard/ReportCard.types';\r\nimport { MenuItemWarningIcon } from '../WarningIcon/MenuItemWarningIcon';\r\nimport { FilterListBar } from './FilterListBar/FilterListBar';\r\nimport { ManageFilter } from './ManageFilter/ManageFilter';\r\n\r\nexport interface IActionBarProps extends InjectedIntlProps {\r\n onSelectedDatesChanged: (dateRange: ICustomCalenderDateRange, rangeType: RangeType) => void;\r\n onFilterChanged: (activeFilters: IActiveFilter[]) => void;\r\n initialDateRange: ICustomCalenderDateRange;\r\n initialDateRangeType: RangeType;\r\n dimensions: IMetadataElement[];\r\n isMetadataLoaded: boolean;\r\n reportCardType: ReportCardType;\r\n activeMetrics?: ActiveMetrics;\r\n}\r\n\r\nexport interface IActiveFilter {\r\n key: string;\r\n filterKey: string;\r\n displayName: string;\r\n values: IMetadataElement[];\r\n incompatibleFields: string[];\r\n totalMembers: number;\r\n}\r\n\r\nconst unAllowedFilters = EXCLUDED_FILTER_COLUMNS;\r\n\r\nexport const ActionBar = injectIntlAndObserver(\r\n ({\r\n onSelectedDatesChanged,\r\n onFilterChanged,\r\n initialDateRange,\r\n initialDateRangeType,\r\n dimensions,\r\n isMetadataLoaded,\r\n reportCardType,\r\n activeMetrics,\r\n intl: { formatMessage },\r\n }: IActionBarProps) => {\r\n const { reportType } = getReportPageStore();\r\n const columnMembers = getColumnMembers();\r\n const [isFilterOpen, { setTrue: setIsFilterOpenTrue, setFalse: setIsFilterOpenFalse }] = useBoolean(false);\r\n const filterButtonId = useId('callout-button');\r\n const [activeDimension, setActiveDimension] = useState<IMetadataElement>();\r\n const storedFilters = getDataFromURL<IActiveFilter[]>(ReportsQueryStoreKeys.FILTERS) || [];\r\n const [activeFilters, setActiveFilters] = useState<IActiveFilter[]>(storedFilters);\r\n const currentColumnMembers = activeDimension && columnMembers[activeDimension?.filterKey];\r\n const areColumnMembersLoaded = currentColumnMembers?.isDataLoaded;\r\n let dimensionFilter: ICheckbox[] =\r\n activeDimension && currentColumnMembers && currentColumnMembers.data\r\n ? currentColumnMembers.data.map((member) => {\r\n return {\r\n checked: false,\r\n key: member.Id,\r\n label: member.DisplayName,\r\n };\r\n })\r\n : [];\r\n const currentFilter = activeFilters.find((activeFilter) => activeFilter.filterKey === activeDimension?.filterKey);\r\n if (currentFilter) {\r\n dimensionFilter = dimensionFilter.map((filter) => {\r\n filter.checked = !!currentFilter.values?.find((value) => filter.key === value.key);\r\n return filter;\r\n });\r\n }\r\n const activeDimensionIncompatibleMessage = getIncompatibleFilterMessage(\r\n activeDimension?.incompatibleFields?.map((field) => activeMetrics?.[field].metricName).join(',') || '',\r\n getReportColumnMetadataDisplayName(activeDimension?.key || '', formatMessage) || ''\r\n );\r\n const filterMenuProps: IContextualMenuProps = {\r\n items: isMetadataLoaded\r\n ? dimensions\r\n .filter((dimension) => !unAllowedFilters.includes(dimension.key as TythonColumnsEnum) && !!dimension.filterKey)\r\n .map((dimension) => {\r\n return {\r\n key: dimension.key,\r\n filterKey: dimension.filterKey,\r\n text: getReportColumnMetadataDisplayName(dimension.key, formatMessage),\r\n onRenderContent: (props, defaultRender) => {\r\n const message = getIncompatibleFilterMessage(\r\n dimension?.incompatibleFields?.map((field) => activeMetrics?.[field].metricName).join(',') || '',\r\n getReportColumnMetadataDisplayName(dimension.key, formatMessage)\r\n );\r\n return (\r\n <MenuItemWarningIcon\r\n text={props.item.text || ''}\r\n warningMessage={formatMessage(message.cantMessage, message.params)}\r\n isIncompatible={checkFieldCompatibility(dimension, activeMetrics)}\r\n />\r\n );\r\n },\r\n onClick: () => {\r\n setActiveDimension(dimension);\r\n setIsFilterOpenTrue();\r\n },\r\n } as IContextualMenuItem;\r\n })\r\n : [],\r\n };\r\n const onFilterApplied = (dimension: IMetadataElement, selectedFilters: ISelection[]) => {\r\n const activeFilterIndex = activeFilters.findIndex((filter) => filter.filterKey === dimension.filterKey);\r\n if (activeFilterIndex > -1) {\r\n if (selectedFilters.length <= 0) {\r\n activeFilters.splice(activeFilterIndex, 1);\r\n } else {\r\n activeFilters[activeFilterIndex].values = selectedFilters.map((selected) => ({\r\n key: selected.key,\r\n filterKey: selected.key,\r\n displayName: selected.title || '',\r\n incompatibleFields: [],\r\n }));\r\n }\r\n } else {\r\n activeFilters.push({\r\n key: dimension.key,\r\n filterKey: dimension.filterKey,\r\n displayName: getReportColumnMetadataDisplayName(dimension.key, formatMessage),\r\n totalMembers: currentColumnMembers?.data ? currentColumnMembers?.data.length : 0,\r\n values: selectedFilters.map((selected) => ({\r\n key: selected.key,\r\n filterKey: selected.key,\r\n displayName: selected.title || '',\r\n incompatibleFields: [],\r\n })),\r\n incompatibleFields: dimension.incompatibleFields,\r\n });\r\n }\r\n setActiveFilters([...activeFilters]);\r\n onFilterChanged(activeFilters);\r\n setDataInURL(ReportsQueryStoreKeys.FILTERS, activeFilters);\r\n };\r\n\r\n useEffect(() => {\r\n if (activeDimension && !areColumnMembersLoaded) {\r\n fetchReportDimensionColumnMembers(\r\n {\r\n column: activeDimension?.filterKey,\r\n reportType,\r\n },\r\n reportCardType\r\n );\r\n }\r\n }, [activeDimension, reportType, reportCardType, areColumnMembersLoaded]);\r\n useEffect(() => {\r\n return () => {\r\n resetColumnMembers();\r\n };\r\n }, []);\r\n\r\n return (\r\n <Card isDataLoaded={true} titleText={''}>\r\n <Stack horizontal horizontalAlign=\"space-between\">\r\n <div>\r\n <CommandButton\r\n disabled={!isMetadataLoaded}\r\n id={filterButtonId}\r\n iconProps={{ iconName: 'Filter' }}\r\n text=\"Filter\"\r\n menuProps={filterMenuProps}\r\n />\r\n <div>\r\n <ManageFilter\r\n initialFilterMembers={dimensionFilter}\r\n buttonId={filterButtonId}\r\n isFilterOpen={isFilterOpen}\r\n onDismiss={function (): void {\r\n setIsFilterOpenFalse();\r\n }}\r\n activeDimension={activeDimension}\r\n isIncompatible={activeDimension && checkFieldCompatibility(activeDimension, activeMetrics)}\r\n inCompatibilityMessage={formatMessage(\r\n activeDimensionIncompatibleMessage.cantMessage,\r\n activeDimensionIncompatibleMessage.params\r\n )}\r\n onFilterApplied={onFilterApplied}\r\n areMembersLoaded={!!areColumnMembersLoaded}\r\n />\r\n </div>\r\n </div>\r\n <div>\r\n <CustomCalender\r\n dataTestId={REPORTING_DATE_RANGE_PICKER}\r\n onSelectedDatesChanged={onSelectedDatesChanged}\r\n initialDateRange={initialDateRange}\r\n initialRangeType={initialDateRangeType}\r\n />\r\n </div>\r\n </Stack>\r\n {activeFilters.length > 0 && (\r\n <FilterListBar\r\n filterItems={activeFilters.map((filter) => {\r\n return {\r\n key: filter.key || '',\r\n onClick() {\r\n setActiveDimension({\r\n key: filter.key,\r\n filterKey: filter.filterKey,\r\n displayName: getReportColumnMetadataDisplayName(filter.key, formatMessage),\r\n incompatibleFields: filter.incompatibleFields,\r\n });\r\n setIsFilterOpenTrue();\r\n },\r\n onRemove() {\r\n const updatedFilters = activeFilters.filter((active) => active.key !== filter.key);\r\n setActiveFilters(updatedFilters);\r\n onFilterChanged(updatedFilters);\r\n setDataInURL(ReportsQueryStoreKeys.FILTERS, updatedFilters);\r\n },\r\n title: `${getReportColumnMetadataDisplayName(filter.key, formatMessage)}: ${filter.values[0].displayName}${\r\n filter.values.length > 1 ? ` and ${filter.values.length - 1} more` : ''\r\n }`,\r\n };\r\n })}\r\n />\r\n )}\r\n </Card>\r\n );\r\n }\r\n);\r\n\r\nfunction checkFieldCompatibility(dimension: IMetadataElement, activeMetrics: ActiveMetrics | undefined) {\r\n return (\r\n dimension.incompatibleFields &&\r\n dimension.incompatibleFields.filter((field) => {\r\n return !!activeMetrics?.[field] && activeMetrics?.[field].isVisible;\r\n }).length > 0\r\n );\r\n}\r\n","import { IStackTokens, getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../../../theme';\r\n\r\ntype StyleProperties = 'root';\r\ntype ReportDetailsPageStyles = Record<StyleProperties, string>;\r\ninterface IReportDetailsPageStyleProps {}\r\nconst theme = (getTheme() as unknown) as IPubcenterTheme;\r\nconst spacing = theme.spacing;\r\n\r\nexport const getStyles = (props: IReportDetailsPageStyleProps): ReportDetailsPageStyles => {\r\n return mergeStyleSets({\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n overflowY: 'auto',\r\n flex: 1,\r\n },\r\n });\r\n};\r\nexport const formTitleStyles = {\r\n root: {\r\n marginBottom: spacing.size24,\r\n },\r\n};\r\nexport function getClassNames<PropType>(props?: PropType): ReportDetailsPageStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\nexport function getStackTokens(): IStackTokens {\r\n return { childrenGap: spacing.size12 };\r\n}\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterSpacing } from '../../../../../../theme';\r\n\r\ntype StyleProperties = 'navBackButton';\r\ntype SubPageNavbarStyles = Record<StyleProperties, string>;\r\ninterface ISubPageNavbarStyleProps {}\r\nconst theme = getTheme();\r\nexport const getStyles = (props: ISubPageNavbarStyleProps): SubPageNavbarStyles => {\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n return mergeStyleSets({\r\n navBackButton: [\r\n 'ms-navBackButton',\r\n {\r\n display: 'flex',\r\n backgroundColor: theme.palette.neutralLighter,\r\n height: spacing.size44,\r\n alignItems: 'center',\r\n },\r\n ],\r\n });\r\n};\r\n\r\nexport const breadcrumbStyles = {\r\n root: {\r\n margin: 0,\r\n alignItems: 'center',\r\n },\r\n item: {\r\n lineHeight: '22px',\r\n fontSize: theme.fonts.mediumPlus.fontSize,\r\n color: theme.palette.neutralPrimary,\r\n },\r\n chevron: {\r\n lineHeight: '22px',\r\n color: theme.palette.neutralPrimary,\r\n },\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): SubPageNavbarStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { ActionButton, Breadcrumb, IBreadcrumbItem } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { onNavigateBack } from '../../../../../@data';\r\nimport AppMessages from '../../../../../App.messages';\r\nimport { breadcrumbStyles, getClassNames } from './SubPageNavbar.styles';\r\n\r\ninterface ISubPageNavBarProps extends InjectedIntlProps {\r\n backAriaDescription: string;\r\n breadcrumbAriaLabel?: string;\r\n breadcrumbItems?: IBreadcrumbItem[];\r\n}\r\n\r\nexport const SubPageNavBar = injectIntl(({ intl, backAriaDescription, breadcrumbAriaLabel, breadcrumbItems }: ISubPageNavBarProps) => {\r\n const { navBackButton } = getClassNames();\r\n return (\r\n <div className={navBackButton}>\r\n <ActionButton\r\n iconProps={{\r\n iconName: 'Back',\r\n }}\r\n onClick={() => onNavigateBack()}\r\n ariaDescription={backAriaDescription}\r\n >\r\n {intl.formatMessage(AppMessages.back)}\r\n </ActionButton>\r\n {breadcrumbItems && <Breadcrumb items={breadcrumbItems} ariaLabel={breadcrumbAriaLabel} styles={breadcrumbStyles} />}\r\n </div>\r\n );\r\n});\r\n","import { CommandButton, IBreadcrumbItem, Stack } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { useEffect, useRef, useState } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { useI18n } from '../../../../../i18n/useI18n';\r\nimport { LayoutMode, getAppStore, isTythonSelfServeUser, onLayoutChanged, showLoadingToastNotification } from '../../../../@data';\r\nimport appMessages from '../../../../App.messages';\r\nimport { FormTitle } from '../../../../components/Form';\r\nimport { EmptyLayout } from '../../../../layout/EmptyLayout/EmptyLayout';\r\nimport { IRouterWithIntl, injectIntlWithObserver } from '../../../../utils';\r\nimport { getStore } from '../../../ad-management/Account/Settings/@data/store/store';\r\nimport { getDataFromURL, setDataInURL } from '../../@data/store/UrlQueryStore';\r\nimport { TythonColumnsEnum } from '../../@data/store/schema/ColumnsEnum';\r\nimport { ReportsQueryStoreKeys } from '../../@data/store/schema/ReportsQueryStoreKeys';\r\nimport ReportMessages from '../../Report.messages';\r\nimport { ICustomCalenderDateRange, RangeType } from '../../components/CustomCalender/CustomCalender.types';\r\nimport {\r\n DETAILED_ADUNIT_ALLOWED_CHARTS,\r\n DETAILED_COUNTRY_ALLOWED_CHARTS,\r\n DETAILED_MEDIATION_ALLOWED_CHARTS,\r\n DETAILED_PERFORMANCE_ALLOWED_CHARTS,\r\n DETAILED_SITE_ALLOWED_CHARTS,\r\n} from '../../constants/allowedChartsType';\r\nimport { ALLOWED_MEDIATION_FILTER_COLUMNS } from '../../constants/common';\r\nimport { useMediationAvailable } from '../../hooks/useMediationAvailable';\r\nimport { useMediationReportMetadata, useMediationReportQuery, useReportMetadata, useReportQuery } from '../../hooks/useReportQuery';\r\nimport { exportToPNG, getExportFileName } from '../../utils/exportHelper';\r\nimport { getInitialDateRange } from '../../utils/getInitialDateRange';\r\nimport { AdUnitsReportCard } from '../AdUnitsReportCard/AdUnitsReportCard';\r\nimport { CountryReportCard } from '../CountryReportCard/CountryReportCard';\r\nimport { MediationReportCard } from '../MediationReportCard/MediationReportCard';\r\nimport { PerformanceReportCard } from '../PerformanceReportCard/PerformanceReportCard';\r\nimport { constructMediationRequestBody, constructRequestBody, exportReport, getStartingBreakdown } from '../ReportCard/ReportCard.helpers';\r\nimport { ActiveMetrics, ChartGrain, IReportDetailsPageParams, ReportCardType } from '../ReportCard/ReportCard.types';\r\nimport { SitesReportCard } from '../SitesReportCard/SitesReportCard';\r\nimport { ActionBar, IActiveFilter } from './ActionBar/ActionBar';\r\nimport messages from './ReportDetailsPage.messages';\r\nimport { formTitleStyles, getClassNames, getStackTokens } from './ReportDetailsPage.styles';\r\nimport { SubPageNavBar } from './SubPageNavbar/SubPageNavbar';\r\n\r\ninterface IReportDetailsPageProps extends IRouterWithIntl<IReportDetailsPageParams>, InjectedIntlProps {}\r\n\r\nexport const ReportDetailsPage = injectIntlWithObserver(({ intl, match, location, history }: IReportDetailsPageProps) => {\r\n const reportCardType = match.params.type;\r\n const { formatMessage } = intl;\r\n const { isMediationAvailable } = useMediationAvailable();\r\n const { data: reportMetadata } = useReportMetadata();\r\n const { data: mediationReportMetadata } = useMediationReportMetadata(!!isMediationAvailable);\r\n const {\r\n dateRange: { initialStartDate, initialEndDate },\r\n initialDateRangeType,\r\n } = getInitialDateRange();\r\n const [calendarDateRange, setCalendarDateRange] = useState<ICustomCalenderDateRange>({\r\n startDate: initialStartDate,\r\n endDate: initialEndDate,\r\n });\r\n const storedFilters = getDataFromURL<IActiveFilter[]>(ReportsQueryStoreKeys.FILTERS) || [];\r\n const [activeFilters, setActiveFilters] = useState<IActiveFilter[]>(storedFilters);\r\n const [chartGrain, setChartGrain] = useState<ChartGrain>(ChartGrain.DAILY);\r\n const [selectedMetric, setSelectedMetric] = useState<string>();\r\n const [activeMetrics, setActiveMetrics] = useState<ActiveMetrics>();\r\n const [currentBreakdown, setCurrentBreakdown] = useState(getStartingBreakdown(getMainDimension(reportCardType)));\r\n const reportCardRef = useRef<HTMLDivElement>(null);\r\n const reportTitle = getReportTitle(reportCardType, formatMessage);\r\n const isMediationReport = reportCardType === ReportCardType.MEDIATION;\r\n const mediationMetrics = mediationReportMetadata?.metrics.map((metric) => metric.key);\r\n const canFetchDetails = !!reportMetadata && !!selectedMetric && !!chartGrain && !!currentBreakdown;\r\n const canFetchMediationDetails = !!isMediationAvailable && isMediationReport;\r\n const { publisher, userContext } = getAppStore();\r\n const { systemPreferences } = getStore().active;\r\n const { locale } = useI18n({ systemPreferences, publisher, userContext });\r\n\r\n const breadcrumbItems: IBreadcrumbItem[] = [\r\n {\r\n key: 'Report',\r\n text: 'Report',\r\n },\r\n {\r\n key: 'reportCardType',\r\n text: reportTitle,\r\n },\r\n ];\r\n const { root } = getClassNames();\r\n const availableMediationFilters = mediationReportMetadata?.dimensions.filter((dimension) =>\r\n ALLOWED_MEDIATION_FILTER_COLUMNS.includes(TythonColumnsEnum[dimension.key])\r\n );\r\n const exportMetadata = isMediationReport ? mediationReportMetadata : reportMetadata;\r\n const { data: summaryData } = useReportQuery(\r\n constructRequestBody(ReportCardType.SUMMARY, calendarDateRange, ChartGrain.NONE, activeFilters, [], reportMetadata?.metrics || []),\r\n false,\r\n !!reportMetadata\r\n );\r\n const { data: detailedData } = useReportQuery(\r\n constructRequestBody(reportTitle, calendarDateRange, chartGrain, activeFilters, currentBreakdown, reportMetadata?.metrics || []),\r\n true,\r\n canFetchDetails && !canFetchMediationDetails\r\n );\r\n const { data: mediationReportDetailedData } = useMediationReportQuery(\r\n constructMediationRequestBody(calendarDateRange, chartGrain, activeFilters, currentBreakdown, mediationMetrics),\r\n canFetchDetails && canFetchMediationDetails\r\n );\r\n const exportData = isMediationReport ? mediationReportDetailedData : detailedData;\r\n\r\n const canExport = !!selectedMetric && !!exportMetadata && !!exportData;\r\n const exportedFileName = getExportFileName(calendarDateRange, chartGrain, reportTitle, locale);\r\n\r\n const onSelectedDatesChanged = (selectedDateRange: ICustomCalenderDateRange, rangeType: RangeType) => {\r\n setDataInURL(ReportsQueryStoreKeys.DATE_RANGE, selectedDateRange);\r\n setDataInURL(ReportsQueryStoreKeys.DATE_RANGE_TYPE, rangeType);\r\n setCalendarDateRange({ ...selectedDateRange });\r\n };\r\n const onChartGrainChanged = (grain: ChartGrain) => {\r\n setChartGrain(grain);\r\n };\r\n const onSelectedMetricChanged = (metric: string) => {\r\n setSelectedMetric(metric);\r\n };\r\n const onActiveMetricsChanged = (changedMetrics: ActiveMetrics) => {\r\n setActiveMetrics({ ...changedMetrics });\r\n };\r\n const onExportCSVClicked = () => {\r\n if (!canExport) {\r\n return;\r\n }\r\n exportReport(exportData, [...exportMetadata?.dimensions, ...exportMetadata?.metrics], exportedFileName, formatMessage);\r\n };\r\n const onExportPNGClicked = () => {\r\n if (!canExport) {\r\n return;\r\n }\r\n showLoadingToastNotification({\r\n textMessageDescriptor: messages.generatingAndExportingPNG,\r\n onDismiss: async () => {\r\n reportCardRef.current && (await exportToPNG(reportCardRef.current, exportedFileName));\r\n },\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n onLayoutChanged(LayoutMode.ContentOnly);\r\n }, []);\r\n\r\n return (\r\n <div className={root}>\r\n <SubPageNavBar\r\n breadcrumbAriaLabel={intl.formatMessage(messages.breadcrumbAriaLabel)}\r\n breadcrumbItems={breadcrumbItems}\r\n backAriaDescription={intl.formatMessage(messages.backButtonAriaDesc)}\r\n />\r\n\r\n <EmptyLayout>\r\n {isTythonSelfServeUser() ? (\r\n <>\r\n <Stack styles={formTitleStyles} horizontal horizontalAlign=\"space-between\">\r\n <FormTitle title={reportTitle} noHelpPopup={true} intl={intl} />\r\n <div>\r\n <CommandButton\r\n iconProps={{ iconName: 'export' }}\r\n text={intl.formatMessage(messages.exportButton)}\r\n menuProps={{\r\n items: [\r\n {\r\n key: 'exportCSV',\r\n text: intl.formatMessage(ReportMessages.exportCSV),\r\n onClick: onExportCSVClicked,\r\n disabled: !canExport,\r\n },\r\n {\r\n key: 'exportPNG',\r\n text: intl.formatMessage(ReportMessages.exportPNG),\r\n onClick: onExportPNGClicked,\r\n disabled: !canExport,\r\n },\r\n ],\r\n }}\r\n />\r\n </div>\r\n </Stack>\r\n <Stack tokens={getStackTokens()}>\r\n <Stack.Item grow basis={'100%'}>\r\n <ActionBar\r\n onSelectedDatesChanged={onSelectedDatesChanged}\r\n initialDateRange={{ startDate: initialStartDate, endDate: initialEndDate }}\r\n initialDateRangeType={initialDateRangeType}\r\n onFilterChanged={(changedFilters: IActiveFilter[]) => {\r\n setActiveFilters([...changedFilters]);\r\n }}\r\n dimensions={(isMediationReport ? availableMediationFilters : reportMetadata?.dimensions) || []}\r\n isMetadataLoaded={isMediationReport ? !!mediationReportMetadata : !!reportMetadata}\r\n reportCardType={reportCardType}\r\n activeMetrics={activeMetrics}\r\n />\r\n </Stack.Item>\r\n <Stack.Item grow basis={'100%'}>\r\n {reportCardType === ReportCardType.PERFORMANCE && (\r\n <PerformanceReportCard\r\n allowedChartTypes={DETAILED_PERFORMANCE_ALLOWED_CHARTS}\r\n showDetailsReportLink={false}\r\n enableHideChartsButton={true}\r\n dateRange={calendarDateRange}\r\n isDetailedView={true}\r\n onChartGrainChanged={onChartGrainChanged}\r\n onSelectedMetricChanged={onSelectedMetricChanged}\r\n onBreakdownChanged={(updatedBreakdown) => {\r\n setCurrentBreakdown(updatedBreakdown);\r\n }}\r\n reportDetailedData={detailedData}\r\n filters={activeFilters}\r\n history={history}\r\n location={location}\r\n match={match}\r\n reportCardRef={reportCardRef}\r\n onActiveMetricsChanged={onActiveMetricsChanged}\r\n reportMetadata={reportMetadata}\r\n summaryData={summaryData}\r\n />\r\n )}\r\n {reportCardType === ReportCardType.ADUNIT && (\r\n <AdUnitsReportCard\r\n allowedChartTypes={DETAILED_ADUNIT_ALLOWED_CHARTS}\r\n showDetailsReportLink={false}\r\n enableHideChartsButton={true}\r\n dateRange={calendarDateRange}\r\n showMetricsMarkers={true}\r\n isDetailedView={true}\r\n onChartGrainChanged={onChartGrainChanged}\r\n onSelectedMetricChanged={onSelectedMetricChanged}\r\n onBreakdownChanged={(updatedBreakdown) => {\r\n setCurrentBreakdown(updatedBreakdown);\r\n }}\r\n reportDetailedData={detailedData}\r\n filters={activeFilters}\r\n history={history}\r\n location={location}\r\n match={match}\r\n reportCardRef={reportCardRef}\r\n onActiveMetricsChanged={onActiveMetricsChanged}\r\n reportMetadata={reportMetadata}\r\n summaryData={summaryData}\r\n />\r\n )}\r\n {reportCardType === ReportCardType.SITE && (\r\n <SitesReportCard\r\n allowedChartTypes={DETAILED_SITE_ALLOWED_CHARTS}\r\n showDetailsReportLink={false}\r\n enableHideChartsButton={true}\r\n dateRange={calendarDateRange}\r\n showMetricsMarkers={true}\r\n isDetailedView={true}\r\n onChartGrainChanged={onChartGrainChanged}\r\n onSelectedMetricChanged={onSelectedMetricChanged}\r\n onBreakdownChanged={(updatedBreakdown) => {\r\n setCurrentBreakdown(updatedBreakdown);\r\n }}\r\n reportDetailedData={detailedData}\r\n filters={activeFilters}\r\n history={history}\r\n location={location}\r\n match={match}\r\n reportCardRef={reportCardRef}\r\n onActiveMetricsChanged={onActiveMetricsChanged}\r\n reportMetadata={reportMetadata}\r\n summaryData={summaryData}\r\n />\r\n )}\r\n {reportCardType === ReportCardType.COUNTRY && (\r\n <CountryReportCard\r\n allowedChartTypes={DETAILED_COUNTRY_ALLOWED_CHARTS}\r\n showDetailsReportLink={false}\r\n enableHideChartsButton={true}\r\n dateRange={calendarDateRange}\r\n showMetricsMarkers={true}\r\n isDetailedView={true}\r\n onChartGrainChanged={onChartGrainChanged}\r\n onSelectedMetricChanged={onSelectedMetricChanged}\r\n onBreakdownChanged={(updatedBreakdown) => {\r\n setCurrentBreakdown(updatedBreakdown);\r\n }}\r\n reportDetailedData={detailedData}\r\n filters={activeFilters}\r\n history={history}\r\n location={location}\r\n match={match}\r\n reportCardRef={reportCardRef}\r\n onActiveMetricsChanged={onActiveMetricsChanged}\r\n reportMetadata={reportMetadata}\r\n summaryData={summaryData}\r\n />\r\n )}\r\n {isMediationAvailable && reportCardType === ReportCardType.MEDIATION && (\r\n <MediationReportCard\r\n dateRange={calendarDateRange}\r\n enableHideChartsButton={true}\r\n showMetricsMarkers={true}\r\n allowedChartTypes={DETAILED_MEDIATION_ALLOWED_CHARTS}\r\n showDetailsReportLink={false}\r\n isDetailedView={true}\r\n onChartGrainChanged={onChartGrainChanged}\r\n onSelectedMetricChanged={onSelectedMetricChanged}\r\n onBreakdownChanged={(updatedBreakdown) => {\r\n setCurrentBreakdown(updatedBreakdown);\r\n }}\r\n reportDetailedData={mediationReportDetailedData}\r\n filters={activeFilters}\r\n history={history}\r\n location={location}\r\n match={match}\r\n reportCardRef={reportCardRef}\r\n reportMetadata={mediationReportMetadata}\r\n />\r\n )}\r\n </Stack.Item>\r\n </Stack>\r\n </>\r\n ) : (\r\n <div>{formatMessage(ReportMessages.reportDescriptionForReportsNotApplicable)}</div>\r\n )}\r\n </EmptyLayout>\r\n </div>\r\n );\r\n});\r\n\r\nfunction getReportTitle(\r\n reportCardType: ReportCardType,\r\n formatMessage: (\r\n messageDescriptor: ReactIntl.FormattedMessage.MessageDescriptor,\r\n values?: { [key: string]: ReactIntl.MessageValue } | undefined\r\n ) => string\r\n) {\r\n switch (reportCardType) {\r\n case ReportCardType.PERFORMANCE:\r\n return formatMessage(appMessages.performanceCardTitle);\r\n case ReportCardType.ADUNIT:\r\n return formatMessage(appMessages.adUnitsCardTitle);\r\n case ReportCardType.MEDIATION:\r\n return formatMessage(appMessages.mediationCardTitle);\r\n case ReportCardType.COUNTRY:\r\n return formatMessage(appMessages.countryCardTitle);\r\n case ReportCardType.SITE:\r\n return formatMessage(appMessages.sitesCardTitle);\r\n default:\r\n return '';\r\n }\r\n}\r\nfunction getMainDimension(reportCardType: ReportCardType) {\r\n switch (reportCardType) {\r\n case ReportCardType.ADUNIT:\r\n return TythonColumnsEnum.AdUnitName;\r\n case ReportCardType.MEDIATION:\r\n return TythonColumnsEnum.AdUnitName;\r\n case ReportCardType.COUNTRY:\r\n return TythonColumnsEnum.Country;\r\n case ReportCardType.SITE:\r\n return TythonColumnsEnum.PropertyUrl;\r\n default:\r\n return '';\r\n }\r\n}\r\n","import { getTheme, IStackTokens, ITheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterSpacing, IPubcenterTheme } from '../../../../../../theme';\r\n\r\ninterface IMetricCardStyleProps {\r\n theme: ITheme;\r\n}\r\ntype StyleProperties = 'metricCard' | 'titleStyle' | 'metricStyle';\r\ntype MetricCardStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: IMetricCardStyleProps): MetricCardStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return mergeStyleSets({\r\n metricCard: {\r\n height: '100%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n titleStyle: {\r\n whiteSpace: 'nowrap',\r\n },\r\n metricStyle: {\r\n fontSize: '28px',\r\n fontWeight: 700,\r\n lineHeight: spacing.size32,\r\n paddingBottom: spacing.size16,\r\n },\r\n });\r\n};\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\nexport function getStackTokens(): IStackTokens {\r\n const theme = (getTheme() as unknown) as IPubcenterTheme;\r\n const spacing = theme.spacing;\r\n\r\n return { childrenGap: spacing.size12 };\r\n}\r\n","import { ShimmerElementsGroup, ShimmerElementType } from '@fluentui/react';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport { Card } from '../../../../../components/Card/Card';\r\nimport { getClassNames } from './MetricCard.styles';\r\n\r\nexport interface IMetricCardProps {\r\n title: string;\r\n dataValue: string;\r\n isDataLoaded?: boolean;\r\n}\r\n\r\nexport const MetricCard = observer(({ title, isDataLoaded, dataValue }: IMetricCardProps) => {\r\n const { metricCard, titleStyle, metricStyle } = getClassNames();\r\n return (\r\n <Card\r\n shimmerCustomElement={\r\n <ShimmerElementsGroup\r\n flexWrap\r\n width=\"100%\"\r\n shimmerElements={[\r\n { type: ShimmerElementType.gap, width: '10%', height: 30 },\r\n { type: ShimmerElementType.line, width: '80%', height: 20 },\r\n { type: ShimmerElementType.gap, width: '10%', height: 30 },\r\n ]}\r\n />\r\n }\r\n isDataLoaded={isDataLoaded}\r\n titleText={title}\r\n styleProps={{ titleStyle }}\r\n >\r\n <div className={metricCard}>\r\n <div className={metricStyle}>{dataValue ? dataValue : '--'}</div>\r\n </div>\r\n </Card>\r\n );\r\n});\r\n","import { getTheme, IStackTokens, mergeStyleSets } from '@fluentui/react';\r\nimport { BreakPoints, IPubcenterTheme } from '../../../../../theme';\r\n\r\nconst { ResponsiveMedium, ResponsiveSmall } = BreakPoints;\r\n\r\nexport interface ITopMetricsStyleProps {\r\n evenCards?: boolean;\r\n}\r\ntype StyleProperties = 'metricsWrapper' | 'smallCards' | 'cardsColumn';\r\n\r\ntype TopMetricsStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = ({ evenCards }: ITopMetricsStyleProps): TopMetricsStyles => {\r\n return mergeStyleSets({\r\n metricsWrapper: {\r\n display: 'grid',\r\n columnGap: '1%',\r\n rowGap: '1%',\r\n gridTemplateColumns: evenCards ? '1fr' : '1fr 3fr',\r\n [ResponsiveMedium]: {\r\n gridTemplateColumns: '1fr',\r\n },\r\n [ResponsiveSmall]: {\r\n gridTemplateColumns: '1fr',\r\n },\r\n },\r\n smallCards: {\r\n display: 'grid',\r\n columnGap: '1%',\r\n gridAutoFlow: 'column',\r\n gridAutoColumns: '1fr',\r\n [ResponsiveSmall]: {\r\n gridTemplateColumns: '1fr',\r\n gridAutoFlow: 'initial',\r\n gridAutoColumns: 'initial',\r\n },\r\n },\r\n cardsColumn: {\r\n display: 'grid',\r\n rowGap: '2%',\r\n gridTemplateRows: '49% 49%',\r\n [ResponsiveSmall]: {\r\n gridTemplateColumns: '49% 49%',\r\n columnGap: '2%',\r\n gridTemplateRows: '1fr',\r\n },\r\n },\r\n });\r\n};\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ ...props });\r\n}\r\n\r\nexport function getStackTokens(): IStackTokens {\r\n const theme = (getTheme() as unknown) as IPubcenterTheme;\r\n const spacing = theme.spacing;\r\n\r\n return { childrenGap: spacing.size12 };\r\n}\r\n","import React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { useI18n } from '../../../../../i18n/useI18n';\r\nimport { getAppStore } from '../../../../@data';\r\nimport { injectIntlAndObserver } from '../../../../utils';\r\nimport { getStore } from '../../../ad-management/Account/Settings/@data/store/store';\r\nimport { TythonColumnsEnum } from '../../@data/store/schema/ColumnsEnum';\r\nimport { getReportColumnMetadataDisplayName } from '../../utils/intlHelper';\r\nimport { formatMetric } from '../../utils/metricsFormatter';\r\nimport { IReportsMetadata, ReportDataSource, TythonReportingDataRow } from '../@data/store/schema';\r\nimport { getReportPageStore } from '../@data/store/store';\r\nimport { MetricCard } from './MetricCard/MetricCard';\r\nimport { ITopMetricsStyleProps, getClassNames } from './MetricsSummaryCards.styles';\r\n\r\nexport interface ITopMetricsProps extends InjectedIntlProps {\r\n reportMetadata?: IReportsMetadata;\r\n summaryData?: TythonReportingDataRow[];\r\n}\r\n\r\nexport const MetricsSummaryCards = injectIntlAndObserver(({ reportMetadata, summaryData, intl: { formatMessage } }: ITopMetricsProps) => {\r\n const { reportType } = getReportPageStore();\r\n const { metricsWrapper, smallCards, cardsColumn } = getClassNames<ITopMetricsStyleProps>({\r\n evenCards: reportType === ReportDataSource.TythonV2,\r\n });\r\n const { publisher, userContext } = getAppStore();\r\n const { systemPreferences } = getStore().active;\r\n const { locale } = useI18n({ systemPreferences, publisher, userContext });\r\n\r\n const summary = (summaryData && summaryData[0] ? summaryData[0] : { DateTime: '' }) as TythonReportingDataRow;\r\n const isSummaryDataLaded = !!summaryData;\r\n\r\n return (\r\n <div className={metricsWrapper}>\r\n {reportType === ReportDataSource.MSXTython && (\r\n <div>\r\n <MetricCard\r\n isDataLoaded={isSummaryDataLaded && !!reportMetadata}\r\n title={(!!reportMetadata && getReportColumnMetadataDisplayName(TythonColumnsEnum.Revenue, formatMessage)) || ''}\r\n dataValue={`${formatMetric(TythonColumnsEnum.Revenue, summary.Revenue, locale)}`}\r\n />\r\n </div>\r\n )}\r\n <div className={smallCards}>\r\n {reportType === ReportDataSource.TythonV2 && (\r\n <div className={cardsColumn}>\r\n <div>\r\n <MetricCard\r\n isDataLoaded={isSummaryDataLaded && !!reportMetadata}\r\n title={(!!reportMetadata && getReportColumnMetadataDisplayName(TythonColumnsEnum.Revenue, formatMessage)) || ''}\r\n dataValue={`${formatMetric(TythonColumnsEnum.Revenue, summary.Revenue, locale)}`}\r\n />\r\n </div>\r\n <div>\r\n <MetricCard\r\n isDataLoaded={isSummaryDataLaded && !!reportMetadata}\r\n title={(!!reportMetadata && getReportColumnMetadataDisplayName(TythonColumnsEnum.FillRate, formatMessage)) || ''}\r\n dataValue={`${formatMetric(TythonColumnsEnum.FillRate, summary.FillRate, locale)}`}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n <div className={cardsColumn}>\r\n <div>\r\n <MetricCard\r\n isDataLoaded={isSummaryDataLaded && !!reportMetadata}\r\n title={(!!reportMetadata && getReportColumnMetadataDisplayName(TythonColumnsEnum.ImpressionsServed, formatMessage)) || ''}\r\n dataValue={`${formatMetric(TythonColumnsEnum.ImpressionsServed, summary.ImpressionsServed, locale)}`}\r\n />\r\n </div>\r\n <div>\r\n <MetricCard\r\n isDataLoaded={isSummaryDataLaded && !!reportMetadata}\r\n title={(!!reportMetadata && getReportColumnMetadataDisplayName(TythonColumnsEnum.Viewability, formatMessage)) || ''}\r\n dataValue={`${formatMetric(TythonColumnsEnum.Viewability, summary.Viewability, locale)}`}\r\n />\r\n </div>\r\n </div>\r\n <div className={cardsColumn}>\r\n <div>\r\n <MetricCard\r\n isDataLoaded={isSummaryDataLaded && !!reportMetadata}\r\n title={(!!reportMetadata && getReportColumnMetadataDisplayName(TythonColumnsEnum.ImpressionsViewed, formatMessage)) || ''}\r\n dataValue={`${formatMetric(TythonColumnsEnum.ImpressionsViewed, summary.ImpressionsViewed, locale)}`}\r\n />\r\n </div>\r\n <div>\r\n <MetricCard\r\n isDataLoaded={isSummaryDataLaded && !!reportMetadata}\r\n title={(!!reportMetadata && getReportColumnMetadataDisplayName(TythonColumnsEnum.CTR, formatMessage)) || ''}\r\n dataValue={`${formatMetric(TythonColumnsEnum.CTR, summary.CTR, locale)}`}\r\n />\r\n </div>\r\n </div>\r\n <div className={cardsColumn}>\r\n <div>\r\n <MetricCard\r\n isDataLoaded={isSummaryDataLaded && !!reportMetadata}\r\n title={(!!reportMetadata && getReportColumnMetadataDisplayName(TythonColumnsEnum.eCPM, formatMessage)) || ''}\r\n dataValue={`${formatMetric(TythonColumnsEnum.eCPM, summary.eCPM, locale)}`}\r\n />\r\n </div>\r\n <div>\r\n <MetricCard\r\n isDataLoaded={isSummaryDataLaded && !!reportMetadata}\r\n title={(!!reportMetadata && getReportColumnMetadataDisplayName(TythonColumnsEnum.Clicks, formatMessage)) || ''}\r\n dataValue={`${formatMetric(TythonColumnsEnum.Clicks, summary.Clicks, locale)}`}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n});\r\n","import { getTheme, IStackTokens, mergeStyleSets } from '@fluentui/react';\r\nimport { BreakPoints, IPubcenterTheme } from '../../../../theme';\r\nconst { ResponsiveMedium, ResponsiveSmall } = BreakPoints;\r\ninterface ITythonReportCardsStyleProps {\r\n theme: IPubcenterTheme;\r\n}\r\ntype StyleProperties = 'reportCard';\r\n\r\ntype TythonReportCardsStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ITythonReportCardsStyleProps): TythonReportCardsStyles => {\r\n return mergeStyleSets({\r\n reportCard: {\r\n display: 'grid',\r\n gridTemplateColumns: '49.5% 49.5%',\r\n columnGap: '1%',\r\n rowGap: '2%',\r\n [ResponsiveMedium]: {\r\n gridTemplateColumns: '100%',\r\n columnGap: '0',\r\n },\r\n [ResponsiveSmall]: {\r\n gridTemplateColumns: '100%',\r\n columnGap: '0',\r\n },\r\n },\r\n });\r\n};\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: (getTheme() as unknown) as IPubcenterTheme, ...props });\r\n}\r\nexport function getStackTokens(): IStackTokens {\r\n const theme = (getTheme() as unknown) as IPubcenterTheme;\r\n const spacing = theme.spacing;\r\n\r\n return { childrenGap: spacing.size12 };\r\n}\r\n","import { Stack } from '@fluentui/react';\r\nimport React, { useRef } from 'react';\r\nimport { IRouterWithIntl, injectIntlAndObserver } from '../../../utils';\r\nimport { ICustomCalenderDateRange } from '../components/CustomCalender/CustomCalender.types';\r\nimport {\r\n ADUNIT_ALLOWED_CHARTS,\r\n COUNTRY_ALLOWED_CHARTS,\r\n MEDIATION_ALLOWED_CHARTS,\r\n PERFORMANCE_ALLOWED_CHARTS,\r\n SITE_ALLOWED_CHARTS,\r\n} from '../constants/allowedChartsType';\r\nimport { useMediationAvailable } from '../hooks/useMediationAvailable';\r\nimport { useMediationReportMetadata, useReportMetadata, useReportQuery } from '../hooks/useReportQuery';\r\nimport { AdUnitsReportCard } from './AdUnitsReportCard/AdUnitsReportCard';\r\nimport { CountryReportCard } from './CountryReportCard/CountryReportCard';\r\nimport { MediationReportCard } from './MediationReportCard/MediationReportCard';\r\nimport { MetricsSummaryCards } from './MetricsSummaryCards/MetricsSummaryCards';\r\nimport { PerformanceReportCard } from './PerformanceReportCard/PerformanceReportCard';\r\nimport { constructRequestBody } from './ReportCard/ReportCard.helpers';\r\nimport { ChartGrain, ReportCardType } from './ReportCard/ReportCard.types';\r\nimport { SitesReportCard } from './SitesReportCard/SitesReportCard';\r\nimport { getClassNames, getStackTokens } from './TythonReportCards.styles';\r\nexport interface IDashboardCardsProps extends IRouterWithIntl {\r\n dateRange: ICustomCalenderDateRange;\r\n}\r\n\r\nexport const TythonReportCards = injectIntlAndObserver((props: IDashboardCardsProps) => {\r\n const { dateRange } = props;\r\n const classNames = getClassNames(props);\r\n const { isMediationAvailable } = useMediationAvailable();\r\n const { data: reportMetadata } = useReportMetadata();\r\n const { data: mediationReportMetadata } = useMediationReportMetadata(!!isMediationAvailable);\r\n const adunitReportCardRef = useRef<HTMLDivElement>(null);\r\n const sitesReportCardRef = useRef<HTMLDivElement>(null);\r\n const performanceReportCardRef = useRef<HTMLDivElement>(null);\r\n const mediationReportCardRef = useRef<HTMLDivElement>(null);\r\n const countryReportCardRef = useRef<HTMLDivElement>(null);\r\n\r\n const { data: summaryData } = useReportQuery(\r\n constructRequestBody(ReportCardType.SUMMARY, dateRange, ChartGrain.NONE, [], [], reportMetadata?.metrics || []),\r\n false,\r\n !!reportMetadata\r\n );\r\n\r\n return (\r\n <>\r\n <Stack tokens={getStackTokens()}>\r\n <MetricsSummaryCards summaryData={summaryData} reportMetadata={reportMetadata} />\r\n <Stack>\r\n <Stack.Item grow basis={'100%'}>\r\n <PerformanceReportCard\r\n dateRange={dateRange}\r\n summaryData={summaryData}\r\n allowedChartTypes={PERFORMANCE_ALLOWED_CHARTS}\r\n showDetailsReportLink={true}\r\n isDetailedView={false}\r\n filters={[]}\r\n history={props.history}\r\n location={props.location}\r\n match={props.match}\r\n reportCardRef={performanceReportCardRef}\r\n reportMetadata={reportMetadata}\r\n />\r\n </Stack.Item>\r\n </Stack>\r\n <Stack tokens={getStackTokens()}>\r\n <div className={classNames.reportCard}>\r\n <div>\r\n <AdUnitsReportCard\r\n dateRange={dateRange}\r\n allowedChartTypes={ADUNIT_ALLOWED_CHARTS}\r\n showDetailsReportLink={true}\r\n isDetailedView={false}\r\n filters={[]}\r\n history={props.history}\r\n location={props.location}\r\n match={props.match}\r\n reportCardRef={adunitReportCardRef}\r\n reportMetadata={reportMetadata}\r\n />\r\n </div>\r\n <div>\r\n <SitesReportCard\r\n dateRange={dateRange}\r\n allowedChartTypes={SITE_ALLOWED_CHARTS}\r\n showDetailsReportLink={true}\r\n isDetailedView={false}\r\n filters={[]}\r\n history={props.history}\r\n location={props.location}\r\n match={props.match}\r\n reportCardRef={sitesReportCardRef}\r\n reportMetadata={reportMetadata}\r\n />\r\n </div>\r\n <div>\r\n <CountryReportCard\r\n dateRange={dateRange}\r\n allowedChartTypes={COUNTRY_ALLOWED_CHARTS}\r\n showDetailsReportLink={true}\r\n isDetailedView={false}\r\n filters={[]}\r\n history={props.history}\r\n location={props.location}\r\n match={props.match}\r\n reportCardRef={countryReportCardRef}\r\n reportMetadata={reportMetadata}\r\n />\r\n </div>\r\n {isMediationAvailable && (\r\n <div>\r\n <MediationReportCard\r\n dateRange={dateRange}\r\n allowedChartTypes={MEDIATION_ALLOWED_CHARTS}\r\n showDetailsReportLink={true}\r\n isDetailedView={false}\r\n filters={[]}\r\n history={props.history}\r\n location={props.location}\r\n match={props.match}\r\n reportCardRef={mediationReportCardRef}\r\n reportMetadata={mediationReportMetadata}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </Stack>\r\n </Stack>\r\n </>\r\n );\r\n});\r\n","import { IPubcenterPalette, IPubcenterSpacing } from '../../../theme';\r\nimport { IReportPageStyleProps, IReportPageStyles } from './ReportPage.types';\r\n\r\nexport const getStyles = (props: IReportPageStyleProps): IReportPageStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const pallete = theme.palette as IPubcenterPalette;\r\n\r\n return {\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: 'inherit',\r\n flex: 1,\r\n },\r\n description: {\r\n color: theme.palette.neutralSecondary,\r\n position: 'relative',\r\n marginTop: spacing.size12,\r\n fontSize: theme.fonts.medium.fontSize,\r\n },\r\n link: [\r\n 'ms-fontSize-Body14',\r\n {\r\n color: pallete.themePrimary,\r\n selectors: {\r\n ':hover': {\r\n cursor: 'pointer',\r\n },\r\n },\r\n marginTop: spacing.size12,\r\n },\r\n ],\r\n linkTitle: {\r\n marginLeft: '6px',\r\n position: 'relative',\r\n textAlign: 'center',\r\n },\r\n subComponentStyles: {\r\n formTitle: {\r\n root: {\r\n marginBottom: spacing.size24,\r\n },\r\n },\r\n },\r\n };\r\n};\r\n","import { classNamesFunction, getTheme, Icon, Stack } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { getAppStore, LayoutMode, onLayoutChanged } from '../../@data';\r\nimport { isTythonSelfServeUser } from '../../@data/utils/checkUserType';\r\nimport { FormTitle } from '../../components/Form';\r\nimport { REPORTING_DATE_RANGE_PICKER } from '../../constants/DataTestIdConstants';\r\nimport { EmptyLayout } from '../../layout/EmptyLayout/EmptyLayout';\r\nimport { injectIntlWithObserver } from '../../utils';\r\nimport { isButtonPressKey } from '../../utils/AccessibilityUtils';\r\nimport { onCurrentRouteChanged as routeChanged } from '../ad-management/@data/actions';\r\nimport '../ad-management/@data/orchestrators';\r\nimport { onCurrentRouteChanged, onReportLinkClicked, onSetPublisherReporting } from './@data/actions';\r\nimport './@data/mutators';\r\nimport './@data/orchestrators';\r\nimport { ReportsQueryStoreKeys } from './@data/store/schema/ReportsQueryStoreKeys';\r\nimport { getPageStore, RouteName } from './@data/store/store';\r\nimport { setDataInURL } from './@data/store/UrlQueryStore';\r\nimport { CustomCalender } from './components/CustomCalender/CustomCalender';\r\nimport { ICustomCalenderDateRange, RangeType } from './components/CustomCalender/CustomCalender.types';\r\nimport { TythonReportCards } from './DashboardCards/TythonReportCards';\r\nimport messages from './Report.messages';\r\nimport { getStyles } from './ReportPage.styles';\r\nimport { IReportPageProps, IReportPageStyleProps, IReportPageStyles } from './ReportPage.types';\r\nimport { getInitialDateRange } from './utils/getInitialDateRange';\r\nconst getClassNames = classNamesFunction<IReportPageStyleProps, IReportPageStyles>();\r\n\r\nexport const ReportPage = injectIntlWithObserver<IReportPageProps>((props: IReportPageProps) => {\r\n const params = props.match.params;\r\n\r\n const publisherId = params.publisherId;\r\n const { publisher } = getAppStore();\r\n const { isReportEnabled } = getPageStore();\r\n\r\n useEffect(() => {\r\n onCurrentRouteChanged(RouteName.dashboard, props.intl.formatMessage);\r\n onLayoutChanged(LayoutMode.Default);\r\n\r\n if (isTythonSelfServeUser()) {\r\n // Since ReportPage is rendered inside ad-management for Tython users, updating current route\r\n routeChanged(RouteName.dashboard, props.intl.formatMessage);\r\n }\r\n if (isReportEnabled === undefined) {\r\n if (publisherId && publisher) {\r\n onSetPublisherReporting(publisher);\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [publisherId, publisher, isReportEnabled]);\r\n const {\r\n dateRange: { initialStartDate, initialEndDate },\r\n initialDateRangeType,\r\n } = getInitialDateRange();\r\n\r\n const [dateRange, setDateRange] = React.useState<ICustomCalenderDateRange>({\r\n startDate: initialStartDate,\r\n endDate: initialEndDate,\r\n });\r\n const classNames = getClassNames(getStyles, { theme: getTheme() });\r\n const { formatMessage } = props.intl;\r\n\r\n const onSelectedDatesChanged = (selectedDateRange: ICustomCalenderDateRange, rangeType: RangeType) => {\r\n setDataInURL(ReportsQueryStoreKeys.DATE_RANGE, selectedDateRange);\r\n setDataInURL(ReportsQueryStoreKeys.DATE_RANGE_TYPE, rangeType);\r\n setDateRange({ ...selectedDateRange });\r\n };\r\n\r\n return (\r\n <EmptyLayout>\r\n <div className={classNames.root}>\r\n <Stack styles={classNames.subComponentStyles.formTitle} horizontal horizontalAlign=\"space-between\">\r\n <FormTitle title={formatMessage(messages.reportTitle)} noHelpPopup={true} intl={props.intl} />\r\n {isTythonSelfServeUser() && (\r\n <div>\r\n <CustomCalender\r\n dataTestId={REPORTING_DATE_RANGE_PICKER}\r\n onSelectedDatesChanged={onSelectedDatesChanged}\r\n initialRangeType={initialDateRangeType}\r\n initialDateRange={{ startDate: initialStartDate, endDate: initialEndDate }}\r\n />\r\n </div>\r\n )}\r\n </Stack>\r\n {isTythonSelfServeUser() ? (\r\n <TythonReportCards dateRange={dateRange} history={props.history} location={props.location} match={props.match} />\r\n ) : (\r\n <div>\r\n <div id=\"reportDescription\" className={classNames.description}>\r\n {publisher\r\n ? isReportEnabled\r\n ? _getHighlightedText(formatMessage(messages.reportDescriptionForPublisherSelected), formatMessage(messages.reportLink))\r\n : formatMessage(messages.reportDescriptionForReportsNotApplicable)\r\n : formatMessage(messages.reportDescriptionForPublisherNotSelected)}\r\n </div>\r\n {publisher && isReportEnabled && (\r\n <div\r\n className={classNames.link}\r\n role=\"button\"\r\n tabIndex={0}\r\n onClick={() => onReportLinkClicked()}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key) && onReportLinkClicked()}\r\n aria-describedby=\"reportDescription\"\r\n >\r\n <Icon iconName={'OpenInNewWindow'} />\r\n <span className={classNames.linkTitle}>{formatMessage(messages.reportLink)}</span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </EmptyLayout>\r\n );\r\n});\r\nfunction _getHighlightedText(text: string, highlight: string): JSX.Element {\r\n const parts = text.split(new RegExp(`(${highlight})`, 'gi'));\r\n return (\r\n <span>\r\n {' '}\r\n {parts.map((part, i) => (\r\n <span key={i} style={part.toLowerCase() === highlight.toLowerCase() ? { fontWeight: 'bold' } : {}}>\r\n {part}\r\n </span>\r\n ))}{' '}\r\n </span>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { Route, RouteComponentProps, Switch } from 'react-router-dom';\r\nimport { isTythonSelfServeUser } from '../../@data';\r\nimport { injectIntlWithObserver } from '../../utils';\r\nimport { onInitializeGoogleAccount } from '../ad-management/Account/Settings/components/GoogleConnector/@data/actions';\r\nimport { fetchAdUnitsDataAction } from '../ad-management/Adunit/@data/actions';\r\nimport { onCurrentRouteChanged } from './@data/actions';\r\nimport './@data/mutators';\r\nimport './@data/orchestrators';\r\nimport { RouteName } from './@data/store/store';\r\nimport { fetchMediationReportsMetadata } from './DashboardCards/@data/actions';\r\nimport { ReportDetailsPage } from './DashboardCards/ReportDetailsPage/ReportDetailsPage';\r\n\r\nimport { ReportPage } from './ReportPage';\r\nimport { useMediationAvailable } from './hooks/useMediationAvailable';\r\n\r\nexport const BaseReportPage = injectIntlWithObserver((props: RouteComponentProps & InjectedIntlProps) => {\r\n const { isMediationAvailable } = useMediationAvailable();\r\n useEffect(() => {\r\n onCurrentRouteChanged(RouteName.dashboard, props.intl.formatMessage);\r\n if (isTythonSelfServeUser()) {\r\n onInitializeGoogleAccount(false);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n useEffect(() => {\r\n if (isTythonSelfServeUser() && isMediationAvailable) {\r\n fetchMediationReportsMetadata();\r\n fetchAdUnitsDataAction();\r\n }\r\n }, [isMediationAvailable]);\r\n return (\r\n <>\r\n <Switch>\r\n <Route exact path={`${props.match.url}`} component={ReportPage} />\r\n <Route exact path={`${props.match.url}/:type/${RouteName.reportDetails}`} component={ReportDetailsPage} />\r\n </Switch>\r\n </>\r\n );\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n title: {\r\n id: 'app.pages.errorPages.suspendedUser.title',\r\n defaultMessage: 'Your profile has been rejected',\r\n },\r\n description: {\r\n id: 'app.pages.errorPages.suspendedUser.description',\r\n defaultMessage: \"We have rejected your profile because it doesn't comply with our \",\r\n },\r\n termAndConditions: {\r\n id: 'app.pages.errorPages.suspendedUser.termAndConditions',\r\n defaultMessage: 'Terms and Conditions.',\r\n },\r\n});\r\n","import { FontWeights, getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { BreakPoints, IPubCenterFonts, IPubcenterSpacing } from '../../../../theme';\r\nimport { ICommonStyleProps } from '../../../types';\r\n\r\ntype StyleProperties = 'page' | 'container' | 'titleStyle' | 'descriptionStyle';\r\ntype SetupCardStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): SetupCardStyles => {\r\n const { theme } = props;\r\n const fonts = theme.fonts as IPubCenterFonts;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const { ResponsiveSmall } = BreakPoints;\r\n\r\n return mergeStyleSets({\r\n page: {\r\n height: '100%',\r\n zIndex: 999999,\r\n },\r\n container: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n gap: spacing.size24,\r\n marginTop: '5%',\r\n padding: `0 ${spacing.size32}`,\r\n [ResponsiveSmall]: {\r\n flexDirection: 'column',\r\n },\r\n },\r\n titleStyle: {\r\n fontSize: fonts.size24.fontSize,\r\n fontWeight: FontWeights.bold,\r\n },\r\n descriptionStyle: {\r\n fontSize: fonts.size16.fontSize,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { DefaultButton, Image, Link } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { isTythonSelfServeUser } from '../../../@data';\r\nimport AppMessages from '../../../App.messages';\r\nimport { SupportPageRoute } from '../../../Routes';\r\nimport { SUPPORT_EMAIL, TNC_HREF_PATH } from '../../../constants/AppConstants';\r\nimport { injectIntlAndObserver } from '../../../utils';\r\nimport messages from './SuspendedUser.messages';\r\nimport { getClassNames } from './SuspendedUser.styles';\r\nimport suspendedUser from './resources/UserSuspended.svg';\r\n\r\nconst SuspendedUserOverlay = injectIntlAndObserver<InjectedIntlProps>(({ intl: { formatMessage } }) => {\r\n const { page, container, titleStyle, descriptionStyle } = getClassNames();\r\n\r\n return (\r\n <div className={page}>\r\n <div className={container}>\r\n <Image src={suspendedUser} imageFit={1} shouldFadeIn />\r\n <div>\r\n <span className={titleStyle}>{formatMessage(messages.title)}</span>\r\n <p className={descriptionStyle}>\r\n {formatMessage(messages.description)}\r\n <Link target=\"_blank\" href={TNC_HREF_PATH}>\r\n {formatMessage(messages.termAndConditions)}\r\n </Link>\r\n </p>\r\n <DefaultButton\r\n href={isTythonSelfServeUser() ? `${SupportPageRoute}` : `mailto:${SUPPORT_EMAIL}`}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n text={formatMessage(AppMessages.contactSupport)}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\nexport default SuspendedUserOverlay;\r\n","import React, { useEffect } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\nimport { EntityType, LayoutMode, getAppStore, onHelpInfoCalloutOpened, onHelpInfoChanged, onLayoutChanged } from '../../../../@data';\r\nimport { FormTitle } from '../../../../components/Form';\r\nimport ProfilePanelMessages from '../../../../layout/PageLayout/header-panels/ProfilePanel/ProfilePanel.messages';\r\nimport { injectRouterAndIntlWithObserver } from '../../../../utils';\r\nimport { RouteName } from '../../@data';\r\nimport { onCurrentRouteChanged } from '../../@data/actions';\r\nimport { onFetchUserPreferences } from './@data/actions/onSettingsPageChanged';\r\nimport { setEntityType } from './@data/mutatorActions/settingsPageChanged';\r\nimport messages from './SettingsPage.messages';\r\nimport { getClassNames } from './SettingsPage.styles';\r\nimport { NotificationConfiguration } from './components/NotificationConfiguration';\r\n\r\nexport interface ISettingsPageProps extends RouteComponentProps<{ publisherId: string }>, InjectedIntlProps {}\r\n\r\nexport const UserSettingsPage = injectRouterAndIntlWithObserver(function UserSettingsPageComponent({\r\n intl,\r\n}: ISettingsPageProps): JSX.Element {\r\n const { pageTitleStyle, root } = getClassNames();\r\n const { formatMessage } = intl;\r\n const { helpInfo, locale } = getAppStore();\r\n\r\n // const hasUserDeleteAccess = hasDeleteAccess(accessPermissions ? accessPermissions.userDelete : completeAccess);\r\n\r\n useEffect(() => {\r\n onCurrentRouteChanged(RouteName.userSettings, intl.formatMessage, ProfilePanelMessages.userSettings);\r\n onLayoutChanged(LayoutMode.Default);\r\n setEntityType(EntityType.User);\r\n onFetchUserPreferences(locale);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <div className={root}>\r\n <FormTitle\r\n intl={intl}\r\n title={formatMessage(messages.userSettings)}\r\n styles={{ root: pageTitleStyle }}\r\n id=\"pop_PCv4_Profilesettings\"\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_Profilesettings', locale)}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n />\r\n <NotificationConfiguration />\r\n {/* {hasUserDeleteAccess && <UserDeletion />} */}\r\n </div>\r\n );\r\n});\r\n","import { nullRender } from '@fluentui/react';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport {\r\n Account,\r\n getAppStore,\r\n onAccountChanged,\r\n onDefaultPublisherSet,\r\n onPublisherAccountChanged,\r\n onPublisherChanged,\r\n Publisher,\r\n} from '../../@data';\r\nimport '../../@data/orchestrators';\r\nimport { isTythonSelfServeUser } from '../../@data/utils/checkUserType';\r\nimport { DEFAULT_PUBLISHER_CACHE_KEY } from '../../constants/AppConstants';\r\nimport { PublisherAccountPicker } from '../../layout/PublisherAccountPicker/PublisherAccountPicker';\r\nimport { defaultRoute, getAdManagementStore, RouteName } from './@data';\r\nimport { IAdManagementHeaderProps } from './AdManagement.types';\r\n\r\nexport const AdManagementHeader = observer(\r\n class AdManagementHeaderComponent extends React.Component<IAdManagementHeaderProps> {\r\n public componentDidMount() {\r\n if (!getAppStore().defaultPublisher && localStorage.getItem(DEFAULT_PUBLISHER_CACHE_KEY)) {\r\n onDefaultPublisherSet(Number(localStorage.getItem(DEFAULT_PUBLISHER_CACHE_KEY)));\r\n }\r\n const defaultPublisherId = getAppStore().defaultPublisher;\r\n const publisherId = [3000, 3001, 3002, 3003, 3004, 0].includes(defaultPublisherId === undefined ? 0 : defaultPublisherId)\r\n ? (this.props.match.params.publisherId as string)\r\n : String(defaultPublisherId);\r\n const accountId = this.props.match.params.accountId as string;\r\n\r\n onPublisherAccountChanged(publisherId, accountId, this.props.history);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const appStore = getAppStore();\r\n const { accessiblePublishers, defaultPublisher } = appStore;\r\n const { doNotRenderDefaultPage } = getAdManagementStore();\r\n\r\n /** We don't want to render Publisher account picker for tython flows.\r\n * Rendering AdmanagementHeader on the page helps to set the publisher/account context properly,\r\n * so that entity grids can be loaded and all actions are allowed based on user permissions.\r\n * Currently Tython flows and all the create/edit forms depend on the respective header components to set required context.\r\n * Ideally we should not depend on the side-effect of the component, so we can consider separating out the logic\r\n * in the componentDidMount and render AdManagementHeader whenever PublisherAccountPicker is required.\r\n *\r\n * If publisher id in appStore is not equal to defaultPublisher, it might lead to user unauthorized error\r\n */\r\n const publisherId = defaultPublisher && [3000, 3001, 3002, 3003, 3004, 0].includes(defaultPublisher) ? undefined : defaultPublisher;\r\n if (doNotRenderDefaultPage || (publisherId && appStore.publisher?.id !== publisherId) || isTythonSelfServeUser()) {\r\n return nullRender();\r\n }\r\n\r\n return (\r\n <PublisherAccountPicker\r\n {...this.props}\r\n onChange={this._onPublisherAccountChanged}\r\n publisher={appStore.publisher}\r\n account={appStore.account}\r\n isAccountHidden={this.props.isAccountHidden}\r\n isPublisherSelectionDisabled={accessiblePublishers && accessiblePublishers.length === 1}\r\n />\r\n );\r\n }\r\n\r\n private _onPublisherAccountChanged = (publisher?: Publisher, account?: Account) => {\r\n const store = getAdManagementStore();\r\n const currentRoute = RouteName[store.currentRoute || defaultRoute];\r\n\r\n if (publisher && account) {\r\n if (\r\n currentRoute === RouteName[RouteName.property] ||\r\n currentRoute === RouteName[RouteName.adquality] ||\r\n currentRoute === RouteName[RouteName.auditHistory] ||\r\n (currentRoute === RouteName[RouteName.adunit] && account.id === 0)\r\n ) {\r\n this.props.history.push(`/ad-management/${publisher.id}/${currentRoute}`);\r\n } else {\r\n this.props.history.push(`/ad-management/${publisher.id}-${account.id}/${currentRoute}`);\r\n }\r\n } else if (publisher) {\r\n this.props.history.push(`/ad-management/${publisher.id}/${currentRoute}`);\r\n } else {\r\n this.props.history.push(`/ad-management/${currentRoute}`);\r\n }\r\n\r\n onPublisherChanged(publisher);\r\n onAccountChanged(account);\r\n };\r\n }\r\n);\r\n","import { action } from 'satcheljs';\r\nimport { IFilterDetails } from '../../../../../components/GridFilter/GridFilter.types';\r\nimport { DownloadOption } from '../../../../../layout/GridPageV2';\r\n\r\nexport const onAuditHistoryPageInitialized = action('onAuditHistoryPageInitialized');\r\n\r\nexport const updateFiltersAndFetchLogs = action('updateFiltersAndFetchLogs', (filterConditions: IFilterDetails[]) => ({\r\n filterConditions,\r\n}));\r\n\r\nexport const handleDownloadButtonClicked = action('handleDownloadButtonClicked', (downloadType: DownloadOption, formatMessage, locale) => ({\r\n downloadType,\r\n formatMessage,\r\n locale,\r\n}));\r\n","import { createStore } from 'satcheljs';\r\nimport { IAuditHistoryState } from './AuditHistoryState';\r\n\r\nexport const getAuditHistoryStore = createStore<IAuditHistoryState>('AuditHistoryState', {\r\n startDate: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000),\r\n endDate: new Date(),\r\n filters: [],\r\n entityTypes: [],\r\n auditTypes: [],\r\n userRoles: [],\r\n isDataLoading: false,\r\n data: [],\r\n isShowAllDetailsEnabled: false,\r\n});\r\n","import { mutatorAction } from 'satcheljs';\r\nimport { AuditHistoryRequestFilter, AuditLog, AuditType, UserRole } from '../../../../../@data';\r\nimport { ICustomCalenderDateRange } from '../../../../report/components/CustomCalender/CustomCalender.types';\r\nimport { getAuditHistoryStore } from '../store/store';\r\n\r\nexport const onSelectedDatesChanged = mutatorAction('onSelectedDatesChanged', (dateRange: ICustomCalenderDateRange) => {\r\n dateRange.endDate.setDate(dateRange.endDate.getDate() + 1);\r\n\r\n getAuditHistoryStore().startDate = dateRange.startDate;\r\n getAuditHistoryStore().endDate = dateRange.endDate;\r\n getAuditHistoryStore().pageNumber = 1;\r\n});\r\n\r\nexport const setShowAllDetails = mutatorAction('setShowAllDetails', (showDetails: boolean) => {\r\n getAuditHistoryStore().isShowAllDetailsEnabled = showDetails;\r\n});\r\n\r\nexport const setAuditLogs = mutatorAction('setAuditLogs', (auditLogs: AuditLog[]) => {\r\n getAuditHistoryStore().data = auditLogs;\r\n});\r\n\r\nexport const setTotalPages = mutatorAction('setTotalPages', (totalPages: number) => {\r\n getAuditHistoryStore().totalPages = totalPages;\r\n});\r\n\r\nexport const setTotalRecords = mutatorAction('setTotalRecords', (totalRecords: number) => {\r\n getAuditHistoryStore().totalRecords = totalRecords;\r\n});\r\n\r\nexport const setPageNumber = mutatorAction('setPageNumber', (pageNumber: number) => {\r\n getAuditHistoryStore().pageNumber = pageNumber;\r\n});\r\n\r\nexport const setPageSize = mutatorAction('setPageSize', (pageSize: number) => {\r\n getAuditHistoryStore().pageSize = pageSize;\r\n});\r\n\r\nexport const setFilters = mutatorAction('setFilters', (filters: AuditHistoryRequestFilter[]) => {\r\n getAuditHistoryStore().filters = filters;\r\n});\r\n\r\nexport const setEntityTypes = mutatorAction('setEntityTypes', (entityTypes: string[]) => {\r\n getAuditHistoryStore().entityTypes = entityTypes;\r\n});\r\n\r\nexport const setAuditTypes = mutatorAction('setAuditTypes', (auditTypes: AuditType[]) => {\r\n getAuditHistoryStore().auditTypes = auditTypes;\r\n});\r\n\r\nexport const setUserRoles = mutatorAction('setUserRoles', (userRoles: UserRole[]) => {\r\n getAuditHistoryStore().userRoles = userRoles;\r\n});\r\n\r\nexport const setIsDataLoading = mutatorAction('setIsDataLoading', (isDataLoading: boolean) => {\r\n getAuditHistoryStore().isDataLoading = isDataLoading;\r\n});\r\n\r\nexport const resetFilters = mutatorAction('resetFilters', () => {\r\n const store = getAuditHistoryStore();\r\n store.filters = [];\r\n store.entityTypes = [];\r\n store.auditTypes = [];\r\n store.userRoles = [];\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n auditHistory: {\r\n id: 'auditHistory',\r\n defaultMessage: 'Audit history',\r\n },\r\n dateTime: {\r\n id: 'auditHistory.dateTime',\r\n defaultMessage: 'Date/Time (UTC)',\r\n },\r\n userEmail: {\r\n id: 'auditHistory.userEmail',\r\n defaultMessage: 'User email',\r\n },\r\n userRole: {\r\n id: 'auditHistory.userRole',\r\n defaultMessage: 'User role',\r\n },\r\n actionType: {\r\n id: 'auditHistory.actionType',\r\n defaultMessage: 'Action type',\r\n },\r\n actionOn: {\r\n id: 'auditHistory.actionOn',\r\n defaultMessage: 'Entity',\r\n },\r\n actionDetails: {\r\n id: 'auditHistory.actionDetails',\r\n defaultMessage: 'Action details',\r\n },\r\n showAll: {\r\n id: 'auditHistory.showAll',\r\n defaultMessage: 'Show all details',\r\n },\r\n hideAll: {\r\n id: 'auditHistory.hideAll',\r\n defaultMessage: 'Hide all details',\r\n },\r\n showDetails: {\r\n id: 'auditHistory.showDetails',\r\n defaultMessage: 'Show details',\r\n },\r\n hideDetails: {\r\n id: 'auditHistory.hideDetails',\r\n defaultMessage: 'Hide details',\r\n },\r\n create: {\r\n id: 'auditHistory.create',\r\n defaultMessage: 'Create',\r\n },\r\n update: {\r\n id: 'auditHistory.update',\r\n defaultMessage: 'Update',\r\n },\r\n delete: {\r\n id: 'auditHistory.delete',\r\n defaultMessage: 'Delete',\r\n },\r\n export: {\r\n id: 'auditHistory.export',\r\n defaultMessage: 'Export',\r\n },\r\n download: {\r\n id: 'auditHistory.download',\r\n defaultMessage: 'Download',\r\n },\r\n invite: {\r\n id: 'auditHistory.invite',\r\n defaultMessage: 'Invite',\r\n },\r\n inviteAccept: {\r\n id: 'auditHistory.inviteAccept',\r\n defaultMessage: 'Invite accept',\r\n },\r\n report: {\r\n id: 'auditHistory.report',\r\n defaultMessage: 'Report',\r\n },\r\n payment: {\r\n id: 'auditHistory.payment',\r\n defaultMessage: 'Payment',\r\n },\r\n adunit: {\r\n id: 'auditHistory.adunit',\r\n defaultMessage: 'Ad Unit',\r\n },\r\n user: {\r\n id: 'auditHistory.user',\r\n defaultMessage: 'User',\r\n },\r\n noAuditsFound: {\r\n id: 'auditHistory.noAuditsFound',\r\n defaultMessage: 'No logs found',\r\n },\r\n noPublisherSelected: {\r\n id: 'auditHistory.noPublisherSelected',\r\n defaultMessage: `A publisher isn't selected yet. To see logs, search for a publisher..`,\r\n },\r\n apiCallFailedNotification: {\r\n id: 'auditHistory.apiCallFailedNotification',\r\n defaultMessage: 'Failed to fetch audit history',\r\n },\r\n startingDownloadNotification: {\r\n id: 'auditHistory.startingDownloadNotification',\r\n defaultMessage: 'Fetching all data and starting download',\r\n },\r\n});\r\n","import { Log } from '../../../../../../logging/src';\r\nimport {\r\n AuditHistoryRequest,\r\n buildRequestHeadersWithAuthToken,\r\n getAppStore,\r\n handleApiErrors,\r\n showErrorToastNotification,\r\n} from '../../../../../@data';\r\nimport { uiConfig } from '../../../../../config/ui.config';\r\nimport AuditHistoryMessages from '../../AuditHistory.messages';\r\nimport { setIsDataLoading } from '../actions';\r\nimport { getAuditHistoryStore } from '../store/store';\r\n\r\nexport async function fetchAuditLogs(pageSize?: number, shouldUpdateGrid = true) {\r\n const { publisher, userContext } = getAppStore();\r\n\r\n if (publisher && userContext) {\r\n const url = generateAuditHistoryUrl(publisher.id, pageSize);\r\n const headers = await buildRequestHeadersWithAuthToken(url, userContext);\r\n\r\n let response: Response;\r\n\r\n const auditHistoryStore = getAuditHistoryStore();\r\n const { startDate, endDate, filters, entityTypes, userRoles, auditTypes } = auditHistoryStore;\r\n\r\n // rounding off to last minute to avoid int overflow\r\n startDate.setMinutes(startDate.getHours(), startDate.getMinutes(), 0);\r\n endDate.setUTCMinutes(endDate.getHours(), endDate.getMinutes(), 0);\r\n\r\n const auditHistoryRequest: AuditHistoryRequest = {\r\n startDateTime: startDate,\r\n endDateTime: endDate,\r\n auditTypes: auditTypes,\r\n userRoles: userRoles,\r\n entityTypes: entityTypes,\r\n filters: filters,\r\n };\r\n\r\n try {\r\n if (shouldUpdateGrid) {\r\n setIsDataLoading(true);\r\n }\r\n\r\n response = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: JSON.stringify(auditHistoryRequest),\r\n });\r\n\r\n if (!response.ok) {\r\n await handleApiErrors(response, url);\r\n }\r\n\r\n const responseJson = (await response.json()).data;\r\n return responseJson;\r\n } catch (err) {\r\n const error = `Failed to fetch audit history ${url}. Errors: ${err}`;\r\n Log.error(error);\r\n showErrorToastNotification({ textMessageDescriptor: AuditHistoryMessages.apiCallFailedNotification });\r\n } finally {\r\n setIsDataLoading(false);\r\n }\r\n }\r\n}\r\n\r\nfunction generateAuditHistoryUrl(publisherId: string, inputPageSize?: number): string {\r\n const url = uiConfig.getApiBaseAddress() + '/publishers/' + publisherId + '/changelogs/fetch';\r\n\r\n const { pageNumber, pageSize } = getAuditHistoryStore();\r\n const queryString = `PageSize=${inputPageSize ?? pageSize ?? 10}&PageNumber=${pageNumber ?? 1}`;\r\n\r\n return `${url}?${queryString}`;\r\n}\r\n","import { orchestrator } from 'satcheljs';\r\nimport { setAuditLogs, setPageSize, setTotalPages, setTotalRecords } from '../actions';\r\nimport { onAuditHistoryPageInitialized } from '../actions/actions';\r\nimport { fetchAuditLogs } from '../services/fetchAuditLogs';\r\n\r\norchestrator(onAuditHistoryPageInitialized, async () => {\r\n const responseJson = await fetchAuditLogs();\r\n\r\n if (responseJson) {\r\n const { changeLogs, pageSize, totalPages, totalRecords } = responseJson;\r\n\r\n setPageSize(pageSize);\r\n setTotalPages(totalPages);\r\n setTotalRecords(totalRecords);\r\n setAuditLogs(changeLogs);\r\n } else {\r\n // resetting data in case publisher or user context is null or API failure\r\n setPageSize(10);\r\n setTotalPages(0);\r\n setTotalRecords(0);\r\n setAuditLogs([]);\r\n }\r\n});\r\n","import AppMessages from '../../../../App.messages';\r\nimport messages from '../AuditHistory.messages';\r\n\r\nexport function getAdUnitTypes(value?: string) {\r\n const adUnitTypes: string[] = [];\r\n\r\n if (value) {\r\n if (value.includes('Display')) {\r\n adUnitTypes.push('Display');\r\n }\r\n if (value.includes('Native')) {\r\n adUnitTypes.push('Native');\r\n }\r\n }\r\n return adUnitTypes.join(', ');\r\n}\r\n\r\nexport function getLifeCycleStatusIdValue(value?: string) {\r\n if (value && value.includes('111')) {\r\n return 'Active';\r\n } else if (value && value.includes('112')) {\r\n return 'Inactive';\r\n }\r\n return '';\r\n}\r\n\r\nexport function getAddedRemovedCount(value?: string) {\r\n if (!value) {\r\n return [0, 0];\r\n }\r\n let addCount = 0,\r\n removeCount = 0;\r\n\r\n let messageParts = value.split(',');\r\n if (messageParts.length > 1) {\r\n messageParts = messageParts[0].split(' ').concat(messageParts[1].split(' '));\r\n } else {\r\n messageParts = value.split(' ');\r\n }\r\n\r\n if (value.includes('Added')) {\r\n addCount = Number(messageParts[1]);\r\n }\r\n if (value.includes('Removed') && messageParts.length === 2) {\r\n removeCount = Number(messageParts[1]);\r\n } else if (value.includes('Removed') && messageParts.length > 3) {\r\n removeCount = Number(messageParts[messageParts.length - 1]);\r\n }\r\n\r\n return [addCount, removeCount];\r\n}\r\n\r\nexport const getEntityTypeDisplayMap = (entityType: string, formatMessage): string => {\r\n switch (entityType.toLowerCase()) {\r\n case 'adunit':\r\n return formatMessage(messages.adunit);\r\n case 'property':\r\n return formatMessage(AppMessages.site);\r\n case 'user':\r\n return formatMessage(messages.user);\r\n case 'publisher':\r\n return formatMessage(AppMessages.publisher);\r\n case 'payment':\r\n return formatMessage(messages.payment);\r\n case 'report':\r\n return formatMessage(messages.report);\r\n default:\r\n return '';\r\n }\r\n};\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n Failed: {\r\n id: 'auditHistory.Failed',\r\n defaultMessage: 'failed',\r\n },\r\n Settled: {\r\n id: 'auditHistory.Settled',\r\n defaultMessage: 'settled',\r\n },\r\n Processing: {\r\n id: 'auditHistory.Processing',\r\n defaultMessage: 'processing',\r\n },\r\n TransactionTitle: {\r\n id: 'auditHistory.TransactionTitle',\r\n defaultMessage: 'Transaction {status}',\r\n },\r\n TransactionMessage: {\r\n id: 'auditHistory.TransactionMessage',\r\n defaultMessage: 'Transaction of {n} USD {status}',\r\n },\r\n AdBlockCategories: {\r\n id: 'auditHistory.AdBlockCategories',\r\n defaultMessage: 'ad category block',\r\n },\r\n AdBlockCategoriesPlural: {\r\n id: 'auditHistory.AdBlockCategories',\r\n defaultMessage: 'ad category blocks',\r\n },\r\n UniversalAdBlockCategories: {\r\n id: 'auditHistory.UniversalAdBlockCategories',\r\n defaultMessage: 'universal category block',\r\n },\r\n UniversalAdBlockCategoriesPlural: {\r\n id: 'auditHistory.UniversalAdBlockCategories',\r\n defaultMessage: 'universal category blocks',\r\n },\r\n UniversalAdBlockStatus: {\r\n id: 'auditHistory.UniversalAdBlockStatus',\r\n defaultMessage: 'Universal ad block status',\r\n },\r\n PaymentAccountStatus: {\r\n id: 'auditHistory.PaymentAccountStatus',\r\n defaultMessage: 'Payment account status',\r\n },\r\n AdblocksUpdated: {\r\n id: 'auditHistory.AdblocksUpdated',\r\n defaultMessage: 'Ad blocks updated',\r\n },\r\n AdBlockStatusEnabled: {\r\n id: 'auditHistory.AdBlockStatusEnabled',\r\n defaultMessage: 'Ad block status enabled',\r\n },\r\n AdBlockStatusDisabled: {\r\n id: 'auditHistory.AdBlockStatusDisabled',\r\n defaultMessage: 'Ad block status disabled',\r\n },\r\n ClarityProjectID: {\r\n id: 'auditHistory.ClarityProjectID',\r\n defaultMessage: 'Clarity project ID {id} added ',\r\n },\r\n ServingStatus: {\r\n id: 'auditHistory.ServingStatus',\r\n defaultMessage: 'Serving status',\r\n },\r\n ClarityStatus: {\r\n id: 'auditHistory.ClarityStatus',\r\n defaultMessage: 'Clarity project link is Approved',\r\n },\r\n PropertyName: {\r\n id: 'auditHistory.PropertyName',\r\n defaultMessage: 'Site name',\r\n },\r\n created: {\r\n id: 'auditHistory.created',\r\n defaultMessage: 'Created',\r\n },\r\n deleted: {\r\n id: 'auditHistory.deleted',\r\n defaultMessage: 'Deleted',\r\n },\r\n updated: {\r\n id: 'auditHistory.updated',\r\n defaultMessage: 'Updated',\r\n },\r\n updatedSmallCase: {\r\n id: 'auditHistory.updatedSmallCase',\r\n defaultMessage: 'updated',\r\n },\r\n changed: {\r\n id: 'auditHistory.changed',\r\n defaultMessage: 'changed',\r\n },\r\n exported: {\r\n id: 'auditHistory.exported',\r\n defaultMessage: 'Exported',\r\n },\r\n details: {\r\n id: 'auditHistory.details',\r\n defaultMessage: 'details',\r\n },\r\n downloaded: {\r\n id: 'auditHistory.downloaded',\r\n defaultMessage: 'Downloaded',\r\n },\r\n notificationPreferencesTitle: {\r\n id: 'auditHistory.notificationPreferencesTitle',\r\n defaultMessage: 'Notification preferences updated',\r\n },\r\n ServingStatusNotification: {\r\n id: 'auditHistory.ServingStatusNotification',\r\n defaultMessage: 'Serving status notifications are {status}',\r\n },\r\n BillingAlertNotification: {\r\n id: 'auditHistory.BillingAlertNotification',\r\n defaultMessage: 'Billing alert notifications are {status}',\r\n },\r\n InvitedUserNotification: {\r\n id: 'auditHistory.InvitedUserNotification',\r\n defaultMessage: 'User invite notifications are {status}',\r\n },\r\n ProfileReviewNotification: {\r\n id: 'auditHistory.ProfileReviewNotification',\r\n defaultMessage: 'Profile review notifications are {status}',\r\n },\r\n BackgroundColor: {\r\n id: 'BackgroundColor',\r\n defaultMessage: 'Background color',\r\n },\r\n ButtonBackgroundColor: {\r\n id: 'BackgroundColor',\r\n defaultMessage: 'Button background color',\r\n },\r\n AdUnitTypes: {\r\n id: 'AdUnitTypes',\r\n defaultMessage: 'Ad unit type',\r\n },\r\n TitleColor: {\r\n id: 'TitleColor',\r\n defaultMessage: 'Title color',\r\n },\r\n Font: {\r\n id: 'Font',\r\n defaultMessage: 'Font',\r\n },\r\n addedAs: {\r\n id: 'auditHistory.addedAs',\r\n defaultMessage: '{attributeChanged} added as {newValue}',\r\n },\r\n selectedAs: {\r\n id: 'auditHistory.selectdAs',\r\n defaultMessage: '{attributeChanged} selected as {newValue}',\r\n },\r\n updatedMessageFormat: {\r\n id: 'auditHistory.updatedMessageFormat',\r\n defaultMessage: '{attributeChanged} changed from {oldValue} to {newValue}',\r\n },\r\n LifeCycleStatusID: {\r\n id: 'auditHistory.LifeCycleStatusID',\r\n defaultMessage: 'Serving status',\r\n },\r\n nameChangedTo: {\r\n id: 'auditHistory.nameChangedTo',\r\n defaultMessage: '{oldValue} name changed to {newValue}',\r\n },\r\n added: {\r\n id: 'auditHistory.added',\r\n defaultMessage: 'added',\r\n },\r\n removed: {\r\n id: 'auditHistory.removed',\r\n defaultMessage: 'removed',\r\n },\r\n});\r\n","import { AuditLog } from '../../../../@data';\r\nimport messages from '../ActionDetails.messages';\r\nimport AuditHistoryMessages from '../AuditHistory.messages';\r\nimport { ActionDetail } from './getActionDetails';\r\n\r\nexport function getActionDetailsForPayment(actionDetail: ActionDetail, auditLog: AuditLog, formatMessage) {\r\n if (auditLog.changes) {\r\n actionDetail.changes = auditLog.changes.map((change) => {\r\n if (change.log) {\r\n if (change.attributeChanged === 'Transaction') {\r\n const [status, amount] = getTransactionStatusAndAmount(change.log, formatMessage);\r\n return formatMessage(messages.TransactionMessage, { n: amount, status: status });\r\n }\r\n }\r\n\r\n if (!change.oldValue && change.newValue) {\r\n return `${formatMessage(messages.addedAs, {\r\n attributeChanged: formatMessage(messages.PaymentAccountStatus),\r\n newValue: change.newValue,\r\n })}`;\r\n }\r\n\r\n if (change.oldValue && change.newValue) {\r\n return `${formatMessage(messages.updatedMessageFormat, {\r\n attributeChanged: formatMessage(messages.PaymentAccountStatus),\r\n oldValue: change.oldValue,\r\n newValue: change.newValue,\r\n })}`;\r\n }\r\n return '';\r\n });\r\n }\r\n if (actionDetail.changes && actionDetail.changes.length === 1) {\r\n actionDetail.title = actionDetail.changes[0];\r\n actionDetail.changes = [];\r\n } else {\r\n actionDetail.title = `${formatMessage(messages.updated)} ${formatMessage(AuditHistoryMessages.payment)} ${formatMessage(\r\n messages.details\r\n )}`;\r\n }\r\n}\r\n\r\nfunction getTransactionStatusAndAmount(message: string, formatMessage) {\r\n let status = '',\r\n amount = 0;\r\n message = message.toLowerCase();\r\n\r\n if (message.includes('failed')) {\r\n status = formatMessage(messages.Failed);\r\n } else if (message.includes('settled')) {\r\n status = formatMessage(messages.Settled);\r\n } else if (message.includes('processing')) {\r\n status = formatMessage(messages.Processing);\r\n }\r\n\r\n const transactionMessageParts = message.split(' ');\r\n if (transactionMessageParts.length > 2) {\r\n amount = Number(transactionMessageParts[1]);\r\n }\r\n\r\n return [status, amount];\r\n}\r\n","import { AuditLog, AuditType } from '../../../../@data';\r\nimport ActionDetailsMessages from '../ActionDetails.messages';\r\nimport { getEntityTypeDisplayMap } from './convertAttributeValues';\r\nimport { getActionDetailsForAdunit } from './getAdUnitActionDetails';\r\nimport { getActionDetailsForPayment } from './getPaymentActionDetails';\r\nimport { getActionDetailsForProperty } from './getPropertyActionDetails';\r\nimport { getActionDetailsForPublisher } from './getPublisherActionDetails';\r\nimport { getActionDetailsForUser } from './getUserActionDetails';\r\n\r\nexport class ActionDetail {\r\n public title: string;\r\n public changes: string[];\r\n}\r\n\r\nexport function getActionDetails(auditLog: AuditLog, formatMessage): ActionDetail {\r\n const actionDetail = new ActionDetail();\r\n\r\n actionDetail.title = `${auditLog.entityName ?? ''} ${auditLog.entityId ?? ''} `;\r\n\r\n switch (auditLog.auditType) {\r\n case AuditType.CREATE:\r\n actionDetail.title = `${formatMessage(ActionDetailsMessages.created)} ${\r\n auditLog.entityName ? auditLog.entityName : getEntityTypeDisplayMap(auditLog.entityType, formatMessage)\r\n }`;\r\n break;\r\n case AuditType.DELETE:\r\n actionDetail.title = `${formatMessage(ActionDetailsMessages.deleted)} ${auditLog.entityName}`;\r\n break;\r\n case AuditType.EXPORT:\r\n actionDetail.title = `${formatMessage(ActionDetailsMessages.exported)} ${getEntityTypeDisplayMap(\r\n auditLog.entityType,\r\n formatMessage\r\n )} ${formatMessage(ActionDetailsMessages.details)}`;\r\n break;\r\n case AuditType.DOWNLOAD:\r\n actionDetail.title = `${formatMessage(ActionDetailsMessages.downloaded)} ${getEntityTypeDisplayMap(\r\n auditLog.entityType,\r\n formatMessage\r\n )} ${formatMessage(ActionDetailsMessages.details)}`;\r\n break;\r\n case AuditType.INVITE: {\r\n actionDetail.title = `${auditLog.userEmail} invited `;\r\n const invitedUserEmail = auditLog.changes?.find((change) => change.attributeChanged === 'Email')?.newValue;\r\n const invitedUserRole = auditLog.changes?.find((change) => change.attributeChanged === 'UserRole')?.newValue;\r\n if (invitedUserEmail) {\r\n actionDetail.title += ` ${invitedUserEmail}${invitedUserRole ? ` as ${invitedUserRole}` : ''}}`;\r\n } else if (invitedUserRole) {\r\n actionDetail.title += `${invitedUserRole}`;\r\n } else {\r\n actionDetail.title += 'new user';\r\n }\r\n break;\r\n }\r\n case AuditType.INVITE_ACCEPT:\r\n actionDetail.title = `${auditLog.userEmail} accepted the invitation}`;\r\n break;\r\n case AuditType.UPDATE:\r\n updateActionDetailsForUpdate(actionDetail, auditLog, formatMessage);\r\n break;\r\n\r\n default:\r\n actionDetail.title += formatMessage(ActionDetailsMessages.updated);\r\n break;\r\n }\r\n\r\n return actionDetail;\r\n}\r\n\r\nfunction updateActionDetailsForUpdate(actionDetail: ActionDetail, auditLog: AuditLog, formatMessage) {\r\n switch (auditLog.entityType) {\r\n case 'AdUnit':\r\n getActionDetailsForAdunit(actionDetail, auditLog, formatMessage);\r\n break;\r\n case 'Property':\r\n getActionDetailsForProperty(actionDetail, auditLog, formatMessage);\r\n break;\r\n case 'User':\r\n getActionDetailsForUser(actionDetail, auditLog, formatMessage);\r\n break;\r\n case 'Payment':\r\n getActionDetailsForPayment(actionDetail, auditLog, formatMessage);\r\n break;\r\n case 'Publisher':\r\n getActionDetailsForPublisher(actionDetail, auditLog, formatMessage);\r\n break;\r\n default:\r\n actionDetail.title = `${auditLog.entityType} ${formatMessage(ActionDetailsMessages.updated)}`;\r\n break;\r\n }\r\n}\r\n","import { AuditLog, ServingStatusMap } from '../../../../@data';\r\nimport AppMessages from '../../../../App.messages';\r\nimport ActionDetailsMessages from '../ActionDetails.messages';\r\nimport { getAdUnitTypes, getLifeCycleStatusIdValue } from './convertAttributeValues';\r\nimport { ActionDetail } from './getActionDetails';\r\n\r\nexport function getActionDetailsForAdunit(actionDetail: ActionDetail, auditLog: AuditLog, formatMessage) {\r\n actionDetail.title = `${formatMessage(ActionDetailsMessages.updated)} ${auditLog.entityName}`;\r\n\r\n if (auditLog.changes) {\r\n actionDetail.changes = auditLog.changes.map((change) => {\r\n let actionDetailMessage = '';\r\n let attributeChanged = change.attributeChanged;\r\n if (\r\n ['AdUnitTypes', 'LifeCycleStatusID', 'Font', 'ServingStatus', 'BackgroundColor', 'ButtonBackgroundColor', 'TitleColor'].includes(\r\n change.attributeChanged\r\n )\r\n ) {\r\n attributeChanged = formatMessage(ActionDetailsMessages[change.attributeChanged]);\r\n }\r\n\r\n if (change.attributeChanged === 'AdUnitTypes') {\r\n if (change.newValue && !change.oldValue) {\r\n actionDetailMessage = `${formatMessage(ActionDetailsMessages.selectedAs, {\r\n attributeChanged: attributeChanged,\r\n newValue: getAdUnitTypes(change.newValue),\r\n })}`;\r\n } else if (change.newValue && change.oldValue) {\r\n actionDetailMessage = formatMessage(ActionDetailsMessages.updatedMessageFormat, {\r\n attributeChanged: attributeChanged,\r\n oldValue: getAdUnitTypes(change.oldValue),\r\n newValue: getAdUnitTypes(change.newValue),\r\n });\r\n }\r\n } else if (change.attributeChanged === 'AdUnitName') {\r\n actionDetailMessage = `${formatMessage(ActionDetailsMessages.nameChangedTo, {\r\n oldValue: change.oldValue,\r\n newValue: change.newValue,\r\n })}`;\r\n } else if (change.attributeChanged === 'LifeCycleStatusID') {\r\n actionDetailMessage = `${formatMessage(ActionDetailsMessages.updatedMessageFormat, {\r\n attributeChanged: attributeChanged,\r\n oldValue: formatMessage(\r\n getLifeCycleStatusIdValue(change.oldValue) === 'Active' ? AppMessages.statusActive : AppMessages.statusInactive\r\n ),\r\n newValue: formatMessage(\r\n getLifeCycleStatusIdValue(change.newValue) === 'Active' ? AppMessages.statusActive : AppMessages.statusInactive\r\n ),\r\n })}`;\r\n } else if (change.attributeChanged === 'ServingStatus') {\r\n actionDetailMessage = `${formatMessage(ActionDetailsMessages.updatedMessageFormat, {\r\n attributeChanged: attributeChanged,\r\n oldValue: ServingStatusMap[Number(change.oldValue)],\r\n newValue: ServingStatusMap[Number(change.newValue)],\r\n })}`;\r\n } else {\r\n if (change.newValue && !change.oldValue) {\r\n actionDetailMessage = `${formatMessage(ActionDetailsMessages.addedAs, {\r\n attributeChanged: attributeChanged,\r\n newValue: change.newValue,\r\n })}`;\r\n } else if (change.newValue && change.oldValue) {\r\n actionDetailMessage = formatMessage(ActionDetailsMessages.updatedMessageFormat, {\r\n attributeChanged: attributeChanged,\r\n oldValue: change.oldValue,\r\n newValue: change.newValue,\r\n });\r\n }\r\n }\r\n\r\n return actionDetailMessage;\r\n });\r\n }\r\n}\r\n","import { AuditLog, ServingStatusLabel } from '../../../../@data';\r\nimport adManagementMessages from '../../AdManagement.messages';\r\nimport messages from '../ActionDetails.messages';\r\nimport { getAddedRemovedCount } from './convertAttributeValues';\r\nimport { ActionDetail } from './getActionDetails';\r\n\r\nexport function getActionDetailsForProperty(actionDetail: ActionDetail, auditLog: AuditLog, formatMessage) {\r\n actionDetail.title = `${formatMessage(messages.updated)} ${auditLog.entityName}`;\r\n const adblockMessages: string[] = [];\r\n\r\n if (auditLog.changes) {\r\n actionDetail.changes = [];\r\n actionDetail.changes = auditLog.changes.map((change) => {\r\n if (change.attributeChanged === 'ServingStatus') {\r\n if (change.newValue && !change.oldValue) {\r\n return `${formatMessage(messages.ServingStatus)} ${formatMessage(adManagementMessages[ServingStatusLabel[change.newValue]])}`;\r\n } else if (change.newValue && change.oldValue) {\r\n return formatMessage(messages.updatedMessageFormat, {\r\n attributeChanged: formatMessage(messages.ServingStatus),\r\n oldValue: change.oldValue,\r\n newValue: change.newValue,\r\n });\r\n }\r\n }\r\n if (change.attributeChanged === 'ClarityStatus' && change.newValue?.includes('Approved')) {\r\n return formatMessage(messages.ClarityStatus);\r\n }\r\n if (change.attributeChanged === 'ClarityProjectID' && change.newValue) {\r\n return formatMessage(messages.ClarityProjectID, { id: change.newValue });\r\n }\r\n if (change.attributeChanged === 'AdBlockStatus' && change.newValue) {\r\n return change.newValue.includes('true')\r\n ? formatMessage(messages.AdBlockStatusEnabled)\r\n : formatMessage(messages.AdBlockStatusDisabled);\r\n }\r\n if (change.attributeChanged === 'PropertyName') {\r\n if (change.newValue && change.oldValue) {\r\n return formatMessage(messages.updatedMessageFormat, {\r\n attributeChanged: formatMessage(messages.PropertyName),\r\n oldValue: change.oldValue,\r\n newValue: change.newValue,\r\n });\r\n }\r\n }\r\n\r\n if (change.log) {\r\n actionDetail.title = formatMessage(messages.AdblocksUpdated);\r\n const [addCount, removeCount] = getAddedRemovedCount(change.log);\r\n if (!isNaN(addCount) && addCount > 0) {\r\n adblockMessages.push(\r\n `${addCount} ${formatMessage(addCount > 1 ? messages.AdBlockCategoriesPlural : messages.AdBlockCategories)} ${formatMessage(\r\n messages.added\r\n )}`\r\n );\r\n }\r\n if (!isNaN(removeCount) && removeCount > 0) {\r\n adblockMessages.push(\r\n `${removeCount} ${formatMessage(\r\n removeCount > 1 ? messages.AdBlockCategoriesPlural : messages.AdBlockCategories\r\n )} ${formatMessage(messages.removed)}`\r\n );\r\n }\r\n }\r\n\r\n return '';\r\n });\r\n actionDetail.changes.push(...adblockMessages);\r\n }\r\n}\r\n","import { AuditLog } from '../../../../@data';\r\nimport ActionDetailsMessages from '../ActionDetails.messages';\r\nimport { ActionDetail } from './getActionDetails';\r\n\r\nexport function getActionDetailsForUser(actionDetail: ActionDetail, auditLog: AuditLog, formatMessage) {\r\n actionDetail.title = formatMessage(ActionDetailsMessages.notificationPreferencesTitle);\r\n // Update it to \"Updated user details\" in case there are other attributes updated\r\n\r\n if (auditLog.changes) {\r\n actionDetail.changes = auditLog.changes.map((change) => {\r\n if (change.log) {\r\n switch (change.attributeChanged) {\r\n case 'ServingStatusNotification':\r\n return `${formatMessage(ActionDetailsMessages.ServingStatusNotification, { status: change.log })}`;\r\n case 'BillingAlertNotification':\r\n return `${formatMessage(ActionDetailsMessages.BillingAlertNotification, { status: change.log })}`;\r\n case 'InvitedUserNotification':\r\n return `${formatMessage(ActionDetailsMessages.InvitedUserNotification, { status: change.log })}`;\r\n case 'ProfileReviewNotification':\r\n return `${formatMessage(ActionDetailsMessages.ProfileReviewNotification, { status: change.log })}`;\r\n }\r\n }\r\n if (change.attributeChanged) {\r\n return `${formatMessage(ActionDetailsMessages.updated)} ${change.attributeChanged}`;\r\n }\r\n\r\n return '';\r\n });\r\n }\r\n}\r\n","import { AuditLog } from '../../../../@data';\r\nimport AppMessages from '../../../../App.messages';\r\nimport messages from '../ActionDetails.messages';\r\nimport { getAddedRemovedCount } from './convertAttributeValues';\r\nimport { ActionDetail } from './getActionDetails';\r\n\r\nexport function getActionDetailsForPublisher(actionDetail: ActionDetail, auditLog: AuditLog, formatMessage) {\r\n actionDetail.title = `${formatMessage(messages.updated)} ${formatMessage(AppMessages.publisher)} ${formatMessage(messages.details)}`;\r\n const adblockMessages: string[] = [];\r\n\r\n if (auditLog.changes) {\r\n actionDetail.changes = [];\r\n actionDetail.changes = auditLog.changes.map((change) => {\r\n let attributeChanged = change.attributeChanged;\r\n if (['ServingStatus', 'UniversalAdBlockStatus'].includes(attributeChanged)) {\r\n attributeChanged = formatMessage(messages[attributeChanged]);\r\n }\r\n\r\n if (change.log) {\r\n actionDetail.title = formatMessage(messages.notificationPreferencesTitle);\r\n switch (change.attributeChanged) {\r\n case 'ServingStatusNotification':\r\n return `${formatMessage(messages.ServingStatusNotification, { status: change.log })}`;\r\n case 'BillingAlertNotification':\r\n return `${formatMessage(messages.BillingAlertNotification, { status: change.log })}`;\r\n case 'InvitedUserNotification':\r\n return `${formatMessage(messages.InvitedUserNotification, { status: change.log })}`;\r\n case 'ProfileReviewNotification':\r\n return `${formatMessage(messages.ProfileReviewNotification, { status: change.log })}`;\r\n case 'UniversalAdBlockCategories': {\r\n actionDetail.title = formatMessage(messages.AdblocksUpdated);\r\n const [addCount, removeCount] = getAddedRemovedCount(change.log);\r\n if (!isNaN(addCount) && addCount > 0) {\r\n adblockMessages.push(\r\n `${addCount} ${formatMessage(\r\n addCount > 1 ? messages.UniversalAdBlockCategoriesPlural : messages.UniversalAdBlockCategories\r\n )} ${formatMessage(messages.added)}`\r\n );\r\n }\r\n if (!isNaN(removeCount) && removeCount > 0) {\r\n adblockMessages.push(\r\n `${removeCount} ${formatMessage(\r\n removeCount > 1 ? messages.UniversalAdBlockCategoriesPlural : messages.UniversalAdBlockCategories\r\n )} ${formatMessage(messages.removed)}`\r\n );\r\n }\r\n }\r\n }\r\n } else if (!change.oldValue && change.newValue) {\r\n return `${formatMessage(messages.addedAs, { attributeChanged: attributeChanged, newValue: change.newValue })}`;\r\n } else if (change.oldValue && !change.newValue) {\r\n return `${formatMessage(messages.removed)} ${attributeChanged}`;\r\n } else if (change.oldValue && change.newValue) {\r\n return `${formatMessage(messages.updatedMessageFormat, {\r\n attributeChanged: attributeChanged,\r\n oldValue: change.oldValue,\r\n newValue: change.newValue,\r\n })}`;\r\n }\r\n\r\n return '';\r\n });\r\n actionDetail.changes.push(...adblockMessages);\r\n }\r\n}\r\n","import { AuditType } from '../../../../@data';\r\nimport { FilterType } from '../../../../components/GridFilter/GridFilter.types';\r\nimport { IFilterItem } from '../../../../layout/GridPageV2';\r\nimport UserManagementMessages from '../../UserManagement/UserManagement.messages';\r\nimport messages from '../AuditHistory.messages';\r\nimport { getEntityTypeDisplayMap } from './convertAttributeValues';\r\n\r\nexport function getFilterItems(formatMessage): IFilterItem[] {\r\n const { superAdmin, accountManager, reportUser } = UserManagementMessages;\r\n\r\n return [\r\n {\r\n filterName: formatMessage(messages.userEmail),\r\n filterType: FilterType.string,\r\n columnName: 'userEmail',\r\n },\r\n {\r\n filterName: formatMessage(messages.userRole),\r\n filterType: FilterType.custom,\r\n columnName: 'userRole',\r\n filterOptions: [\r\n {\r\n key: 'SuperAdmin',\r\n text: formatMessage(superAdmin),\r\n },\r\n {\r\n key: 'AccountManager',\r\n text: formatMessage(accountManager),\r\n },\r\n {\r\n key: 'ReportUser',\r\n text: formatMessage(reportUser),\r\n },\r\n ],\r\n },\r\n {\r\n filterName: formatMessage(messages.actionType),\r\n filterType: FilterType.custom,\r\n columnName: 'actionType',\r\n filterOptions: [\r\n {\r\n key: AuditType.CREATE,\r\n text: formatMessage(messages.create),\r\n },\r\n {\r\n key: AuditType.UPDATE,\r\n text: formatMessage(messages.update),\r\n },\r\n {\r\n key: AuditType.DELETE,\r\n text: formatMessage(messages.delete),\r\n },\r\n // {\r\n // key: AuditType.INVITE,\r\n // text: formatMessage(messages.invite),\r\n // },\r\n // {\r\n // key: AuditType.INVITE_ACCEPT,\r\n // text: formatMessage(messages.inviteAccept),\r\n // },\r\n // {\r\n // key: AuditType.EXPORT,\r\n // text: formatMessage(messages.export),\r\n // },\r\n // {\r\n // key: AuditType.DOWNLOAD,\r\n // text: formatMessage(messages.download),\r\n // },\r\n ],\r\n },\r\n {\r\n filterName: formatMessage(messages.actionOn),\r\n filterType: FilterType.custom,\r\n columnName: 'actionOn',\r\n filterOptions: [\r\n {\r\n key: 'adunit',\r\n text: getEntityTypeDisplayMap('adunit', formatMessage),\r\n },\r\n {\r\n key: 'property',\r\n text: getEntityTypeDisplayMap('property', formatMessage),\r\n },\r\n {\r\n key: 'user',\r\n text: getEntityTypeDisplayMap('user', formatMessage),\r\n },\r\n {\r\n key: 'publisher',\r\n text: getEntityTypeDisplayMap('publisher', formatMessage),\r\n },\r\n {\r\n key: 'payment',\r\n text: getEntityTypeDisplayMap('payment', formatMessage),\r\n },\r\n // {\r\n // key: 'report',\r\n // text: formatMessage(messages.report),\r\n // },\r\n ],\r\n },\r\n ];\r\n}\r\n","import { Icon } from '@fluentui/react';\r\nimport React, { useEffect, useMemo } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { AuditLog } from '../../../@data';\r\nimport { injectIntlAndObserver } from '../../../utils';\r\nimport { isButtonPressKey } from '../../../utils/AccessibilityUtils';\r\nimport { getAuditHistoryStore } from './@data/store/store';\r\nimport messages from './AuditHistory.messages';\r\nimport { getStyles } from './AuditHistory.styles';\r\nimport { getActionDetails } from './utils';\r\n\r\nexport interface IActionDetailProps extends InjectedIntlProps {\r\n auditLog: AuditLog;\r\n index: number;\r\n}\r\n\r\nexport const ActionDetail = injectIntlAndObserver(({ intl: { formatMessage }, auditLog, index }: IActionDetailProps) => {\r\n const { isShowAllDetailsEnabled } = getAuditHistoryStore();\r\n const styles = getStyles();\r\n\r\n // eslint-disable-next-line\r\n const actionDetails = useMemo(() => getActionDetails(auditLog, formatMessage), [auditLog]);\r\n const [showDetails, setShowDetails] = React.useState(isShowAllDetailsEnabled);\r\n\r\n useEffect(() => setShowDetails(isShowAllDetailsEnabled), [isShowAllDetailsEnabled]);\r\n\r\n return (\r\n <div>\r\n <span>\r\n {actionDetails.title || ''}{' '}\r\n {actionDetails.changes?.length > 0 && (\r\n <span\r\n onClick={() => setShowDetails(!showDetails)}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key) && setShowDetails(!showDetails)}\r\n tabIndex={0}\r\n >\r\n <span className={styles.showDetails} role=\"button\">\r\n {formatMessage(showDetails ? messages.hideDetails : messages.showDetails)}\r\n </span>\r\n <span className={styles.showDetailsIcon}>\r\n {showDetails ? <Icon iconName=\"ChevronDown\" /> : <Icon iconName=\"ChevronRight\" />}\r\n </span>\r\n </span>\r\n )}\r\n </span>\r\n {showDetails && actionDetails.changes?.length > 0 && (\r\n <ul className={styles.actionDetailsList}>\r\n {actionDetails.changes?.map((change, index2) => (\r\n <li className={styles.actionDetailsListItem} key={`actionDetailRow-${index}-${index2}`}>\r\n {change}\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </div>\r\n );\r\n});\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterSpacing } from '../../../../theme';\r\n\r\nexport const getStyles = () => {\r\n const theme = getTheme();\r\n const { palette } = theme;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return mergeStyleSets({\r\n showDetails: {\r\n color: palette.themePrimary,\r\n cursor: 'pointer',\r\n },\r\n showDetailsIcon: {\r\n paddingLeft: spacing.size6,\r\n },\r\n actionDetailsList: {\r\n listStyleType: 'none',\r\n paddingLeft: '0px',\r\n },\r\n actionDetailsListItem: {\r\n color: palette.neutralSecondary,\r\n },\r\n });\r\n};\r\n","import React from 'react';\r\nimport { AuditLog, UserRole } from '../../../../@data';\r\nimport { IGridV2Column } from '../../../../layout/GridPageV2';\r\nimport { getFormattedUserRole } from '../../UserManagement/utils/userRoleUtils';\r\nimport { getAuditHistoryStore } from '../@data/store/store';\r\nimport { ActionDetail } from '../ActionDetails';\r\nimport messages from '../AuditHistory.messages';\r\nimport { getEntityTypeDisplayMap } from './convertAttributeValues';\r\nimport { getActionDetails } from './getActionDetails';\r\n\r\nexport function getGridColumns(formatMessage, locale): IGridV2Column[] {\r\n const { isShowAllDetailsEnabled } = getAuditHistoryStore();\r\n const formatter = new Intl.DateTimeFormat(locale, {\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n second: '2-digit',\r\n hour12: true,\r\n });\r\n\r\n return [\r\n {\r\n columnOrder: 1,\r\n name: formatMessage(messages.dateTime),\r\n key: 'dateTime',\r\n minWidth: 150,\r\n maxWidth: 150,\r\n isResizable: true,\r\n isSorted: true,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n suppressSorting: false,\r\n onRender: (item: AuditLog) => (item && item.modifiedAt ? formatter.format(new Date(item.modifiedAt)) : ''),\r\n exportFunction: (item: AuditLog) => (item && item.modifiedAt ? formatter.format(new Date(item.modifiedAt)) : ''),\r\n },\r\n {\r\n columnOrder: 2,\r\n fieldName: 'userEmail',\r\n name: formatMessage(messages.userEmail),\r\n key: 'userEmail',\r\n minWidth: 100,\r\n maxWidth: 200,\r\n isResizable: true,\r\n isSorted: true,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n suppressSorting: false,\r\n },\r\n {\r\n columnOrder: 3,\r\n name: formatMessage(messages.userRole),\r\n key: 'userRole',\r\n minWidth: 80,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: true,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n suppressSorting: false,\r\n onRender: (item: AuditLog) => {\r\n return item?.userRoles?.map((role) => getFormattedUserRole(formatMessage, role as UserRole)).join(', ') ?? '';\r\n },\r\n exportFunction: (item: AuditLog) => {\r\n return item?.userRoles?.map((role) => getFormattedUserRole(formatMessage, role as UserRole)).join(', ') ?? '';\r\n },\r\n },\r\n {\r\n columnOrder: 4,\r\n name: formatMessage(messages.actionType),\r\n key: 'actionType',\r\n minWidth: 50,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: true,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n suppressSorting: false,\r\n onRender: (item: AuditLog) => {\r\n return item ? formatMessage(messages[item.auditType.toString().toLowerCase()]) : '';\r\n },\r\n exportFunction: (item: AuditLog) => {\r\n return item ? formatMessage(messages[item.auditType.toString().toLowerCase()]) : '';\r\n },\r\n },\r\n {\r\n columnOrder: 5,\r\n name: formatMessage(messages.actionOn),\r\n key: 'actionOn',\r\n minWidth: 50,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: true,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n suppressSorting: false,\r\n onRender: (item: AuditLog) => (item.entityType ? getEntityTypeDisplayMap(item.entityType, formatMessage) : ''),\r\n exportFunction: (item: AuditLog) => (item.entityType ? getEntityTypeDisplayMap(item.entityType, formatMessage) : ''),\r\n },\r\n {\r\n columnOrder: 6,\r\n name: formatMessage(messages.actionDetails),\r\n key: 'actionDetails',\r\n minWidth: 300,\r\n maxWidth: isShowAllDetailsEnabled ? 1000 : 300,\r\n isResizable: true,\r\n isSorted: true,\r\n isSearchable: true,\r\n isVisible: true,\r\n isExportable: true,\r\n suppressSorting: false,\r\n onRender: (item: AuditLog, index: number) => {\r\n return <ActionDetail auditLog={item} index={index} />;\r\n },\r\n searchFunction: (item: AuditLog, searchText: string) => {\r\n const actionDetails = getActionDetails(item, formatMessage);\r\n return JSON.stringify(actionDetails).toLowerCase().indexOf(searchText.toLowerCase()) > -1;\r\n },\r\n exportFunction: (item: AuditLog) => {\r\n const actionDetails = getActionDetails(item, formatMessage);\r\n return JSON.stringify(actionDetails);\r\n },\r\n },\r\n ];\r\n}\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { isTythonSelfServeUser, showLoadingToastNotification } from '../../../../../@data';\r\nimport { APP_NAME_NEW_COMPACT, APP_NAME_PUBCENTER } from '../../../../../constants';\r\nimport { DownloadOption } from '../../../../../layout/GridPageV2';\r\nimport { onDownloadButtonClicked } from '../../../../../layout/GridPageV2/@data/actions/commandBarActions';\r\nimport '../../../../../layout/GridPageV2/@data/orchestrators/downloadButtonClicked';\r\nimport AuditHistoryMessages from '../../AuditHistory.messages';\r\nimport { getGridColumns } from '../../utils/getGridColumns';\r\nimport { handleDownloadButtonClicked } from '../actions';\r\nimport { fetchAuditLogs } from '../services/fetchAuditLogs';\r\nimport { getAuditHistoryStore } from '../store/store';\r\n\r\norchestrator(handleDownloadButtonClicked, async ({ downloadType, formatMessage, locale }) => {\r\n Log.info(`User intends to download audit history data for download type: ${downloadType}`);\r\n\r\n const filename = `${isTythonSelfServeUser() ? APP_NAME_NEW_COMPACT : APP_NAME_PUBCENTER}-Audit-History-${new Date().getFullYear()}-${\r\n new Date().getMonth() + 1\r\n }-${new Date().getDate()}}.csv`;\r\n const columns = getGridColumns(formatMessage, locale);\r\n let data = getAuditHistoryStore().data || [];\r\n\r\n if (downloadType === DownloadOption.all) {\r\n showLoadingToastNotification({\r\n textMessageDescriptor: AuditHistoryMessages.startingDownloadNotification,\r\n onDismiss: () => console.log('download data fetched'),\r\n });\r\n const response = await fetchAuditLogs(getAuditHistoryStore().totalRecords, false);\r\n data = response?.changeLogs || [];\r\n }\r\n\r\n onDownloadButtonClicked(formatMessage, data, filename, columns, downloadType);\r\n});\r\n","import { IContextualMenuProps } from '@fluentui/react';\r\nimport { AuditLog } from '../../../../@data';\r\nimport AppMessages from '../../../../App.messages';\r\nimport {\r\n CommandBarActions,\r\n Direction,\r\n DownloadOption,\r\n IBuildCommandBarProps,\r\n IGridPageCommandBarItemProps,\r\n} from '../../../../layout/GridPageV2';\r\nimport { handleDownloadButtonClicked, setShowAllDetails, updateFiltersAndFetchLogs } from '../@data/actions';\r\nimport { getAuditHistoryStore } from '../@data/store/store';\r\nimport messages from '../AuditHistory.messages';\r\nimport { getFilterItems } from './getFilterItems';\r\n\r\nexport function getCommandBarItems(formatMessage, locale): IBuildCommandBarProps<AuditLog> {\r\n const { isShowAllDetailsEnabled } = getAuditHistoryStore();\r\n\r\n const downloadSubMenuProps: IContextualMenuProps = {\r\n shouldFocusOnMount: true,\r\n items: [\r\n {\r\n key: 'page',\r\n text: formatMessage(AppMessages.downloadPage),\r\n onClick: () => {\r\n handleDownloadButtonClicked(DownloadOption.page, formatMessage, locale);\r\n },\r\n ariaDescribedBy: formatMessage(AppMessages.downloadPageCmdBtnAriaDesc),\r\n },\r\n {\r\n key: 'all',\r\n text: formatMessage(AppMessages.downloadAll),\r\n onClick: () => {\r\n handleDownloadButtonClicked(DownloadOption.all, formatMessage, locale);\r\n },\r\n ariaDescribedBy: formatMessage(AppMessages.downloadAllCmdBtnAriaDesc),\r\n },\r\n ],\r\n };\r\n\r\n return {\r\n includeFarActions: [CommandBarActions.searchBox, CommandBarActions.addFilter],\r\n getCustomCommandBarItems: (_): IGridPageCommandBarItemProps[] => {\r\n return [\r\n {\r\n key: 'showAll',\r\n text: formatMessage(isShowAllDetailsEnabled ? messages.hideAll : messages.showAll),\r\n iconProps: { iconName: isShowAllDetailsEnabled ? 'Hide3' : 'ShowAll' },\r\n onClick: () => setShowAllDetails(!isShowAllDetailsEnabled),\r\n placement: {\r\n direction: Direction.after,\r\n key: CommandBarActions.addFilter,\r\n },\r\n },\r\n {\r\n key: CommandBarActions.download,\r\n name: formatMessage(AppMessages.download),\r\n ariaDescription: formatMessage(AppMessages.downloadAllCmdBtnAriaDesc),\r\n iconProps: {\r\n iconName: 'Download',\r\n },\r\n subMenuProps: downloadSubMenuProps,\r\n placement: {\r\n direction: Direction.after,\r\n key: CommandBarActions.addFilter,\r\n },\r\n },\r\n ];\r\n },\r\n filterItems: getFilterItems(formatMessage),\r\n customApplyFilterFn: (filterConditions, items) => {\r\n updateFiltersAndFetchLogs(filterConditions);\r\n return getAuditHistoryStore().data || items;\r\n },\r\n };\r\n}\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { AuditHistoryRequestFilter, AuditType, UserRole } from '../../../../../@data';\r\nimport { FilterCondition } from '../../../../../@data/store/schema/enums/FilterCondition';\r\nimport {\r\n setAuditLogs,\r\n setAuditTypes,\r\n setEntityTypes,\r\n setFilters,\r\n setPageSize,\r\n setTotalPages,\r\n setTotalRecords,\r\n setUserRoles,\r\n} from '../actions';\r\nimport { updateFiltersAndFetchLogs } from '../actions/actions';\r\nimport { fetchAuditLogs } from '../services/fetchAuditLogs';\r\nimport { getAuditHistoryStore } from '../store/store';\r\n\r\norchestrator(updateFiltersAndFetchLogs, async ({ filterConditions }) => {\r\n const newFilters: AuditHistoryRequestFilter[] = [];\r\n const newUserRoles: UserRole[] = [];\r\n const newAuditTypes: AuditType[] = [];\r\n const newEntityTypes: string[] = [];\r\n\r\n const filterConditionMap = new Map<string, string>([\r\n [FilterCondition.Contains, 'CONTAINS'],\r\n [FilterCondition.DoesNotContain, 'NOT_CONTAINS'],\r\n [FilterCondition.BeginsWith, 'BEGINS_WITH'],\r\n [FilterCondition.EndsWith, 'ENDS_WITH'],\r\n [FilterCondition.Equals, 'EQUALS'],\r\n [FilterCondition.DoesNotEqual, 'NOT_EQUALS'],\r\n ]);\r\n\r\n filterConditions.forEach((filterCondition) => {\r\n switch (filterCondition.columnName) {\r\n case 'userEmail': {\r\n newFilters.push({\r\n field: 'userEmail',\r\n value: filterCondition.filterText ?? '',\r\n operator: filterCondition.filterCondition ? filterConditionMap.get(filterCondition.filterCondition) ?? 'Contains' : 'Contains',\r\n });\r\n break;\r\n }\r\n case 'userRole':\r\n newUserRoles.push(filterCondition.filterCondition as UserRole);\r\n break;\r\n case 'actionType':\r\n newAuditTypes.push(filterCondition.filterCondition as AuditType);\r\n break;\r\n case 'actionOn':\r\n if (filterCondition.filterCondition) {\r\n newEntityTypes.push(filterCondition.filterCondition);\r\n }\r\n break;\r\n default:\r\n Log.debug('Unknown filter encountered');\r\n break;\r\n }\r\n });\r\n const { filters, auditTypes, userRoles, entityTypes } = getAuditHistoryStore();\r\n if (filters !== newFilters || auditTypes !== newAuditTypes || userRoles !== newUserRoles || entityTypes !== newEntityTypes) {\r\n setFilters(newFilters);\r\n setAuditTypes(newAuditTypes);\r\n setUserRoles(newUserRoles);\r\n setEntityTypes(newEntityTypes);\r\n\r\n const responseJson = await fetchAuditLogs();\r\n\r\n if (responseJson) {\r\n const { changeLogs, pageSize, totalPages, totalRecords } = responseJson;\r\n setAuditLogs(changeLogs);\r\n setPageSize(pageSize);\r\n setTotalPages(totalPages);\r\n setTotalRecords(totalRecords);\r\n }\r\n }\r\n});\r\n","import { SelectionMode, Stack } from '@fluentui/react';\r\nimport React, { useEffect, useMemo } from 'react';\r\nimport { useI18n } from '../../../../i18n/useI18n';\r\nimport { AuditLog, LayoutMode, getAppStore, onHelpInfoCalloutOpened, onHelpInfoChanged, onLayoutChanged } from '../../../@data';\r\nimport { FormTitle } from '../../../components/Form';\r\nimport { GridPageLayout } from '../../../layout/GridPageLayout/GridPageLayout';\r\nimport { GridV2 } from '../../../layout/GridPageV2';\r\nimport { Pagination } from '../../../layout/GridPageV2/components/Pagination';\r\nimport { PaginationDisplay } from '../../../layout/GridPageV2/components/Pagination/Pagination.types';\r\nimport ProfilePanelMessages from '../../../layout/PageLayout/header-panels/ProfilePanel/ProfilePanel.messages';\r\nimport { IRouterWithIntl, injectIntlAndObserver } from '../../../utils';\r\nimport { CustomCalender } from '../../report/components/CustomCalender/CustomCalender';\r\nimport { RangeType } from '../../report/components/CustomCalender/CustomCalender.types';\r\nimport { RouteName } from '../@data';\r\nimport { onCurrentRouteChanged } from '../@data/actions';\r\nimport { getStore } from '../Account/Settings/@data/store/store';\r\nimport { onAuditHistoryPageInitialized, onSelectedDatesChanged, resetFilters, setPageNumber, setPageSize } from './@data/actions';\r\nimport './@data/orchestrators';\r\nimport { getAuditHistoryStore } from './@data/store/store';\r\nimport AuditHistoryMessages from './AuditHistory.messages';\r\nimport { getCommandBarItems } from './utils/getCommandBarItems';\r\nimport { getGridColumns } from './utils/getGridColumns';\r\n\r\nexport interface IAuditHistoryPageProps extends IRouterWithIntl {}\r\n\r\nexport const AuditHistoryPage = injectIntlAndObserver(function AuditHistoryPageComp(props: IAuditHistoryPageProps) {\r\n const { formatMessage } = props.intl;\r\n const { auditHistory, noAuditsFound, noPublisherSelected } = AuditHistoryMessages;\r\n const { data, startDate, endDate, totalPages, isDataLoading, pageNumber, pageSize, isShowAllDetailsEnabled } = getAuditHistoryStore();\r\n const { publisher, userContext, helpInfo, locale: appLocale } = getAppStore();\r\n const { systemPreferences } = getStore().active;\r\n const { locale } = useI18n({ systemPreferences, publisher, userContext });\r\n\r\n useEffect(() => {\r\n if (getAppStore().layout !== LayoutMode.Default) {\r\n onLayoutChanged(LayoutMode.Default);\r\n }\r\n\r\n onCurrentRouteChanged(RouteName.auditHistory, props.intl.formatMessage, ProfilePanelMessages.auditHistory);\r\n\r\n // resetting filters\r\n resetFilters();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const gridColumns = useMemo(() => {\r\n return getGridColumns(formatMessage, locale);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isShowAllDetailsEnabled, locale]);\r\n\r\n useEffect(() => {\r\n onAuditHistoryPageInitialized();\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [publisher, startDate, endDate, pageNumber, pageSize]);\r\n\r\n return (\r\n <GridPageLayout>\r\n <Stack horizontal horizontalAlign=\"space-between\">\r\n <FormTitle\r\n intl={props.intl}\r\n title={formatMessage(auditHistory)}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_AuditHistory', appLocale)}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n />\r\n <div>\r\n <CustomCalender\r\n initialDateRange={{ startDate: startDate, endDate: endDate }}\r\n disableFutureDays\r\n onSelectedDatesChanged={onSelectedDatesChanged}\r\n initialRangeType={RangeType.Last7ExcludingToday}\r\n />\r\n </div>\r\n </Stack>\r\n <GridV2\r\n {...props}\r\n entity={AuditLog}\r\n isGridReady={!isDataLoading}\r\n commandBarProps={getCommandBarItems(formatMessage, locale)}\r\n dataGridProps={{\r\n data: data || [],\r\n gridV2Columns: gridColumns,\r\n selectionMode: SelectionMode.none,\r\n noEntityFound: publisher ? noAuditsFound : noPublisherSelected,\r\n }}\r\n >\r\n <Pagination\r\n intl={props.intl}\r\n display={PaginationDisplay.Navigation}\r\n totalPageCount={totalPages}\r\n currentPageNumber={pageNumber ?? 1}\r\n pageSize={pageSize ?? 10}\r\n onPageNumberChange={setPageNumber}\r\n onPageSizeChange={setPageSize}\r\n />\r\n </GridV2>\r\n </GridPageLayout>\r\n );\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n title: {\r\n id: 'admanagementindex.title',\r\n defaultMessage: 'Ad Management Index',\r\n }\r\n});","import * as React from 'react';\r\nimport { injectIntl } from 'react-intl';\r\nimport { Redirect } from 'react-router';\r\nimport messages from './IndexPage.messages';\r\nimport { RouteName, defaultRoute } from '../@data';\r\nimport { IIndexPageProps } from './IndexPage.types';\r\nimport { onCurrentRouteChanged } from '../@data/actions';\r\nimport { getAppStore } from '../../../@data';\r\n\r\ninterface IIndexState {\r\n baseUrl?: string;\r\n currentRoute?: string;\r\n}\r\n\r\n/**\r\n * The index page is responsible managing the default state of all the pages that\r\n * don't get matched. For example, when an adunit is not specified, it will redirect\r\n * to this page which will make sure the publisher and account are properly used.\r\n */\r\nexport const IndexPage = injectIntl(class extends React.Component<IIndexPageProps, IIndexState> {\r\n constructor(props) {\r\n super(props);\r\n\r\n if (props.match.params.id) {\r\n const pageId = props.match.params.id;\r\n const baseUrl = props.match.url.substring(0, props.match.url.indexOf(pageId) - 1);\r\n const currentRoute = pageId in RouteName ? pageId : defaultRoute;\r\n this.state = { baseUrl, currentRoute };\r\n } else {\r\n this.state = { baseUrl: props.match.url, currentRoute: RouteName[defaultRoute]};\r\n }\r\n }\r\n\r\n public componentDidMount() {\r\n onCurrentRouteChanged(RouteName[this.state.currentRoute || defaultRoute], this.props.intl.formatMessage);\r\n }\r\n\r\n public render(): JSX.Element {\r\n const store = getAppStore();\r\n\r\n if (store.publisher && store.account &&\r\n store.publisher.id && store.account.id) {\r\n const publisherId = store.publisher.id.toString();\r\n const accountId = store.account.id.toString();\r\n const url = `${this.state.baseUrl}/${publisherId}-${accountId}/${this.state.currentRoute}`;\r\n\r\n if (url !== this.props.location.pathname) {\r\n return <Redirect to={url} />;\r\n }\r\n }\r\n\r\n return (\r\n <React.Fragment>\r\n <h2>{this.props.intl.formatMessage(messages.title)}</h2>\r\n </React.Fragment>\r\n );\r\n }\r\n});","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../theme';\r\nimport { ICommonStyleProps } from '../../types';\r\n\r\ntype StyleProperties = 'messageBarButtonStyle' | 'linkStyle';\r\nexport type AdManagementStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): AdManagementStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { spacing } = theme;\r\n\r\n return mergeStyleSets({\r\n messageBarButtonStyle: {\r\n position: 'absolute',\r\n top: spacing.size4,\r\n right: spacing.size32,\r\n },\r\n linkStyle: {\r\n textDecoration: 'none',\r\n color: theme.palette.themePrimary,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): AdManagementStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { MessageBarButton, MessageBarType } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { isPublisherActionRequired, isPublisherRejectionUnappealable } from '../../@data';\r\nimport { ExternalLink } from '../../components/ExternalLink';\r\nimport { INotificationBarItem, NotificationBar } from '../../components/NotificationBar';\r\nimport { TNC_HREF_PATH } from '../../constants/AppConstants';\r\nimport { NullableJSXElement } from '../../types';\r\nimport { RouteName, getAdManagementStore } from './@data';\r\nimport { setPublisherRejectedMessageClosedAction } from './@data/actions/entityEvaluationMutatorActions';\r\nimport { getClassNames } from './AdManagement.styles';\r\nimport profileCardMessages from './Home/components/ProfileCard/ProfileCard.messages';\r\nimport { isProfileInEditMode } from './Profile/@data';\r\n\r\nexport function renderCustomNotifications(): NullableJSXElement {\r\n const pageStore = getAdManagementStore();\r\n const { messageBarButtonStyle, linkStyle } = getClassNames();\r\n const { formatMessage } = this.props.intl;\r\n\r\n const notifications: INotificationBarItem[] = [];\r\n\r\n if (isPublisherRejectionUnappealable() && !pageStore.isPublisherRejectedMessageClosed) {\r\n notifications.push({\r\n children: (\r\n <div>\r\n {formatMessage(profileCardMessages.rejectedBannerPart1)}\r\n <ExternalLink href={TNC_HREF_PATH} className={linkStyle}>\r\n {formatMessage(profileCardMessages.termsAndConditions)}\r\n </ExternalLink>\r\n . \r\n {/* Removing this message as we don't have publisher deletion flow in place yet.\r\n {formatMessage(profileCardMessages.rejectedBannerPart2)}\r\n */}\r\n </div>\r\n ),\r\n onDismiss: () => setPublisherRejectedMessageClosedAction(true),\r\n messageBarType: MessageBarType.error,\r\n suppressAutoDismiss: true,\r\n });\r\n }\r\n\r\n if (isPublisherActionRequired() && !isProfileInEditMode() && !window.location.pathname.includes(`${RouteName.publisherProfile}`)) {\r\n notifications.push({\r\n children: (\r\n <div>\r\n {formatMessage(profileCardMessages.retryDescription)}\r\n <MessageBarButton onClick={this._handleProfileEditButtonClick} className={messageBarButtonStyle}>\r\n {formatMessage(profileCardMessages.viewProfile)}\r\n </MessageBarButton>\r\n </div>\r\n ),\r\n noDismissButton: true,\r\n messageBarType: MessageBarType.severeWarning,\r\n suppressAutoDismiss: true,\r\n });\r\n }\r\n\r\n return (\r\n <NotificationBar\r\n items={notifications}\r\n intl={this.props.intl}\r\n onRemoved={() => {\r\n return;\r\n }}\r\n />\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Redirect, Route, Switch } from 'react-router-dom';\r\nimport { IAppState, getAppStore, isPublisherRejectionUnappealable } from '../../@data';\r\nimport { hasAdQualityAccess } from '../../@data/utils/AdTakeDownService';\r\nimport { isTythonSelfServeUser } from '../../@data/utils/checkUserType';\r\nimport { IAppProps } from '../../ApplicationRoute';\r\nimport { IRoute } from '../../Routes.types';\r\nimport { ContentLayout } from '../../layout/ContentLayout/ContentLayout';\r\nimport { IMenuProps } from '../../layout/ContentLayout/ContentLayout.types';\r\nimport { NullableJSXElement } from '../../types';\r\nimport { injectRouterAndIntlWithObserver } from '../../utils';\r\nimport { getTythonHomePageRoute, getTythonProfilePageRoute } from '../../utils/routeUtils';\r\nimport SuspendedUserOverlay from '../error-pages/SuspendedUser/SuspendedUser';\r\nimport { PUBLISHER_BASED_ROUTES, RouteName } from './@data';\r\nimport { fetchPublisherEvaluationStatusAction } from './@data/actions';\r\nimport { getRoutes } from './@data/services/getAdmanagementRoutes';\r\nimport { UserSettingsPage } from './Account/Settings/UserSettingsPage';\r\nimport { AdManagementHeader } from './AdManagementHeader';\r\nimport { AuditHistoryPage } from './AuditHistory/AuditHistory';\r\nimport { IndexPage } from './Index/IndexPage';\r\nimport { editProfileAction } from './Profile/@data/actions';\r\nimport { renderCustomNotifications } from './renderPartials';\r\n\r\nfunction getDefaultRoute(): string {\r\n return RouteName[isTythonSelfServeUser() ? RouteName.home : RouteName.adunit];\r\n}\r\n\r\n/**\r\n * The router will make sure /publisher-account/pageName is valid, otherwise it will\r\n * make sure it keeps the state consistent with /pagaeName\r\n */\r\nexport const AdManagementRouter = injectRouterAndIntlWithObserver(\r\n class AdManagementRouterComponent extends React.Component<IAppProps> {\r\n private _renderCustomNotifications: () => NullableJSXElement;\r\n\r\n constructor(props: IAppProps) {\r\n super(props);\r\n this._renderCustomNotifications = renderCustomNotifications.bind(this);\r\n this._handleProfileEditButtonClick = this._handleProfileEditButtonClick.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (isTythonSelfServeUser() && this.props.location.pathname !== getTythonHomePageRoute()) {\r\n fetchPublisherEvaluationStatusAction();\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const appStore = getAppStore();\r\n const menuProps: IMenuProps = {\r\n ...this.props,\r\n routes: this._generateMenuRoutes(appStore),\r\n };\r\n const {\r\n intl: { formatMessage },\r\n } = this.props;\r\n\r\n return (\r\n <ContentLayout\r\n {...this.props}\r\n menuProps={menuProps}\r\n renderCustomNotifications={this._renderCustomNotifications}\r\n onRenderHeader={this._renderHeader}\r\n >\r\n <Redirect exact path={this.props.match.url} to={`${this.props.match.url}/${getDefaultRoute()}`} />\r\n {isPublisherRejectionUnappealable() ? (\r\n <SuspendedUserOverlay />\r\n ) : (\r\n <>\r\n {getRoutes(formatMessage).map((route: IRoute, index: number) => (\r\n <Route\r\n key={index}\r\n path={[\r\n `${this.props.match.url}/${route.key}`,\r\n `${this.props.match.url}/:publisherId-:accountId/${route.key}`,\r\n `${this.props.match.url}/:publisherId/${route.key}`,\r\n ]}\r\n component={route.component}\r\n />\r\n ))}\r\n <Route\r\n key=\"userSettings\"\r\n path={`${this.props.match.url}/:publisherId/${RouteName[RouteName.userSettings]}`}\r\n component={UserSettingsPage}\r\n />\r\n <Route\r\n key=\"auditHistory\"\r\n path={[\r\n `${this.props.match.url}/:publisherId/${RouteName[RouteName.auditHistory]}`,\r\n `${this.props.match.url}/${RouteName[RouteName.auditHistory]}`,\r\n ]}\r\n component={AuditHistoryPage}\r\n />\r\n </>\r\n )}\r\n <Route key=\"catch-all\" path={`${this.props.match.url}/:id`} component={IndexPage} />\r\n </ContentLayout>\r\n );\r\n }\r\n\r\n private _handleProfileEditButtonClick() {\r\n editProfileAction();\r\n this.props.history.push(getTythonProfilePageRoute());\r\n }\r\n\r\n private _generateMenuRoutes(store: IAppState) {\r\n let keyFnc: (key: string) => string;\r\n\r\n const {\r\n intl: { formatMessage },\r\n } = this.props;\r\n\r\n if (store.publisher && store.account && store.publisher.id && store.account.id) {\r\n const publisherId = store.publisher.id.toString();\r\n const accountId = store.account.id.toString();\r\n keyFnc = (key) => {\r\n if (PUBLISHER_BASED_ROUTES.includes(key as RouteName)) {\r\n return `/${publisherId}/${key}`;\r\n }\r\n return `/${publisherId}-${accountId}/${key}`;\r\n };\r\n } else if (store.publisher && store.publisher.id) {\r\n const publisherId = store.publisher.id.toString();\r\n keyFnc = (key) => `/${publisherId}/${key}`;\r\n } else {\r\n keyFnc = (key) => `/${key}`;\r\n }\r\n\r\n if (isTythonSelfServeUser()) {\r\n return getRoutes(formatMessage)\r\n .filter((route) => ![RouteName.adquality, RouteName.adfilter, RouteName.channel].includes(route.key as RouteName))\r\n .map(\r\n (route) =>\r\n ({\r\n key: keyFnc(route.key),\r\n text: route.text,\r\n icon: route.icon,\r\n disabled: route.disabled,\r\n } as IRoute)\r\n );\r\n }\r\n\r\n if (!store.publisher || (store.publisher && !hasAdQualityAccess(store.publisher.id))) {\r\n return getRoutes(formatMessage)\r\n .filter((route) => route.key !== RouteName.adquality)\r\n .map(\r\n (route) =>\r\n ({\r\n key: keyFnc(route.key),\r\n text: route.text,\r\n icon: route.icon,\r\n disabled: route.disabled,\r\n } as IRoute)\r\n );\r\n }\r\n // Update the menu routes according to whether the publisher/account were specified.\r\n\r\n return getRoutes(formatMessage).map(\r\n (route) =>\r\n ({\r\n key: keyFnc(route.key),\r\n text: route.text,\r\n icon: route.icon,\r\n disabled: route.disabled,\r\n } as IRoute)\r\n );\r\n }\r\n\r\n private _renderHeader = (): JSX.Element => {\r\n // Support non pub/acc urls as well. When nothing matched, go back to home to do the default route.\r\n return (\r\n <React.Fragment>\r\n <Switch>\r\n <Route\r\n exact\r\n path={`${this.props.match.url}/${RouteName.adquality}`}\r\n render={(props) => <AdManagementHeader {...props} isAccountHidden={true} />}\r\n />\r\n\r\n <Route\r\n exact\r\n path={`${this.props.match.url}/${RouteName.property}`}\r\n render={(props) => <AdManagementHeader {...props} isAccountHidden={true} />}\r\n />\r\n\r\n <Route exact path={`${this.props.match.url}/:publisherId/${RouteName.adunit}`} component={AdManagementHeader} />\r\n\r\n <Route exact path={`${this.props.match.url}/:id?`} component={AdManagementHeader} />\r\n <Route path={`${this.props.match.url}/:publisherId-:accountId`} component={AdManagementHeader} />\r\n\r\n <Route\r\n path={`${this.props.match.url}/:publisherId`}\r\n render={(props) => <AdManagementHeader {...props} isAccountHidden={true} />}\r\n />\r\n\r\n <Route path=\"*\" render={() => <Redirect to={this.props.match.url} />} />\r\n </Switch>\r\n </React.Fragment>\r\n );\r\n };\r\n }\r\n);\r\n","import { BreakPoints, IPubcenterTheme } from '../../../theme';\r\nimport { ITnCModalStyleProps, ITnCModalStyles } from './TnCModal.types';\r\n\r\nexport const getStyles = (props: ITnCModalStyleProps): ITnCModalStyles => {\r\n const { spacing, fonts, palette } = (props.theme as unknown) as IPubcenterTheme;\r\n\r\n const CONTAINER_WIDTH = 582;\r\n const CONTAINER_WIDTH_MEDIUM = 548;\r\n const { ResponsiveSmall, ResponsiveMedium } = BreakPoints;\r\n const PADDING = 28;\r\n const LAYOUT_HEIGHT = 48 + 48 + PADDING; // header height + footer height + vertical padding\r\n const getLeftPosition = (width) => `calc((100vw - ${width}px - 4em)/2)`;\r\n\r\n return {\r\n root: {\r\n background: 'rgba(0, 0, 0, 0.2)',\r\n bottom: 0,\r\n left: 0,\r\n position: 'fixed',\r\n right: 0,\r\n top: 0,\r\n [ResponsiveSmall]: {\r\n position: 'initial',\r\n background: 'transparent',\r\n },\r\n },\r\n content: {\r\n overflowY: 'auto',\r\n background: 'white',\r\n padding: '1em 2em',\r\n position: 'absolute',\r\n top: 80,\r\n width: CONTAINER_WIDTH,\r\n left: getLeftPosition(CONTAINER_WIDTH),\r\n borderRadius: spacing.size12,\r\n height: 'calc(100vh - 200px)',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n minHeight: 386,\r\n color: palette.neutralPrimary,\r\n [ResponsiveMedium]: {\r\n width: CONTAINER_WIDTH_MEDIUM,\r\n left: getLeftPosition(CONTAINER_WIDTH_MEDIUM),\r\n },\r\n [ResponsiveSmall]: {\r\n top: spacing.size48,\r\n height: `calc(100vh - ${LAYOUT_HEIGHT}px)`,\r\n borderRadius: 0,\r\n width: `calc(100vw - ${PADDING * 2}px)`,\r\n left: 0,\r\n },\r\n },\r\n summaryContent: {\r\n marginBottom: spacing.size24,\r\n },\r\n tncWrapper: {\r\n minHeight: spacing.size64,\r\n overflow: 'scroll',\r\n maxHeight: 'calc(100% - 372px)',\r\n border: `1px solid ${palette.neutralSecondary}`,\r\n boxShadow: `1px 1px 1px ${palette.neutralSecondary}40`,\r\n borderRadius: spacing.size2,\r\n padding: spacing.size12,\r\n paddingRight: spacing.size4,\r\n margin: '16px 0px',\r\n color: palette.neutralSecondaryAlt,\r\n fontFamily: 'inherit',\r\n },\r\n tncCheckbox: {\r\n display: 'inline-flex',\r\n marginRight: spacing.size12,\r\n },\r\n tncCheckboxWrapper: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n svg: {\r\n marginLeft: spacing.size6,\r\n },\r\n },\r\n tncAckMsgSubline: {\r\n marginLeft: spacing.size36,\r\n color: palette.neutralSecondary,\r\n fontSize: fonts.size12.fontSize,\r\n },\r\n endingButton: {\r\n marginLeft: spacing.size12,\r\n },\r\n actionButtonWrapper: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n marginTop: spacing.size12,\r\n },\r\n headLineGreeting: {\r\n fontWeight: 600,\r\n fontSize: fonts.size20.fontSize,\r\n margin: `${spacing.size12} 0px`,\r\n },\r\n };\r\n};\r\n","import {\r\n Checkbox,\r\n DefaultButton,\r\n FocusTrapZone,\r\n IProcessedStyleSet,\r\n Layer,\r\n Popup,\r\n PrimaryButton,\r\n Text,\r\n classNamesFunction,\r\n getTheme,\r\n} from '@fluentui/react';\r\nimport { useBoolean } from '@fluentui/react-hooks';\r\nimport * as React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { useI18n } from '../../../i18n/useI18n';\r\nimport { getAppStore, isTythonSelfServeUser } from '../../@data';\r\nimport { APP_NAME_NEW, APP_NAME_PUBCENTER } from '../../constants';\r\nimport { getStore } from '../../pages/ad-management/Account/Settings/@data/store/store';\r\nimport { injectIntlAndObserver } from '../../utils';\r\nimport { Logo } from '../Logo/Logo';\r\nimport messages from './TnCModal.messages';\r\nimport { getStyles } from './TnCModal.styles';\r\nimport { ITnCModalStyleProps, ITnCModalStyles } from './TnCModal.types';\r\n\r\nconst getClassNames = classNamesFunction<ITnCModalStyleProps, ITnCModalStyles>();\r\nexport interface ITnCModalProps {\r\n onSkip?: () => void;\r\n onAccept: () => void;\r\n isActive: boolean;\r\n content?: string;\r\n releaseDate?: string;\r\n isLoading: boolean;\r\n}\r\n\r\nexport const TnCModal = injectIntlAndObserver(\r\n ({ intl: { formatMessage }, onSkip, onAccept, isActive, content, releaseDate, isLoading }: ITnCModalProps & InjectedIntlProps) => {\r\n const [isTnCAccepted, { toggle, setFalse }] = useBoolean(false);\r\n const { publisher, userContext } = getAppStore();\r\n const { systemPreferences } = getStore().active;\r\n const { locale } = useI18n({ systemPreferences, publisher, userContext });\r\n const tncReleaseDate = new Date(releaseDate!).toLocaleDateString(locale, { month: 'long', day: 'numeric', year: 'numeric' });\r\n const classNames: IProcessedStyleSet<ITnCModalStyles> = getClassNames(getStyles, {\r\n theme: getTheme(),\r\n });\r\n\r\n if (!isActive) {\r\n return null;\r\n }\r\n\r\n return (\r\n <>\r\n {isActive && (\r\n <Layer styles={{ root: { background: 'transparent' } }}>\r\n <Popup className={classNames.root} role=\"dialog\" aria-modal=\"true\" onDismiss={onSkip}>\r\n <FocusTrapZone disabled>\r\n <div role=\"document\" className={classNames.content}>\r\n <Logo renderDarkLogo />\r\n <Text block className={classNames.headLineGreeting}>\r\n {formatMessage(messages.headLineGreeting)}\r\n </Text>\r\n <Text block className={classNames.summaryContent}>\r\n {formatMessage(messages.summary, {\r\n releaseDate: tncReleaseDate,\r\n appName: isTythonSelfServeUser() ? APP_NAME_NEW : APP_NAME_PUBCENTER,\r\n })}\r\n </Text>\r\n <Text block>{formatMessage(messages.thanksMsg)}</Text>\r\n <Text block>\r\n {formatMessage(messages.thanksMsgSubLine, { appName: isTythonSelfServeUser() ? APP_NAME_NEW : APP_NAME_PUBCENTER })}\r\n </Text>\r\n <div className={classNames.tncWrapper}>\r\n <div dangerouslySetInnerHTML={{ __html: content! }} />\r\n </div>\r\n <Text block className={classNames.tncCheckboxWrapper}>\r\n <Checkbox checked={isTnCAccepted} onChange={toggle} className={classNames.tncCheckbox} />\r\n {formatMessage(messages.ackMsg)}\r\n <svg width=\"7\" height=\"7\" viewBox=\"0 0 7 7\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M3.864 0.879999L3.624 3.184L5.928 2.536L6.096 3.64L3.888 3.82L5.316 5.716L4.284 6.28L3.264 4.18L2.34 6.28L1.272 5.716L2.676 3.82L0.492 3.64L0.66 2.536L2.94 3.184L2.688 0.879999H3.864Z\"\r\n fill=\"#A80000\"\r\n />\r\n </svg>\r\n </Text>\r\n <Text block className={classNames.tncAckMsgSubline}>\r\n {formatMessage(messages.ackMsgSubline)}\r\n </Text>\r\n <div className={classNames.actionButtonWrapper}>\r\n <PrimaryButton onClick={onAccept} disabled={!isTnCAccepted || isLoading}>\r\n {formatMessage(isLoading ? messages.submitting : messages.acceptButton)}\r\n </PrimaryButton>\r\n <DefaultButton\r\n className={classNames.endingButton}\r\n onClick={() => {\r\n setFalse();\r\n onSkip?.();\r\n }}\r\n disabled={onSkip === undefined}\r\n >\r\n {formatMessage(messages.skipButton)}\r\n </DefaultButton>\r\n </div>\r\n </div>\r\n </FocusTrapZone>\r\n </Popup>\r\n </Layer>\r\n )}\r\n </>\r\n );\r\n }\r\n);\r\n","import { getTheme, keyframes, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../theme';\r\nimport { ICommonStyleProps } from '../../types';\r\nimport { flexWithJustifyBetween } from '../../utils/GlobalStyleUtils';\r\nimport { ToastType } from './ToastNotification.types';\r\n\r\nexport interface IToastStyleProps extends ICommonStyleProps {\r\n type: ToastType;\r\n suppressAutoDismiss?: boolean;\r\n animationTime?: number;\r\n}\r\n\r\ntype StyleProperties = 'notificationsContainer' | 'notificationBody' | 'notificationAnimation' | 'notificationIcon';\r\n\r\ntype ToastNotificationStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: IToastStyleProps): ToastNotificationStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { spacing, palette } = theme;\r\n const AUTO_DISMISS_ANIMATION_TIME: number = props.animationTime || 3000;\r\n const MANUAL_DISMISS_ANIMATION_TIME: number = AUTO_DISMISS_ANIMATION_TIME / 4;\r\n\r\n const toastStyle = {\r\n info: {\r\n background: palette.neutralLighter,\r\n },\r\n warning: {\r\n background: palette.warning,\r\n },\r\n error: {\r\n background: palette.messageBarError,\r\n color: palette.neutralPrimary,\r\n },\r\n success: {\r\n background: palette.success,\r\n },\r\n loading: {\r\n background: palette.neutralLighter,\r\n },\r\n };\r\n\r\n return mergeStyleSets({\r\n notificationsContainer: {\r\n position: 'absolute',\r\n zIndex: 9999999,\r\n top: spacing.size50,\r\n right: spacing.size40,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: spacing.size10,\r\n alignItems: 'flex-end',\r\n },\r\n notificationBody: {\r\n ...flexWithJustifyBetween,\r\n boxShadow: 'rgb(0 0 0 / 14%) 0px 4px 8px, rgb(0 0 0 / 12%) 0px 0px 2px',\r\n padding: `${spacing.size20} ${spacing.size10}`,\r\n gap: spacing.size10,\r\n borderRadius: 4,\r\n width: 'fit-content',\r\n ...toastStyle[props.type.toString()],\r\n },\r\n notificationAnimation: {\r\n animationName: props.suppressAutoDismiss ? automaticFadeIn : automaticFadeInOut,\r\n animationDuration: props.suppressAutoDismiss ? `${MANUAL_DISMISS_ANIMATION_TIME}ms` : `${AUTO_DISMISS_ANIMATION_TIME}ms`,\r\n animationIterationCount: 1,\r\n },\r\n notificationIcon: {\r\n cursor: 'pointer',\r\n userSelect: 'none',\r\n },\r\n });\r\n};\r\n\r\nconst automaticFadeInOut = keyframes({\r\n '0%': {\r\n opacity: 0,\r\n transform: 'translateX(100%)',\r\n easing: 'ease-out',\r\n },\r\n '25%': {\r\n opacity: 1,\r\n transform: 'translateX(0)',\r\n easing: 'ease-in',\r\n },\r\n '50%': {\r\n opacity: 1,\r\n transform: 'translateX(0)',\r\n },\r\n '75%': {\r\n opacity: 1,\r\n transform: 'translateX(0)',\r\n },\r\n '100%': {\r\n opacity: 0,\r\n transform: 'translateX(100%)',\r\n },\r\n});\r\n\r\nconst automaticFadeIn = keyframes({\r\n '0%': {\r\n opacity: 0,\r\n transform: 'translateX(100%)',\r\n easing: 'ease-out',\r\n },\r\n '100%': {\r\n opacity: 1,\r\n transform: 'translateX(0)',\r\n easing: 'ease-in',\r\n },\r\n});\r\n\r\nexport function getClassNames<PropType>(props?: PropType): ToastNotificationStyles {\r\n return getStyles({ theme: getTheme(), type: ToastType.info, ...props });\r\n}\r\n","import { Icon, Spinner } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { removeToastNotification } from '../../@data/mutatorActions';\r\nimport { getClassNames } from './ToastNotification.styles';\r\nimport { IToastNotificationItemProps, IToastNotificationProps, ToastIcon, ToastType } from './ToastNotification.types';\r\n\r\nexport function ToastNotification({ items, intl }: IToastNotificationProps) {\r\n const { notificationsContainer } = getClassNames();\r\n\r\n return (\r\n <div className={notificationsContainer}>\r\n {items?.map((item) => (\r\n <ToastNotificationItem key={item?.id.toString()} item={item} intl={intl} />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction ToastNotificationItem({ item, intl }: IToastNotificationItemProps) {\r\n const { suppressAutoDismiss, animationTime, onDismiss, textMessageDescriptor, intlMessageValues, noDismissButton, text } = item.content;\r\n\r\n const classNames = getClassNames({\r\n suppressAutoDismiss: suppressAutoDismiss,\r\n type: item.type,\r\n animationTime: animationTime,\r\n });\r\n\r\n const onMessageDismiss = async () => {\r\n if (!onDismiss) {\r\n return;\r\n }\r\n await onDismiss();\r\n };\r\n\r\n return (\r\n <div\r\n role=\"alert\"\r\n aria-live=\"assertive\"\r\n className={classNames.notificationAnimation}\r\n onAnimationEnd={async () => {\r\n await onMessageDismiss();\r\n if (suppressAutoDismiss === true && noDismissButton === false) {\r\n return;\r\n }\r\n removeToastNotification(item);\r\n }}\r\n >\r\n <div className={classNames.notificationBody}>\r\n <Icon iconName={ToastIcon[item.type]} />\r\n {item.type === ToastType.loading && <Spinner />}\r\n\r\n {textMessageDescriptor ? intl.formatMessage(textMessageDescriptor, intlMessageValues) : text}\r\n {!noDismissButton && (\r\n <Icon\r\n className={classNames.notificationIcon}\r\n iconName={'Cancel'}\r\n aria-label={item.content.dismissButtonAriaLabel}\r\n onClick={() => {\r\n removeToastNotification(item);\r\n onMessageDismiss();\r\n }}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n messageBarDismissButtonAriaLabel: {\r\n id: 'notificationLayout.messageBarDismissButtonAriaLabel',\r\n defaultMessage: 'Dismiss notification',\r\n },\r\n});\r\n","import { IStyle } from '@fluentui/react';\r\nimport { IPubcenterSpacing } from '../../../theme';\r\n\r\nexport interface INotificationLayoutStyles {\r\n dialogRoot: IStyle;\r\n dialogTitle: IStyle;\r\n dialogContent: IStyle;\r\n dialogWrapper: IStyle;\r\n imgWrapper: IStyle;\r\n dialogButtonCancel: IStyle;\r\n}\r\n\r\nexport const getStyles = (props) => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return {\r\n dialogRoot: {\r\n // overwrite fluentUI responsive size\r\n width: `${spacing.size480} !important`,\r\n minWidth: `30vw !important`,\r\n maxWidth: `80vw !important`,\r\n '.ms-Dialog-header': {\r\n display: 'none',\r\n },\r\n '.ms-Dialog-inner': {\r\n paddingTop: `${spacing.size24}`,\r\n },\r\n },\r\n dialogWrapper: {\r\n minHeight: spacing.size128,\r\n },\r\n dialogContent: {\r\n height: '100%',\r\n paddingLeft: spacing.size12,\r\n },\r\n imgWrapper: {\r\n alignSelf: 'center',\r\n img: { width: spacing.size72 },\r\n },\r\n };\r\n};\r\n","import {\r\n classNamesFunction,\r\n DefaultButton,\r\n Dialog,\r\n DialogType,\r\n getTheme,\r\n ImageBase,\r\n ITheme,\r\n PrimaryButton,\r\n Stack,\r\n Text,\r\n} from '@fluentui/react';\r\nimport { useBoolean, useSetTimeout } from '@fluentui/react-hooks';\r\nimport React, { useEffect, useMemo, useRef } from 'react';\r\nimport notificationMessages from '../../.../../NotificationsPanel.Types.messages';\r\nimport { useI18n } from '../../../i18n/useI18n';\r\nimport {\r\n EntityEvaluationStatus,\r\n fetchBackendNotifications,\r\n getAppStore,\r\n getPublisherEvaluationApprovalStatus,\r\n NotificationLabel,\r\n NotificationSeverity,\r\n onNotificationCardAdded,\r\n onNotificationCardRemoved,\r\n onNotificationChanged,\r\n onNotificationRemoved,\r\n PaymentsPageBalance,\r\n} from '../../@data';\r\nimport { removeToastNotification } from '../../@data/mutatorActions';\r\nimport { isTythonSelfServeUser } from '../../@data/utils/checkUserType';\r\nimport { NotificationBar } from '../../components/NotificationBar';\r\nimport { TnCModal } from '../../components/TnCModal';\r\nimport { ToastNotification } from '../../components/ToastNotification';\r\nimport { APP_NAME_NEW } from '../../constants/AppConstants';\r\nimport { useWindowSize } from '../../hooks';\r\nimport { getStore } from '../../hooks/useWindowSize/store/store';\r\nimport { PAYMENTS_TAB_KEY } from '../../pages/ad-management/Account';\r\nimport { fetchAccountStatus, fetchPaymentsPageBalance } from '../../pages/ad-management/Account/@data/actions';\r\nimport { getAccountStatus, getPaymentsPageBalance } from '../../pages/ad-management/Account/@data/store/selectors';\r\nimport { SetupPaymentNotification } from '../../pages/ad-management/Account/Payments/Onboarding/PaymentsOnboarding';\r\nimport { paymentCheerMessages } from '../../pages/ad-management/Account/Payments/Onboarding/paymentsOnboarding.messages';\r\nimport {\r\n NOTIFICATION_RENDER_BUFFER,\r\n setPaymentNotificationBuffer,\r\n SETUP_PAYMENTS_CHEER_DIALOG_FLAG,\r\n SETUP_PAYMENTS_NOTIFICATION_FLAG,\r\n SETUP_PAYMENTS_NOTIFICATION_ID,\r\n} from '../../pages/ad-management/Account/Payments/Onboarding/usePaymentsOnboarding';\r\nimport { onFetchUserPreferences } from '../../pages/ad-management/Account/Settings/@data/actions';\r\nimport { getStore as getUserSettingStore } from '../../pages/ad-management/Account/Settings/@data/store/store';\r\nimport dialogImg from '../../pages/ad-management/Home/resources/partyPopper.svg';\r\nimport { getStore as getTnCStore } from '../../pages/terms-and-conditions/@data/store/store';\r\nimport useTnC from '../../pages/terms-and-conditions/useTnC';\r\nimport { AccountPageRoute, DefaultRoute } from '../../Routes';\r\nimport { injectRouterAndIntlWithObserver, IRouterWithIntl } from '../../utils';\r\nimport messages from './NotificationLayout.messages';\r\nimport { getStyles, INotificationLayoutStyles } from './NotificationLayout.styles';\r\n\r\nconst getClassNames = classNamesFunction<{ theme: ITheme }, INotificationLayoutStyles>();\r\n\r\nexport interface INotificationLayoutProps {\r\n children?: React.ReactNode;\r\n renderCustomNotifications?: () => React.ReactNode;\r\n ignoreGlobalAsync?: boolean;\r\n}\r\n\r\nexport const NotificationLayout = injectRouterAndIntlWithObserver(\r\n ({ children, intl, renderCustomNotifications, history, ignoreGlobalAsync = false }: INotificationLayoutProps & IRouterWithIntl) => {\r\n // TODO: wrap render logic into a hook\r\n const classNames = getClassNames(getStyles, { theme: getTheme() });\r\n const { notifications: barNotifications, publisher, userContext, account, toastNotifications, menuCollapsed, loading } = getAppStore();\r\n const { isDataLoaded, data } = getPaymentsPageBalance();\r\n const accountStatus = getAccountStatus();\r\n const { setTimeout } = useSetTimeout();\r\n const isPaymentNotificationHandledPerUserSession = localStorage.getItem(SETUP_PAYMENTS_NOTIFICATION_FLAG);\r\n const isPaymentCheerDialogHandledPerUserSession = localStorage.getItem(SETUP_PAYMENTS_CHEER_DIALOG_FLAG);\r\n\r\n const { systemPreferences } = getUserSettingStore().active;\r\n const { locale } = useI18n({ systemPreferences, publisher, userContext });\r\n\r\n const [paymentCheerDialogActive, { setFalse: dismissPaymentCheerDialog, setTrue: activatePaymentCheerDialog }] = useBoolean(false);\r\n const { windowStoreSerializer } = useWindowSize();\r\n const { isWindowSmallSize, isWindowExtraSmallSize } = windowStoreSerializer(getStore());\r\n const publisherEvaluationStatus = getPublisherEvaluationApprovalStatus();\r\n const handledPreference = useRef<boolean>(false);\r\n const tncStore = getTnCStore();\r\n const { tncSignatureStatus } = getUserSettingStore().active;\r\n const { tncModalProps } = useTnC({\r\n barNotifications,\r\n tncStore,\r\n tncSignatureStatus,\r\n userContext,\r\n publisher,\r\n shouldDisableTnC: isTythonSelfServeUser() && !ignoreGlobalAsync,\r\n isAppLoading: loading,\r\n });\r\n const MissingPaymentInformationNotificationId = 'MissingPaymentInformationNotification';\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const windowLocationPath = useMemo(() => window.location.pathname, [window.location.pathname]);\r\n\r\n /**\r\n * fetch user level account preference for tython users\r\n */\r\n const shouldFetchUserPreference = useMemo(\r\n () => !ignoreGlobalAsync && publisher && userContext && !handledPreference.current && isTythonSelfServeUser(),\r\n [publisher, userContext, ignoreGlobalAsync]\r\n );\r\n\r\n /**\r\n * fetch account status and balance when tython user landed default route\r\n */\r\n const shouldFetchPaymentOnboarding = useMemo(\r\n () => publisher?.id && isTythonSelfServeUser() && windowLocationPath.includes(DefaultRoute),\r\n [publisher, windowLocationPath]\r\n );\r\n\r\n /**\r\n * fetch backend notifications when tython user landed default route\r\n */\r\n const shouldFetchBackendNotifications = useMemo(\r\n () => publisher?.id && account?.id && userContext?.id && isTythonSelfServeUser() && windowLocationPath.includes(DefaultRoute),\r\n [publisher, account, userContext, windowLocationPath]\r\n );\r\n\r\n /**\r\n * hide notification when window in smaller screen and menu is expanded to save some screen space\r\n */\r\n const shouldHideBarNotifications = useMemo(() => (isWindowExtraSmallSize || isWindowSmallSize) && !menuCollapsed, [\r\n isWindowExtraSmallSize,\r\n isWindowSmallSize,\r\n menuCollapsed,\r\n ]);\r\n\r\n /**\r\n * handle payment notification push based on current route and localstorage flag\r\n * as this notification suppose to show only once per valid user login\r\n * push notification when\r\n * - account status is loaded\r\n * - balance is loaded\r\n * - notification localStorage flag is empty\r\n * - Publisher evaluation status is not rejected\r\n * - user is tython super admin\r\n */\r\n const shouldPushPaymentNotification = useMemo(\r\n () =>\r\n accountStatus === 'NotCreated' &&\r\n isDataLoaded &&\r\n !isPaymentNotificationHandledPerUserSession &&\r\n shouldFetchPaymentOnboarding &&\r\n publisherEvaluationStatus &&\r\n publisherEvaluationStatus !== EntityEvaluationStatus.Rejected &&\r\n isTythonSelfServeUser() &&\r\n userContext?.userRoles?.includes(41),\r\n [\r\n isDataLoaded,\r\n accountStatus,\r\n isPaymentNotificationHandledPerUserSession,\r\n shouldFetchPaymentOnboarding,\r\n publisherEvaluationStatus,\r\n userContext,\r\n ]\r\n );\r\n\r\n /**\r\n * remove payment notification in panel based on account status\r\n */\r\n const shouldRemovePaymentNotificationInPanel = useMemo(\r\n () =>\r\n shouldFetchPaymentOnboarding &&\r\n accountStatus &&\r\n (accountStatus === 'Active' || accountStatus === 'InActive' || accountStatus === 'Error') &&\r\n isDataLoaded,\r\n [isDataLoaded, accountStatus, shouldFetchPaymentOnboarding]\r\n );\r\n\r\n /**\r\n * handle payment cheer message render behavior, render the cheer popup only when\r\n * - notification is valid to push\r\n * - user balance > threshold\r\n */\r\n const shouldTriggerPaymentCheerDialog = useMemo(\r\n () =>\r\n shouldPushPaymentNotification &&\r\n !isPaymentCheerDialogHandledPerUserSession &&\r\n (data as PaymentsPageBalance).currBalance > (data as PaymentsPageBalance).threshold,\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [shouldPushPaymentNotification, isPaymentCheerDialogHandledPerUserSession]\r\n );\r\n\r\n const setupPaymentNotification = {\r\n messageBarType: 5,\r\n component: <SetupPaymentNotification publisher={publisher?.id} onAction={() => onNotificationRemoved(setupPaymentNotification)} />,\r\n suppressAutoDismiss: true,\r\n id: SETUP_PAYMENTS_NOTIFICATION_ID,\r\n messageBarStyles: {\r\n text: {\r\n marginTop: 0,\r\n marginBottom: 0,\r\n alignItems: 'center',\r\n paddingTop: 2,\r\n },\r\n content: { alignItems: 'center' },\r\n },\r\n };\r\n\r\n useEffect(() => {\r\n if (shouldFetchUserPreference) {\r\n onFetchUserPreferences(locale);\r\n handledPreference.current = true;\r\n }\r\n }, [shouldFetchUserPreference, locale]);\r\n\r\n useEffect(() => {\r\n shouldFetchPaymentOnboarding && fetchPaymentsPageBalance();\r\n shouldFetchPaymentOnboarding && fetchAccountStatus();\r\n }, [shouldFetchPaymentOnboarding]);\r\n\r\n useEffect(() => {\r\n if (shouldFetchBackendNotifications) {\r\n fetchBackendNotifications(intl);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [shouldFetchBackendNotifications]);\r\n\r\n useEffect(() => {\r\n if (shouldPushPaymentNotification) {\r\n onNotificationCardAdded({\r\n // tslint:disable-next-line: no-any\r\n id: MissingPaymentInformationNotificationId,\r\n notificationLabel: NotificationLabel.MissingPaymentInformation,\r\n severity: NotificationSeverity.Warning,\r\n title: intl.formatMessage(notificationMessages.MissingPaymentInformationTitle),\r\n content: intl.formatMessage(notificationMessages.MissingPaymentInformationContent, { appName: APP_NAME_NEW }),\r\n intlContentMessageValues: { appName: APP_NAME_NEW },\r\n primaryActionText: intl.formatMessage(notificationMessages.MissingPaymentInformationPrimaryActionLabel),\r\n primaryActionLink: `/ad-management/${publisher?.id}${AccountPageRoute}#payments`,\r\n });\r\n setTimeout(() => {\r\n onNotificationChanged(setupPaymentNotification);\r\n setPaymentNotificationBuffer(SETUP_PAYMENTS_NOTIFICATION_FLAG);\r\n }, NOTIFICATION_RENDER_BUFFER);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [shouldPushPaymentNotification]);\r\n\r\n useEffect(() => {\r\n if (shouldRemovePaymentNotificationInPanel) {\r\n onNotificationCardRemoved(MissingPaymentInformationNotificationId);\r\n }\r\n }, [shouldRemovePaymentNotificationInPanel]);\r\n\r\n useEffect(() => {\r\n if (shouldTriggerPaymentCheerDialog) {\r\n activatePaymentCheerDialog();\r\n setPaymentNotificationBuffer(SETUP_PAYMENTS_CHEER_DIALOG_FLAG);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [shouldTriggerPaymentCheerDialog]);\r\n\r\n const handlePaymentSetupClick = () => {\r\n dismissPaymentCheerDialog();\r\n if (publisher?.id) {\r\n history.push(`/ad-management/${publisher.id}${AccountPageRoute}#payments`, { defaultTab: PAYMENTS_TAB_KEY });\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n {renderCustomNotifications?.()}\r\n <ToastNotification\r\n items={toastNotifications}\r\n intl={intl}\r\n onRemoved={(notification) => removeToastNotification(notification)}\r\n dismissButtonAriaLabel={intl.formatMessage(messages.messageBarDismissButtonAriaLabel)}\r\n />\r\n <NotificationBar\r\n intl={intl}\r\n items={shouldHideBarNotifications ? [] : barNotifications}\r\n onRemoved={(notification) => onNotificationRemoved(notification)}\r\n dismissButtonAriaLabel={intl.formatMessage(messages.messageBarDismissButtonAriaLabel)}\r\n />\r\n <Dialog\r\n hidden={!paymentCheerDialogActive}\r\n onDismiss={dismissPaymentCheerDialog}\r\n dialogContentProps={{\r\n type: DialogType.normal,\r\n closeButtonAriaLabel: intl.formatMessage(paymentCheerMessages.cheerMessageCancelArialabel),\r\n }}\r\n styles={{ main: classNames.dialogRoot }}\r\n >\r\n <Stack horizontal className={classNames.dialogWrapper}>\r\n <Stack.Item grow={1} className={classNames.imgWrapper}>\r\n <ImageBase src={dialogImg} loading=\"lazy\" />\r\n </Stack.Item>\r\n <Stack.Item grow={5}>\r\n <Stack verticalAlign=\"space-between\" className={classNames.dialogContent}>\r\n <Stack.Item>\r\n <Text variant=\"xLarge\">{intl.formatMessage(paymentCheerMessages.cheerMessageTitle)}</Text>\r\n </Stack.Item>\r\n <Stack.Item>\r\n <Text>{intl.formatMessage(paymentCheerMessages.cheerMessageContent)}</Text>\r\n </Stack.Item>\r\n <Stack.Item>\r\n <Stack horizontal horizontalAlign=\"space-between\">\r\n <Stack.Item>\r\n <PrimaryButton onClick={handlePaymentSetupClick}>\r\n {intl.formatMessage(paymentCheerMessages.cheerMessageButtonAction)}\r\n </PrimaryButton>\r\n </Stack.Item>\r\n <Stack.Item>\r\n <DefaultButton onClick={dismissPaymentCheerDialog}>\r\n {intl.formatMessage(paymentCheerMessages.cheerMessageButtonCancel)}\r\n </DefaultButton>\r\n </Stack.Item>\r\n </Stack>\r\n </Stack.Item>\r\n </Stack>\r\n </Stack.Item>\r\n </Stack>\r\n </Dialog>\r\n <TnCModal {...tncModalProps} />\r\n {children}\r\n </>\r\n );\r\n }\r\n);\r\n","import { BaseComponent, classNamesFunction, FocusTrapZone, MessageBar } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { INotificationBarItem, INotificationBarProps, INotificationBarStyleProps, INotificationBarStyles } from './NotificationBar.types';\r\n\r\nconst getClassNames = classNamesFunction<INotificationBarStyleProps, INotificationBarStyles>();\r\ninterface INotificationBarState {\r\n useTrapZone: boolean;\r\n}\r\n\r\nexport class NotificationBarBase extends BaseComponent<INotificationBarProps, INotificationBarState> {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n useTrapZone: false,\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: INotificationBarProps, prevState: INotificationBarState): void {\r\n if (this.props.items && prevProps.items && this.props.items?.length > prevProps.items?.length && !prevState.useTrapZone) {\r\n this.setState({ useTrapZone: true });\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { dismissButtonAriaLabel, styles, theme, items = [], intl } = this.props;\r\n const classNames = getClassNames(styles, { theme: theme! });\r\n\r\n const onMessageDismiss = (item: INotificationBarItem) => {\r\n const { onDismiss, noDismissButton } = item;\r\n if (!!onDismiss) {\r\n return onDismiss;\r\n }\r\n\r\n if (!noDismissButton) {\r\n return () => this.props.onRemoved(item);\r\n }\r\n };\r\n\r\n return (\r\n <div className={classNames.root}>\r\n {items.map((item, idx) => (\r\n <FocusTrapZone\r\n key={`focus-trap-${idx}`}\r\n disabled={!this.state.useTrapZone}\r\n onFocus={() => {\r\n setTimeout(() => this.setState({ useTrapZone: false }), 1000);\r\n }}\r\n >\r\n <MessageBar\r\n key={idx}\r\n messageBarType={item.messageBarType}\r\n styles={{ ...classNames.subComponentStyles.messageBar, ...(item.messageBarStyles ?? {}) }}\r\n onDismiss={onMessageDismiss(item)}\r\n dismissButtonAriaLabel={dismissButtonAriaLabel}\r\n role=\"alert\"\r\n actions={item.actions}\r\n >\r\n {/* {item.text} */}\r\n {item.textMessageDescriptor && intl ? intl?.formatMessage(item.textMessageDescriptor, item.intlMessageValues) : item.text}\r\n {item.children}\r\n {item.component && item.component}\r\n </MessageBar>\r\n </FocusTrapZone>\r\n ))}\r\n </div>\r\n );\r\n }\r\n}\r\n","import { INotificationBarStyleProps, INotificationBarStyles } from './NotificationBar.types';\r\n\r\nexport const getStyles = (props: INotificationBarStyleProps): INotificationBarStyles => {\r\n const { theme } = props;\r\n\r\n return {\r\n root: {\r\n },\r\n subComponentStyles: {\r\n messageBar: {\r\n root: {\r\n marginBottom: theme.spacing.s1,\r\n selectors: {\r\n '&:last-child': {\r\n marginBottom: 0\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n};\r\n","import { styled } from '@fluentui/react';\r\nimport { NotificationBarBase } from './NotificationBar.base';\r\nimport { getStyles } from './NotificationBar.styles';\r\nimport { INotificationBarProps, INotificationBarStyleProps, INotificationBarStyles } from './NotificationBar.types';\r\n\r\nexport const NotificationBar = styled<INotificationBarProps, INotificationBarStyleProps, INotificationBarStyles>(\r\n NotificationBarBase,\r\n getStyles,\r\n undefined,\r\n {\r\n scope: 'NotificationBar',\r\n }\r\n);\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n applyFilterButtonLabel: {\r\n id:'gridFilter.filterSelectionCallout.apply',\r\n defaultMessage: 'Apply'\r\n },\r\n filterSelectionTextBoxErrorMessage: {\r\n id:'gridFilter.filterSelectionCallout.TextBoxErrorMessage',\r\n defaultMessage: 'Field requires numerical value'\r\n },\r\n filtersTitle: {\r\n id:'gridFilter.filtersTitle',\r\n defaultMessage: 'Filters'\r\n },\r\n filterListAriaDescription: {\r\n id: 'gridFilter.filterListAriaDescription',\r\n defaultMessage: 'Click on list item to view or edit filter'\r\n },\r\n appliedFilterListAriaLabel: {\r\n id: 'gridFilter.appliedFilterListAriaLabel',\r\n defaultMessage: 'Applied filter list',\r\n },\r\n filterMenuAriaLabel: {\r\n id: 'gridFilter.filterMenuAriaLabel',\r\n defaultMessage: 'Filter Menu'\r\n },\r\n removeFilterIconAriaLabel: {\r\n id: 'gridFilter.removeFilterIconAriaLabel',\r\n defaultMessage: 'Remove filter'\r\n },\r\n applyFilterAriaDesc: {\r\n id: 'gridFilter.applyFilterAriaDesc',\r\n defaultMessage: 'Click to apply filter'\r\n },\r\n filterOptionDropdownAriaLabel: {\r\n id: 'gridFilter.filterOptionDropdownAriaLabel',\r\n defaultMessage: 'Filter options'\r\n },\r\n filterTextBoxAriaLabel: {\r\n id: 'gridFilter.filterTextBoxAriaLabel',\r\n defaultMessage: 'Filter value',\r\n },\r\n startDatePlaceholder: {\r\n id:' gridFilter.filterSelectionCallout.startDatePlaceholder',\r\n defaultMessage: 'Select start date...'\r\n },\r\n endDatePlaceholder: {\r\n id:'gridFilter.filterSelectionCallout.endDatePlaceholder',\r\n defaultMessage: 'Select end date...'\r\n },\r\n equals: {\r\n id:'gridFilter.filterConditionStrings.equals',\r\n defaultMessage: 'equals'\r\n },\r\n doesNotEqual: {\r\n id:'gridFilter.filterConditionStrings.doesNotEqual',\r\n defaultMessage: 'does not equal'\r\n },\r\n greaterThan: {\r\n id:'gridFilter.filterConditionStrings.greaterThan',\r\n defaultMessage: 'greater than'\r\n },\r\n greaterThanEqual: {\r\n id:'gridFilter.filterConditionStrings.greaterThanEqual',\r\n defaultMessage: 'greater than or equals'\r\n },\r\n lessThan: {\r\n id:'gridFilter.filterConditionStrings.lessThan',\r\n defaultMessage: 'less than'\r\n },\r\n lessThanEqual: {\r\n id:'gridFilter.filterConditionStrings.lessThanEqual',\r\n defaultMessage: 'less than or equals'\r\n },\r\n contains: {\r\n id:'gridFilter.filterConditionStrings.contains',\r\n defaultMessage: 'contains'\r\n },\r\n doesNotContain: {\r\n id:'gridFilter.filterConditionStrings.doesNotContain',\r\n defaultMessage: 'does not contain'\r\n },\r\n beginsWith: {\r\n id:'gridFilter.filterConditionStrings.beginsWith',\r\n defaultMessage: 'begins with'\r\n },\r\n endsWith: {\r\n id:'gridFilter.filterConditionStrings.endsWith',\r\n defaultMessage: 'ends with'\r\n }\r\n});","import { IPubcenterSpacing } from '../../../theme';\r\nimport { IGridFilterStyleProps, IGridFilterStyles } from './GridFilter.types';\r\n\r\nexport const getStyles = (props: IGridFilterStyleProps): IGridFilterStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return {\r\n root: ['ms-GridFilter'],\r\n filterBarFocused: {\r\n backgroundColor: theme.palette.neutralLighter,\r\n display: 'flex',\r\n marginBottom: spacing.size16,\r\n position: 'relative',\r\n },\r\n filterBarUnFocused: {\r\n marginBottom: spacing.size16,\r\n marginLeft: spacing.size24,\r\n display: 'flex',\r\n flexDirection: 'row',\r\n overflow: 'hidden',\r\n },\r\n filterInfoContainer: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n backgroundColor: theme.palette.neutralSecondary,\r\n margin: '8px 0 8px 16px',\r\n height: 28,\r\n borderRadius: '2px',\r\n color: theme.palette.white,\r\n cursor: 'pointer',\r\n },\r\n highlightedFilterInfoContainer: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n backgroundColor: theme.palette.themePrimary,\r\n margin: '8px 0 8px 16px',\r\n height: 28,\r\n borderRadius: '2px',\r\n color: theme.palette.white,\r\n cursor: 'pointer',\r\n },\r\n filterInfoFocused: {\r\n fontSize: theme.fonts.medium.fontSize,\r\n alignContent: 'center',\r\n padding: '4px 16px',\r\n lineHeight: '19px',\r\n display: 'inline-block',\r\n },\r\n filterInfoSelectors: {\r\n selectors: {\r\n '&:focus, &:hover': {\r\n backgroundColor: theme.palette.neutralPrimaryAlt,\r\n },\r\n },\r\n },\r\n highlightedFilterInfoSelectors: {\r\n selectors: {\r\n '&:focus, &:hover': {\r\n backgroundColor: theme.palette.themeDark,\r\n },\r\n },\r\n },\r\n filterCloseIcon: {\r\n width: 12,\r\n padding: spacing.size8,\r\n },\r\n filterIcon: {\r\n padding: '5px 4px',\r\n color: theme.palette.themePrimary,\r\n },\r\n filterInfoUnfocused: {\r\n color: theme.palette.themePrimary,\r\n textAlign: 'center',\r\n verticalAlign: 'center',\r\n cursor: 'pointer',\r\n padding: '3px 4px',\r\n },\r\n filterMenuListItem: {\r\n fontSize: theme.fonts.medium.fontSize,\r\n padding: spacing.size8,\r\n selectors: {\r\n '&:focus, &:hover': {\r\n backgroundColor: theme.palette.neutralLighter,\r\n },\r\n },\r\n cursor: 'pointer',\r\n },\r\n filterSelectionCallout: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n padding: spacing.size16,\r\n },\r\n filterSelectionCalloutTitle: {\r\n lineHeight: '28px',\r\n textAlign: 'left',\r\n fontSize: theme.fonts.large.fontSize,\r\n marginBottom: spacing.size8,\r\n },\r\n filterSelectionToolBar: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n },\r\n filterSelectionApplyButton: {\r\n marginRight: spacing.size16,\r\n backgroundColor: theme.palette.themePrimary,\r\n borderColor: theme.palette.white,\r\n color: theme.palette.white,\r\n borderRadius: '2px',\r\n selectors: {\r\n '&:focus, &:hover': {\r\n backgroundColor: theme.palette.themeDarkAlt,\r\n color: theme.palette.white,\r\n },\r\n },\r\n },\r\n filterSelectionCancelButton: {\r\n selectors: {\r\n '&:focus, &:hover': {\r\n backgroundColor: theme.palette.neutralLighter,\r\n },\r\n },\r\n },\r\n disabledApplyButton: {\r\n marginRight: spacing.size16,\r\n backgroundColor: theme.palette.neutralQuaternaryAlt,\r\n borderColor: theme.palette.white,\r\n borderRadius: '2px',\r\n },\r\n viewAllButton: {\r\n color: theme.palette.themePrimary,\r\n textDecoration: 'underline',\r\n display: 'flex run-in',\r\n height: 24,\r\n width: 80,\r\n },\r\n clearAllButton: {\r\n color: theme.palette.themePrimary,\r\n textDecoration: 'underline',\r\n display: 'flex run-in',\r\n height: 24,\r\n width: 80,\r\n top: 10,\r\n },\r\n filterSummaryCallout: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n padding: '5px 5px 16px 24px',\r\n minWidth: 180,\r\n },\r\n calloutCloseIcon: {\r\n marginTop: '1px',\r\n padding: spacing.size4,\r\n cursor: 'pointer',\r\n position: 'absolute',\r\n right: '2px',\r\n color: theme.palette.black,\r\n selectors: {\r\n '&:focus, &:hover': {\r\n backgroundColor: theme.palette.neutralLighter,\r\n color: theme.palette.black,\r\n },\r\n },\r\n },\r\n filterSummaryCalloutHeader: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n },\r\n filterInfoSummaryItem: {\r\n color: theme.palette.themePrimary,\r\n verticalAlign: 'center',\r\n cursor: 'pointer',\r\n padding: '3px 20px 3px 4px',\r\n },\r\n filterSummaryCalloutTitle: {\r\n lineHeight: '20px',\r\n textAlign: 'left',\r\n fontSize: theme.fonts.large.fontSize,\r\n marginTop: spacing.size12,\r\n marginBottom: spacing.size4,\r\n },\r\n filterListPageStyle: {\r\n display: 'flex',\r\n flexFlow: 'row wrap',\r\n },\r\n subComponentStyles: {\r\n iconButton: {\r\n root: [\r\n 'ms-font-m',\r\n {\r\n color: theme.palette.white,\r\n },\r\n ],\r\n },\r\n },\r\n };\r\n};\r\n","import {\r\n ActionButton,\r\n BaseComponent,\r\n Callout,\r\n Checkbox,\r\n DatePicker,\r\n DefaultButton,\r\n DirectionalHint,\r\n Dropdown,\r\n FocusZone,\r\n FocusZoneDirection,\r\n IDropdownOption,\r\n IProcessedStyleSet,\r\n Icon,\r\n IconButton,\r\n Label,\r\n TextField,\r\n classNamesFunction,\r\n css,\r\n elementContains,\r\n focusFirstChild,\r\n getDocument,\r\n getId,\r\n getWindow,\r\n on,\r\n} from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { FilterCondition } from '../../@data/store/schema/enums/FilterCondition';\r\nimport appMessages from '../../App.messages';\r\nimport { IFilterItem } from '../../layout/GridPageV2';\r\nimport { isButtonPressKey } from '../../utils/AccessibilityUtils';\r\nimport { getScreenReaderTextStyles } from '../../utils/GlobalStyleUtils';\r\nimport { DayPickerStrings } from '../DateTimePicker/DateTimePicker.types';\r\nimport { FormItem } from '../Form';\r\nimport messages from './GridFilter.messages';\r\nimport { getStyles } from './GridFilter.styles';\r\nimport { FilterType, IFilterDetails, IGridFilterProps, IGridFilterStyleProps, IGridFilterStyles } from './GridFilter.types';\r\n\r\nexport interface IGridFilterState {\r\n isFilterBarFocused: boolean;\r\n isFilterBeingModified: boolean;\r\n filterMenuCalloutOpen: boolean;\r\n filterSelectionCalloutOpen: boolean;\r\n filterSummaryCalloutOpen: boolean;\r\n appliedFilterList: IFilterDetails[];\r\n filterSelectionCalloutTarget?: string;\r\n filterSelectionColumn?: IFilterDetails;\r\n textBoxErrorMessage?: string;\r\n}\r\n\r\nconst getClassNames = classNamesFunction<IGridFilterStyleProps, IGridFilterStyles>();\r\n\r\nexport class GridFilterBase extends BaseComponent<IGridFilterProps, IGridFilterState> {\r\n private _classNames: IProcessedStyleSet<IGridFilterStyles> = getClassNames(getStyles, { theme: this.props.theme! });\r\n private _gridFilter = React.createRef<HTMLDivElement>();\r\n private _tempDisposables: (() => void)[] = [];\r\n private _filterListContainer = React.createRef<HTMLDivElement>();\r\n\r\n constructor(props: IGridFilterProps) {\r\n super(props);\r\n\r\n this.state = {\r\n isFilterBarFocused: false,\r\n isFilterBeingModified: false,\r\n filterMenuCalloutOpen: false,\r\n filterSelectionCalloutOpen: false,\r\n filterSummaryCalloutOpen: false,\r\n appliedFilterList: this.props.initialFilterListValues || [],\r\n // showClearAll: this.props.showClearAll,\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n this._addListeners();\r\n }\r\n\r\n public componentDidUpdate(prevProps: IGridFilterProps) {\r\n if (prevProps === this.props) {\r\n return;\r\n }\r\n\r\n if (this.props.hideCallout) {\r\n this.setState({ appliedFilterList: this.props.initialFilterListValues ?? [] });\r\n } else if (this.state.appliedFilterList.length === 0) {\r\n this.setState({ appliedFilterList: this.props.initialFilterListValues ?? [] });\r\n } else {\r\n this.setState({ appliedFilterList: this.state.appliedFilterList });\r\n }\r\n\r\n this.setState({\r\n filterMenuCalloutOpen: this.props.filterMenuCalloutOpen !== undefined ? this.props.filterMenuCalloutOpen : false,\r\n });\r\n }\r\n\r\n public componentWillUnmount() {\r\n this._async.dispose();\r\n this._tempDisposables.forEach((dispose: () => void) => dispose());\r\n }\r\n\r\n public resetGridFilter() {\r\n this.setState({\r\n isFilterBarFocused: false,\r\n isFilterBeingModified: false,\r\n filterMenuCalloutOpen: false,\r\n filterSelectionCalloutOpen: false,\r\n filterSummaryCalloutOpen: false,\r\n appliedFilterList: [],\r\n });\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n appliedFilterList,\r\n isFilterBarFocused,\r\n filterSelectionCalloutOpen,\r\n filterSelectionColumn,\r\n filterSummaryCalloutOpen,\r\n } = this.state;\r\n\r\n return (\r\n <div ref={this._gridFilter} className={this._classNames.root}>\r\n {this.state.filterMenuCalloutOpen && this._renderFilterMenuCallout()}\r\n {filterSelectionCalloutOpen && filterSelectionColumn && !this.props.hideCallout && this._renderFilterSelectionCallout()}\r\n {filterSummaryCalloutOpen && this._renderFilterSummaryCallout()}\r\n {appliedFilterList.length > 0\r\n ? isFilterBarFocused\r\n ? this._renderAppliedFiltersFocusedList()\r\n : this._renderAppliedFiltersUnfocusedList()\r\n : null}\r\n <span id=\"filterListAriaDescription\" style={getScreenReaderTextStyles()}>\r\n {this.props.intl.formatMessage(messages.filterListAriaDescription)}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n private _renderAppliedFiltersFocusedList = (): JSX.Element => {\r\n const { appliedFilterList, isFilterBeingModified, filterSelectionColumn } = this.state;\r\n\r\n return (\r\n <div ref={this._filterListContainer} id={'appliedFilterFocusedList'} className={this._classNames.filterBarFocused}>\r\n <FocusZone\r\n className={this._classNames.filterListPageStyle}\r\n direction={FocusZoneDirection.horizontal}\r\n isCircularNavigation={true}\r\n aria-label={this.props.intl.formatMessage(messages.appliedFilterListAriaLabel)}\r\n aria-describedby=\"filterListAriaDescription\"\r\n role=\"list\"\r\n >\r\n {appliedFilterList.map((fil: IFilterDetails, index: number) => {\r\n const applyModifyFilterStyles: boolean =\r\n filterSelectionColumn && isFilterBeingModified && fil.filterId === filterSelectionColumn.filterId ? true : false;\r\n\r\n return (\r\n <div\r\n className={applyModifyFilterStyles ? this._classNames.highlightedFilterInfoContainer : this._classNames.filterInfoContainer}\r\n id={fil.filterId}\r\n key={'filterFocusedList-' + index}\r\n data-list-index={index}\r\n role=\"listitem\"\r\n >\r\n <div\r\n className={css(\r\n this._classNames.filterInfoFocused,\r\n applyModifyFilterStyles ? this._classNames.highlightedFilterInfoSelectors : this._classNames.filterInfoSelectors\r\n )}\r\n onClick={this._onFilterInfoFocusedClicked}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key) && this._onFilterInfoFocusedClicked(ev)}\r\n role=\"button\"\r\n tabIndex={0}\r\n data-is-focusable={true}\r\n >\r\n {fil.filterType === FilterType.custom\r\n ? `${fil.filterName}: ${fil.filterCondition}`\r\n : fil.filterType === FilterType.date\r\n ? `${fil.filterName}${fil.startDate ? ' from ' + fil.startDate.toLocaleDateString() : ''}${\r\n fil.endDate ? ' to ' + fil.endDate.toLocaleDateString() : ''\r\n }`\r\n : `${fil.filterName} ${fil.filterCondition} ${fil.filterText}`}\r\n {fil.includeNulls ? ` ${fil.showNullsCheckboxLabel}` : ''}\r\n </div>\r\n <div\r\n className={css(\r\n this._classNames.filterCloseIcon,\r\n applyModifyFilterStyles ? this._classNames.highlightedFilterInfoSelectors : this._classNames.filterInfoSelectors\r\n )}\r\n onClick={(ev) => {\r\n this._onFilterRemoveButtonClicked(ev);\r\n if (this.props.hideCallout) {\r\n if (fil.filterName && fil.filterCondition && fil.filterText) {\r\n const filterCondition = Object.values(FilterCondition).find((v) => v === fil.filterCondition);\r\n if (filterCondition && this.props.onDeleteTextCondition) {\r\n this.props.onDeleteTextCondition(fil.filterName, filterCondition, fil.filterText);\r\n }\r\n } else if (fil.filterName && fil.filterText && this.props.onListValueChanged) {\r\n this.props.onListValueChanged(fil.filterName, fil.filterText);\r\n }\r\n }\r\n }}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key) && this._onFilterRemoveButtonClicked(ev)}\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-label={this.props.intl.formatMessage(messages.removeFilterIconAriaLabel)}\r\n data-is-focusable={true}\r\n >\r\n <Icon iconName=\"Cancel\" />\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </FocusZone>\r\n {this.props.showClearAll && appliedFilterList.length > 0 ? (\r\n <ActionButton\r\n className={this._classNames.clearAllButton}\r\n id={'clearAllButton'}\r\n onClick={(_) => {\r\n if (this.props.onClearAll) {\r\n this.props.onClearAll();\r\n }\r\n }}\r\n >\r\n {'Clear all'}\r\n </ActionButton>\r\n ) : null}\r\n </div>\r\n );\r\n };\r\n\r\n private _renderAppliedFiltersUnfocusedList = (): JSX.Element => {\r\n const { appliedFilterList } = this.state;\r\n\r\n return (\r\n <div id={'appliedFilterUnfocusedList'} className={this._classNames.filterBarUnFocused}>\r\n <Icon className={this._classNames.filterIcon} iconName=\"Filter\" />\r\n <FocusZone\r\n className={this._classNames.filterListPageStyle}\r\n direction={FocusZoneDirection.horizontal}\r\n isCircularNavigation={true}\r\n aria-label={this.props.intl.formatMessage(messages.appliedFilterListAriaLabel)}\r\n aria-describedby=\"filterListAriaDescription\"\r\n >\r\n {appliedFilterList.map((fil: IFilterDetails, index: number) => (\r\n <div\r\n className={this._classNames.filterInfoUnfocused}\r\n key={'appliedFilterUnfocusedList' + index}\r\n onClick={this._onFilterInfoUnfocusedClicked}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key) && this._onFilterInfoUnfocusedClicked(ev)}\r\n role=\"button\"\r\n tabIndex={0}\r\n data-list-index={index}\r\n data-is-focusable={true}\r\n >\r\n {fil.filterType === FilterType.custom\r\n ? `${fil.filterName}: ${fil.filterCondition}`\r\n : fil.filterType === FilterType.date\r\n ? `${fil.filterName}${fil.startDate ? ' from ' + fil.startDate.toLocaleDateString() : ''}${\r\n fil.endDate ? ' to ' + fil.endDate.toLocaleDateString() : ''\r\n }`\r\n : `${fil.filterName} ${fil.filterCondition} ${fil.filterText}`}\r\n {fil.includeNulls ? ` ${fil.showNullsCheckboxLabel}` : ''}\r\n {index !== appliedFilterList.length - 1 ? ';' : ''}\r\n </div>\r\n ))}\r\n </FocusZone>\r\n {/* {appliedFilterList.length >= 4 ? (\r\n <ActionButton\r\n className={this._classNames.viewAllButton}\r\n id={'viewAllButton'}\r\n onClick={(_) => this.setState({ filterSummaryCalloutOpen: true })}\r\n >\r\n {'View all'}\r\n </ActionButton>\r\n ) : null} */}\r\n </div>\r\n );\r\n };\r\n\r\n private _renderFilterMenuCallout = (): JSX.Element => {\r\n return (\r\n <Callout\r\n id=\"filterMenuDialog\"\r\n target={'#addFilterButton'}\r\n isBeakVisible={false}\r\n calloutWidth={180}\r\n directionalHint={DirectionalHint.bottomLeftEdge}\r\n onDismiss={() => {\r\n this.setState({ filterMenuCalloutOpen: false });\r\n this.props.onFilterMenuCalloutClose();\r\n }}\r\n setInitialFocus={true}\r\n role=\"dialog\"\r\n shouldRestoreFocus={true}\r\n onKeyDown={(ev: React.KeyboardEvent<HTMLDivElement>) => {\r\n if (ev.key === 'Tab' || (ev.shiftKey && ev.key === 'Tab')) {\r\n this.setState({ filterMenuCalloutOpen: false });\r\n this.props.onFilterMenuCalloutClose();\r\n }\r\n }}\r\n >\r\n <FocusZone\r\n role=\"listbox\"\r\n direction={FocusZoneDirection.vertical}\r\n isCircularNavigation={true}\r\n aria-label={this.props.intl.formatMessage(messages.filterMenuAriaLabel)}\r\n >\r\n {this.props.filterItems.map((col: IFilterItem, index: number) => (\r\n <div\r\n className={this._classNames.filterMenuListItem}\r\n id={`gridFilterMenuItem-${index}`}\r\n key={`gridFilterMenuItem-${index}`}\r\n onClick={this._onFilterMenuItemClicked}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key) && this._onFilterMenuItemClicked(ev)}\r\n role=\"option\"\r\n aria-selected={false}\r\n tabIndex={0}\r\n data-list-index={index}\r\n data-is-focusable={true}\r\n >\r\n {col.filterName}\r\n </div>\r\n ))}\r\n </FocusZone>\r\n </Callout>\r\n );\r\n };\r\n\r\n private _renderFilterSelectionCallout = (): JSX.Element => {\r\n const { formatMessage } = this.props.intl;\r\n const {\r\n filterSelectionColumn,\r\n filterSelectionCalloutTarget,\r\n textBoxErrorMessage,\r\n isFilterBeingModified,\r\n appliedFilterList,\r\n } = this.state;\r\n\r\n const relationalFilterOptions: IDropdownOption[] = [\r\n { key: FilterCondition.Equals, text: formatMessage(messages.equals) },\r\n { key: FilterCondition.DoesNotEqual, text: formatMessage(messages.doesNotEqual) },\r\n { key: FilterCondition.GreaterThan, text: formatMessage(messages.greaterThan) },\r\n { key: FilterCondition.GreaterThanEqual, text: formatMessage(messages.greaterThanEqual) },\r\n { key: FilterCondition.LessThan, text: formatMessage(messages.lessThan) },\r\n { key: FilterCondition.LessThanEqual, text: formatMessage(messages.lessThanEqual) },\r\n ];\r\n\r\n const stringFilterTypeOptions: IDropdownOption[] = [\r\n { key: FilterCondition.Contains, text: formatMessage(messages.contains) },\r\n { key: FilterCondition.DoesNotContain, text: formatMessage(messages.doesNotContain) },\r\n { key: FilterCondition.BeginsWith, text: formatMessage(messages.beginsWith) },\r\n { key: FilterCondition.EndsWith, text: formatMessage(messages.endsWith) },\r\n { key: FilterCondition.Equals, text: formatMessage(messages.equals) },\r\n { key: FilterCondition.DoesNotEqual, text: formatMessage(messages.doesNotEqual) },\r\n ];\r\n\r\n let filterOptions: IDropdownOption[] = [];\r\n\r\n if (filterSelectionColumn) {\r\n switch (filterSelectionColumn.filterType) {\r\n case FilterType.relational:\r\n filterOptions = relationalFilterOptions;\r\n break;\r\n case FilterType.string:\r\n filterOptions = stringFilterTypeOptions;\r\n break;\r\n case FilterType.custom:\r\n filterOptions = filterSelectionColumn.filterOptions || [];\r\n break;\r\n default:\r\n filterOptions = [];\r\n }\r\n\r\n if (!filterSelectionColumn.filterCondition) {\r\n filterSelectionColumn.filterCondition = filterOptions.length > 0 ? filterOptions[0].key.toString() : undefined;\r\n }\r\n }\r\n\r\n const applyButtonDisabled: boolean =\r\n filterSelectionColumn !== undefined &&\r\n filterSelectionColumn.filterType !== FilterType.custom &&\r\n !filterSelectionColumn.filterText &&\r\n !filterSelectionColumn.startDate &&\r\n !filterSelectionColumn.endDate &&\r\n !filterSelectionColumn.includeNulls;\r\n\r\n return (\r\n <>\r\n <Callout\r\n target={filterSelectionCalloutTarget && isFilterBeingModified ? filterSelectionCalloutTarget : '#addFilterButton'}\r\n isBeakVisible={false}\r\n calloutWidth={212}\r\n directionalHint={DirectionalHint.bottomLeftEdge}\r\n setInitialFocus={true}\r\n role=\"dialog\"\r\n ariaLabelledBy=\"filterSelDialogLabel\"\r\n shouldRestoreFocus={true}\r\n onDismiss={(ev) => {\r\n if (!ev) {\r\n return;\r\n }\r\n // if target clicks on another filterInfo then no action required.\r\n const target = ev.target as HTMLElement;\r\n const isTargetOutsideGridFilter = this._gridFilter.current && !elementContains(this._gridFilter.current, target);\r\n const isTargetInsideFilterContainer = this._filterListContainer.current && this._filterListContainer.current === target;\r\n if (isTargetOutsideGridFilter || isTargetInsideFilterContainer || ('key' in ev && ev.key === 'Escape')) {\r\n this.setState({\r\n appliedFilterList: [...appliedFilterList],\r\n filterSelectionCalloutOpen: false,\r\n isFilterBeingModified: false,\r\n });\r\n }\r\n }}\r\n >\r\n {filterSelectionColumn ? (\r\n <div className={this._classNames.filterSelectionCallout}>\r\n <Label id=\"filterSelDialogLabel\" className={this._classNames.filterSelectionCalloutTitle}>\r\n {filterSelectionColumn.filterName}\r\n </Label>\r\n\r\n {filterSelectionColumn.filterType !== FilterType.date ? (\r\n <>\r\n <FormItem formWidth={180}>\r\n <Dropdown\r\n options={filterOptions}\r\n defaultSelectedKey={filterSelectionColumn.filterCondition}\r\n onChange={(_, option) => {\r\n if (option) {\r\n filterSelectionColumn.filterCondition = option.key.toString();\r\n this.setState({ filterSelectionColumn: { ...filterSelectionColumn } });\r\n }\r\n }}\r\n ariaLabel={\r\n filterSelectionColumn.filterType === FilterType.custom\r\n ? formatMessage(messages.filterTextBoxAriaLabel)\r\n : formatMessage(messages.filterOptionDropdownAriaLabel)\r\n }\r\n />\r\n </FormItem>\r\n\r\n {filterSelectionColumn.filterType !== FilterType.custom ? (\r\n <FormItem formWidth={180}>\r\n <TextField\r\n errorMessage={textBoxErrorMessage}\r\n value={filterSelectionColumn.filterText}\r\n placeholder={formatMessage(messages.filterTextBoxAriaLabel)}\r\n onChange={(_, filter) => {\r\n if (filterSelectionColumn) {\r\n filterSelectionColumn.filterText = filter;\r\n\r\n let errorMessage: string | undefined = undefined;\r\n if (filter && filterSelectionColumn.filterType === FilterType.relational && isNaN(Number(filter))) {\r\n errorMessage = formatMessage(messages.filterSelectionTextBoxErrorMessage);\r\n }\r\n this.setState({ filterSelectionColumn: { ...filterSelectionColumn }, textBoxErrorMessage: errorMessage });\r\n }\r\n }}\r\n />\r\n </FormItem>\r\n ) : null}\r\n </>\r\n ) : (\r\n <>\r\n <FormItem formWidth={180}>\r\n <DatePicker\r\n strings={DayPickerStrings}\r\n allowTextInput={true}\r\n placeholder={formatMessage(messages.startDatePlaceholder)}\r\n value={filterSelectionColumn.startDate}\r\n maxDate={filterSelectionColumn.endDate || new Date(Date.now())}\r\n onSelectDate={(value) => {\r\n filterSelectionColumn.startDate = value!;\r\n this.setState({ filterSelectionColumn: filterSelectionColumn });\r\n }}\r\n disabled={filterSelectionColumn.includeNulls === true}\r\n />\r\n </FormItem>\r\n <FormItem formWidth={180}>\r\n <DatePicker\r\n strings={DayPickerStrings}\r\n allowTextInput={true}\r\n placeholder={formatMessage(messages.endDatePlaceholder)}\r\n maxDate={new Date(Date.now())}\r\n minDate={filterSelectionColumn.startDate}\r\n value={filterSelectionColumn.endDate}\r\n onSelectDate={(value) => {\r\n filterSelectionColumn.endDate = value!;\r\n this.setState({ filterSelectionColumn: filterSelectionColumn });\r\n }}\r\n disabled={filterSelectionColumn.includeNulls === true}\r\n />\r\n </FormItem>\r\n </>\r\n )}\r\n\r\n {filterSelectionColumn.showNullsCheckboxLabel ? (\r\n <FormItem formWidth={180}>\r\n <Checkbox\r\n label={filterSelectionColumn.showNullsCheckboxLabel}\r\n checked={filterSelectionColumn.includeNulls === undefined ? false : filterSelectionColumn.includeNulls}\r\n onChange={(_, checked) => {\r\n filterSelectionColumn.includeNulls = checked;\r\n this.setState({ filterSelectionColumn: filterSelectionColumn });\r\n }}\r\n disabled={!!(filterSelectionColumn.startDate || filterSelectionColumn.endDate)}\r\n />\r\n </FormItem>\r\n ) : null}\r\n\r\n <div className={this._classNames.filterSelectionToolBar}>\r\n <DefaultButton\r\n className={!applyButtonDisabled ? this._classNames.filterSelectionApplyButton : this._classNames.disabledApplyButton}\r\n text={formatMessage(messages.applyFilterButtonLabel)}\r\n disabled={applyButtonDisabled}\r\n ariaHidden={applyButtonDisabled}\r\n ariaDescription={formatMessage(messages.applyFilterAriaDesc)}\r\n onClick={(ev: React.MouseEvent<HTMLDivElement>) => {\r\n return isFilterBeingModified\r\n ? this._onFilterModified(ev, filterSelectionCalloutTarget)\r\n : this._onFilterApplyButtonClicked(ev);\r\n }}\r\n />\r\n <DefaultButton\r\n className={this._classNames.filterSelectionCancelButton}\r\n text={formatMessage(appMessages.cancel)}\r\n onClick={() => {\r\n this.setState({\r\n filterSelectionCalloutOpen: false,\r\n isFilterBeingModified: false,\r\n appliedFilterList: [...appliedFilterList],\r\n });\r\n // here in the condition when the filter is clicked from a link which is not focussed,\r\n // we need to get the focused list element from the DOM and return the focus on it\r\n const target = getDocument()!.querySelector(this.state.filterSelectionCalloutTarget!) as HTMLElement;\r\n focusFirstChild(target);\r\n }}\r\n onKeyDown={(ev) => {\r\n // applied on the cancel button as it's last active item on the callout\r\n if (ev.key === 'Tab' && !ev.shiftKey) {\r\n this.setState({\r\n filterSelectionCalloutOpen: false,\r\n isFilterBeingModified: false,\r\n appliedFilterList: [...appliedFilterList],\r\n });\r\n }\r\n }}\r\n />\r\n </div>\r\n </div>\r\n ) : null}\r\n </Callout>\r\n </>\r\n );\r\n };\r\n\r\n private _renderFilterSummaryCallout = (): JSX.Element => {\r\n const { appliedFilterList } = this.state;\r\n\r\n return (\r\n <Callout\r\n className={this._classNames.filterSummaryCallout}\r\n target={'#viewAllButton'}\r\n ariaLabelledBy=\"viewAllDailogLabel\"\r\n role=\"dialog\"\r\n directionalHint={DirectionalHint.rightCenter}\r\n setInitialFocus={true}\r\n shouldRestoreFocus={true}\r\n onDismiss={() => this.setState({ filterSummaryCalloutOpen: false })}\r\n >\r\n <div className={this._classNames.filterSummaryCalloutHeader}>\r\n <Label id=\"viewAllDailogLabel\" className={this._classNames.filterSummaryCalloutTitle}>\r\n {this.props.intl.formatMessage(messages.filtersTitle)}\r\n </Label>\r\n <IconButton\r\n className={this._classNames.calloutCloseIcon}\r\n iconProps={{ iconName: 'Cancel' }}\r\n onClick={(_) => this.setState({ filterSummaryCalloutOpen: false })}\r\n tabIndex={0}\r\n onKeyDown={(ev: React.KeyboardEvent<HTMLDivElement>) => {\r\n // To make sure shift + Tab focuses on the previous element in the tab order,\r\n // which will be taken care if callout is dismissed\r\n if ((ev.shiftKey && ev.key === 'Tab') || ev.key === 'Enter ' || ev.key === ' ') {\r\n this.setState({ filterSummaryCalloutOpen: false });\r\n }\r\n }}\r\n />\r\n </div>\r\n\r\n <FocusZone\r\n role=\"list\"\r\n direction={FocusZoneDirection.vertical}\r\n isCircularNavigation={true}\r\n aria-describedby=\"filterListAriaDescription\"\r\n >\r\n {appliedFilterList.map((fil: IFilterDetails, index: number) => (\r\n <div\r\n className={this._classNames.filterInfoSummaryItem}\r\n id={`gridFilterSummary-${index}`}\r\n key={`gridFilterSummary-${index}`}\r\n onClick={(ev) => {\r\n this.setState({ filterSummaryCalloutOpen: false });\r\n this._onFilterInfoUnfocusedClicked(ev);\r\n }}\r\n onKeyDown={(ev: React.KeyboardEvent<HTMLDivElement>) => {\r\n // Dismiss the callout if tab key is pressed, so that focus is moved to next element in the tab order\r\n if (ev.key === 'Tab' && !ev.shiftKey) {\r\n this.setState({ filterSummaryCalloutOpen: false });\r\n }\r\n if (isButtonPressKey(ev.key)) {\r\n this.setState({ filterSummaryCalloutOpen: false });\r\n this._onFilterInfoUnfocusedClicked(ev);\r\n }\r\n }}\r\n role=\"button\"\r\n tabIndex={0}\r\n data-is-focusable={true}\r\n data-list-index={index}\r\n >\r\n {fil.filterType === FilterType.custom\r\n ? `${fil.filterName}: ${fil.filterCondition}`\r\n : fil.filterType === FilterType.date\r\n ? `${fil.filterName}${fil.startDate ? ' from ' + fil.startDate.toLocaleDateString() : ''}${\r\n fil.endDate ? ' to ' + fil.endDate.toLocaleDateString() : ''\r\n }`\r\n : `${fil.filterName} ${fil.filterCondition} ${fil.filterText}`}\r\n {fil.includeNulls ? ` ${fil.showNullsCheckboxLabel}` : ''}\r\n </div>\r\n ))}\r\n </FocusZone>\r\n </Callout>\r\n );\r\n };\r\n\r\n private _onFilterMenuItemClicked = (ev: React.MouseEvent<HTMLDivElement, MouseEvent> | React.KeyboardEvent<HTMLDivElement>): void => {\r\n const index = this._getIndexOfElement(ev);\r\n\r\n if (index !== undefined) {\r\n const { filterItems } = this.props;\r\n const filterItem = filterItems[index];\r\n\r\n if (filterItem) {\r\n const filterSelectionColumn: IFilterDetails = {\r\n filterId: this._getFilterContainerId(filterItem),\r\n filterType: filterItem.filterType || FilterType.string,\r\n filterOptions: filterItem.filterOptions,\r\n columnName: filterItem.columnName,\r\n filterName: filterItem.filterName,\r\n customFunction: filterItem.customFunction,\r\n includeNulls: filterItem.includeNullsInFilterResults,\r\n showNullsCheckboxLabel: filterItem.showNullsCheckboxLabel,\r\n };\r\n\r\n this.setState({\r\n filterMenuCalloutOpen: false,\r\n filterSelectionCalloutOpen: true,\r\n filterSelectionColumn: filterSelectionColumn,\r\n });\r\n }\r\n this.props.onFilterMenuCalloutClose();\r\n }\r\n };\r\n\r\n private _onFilterApplyButtonClicked = (ev: React.MouseEvent<HTMLDivElement> | React.KeyboardEvent<HTMLDivElement>): void => {\r\n const { appliedFilterList, filterSelectionColumn } = this.state;\r\n const isFilterUnique = this._isFilterUnique(filterSelectionColumn);\r\n\r\n if (filterSelectionColumn && isFilterUnique) {\r\n appliedFilterList.push(filterSelectionColumn);\r\n\r\n this.setState({\r\n appliedFilterList: [...appliedFilterList],\r\n filterSelectionCalloutOpen: false,\r\n isFilterBarFocused: true,\r\n isFilterBeingModified: false,\r\n });\r\n\r\n this.props.onFilterApplied(appliedFilterList);\r\n return;\r\n }\r\n\r\n // if filter is not unique then open the existing filter\r\n // updating appliedFilterList so that list is re-rendered\r\n if (filterSelectionColumn && !isFilterUnique) {\r\n this.setState({\r\n appliedFilterList: [...appliedFilterList],\r\n isFilterBarFocused: true,\r\n isFilterBeingModified: true,\r\n filterSelectionCalloutOpen: true,\r\n filterSelectionCalloutTarget: `#${filterSelectionColumn.filterId}`,\r\n });\r\n }\r\n };\r\n\r\n private _isFilterUnique = (fil: IFilterDetails | undefined): boolean => {\r\n const { appliedFilterList } = this.state;\r\n\r\n if (!fil) {\r\n return false;\r\n }\r\n\r\n switch (fil.filterType) {\r\n case FilterType.string:\r\n case FilterType.relational: {\r\n return appliedFilterList.filter(\r\n (f) => f.columnName === fil.columnName && f.filterCondition === fil.filterCondition && f.filterText === fil.filterText\r\n ).length > 0\r\n ? false\r\n : true;\r\n }\r\n\r\n case FilterType.custom:\r\n return appliedFilterList.filter((f) => f.columnName === fil.columnName && f.filterCondition === fil.filterCondition).length > 0\r\n ? false\r\n : true;\r\n\r\n case FilterType.date:\r\n return appliedFilterList.filter(\r\n (f) => f.columnName === fil.columnName && f.startDate === fil.startDate && f.endDate === fil.endDate\r\n ).length > 0\r\n ? false\r\n : true;\r\n default:\r\n return true;\r\n }\r\n };\r\n\r\n private _onFilterModified = (ev: React.MouseEvent<HTMLDivElement>, filterId: string | undefined): void => {\r\n const { appliedFilterList, filterSelectionColumn } = this.state;\r\n\r\n if (filterSelectionColumn && filterId !== undefined) {\r\n filterId = filterId?.slice(1); // to remove # placed at index 0\r\n\r\n const modifyFilter = appliedFilterList.filter((f) => f.filterId === filterId)?.[0];\r\n if (modifyFilter) {\r\n modifyFilter.filterCondition = filterSelectionColumn.filterCondition;\r\n modifyFilter.filterText = filterSelectionColumn.filterText;\r\n modifyFilter.startDate = filterSelectionColumn.startDate;\r\n modifyFilter.endDate = filterSelectionColumn.endDate;\r\n }\r\n\r\n this.setState({\r\n isFilterBeingModified: false,\r\n filterSelectionCalloutOpen: false,\r\n isFilterBarFocused: true,\r\n appliedFilterList: [...appliedFilterList],\r\n });\r\n this.props.onFilterApplied(appliedFilterList);\r\n }\r\n };\r\n\r\n private _onFilterRemoveButtonClicked = (ev: React.MouseEvent<HTMLDivElement, MouseEvent> | React.KeyboardEvent<HTMLDivElement>): void => {\r\n const { appliedFilterList } = this.state;\r\n const index = this._getIndexOfParentElement(ev);\r\n\r\n if (index !== undefined) {\r\n appliedFilterList.splice(index, 1);\r\n\r\n // in cases when user removes the filter when filterSelectionCallout is open for filter edit, dismiss the callout\r\n this.setState({ appliedFilterList: [...appliedFilterList], filterSelectionCalloutOpen: false, isFilterBeingModified: false });\r\n this.props.onFilterApplied(appliedFilterList);\r\n }\r\n };\r\n\r\n private _onFilterInfoFocusedClicked = (ev: React.MouseEvent<HTMLDivElement, MouseEvent> | React.KeyboardEvent<HTMLDivElement>): void => {\r\n const { appliedFilterList } = this.state;\r\n const index = this._getIndexOfParentElement(ev);\r\n\r\n if (index !== undefined) {\r\n const filterCol = appliedFilterList[index];\r\n\r\n // updating appliedFilterList so that List is re-rendered after applying updated state properties\r\n this.setState({\r\n appliedFilterList: [...appliedFilterList],\r\n isFilterBarFocused: true,\r\n isFilterBeingModified: true,\r\n filterSelectionCalloutOpen: true,\r\n filterSelectionColumn: filterCol,\r\n filterSelectionCalloutTarget: `#${filterCol.filterId}`,\r\n });\r\n }\r\n };\r\n\r\n private _onFilterInfoUnfocusedClicked = (\r\n ev: React.MouseEvent<HTMLDivElement, MouseEvent> | React.KeyboardEvent<HTMLDivElement>\r\n ): void => {\r\n const { appliedFilterList } = this.state;\r\n const index = this._getIndexOfElement(ev);\r\n\r\n if (index !== undefined) {\r\n const filterCol = appliedFilterList[index];\r\n\r\n this.setState({\r\n isFilterBarFocused: true,\r\n isFilterBeingModified: true,\r\n filterSelectionCalloutOpen: true,\r\n filterSelectionColumn: filterCol,\r\n filterSelectionCalloutTarget: `#${filterCol.filterId}`,\r\n });\r\n }\r\n };\r\n\r\n private _getIndexOfElement = (\r\n ev: React.MouseEvent<HTMLDivElement, MouseEvent> | React.KeyboardEvent<HTMLDivElement>\r\n ): number | undefined => {\r\n const el = ev.currentTarget as HTMLDivElement;\r\n\r\n if (el.getAttribute('data-list-index')) {\r\n const index = Number(el.getAttribute('data-list-index'));\r\n return index;\r\n }\r\n return undefined;\r\n };\r\n\r\n private _getIndexOfParentElement = (ev: React.MouseEvent<HTMLDivElement> | React.KeyboardEvent<HTMLDivElement>): number | undefined => {\r\n const el = ev.currentTarget.parentElement as HTMLDivElement;\r\n\r\n if (el.getAttribute('data-list-index')) {\r\n const index = Number(el.getAttribute('data-list-index'));\r\n return index;\r\n }\r\n return undefined;\r\n };\r\n\r\n private _addListeners() {\r\n const window = getWindow()!;\r\n\r\n this._async.setTimeout(\r\n () =>\r\n this._tempDisposables.push(\r\n on(window.document.documentElement, 'focus', this._dismissOnLostFocus, true),\r\n on(window.document.documentElement, 'click', this._dismissOnLostFocus, true)\r\n ),\r\n 0\r\n );\r\n }\r\n\r\n private _dismissOnLostFocus = (ev: Event) => {\r\n const target = ev.target as HTMLElement;\r\n const isEventTargetOutsideGridFilter = this._gridFilter.current && !elementContains(this._gridFilter.current, target);\r\n\r\n const currentDoc: Document = getDocument()!;\r\n const addFiltertarget = currentDoc ? (currentDoc.querySelector('#addFilterButton') as HTMLElement) : null;\r\n const isTargetAddFilterButton =\r\n (addFiltertarget && target === addFiltertarget) || elementContains(addFiltertarget, target, true) ? true : false;\r\n\r\n if (isEventTargetOutsideGridFilter && !isTargetAddFilterButton) {\r\n this.setState({ isFilterBarFocused: false });\r\n }\r\n };\r\n\r\n private _getFilterContainerId = (fil?: IFilterItem): string => {\r\n let filterContainerId = fil ? fil.columnName : '';\r\n filterContainerId = getId(filterContainerId);\r\n return filterContainerId;\r\n };\r\n}\r\n","import { styled } from '@fluentui/react';\r\nimport { GridFilterBase } from './GridFilter.base';\r\nimport { getStyles } from './GridFilter.styles';\r\nimport { IGridFilterProps, IGridFilterStyleProps, IGridFilterStyles } from './GridFilter.types';\r\n\r\nexport const GridFilter = styled<IGridFilterProps, IGridFilterStyleProps, IGridFilterStyles>(GridFilterBase, getStyles, undefined, {\r\n scope: 'GridFilter',\r\n});\r\n","import { FontWeights } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../theme';\r\nimport { flexWithAlignCenter } from '../../utils/GlobalStyleUtils';\r\nimport { ILogoStyleProps, ILogoStyles } from './Logo.types';\r\n\r\nexport const getStyles = (props: ILogoStyleProps): ILogoStyles => {\r\n const { spacing, fonts, palette } = (props.theme as unknown) as IPubcenterTheme;\r\n const { shouldRenderLogo, renderDarkLogo, renderGreyLogo } = props;\r\n\r\n return {\r\n logo: {\r\n ...flexWithAlignCenter,\r\n selectors: {\r\n img: {\r\n ...(renderGreyLogo\r\n ? { margin: `3px ${spacing.size12} 0 ${spacing.size12}`, width: '113px', objectFit: 'cover' }\r\n : renderDarkLogo\r\n ? {\r\n width: spacing.size128,\r\n }\r\n : { marginLeft: spacing.size10 }),\r\n },\r\n div: {\r\n fontSize: fonts.size28.fontSize,\r\n marginRight: shouldRenderLogo ? spacing.size8 : spacing.size16,\r\n marginTop: spacing.size4,\r\n marginBottom: spacing.size8,\r\n },\r\n span: {\r\n ...(renderGreyLogo\r\n ? { fontSize: fonts.size20.fontSize, color: '#737373' }\r\n : renderDarkLogo\r\n ? {\r\n fontSize: fonts.size18.fontSize,\r\n color: palette.neutralPrimary,\r\n }\r\n : {\r\n fontSize: fonts.size16.fontSize,\r\n }),\r\n fontWeight: FontWeights.semibold,\r\n marginRight: spacing.s1,\r\n marginLeft: 0,\r\n },\r\n },\r\n },\r\n logoNavButton: {\r\n opacity: shouldRenderLogo ? 0 : 1,\r\n width: shouldRenderLogo ? 0 : spacing.size48,\r\n },\r\n divider: {\r\n fontWeight: renderDarkLogo ? 100 : undefined,\r\n ...(renderGreyLogo ? { color: '#737373', fontSize: fonts.size24.fontSize, width: '1px' } : {}),\r\n },\r\n };\r\n};\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n msLogo: {\r\n id: 'header.logo.msg',\r\n defaultMessage: 'Microsoft Logo',\r\n },\r\n});\r\n","import { IProcessedStyleSet, classNamesFunction, getTheme } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { isPublisherRejectionUnappealable } from '../../@data';\r\nimport { APP_NAME_PUBCENTER, APP_NAME_SHORT } from '../../constants';\r\nimport { isLocationPubCenter } from '../../utils';\r\nimport { getStyles } from './Logo.styles';\r\nimport { ILogoStyleProps, ILogoStyles } from './Logo.types';\r\nimport messages from './messages';\r\nimport microsoftLogo from './resources/microsoft.svg';\r\nimport microsoftDarkLogo from './resources/microsoftDark.svg';\r\nimport microsoftGreyLogo from './resources/microsoftGrey.png';\r\n\r\nconst getClassNames = classNamesFunction<ILogoStyleProps, ILogoStyles>();\r\ntype LogoProps = { shouldRenderLogo?: boolean; renderDarkLogo?: boolean; renderGreyLogo?: boolean };\r\n\r\nexport const Logo = injectIntl<InjectedIntlProps & LogoProps>(\r\n ({ shouldRenderLogo = true, renderDarkLogo = false, intl: { formatMessage }, renderGreyLogo = true }) => {\r\n const _classNames: IProcessedStyleSet<ILogoStyles> = React.useMemo(\r\n () =>\r\n getClassNames(getStyles, {\r\n theme: getTheme(),\r\n shouldRenderLogo: shouldRenderLogo,\r\n renderDarkLogo: renderDarkLogo,\r\n renderGreyLogo: renderGreyLogo,\r\n }),\r\n [shouldRenderLogo, renderDarkLogo, renderGreyLogo]\r\n );\r\n const { logo: logoStyle, logoNavButton, divider } = _classNames;\r\n const logo = renderGreyLogo ? microsoftGreyLogo : renderDarkLogo ? microsoftDarkLogo : microsoftLogo;\r\n\r\n return (\r\n <div className={logoStyle}>\r\n {shouldRenderLogo && <img src={logo} alt={formatMessage(messages.msLogo)} />}\r\n {shouldRenderLogo && <div className={divider}>|</div>}\r\n\r\n <div className={isPublisherRejectionUnappealable() ? undefined : logoNavButton} />\r\n <span>{isLocationPubCenter() ? APP_NAME_PUBCENTER : APP_NAME_SHORT}</span>\r\n </div>\r\n );\r\n }\r\n);\r\n","import { BaseButton, Text } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { isTythonSelfServeUser } from '../../@data';\r\nimport { APP_NAME_NEW, APP_NAME_PUBCENTER } from '../../constants/AppConstants';\r\nimport { classNames } from '../../pages/ad-management/Account/Payments/Onboarding/PaymentsOnboarding';\r\nimport { daysAheadOfToday } from '../../utils';\r\nimport messages from './TnCModal.messages';\r\nimport { ITnCNotificationProps } from './TnCModal.types';\r\n\r\nconst TnCNotificationComponent = injectIntl<InjectedIntlProps & ITnCNotificationProps>(\r\n ({ onAction, latestTnCReleaseDate, signatureDate, intl: { formatMessage } }) => (\r\n <div className={classNames.setupNotificationWrapper}>\r\n <Text className={classNames.tncNotificationText}>\r\n {formatMessage(messages.tncNotificationContent, {\r\n latestTnCReleaseDate: latestTnCReleaseDate\r\n ? // TODO: add i18n migration once feature is ready\r\n new Date(latestTnCReleaseDate).toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' })\r\n : formatMessage(messages.unknown),\r\n buffer:\r\n signatureDate && daysAheadOfToday(signatureDate) >= 0\r\n ? formatMessage(messages.dayBuffer, { buffer: daysAheadOfToday(signatureDate) })\r\n : formatMessage(messages.twoWeekBuffer),\r\n appName: isTythonSelfServeUser() ? APP_NAME_NEW : APP_NAME_PUBCENTER,\r\n })}\r\n </Text>\r\n <BaseButton className={classNames.actionButton} onClick={onAction}>\r\n {formatMessage(messages.goToAccept)}\r\n </BaseButton>\r\n </div>\r\n )\r\n);\r\n\r\nexport const TnCNotification = (props: ITnCNotificationProps) => <TnCNotificationComponent {...props} />;\r\n","import { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Log } from '../../../logging/src/Log';\r\nimport {\r\n Publisher,\r\n User,\r\n UserContext,\r\n buildRequestHeadersWithAuthToken,\r\n constructUrl,\r\n isTythonSelfServeUser,\r\n onNotificationChanged,\r\n onNotificationRemoved,\r\n} from '../../@data';\r\nimport { INotificationBarItem } from '../../components/NotificationBar';\r\nimport { ITnCModalProps } from '../../components/TnCModal';\r\nimport { TnCNotification } from '../../components/TnCModal/TnCNotification';\r\nimport { ITnCSignatureStatus } from '../ad-management/Account/Settings/@data/store/schema/ISettingsViewModel';\r\nimport { setNotificationPanelTriggered } from './@data';\r\nimport { ITnC } from './@data/store/store';\r\n\r\ntype UseTnC = ({\r\n tncStore,\r\n tncSignatureStatus,\r\n userContext,\r\n publisher,\r\n shouldDisableTnC,\r\n isAppLoading,\r\n barNotifications,\r\n}: {\r\n tncStore: ITnC;\r\n tncSignatureStatus?: ITnCSignatureStatus;\r\n userContext?: UserContext;\r\n publisher?: Publisher;\r\n shouldDisableTnC: boolean;\r\n isAppLoading?: boolean;\r\n barNotifications?: INotificationBarItem[];\r\n}) => { tncModalProps: ITnCModalProps };\r\n\r\ntype SignatureRetryProps = {\r\n userContext?: UserContext;\r\n publisher?: Publisher;\r\n isSkipping?: boolean;\r\n latestTnCVersion?: string;\r\n onPatchStart?: () => void;\r\n onPatchFinished?: () => void;\r\n onSuccess?: () => void;\r\n withRetry?: boolean;\r\n patchUrl?: string;\r\n};\r\n\r\nconst TNC_NOTIFICATION_ID = 'tnc-notification-pushed';\r\nexport const TNC_PRE_SIGNATURE_FLAG = 'tnc-pre-signed-latest';\r\n\r\nconst useTnC: UseTnC = ({ tncStore, tncSignatureStatus, publisher, userContext, shouldDisableTnC, isAppLoading, barNotifications }) => {\r\n const handledTnCPopup = useRef<boolean>(false);\r\n const [shouldRenderTnCModal, setRenderTnC] = useState<boolean>(false);\r\n const [acceptingTnC, setAcceptingTnC] = useState<boolean>(false);\r\n const { content, nonTythonContent, isDataLoaded, latestTnCReleaseDate, latestTnCVersion, isNotificationPanelTrigerred } = tncStore;\r\n const { isLatestAccepted, signatureDate, acceptedVersion } = tncSignatureStatus ?? {};\r\n const isTnCPreSigned = window.localStorage.getItem(TNC_PRE_SIGNATURE_FLAG);\r\n\r\n const notification = {\r\n id: TNC_NOTIFICATION_ID,\r\n messageBarType: 1,\r\n component: TnCNotification({\r\n onAction: () => {\r\n setRenderTnC(true);\r\n onNotificationRemoved(notification);\r\n },\r\n latestTnCReleaseDate: latestTnCReleaseDate!,\r\n signatureDate: signatureDate,\r\n }),\r\n suppressAutoDismiss: true,\r\n messageBarStyles: {\r\n text: {\r\n marginTop: 0,\r\n marginBottom: 0,\r\n alignItems: 'center',\r\n paddingTop: 2,\r\n },\r\n content: { alignItems: 'center' },\r\n },\r\n };\r\n\r\n const shouldHandleTnCForExistingUser = useMemo(\r\n () =>\r\n (!isAppLoading && isDataLoaded && !isLatestAccepted && isNotificationPanelTrigerred) ||\r\n (!isAppLoading && isDataLoaded && !isLatestAccepted && !handledTnCPopup.current && shouldDisableTnC && !isTnCPreSigned),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [isDataLoaded, handledTnCPopup.current, shouldDisableTnC, isLatestAccepted, isAppLoading, isNotificationPanelTrigerred]\r\n );\r\n\r\n useEffect(() => {\r\n if (shouldHandleTnCForExistingUser) {\r\n if (\r\n !isNotificationPanelTrigerred &&\r\n localStorage.getItem(TNC_NOTIFICATION_ID) &&\r\n signatureDate &&\r\n new Date(signatureDate) > new Date()\r\n ) {\r\n !barNotifications?.find((n) => n.id === notification.id) && onNotificationChanged(notification);\r\n } else {\r\n setRenderTnC(true);\r\n handledTnCPopup.current = true;\r\n localStorage.setItem(TNC_NOTIFICATION_ID, 'true');\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [shouldHandleTnCForExistingUser]);\r\n\r\n /**\r\n * hide popup when user login session has expired\r\n */\r\n const shouldForceHidePopup = window?.location?.pathname.includes('login');\r\n\r\n /**\r\n * if isSkipping is true, that means user is skipping signing the TnC,\r\n * in backend mechanism we consider this is \"accepting null TnC\"\r\n * */\r\n const onAcceptTnC = async (isSkipping = false) => {\r\n if (!userContext || !publisher) {\r\n return;\r\n }\r\n patchAcceptTnC({\r\n userContext,\r\n publisher,\r\n isSkipping,\r\n latestTnCVersion,\r\n onPatchStart: () => setAcceptingTnC(true),\r\n onPatchFinished: () => setAcceptingTnC(false),\r\n onSuccess: () => setRenderTnC(false),\r\n });\r\n if (isNotificationPanelTrigerred) {\r\n setNotificationPanelTriggered(false);\r\n }\r\n };\r\n\r\n /**\r\n * Sign empty TnC only when first time user skip the TnC\r\n * - signatureDate is not ahead of today utc\r\n * - signatureDate is undefined as by default tncSignatureStatus is undefined\r\n */\r\n const onSkipTnC = () => {\r\n const isSkippingFirstTime =\r\n !signatureDate || signatureDate === 'undefined' || (new Date() > new Date(signatureDate) && signatureDate !== '');\r\n if (isSkippingFirstTime) {\r\n onAcceptTnC(true);\r\n }\r\n setRenderTnC(false);\r\n if (isNotificationPanelTrigerred) {\r\n setNotificationPanelTriggered(false);\r\n } else {\r\n onNotificationChanged(notification);\r\n }\r\n };\r\n\r\n /**\r\n * disable the skip button when user has seen latest TnC but not\r\n * signed within the next 14 days,\r\n * - if tnc first time expose to user, signatureDate is undefined, in this case we will\r\n * not disable the skip button\r\n * - if acceptedVersion is empty string (user skipped TnC previously) and signature\r\n * date(at this point signatureDate is date of first time user saw TnC + 14days)\r\n * is before today date, we should disable the skip button\r\n */\r\n const shouldDisableSkip = useMemo(() => {\r\n if (!signatureDate) {\r\n return false;\r\n }\r\n const bufferPassed = new Date(signatureDate) < new Date();\r\n const userSkippedTnCPreviously = acceptedVersion === '';\r\n return bufferPassed && userSkippedTnCPreviously;\r\n }, [signatureDate, acceptedVersion]);\r\n\r\n const tncModalProps = {\r\n onSkip: shouldDisableSkip ? undefined : onSkipTnC,\r\n onAccept: () => onAcceptTnC(),\r\n isActive: shouldRenderTnCModal && !shouldForceHidePopup,\r\n content: isTythonSelfServeUser() ? content : nonTythonContent,\r\n releaseDate: latestTnCReleaseDate,\r\n isLoading: acceptingTnC,\r\n };\r\n\r\n return { tncModalProps };\r\n};\r\n\r\nexport const patchAcceptTnC = async ({\r\n userContext,\r\n publisher,\r\n isSkipping = false,\r\n latestTnCVersion,\r\n onPatchStart = () => null,\r\n onPatchFinished = () => null,\r\n onSuccess = () => null,\r\n withRetry = false,\r\n patchUrl,\r\n}: SignatureRetryProps) => {\r\n onPatchStart();\r\n let response: Response;\r\n let url;\r\n if (patchUrl) {\r\n url = patchUrl;\r\n } else {\r\n const user = new User(userContext?.id);\r\n url = constructUrl([publisher!, user]) + `/accept-terms/${isSkipping ? null : latestTnCVersion}`;\r\n }\r\n\r\n const headers = await buildRequestHeadersWithAuthToken(url, userContext);\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: 'PATCH',\r\n headers: headers,\r\n });\r\n\r\n const responseJson = await response.json();\r\n\r\n if (response.ok) {\r\n onSuccess();\r\n } else {\r\n if (withRetry) {\r\n throw Error('Patch failed');\r\n } else {\r\n return Log.error(\r\n `${isSkipping ? 'Skipping' : 'Signing'} latest terms and conditions failed. Error: ${JSON.stringify(responseJson.errors)}`\r\n );\r\n }\r\n }\r\n } catch (e) {\r\n if (withRetry) {\r\n throw e;\r\n }\r\n Log.error(e);\r\n } finally {\r\n if (!withRetry) {\r\n onPatchFinished();\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * accept latest tnc api will return errors within 2-5 minutes right after user signup, which is\r\n * a known backend issue, as a work around, set localStorage flag after user finish signup flow,\r\n * once tnc hook see this flag, will consider user has pre signed latest TnC per login session\r\n * and fire the signature api call in the next few minutes.\r\n */\r\nexport const preSignTnC = (value?: boolean) => {\r\n if (value) {\r\n window.localStorage.setItem(TNC_PRE_SIGNATURE_FLAG, 'true');\r\n } else {\r\n window.localStorage.removeItem(TNC_PRE_SIGNATURE_FLAG);\r\n }\r\n};\r\n\r\nexport default useTnC;\r\n","import { getTheme, ITheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterPalette } from '../../../theme';\r\n\r\nexport interface IEmptyChartStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\ntype StyleProperties = 'noDataText' | 'chartLine' | 'container' | 'chartGrid';\r\ntype EmptyChartStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: IEmptyChartStyleProps): EmptyChartStyles => {\r\n const { theme } = props;\r\n const palette = theme.palette as IPubcenterPalette;\r\n return mergeStyleSets({\r\n noDataText: {\r\n position: 'absolute',\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyItems: 'center',\r\n justifyContent: 'center',\r\n textAlign: 'center',\r\n },\r\n chartLine: {\r\n width: '100%',\r\n borderColor: palette.neutralLight,\r\n borderStyle: 'solid',\r\n },\r\n chartGrid: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '70px',\r\n },\r\n container: {\r\n position: 'relative',\r\n minHeight: '300px',\r\n },\r\n });\r\n};\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import React from 'react';\r\nimport { getClassNames } from './EmptyChart.styles';\r\n\r\nconst DATA_METRIC_ID = 'empty-chart';\r\nexport interface IEmptyChartProps {\r\n noDataText: string;\r\n noDataMessage: string;\r\n showGridLines: Boolean;\r\n}\r\n\r\nexport const EmptyChart = (props: IEmptyChartProps) => {\r\n const classNames = getClassNames(props);\r\n const { noDataMessage, noDataText, showGridLines } = props;\r\n return (\r\n <div className={classNames.container} data-metric={DATA_METRIC_ID}>\r\n <div className={classNames.noDataText}>\r\n <div>\r\n <b>{noDataText}</b> {noDataMessage}\r\n </div>\r\n </div>\r\n {showGridLines && (\r\n <div className={classNames.chartGrid}>\r\n <hr className={classNames.chartLine} />\r\n <hr className={classNames.chartLine} />\r\n <hr className={classNames.chartLine} />\r\n <hr className={classNames.chartLine} />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import { FontWeights, getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { BreakPoints, IPubcenterTheme } from '../../../theme';\r\nimport { ICommonStyleProps } from '../../types';\r\nimport { flexWithAlignCenter, flexWithJustifyBetween } from '../../utils/GlobalStyleUtils';\r\n\r\ntype StyleProperties =\r\n | 'containerStyle'\r\n | 'headerRowStyle'\r\n | 'headingTitleStyle'\r\n | 'headingIconStyle'\r\n | 'sectionStyle'\r\n | 'sectionTitleStyle'\r\n | 'contentRowStyle'\r\n | 'contentLabelStyle'\r\n | 'contentLabelStyleWithColor'\r\n | 'sectionContentStyle'\r\n | 'bodyContainerStyle'\r\n | 'actionStyle';\r\nexport type SummaryCardStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): SummaryCardStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { spacing, fonts } = theme;\r\n const { ResponsiveSmall } = BreakPoints;\r\n\r\n return mergeStyleSets({\r\n containerStyle: {\r\n boxShadow: '0px 4px 8px rgba(0, 0, 0, 0.14), 0px 0px 2px rgba(0, 0, 0, 0.12)',\r\n borderRadius: spacing.size6,\r\n marginBottom: spacing.size16,\r\n },\r\n headingTitleStyle: {\r\n ...fonts.size16,\r\n margin: 0,\r\n fontWeight: FontWeights.semibold,\r\n ...flexWithAlignCenter,\r\n },\r\n headingIconStyle: {\r\n fontSize: fonts.size14.fontSize,\r\n height: spacing.size16,\r\n width: spacing.size16,\r\n marginRight: spacing.size8,\r\n },\r\n headerRowStyle: {\r\n padding: `0 ${spacing.size24}`,\r\n height: spacing.size54,\r\n ...flexWithJustifyBetween,\r\n borderBottom: `1px solid ${theme.palette.neutralQuaternaryAlt}`,\r\n },\r\n sectionStyle: {\r\n '&:not(:last-child)': {\r\n marginBottom: spacing.size12,\r\n },\r\n width: '50%',\r\n },\r\n sectionTitleStyle: {\r\n ...fonts.size14Medium,\r\n margin: 0,\r\n [ResponsiveSmall]: {\r\n overflowWrap: 'break-word',\r\n },\r\n },\r\n contentRowStyle: {\r\n display: 'flex',\r\n marginBottom: spacing.size4,\r\n ...fonts.size14,\r\n [ResponsiveSmall]: {\r\n display: 'block',\r\n },\r\n },\r\n contentLabelStyle: {\r\n opacity: 0.6,\r\n minWidth: 200,\r\n color: theme.palette.black,\r\n },\r\n contentLabelStyleWithColor: {\r\n opacity: 0.6,\r\n minWidth: 200,\r\n color: theme.palette.eerieBlack,\r\n },\r\n sectionContentStyle: {\r\n margin: 0,\r\n ...fonts.size14,\r\n [ResponsiveSmall]: {\r\n overflowWrap: 'break-word',\r\n },\r\n },\r\n bodyContainerStyle: {\r\n padding: `${spacing.size12} ${spacing.size24}`,\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n },\r\n actionStyle: {},\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): SummaryCardStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { Image, Link, mergeStyleSets } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { IChildrenProp } from '../../types';\r\nimport { SummaryCardStyles, getClassNames } from './SummaryCard.styles';\r\n\r\nexport interface ISummaryCardProps extends IChildrenProp {}\r\nexport function SummaryCard({ children }: ISummaryCardProps) {\r\n const { containerStyle } = getClassNames();\r\n\r\n return <div className={containerStyle}>{children}</div>;\r\n}\r\n\r\nexport interface IHeadingRowProps extends IChildrenProp {}\r\nSummaryCard.HeadingRow = function HeadingRow({ children }: IHeadingRowProps) {\r\n const { headerRowStyle } = getClassNames();\r\n return <div className={headerRowStyle}>{children}</div>;\r\n};\r\n\r\nexport interface IHeadingTitleProps {\r\n text: string;\r\n icon?: string;\r\n}\r\nSummaryCard.HeadingTitle = function HeadingTitle({ text, icon }: IHeadingTitleProps) {\r\n const { headingTitleStyle, headingIconStyle } = getClassNames();\r\n return (\r\n <h2 className={headingTitleStyle}>\r\n <Image src={icon} shouldFadeIn alt={text} className={headingIconStyle} />\r\n {text}\r\n </h2>\r\n );\r\n};\r\n\r\nSummaryCard.ActionsContainer = function ActionsContainer({ children }: IChildrenProp) {\r\n return <div>{children}</div>;\r\n};\r\n\r\nexport interface IActionProps extends IChildrenProp {\r\n disabled?: boolean;\r\n onClick: () => void;\r\n styleProps?: Partial<Pick<SummaryCardStyles, 'actionStyle'>>;\r\n}\r\nSummaryCard.Action = function Action({ children, disabled, onClick, styleProps }: IActionProps) {\r\n const { actionStyle } = mergeStyleSets(getClassNames(), styleProps);\r\n\r\n return (\r\n <Link disabled={disabled} onClick={onClick} className={actionStyle}>\r\n {children}\r\n </Link>\r\n );\r\n};\r\n\r\nexport interface IBodyProps extends Partial<IChildrenProp> {\r\n styleProps?: Partial<Pick<SummaryCardStyles, 'bodyContainerStyle'>>;\r\n}\r\nSummaryCard.Body = function Body({ children, styleProps }: IBodyProps) {\r\n const { bodyContainerStyle } = mergeStyleSets(getClassNames(), styleProps);\r\n return <div className={bodyContainerStyle}>{children}</div>;\r\n};\r\n\r\nexport interface ISectionProps extends Partial<IChildrenProp> {\r\n styleProps?: Partial<Pick<SummaryCardStyles, 'sectionStyle'>>;\r\n}\r\nSummaryCard.Section = function Section({ children, styleProps }: ISectionProps) {\r\n const { sectionStyle } = mergeStyleSets(getClassNames(), styleProps);\r\n return <div className={sectionStyle}>{children}</div>;\r\n};\r\n\r\nexport interface ISectionTitleProps {\r\n text: string;\r\n}\r\nSummaryCard.SectionTitle = function SectionTitle({ text }: ISectionTitleProps) {\r\n const { sectionTitleStyle } = getClassNames();\r\n return <h3 className={sectionTitleStyle}>{text}</h3>;\r\n};\r\n\r\nexport interface IContentRowProps {\r\n label?: string;\r\n value?: string;\r\n styleProps?: Partial<SummaryCardStyles>;\r\n children?: React.ReactNode;\r\n}\r\nSummaryCard.ContentRow = function ContentRow({ label, value, children, styleProps }: IContentRowProps) {\r\n const { contentRowStyle, contentLabelStyle, contentLabelStyleWithColor } = mergeStyleSets(getClassNames(), styleProps);\r\n return (\r\n <div className={contentRowStyle}>\r\n {label && <div className={contentLabelStyleWithColor}>{label}</div>}\r\n {value && <div className={contentLabelStyle}>{value}</div>}\r\n {children && <div className={contentLabelStyle}>{children}</div>}\r\n </div>\r\n );\r\n};\r\n\r\nexport interface ISectionValueProps extends Partial<IChildrenProp> {\r\n text?: string;\r\n styleProps?: Partial<Pick<SummaryCardStyles, 'sectionContentStyle'>>;\r\n}\r\nSummaryCard.SectionContent = function SectionValue({ text, children, styleProps }: ISectionValueProps) {\r\n const { sectionContentStyle } = mergeStyleSets(getClassNames(), styleProps);\r\n return (\r\n <div>\r\n <p className={sectionContentStyle}>{text}</p>\r\n {children}\r\n </div>\r\n );\r\n};\r\n","import { mutator } from 'satcheljs';\r\nimport { onHelpInfoChanged } from '../actions';\r\nimport { getAppStore } from '../store/store';\r\n\r\nmutator(onHelpInfoChanged, msg => {\r\n getAppStore().helpInfo = msg.helpInfo;\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../logging/src';\r\nimport {\r\n Model,\r\n NotificationLabel,\r\n NotificationSeverity,\r\n onNotificationCardAdded,\r\n showErrorToastNotification,\r\n showSuccessToastNotification,\r\n} from '../../../../@data';\r\nimport notificationMessages from '../../../../NotificationsPanel.Types.messages';\r\nimport { CSVHelper } from '../../../../utils';\r\nimport messages from '../../GridV2.messages';\r\nimport { DownloadOption } from '../../GridV2.types';\r\nimport { onDownloadButtonClicked } from '../actions/commandBarActions';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onDownloadButtonClicked, async (msg) => {\r\n Log.write('onDownloadButtonClicked');\r\n const { selectedItems, paginator } = getStore();\r\n\r\n const getActivePage = (items: Model[], pageNumber?: number, pageSize?: number) => {\r\n const dataLength = items?.length;\r\n if (dataLength && pageNumber && pageSize) {\r\n return items?.slice((pageNumber - 1) * pageSize, pageNumber * pageSize) || [];\r\n } else {\r\n return items || [];\r\n }\r\n };\r\n\r\n let downloadData: Model[] = msg.data;\r\n if (msg.downloadType === DownloadOption.selection && !!selectedItems && selectedItems.length !== 0) {\r\n downloadData = selectedItems;\r\n } else if (msg.downloadType === DownloadOption.page) {\r\n downloadData = getActivePage(msg.data, paginator.currentPageNumber, paginator.currentPageSize);\r\n } else if (msg.downloadType === DownloadOption.all) {\r\n downloadData = msg.data;\r\n }\r\n\r\n let stringDataForCSV: string[];\r\n let headers: string;\r\n\r\n if (downloadData && msg.columns) {\r\n const columns = msg.columns.filter((col) => col.isExportable && col.isVisible);\r\n headers = columns.map((col) => CSVHelper.escapeStringForCSV(col.csvHeaderName ?? col.name)).toString();\r\n stringDataForCSV = downloadData.map((rowData) => {\r\n return CSVHelper.getCSVStringsV2(rowData, columns);\r\n });\r\n\r\n CSVHelper.downloadDataAsCSV(stringDataForCSV.join('\\n'), headers, msg.csvFileName);\r\n\r\n showSuccessToastNotification({\r\n textMessageDescriptor: messages.gridDataDownloadSuccess,\r\n });\r\n } else {\r\n showErrorToastNotification({ textMessageDescriptor: notificationMessages.GridDataDownloadFailureContent });\r\n onNotificationCardAdded({\r\n // tslint:disable-next-line: no-any\r\n severity: NotificationSeverity.Error,\r\n title: msg.formatMessage(notificationMessages.GridDataDownloadFailureTitle),\r\n content: msg.formatMessage(notificationMessages.GridDataDownloadFailureContent),\r\n notificationLabel: NotificationLabel.GridDataDownloadFailure,\r\n });\r\n }\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { onAccountChanged } from '../actions';\r\nimport { getAppStore } from '../store/store';\r\n\r\nmutator(onAccountChanged, msg => {\r\n const store = getAppStore();\r\n store.account = msg.account;\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { onMenuCollapsedChanged } from '../actions';\r\nimport { getAppStore } from '../store/store';\r\n\r\nmutator(onMenuCollapsedChanged, msg => {\r\n getAppStore().menuCollapsed = msg.collapsed;\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { getAppStore, onEntityGridColumnsChanged } from '..';\r\n\r\nmutator(onEntityGridColumnsChanged, (msg) => {\r\n const store = getAppStore();\r\n const entityGridColumns = store.entityGridColumns || [];\r\n const existingEntityColumns = entityGridColumns.find((entityGridColumn) => entityGridColumn.entity === msg.entityColumnsData.entity);\r\n\r\n if (existingEntityColumns) {\r\n existingEntityColumns.gridColumns = msg.entityColumnsData.gridColumns;\r\n } else {\r\n store.entityGridColumns = [...entityGridColumns, msg.entityColumnsData];\r\n }\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { onIsAcceptInviteFlowChanged, onUserInvitationCodeChanged } from '..';\r\nimport { Log } from '../../../logging/src';\r\nimport { StorageIsUserInviteFlowKey, StorageUserInvitationCodeFlowKey, getAppStore } from '../store/store';\r\n\r\nmutator(onIsAcceptInviteFlowChanged, (msg) => {\r\n Log.debug('Setting IsAcceptInviteFlow in cache as: ' + msg.isAcceptInviteFlow);\r\n localStorage.setItem(StorageIsUserInviteFlowKey, JSON.stringify(msg.isAcceptInviteFlow));\r\n});\r\n\r\nmutator(onUserInvitationCodeChanged, (msg) => {\r\n Log.debug('UserInvitationCode changed: ' + msg.invitationCode);\r\n if (msg.invitationCode !== 'redirect') {\r\n localStorage.setItem(StorageUserInvitationCodeFlowKey, msg.invitationCode);\r\n getAppStore().userInvitationCode = msg.invitationCode;\r\n }\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { onLayoutChanged } from '../actions';\r\nimport { getAppStore } from '../store/store';\r\n\r\nmutator(onLayoutChanged, msg => {\r\n getAppStore().layout = msg.layout;\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport AppMessages from '../../App.messages';\r\nimport { onLoadingChanged, onLoadingSetting, onLoadingWaiting } from '../actions/onLoadingChanged';\r\nimport { getAppStore } from '../store/store';\r\n\r\nmutator(onLoadingChanged, msg => {\r\n getAppStore().loading = msg.loading;\r\n AppMessages.loadingLabel.defaultMessage = AppMessages.loadingStatusLabel.defaultMessage;\r\n});\r\n\r\nmutator(onLoadingSetting, msg => {\r\n getAppStore().waiting = msg.waiting;\r\n AppMessages.loadingLabel.defaultMessage = AppMessages.loadingStatusLabel.defaultMessage;\r\n});\r\n\r\nmutator(onLoadingWaiting, msg => {\r\n getAppStore().waiting = msg.waiting;\r\n AppMessages.loadingLabel.defaultMessage = AppMessages.loadingWaitingLabel.defaultMessage;\r\n});","import { mutator } from 'satcheljs';\r\nimport { onNotificationChanged, onNotificationRemoved } from '../actions';\r\nimport { getAppStore } from '../store/store';\r\n\r\nmutator(onNotificationChanged, (msg) => {\r\n const store = getAppStore();\r\n const notifications = store.notifications || [];\r\n store.notifications = [...notifications, msg.notification];\r\n});\r\n\r\nmutator(onNotificationRemoved, (msg) => {\r\n const store = getAppStore();\r\n const notifications = store.notifications || [];\r\n const indexOfNotification = notifications.findIndex((notification) =>\r\n msg.notification.component\r\n ? notification.id === msg.notification.id\r\n : notification.text === msg.notification.text || notification.id === msg.notification.id\r\n );\r\n store.notifications = [...notifications.slice(0, indexOfNotification), ...notifications.slice(indexOfNotification + 1)];\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { INotificationCardItem } from '../../components/NotificationCard';\r\nimport { SESSION_NOTIFICATIONS_UI } from '../../constants/AppConstants';\r\nimport { onNotificationCardAdded, onNotificationCardRemoved, onNotificationPanelClosed, onNotificationPanelItemsChanged } from '../actions';\r\nimport { getAppStore } from '../store/store';\r\n\r\nmutator(onNotificationCardAdded, (msg) => {\r\n const store = getAppStore();\r\n const panelNotifications = store.panelNotifications || [];\r\n const newNotificationCard: INotificationCardItem = {\r\n id: ((crypto as unknown) as { randomUUID: () => string }).randomUUID(),\r\n isUIGenerated: true,\r\n timestamp: new Date(),\r\n ...msg.notification,\r\n };\r\n store.panelNotifications = [...panelNotifications, newNotificationCard];\r\n\r\n if (newNotificationCard.isUIGenerated) {\r\n // persist in session storage as well\r\n const existingNotifications = sessionStorage.getItem(SESSION_NOTIFICATIONS_UI);\r\n\r\n let notifications: INotificationCardItem[] = [];\r\n if (existingNotifications) {\r\n notifications = JSON.parse(existingNotifications);\r\n }\r\n\r\n // Add a new item to the list, if it doesn't already exist\r\n if (notifications.length === 0 || !notifications.some((notification) => notification.id === newNotificationCard.id)) {\r\n notifications.push(newNotificationCard);\r\n\r\n // Store the updated list back to sessionStorage\r\n const updatedData = JSON.stringify(notifications);\r\n sessionStorage.setItem(SESSION_NOTIFICATIONS_UI, updatedData);\r\n }\r\n }\r\n});\r\n\r\nmutator(onNotificationCardRemoved, (msg) => {\r\n const store = getAppStore();\r\n const panelNotifications = store.panelNotifications || [];\r\n const selectedNotificationId = msg.id;\r\n const indexOfNotification = panelNotifications.findIndex((notification) => notification.id === selectedNotificationId);\r\n store.panelNotifications = [...panelNotifications.slice(0, indexOfNotification), ...panelNotifications.slice(indexOfNotification + 1)];\r\n\r\n const existingNotifications = sessionStorage.getItem(SESSION_NOTIFICATIONS_UI);\r\n\r\n let notifications: INotificationCardItem[] = [];\r\n if (existingNotifications) {\r\n notifications = JSON.parse(existingNotifications);\r\n }\r\n\r\n const indexOfSSNotification = notifications.findIndex((notification) => notification.id === selectedNotificationId);\r\n notifications = [...notifications.slice(0, indexOfSSNotification), ...notifications.slice(indexOfSSNotification + 1)];\r\n\r\n // Store the updated list back to sessionStorage\r\n const updatedData = JSON.stringify(notifications);\r\n sessionStorage.setItem(SESSION_NOTIFICATIONS_UI, updatedData);\r\n});\r\n\r\nmutator(onNotificationPanelItemsChanged, (msg) => {\r\n const store = getAppStore();\r\n store.panelNotifications = msg.value;\r\n});\r\n\r\nmutator(onNotificationPanelClosed, (msg) => {\r\n getAppStore().notificationPanelCollapsed = msg.isClosed;\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { Log } from '../../../logging/src';\r\nimport { onAccessiblePublisherListChanged, onDefaultPublisherSet, onPublisherChanged } from '../actions';\r\nimport { Publisher } from '../store';\r\nimport { getAppStore } from '../store/store';\r\n\r\nmutator(onPublisherChanged, (msg) => {\r\n const store = getAppStore();\r\n if (msg.publisher) {\r\n msg.publisher.className = new Publisher().className;\r\n }\r\n\r\n store.publisher = msg.publisher;\r\n});\r\n\r\nmutator(onDefaultPublisherSet, (msg) => {\r\n Log.debug(`Setting default publisher, ${msg.id}`);\r\n\r\n const store = getAppStore();\r\n store.defaultPublisher = msg.id;\r\n});\r\n\r\nmutator(onAccessiblePublisherListChanged, (msg) => {\r\n const store = getAppStore();\r\n store.accessiblePublishers = msg.value;\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { onSavingChanged } from '../actions/onSavingChanged';\r\nimport { getAppStore } from '../store/store';\r\n\r\nmutator(onSavingChanged, msg => {\r\n getAppStore().saving = msg.saving;\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { onUserContextChanged } from '../actions';\r\nimport { getAppStore } from '../store/store';\r\n\r\nmutator(onUserContextChanged, msg => {\r\n getAppStore().userContext = msg.userDetails;\r\n});","import { orchestrator } from 'satcheljs';\r\nimport { getAppStore, showErrorToastNotification } from '../../../../../@data';\r\nimport { getAccountStatus } from '../../../../../@data/services/PaymentsService';\r\nimport messages from '../../AccountPage.messages';\r\nimport { setAccountStatusDataAction, setAccountStatusIsLoading } from '../actions';\r\nimport { fetchAccountStatus } from '../actions/actions';\r\n\r\norchestrator(fetchAccountStatus, async () => {\r\n const userContext = getAppStore().userContext;\r\n const publisher = getAppStore().publisher;\r\n setAccountStatusIsLoading(true);\r\n try {\r\n const data = await getAccountStatus(publisher?.id!, userContext!);\r\n setAccountStatusDataAction(data);\r\n } catch (error) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.loadAccountStatusFailed });\r\n }\r\n setAccountStatusIsLoading(false);\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport {\r\n NotificationLabel,\r\n NotificationSeverity,\r\n getAppStore,\r\n onNotificationCardAdded,\r\n showErrorToastNotification,\r\n} from '../../../../../@data';\r\nimport { getBalance } from '../../../../../@data/services/PaymentsService';\r\nimport notificationMessages from '../../../../../NotificationsPanel.Types.messages';\r\nimport { getStore } from '../../Settings/@data/store/store';\r\nimport { setBalanceDataAction, setBalanceIsDataLoadedAction } from '../actions';\r\nimport { fetchPaymentsPageBalance } from '../actions/actions';\r\n\r\norchestrator(fetchPaymentsPageBalance, async () => {\r\n const userContext = getAppStore().userContext;\r\n const publisher = getAppStore().publisher;\r\n try {\r\n const { systemPreferences } = getStore().active;\r\n\r\n const data = await getBalance(publisher?.id!, systemPreferences?.currency, userContext!);\r\n setBalanceDataAction(data);\r\n setBalanceIsDataLoadedAction(true);\r\n } catch (error) {\r\n showErrorToastNotification({ textMessageDescriptor: notificationMessages.LoadingBalanceDataFailedContent });\r\n\r\n onNotificationCardAdded({\r\n // tslint:disable-next-line: no-any\r\n severity: NotificationSeverity.Error,\r\n titleMessageDescriptor: notificationMessages.LoadingBalanceDataFailedTitle,\r\n contentMessageDescriptor: notificationMessages.LoadingBalanceDataFailedContent,\r\n notificationLabel: NotificationLabel.LoadingBalanceDataFailed,\r\n });\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport {\r\n NotificationLabel,\r\n NotificationSeverity,\r\n getAppStore,\r\n onNotificationCardAdded,\r\n showErrorToastNotification,\r\n} from '../../../../../@data';\r\nimport { getEstimatedEarnings } from '../../../../../@data/services/PaymentsService';\r\nimport { PaymentsPageEstimatedEarningsRequestParams } from '../../../../../@data/store/schema/models/PaymentPageEstimatedEarningsRequestParams';\r\nimport notificationMessages from '../../../../../NotificationsPanel.Types.messages';\r\nimport { ChartGrain } from '../../Payments/EstimatedEarnings/EstimatedEarnings.types';\r\nimport { setEstimatedEarningsDataAction, setEstimatedEarningsIsDataLoadedAction } from '../actions';\r\nimport { fetchPaymentsPageEstimatedEarnings } from '../actions/actions';\r\n\r\norchestrator(fetchPaymentsPageEstimatedEarnings, async ({ grain }) => {\r\n const userContext = getAppStore().userContext;\r\n const publisher = getAppStore().publisher;\r\n\r\n try {\r\n const localeDate = new Date();\r\n const startYear = grain === ChartGrain.YEARLY ? localeDate.getUTCFullYear() - 6 : localeDate.getUTCFullYear();\r\n const startMonth = grain === ChartGrain.MONTHLY ? localeDate.getUTCMonth() - 6 : localeDate.getUTCMonth();\r\n const startDate = new Date(startYear, startMonth, localeDate.getUTCDate(), 0, 0, 0);\r\n const endDate = new Date(localeDate.getUTCFullYear(), localeDate.getUTCMonth(), localeDate.getUTCDate(), 0, 0, 0);\r\n const startDateString = `${startDate.getMonth() + 1}/${startDate.getDate()}/${startDate.getFullYear()}`;\r\n const endDateString = `${endDate.getMonth() + 1}/${endDate.getDate()}/${endDate.getFullYear()}`;\r\n const requestParams: PaymentsPageEstimatedEarningsRequestParams = {\r\n grain,\r\n startDate: startDateString,\r\n endDate: endDateString,\r\n };\r\n const data = await getEstimatedEarnings(publisher?.id!, requestParams, userContext!);\r\n setEstimatedEarningsDataAction(data, grain);\r\n setEstimatedEarningsIsDataLoadedAction(true, grain);\r\n } catch (error) {\r\n showErrorToastNotification({ textMessageDescriptor: notificationMessages.PayoutInformationFailedContent });\r\n onNotificationCardAdded({\r\n // tslint:disable-next-line: no-any\r\n severity: NotificationSeverity.Error,\r\n titleMessageDescriptor: notificationMessages.PayoutInformationFailedTitle,\r\n contentMessageDescriptor: notificationMessages.PayoutInformationFailedContent,\r\n notificationLabel: NotificationLabel.PayoutInformationFailed,\r\n });\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport {\r\n getAppStore,\r\n NotificationLabel,\r\n NotificationSeverity,\r\n onNotificationCardAdded,\r\n showErrorToastNotification,\r\n XPayJwtTokenRequest,\r\n} from '../../../../../@data';\r\nimport { getXPayJwtToken } from '../../../../../@data/services/PaymentsService';\r\nimport notificationMessages from '../../../../../NotificationsPanel.Types.messages';\r\nimport { fetchAccountById } from '../../../../partner-management/Account/@data/services/AccountService';\r\nimport { setXpayJwtTokenStatusIsLoading } from '../actions';\r\nimport { onInitializePaymentsPage } from '../actions/actions';\r\nimport { getPaymentsPageData } from '../store/paymentsPageStore';\r\n\r\norchestrator(\r\n onInitializePaymentsPage,\r\n async ({ shouldRenderOnboardingPopup, locale, countryCode, onResolvedCallback = (success: boolean) => null }) => {\r\n try {\r\n const { xpayJwtToken, xpayJwtTokenStatusIsLoading, xpayJwtTokenRequest, xpayTokenExpirationTimeStamp } = getPaymentsPageData();\r\n const { publisher, userContext } = getAppStore();\r\n let tokenResponse, xPayJWTRequest;\r\n\r\n if (\r\n (!xpayJwtToken && !xpayJwtTokenStatusIsLoading) ||\r\n (xpayJwtToken && xpayTokenExpirationTimeStamp && xpayTokenExpirationTimeStamp <= new Date().getTime())\r\n ) {\r\n setXpayJwtTokenStatusIsLoading(true);\r\n // TODO : remove the fetch account and depends on countryCode passed as props\r\n const accountId = getAppStore().account?.id;\r\n const account = await fetchAccountById(publisher!, accountId, userContext);\r\n xPayJWTRequest = new XPayJwtTokenRequest();\r\n xPayJWTRequest.publisherId = publisher?.id!;\r\n xPayJWTRequest.countryCode = account.countryCode || countryCode;\r\n tokenResponse = await getXPayJwtToken(xPayJWTRequest, userContext!);\r\n }\r\n\r\n const xpayParams: {\r\n authToken: string;\r\n containerId: string;\r\n theme: string;\r\n locale: string;\r\n xpayClientName: string;\r\n isRefreshedUI: boolean;\r\n country: string;\r\n showTransactionReport: boolean;\r\n showSetupPopup: boolean;\r\n serviceAgreement: string;\r\n } = {\r\n authToken: xpayJwtToken ?? tokenResponse.xpayJwtToken,\r\n containerId: 'onboarding-container',\r\n theme: 'dark',\r\n locale: locale,\r\n xpayClientName: 'PubCenter',\r\n isRefreshedUI: false,\r\n country: xpayJwtTokenRequest.countryCode ?? xPayJWTRequest.countryCode,\r\n showTransactionReport: true,\r\n showSetupPopup: shouldRenderOnboardingPopup,\r\n serviceAgreement: xpayJwtTokenRequest.countryCode === 'CA' ? 'Recipient' : 'Full',\r\n };\r\n\r\n if (window.hasOwnProperty('xPayUIAccountOnboarding')) {\r\n console.log('window has property xPayUIAccountOnboarding');\r\n window['xPayUIAccountOnboarding']['renderStripeOnboardingComponent'](xpayParams);\r\n onResolvedCallback(true);\r\n }\r\n } catch (error) {\r\n showErrorToastNotification({ textMessageDescriptor: notificationMessages.LoadPayoutInfoFailedContent });\r\n onNotificationCardAdded({\r\n // tslint:disable-next-line: no-any\r\n severity: NotificationSeverity.Error,\r\n titleMessageDescriptor: notificationMessages.LoadPayoutInfoFailedTitle,\r\n contentMessageDescriptor: notificationMessages.LoadPayoutInfoFailedContent,\r\n notificationLabel: NotificationLabel.LoadPayoutInfoFailed,\r\n });\r\n onResolvedCallback(false);\r\n } finally {\r\n setXpayJwtTokenStatusIsLoading(false);\r\n }\r\n }\r\n);\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n headerLabel: {\r\n id: 'systemPreferences.headerLabel',\r\n defaultMessage: 'Locale',\r\n },\r\n headerAction: {\r\n id: 'systemPreferences.headerAction',\r\n defaultMessage: 'Edit',\r\n },\r\n panelHeaderText: {\r\n id: 'systemPreferences.panelHeaderText',\r\n defaultMessage: 'Edit system preferences',\r\n },\r\n updateLanguageFailed: {\r\n id: 'systemPreferences.languageUpdateFailed',\r\n defaultMessage: 'Failed to update user language. Please try again!',\r\n },\r\n invalidStateReLoginOrReport: {\r\n id: 'systemPreferences.invalidStateReLoginOrReport',\r\n defaultMessage: 'You have arrived in an invalid state, please re-login or report if issue persists.',\r\n },\r\n});\r\n","module.exports = __webpack_public_path__ + \"static/media/adVector.f259b774.svg\";","module.exports = __webpack_public_path__ + \"static/media/codeIcon.6a91c982.svg\";","module.exports = __webpack_public_path__ + \"static/media/DocumentationCenterIcon.31cd5d5e.svg\";","module.exports = __webpack_public_path__ + \"static/media/FeedBackIcon.9b57b425.svg\";","module.exports = __webpack_public_path__ + \"static/media/SupportTeamIcon.914857e7.svg\";","module.exports = __webpack_public_path__ + \"static/media/empty.5254ba69.svg\";","module.exports = __webpack_public_path__ + \"static/media/fre-1.0c9c5356.jpg\";","module.exports = __webpack_public_path__ + \"static/media/fre-2.fd050b2a.jpg\";","module.exports = __webpack_public_path__ + \"static/media/fre-3.ec650c27.jpg\";","import { mutatorAction } from 'satcheljs';\r\nimport { getAppealStore } from '../store/appealStore';\r\nimport { DocumentUploadStatus } from '../store/schema';\r\n\r\nexport const setDocumentUploadPanelOpen = mutatorAction('setDocumentUploadPanelOpen', (isPanelOpen: boolean) => {\r\n getAppealStore().isDocumentUploadPanelOpen = isPanelOpen;\r\n});\r\n\r\nexport const setDocumentUploadStatus = mutatorAction('setBVDocumentUploadStatus', (index: number, status: DocumentUploadStatus) => {\r\n getAppealStore().documentUploadStatus[index] = status;\r\n});\r\n\r\n// tslint:disable-next-line: no-any\r\nexport const setAppealHistory = mutatorAction('setAppealHistory', (appealHistory: any) => {\r\n getAppealStore().appealHistory = appealHistory;\r\n});\r\n","export const GOOGLE_ADSENSE_OAUTH_CLIENT_ID_PROD = '1049810782184-nk9negp0sgack3sfatbfei0vjillr6ll.apps.googleusercontent.com';\r\nexport const GOOGLE_ADSENSE_OAUTH_CLIENT_ID_SI = '1049810782184-nk9negp0sgack3sfatbfei0vjillr6ll.apps.googleusercontent.com';\r\n\r\nexport const GOOGLE_ADSENSE_OAUTH_URL = 'https://accounts.google.com/o/oauth2/auth/oauthchooseaccount?';\r\n\r\nexport const GOOGLE_ADSENSE_OAUTH_ACCESS_TYPE = 'offline';\r\n\r\nexport const GOOGLE_ADSENSE_OAUTH_RESPONSE_TYPE = 'code';\r\n\r\nexport const GOOGLE_ADSENSE_SCOPES = [\r\n 'https://www.googleapis.com/auth/admanager',\r\n 'https://www.googleapis.com/auth/adsense',\r\n 'https://www.googleapis.com/auth/userinfo.email',\r\n];\r\n\r\nexport const GIF_ANIMATION_DURATION = 4475;\r\n\r\nexport const GOOGLE_API_SCRIPT = 'https://accounts.google.com/gsi/client';\r\n\r\nexport const NOTIFICATION_FAILED_WITH_REASON_ERROR_CODE = 'NOTIFICATION_FAILED_WITH_REASON_ERROR_CODE';\r\n\r\nexport const MULTIPLE_GAM_ID_ERROR_CODE = 'MultipleGamNetworksFound';\r\n","export enum ServingStatus {\r\n Pending = 'Pending',\r\n NotServing = 'Rejected',\r\n Serving = 'Approved',\r\n OnHold = 'On hold',\r\n}\r\n\r\nexport type ServingStatusKey = keyof typeof ServingStatus;\r\n\r\nexport const ServingStatusLabel: { [key in ServingStatusKey]: string } = {\r\n Pending: 'servingStatusPending',\r\n NotServing: 'servingStatusNotServing',\r\n Serving: 'servingStatusServing',\r\n OnHold: 'servingStatusOnHold',\r\n};\r\n\r\nexport const ServingStatusMap = {\r\n 0: ServingStatus.Pending,\r\n 1: ServingStatus.NotServing,\r\n 2: ServingStatus.Serving,\r\n 3: ServingStatus.OnHold,\r\n};\r\n","import {\r\n DetailsHeader,\r\n DetailsListLayoutMode,\r\n DetailsRow,\r\n IDetailsColumnRenderTooltipProps,\r\n IShimmeredDetailsListProps,\r\n mergeStyleSets,\r\n SelectionMode,\r\n ShimmeredDetailsList,\r\n TooltipHost,\r\n} from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { useSortableGridColumns } from '../../hooks';\r\nimport { IPropertyLevelAdBlock } from '../../pages/ad-management/AdBlock/components/PropertyLevelBlocking';\r\nimport type { ICustomColumn } from '../../types';\r\nimport { FormTitle } from '../Form';\r\nimport { getClassNames, IGridWithCustomColumnStyles } from './GridWithCustomColumns.styles';\r\n\r\nconst DEFAULT_SHIMMER_LINES = 5;\r\nexport interface IGridWithCustomColumns extends IShimmeredDetailsListProps, InjectedIntlProps {\r\n columns: ICustomColumn[];\r\n calloutArticleQuery?: string;\r\n headingText?: string;\r\n headingCalloutContent?: string;\r\n styleProps?: Partial<IGridWithCustomColumnStyles>;\r\n onSortItems?: (items: IPropertyLevelAdBlock[]) => void;\r\n onCleanupSortItems?: () => void;\r\n renderZeroItemsComponent?: () => JSX.Element;\r\n helpInfoProps?: {\r\n id: string;\r\n calloutContent?: string;\r\n iconButtonOnClick: () => void;\r\n calloutOnDismiss: () => void;\r\n };\r\n titleHeadingLevel?: number;\r\n}\r\n\r\nexport const GridWithCustomColumns = injectIntl(function GridWithCustomColumnsComponent({\r\n columns,\r\n calloutArticleQuery,\r\n items,\r\n styleProps,\r\n headingText,\r\n headingCalloutContent,\r\n intl,\r\n shimmerLines = DEFAULT_SHIMMER_LINES,\r\n enableShimmer = true,\r\n helpInfoProps = undefined,\r\n titleHeadingLevel,\r\n onSortItems,\r\n onCleanupSortItems,\r\n renderZeroItemsComponent,\r\n}: IGridWithCustomColumns) {\r\n const { detailsListStyles, detailsHeaderRootStyle, detailsRowRootStyle, headingRootStyle, disabledRowStyle } = mergeStyleSets(\r\n getClassNames(),\r\n styleProps\r\n );\r\n const { gridColumns, handleColumnHeaderClick } = useSortableGridColumns<IPropertyLevelAdBlock>(\r\n columns,\r\n items,\r\n onSortItems,\r\n onCleanupSortItems\r\n );\r\n\r\n return (\r\n <div className=\"gridWithCustomColumns\">\r\n {headingText && (\r\n <FormTitle\r\n intl={intl}\r\n title={headingText}\r\n calloutContent={headingCalloutContent}\r\n styles={{ root: headingRootStyle }}\r\n articleQuery={calloutArticleQuery}\r\n {...(helpInfoProps ? helpInfoProps : {})}\r\n titleHeadingLevel={titleHeadingLevel}\r\n />\r\n )}\r\n\r\n {!enableShimmer && items.length === 0 && renderZeroItemsComponent?.()}\r\n\r\n {(enableShimmer || items.length > 0) && (\r\n <ShimmeredDetailsList\r\n enableShimmer={enableShimmer}\r\n shimmerLines={shimmerLines}\r\n items={items}\r\n detailsListStyles={{ root: detailsListStyles }}\r\n onRenderRow={(detailsRowProps) => {\r\n const { item } = detailsRowProps ?? {};\r\n if (!detailsRowProps) {\r\n return null;\r\n }\r\n\r\n return (\r\n <DetailsRow\r\n disabled={item?.isDisabled}\r\n {...detailsRowProps}\r\n styles={({ disabled }) => ({ root: `${detailsRowRootStyle} ${disabled ? disabledRowStyle : ''}` })}\r\n />\r\n );\r\n }}\r\n onRenderDetailsHeader={(headerProps) => {\r\n if (!headerProps) {\r\n return null;\r\n }\r\n return (\r\n <DetailsHeader\r\n {...headerProps}\r\n styles={{ root: detailsHeaderRootStyle }}\r\n onRenderColumnHeaderTooltip={(tooltipHostProps: IDetailsColumnRenderTooltipProps) => {\r\n return <TooltipHost {...tooltipHostProps} />;\r\n }}\r\n />\r\n );\r\n }}\r\n columns={gridColumns}\r\n selectionMode={SelectionMode.none}\r\n onColumnHeaderClick={handleColumnHeaderClick}\r\n layoutMode={DetailsListLayoutMode.justified}\r\n />\r\n )}\r\n </div>\r\n );\r\n});\r\n","import { getAppStore, listEntity, Publisher, UserContext } from '../../../../../@data';\r\nimport { PropertyServingConfigs } from '../../../../../@data/store/schema/models/ServingConfigs';\r\n\r\nexport async function fetchPropertiesServingConfigs(publisher: Publisher, userContext?: UserContext): Promise<PropertyServingConfigs[]> {\r\n const effectiveUserContext = userContext || getAppStore().userContext;\r\n const propertiesServingConfigs = await listEntity([publisher], effectiveUserContext, PropertyServingConfigs);\r\n return propertiesServingConfigs;\r\n}\r\n","import { getAppStore, getEntity, Property, Publisher, UserContext } from '../../../../../@data';\r\nimport { PropertyServingConfig } from '../../../../../@data/store/schema/models/ServingConfigs';\r\n\r\nexport async function fetchPropertyServingConfig(\r\n publisher: Publisher,\r\n property: Property,\r\n userContext?: UserContext\r\n): Promise<PropertyServingConfig> {\r\n const effectiveUserContext = userContext || getAppStore().userContext;\r\n const propertyServingConfig = await getEntity([publisher, property], effectiveUserContext, PropertyServingConfig);\r\n return propertyServingConfig;\r\n}\r\n","import { getAppStore, getEntity, Publisher, UserContext } from '../../../../../@data';\r\nimport { PublisherServingConfig } from '../../../../../@data/store/schema/models/ServingConfigs';\r\n\r\nexport async function fetchPublisherServingConfig(publisher: Publisher, userContext?: UserContext): Promise<PublisherServingConfig> {\r\n const effectiveUserContext = userContext || getAppStore().userContext;\r\n const publisherServingConfig = await getEntity([publisher], effectiveUserContext, PublisherServingConfig);\r\n return publisherServingConfig;\r\n}\r\n","import { getAppStore, Property, Publisher, putEntity, UserContext } from '../../../../../@data';\r\nimport { PropertyServingConfig } from '../../../../../@data/store/schema/models/ServingConfigs';\r\n\r\nexport async function updatePropertyServingConfig(\r\n publisher: Publisher,\r\n property: Property,\r\n body: PropertyServingConfig,\r\n userContext?: UserContext\r\n): Promise<PropertyServingConfig> {\r\n const effectiveUserContext = userContext || getAppStore().userContext;\r\n const propertyServingConfig = await putEntity([publisher, property], body, effectiveUserContext, PropertyServingConfig);\r\n return propertyServingConfig;\r\n}\r\n","import { getAppStore, Publisher, putEntity, UserContext } from '../../../../../@data';\r\nimport { PublisherServingConfig } from '../../../../../@data/store/schema/models/ServingConfigs';\r\n\r\nexport async function updatePublisherServingConfig(\r\n publisher: Publisher,\r\n body: PublisherServingConfig,\r\n userContext?: UserContext\r\n): Promise<PublisherServingConfig> {\r\n const effectiveUserContext = userContext || getAppStore().userContext;\r\n const publisherServingConfig = await putEntity([publisher], body, effectiveUserContext, PublisherServingConfig);\r\n return publisherServingConfig;\r\n}\r\n","import { defineMessages } from 'react-intl';\r\nimport { VerificationCodeGenerationErrorCodes } from './@data/store/schema/VerificationCodeGenerationErrorCodes';\r\n\r\nexport default defineMessages({\r\n [VerificationCodeGenerationErrorCodes.INVALID_INPUT]: {\r\n id: 'profilePage.verificationErrors.InvalidInput',\r\n defaultMessage: 'Invalid email format.',\r\n },\r\n [VerificationCodeGenerationErrorCodes.CODE_GENERATION_LIMIT_REACHED]: {\r\n id: 'profilePage.verificationErrors.CodeGenerationLimitReached',\r\n defaultMessage: 'Code generation limit reached.',\r\n },\r\n [VerificationCodeGenerationErrorCodes.REQUESTED_CODE_VERIFICATION_RESULT_NOT_FOUND_FOR_PUBLISHER]: {\r\n id: 'profilePage.verificationErrors.CodeGenerationLimitReached',\r\n defaultMessage: 'No existing code verification result found for this publisher.',\r\n },\r\n});\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../types';\r\nimport { flexWithAlignCenter } from '../../../../utils/GlobalStyleUtils';\r\n\r\ntype StyleProperties = 'pageTitleStyle' | 'root' | 'deleteButton' | 'flexDisplay';\r\ntype SettingsPageStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): SettingsPageStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { spacing } = theme;\r\n\r\n return mergeStyleSets({\r\n pageTitleStyle: {\r\n margin: `${spacing.size32} 0 ${spacing.size16} 0`,\r\n },\r\n root: {\r\n margin: `0 ${spacing.size32}`,\r\n height: '-webkit-fill-available',\r\n },\r\n deleteButton: {\r\n color: theme.palette.redDark,\r\n selectors: {\r\n '&:focus, &:hover, &:pressed': {\r\n color: theme.palette.redDark,\r\n },\r\n },\r\n },\r\n footerRowStyle: {\r\n borderTop: `1px solid ${theme.palette.neutralQuaternaryAlt}`,\r\n gap: spacing.size12,\r\n ...flexWithAlignCenter,\r\n margin: `${spacing.size24} -${spacing.size32} 0`,\r\n padding: `${spacing.size16} ${spacing.size32} 0`,\r\n },\r\n preTextStyle: {\r\n margin: 0,\r\n fontFamily: 'inherit',\r\n },\r\n fieldsContainerStyle: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n '> *': {\r\n flexBasis: '50%',\r\n },\r\n '> *:nth-child(odd)': {\r\n paddingRight: spacing.size24,\r\n },\r\n '> *:last-child': {\r\n marginBottom: spacing.size8,\r\n },\r\n label: {\r\n color: theme.palette.neutralPrimary,\r\n },\r\n },\r\n flexDisplay: {\r\n width: '100%',\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): SettingsPageStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","module.exports = __webpack_public_path__ + \"static/media/Desert.a863829c.svg\";","module.exports = __webpack_public_path__ + \"static/media/AccountNavIcon.6d095328.svg\";","module.exports = __webpack_public_path__ + \"static/media/AccountNavIconActive.11bbb9e4.svg\";","module.exports = __webpack_public_path__ + \"static/media/AdBlockNavIcon.ee8f5da0.svg\";","module.exports = __webpack_public_path__ + \"static/media/AdBlockNavIconActive.44fdc6f4.svg\";","module.exports = __webpack_public_path__ + \"static/media/AdUnitNavIcon.1e43df48.svg\";","module.exports = __webpack_public_path__ + \"static/media/AdUnitNavIconActive.c7ed3e06.svg\";","module.exports = __webpack_public_path__ + \"static/media/AdsIcon.1e43df48.svg\";","module.exports = __webpack_public_path__ + \"static/media/AdsIconActive.c7ed3e06.svg\";","module.exports = __webpack_public_path__ + \"static/media/HomeNavIcon.c3c97464.svg\";","module.exports = __webpack_public_path__ + \"static/media/HomeNavIconActive.26a224b6.svg\";","module.exports = __webpack_public_path__ + \"static/media/InventoryIcon.ee28981f.svg\";","module.exports = __webpack_public_path__ + \"static/media/InventoryIconActive.571aa9ab.svg\";","module.exports = __webpack_public_path__ + \"static/media/ReportNavIcon.7d9227c3.svg\";","module.exports = __webpack_public_path__ + \"static/media/ReportNavIconActive.619105bf.svg\";","module.exports = __webpack_public_path__ + \"static/media/SiteNavIcon.ee28981f.svg\";","module.exports = __webpack_public_path__ + \"static/media/SiteNavIconActive.571aa9ab.svg\";","import { Model } from './Model';\r\n\r\nexport class BrandResponse extends Model {\r\n public apiPath = 'metadata/xandr/brands';\r\n public className = '';\r\n public id: number;\r\n public name: string;\r\n // Need to be addressed to match camal case\r\n // tslint:disable-next-line\r\n public category_id: number;\r\n // Need to be addressed to match camal case\r\n // tslint:disable-next-line\r\n public integration_domain: string;\r\n public urls: string[];\r\n}\r\n\r\nexport class BrandDetailsResponse extends BrandResponse {\r\n public apiPath = 'metadata/xandr/brands/details';\r\n public className = '';\r\n}\r\nexport class BrandSearchResponse extends BrandResponse {\r\n public apiPath = 'metadata/xandr/brands';\r\n public className = '';\r\n}\r\n","import { orchestrator } from 'satcheljs';\r\nimport { IUserViewModel } from '..';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { getAppStore, onIsAcceptInviteFlowChanged, onUserInvitationCodeChanged } from '../../../../../@data';\r\nimport { getSupportedLanguagesDropDownOptions } from '../../../../../@data/utils/supportedLanguages';\r\nimport { UNAUTHORIZED_LOCAL_STORAGE_LOCALE } from '../../../../../constants';\r\nimport { onLanguageChanged } from '../../../../ad-management/Account/Settings/@data/mutatorActions';\r\nimport { getStore } from '../../../../ad-management/Account/Settings/@data/store/store';\r\nimport { onPubCenterAADLogin } from '../../../../login/@data';\r\nimport { onAcceptInvitePageInitialized, onUserChanged, validateUserInvitationCode } from '../actions';\r\n\r\norchestrator(onAcceptInvitePageInitialized, async (msg) => {\r\n const { userContext } = getAppStore();\r\n const { systemPreferences } = getStore().active;\r\n\r\n Log.debug('Initializing acceptInvite page');\r\n\r\n onUserInvitationCodeChanged(msg.invitationCode);\r\n onLanguageChanged(msg.invitationLocale, UNAUTHORIZED_LOCAL_STORAGE_LOCALE);\r\n if (!userContext?.token) {\r\n Log.debug('AcceptInvite page - No user login found, prompting user login');\r\n onIsAcceptInviteFlowChanged(true);\r\n\r\n onPubCenterAADLogin();\r\n } else {\r\n Log.debug(`AcceptInvite page - UserContext is present for ${userContext.email} `);\r\n\r\n // Fetching supported locales and verifying if the locale from the invitation URL is supported, if not default to English\r\n const localeFromInvitationUrl = systemPreferences?.locale;\r\n const isInvitationUrlSupported =\r\n localeFromInvitationUrl &&\r\n getSupportedLanguagesDropDownOptions(localeFromInvitationUrl ?? 'en-US').find(\r\n (option) => option.key.toString() === localeFromInvitationUrl\r\n )\r\n ? true\r\n : false;\r\n\r\n const user: IUserViewModel = {\r\n firstName: userContext.firstName ?? (userContext.name && userContext.name.split(' ')[0]),\r\n lastName: userContext.lastName ?? (userContext.name && userContext.name.split(' ')[1]),\r\n userName: userContext.userName ?? userContext.email,\r\n emailAddress: userContext.email,\r\n language: isInvitationUrlSupported ? localeFromInvitationUrl : 'en-US',\r\n contactByEmail: true,\r\n contactByPhone: false,\r\n };\r\n onUserChanged(user);\r\n\r\n // Validate the invitation code asynchronously\r\n validateUserInvitationCode(msg.invitationCode);\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { getStore } from '..';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport {\r\n getAppStore,\r\n LifeCycleStatus,\r\n onNotificationChanged,\r\n onSavingChanged,\r\n onUserFirstTime,\r\n postEntity,\r\n User,\r\n} from '../../../../../@data';\r\nimport { onIsAcceptInviteFlowChanged } from '../../../../../@data/actions/onAcceptInviteActions';\r\nimport { UserCreateFromInvitation } from '../../../../../@data/store/schema/models/UserCreateFromInvitation';\r\nimport { WELCOME_SEND_FLAG } from '../../../../../constants/AppConstants';\r\nimport { validateSchema } from '../../../../../utils';\r\nimport { onAcceptInvitePageSubmitted, onFormCleared, onUserErrorChanged } from '../actions';\r\nimport { userAcceptInvitationErrorModel } from '../store/schema';\r\n\r\norchestrator(onAcceptInvitePageSubmitted, async (msg) => {\r\n const { userInvitationCode, userContext} = getAppStore();\r\n const { active } = getStore();\r\n\r\n if (active && userInvitationCode) {\r\n const body: UserCreateFromInvitation = {\r\n apiPath: 'livelogin/userCreateFromInvitation',\r\n className: 'userCreateFromInvitation',\r\n };\r\n\r\n try {\r\n await validateSchema(userAcceptInvitationErrorModel(), active);\r\n onUserErrorChanged();\r\n } catch (e) {\r\n onUserErrorChanged(e);\r\n onNotificationChanged({\r\n text: `User Accept Invitation - You have ${Object.keys(e).length} errors in the form, please fix them to continue.`,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n return;\r\n }\r\n\r\n onSavingChanged(true);\r\n\r\n body.invitationCode = userInvitationCode;\r\n body.termsAndConditionsAccepted = true;\r\n\r\n const userBody = new User();\r\n userBody.name = {\r\n firstName: active.firstName!,\r\n lastName: active.lastName!,\r\n };\r\n userBody.status = LifeCycleStatus.Active;\r\n userBody.username = active.userName;\r\n userBody.email = active.emailAddress;\r\n userBody.contactByEmail = active.contactByEmail;\r\n userBody.contactByPhone = active.contactByPhone;\r\n userBody.phoneNumber = active.phoneNumber;\r\n userBody.language = active.language;\r\n\r\n body.user = userBody;\r\n\r\n try {\r\n await postEntity([], UserCreateFromInvitation, body, userContext);\r\n Log.write(`Created new user successfully ${userBody.username}, redirecting user to login page`);\r\n onNotificationChanged({\r\n text: `Created new user successfully.`,\r\n messageBarType: MessageBarType.success,\r\n });\r\n sessionStorage.setItem(WELCOME_SEND_FLAG, \"true\")\r\n onIsAcceptInviteFlowChanged(false);\r\n onFormCleared();\r\n onUserFirstTime(true);\r\n window.location.replace('/login');\r\n } catch (e) {\r\n Log.error(`Accepting the user invitation caught an error \"${e}\". Please contact admin.`);\r\n onNotificationChanged({\r\n text: `Accepting the user invitation caught an error \"${e}\". Please contact admin.`,\r\n messageBarType: MessageBarType.error,\r\n });\r\n } finally {\r\n onSavingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n text: `Accept User Invitation form is invalid`,\r\n messageBarType: MessageBarType.warning,\r\n });\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { runInAction } from 'mobx';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { FetchDevTokenStatus, Model, User, getAppStore, getEntity, onNotificationChanged } from '../../../../../@data';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport { DevTokenFetch } from '../../Manage/ManagePage.types';\r\nimport { onFetchDevTokenStatus } from '../actions';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onFetchDevTokenStatus, async (msg) => {\r\n const store = getStore();\r\n const selectedItem = msg.selectedItem as Model;\r\n let notification: INotificationBarItem = {};\r\n\r\n if (store && selectedItem) {\r\n const { userContext, publisher } = getAppStore();\r\n if (userContext && publisher) {\r\n try {\r\n const userId = selectedItem.id;\r\n const user = new User(userId);\r\n\r\n Log.debug('Fetching dev token for user ' + userId);\r\n\r\n await getEntity([publisher, user], userContext, FetchDevTokenStatus).then((response) => {\r\n runInAction(() => {\r\n const fetchedToken = response.toString() !== 'false' ? response.toString() : DevTokenFetch.TokenNotFound;\r\n Log.info('Fetched dev token: ' + fetchedToken);\r\n if (store.devTokenPanelParams) {\r\n store.devTokenPanelParams.developerToken = fetchedToken;\r\n }\r\n });\r\n });\r\n } catch (exception) {\r\n notification = {\r\n text: `Fetching the token raised an error \"${exception}\"`,\r\n messageBarType: MessageBarType.error,\r\n };\r\n // This will make the UI show an error message instead of infinite spinner\r\n runInAction(() => {\r\n if (store.devTokenPanelParams) {\r\n store.devTokenPanelParams.developerToken = DevTokenFetch.ApiCallFailed;\r\n }\r\n });\r\n Log.error('Fetching the token raised an error ' + exception.toString());\r\n onNotificationChanged(notification);\r\n }\r\n }\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { onFormCancelled, onFormCleared } from '../actions';\r\n\r\norchestrator(onFormCancelled, async () => {\r\n onFormCleared();\r\n});\r\n","import { IUserViewModel } from '..';\r\nimport { Account, IUserRoleDetail, listEntity, Publisher, UserContext, UserRole, UserRoleEntityType } from '../../../../../@data';\r\nimport { IIdNamePair } from '../../../../../components/MultiSelectPicker';\r\n\r\nexport const fetchAccounts = async (publisher: Publisher, userContext?: UserContext): Promise<Account[]> => {\r\n return new Promise<Account[]>(async (resolve, reject) => {\r\n listEntity([publisher], userContext, Account)\r\n .then(result => resolve(result))\r\n .catch(err => reject(err));\r\n });\r\n};\r\n\r\nexport function getDistinctUserRolesFrom(current: IUserRoleDetail[], fromUserRoles: IUserRoleDetail[]): IUserRoleDetail[] {\r\n const distinctUserRoles: IUserRoleDetail[] = [];\r\n current.forEach(currentAccountRole => {\r\n const exists = fromUserRoles.some(newRole => isUserRoleSame(newRole, currentAccountRole));\r\n if (!exists) {\r\n distinctUserRoles.push(currentAccountRole);\r\n }\r\n });\r\n return distinctUserRoles;\r\n}\r\n\r\nexport function getUserRoleDetails(active: IUserViewModel, publisherId: number): IUserRoleDetail[] {\r\n const userRoleDetails: IUserRoleDetail[] = [];\r\n if (active.accountRole) {\r\n userRoleDetails.push({\r\n entityId: publisherId,\r\n userRole: active.accountRole,\r\n entityType: UserRoleEntityType.Customer\r\n });\r\n\r\n if ([UserRole.AccountManager, UserRole.AdView, UserRole.ListManager, UserRole.ReportUser].includes(active.accountRole)) {\r\n let selectedAccounts: IIdNamePair[] = [];\r\n switch (active.accountRole) {\r\n case UserRole.AccountManager:\r\n selectedAccounts = active.AccountManagerAccountsSelected!;\r\n break;\r\n case UserRole.AdView:\r\n selectedAccounts = active.AdViewAccountsSelected!;\r\n break;\r\n case UserRole.ListManager:\r\n selectedAccounts = active.ListManagerAccountsSelected!;\r\n break;\r\n\r\n case UserRole.ReportUser:\r\n selectedAccounts = active.ReportUserAccounstSelected!;\r\n break;\r\n default:\r\n break;\r\n }\r\n selectedAccounts.forEach(selectedAccount => {\r\n userRoleDetails.push({\r\n entityId: selectedAccount.id,\r\n userRole: active.accountRole!,\r\n entityType: UserRoleEntityType.Account\r\n });\r\n });\r\n }\r\n }\r\n return userRoleDetails;\r\n}\r\n\r\nexport function isDeepUserRolesEqual(a: IUserRoleDetail[], b: IUserRoleDetail[]): boolean {\r\n let isSame: boolean = true;\r\n a.forEach(eachRole => {\r\n if (b.some(someRole => isUserRoleDifferent(someRole, eachRole))) {\r\n isSame = false;\r\n }\r\n });\r\n return isSame;\r\n}\r\n\r\nfunction isUserRoleDifferent(a: IUserRoleDetail, b: IUserRoleDetail): boolean {\r\n return a.entityId !== b.entityId || a.entityType !== b.entityType || a.userRole !== b.userRole;\r\n}\r\n\r\nfunction isUserRoleSame(a: IUserRoleDetail, b: IUserRoleDetail): boolean {\r\n // tslint:disable:triple-equals\r\n // eslint-disable-next-line\r\n return a.entityId == b.entityId && a.entityType == b.entityType && a.userRole == b.userRole;\r\n // tslint:enable: triple-equals\r\n}\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport {\r\n Account,\r\n getAppStore,\r\n getEntity,\r\n IUserName,\r\n listEntity,\r\n onLoadingChanged,\r\n onLoadingSetting,\r\n onLoadingWaiting,\r\n onNotificationChanged,\r\n Publisher,\r\n User,\r\n} from '../../../../../@data';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { IIdNamePair } from '../../../../../components/MultiSelectPicker';\r\nimport { setPublisherContext } from '../../../@data/service/PartnerManagementService';\r\nimport { onFormInitialized, onRawChanged, onUserChanged, onUserErrorChanged } from '../actions';\r\nimport { fetchAccounts } from '../services/UserService';\r\nimport { IUserViewModel } from '../store/schema';\r\n\r\norchestrator(onFormInitialized, async (msg) => {\r\n const { userContext } = getAppStore();\r\n\r\n const user: IUserViewModel = {\r\n accountsList: [],\r\n };\r\n\r\n const publisherId = parseInt(msg.publisherId, 10);\r\n if (!isNaN(publisherId)) {\r\n const publisher = new Publisher(publisherId);\r\n\r\n try {\r\n setPublisherContext(publisher);\r\n onUserErrorChanged();\r\n onLoadingChanged(true);\r\n onLoadingSetting(false);\r\n const timeout = 30000;\r\n const id = setTimeout(() => onLoadingWaiting(true), timeout);\r\n const response = await listEntity([publisher], userContext, Account);\r\n\r\n user.accountsList = response ? response.map((f) => ({ id: f.id, name: f.name } as IIdNamePair)) : [];\r\n user.allAccounts = response ? response.map((f) => ({ id: f.id, name: f.name } as IIdNamePair)) : [];\r\n user.localeId = 1033; // default to US-en\r\n\r\n if (msg.mode === FormState.Edit && msg.entityId) {\r\n const userId = parseInt(msg.entityId, 10);\r\n const userWithId = new User(userId);\r\n const rawUser = await getEntity<User>([publisher, userWithId], userContext);\r\n\r\n user.isLegacyUser = rawUser.windowsLiveIdUsername ? false : true;\r\n user.firstName = (rawUser.name as IUserName).firstName;\r\n user.lastName = (rawUser.name as IUserName).lastName;\r\n user.emailAddress = rawUser.email;\r\n user.phoneNumber = rawUser.contactInfo ? rawUser.contactInfo.homePhone : '';\r\n user.faxNumber = rawUser.contactInfo ? rawUser.contactInfo.fax : '';\r\n user.userName = rawUser.username;\r\n user.language = rawUser.language;\r\n user.SecretQuestion = rawUser.secretQuestion;\r\n user.contactByEmail = rawUser.contactByEmail;\r\n user.contactByPhone = rawUser.contactByPhone;\r\n user.contactByPost = rawUser.contactByPost;\r\n user.accountRole = rawUser.userRoleDetails ? rawUser.userRoleDetails[0].userRole : undefined;\r\n user.userRoleDetails = rawUser.userRoleDetails;\r\n\r\n // set selected account list for each role after figure out the entity type mapping\r\n const accountManagerAccountList: number[] = [];\r\n const reportUserAccountList: number[] = [];\r\n const listManagerAccountList: number[] = [];\r\n const adViewAccountList: number[] = [];\r\n\r\n if (rawUser.userRoleDetails) {\r\n rawUser.userRoleDetails.forEach((i) => {\r\n switch (i.userRole) {\r\n case 'AccountManager':\r\n accountManagerAccountList.push(i.entityId);\r\n break;\r\n case 'ReportUser':\r\n reportUserAccountList.push(i.entityId);\r\n break;\r\n case 'ListManager':\r\n listManagerAccountList.push(i.entityId);\r\n break;\r\n case 'AdViewer':\r\n adViewAccountList.push(i.entityId);\r\n break;\r\n }\r\n });\r\n }\r\n const allAccounts = await fetchAccounts(publisher, userContext);\r\n clearTimeout(id);\r\n\r\n const accountManagerResponse = allAccounts.filter((acc) => {\r\n return accountManagerAccountList.some((accountManagerAccount) => accountManagerAccount === acc.id);\r\n });\r\n user.AccountManagerAccountsSelected = accountManagerResponse.map((f) => ({ id: f.id, name: f.name } as IIdNamePair));\r\n\r\n const reportUserResponse = allAccounts.filter((acc) => {\r\n return reportUserAccountList.some((reportUserAccount) => reportUserAccount === acc.id);\r\n });\r\n user.ReportUserAccounstSelected = reportUserResponse.map((f) => ({ id: f.id, name: f.name } as IIdNamePair));\r\n\r\n const listManagerResponse = allAccounts.filter((acc) => {\r\n return listManagerAccountList.some((account) => account === acc.id);\r\n });\r\n user.ListManagerAccountsSelected = listManagerResponse.map((f) => ({ id: f.id, name: f.name } as IIdNamePair));\r\n\r\n const adViewResponse = allAccounts.filter((acc) => {\r\n return adViewAccountList.some((account) => account === acc.id);\r\n });\r\n user.AdViewAccountsSelected = adViewResponse.map((f) => ({ id: f.id, name: f.name } as IIdNamePair));\r\n\r\n onRawChanged(rawUser);\r\n } else {\r\n onRawChanged();\r\n }\r\n\r\n onUserChanged(user);\r\n } catch (e) {\r\n onNotificationChanged({\r\n text: 'Failed to load entity',\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n text: `You have arrived in an invalid state, please report.`,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport {\r\n getAppStore,\r\n getEntity,\r\n onNavigateBack,\r\n onNotificationChanged,\r\n onSavingChanged,\r\n patchEntity,\r\n postEntity,\r\n Publisher,\r\n PublisherTier,\r\n UserInvitation,\r\n UserRoleEntityType,\r\n UserRoleUpdate,\r\n} from '../../../../../@data';\r\nimport { UserInvitationType } from '../../../../../@data/store/schema/enums/UserInvitationType';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport { validateSchema } from '../../../../../utils';\r\nimport { RouteName } from '../../../@data';\r\nimport { createReturnUrl } from '../../../@data/service/PartnerManagementService';\r\nimport { onFormCleared, onFormIdChanged, onFormSubmitted, onUserErrorChanged } from '../actions';\r\nimport { getDistinctUserRolesFrom, getUserRoleDetails, isDeepUserRolesEqual } from '../services/UserService';\r\nimport { userRoleErrorModel } from '../store/schema/UserErrorModel';\r\nimport { userInvitationErrorModel } from '../store/schema/UserInvitationErrorModel';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onFormSubmitted, async (msg) => {\r\n const { publisher, userContext } = getAppStore();\r\n const { active, raw } = getStore();\r\n let notification: INotificationBarItem = {};\r\n if (publisher && raw) {\r\n try {\r\n if (msg.mode === FormState.Edit) {\r\n try {\r\n await validateSchema(userRoleErrorModel(), active);\r\n onUserErrorChanged();\r\n } catch (e) {\r\n onUserErrorChanged(e);\r\n return;\r\n }\r\n onSavingChanged(true);\r\n\r\n let entity: UserRoleUpdate | undefined;\r\n entity = new UserRoleUpdate();\r\n\r\n entity.eTag = raw.userRoleDetailsETag;\r\n const existingUserRoles = raw.userRoleDetails;\r\n const editedUserRoles = getUserRoleDetails(active, publisher.id!);\r\n\r\n if (existingUserRoles && !isDeepUserRolesEqual(existingUserRoles, editedUserRoles)) {\r\n entity.addedRoles = [];\r\n entity.removedRoles = [];\r\n // there will always be only one customer level role\r\n const newCustomerLevelRole = editedUserRoles.filter((e) => e.entityType === UserRoleEntityType.Customer);\r\n\r\n // there could be many accountLevelRoles\r\n const newAccountLevelRoles = editedUserRoles.filter((e) => e.entityType === UserRoleEntityType.Account);\r\n\r\n // there existed some role earlier : will always be the case but sanity checking\r\n if (existingUserRoles && existingUserRoles.length > 0) {\r\n const existingCustomerRole = existingUserRoles.filter((e) => e.entityType === UserRoleEntityType.Customer);\r\n\r\n // if new customer role is same as than current role\r\n // 1. no need of adding customer role\r\n // 2. we need to see which account role is missing in old from new : add\r\n // 3. we need to see which account role is missing in new from old: remove\r\n // else\r\n // 1. remove old customer\r\n // 2. add new customer\r\n // 3. remove all old account level (since customer level is changed now)\r\n // 4. add all new account\r\n if (isDeepUserRolesEqual(newCustomerLevelRole, existingCustomerRole)) {\r\n const existingAccountRoles = existingUserRoles.filter((e) => e.entityType === UserRoleEntityType.Account);\r\n entity.removedRoles = getDistinctUserRolesFrom(existingAccountRoles, newAccountLevelRoles);\r\n entity.addedRoles = getDistinctUserRolesFrom(newAccountLevelRoles, existingAccountRoles);\r\n } else {\r\n entity.removedRoles = existingUserRoles;\r\n entity.addedRoles = editedUserRoles;\r\n }\r\n } else {\r\n entity.addedRoles = editedUserRoles;\r\n }\r\n\r\n entity = await patchEntity([publisher, raw], UserRoleUpdate, entity, userContext);\r\n if (entity && entity.id) {\r\n onFormIdChanged(entity.id);\r\n }\r\n\r\n notification = {\r\n text: `Edited user role for user ${raw.id} successfully`,\r\n messageBarType: MessageBarType.success,\r\n };\r\n }\r\n } else {\r\n try {\r\n await validateSchema(userInvitationErrorModel(), active);\r\n\r\n onUserErrorChanged();\r\n } catch (e) {\r\n onUserErrorChanged(e);\r\n onNotificationChanged({\r\n text: `User Invitation - You have ${Object.keys(e).length} errors in the form, please fix them to continue.`,\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n return;\r\n }\r\n onSavingChanged(true);\r\n\r\n let entity: UserInvitation;\r\n entity = new UserInvitation();\r\n entity.firstName = active.firstName;\r\n entity.lastName = active.lastName;\r\n entity.email = active.emailAddress;\r\n entity.entityRoles = [];\r\n entity.apiPath = undefined;\r\n entity.lcid = active.localeId;\r\n\r\n const publisherDetails = await getEntity<Publisher>([publisher], userContext);\r\n entity.userInvitationType = UserInvitationType.Default;\r\n if (\r\n publisherDetails.publisherTier === PublisherTier.SelfServe3rdParty ||\r\n publisherDetails.publisherTier === PublisherTier.SelfServeStandard\r\n ) {\r\n entity.userInvitationType = UserInvitationType.PubCenterSelfServeUser;\r\n }\r\n\r\n entity.entityRoles = getUserRoleDetails(active, publisher.id!);\r\n entity = await postEntity([publisher], UserInvitation, entity, userContext);\r\n\r\n if (entity && entity.id) {\r\n onFormIdChanged(entity.id);\r\n }\r\n\r\n notification = {\r\n text: `Invite new user successfully!`,\r\n messageBarType: MessageBarType.success,\r\n };\r\n }\r\n const returnUrl = createReturnUrl(RouteName.user, String(publisher.id));\r\n onNavigateBack(msg.routeHistory, returnUrl);\r\n onFormCleared();\r\n } catch (e) {\r\n notification = {\r\n text: `Submitting the user form \"${FormState[msg.mode]}\" caught an error \"${e}\"`,\r\n messageBarType: MessageBarType.error,\r\n };\r\n } finally {\r\n onSavingChanged(false);\r\n }\r\n } else {\r\n notification = {\r\n text: `User form \"${FormState[msg.mode]}\" is invalid id ${active.id}`,\r\n messageBarType: MessageBarType.warning,\r\n };\r\n }\r\n onNotificationChanged(notification);\r\n});\r\n","import { array, mixed, object } from 'yup';\r\nimport { IdNamePairErrorModel, UserRole } from '../../../../../../@data';\r\nimport { ArrayObservableSchemaYupType } from '../../../../../../utils';\r\nimport { IUserViewModel } from './IUserViewModel';\r\n\r\nexport function userRoleErrorModel() {\r\n return object<IUserViewModel>().shape({\r\n AccountManagerAccountsSelected: new ArrayObservableSchemaYupType().of(IdNamePairErrorModel).when('accountRole', {\r\n is: UserRole.AccountManager,\r\n then: array()\r\n .min(1)\r\n .required(),\r\n\r\n otherwise: array()\r\n }),\r\n ReportUserAccounstSelected: new ArrayObservableSchemaYupType().of(IdNamePairErrorModel).when('accountRole', {\r\n is: UserRole.ReportUser,\r\n then: array()\r\n .required()\r\n .min(1),\r\n otherwise: array()\r\n }),\r\n ListManagerAccountsSelected: new ArrayObservableSchemaYupType().of(IdNamePairErrorModel).when('accountRole', {\r\n is: UserRole.ListManager,\r\n then: array()\r\n .required()\r\n .min(1),\r\n otherwise: array()\r\n }),\r\n AdViewAccountsSelected: new ArrayObservableSchemaYupType().of(IdNamePairErrorModel).when('accountRole', {\r\n is: UserRole.AdView,\r\n then: array()\r\n .required()\r\n .min(1),\r\n otherwise: array()\r\n }),\r\n accountRole: mixed()\r\n .oneOf([\r\n UserRole.AccountManager,\r\n UserRole.AdView,\r\n UserRole.ListManager,\r\n UserRole.PublisherAdmin,\r\n UserRole.ReportUser,\r\n UserRole.SuperAdmin\r\n ])\r\n .required()\r\n });\r\n}\r\n","import { array, mixed, number, object, string } from 'yup';\r\nimport { IdNamePairErrorModel, UserRole } from '../../../../../../@data';\r\nimport { ArrayObservableSchemaYupType } from '../../../../../../utils';\r\nimport { IUserViewModel } from './IUserViewModel';\r\n\r\nexport function userInvitationErrorModel() {\r\n return object<IUserViewModel>().shape({\r\n firstName: string()\r\n .trim()\r\n .required(),\r\n lastName: string()\r\n .trim()\r\n .required(),\r\n emailAddress: string()\r\n .email()\r\n .required(),\r\n localeId: number().required(),\r\n AccountManagerAccountsSelected: new ArrayObservableSchemaYupType().of(IdNamePairErrorModel).when('accountRole', {\r\n is: UserRole.AccountManager,\r\n then: array()\r\n .min(1)\r\n .required(),\r\n\r\n otherwise: array()\r\n }),\r\n ReportUserAccounstSelected: new ArrayObservableSchemaYupType().of(IdNamePairErrorModel).when('accountRole', {\r\n is: UserRole.ReportUser,\r\n then: array()\r\n .required()\r\n .min(1),\r\n otherwise: array()\r\n }),\r\n ListManagerAccountsSelected: new ArrayObservableSchemaYupType().of(IdNamePairErrorModel).when('accountRole', {\r\n is: UserRole.ListManager,\r\n then: array()\r\n .required()\r\n .min(1),\r\n otherwise: array()\r\n }),\r\n AdViewAccountsSelected: new ArrayObservableSchemaYupType().of(IdNamePairErrorModel).when('accountRole', {\r\n is: UserRole.AdView,\r\n then: array()\r\n .required()\r\n .min(1),\r\n otherwise: array()\r\n }),\r\n accountRole: mixed()\r\n .oneOf([\r\n UserRole.AccountManager,\r\n UserRole.AdView,\r\n UserRole.ListManager,\r\n UserRole.PublisherAdmin,\r\n UserRole.ReportUser,\r\n UserRole.SuperAdmin\r\n ])\r\n .required()\r\n });\r\n}\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { getStore } from '..';\r\nimport {\r\n deleteEntity,\r\n getAppStore,\r\n getEntity,\r\n onNotificationChanged,\r\n postEntity,\r\n Publisher,\r\n PublisherTier,\r\n showLoadingToastNotification,\r\n showSuccessToastNotification,\r\n UserInvitation,\r\n UserInvitationResend,\r\n UserInvitationType,\r\n} from '../../../../../@data';\r\nimport { FormState } from '../../../../../components/Form';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport messages from '../../UserPage.messages';\r\nimport { onUserInvitationChanged, onUserInvitationExpiryChanged, onUserInvitationsChanged } from '../actions';\r\n\r\norchestrator(onUserInvitationChanged, async (msg) => {\r\n const { publisher, userContext } = getAppStore();\r\n const selectedItem = msg.value as UserInvitation;\r\n let notification: INotificationBarItem = {};\r\n\r\n if (selectedItem && publisher && userContext) {\r\n const entityInstance = new UserInvitation();\r\n entityInstance.id = selectedItem.id;\r\n const publisherDetails = await getEntity<Publisher>([publisher], userContext);\r\n entityInstance.userInvitationType = UserInvitationType.Default;\r\n if (\r\n publisherDetails.publisherTier === PublisherTier.SelfServe3rdParty ||\r\n publisherDetails.publisherTier === PublisherTier.SelfServeStandard\r\n ) {\r\n entityInstance.userInvitationType = UserInvitationType.PubCenterSelfServeUser;\r\n }\r\n try {\r\n if (msg.mode === FormState.Resend) {\r\n showLoadingToastNotification({\r\n textMessageDescriptor: messages.resendingUserInvitation,\r\n intlMessageValues: { email: selectedItem.email },\r\n onDismiss: async () => {\r\n await postEntity([publisher, entityInstance], UserInvitationResend, entityInstance, userContext);\r\n\r\n /* Updating the user invitation expiry date on successful resend */\r\n onUserInvitationExpiryChanged(selectedItem.id, new Date(new Date().setDate(new Date().getDate() + 30)));\r\n\r\n showSuccessToastNotification({\r\n textMessageDescriptor: messages.resendUserInvitationSuccess,\r\n intlMessageValues: { email: selectedItem.email },\r\n });\r\n },\r\n });\r\n } else if (msg.mode === FormState.Delete) {\r\n const result = await deleteEntity([publisher, entityInstance], undefined, userContext);\r\n\r\n if (result) {\r\n let userInvitations = getStore().userInvitations;\r\n\r\n if (userInvitations) {\r\n userInvitations = userInvitations.filter((item) => item.id !== selectedItem.id);\r\n }\r\n onUserInvitationsChanged(userInvitations);\r\n\r\n showSuccessToastNotification({\r\n textMessageDescriptor: messages.deletedUserInvitationSuccess,\r\n intlMessageValues: { firstName: selectedItem.firstName },\r\n });\r\n }\r\n }\r\n } catch (e) {\r\n notification = {\r\n text: (msg.mode === FormState.Delete ? 'Deleting' : 'Resending ') + `the invitation caught an error \"${e}\"`,\r\n messageBarType: MessageBarType.error,\r\n };\r\n onNotificationChanged(notification);\r\n }\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { runInAction } from 'mobx';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { GenerateDevToken, Model, User, getAppStore, getEntity, onNotificationChanged } from '../../../../../@data';\r\nimport { INotificationBarItem } from '../../../../../components/NotificationBar';\r\nimport { DevTokenFetch } from '../../Manage/ManagePage.types';\r\nimport { onGenerateDevTokenStatus } from '../actions';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onGenerateDevTokenStatus, async (msg) => {\r\n const store = getStore();\r\n const selectedItem = msg.selectedItem as Model;\r\n let notification: INotificationBarItem = {};\r\n\r\n if (store && selectedItem) {\r\n const { userContext, publisher } = getAppStore();\r\n if (userContext && publisher) {\r\n try {\r\n const userId = selectedItem.id;\r\n const user = new User(userId);\r\n Log.debug('Generating a new dev token for user ' + userId);\r\n\r\n // While awaiting the call to generate new dev token, the intermediate value of token is set to undefined\r\n // This facilitates the spinner to show up with the following text\r\n runInAction(() => {\r\n if (store.devTokenPanelParams) {\r\n store.devTokenPanelParams.developerToken = undefined;\r\n store.devTokenPanelParams.SpinnerText = 'Generating Developer Token...';\r\n }\r\n });\r\n\r\n await getEntity([publisher, user], userContext, GenerateDevToken).then((response) => {\r\n runInAction(() => {\r\n const generatedToken = response.toString();\r\n Log.info('Generated dev token: ' + generatedToken);\r\n if (store.devTokenPanelParams) {\r\n store.devTokenPanelParams.developerToken = generatedToken;\r\n }\r\n });\r\n });\r\n notification = {\r\n text: 'Developer token has been successfully generated for the selected user ' + userId,\r\n messageBarType: MessageBarType.success,\r\n };\r\n } catch (exception) {\r\n notification = {\r\n text: `Generating the token raised an error \"${exception}\"`,\r\n messageBarType: MessageBarType.error,\r\n };\r\n // This will make the UI show an error message instead of infinite spinner\r\n runInAction(() => {\r\n if (store.devTokenPanelParams) {\r\n store.devTokenPanelParams.developerToken = DevTokenFetch.ApiCallFailed;\r\n }\r\n });\r\n Log.error('Generating the token raised an error ' + exception.toString());\r\n }\r\n onNotificationChanged(notification);\r\n }\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { getAppStore, listEntity, onNotificationChanged, User } from '../../../../../@data';\r\nimport { onFetchingUsersData, onFetchUsersLoading, onUsersChanged } from '../actions';\r\nimport { onManagePageInitialized } from '../actions/onManagePageInitialized';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onManagePageInitialized, async (msg) => {\r\n try {\r\n const { publisher, userContext } = getAppStore();\r\n const users = getStore().users;\r\n\r\n if (users === undefined || users.length === 0) {\r\n onFetchUsersLoading(true);\r\n }\r\n onFetchingUsersData(true);\r\n\r\n if (userContext && publisher) {\r\n const fetchedUsers = await listEntity([publisher], userContext, User);\r\n onUsersChanged(fetchedUsers);\r\n }\r\n } catch (error) {\r\n Log.error(error);\r\n onNotificationChanged({ messageBarType: MessageBarType.error, text: 'Failed to load users' });\r\n } finally {\r\n onFetchUsersLoading(false);\r\n onFetchingUsersData(false);\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { User, getAppStore, postEntity } from '../../../../../@data';\r\nimport { WelcomeToPubcenterEmail } from '../../../../../@data/store/schema/models/welcomeToPubcenterEmail';\r\nimport { sendWelcomeToPubcenterEmail } from '../actions';\r\n\r\norchestrator(sendWelcomeToPubcenterEmail, async () => {\r\n\r\n\r\n const { userContext, publisher} = getAppStore();\r\n if (!publisher || ! userContext) {\r\n return;\r\n }\r\n try {\r\n const user = new User(userContext.id);\r\n await postEntity([publisher!, user], WelcomeToPubcenterEmail, undefined, userContext);\r\n } catch (e) {\r\n Log.error(e);\r\n }\r\n});","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { getAppStore, listEntity, onNotificationChanged, UserInvitation } from '../../../../../@data';\r\nimport { onFetchingUserInvitationsData, onFetchUserInvitationsLoading, onUserInvitationsChanged } from '../actions';\r\nimport { onUserInvitationsGridInitialized } from '../actions/onManagePageInitialized';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onUserInvitationsGridInitialized, async (msg) => {\r\n try {\r\n const { publisher, userContext } = getAppStore();\r\n const userInvitations = getStore().userInvitations;\r\n\r\n if (userInvitations === undefined || userInvitations.length === 0) {\r\n onFetchUserInvitationsLoading(true);\r\n }\r\n onFetchingUserInvitationsData(true);\r\n\r\n if (userContext && publisher) {\r\n const fetchedUserInvitations = await listEntity([publisher], userContext, UserInvitation);\r\n fetchedUserInvitations.forEach((userInvitation) => {\r\n if (!!userInvitation.expirationDate) {\r\n userInvitation.expirationDate = new Date(userInvitation.expirationDate).toISOString();\r\n }\r\n });\r\n onUserInvitationsChanged(fetchedUserInvitations);\r\n }\r\n } catch (error) {\r\n Log.error(error);\r\n onNotificationChanged({ messageBarType: MessageBarType.error, text: 'Failed to load user invitations' });\r\n } finally {\r\n onFetchUserInvitationsLoading(false);\r\n onFetchingUserInvitationsData(false);\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { onNotificationChanged } from '../../../../../@data';\r\nimport { uiConfig } from '../../../../../config/ui.config';\r\nimport { validateUserInvitationCode } from '../actions';\r\n\r\norchestrator(validateUserInvitationCode, async ({ invitationCode }) => {\r\n if (invitationCode !== 'redirect') {\r\n const defaultHeaders = [['content-type', 'application/json']];\r\n const headers = new Headers([...defaultHeaders]);\r\n const body = { invitationCode: invitationCode };\r\n const url = uiConfig.getApiBaseAddress() + '/public/userInvitations/validate';\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: JSON.stringify(body),\r\n });\r\n\r\n if (!response.ok && response.status === 400) {\r\n onNotificationChanged({\r\n text: 'Invalid invitation code, please check with your admin to resend user invitation',\r\n messageBarType: MessageBarType.error,\r\n suppressAutoDismiss: true,\r\n });\r\n return;\r\n }\r\n } catch (error) {\r\n Log.error(error);\r\n }\r\n }\r\n});\r\n","import { when } from 'mobx';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport {\r\n getCurrentPublisherId,\r\n getPublisherCountry,\r\n isPublisherProfileDataPresent,\r\n onLoadingChanged,\r\n showErrorToastNotification,\r\n} from '../../../../../@data';\r\nimport { fetchStatesOfCountry } from '../../../../../@data/@metadata/actions';\r\nimport { isStatesPresentForCountry } from '../../../../../@data/@metadata/store/selectors';\r\nimport { getPrimaryUserId } from '../../../../../@data/store';\r\nimport messages from '../../ProfilePage.messages';\r\nimport { editProfileAction, fetchPublisherProfileDetailsAction, fetchUserDetailsAction } from '../actions';\r\nimport { initializeProfileActiveStateFromRawDataAction, setProfileEditModeAction } from '../actions/mutatorActions';\r\nimport { isPrimaryUserDataPresent } from '../store/selectors';\r\n\r\norchestrator(editProfileAction, async () => {\r\n try {\r\n onLoadingChanged(true);\r\n\r\n when(\r\n () => {\r\n const publisherCountry = getPublisherCountry();\r\n return !!publisherCountry && !isStatesPresentForCountry(publisherCountry);\r\n },\r\n () => fetchStatesOfCountry(getPublisherCountry()!)\r\n );\r\n\r\n const primaryUserId = getPrimaryUserId();\r\n if (primaryUserId) {\r\n fetchUserDetailsAction(primaryUserId);\r\n }\r\n\r\n fetchPublisherProfileDetailsAction(getCurrentPublisherId());\r\n\r\n await when(() => {\r\n const publisherCountry = getPublisherCountry();\r\n return (\r\n isPublisherProfileDataPresent() && isPrimaryUserDataPresent() && !!publisherCountry && isStatesPresentForCountry(publisherCountry)\r\n );\r\n });\r\n\r\n initializeProfileActiveStateFromRawDataAction();\r\n setProfileEditModeAction(true);\r\n } catch (error) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.failedToLoadProfileDetails });\r\n Log.error(`Failed to load profile details: ${error.message}`);\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { EntityEvaluation, getAppStore, listEntity } from '../../../../../@data';\r\nimport { AppealHistory } from '../../../../../@data/store/schema/models/AppealHistory';\r\nimport { fetchAppealHistory, setAppealHistory } from '../actions';\r\n\r\norchestrator(fetchAppealHistory, async () => {\r\n const { publisher, userContext } = getAppStore();\r\n\r\n // fetch appeal history\r\n if (publisher && userContext) {\r\n try {\r\n const appealHistory: AppealHistory[] = await listEntity([new EntityEvaluation(), publisher], userContext, AppealHistory);\r\n setAppealHistory(appealHistory);\r\n } catch (e) {\r\n console.log('Failed to fetch appeal history');\r\n }\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { showErrorToastNotification, User } from '../../../../../@data';\r\nimport messages from '../../ProfilePage.messages';\r\nimport { fetchUserDetailsAction } from '../actions';\r\nimport { setPrimaryUserDetailsAction } from '../actions/mutatorActions';\r\nimport { fetchUserDetails } from '../services/fetchUserDetails';\r\n\r\norchestrator(fetchUserDetailsAction, async ({ userId }) => {\r\n try {\r\n if (!userId) {\r\n return;\r\n }\r\n\r\n const userDetails = await fetchUserDetails(new User(userId));\r\n setPrimaryUserDetailsAction(userDetails);\r\n } catch (error) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.loadUserDetailsFailed });\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { onPublisherChanged, Publisher, showErrorToastNotification, StoragePublisherKey } from '../../../../../@data';\r\nimport messages from '../../ProfilePage.messages';\r\nimport { fetchPublisherProfileDetailsAction } from '../actions';\r\nimport { setPublisherProfileDetailsAction } from '../actions/mutatorActions';\r\nimport { fetchPublisherProfileDetails } from '../services/fetchPublisherProfileDetails';\r\n\r\norchestrator(fetchPublisherProfileDetailsAction, async ({ publisherId }) => {\r\n try {\r\n if (!publisherId) {\r\n return;\r\n }\r\n\r\n const publisherProfileDetails = await fetchPublisherProfileDetails(new Publisher(publisherId));\r\n const publisher = new Publisher(publisherProfileDetails.id, publisherProfileDetails.name);\r\n publisher.publisherTier = publisherProfileDetails.publisherTier;\r\n publisher.enableDefaultTythonV2Reporting = publisherProfileDetails.enableDefaultTythonV2Reporting;\r\n localStorage.setItem(StoragePublisherKey, JSON.stringify(publisher));\r\n setPublisherProfileDetailsAction(publisherProfileDetails);\r\n onPublisherChanged(publisherProfileDetails);\r\n } catch (error) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.failedToLoadPublisherDetails });\r\n Log.error(`Failed to load publisher details: ${error.message}`);\r\n }\r\n});\r\n","import { when } from 'mobx';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport {\r\n IPhoneVerificationData,\r\n PhoneVerificationGenerateCode,\r\n PhoneVerificationMediumType,\r\n PhoneVerificationSubStatus,\r\n User,\r\n getCurrentPublisher,\r\n isOrganizationPublisher,\r\n onLoadingChanged,\r\n showErrorToastNotification,\r\n} from '../../../../../@data';\r\nimport { EN_LOCALE_KEY } from '../../../../../constants';\r\nimport { deepClone } from '../../../../../utils';\r\nimport { getStore } from '../../../Account/Settings/@data/store/store';\r\nimport messages from '../../ProfilePage.messages';\r\nimport VerificationErrorsMessages from '../../VerificationErrors.messages';\r\nimport {\r\n generateVerificationCode,\r\n setIsPhoneVerificationCodeShown,\r\n setIsPhoneVerificationMethodsShown,\r\n setPhoneVerificationRequestId,\r\n setPhoneVerificationResp,\r\n setVerificationCodeGenerationLimitReached,\r\n} from '../actions';\r\nimport { generateCodeAsync } from '../services';\r\nimport { VerificationCodeGenerationErrorCodes } from '../store/schema/VerificationCodeGenerationErrorCodes';\r\nimport { getProfileStore } from '../store/store';\r\n\r\norchestrator(generateVerificationCode, async ({ profile }) => {\r\n try {\r\n const publisher = getCurrentPublisher();\r\n\r\n if (!publisher) {\r\n return Promise.reject('No publisher found');\r\n }\r\n\r\n const newUserDetails: User = deepClone(profile.user);\r\n if (!newUserDetails) {\r\n throw new Error('User details are missing');\r\n }\r\n\r\n const { systemPreferences } = getStore().active;\r\n const phoneVerificationGenerateCode: PhoneVerificationGenerateCode = profile.phoneVerificationGenerateCode;\r\n phoneVerificationGenerateCode.locale = systemPreferences && systemPreferences.locale ? systemPreferences.locale : EN_LOCALE_KEY;\r\n if (phoneVerificationGenerateCode.verificationMediumType === PhoneVerificationMediumType.email) {\r\n phoneVerificationGenerateCode.email = profile.publisher?.extendedProperties?.organizationEmailAddress!;\r\n } else {\r\n phoneVerificationGenerateCode.phoneNumberWithCountryCode = newUserDetails.contactInfo?.phone1!;\r\n }\r\n\r\n const result: IPhoneVerificationData = await generateCodeAsync(phoneVerificationGenerateCode, publisher);\r\n\r\n setPhoneVerificationRequestId(result.requestId);\r\n setPhoneVerificationResp(result);\r\n setVerificationCodeGenerationLimitReached(false);\r\n onLoadingChanged(false);\r\n\r\n if (phoneVerificationGenerateCode.verificationMediumType === PhoneVerificationMediumType.email) {\r\n setIsPhoneVerificationCodeShown(true);\r\n }\r\n // need to check subStatus other options\r\n await when(\r\n () => {\r\n const subStatus = getProfileStore().active.phoneVerificationResp?.subStatus;\r\n return subStatus === PhoneVerificationSubStatus.deliveryFailed || subStatus === PhoneVerificationSubStatus.codeSent;\r\n },\r\n () => {\r\n const subStatus = getProfileStore().active.phoneVerificationResp?.subStatus;\r\n if (subStatus === PhoneVerificationSubStatus.codeSent) {\r\n setIsPhoneVerificationMethodsShown(false);\r\n setIsPhoneVerificationCodeShown(true);\r\n } else if (subStatus === PhoneVerificationSubStatus.deliveryFailed) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.generatedCodeFailed });\r\n }\r\n }\r\n );\r\n } catch (error) {\r\n let apiErrorCode: VerificationCodeGenerationErrorCodes;\r\n switch (error.code) {\r\n case 400:\r\n apiErrorCode = JSON.parse(error.message)?.[0]?.code;\r\n showErrorToastNotification({\r\n textMessageDescriptor:\r\n VerificationErrorsMessages[apiErrorCode] ?? isOrganizationPublisher()\r\n ? messages.generateEmailVerificationCodeFailed\r\n : messages.generateVerificationCodeFailed,\r\n });\r\n break;\r\n case 403:\r\n apiErrorCode = JSON.parse(error.message)?.[0]?.code;\r\n if (apiErrorCode === VerificationCodeGenerationErrorCodes.CODE_GENERATION_LIMIT_REACHED) {\r\n setIsPhoneVerificationCodeShown(true);\r\n setVerificationCodeGenerationLimitReached(true);\r\n }\r\n break;\r\n default:\r\n showErrorToastNotification({\r\n textMessageDescriptor: isOrganizationPublisher()\r\n ? messages.generateEmailVerificationCodeFailed\r\n : messages.generateVerificationCodeFailed,\r\n });\r\n break;\r\n }\r\n onLoadingChanged(false);\r\n Log.error(error);\r\n }\r\n});\r\n","import { when } from 'mobx';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { getAppStore, isPublisherProfileDataPresent, onLoadingChanged, showErrorToastNotification } from '../../../../../@data';\r\nimport { getXPayJwtToken } from '../../../../../@data/services/PaymentsService';\r\nimport { XPayJwtTokenRequest, getPrimaryUserId } from '../../../../../@data/store';\r\nimport { fetchAccountById } from '../../../../partner-management/Account/@data/services/AccountService';\r\nimport { fetchPublisherEvaluationStatusAction } from '../../../@data/actions';\r\nimport { setXpayJwtToken, setXpayJwtTokenExpirationTime, setXpayJwtTokenStatusIsLoading } from '../../../Account/@data/actions';\r\nimport messages from '../../ProfilePage.messages';\r\nimport { fetchPublisherProfileDetailsAction, fetchUserDetailsAction, onInitializeProfilePage } from '../actions';\r\nimport { setLoadingStateAction } from '../actions/mutatorActions';\r\nimport { isPrimaryUserDataPresent } from '../store/selectors';\r\n\r\norchestrator(onInitializeProfilePage, async ({ publisherId, countryCode }) => {\r\n setLoadingStateAction(true);\r\n onLoadingChanged(true);\r\n\r\n try {\r\n fetchPublisherProfileDetailsAction(publisherId);\r\n\r\n // Action to trigger GET user details API call\r\n // For Tython, primary user is the current logged in user\r\n // But this will change when user-management is implemented and multiple users are supported\r\n const primaryUserId = getPrimaryUserId();\r\n if (!primaryUserId) {\r\n throw new Error('User not found. Please login again.');\r\n }\r\n fetchUserDetailsAction(primaryUserId);\r\n\r\n if (!getAppStore().publisherEvaluationStatus || getAppStore().isPublisherEvaluationStatusFetchFailed) {\r\n fetchPublisherEvaluationStatusAction();\r\n }\r\n\r\n setXpayJwtTokenStatusIsLoading(true);\r\n const userContext = getAppStore().userContext;\r\n const publisher = getAppStore().publisher;\r\n const accountId = getAppStore().account?.id;\r\n const account = await fetchAccountById(publisher!, accountId, userContext);\r\n const xPayJWTRequest = new XPayJwtTokenRequest();\r\n xPayJWTRequest.publisherId = publisher?.id!;\r\n xPayJWTRequest.countryCode = account.countryCode || countryCode;\r\n const tokenResponse = await getXPayJwtToken(xPayJWTRequest, userContext!);\r\n const tokenExpirationTime = new Date();\r\n tokenExpirationTime.setMinutes(tokenExpirationTime.getMinutes() + 5);\r\n setXpayJwtToken(tokenResponse.xpayJwtToken, xPayJWTRequest);\r\n setXpayJwtTokenExpirationTime(tokenExpirationTime.getTime());\r\n\r\n // wait till the publisher details are fetched and set in the store\r\n await when(() => {\r\n return isPrimaryUserDataPresent() && isPublisherProfileDataPresent();\r\n });\r\n } catch (error) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.publisherProfileDetailsFailed });\r\n Log.error(`Error while initializing profile page ${error}`);\r\n } finally {\r\n setLoadingStateAction(false);\r\n onLoadingChanged(false);\r\n setXpayJwtTokenStatusIsLoading(false);\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { buildRequestHeadersWithAuthToken, getAppStore, showErrorToastNotification } from '../../../../../@data';\r\nimport { uiConfig } from '../../../../../config/ui.config';\r\nimport messages from '../../ProfilePage.messages';\r\nimport { submitEvidenceDocument } from '../actions';\r\nimport { DocumentUploadStatus } from '../store/schema';\r\n\r\norchestrator(submitEvidenceDocument, async ({ setDocumentUploadStatus, documentContent }) => {\r\n const { publisher, userContext } = getAppStore();\r\n\r\n if (userContext && publisher && documentContent) {\r\n const url = `${uiConfig.getApiBaseAddress()}/entityEvaluation/publishers/${publisher.id}/appeals/submitEvidence`;\r\n const headers = await buildRequestHeadersWithAuthToken(url, userContext, false);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: documentContent,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(response.statusText);\r\n }\r\n\r\n Log.info(`Evidence submitted successfully for: ${documentContent?.get('EvidenceDocumentType')}`);\r\n\r\n setDocumentUploadStatus(DocumentUploadStatus.Uploaded);\r\n } catch (error) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.failedToSubmitEvidence });\r\n Log.error(`Failed to submit evidence: ${error.message}`);\r\n }\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { onLoadingChanged, Publisher, showErrorToastNotification, UpdateUserContactDetails, User } from '../../../../../@data';\r\nimport { isIndividualPublisher } from '../../../../../@data/selectors';\r\nimport { deepClone } from '../../../../../utils';\r\nimport { setPublisherEvalutionStatusToInReview } from '../../../@data/actions/entityEvaluationMutatorActions';\r\nimport messages from '../../ProfilePage.messages';\r\nimport {\r\n setIsSubmittedAction,\r\n setPrimaryUserDetailsAction,\r\n setProfileEditModeAction,\r\n setPublisherProfileDetailsAction,\r\n updatePublisherProfileAction,\r\n} from '../actions';\r\nimport { updatePublisherDetails } from '../services';\r\nimport { updateUserContactDetails } from '../services/updateUserContactDetails';\r\n\r\nconst animationTimeMS: number = 5000;\r\n\r\norchestrator(updatePublisherProfileAction, async ({ profile }) => {\r\n try {\r\n onLoadingChanged(true);\r\n\r\n const newPublisherDetails: Publisher = deepClone(profile.publisher);\r\n if (!newPublisherDetails) {\r\n throw new Error('Publisher details are missing');\r\n }\r\n\r\n // NOTE: Setting this from UI because API doesn't have a way to tell this. Pending on @srivatsa.\r\n newPublisherDetails.profileComplete = true;\r\n\r\n const newUserDetails: User = deepClone(profile.user);\r\n if (!newUserDetails) {\r\n throw new Error('User details are missing');\r\n }\r\n\r\n // For individual publishers, we need to set the user address as publisher address.\r\n if (isIndividualPublisher()) {\r\n newPublisherDetails.address = { ...newPublisherDetails.address, ...newUserDetails.postalAddress };\r\n }\r\n\r\n const newUserContactDetails = new UpdateUserContactDetails();\r\n newUserContactDetails.postalAddress = newUserDetails.postalAddress;\r\n newUserContactDetails.userId = newUserDetails.id;\r\n newUserContactDetails.phone = newUserDetails.contactInfo?.phone1;\r\n\r\n // Keeping the User and Publisher update sequential and in this order to avoid race condition with CRM Profile sync\r\n await updateUserContactDetails(newUserContactDetails);\r\n const updatedPublisherDetails = await updatePublisherDetails(newPublisherDetails);\r\n\r\n // Update the local store with the updated publisher details\r\n setPublisherProfileDetailsAction(updatedPublisherDetails);\r\n\r\n // Update the local store with the updated user details\r\n setPrimaryUserDetailsAction(newUserDetails);\r\n\r\n // Change the edit mode back to summary mode\r\n setProfileEditModeAction(false);\r\n setIsSubmittedAction(true);\r\n\r\n setPublisherEvalutionStatusToInReview(newPublisherDetails);\r\n } catch (error) {\r\n if (error.code === 400) {\r\n showErrorToastNotification({ text: JSON.parse(error.message)[0].description, animationTime: animationTimeMS });\r\n } else {\r\n showErrorToastNotification({ textMessageDescriptor: messages.updatePublisherProfileDetailsFailed });\r\n }\r\n\r\n Log.error(error);\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n});\r\n","import { getAppStore, getCurrentPublisher, patchEntity, UpdateUserContactDetails, User } from '../../../../../@data';\r\nimport { getPrimaryUserId } from '../../../../../@data/store';\r\n\r\nexport async function updateUserContactDetails(body: UpdateUserContactDetails) {\r\n const publisher = getCurrentPublisher();\r\n const primaryUser = new User(getPrimaryUserId());\r\n\r\n if (!publisher) {\r\n return Promise.reject('No publisher found');\r\n }\r\n\r\n if (!primaryUser.id) {\r\n return Promise.reject('No primary user found');\r\n }\r\n\r\n const { userContext } = getAppStore();\r\n const userDetails = await patchEntity([publisher, primaryUser], UpdateUserContactDetails, body, userContext);\r\n return userDetails;\r\n}\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { User, getCurrentPublisher, onLoadingChanged, showErrorToastNotification } from '../../../../../@data';\r\nimport { AddressValidation } from '../../../../../@data/store/schema/models/AddressValidation';\r\nimport { deepClone } from '../../../../../utils';\r\nimport messages from '../../ProfilePage.messages';\r\nimport { setIsAddressValid, setProfileErrorsAction, validateAddress } from '../actions';\r\nimport { validateAddressAsync } from '../services';\r\n\r\norchestrator(validateAddress, async ({ profile, formatMessage }) => {\r\n try {\r\n const publisher = getCurrentPublisher();\r\n if (!publisher) {\r\n return Promise.reject('No publisher found');\r\n }\r\n\r\n const newUserDetails: User = deepClone(profile.user);\r\n if (!newUserDetails) {\r\n throw new Error('User details are missing');\r\n }\r\n\r\n const addressValidation = new AddressValidation();\r\n addressValidation.postalCode = newUserDetails.postalAddress?.postalCode;\r\n addressValidation.country = newUserDetails.postalAddress?.country;\r\n addressValidation.city = newUserDetails.postalAddress?.city;\r\n addressValidation.stateOrProvince = newUserDetails.postalAddress?.stateOrProvince;\r\n addressValidation.line1 = newUserDetails.postalAddress?.line1;\r\n addressValidation.line2 = newUserDetails.postalAddress?.line2;\r\n addressValidation.isOrg = false;\r\n\r\n // add new endpoint call\r\n const result = await validateAddressAsync(addressValidation, publisher);\r\n setIsAddressValid(result.isAddressValid);\r\n } catch (error) {\r\n if (error.code === 400) {\r\n setProfileErrorsAction({ 'user.postalAddress.postalCode': formatMessage(messages.profileInvalidAddressErrorMessage) });\r\n } else {\r\n showErrorToastNotification({ text: formatMessage(messages.profileAddressValidationFailed) });\r\n }\r\n setIsAddressValid(false);\r\n onLoadingChanged(false);\r\n Log.error(error);\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { when } from 'mobx';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { PhoneVerificationMediumType, isOrganizationPublisher, onLoadingChanged, onNotificationChanged } from '../../../../../@data';\r\nimport { validateSchema } from '../../../../../utils';\r\nimport messages from '../../ProfilePage.messages';\r\nimport {\r\n generateVerificationCode,\r\n setIsAddressValid,\r\n setIsOrgAddressValid,\r\n setIsPhoneVerificationMethodsShown,\r\n setIsPreviewShownAction,\r\n setPhoneVerificationMediumType,\r\n setProfileErrorsAction,\r\n validateAndPreviewProfileChangesAction,\r\n} from '../actions';\r\nimport { profileValidationModel } from '../store/schema';\r\nimport { getProfileActiveData, getPublisherProfileActiveData } from '../store/selectors';\r\nimport { getProfileStore } from '../store/store';\r\n\r\norchestrator(validateAndPreviewProfileChangesAction, async ({ profile, formatMessage, isVerificationRequired }) => {\r\n try {\r\n onLoadingChanged(true);\r\n await validateSchema(profileValidationModel(), profile);\r\n // validateAddress(getPublisherProfileActiveData(), formatMessage);\r\n setIsAddressValid(true);\r\n if (isOrganizationPublisher()) {\r\n // await validateOrgAddress(getPublisherProfileActiveData(), formatMessage);\r\n setIsOrgAddressValid(true);\r\n }\r\n setProfileErrorsAction();\r\n\r\n when(\r\n () => {\r\n const isAddressValid = getProfileActiveData().isAddressValid;\r\n const isOrgAddressValid = getProfileActiveData().isOrgAddressValid;\r\n\r\n let retValue = isAddressValid === true || isAddressValid === false;\r\n if (isOrganizationPublisher()) {\r\n retValue = retValue && (isOrgAddressValid === true || isOrgAddressValid === false);\r\n }\r\n\r\n return retValue;\r\n },\r\n async () => {\r\n let isAddressValid = getProfileActiveData().isAddressValid;\r\n if (isOrganizationPublisher()) {\r\n isAddressValid = isAddressValid && getProfileActiveData().isOrgAddressValid;\r\n }\r\n if (!getProfileStore().active.isLoading && isAddressValid) {\r\n if (isOrganizationPublisher()) {\r\n setPhoneVerificationMediumType(PhoneVerificationMediumType.email);\r\n if (isVerificationRequired) {\r\n generateVerificationCode(getPublisherProfileActiveData());\r\n } else {\r\n onLoadingChanged(false);\r\n setIsPreviewShownAction(true);\r\n }\r\n } else {\r\n onLoadingChanged(false);\r\n setIsPhoneVerificationMethodsShown(true);\r\n }\r\n }\r\n setIsAddressValid(undefined);\r\n setIsOrgAddressValid(undefined);\r\n }\r\n );\r\n } catch (e) {\r\n setProfileErrorsAction(e);\r\n onNotificationChanged({\r\n text: formatMessage(messages.profileInvalidFieldsErrorMessage, {\r\n count: Object.keys(e).length,\r\n }),\r\n messageBarType: MessageBarType.severeWarning,\r\n });\r\n onLoadingChanged(false);\r\n return;\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { Publisher, getCurrentPublisher, onLoadingChanged, showErrorToastNotification } from '../../../../../@data';\r\nimport { AddressValidation } from '../../../../../@data/store/schema/models/AddressValidation';\r\nimport { deepClone } from '../../../../../utils';\r\nimport messages from '../../ProfilePage.messages';\r\nimport { setIsOrgAddressValid, setProfileErrorsAction, validateOrgAddress } from '../actions';\r\nimport { validateAddressAsync } from '../services';\r\n\r\norchestrator(validateOrgAddress, async ({ profile, formatMessage }) => {\r\n try {\r\n const publisher = getCurrentPublisher();\r\n\r\n if (!publisher) {\r\n return Promise.reject('No publisher found');\r\n }\r\n\r\n const newPublisherDetails: Publisher = deepClone(profile.publisher);\r\n if (!newPublisherDetails) {\r\n throw new Error('Publisher details are missing');\r\n }\r\n\r\n const addressValidation = new AddressValidation();\r\n addressValidation.postalCode = newPublisherDetails.address?.postalCode;\r\n addressValidation.country = newPublisherDetails.address?.country;\r\n addressValidation.city = newPublisherDetails.address?.city;\r\n addressValidation.stateOrProvince = newPublisherDetails.address?.stateOrProvince;\r\n addressValidation.line1 = newPublisherDetails.address?.line1;\r\n addressValidation.line2 = newPublisherDetails.address?.line2;\r\n addressValidation.isOrg = true;\r\n\r\n // add new endpoint call\r\n const result = await validateAddressAsync(addressValidation, publisher);\r\n setIsOrgAddressValid(result.isOrgAddressValid);\r\n } catch (error) {\r\n if (error.code === 400) {\r\n setProfileErrorsAction({ 'publisher.address.postalCode': formatMessage(messages.profileInvalidAddressErrorMessage) });\r\n } else {\r\n showErrorToastNotification({ text: formatMessage(messages.profileAddressValidationFailed) });\r\n }\r\n setIsOrgAddressValid(false);\r\n\r\n onLoadingChanged(false);\r\n Log.error(error);\r\n }\r\n});\r\n","import { when } from 'mobx';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport {\r\n IPhoneVerificationData,\r\n PhoneVerificationSubStatus,\r\n PhoneVerificationVerifyCode,\r\n User,\r\n getCurrentPublisher,\r\n showErrorToastNotification,\r\n} from '../../../../../@data';\r\nimport { deepClone } from '../../../../../utils';\r\nimport messages from '../../ProfilePage.messages';\r\nimport {\r\n setIsCodeBeingVerified,\r\n setIsVerificationSuccess,\r\n setPhoneVerificationResp,\r\n setProfileErrorsAction,\r\n verifyGeneratedCode,\r\n} from '../actions';\r\nimport { verifyGeneratedCodeAsync } from '../services/verifyGeneratedCodeAsync';\r\nimport { getProfileStore } from '../store/store';\r\n\r\norchestrator(verifyGeneratedCode, async ({ profile, formatMessage }) => {\r\n try {\r\n setIsCodeBeingVerified(true);\r\n\r\n const publisher = getCurrentPublisher();\r\n\r\n if (!publisher) {\r\n return Promise.reject('No publisher found');\r\n }\r\n\r\n const newUserDetails: User = deepClone(profile.user);\r\n if (!newUserDetails) {\r\n throw new Error('User details are missing');\r\n }\r\n\r\n const phoneVerificationVerifyCode: PhoneVerificationVerifyCode = profile.phoneVerificationVerifyCode;\r\n\r\n // code\r\n // verification method\r\n\r\n const result: IPhoneVerificationData = await verifyGeneratedCodeAsync(phoneVerificationVerifyCode, publisher);\r\n setPhoneVerificationResp(result);\r\n\r\n // need to check subStatus other options\r\n await when(\r\n () => {\r\n const subStatus = getProfileStore().active.phoneVerificationResp?.subStatus;\r\n\r\n return (\r\n subStatus === PhoneVerificationSubStatus.codeMatched ||\r\n subStatus === PhoneVerificationSubStatus.codeMismatched ||\r\n subStatus === PhoneVerificationSubStatus.expired\r\n );\r\n },\r\n () => {\r\n const subStatus = getProfileStore().active.phoneVerificationResp?.subStatus;\r\n if (subStatus === PhoneVerificationSubStatus.codeMatched) {\r\n setIsCodeBeingVerified(false);\r\n setIsVerificationSuccess(true);\r\n } else if (subStatus === PhoneVerificationSubStatus.codeMismatched) {\r\n setProfileErrorsAction({ 'user.verification.code': formatMessage(messages.generatedCodeInvalid) });\r\n } else {\r\n setProfileErrorsAction({ 'user.verification.code': formatMessage(messages.generatedCodeExpired) });\r\n }\r\n }\r\n );\r\n } catch (error) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.verifyingGeneratedCodeFailed });\r\n Log.error(error);\r\n } finally {\r\n setIsCodeBeingVerified(false);\r\n }\r\n});\r\n","import { getAppStore, postEntity } from '../../../../../@data';\r\nimport { EvaluationStatus, PhoneVerificationVerifyCode, Publisher } from '../../../../../@data/store';\r\n\r\nexport async function verifyGeneratedCodeAsync(body: PhoneVerificationVerifyCode, publisher: Publisher) {\r\n const { userContext } = getAppStore();\r\n const phoneVerificationResp = await postEntity<PhoneVerificationVerifyCode>(\r\n [new EvaluationStatus(), publisher],\r\n PhoneVerificationVerifyCode,\r\n body,\r\n userContext\r\n );\r\n return phoneVerificationResp.data;\r\n}\r\n","import { getTheme, ITheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../theme';\r\n\r\n// NOTE: Keep the style types in the same file where the style definitions are present.\r\n// This helps in better DX (Developer Experience) as we needn't switch files to see what's the type.\r\nexport interface ICheckboxGroupStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\ntype StyleProperties = 'collapseStyle' | 'expandStyle' | 'expandIconStyle' | 'collapseIconStyle' | 'disabledStyle' | 'commonCheckboxStyle';\r\nexport type CheckboxGroupStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICheckboxGroupStyleProps): CheckboxGroupStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { spacing } = theme;\r\n\r\n const commonCollapsibleIconStyle = {\r\n transition: 'transform 200ms',\r\n padding: `0 ${spacing.size4}`,\r\n };\r\n\r\n return mergeStyleSets({\r\n collapseStyle: {\r\n display: 'none',\r\n },\r\n expandStyle: {\r\n display: 'block',\r\n marginLeft: spacing.size24,\r\n },\r\n collapseIconStyle: {\r\n transform: 'rotate(0)',\r\n ...commonCollapsibleIconStyle,\r\n },\r\n expandIconStyle: {\r\n transform: 'rotate(90deg)',\r\n ...commonCollapsibleIconStyle,\r\n },\r\n commonCheckboxStyle: {\r\n padding: `${spacing.size8} 0`,\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n disabledStyle: {\r\n opacity: 0.6,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): CheckboxGroupStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { Checkbox, ICheckboxProps, Icon, mergeStyleSets } from '@fluentui/react';\r\nimport { useBoolean } from '@fluentui/react-hooks';\r\nimport React from 'react';\r\nimport { isButtonPressKey } from '../../utils/AccessibilityUtils';\r\nimport { ConditionalTooltip } from '../ConditionalTooltip';\r\nimport { getClassNames } from './CheckboxGroup.styles';\r\nimport { ICheckbox, ICheckboxGroup, ICheckboxGroupProps } from './CheckboxGroup.types';\r\n\r\n/**\r\n * A controlled component to render a single node of checkbox-tree (singe parent and many children)\r\n * Meaning, the consumer of this component needs to control/handle the state and behavior for the component.\r\n */\r\nexport function CheckboxGroup({\r\n group,\r\n isExpanded,\r\n onExpand,\r\n onCollapse,\r\n onParentCheckboxChange,\r\n onChildCheckboxChange,\r\n styleProps,\r\n disabledCheckboxTooltipText,\r\n}: ICheckboxGroupProps): JSX.Element {\r\n const areAllChildrenDisabled = (): boolean => group.children.every((checkbox) => !!checkbox.disabled);\r\n const areAllChildrenChecked = (): boolean => group.children.every((checkbox) => !!checkbox.checked);\r\n const isNoneChildrenChecked = (): boolean => group.children.every((checkbox) => !checkbox.checked);\r\n const areSomeChildrenChecked = (): boolean => !areAllChildrenChecked() && !isNoneChildrenChecked();\r\n\r\n const [isInExpandedState, { toggle: toggleIsInExpandedState }] = useBoolean(isExpanded ?? areSomeChildrenChecked());\r\n const { commonCheckboxStyle, collapseStyle, expandStyle, expandIconStyle, collapseIconStyle, disabledStyle } = mergeStyleSets(\r\n getClassNames(),\r\n styleProps\r\n );\r\n\r\n const handleExpandCollapseButtonClick = (ev: React.MouseEvent | React.KeyboardEvent) => {\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n\r\n if (isInExpandedState) {\r\n onCollapse?.(group);\r\n } else {\r\n onExpand?.(group);\r\n }\r\n toggleIsInExpandedState();\r\n };\r\n\r\n const handleParentCheckboxClick = (ev?: React.FormEvent<HTMLElement | HTMLInputElement>, checked?: boolean) => {\r\n if (areSomeChildrenChecked()) {\r\n // check all child checkboxes\r\n return onParentCheckboxChange?.(ev, true, group);\r\n }\r\n onParentCheckboxChange?.(ev, checked, group);\r\n };\r\n\r\n const isParentCheckboxDisabled = (): boolean => {\r\n return areAllChildrenDisabled();\r\n };\r\n\r\n const renderLabel = (props?: ICheckboxProps): JSX.Element => {\r\n return (\r\n <div className={props?.disabled ? disabledStyle : ''}>\r\n <Icon\r\n iconName=\"CaretRightSolid8\"\r\n className={isInExpandedState ? expandIconStyle : collapseIconStyle}\r\n onClick={handleExpandCollapseButtonClick}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key) && handleExpandCollapseButtonClick(ev)}\r\n tabIndex={0}\r\n aria-label={isInExpandedState ? 'Expanded' : 'Collapsed'}\r\n />\r\n {props?.label}\r\n </div>\r\n );\r\n };\r\n\r\n const getCheckboxId = (checkbox: ICheckbox | ICheckboxGroup) => `check-${checkbox.key}`;\r\n\r\n const renderChildCheckbox = (checkbox: ICheckbox): JSX.Element => {\r\n return (\r\n <Checkbox\r\n className={commonCheckboxStyle}\r\n id={getCheckboxId(checkbox)}\r\n checked={checkbox.checked}\r\n label={checkbox.label}\r\n disabled={checkbox.disabled}\r\n onChange={(ev, checked) => onChildCheckboxChange?.(ev, checked, checkbox)}\r\n />\r\n );\r\n };\r\n\r\n const renderParentCheckbox = (parent: ICheckboxGroup): JSX.Element => {\r\n return (\r\n <Checkbox\r\n id={getCheckboxId(parent)}\r\n key={parent.label}\r\n className={commonCheckboxStyle}\r\n checked={areAllChildrenChecked()}\r\n indeterminate={areSomeChildrenChecked()}\r\n label={parent.label}\r\n onChange={handleParentCheckboxClick}\r\n onRenderLabel={renderLabel}\r\n disabled={isParentCheckboxDisabled()}\r\n />\r\n );\r\n };\r\n\r\n return (\r\n <div>\r\n <ConditionalTooltip\r\n showTooltip={isParentCheckboxDisabled()}\r\n content={disabledCheckboxTooltipText}\r\n targetSelector={`#${getCheckboxId(group)}`}\r\n >\r\n {renderParentCheckbox(group)}\r\n </ConditionalTooltip>\r\n <div className={isInExpandedState ? expandStyle : collapseStyle}>\r\n {group.children.map((child) => {\r\n return (\r\n <ConditionalTooltip\r\n key={child.key}\r\n showTooltip={child.disabled}\r\n targetSelector={`#${getCheckboxId(child)}`}\r\n content={disabledCheckboxTooltipText}\r\n >\r\n {renderChildCheckbox(child)}\r\n </ConditionalTooltip>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { FontWeights, getTheme, ITheme, mergeStyleSets } from '@fluentui/react';\r\nimport { BreakPoints, IPubcenterTheme } from '../../../theme';\r\nimport { HEADING_ITEM_HEIGHT, STANDARD_LIST_ITEM_HEIGHT } from '../../constants/StyleConstants';\r\nimport { flexWithAlignCenter } from '../../utils/GlobalStyleUtils';\r\n\r\nexport const BOX_HEIGHT = 288;\r\nexport const BOX_WIDTH = 300;\r\n\r\n// NOTE: Keep the style types in the same file where the style definitions are present.\r\n// This helps in better DX (Developer Experience) as we needn't switch files to see what's the type.\r\nexport interface ICheckboxTreeWithSelectionBoxStyleProps {\r\n theme: ITheme;\r\n isError?: boolean;\r\n}\r\n\r\ntype StyleProperties =\r\n | 'containerStyle'\r\n | 'selectionBoxContainerStyle'\r\n | 'titleContainerStyle'\r\n | 'selectedItemsContainerStyle'\r\n | 'selectedItemStyle'\r\n | 'disabledItemStyle'\r\n | 'checkboxTreeContainerStyle'\r\n | 'errorMessageStyle'\r\n | 'rootStyle'\r\n | 'removeAllButtonStyle';\r\ntype CheckboxTreeWithSelectionBoxStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICheckboxTreeWithSelectionBoxStyleProps): CheckboxTreeWithSelectionBoxStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { spacing, palette, fonts } = theme;\r\n const { isError = false } = props;\r\n const containerBorderStyle = {\r\n border: `1px solid ${isError ? palette.error : palette.neutralTertiaryAlt}`,\r\n };\r\n const { ResponsiveSmall } = BreakPoints;\r\n\r\n return mergeStyleSets({\r\n rootStyle: {\r\n marginBottom: spacing.size8,\r\n },\r\n containerStyle: {\r\n display: 'flex',\r\n gap: spacing.size8,\r\n [ResponsiveSmall]: {\r\n display: 'block',\r\n },\r\n },\r\n checkboxTreeContainerStyle: {\r\n ...containerBorderStyle,\r\n [ResponsiveSmall]: {\r\n width: '100%',\r\n },\r\n },\r\n selectionBoxContainerStyle: {\r\n ...containerBorderStyle,\r\n height: BOX_HEIGHT,\r\n width: BOX_WIDTH,\r\n [ResponsiveSmall]: {\r\n width: '100%',\r\n },\r\n },\r\n selectedItemsContainerStyle: {\r\n paddingLeft: spacing.size12,\r\n overflowY: 'auto',\r\n height: BOX_HEIGHT - HEADING_ITEM_HEIGHT,\r\n },\r\n titleContainerStyle: {\r\n ...flexWithAlignCenter,\r\n justifyContent: 'space-between',\r\n ...fonts.size14,\r\n fontWeight: FontWeights.semibold,\r\n height: HEADING_ITEM_HEIGHT,\r\n paddingLeft: spacing.size12,\r\n borderBottom: `1px solid ${palette.neutralQuaternaryAlt}`,\r\n },\r\n disabledItemStyle: {\r\n color: palette.disabledGray,\r\n opacity: 1,\r\n pointerEvents: 'none',\r\n backgroundColor: palette.white,\r\n },\r\n selectedItemStyle: {\r\n ...fonts.size14,\r\n ...flexWithAlignCenter,\r\n justifyContent: 'space-between',\r\n height: STANDARD_LIST_ITEM_HEIGHT,\r\n },\r\n removeAllButtonStyle: {\r\n color: palette.themePrimary,\r\n },\r\n errorMessageStyle: {\r\n ...fonts.size12,\r\n marginTop: spacing.size2,\r\n color: palette.redDark,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): CheckboxTreeWithSelectionBoxStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { FontWeights, getTheme, ITheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterTheme } from '../../../theme';\r\nimport { HEADING_ITEM_HEIGHT, SMALLER_LIST_ITEM_HEIGHT } from '../../constants/StyleConstants';\r\nimport { flexWithAlignCenter } from '../../utils/GlobalStyleUtils';\r\nimport { BOX_HEIGHT, BOX_WIDTH } from '../CheckboxTreeWithSelectionBox/CheckboxTreeWithSelectionBox.styles';\r\n\r\n// NOTE: Keep the style types in the same file where the style definitions are present.\r\n// This helps in better DX (Developer Experience) as we needn't switch files to see what's the type.\r\nexport interface ICheckboxTreeStyleProps {\r\n theme: ITheme;\r\n}\r\n\r\nexport interface ICheckboxTreeStyles {\r\n singleCheckboxStyle?: string;\r\n checkboxTreeContainerStyle?: string;\r\n checkboxContainerStyle?: string;\r\n searchBoxRootStyle?: string;\r\n selectedBlockStyle?: string;\r\n}\r\n\r\nexport const getStyles = (props: ICheckboxTreeStyleProps): ICheckboxTreeStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { spacing, palette, fonts } = theme;\r\n\r\n const commonCheckboxStyle = {\r\n padding: `${spacing.size8} 0`,\r\n ...flexWithAlignCenter,\r\n };\r\n const searchBorderStyle = {\r\n border: 'none',\r\n borderBottom: `1px solid ${palette.neutralQuaternaryAlt}`,\r\n };\r\n\r\n return mergeStyleSets({\r\n singleCheckboxStyle: {\r\n ...commonCheckboxStyle,\r\n },\r\n checkboxTreeContainerStyle: {\r\n border: `1px solid ${palette.neutralTertiaryAlt}`,\r\n display: 'inline-block',\r\n height: BOX_HEIGHT,\r\n width: BOX_WIDTH,\r\n },\r\n checkboxContainerStyle: {\r\n paddingLeft: spacing.size12,\r\n overflowY: 'auto',\r\n height: BOX_HEIGHT - HEADING_ITEM_HEIGHT,\r\n },\r\n searchBoxRootStyle: {\r\n height: HEADING_ITEM_HEIGHT,\r\n ...searchBorderStyle,\r\n '&:hover,&:focus': {\r\n ...searchBorderStyle,\r\n },\r\n },\r\n selectedBlockStyle: {\r\n ...fonts.size12,\r\n height: SMALLER_LIST_ITEM_HEIGHT,\r\n ...flexWithAlignCenter,\r\n marginLeft: `-${spacing.size12}`,\r\n paddingLeft: spacing.size12,\r\n background: palette.neutralLighter,\r\n fontWeight: FontWeights.semibold,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): ICheckboxTreeStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { Checkbox, ISearchBoxProps, mergeStyleSets, SearchBox } from '@fluentui/react';\r\nimport React, { useCallback, useState } from 'react';\r\nimport { NullableJSXElement } from '../../types';\r\nimport { CheckboxGroup, ICheckbox, ICheckboxGroup, ICheckboxGroupProps } from '../CheckboxGroup';\r\nimport { CheckboxGroupStyles } from '../CheckboxGroup/CheckboxGroup.styles';\r\nimport { ConditionalTooltip } from '../ConditionalTooltip';\r\nimport { getClassNames, ICheckboxTreeStyles } from './CheckboxTree.styles';\r\n\r\nexport type GroupedCheckbox = ICheckboxGroup | ICheckbox;\r\n\r\nexport interface ICheckboxTreeProps\r\n extends Pick<ICheckboxGroupProps, 'onParentCheckboxChange' | 'onChildCheckboxChange' | 'disabledCheckboxTooltipText'> {\r\n groups: GroupedCheckbox[];\r\n styleProps?: Partial<ICheckboxTreeStyles & CheckboxGroupStyles>;\r\n selectedText?: string;\r\n suppressSearch?: boolean;\r\n searchPlaceholderText?: string;\r\n onSearch?: (value: string) => void;\r\n onSearchTermChange?: (ev: React.ChangeEvent<HTMLInputElement>, value: string) => void;\r\n onSearchClear?: ISearchBoxProps['onSearch'];\r\n}\r\n\r\n// Narrowing using type predicates. Refer: https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates\r\nexport function isCheckboxGroup(group: GroupedCheckbox): group is ICheckboxGroup {\r\n return (group as ICheckboxGroup).children !== undefined;\r\n}\r\n\r\nexport function CheckboxTree({\r\n groups,\r\n styleProps,\r\n onChildCheckboxChange,\r\n onParentCheckboxChange,\r\n selectedText,\r\n onSearch,\r\n onSearchClear,\r\n onSearchTermChange,\r\n suppressSearch,\r\n searchPlaceholderText,\r\n disabledCheckboxTooltipText,\r\n}: ICheckboxTreeProps) {\r\n const {\r\n singleCheckboxStyle,\r\n checkboxContainerStyle,\r\n checkboxTreeContainerStyle,\r\n searchBoxRootStyle,\r\n selectedBlockStyle,\r\n } = mergeStyleSets(getClassNames(), styleProps);\r\n const [searchTerm, setSearchTerm] = useState('');\r\n\r\n const handleSearch = (value: string) => {\r\n onSearch?.(value);\r\n };\r\n\r\n const handleSearchTermChange = (ev: React.ChangeEvent<HTMLInputElement>, value: string) => {\r\n setSearchTerm(value);\r\n onSearchTermChange?.(ev, value);\r\n };\r\n\r\n const getFilteredGroups = useCallback((): GroupedCheckbox[] => {\r\n if (!searchTerm) {\r\n return groups;\r\n }\r\n\r\n return groups.filter((group) => {\r\n const { label = '' } = group;\r\n if (isCheckboxGroup(group)) {\r\n return group.children.some((child) => (child.label ?? '').toLowerCase().includes(searchTerm.toLowerCase()));\r\n }\r\n return label.toLowerCase().includes(searchTerm.toLowerCase());\r\n });\r\n }, [groups, searchTerm]);\r\n\r\n const handleSearchClear = (ev) => {\r\n setSearchTerm('');\r\n onSearchClear?.(ev);\r\n };\r\n\r\n const renderSearchBox = (): NullableJSXElement => {\r\n if (suppressSearch) {\r\n return null;\r\n }\r\n\r\n return (\r\n <SearchBox\r\n styles={{ root: searchBoxRootStyle }}\r\n placeholder={searchPlaceholderText}\r\n onClear={handleSearchClear}\r\n onChange={handleSearchTermChange}\r\n onSearch={handleSearch}\r\n />\r\n );\r\n };\r\n\r\n const renderSelectedBlock = (): NullableJSXElement => {\r\n if (!selectedText) {\r\n return null;\r\n }\r\n\r\n return <div className={selectedBlockStyle}>{selectedText}</div>;\r\n };\r\n\r\n const getCheckboxId = (checkbox: ICheckbox) => `check-${checkbox.key}`;\r\n\r\n const renderCheckbox = (checkbox: ICheckbox): NullableJSXElement => {\r\n return (\r\n <Checkbox\r\n disabled={!!checkbox.disabled}\r\n className={singleCheckboxStyle}\r\n id={getCheckboxId(checkbox)}\r\n label={checkbox.label}\r\n checked={checkbox.checked}\r\n onChange={(event, checked) => onChildCheckboxChange(event, checked, checkbox)}\r\n />\r\n );\r\n };\r\n\r\n const renderCheckboxGroups = (): JSX.Element => {\r\n return (\r\n <div className={checkboxContainerStyle}>\r\n {renderSelectedBlock()}\r\n {getFilteredGroups().map((group: GroupedCheckbox) => {\r\n if (isCheckboxGroup(group)) {\r\n return (\r\n <CheckboxGroup\r\n key={group.key}\r\n group={group}\r\n onChildCheckboxChange={onChildCheckboxChange}\r\n onParentCheckboxChange={onParentCheckboxChange}\r\n disabledCheckboxTooltipText={disabledCheckboxTooltipText}\r\n />\r\n );\r\n } else {\r\n return (\r\n <ConditionalTooltip\r\n key={group.key}\r\n showTooltip={group.disabled}\r\n targetSelector={`#${getCheckboxId(group)}`}\r\n content={disabledCheckboxTooltipText}\r\n >\r\n {renderCheckbox(group)}\r\n </ConditionalTooltip>\r\n );\r\n }\r\n })}\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className={checkboxTreeContainerStyle}>\r\n {renderSearchBox()}\r\n {renderCheckboxGroups()}\r\n </div>\r\n );\r\n}\r\n","import { ActionButton, IconButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport messages from '../../App.messages';\r\nimport { NullableJSXElement } from '../../types';\r\nimport { CheckboxTree } from '../CheckboxTree';\r\nimport { ConditionalTooltip } from '../ConditionalTooltip';\r\nimport { getClassNames } from './CheckboxTreeWithSelectionBox.styles';\r\nimport { ICheckboxTreeWithSelectionBoxProps, ISelection } from './CheckboxTreeWithSelectionBox.types';\r\n\r\nexport const CheckboxTreeWithSelectionBox = injectIntl(function CheckboxTreeWithSelectionBoxComponent({\r\n selectionList,\r\n selectionTitle,\r\n disabledSelectionTooltipText,\r\n onRemoveSelection,\r\n onRenderSelectionItem,\r\n onRemoveAllSelection,\r\n intl: { formatMessage },\r\n errorMessage,\r\n ...restProps\r\n}: ICheckboxTreeWithSelectionBoxProps & InjectedIntlProps) {\r\n const {\r\n containerStyle,\r\n selectionBoxContainerStyle,\r\n disabledItemStyle,\r\n selectedItemStyle,\r\n selectedItemsContainerStyle,\r\n titleContainerStyle,\r\n removeAllButtonStyle,\r\n checkboxTreeContainerStyle,\r\n errorMessageStyle,\r\n rootStyle,\r\n } = getClassNames({ isError: !!errorMessage });\r\n\r\n function getActiveItems() {\r\n return selectionList.filter((item) => !item.isDisabled);\r\n }\r\n\r\n function renderSelectedItem({ isDisabled, key, title }: ISelection): JSX.Element | undefined {\r\n return (\r\n <div className={`${selectedItemStyle} ${isDisabled ? disabledItemStyle : ''}`}>\r\n <div className=\"title\">{title}</div>\r\n <IconButton\r\n iconProps={{ iconName: 'Delete' }}\r\n id={key}\r\n onClick={() => onRemoveSelection(key)}\r\n disabled={isDisabled}\r\n ariaLabel={formatMessage(messages.delete)}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n function renderSelectionBox(): NullableJSXElement {\r\n return (\r\n <div className={selectionBoxContainerStyle}>\r\n <div className={titleContainerStyle}>\r\n {selectionTitle}\r\n {onRemoveAllSelection && getActiveItems().length > 0 && (\r\n <ActionButton styles={{ root: removeAllButtonStyle }} onClick={onRemoveAllSelection}>\r\n Remove all\r\n </ActionButton>\r\n )}\r\n </div>\r\n <div className={selectedItemsContainerStyle}>\r\n {selectionList.map((selectedItem) => {\r\n const { isDisabled, key } = selectedItem;\r\n return (\r\n <ConditionalTooltip key={key} showTooltip={isDisabled} content={disabledSelectionTooltipText} targetSelector={`#${key}`}>\r\n {renderSelectedItem(selectedItem)}\r\n </ConditionalTooltip>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={rootStyle}>\r\n <div className={containerStyle}>\r\n <CheckboxTree {...restProps} styleProps={{ checkboxTreeContainerStyle }} />\r\n {renderSelectionBox()}\r\n </div>\r\n {errorMessage && <div className={errorMessageStyle}>{errorMessage}</div>}\r\n </div>\r\n );\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { Model, User, getAppStore, patchEntity } from '../../../../../@data';\r\nimport { TYTHON_DOMAIN_REDIRECTION_CACHE_KEY } from '../../../../../constants';\r\nimport { dismissFRE } from '../actions';\r\nimport { setIsFRECardShown } from '../mutatorActions';\r\n\r\nexport class DismissFRERequest extends Model {\r\n public apiPath = `dismissFRE`;\r\n public className = 'dismissFRE';\r\n}\r\n\r\norchestrator(dismissFRE, async () => {\r\n setIsFRECardShown(false);\r\n sessionStorage.removeItem(TYTHON_DOMAIN_REDIRECTION_CACHE_KEY);\r\n\r\n const { publisher, userContext } = getAppStore();\r\n const user = new User(userContext?.id);\r\n\r\n if (publisher && user) {\r\n try {\r\n await patchEntity([publisher, user], DismissFRERequest, undefined, userContext);\r\n } catch (e) {\r\n Log.error(`Failed to dismiss FRE card, ${JSON.stringify(e)}`);\r\n }\r\n }\r\n});\r\n","import { HomePageStatus } from '../../../../pages/ad-management/Home/@data/store/schema/IHomeViewState';\r\nimport { Model } from './Model';\r\n\r\nexport class EntitySummary extends Model {\r\n public apiPath = undefined;\r\n public className = 'entitySummary';\r\n public profile: HomePageStatus;\r\n public site: HomePageStatus;\r\n public adUnit: HomePageStatus;\r\n public isHomePageSetupComplete: boolean;\r\n}\r\n","import { Model } from './Model';\r\n\r\nexport class Home extends Model {\r\n public apiPath = undefined;\r\n public className = 'home';\r\n}\r\n","import { when } from 'jquery';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { getAppStore, getEntity, isPublisherUnderReview } from '../../../../../@data';\r\nimport { EntitySummary } from '../../../../../@data/store/schema/models/EntitySummary';\r\nimport { Home } from '../../../../../@data/store/schema/models/Home';\r\nimport { fetchSetupCardsStatus } from '../actions/actions';\r\nimport { setHomePageStatus, setIsStatusLoading } from '../mutatorActions';\r\nimport { HomePageStatus } from '../store/schema/IHomeViewState';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(fetchSetupCardsStatus, async () => {\r\n const { publisher, account, userContext } = getAppStore();\r\n\r\n if (publisher && account && userContext) {\r\n setIsStatusLoading(true);\r\n\r\n try {\r\n const data = (await getEntity([new Home(), publisher], userContext, EntitySummary)) as EntitySummary;\r\n if (data.profile === 'Rejected' && isPublisherUnderReview()) {\r\n data.profile = HomePageStatus.AwaitingVerification;\r\n }\r\n setHomePageStatus(data.profile, data.site, data.adUnit, data.isHomePageSetupComplete);\r\n await when(() => {\r\n const { adUnitStatus, siteStatus, profileStatus, isSetupDone } = getStore();\r\n if (adUnitStatus !== undefined && siteStatus !== undefined && profileStatus !== undefined && isSetupDone !== undefined) {\r\n setIsStatusLoading(false);\r\n return true;\r\n }\r\n return false;\r\n });\r\n } catch (error) {\r\n Log.error(error);\r\n } finally {\r\n setIsStatusLoading(false);\r\n }\r\n }\r\n});\r\n","import { when } from 'mobx';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { getGoogleAdSenseStore } from '../../../Account/Settings/components/GoogleConnector/@data';\r\nimport { onInitializeGoogleAccount } from '../../../Account/Settings/components/GoogleConnector/@data/actions';\r\nimport { onInitializeRecommendationSection } from '../actions/actions';\r\n\r\norchestrator(onInitializeRecommendationSection, async () => {\r\n onInitializeGoogleAccount(false);\r\n await when(() => {\r\n const { active: googleAdSense } = getGoogleAdSenseStore();\r\n return !!googleAdSense.connectionStatus;\r\n });\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { User, getAppStore } from '../../../../../@data';\r\nimport { fetchCcmtAccountById } from '../../../../partner-management/Account/@data/services/AccountService';\r\nimport { onSettingsChanged } from '../../../Account/Settings/@data/mutatorActions';\r\nimport { ISettingsViewModel } from '../../../Account/Settings/@data/store/schema/ISettingsViewModel';\r\nimport { getStore } from '../../../Account/Settings/@data/store/store';\r\nimport { getProfileStore, isPrimaryUserDataPresent } from '../../../Profile/@data';\r\nimport { setPrimaryUserDetailsAction } from '../../../Profile/@data/actions';\r\nimport { fetchUserDetails } from '../../../Profile/@data/services/fetchUserDetails';\r\nimport { onInitializeSystemPreferences } from '../actions';\r\n\r\norchestrator(onInitializeSystemPreferences, async () => {\r\n const { userContext, publisher, account } = getAppStore();\r\n\r\n if (userContext && publisher && account) {\r\n let userDetails: User = new User();\r\n if (!isPrimaryUserDataPresent()) {\r\n userDetails = await fetchUserDetails(new User(userContext.id));\r\n setPrimaryUserDetailsAction(userDetails);\r\n } else {\r\n userDetails = getProfileStore().raw.primaryUser!;\r\n }\r\n\r\n const ccmtAccount = await fetchCcmtAccountById(publisher!, account.id, userContext);\r\n\r\n // set system preference\r\n const settings: ISettingsViewModel = getStore().active;\r\n const systemPreferences = {\r\n locale: userDetails.language?.toLocaleLowerCase(),\r\n currency: ccmtAccount.currency,\r\n countryCode: ccmtAccount.countryCode,\r\n };\r\n\r\n onSettingsChanged({ ...settings, systemPreferences });\r\n } else {\r\n Log.error('Could not initialize system preferences');\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { Publisher, User, getAppStore, isPublisherProfileDataPresent, onPublisherChanged } from '../../../../../@data';\r\nimport { fetchOneVetReviewStatus } from '../../../../../@data/services/OneVetIntegrationService';\r\nimport { isPrimaryUserDataPresent } from '../../../Profile/@data';\r\nimport { setPrimaryUserDetailsAction } from '../../../Profile/@data/actions';\r\nimport { fetchPublisherProfileDetails } from '../../../Profile/@data/services';\r\nimport { fetchUserDetails } from '../../../Profile/@data/services/fetchUserDetails';\r\nimport { triggerOneVetAPIs } from '../actions';\r\n\r\norchestrator(triggerOneVetAPIs, async ({ eventType, useCache = true }) => {\r\n const sessionId = sessionStorage.getItem('session_id');\r\n\r\n // if (process.env.REACT_APP_ENV === 'test' || !sessionId) {\r\n // return;\r\n // }\r\n\r\n // Skip API in case review status is present in cache\r\n if (useCache && sessionStorage.getItem('review_status')) {\r\n return;\r\n }\r\n\r\n const { userContext, publisher } = getAppStore();\r\n\r\n if (userContext && publisher && sessionId) {\r\n Log.write(`Triggering oneVetAPI ${sessionId}`);\r\n\r\n let publisherProfileDetails = getAppStore().publisher;\r\n let userDetails: User = new User();\r\n if (!isPublisherProfileDataPresent()) {\r\n publisherProfileDetails = await fetchPublisherProfileDetails(new Publisher(publisher.id));\r\n onPublisherChanged(publisherProfileDetails);\r\n }\r\n if (!isPrimaryUserDataPresent()) {\r\n userDetails = await fetchUserDetails(new User(userContext.id));\r\n setPrimaryUserDetailsAction(userDetails);\r\n }\r\n\r\n fetchOneVetReviewStatus(eventType, publisherProfileDetails, userDetails);\r\n } else {\r\n Log.error('Could not trigger OVDF API: userContext or publisher or sessionId is null');\r\n }\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { onDevTokenPanelHide, onDevTokenPanelShown } from '../actions';\r\nimport { getStore } from '../store/store';\r\n\r\nmutator(onDevTokenPanelShown, (msg) => {\r\n const store = getStore();\r\n store.devTokenPanelParams = msg.devTokenPanelParams;\r\n});\r\n\r\nmutator(onDevTokenPanelHide, () => {\r\n const store = getStore();\r\n const devtokenparam = store.devTokenPanelParams;\r\n if (devtokenparam) {\r\n devtokenparam.panelClosed = true;\r\n devtokenparam.SpinnerText = 'Fetching Developer Token...';\r\n }\r\n store.devTokenPanelParams = devtokenparam;\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { Log } from '../../../../../../logging/src';\r\nimport { User } from '../../../../../@data';\r\nimport { mergeTypeWithObject } from '../../../../../utils';\r\nimport {\r\n onFetchUserInvitationsLoading,\r\n onFetchUsersLoading,\r\n onFetchingUserInvitationsData,\r\n onFetchingUsersData,\r\n onRawChanged,\r\n onUserChanged,\r\n onUserErrorChanged,\r\n onUserInvitationExpiryChanged,\r\n onUserInvitationsChanged,\r\n onUsersChanged,\r\n} from '../actions';\r\nimport { getStore } from '../store/store';\r\n\r\nmutator(onRawChanged, (msg) => {\r\n getStore().raw = mergeTypeWithObject(new User(), msg.value);\r\n});\r\n\r\nmutator(onUserChanged, (msg) => {\r\n getStore().active = msg.user;\r\n});\r\n\r\nmutator(onFetchUsersLoading, (msg) => {\r\n getStore().isFetchingUsersLoading = msg.isLoading;\r\n});\r\n\r\nmutator(onFetchingUsersData, (msg) => {\r\n getStore().isFetchingUsers = msg.isFetchingData;\r\n});\r\n\r\nmutator(onUserInvitationsChanged, (msg) => {\r\n getStore().userInvitations = msg.userInvitations;\r\n});\r\n\r\nmutator(onFetchUserInvitationsLoading, (msg) => {\r\n getStore().isFetchingUserInvitationsLoading = msg.isLoading;\r\n});\r\n\r\nmutator(onFetchingUserInvitationsData, (msg) => {\r\n getStore().isFetchingUserInvitations = msg.isFetchingData;\r\n});\r\n\r\nmutator(onUsersChanged, (msg) => {\r\n getStore().users = msg.users;\r\n});\r\n\r\nmutator(onUserErrorChanged, (msg) => {\r\n getStore().errors = msg.values || {};\r\n});\r\n\r\nmutator(onUserInvitationExpiryChanged, ({ id, value: date }) => {\r\n const { userInvitations } = getStore();\r\n const userInvitation = userInvitations?.find((ui) => ui.id === id);\r\n if (userInvitation) {\r\n userInvitation.expirationDate = date.toISOString();\r\n getStore().userInvitations = [...userInvitations];\r\n Log.info(`Updated user invitation expiry date to ${userInvitation.expirationDate}`);\r\n }\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { UserRole } from '../../../../../@data';\r\nimport {\r\n onFormAccountRoleChanged,\r\n onFormCleared,\r\n onFormContactByEmailChanged,\r\n onFormContactByPhoneChanged,\r\n onFormEmailAddressChanged,\r\n onFormFirstNameChanged,\r\n onFormIdChanged,\r\n onFormLanguageChanged,\r\n onFormLastNameChanged,\r\n onFormPhoneNumberChanged,\r\n onFormRoleAccountListChanged,\r\n onFormUserLocaleChanged,\r\n onFormUsernameChanged\r\n} from '../actions';\r\nimport { getStore } from '../store/store';\r\n\r\nmutator(onFormIdChanged, msg => {\r\n getStore().active.id = msg.value;\r\n});\r\n\r\nmutator(onFormCleared, () => {\r\n getStore().active = {};\r\n getStore().raw = undefined;\r\n});\r\n\r\nmutator(onFormFirstNameChanged, msg => {\r\n getStore().active.firstName = msg.value;\r\n});\r\n\r\nmutator(onFormLastNameChanged, msg => {\r\n getStore().active.lastName = msg.value;\r\n});\r\n\r\nmutator(onFormPhoneNumberChanged, msg => {\r\n getStore().active.phoneNumber = msg.value;\r\n});\r\n\r\nmutator(onFormEmailAddressChanged, msg => {\r\n getStore().active.emailAddress = msg.value;\r\n});\r\n\r\nmutator(onFormUsernameChanged, msg => {\r\n getStore().active.userName = msg.value;\r\n});\r\n\r\nmutator(onFormLanguageChanged, msg => {\r\n getStore().active.language = msg.value;\r\n});\r\n\r\nmutator(onFormAccountRoleChanged, msg => {\r\n if (msg.value) {\r\n getStore().active.accountRole = msg.value.key as UserRole;\r\n getStore().active.accountsList = getStore().active.allAccounts;\r\n }\r\n});\r\n\r\nmutator(onFormUserLocaleChanged, msg => {\r\n getStore().active.localeId = msg.value!!.key as number;\r\n});\r\n\r\nmutator(onFormContactByEmailChanged, msg => {\r\n getStore().active.contactByEmail = !!msg.value;\r\n});\r\n\r\nmutator(onFormContactByPhoneChanged, msg => {\r\n getStore().active.contactByPhone = !!msg.value;\r\n});\r\n\r\nmutator(onFormRoleAccountListChanged, msg => {\r\n const userRole = getStore().active.accountRole;\r\n\r\n if (userRole === UserRole.AccountManager) {\r\n getStore().active.AccountManagerAccountsSelected = msg.value;\r\n } else if (userRole === UserRole.AdView) {\r\n getStore().active.AdViewAccountsSelected = msg.value;\r\n } else if (userRole === UserRole.ListManager) {\r\n getStore().active.ListManagerAccountsSelected = msg.value;\r\n } else if (userRole === UserRole.ReportUser) {\r\n getStore().active.ReportUserAccounstSelected = msg.value;\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { APP_NAME_NEW, PUBCENTER_TITLE } from '../../../../constants/AppConstants';\r\nimport { isLocationPubCenter } from '../../../../utils';\r\nimport { onCurrentRouteChanged } from '../actions/onAdManagementStoreChanged';\r\nimport { getRoutes } from '../services/getAdmanagementRoutes';\r\n\r\norchestrator(onCurrentRouteChanged, ({ currentRoute, formatMessage, intlMessageId }) => {\r\n const pageName = intlMessageId\r\n ? formatMessage(intlMessageId)\r\n : getRoutes(formatMessage).find((route) => route.key === currentRoute)?.text ?? currentRoute.toString();\r\n const appName = isLocationPubCenter() ? PUBCENTER_TITLE : APP_NAME_NEW;\r\n document.title = `${appName} - ${pageName}`;\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../logging/src';\r\nimport { NotificationSeverity, onNotificationCardAdded, showErrorToastNotification } from '../../../../@data';\r\nimport { getCurrentPublisher, getPublisherEvaluationStatus, isPublisherRejectionAppealable } from '../../../../@data/selectors';\r\nimport { AccountPageRoute } from '../../../../Routes';\r\nimport messages from '../../Account/AccountPage.messages';\r\nimport ProfileCardMessages from '../../Home/components/ProfileCard/ProfileCard.messages';\r\nimport { fetchAppealHistory } from '../../Profile/@data/actions';\r\nimport { setPublisherEvaluationFetchFailedAction, setPublisherEvaluationStatusAction } from '../actions/entityEvaluationMutatorActions';\r\nimport { fetchPublisherEvaluationStatusAction } from '../actions/publisherEvaluationActions';\r\nimport { fetchPublisherEvaluationStatus } from '../services/publisherEvaluationService';\r\n\r\n/**\r\n * This orchestrator is for the whole ad-management module as any page of the\r\n * ad-management module can trigger this action.\r\n */\r\n\r\norchestrator(fetchPublisherEvaluationStatusAction, async ({ cache }) => {\r\n try {\r\n const publisher = getCurrentPublisher();\r\n if (!publisher) {\r\n return;\r\n }\r\n\r\n if (cache && !!getPublisherEvaluationStatus()) {\r\n return;\r\n }\r\n\r\n const evaluationResponse = await fetchPublisherEvaluationStatus(publisher);\r\n setPublisherEvaluationStatusAction(evaluationResponse);\r\n setPublisherEvaluationFetchFailedAction(false);\r\n\r\n if (isPublisherRejectionAppealable()) {\r\n fetchAppealHistory();\r\n\r\n onNotificationCardAdded({\r\n id: 'publisherProfileNeedsAttention',\r\n titleMessageDescriptor: ProfileCardMessages.retryTitle,\r\n contentMessageDescriptor: ProfileCardMessages.retryDescription,\r\n severity: NotificationSeverity.Warning,\r\n primaryActionTextMessageDescriptor: ProfileCardMessages.viewProfile,\r\n primaryActionLink: `/ad-management/${publisher?.id}${AccountPageRoute}#profile`,\r\n });\r\n }\r\n } catch (error) {\r\n setPublisherEvaluationFetchFailedAction(true);\r\n showErrorToastNotification({ textMessageDescriptor: messages.failedToLoadPublisherStatus });\r\n Log.error(`Failed to fetch publisher status. Please retry after sometime.: ${error.message}}`);\r\n }\r\n});\r\n","import { getEntity, Publisher, PublisherEvaluationStatus } from '../../../../@data';\r\nimport { getCurrentUserContext } from '../../../../@data/store';\r\n\r\nexport async function fetchPublisherEvaluationStatus(publisher: Publisher): Promise<PublisherEvaluationStatus> {\r\n const publisherEvaluationStatus = new PublisherEvaluationStatus();\r\n\r\n // TODO: Make the API call only once and return the promise if multiple calls are made\r\n return await getEntity([publisherEvaluationStatus, publisher], getCurrentUserContext());\r\n}\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n headerLabel: {\r\n id: 'notificationConfigTab.headerLabel',\r\n defaultMessage: 'Notification preferences',\r\n },\r\n headerAction: {\r\n id: 'notificationConfigTab.headerAction',\r\n defaultMessage: 'Edit',\r\n },\r\n panelHeader: {\r\n id: 'notificationConfigTab.panelHeader',\r\n defaultMessage: 'Edit notification preferences',\r\n },\r\n billingLabel: {\r\n id: 'notificationConfigTab.billingLabel',\r\n defaultMessage: 'Billing alerts',\r\n },\r\n billingDescription: {\r\n id: 'notificationConfigTab.billingDescription',\r\n defaultMessage: `We'll notify you with statements, monthly invoices, prepay or postpay threshold accounts.`,\r\n },\r\n servingLabel: {\r\n id: 'notificationConfigTab.servingLabel',\r\n defaultMessage: 'Serving status',\r\n },\r\n servingDescription: {\r\n id: 'notificationConfigTab.servingDescription',\r\n defaultMessage: `We'll notify you about your serving status.`,\r\n },\r\n profileLabel: {\r\n id: 'notificationConfigTab.profileLabel',\r\n defaultMessage: 'Profile review',\r\n },\r\n profileDescription: {\r\n id: 'notificationConfigTab.profileDescription',\r\n defaultMessage: `We'll notify you about any profile review updates.`,\r\n },\r\n invitedUserLabel: {\r\n id: 'notificationConfigTab.invitedUserLabel',\r\n defaultMessage: 'User invitations',\r\n },\r\n invitedUserDescription: {\r\n id: 'notificationConfigTab.invitedUserDescription',\r\n defaultMessage: `We'll notify you when a new user has been invited to this account.`,\r\n },\r\n saveButtonAriaDesc: {\r\n id: 'notificationConfigTab.saveButtonDescription',\r\n defaultMessage: 'Click to update notification preferences',\r\n },\r\n});\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubcenterSpacing } from '../../../../../../../theme';\r\nimport { ICommonStyleProps } from '../../../../../../types';\r\n\r\ntype StyleProperties = 'gridDisplay' | 'flexDisplay' | 'panelSectionContent' | 'panelContent';\r\ntype NotificationConfigurationStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): NotificationConfigurationStyles => {\r\n const theme = getTheme();\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n const flexDisplay = {\r\n width: '100%',\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItem: 'end',\r\n '& label': {\r\n wordBreak: 'normal',\r\n },\r\n };\r\n\r\n return mergeStyleSets({\r\n gridDisplay: {\r\n display: 'grid',\r\n gridTemplateColumns: '1fr',\r\n },\r\n flexDisplay: {\r\n ...flexDisplay,\r\n },\r\n panelSectionContent: {\r\n marginTop: spacing.size4,\r\n },\r\n panelContent: {\r\n marginTop: spacing.size16,\r\n },\r\n panelSection: {\r\n ...flexDisplay,\r\n marginBottom: spacing.size16,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): NotificationConfigurationStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { Toggle } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { EntityType } from '../../../../../../@data';\r\nimport { completeAccess, hasReadAccess, hasUpdateAccess, UserRoleEntity } from '../../../../../../@data/services/UserRoleService';\r\nimport { PublisherSettings } from '../../../../../../@data/store/schema/userrolemodels/PublisherSettings';\r\nimport { UserSettings } from '../../../../../../@data/store/schema/userrolemodels/UserSettings';\r\nimport { getEntityAccessPermissions } from '../../../../../../@data/utils/getAccessPermission';\r\nimport AppMessages from '../../../../../../App.messages';\r\nimport { SummaryCard } from '../../../../../../components/SummaryCard';\r\nimport { injectIntlAndObserver } from '../../../../../../utils';\r\nimport { toggleBillingAlerts, toggleInvitedUsers, toggleProfileReview, toggleServingStatus } from '../../@data/actions';\r\nimport '../../@data/mutatorActions';\r\nimport '../../@data/orchestrators';\r\nimport { getStore } from '../../@data/store/store';\r\nimport settingsIcon from '../../resources/settings.svg';\r\nimport messages from './NotificationConfiguration.messages';\r\nimport { getClassNames } from './NotificationConfiguration.styles';\r\n\r\nexport interface INotificationConfigurationProps extends InjectedIntlProps {}\r\n\r\nexport const NotificationConfiguration = injectIntlAndObserver(function NotificationConfigurationComponent({\r\n intl,\r\n}: INotificationConfigurationProps): JSX.Element | null {\r\n const { formatMessage } = intl;\r\n const { HeadingRow, HeadingTitle, Body, Section, SectionContent, SectionTitle } = SummaryCard;\r\n const { gridDisplay, flexDisplay } = getClassNames();\r\n const { notificationPreferences, entityType } = getStore().active;\r\n\r\n const { billingAlerts, servingStatus, profileReview, invitedUsers } = notificationPreferences;\r\n\r\n const publisherSettingsPermissions = getEntityAccessPermissions(UserRoleEntity.PublisherSettings) as PublisherSettings | null;\r\n const hasPublisherPreferencesReadAccess = hasReadAccess(\r\n publisherSettingsPermissions ? publisherSettingsPermissions.publisherPreferences : completeAccess\r\n );\r\n const hasPublisherPreferencesUpdateAccess = hasReadAccess(\r\n publisherSettingsPermissions ? publisherSettingsPermissions.publisherPreferences : completeAccess\r\n );\r\n const userSettingsPermissions = getEntityAccessPermissions(UserRoleEntity.UserSettings) as UserSettings | null;\r\n\r\n const hasSettingsReadAccess = (field: string) => {\r\n if (entityType === EntityType.Publisher && hasPublisherPreferencesReadAccess) {\r\n return true;\r\n } else {\r\n return hasReadAccess(!userSettingsPermissions ? completeAccess : userSettingsPermissions[field]);\r\n }\r\n };\r\n\r\n const hasSettingsUpdateAccess = (field: string) => {\r\n if (entityType === EntityType.Publisher && hasPublisherPreferencesUpdateAccess) {\r\n return true;\r\n } else {\r\n return hasUpdateAccess(!userSettingsPermissions ? completeAccess : userSettingsPermissions[field]);\r\n }\r\n };\r\n\r\n const hasBillingAlertsAccess = hasSettingsReadAccess('billingAlerts');\r\n const hasServingStatusAccess = hasSettingsReadAccess('servingStatus');\r\n const hasProfileReviewAccess = hasSettingsReadAccess('profileReview');\r\n const hasInvitedUsersAccess = hasSettingsReadAccess('invitedUsers');\r\n\r\n if (!hasBillingAlertsAccess && !hasServingStatusAccess && !hasProfileReviewAccess && !hasInvitedUsersAccess) {\r\n return null;\r\n }\r\n\r\n return (\r\n <React.Fragment>\r\n <SummaryCard>\r\n <HeadingRow>\r\n <HeadingTitle text={formatMessage(messages.headerLabel)} icon={settingsIcon} />\r\n </HeadingRow>\r\n <Body styleProps={{ bodyContainerStyle: gridDisplay }}>\r\n {hasBillingAlertsAccess && (\r\n <Section styleProps={{ sectionStyle: flexDisplay }}>\r\n <div>\r\n <SectionTitle text={formatMessage(messages.billingLabel)} />\r\n <SectionContent text={formatMessage(messages.billingDescription)} />\r\n </div>\r\n <Toggle\r\n inlineLabel\r\n checked={billingAlerts}\r\n onText={formatMessage(AppMessages.on)}\r\n offText={formatMessage(AppMessages.off)}\r\n onChange={(_, checked) => toggleBillingAlerts(entityType, checked)}\r\n disabled={\r\n !(hasSettingsUpdateAccess('billingAlerts') && (entityType === EntityType.User ? billingAlerts !== undefined : true))\r\n }\r\n />\r\n </Section>\r\n )}\r\n {hasServingStatusAccess && (\r\n <Section styleProps={{ sectionStyle: flexDisplay }}>\r\n <div>\r\n <SectionTitle text={formatMessage(messages.servingLabel)} />\r\n <SectionContent text={formatMessage(messages.servingDescription)} />\r\n </div>\r\n <Toggle\r\n inlineLabel\r\n checked={servingStatus}\r\n onText={formatMessage(AppMessages.on)}\r\n offText={formatMessage(AppMessages.off)}\r\n onChange={(_, checked) => toggleServingStatus(entityType, checked)}\r\n disabled={\r\n !(hasSettingsUpdateAccess('servingStatus') && (entityType === EntityType.User ? servingStatus !== undefined : true))\r\n }\r\n />\r\n </Section>\r\n )}\r\n {hasProfileReviewAccess && (\r\n <Section styleProps={{ sectionStyle: flexDisplay }}>\r\n <div>\r\n <SectionTitle text={formatMessage(messages.profileLabel)} />\r\n <SectionContent text={formatMessage(messages.profileDescription)} />\r\n </div>\r\n <Toggle\r\n inlineLabel\r\n checked={profileReview}\r\n onText={formatMessage(AppMessages.on)}\r\n offText={formatMessage(AppMessages.off)}\r\n onChange={(_, checked) => toggleProfileReview(entityType, checked)}\r\n // UM_TODO: write UT for this assumption. If preference is disabled on publisher level, user cannot override it.\r\n disabled={\r\n !(hasSettingsUpdateAccess('profileReview') && (entityType === EntityType.User ? profileReview !== undefined : true))\r\n }\r\n />\r\n </Section>\r\n )}\r\n {hasInvitedUsersAccess && (\r\n <Section styleProps={{ sectionStyle: flexDisplay }}>\r\n <div>\r\n <SectionTitle text={formatMessage(messages.invitedUserLabel)} />\r\n <SectionContent text={formatMessage(messages.invitedUserDescription)} />\r\n </div>\r\n <Toggle\r\n inlineLabel\r\n checked={invitedUsers}\r\n onText={formatMessage(AppMessages.on)}\r\n offText={formatMessage(AppMessages.off)}\r\n onChange={(_, checked) => toggleInvitedUsers(entityType, checked)}\r\n disabled={\r\n !(hasSettingsUpdateAccess('invitedUsers') && (entityType === EntityType.User ? invitedUsers !== undefined : true))\r\n }\r\n />\r\n </Section>\r\n )}\r\n </Body>\r\n </SummaryCard>\r\n </React.Fragment>\r\n );\r\n});\r\n","module.exports = __webpack_public_path__ + \"static/media/UserSuspended.66be7a21.svg\";","module.exports = __webpack_public_path__ + \"static/media/settings.3a561171.svg\";","module.exports = __webpack_public_path__ + \"static/media/default.a863829c.svg\";","module.exports = __webpack_public_path__ + \"static/media/supportButton.287b243a.svg\";","module.exports = __webpack_public_path__ + \"static/media/microsoft.3aa215b7.svg\";","module.exports = __webpack_public_path__ + \"static/media/microsoftDark.8b5afe66.svg\";","module.exports = __webpack_public_path__ + \"static/media/microsoftGrey.4a805504.png\";","module.exports = __webpack_public_path__ + \"static/media/partyPopper.67140c99.svg\";","module.exports = __webpack_public_path__ + \"static/media/scriptPlacement.25427644.png\";","module.exports = __webpack_public_path__ + \"static/media/NoCodeFound.21802357.svg\";","module.exports = __webpack_public_path__ + \"static/media/fileIcon.a53bea01.svg\";","module.exports = __webpack_public_path__ + \"static/media/fishpool.ef6f516e.svg\";","module.exports = __webpack_public_path__ + \"static/media/codeFree.06d1a51d.svg\";","module.exports = __webpack_public_path__ + \"static/media/existingClarity.39b0a4d3.svg\";","module.exports = __webpack_public_path__ + \"static/media/richBehavior.02a57e34.svg\";","module.exports = __webpack_public_path__ + \"static/media/clarityLogo.28d1969a.svg\";","module.exports = __webpack_public_path__ + \"static/media/scriptPlacement.25427644.png\";","module.exports = __webpack_public_path__ + \"static/media/adPreviewBackground.53d622d7.png\";","module.exports = __webpack_public_path__ + \"static/media/ProfileStep4.d54502b7.svg\";","module.exports = __webpack_public_path__ + \"static/media/BalanceImg.f092fed3.svg\";","module.exports = __webpack_public_path__ + \"static/media/Data_Usage.af2cfe99.svg\";","module.exports = __webpack_public_path__ + \"static/media/SearchIcon.d3031458.svg\";","module.exports = __webpack_public_path__ + \"static/media/CreateAppIcon.f121eb43.svg\";","module.exports = __webpack_public_path__ + \"static/media/About-us-background-image.03bee876.jpg\";","module.exports = __webpack_public_path__ + \"static/media/ads.7852f218.png\";","module.exports = __webpack_public_path__ + \"static/media/man.84c8365d.jpg\";","module.exports = __webpack_public_path__ + \"static/media/money.a7ad4940.png\";","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAACYCAYAAAAYwiAhAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAACXkSURBVHgB7V0LfBTltf++mdndhCSbBJMiNCSrYO8toUpLtSo+YuujKvi4QEVRHhWfWIX69qoBe7X1Cgi+ao0IgqhAVdDykFqJWrGtxooV7r3KY/OQAHluEpJ9zHzfPefbmWQhM5vNOzvZP79hZueVZPY/55zvnPOdQ8kgheetFR4iu8YRmWcQwjywK49QKYNw4iGUZITP4h7zq6lXPx5ec7EuJUTyEsa8RFW/8F45u54kAI9yEECQyeksACKNAxKcSygSimaQXgUHgtEvgHw7CaX/JJzu9F46/QsyyGBLgglCJTsvJxoQipIrep9MsQIlnQSk0zYSyVHsvfhqL7E5bEMwzzurC4gC0okBoSgfR+ICKOHIB8RBVnovtKd0i2uCgaTKIEnOO+BLmmVtL8UL0K7jywiVN9hJssUlwYS0kmkhbBYQW4J/QLi0Emy2lSTOETcEa5NWbF6P2FScNXCVlfNQcBfRiI81N+2iftWnVR+uYNU+H5EYPfjk8jI8NSUlRVxx5MgRittJM6eOdDgcRDkxL4crcrrkTh1JFNlNnY4fUIfzu1SmuTAidZNuA6Qa1xYyLm8smzi9jsQhBjzBeopYPBD8hAfVr5BILX//4hP/6jfKgDCRp7DU1FTe1NTEjR1paWm8sbGRR96GhJ+ZsTaeX+RzFPu/++g9PyCZx+XIWRlnUqdzLJDvTNJlANGYtoozsrL0shn7SRxhwBKsu8TiGqvgzc1b2IHDW1v+8tfdNX/aZvilkBxM32b6wocOHcpqa2uZflwcy8nJIRUVFdzj8RBFUfiePXvCv5vHQ71eL9fXkSSj2dnZtKqqSsYdbrdbbmhowP2Se/LEjJSCn+Q7hn3nYpqUdCZV5LGks+C8FJaXvRNnLNR/T04GOAYkwTxb19wBDssFnSUWSinW0rKj+e+frvW/uL5cl1DiiwBpxCilTJIkBmTRqqurkUAMCMTGjBnDd+/eHUk647nwBQsWEFg6+iIFuaZOnUrWr1+PnyW4J4V7CnLhsaysLBl+pqR/lrPunpubfMr3L5HcaVd1mmwcnLqML/ROuu5lzjn+XWSgYkD9Zl0y3tGW8h0pClZWftLw8OKPcRcQi4O6Y6DuNBImjDZ8+HCtsrLSkFgMyMCBDByhf0E9Lg3w1riG+wuS6YsgGC6ZmZlSXV2dAmTLSznjR3dThzKByPLI2H8AKWUtgZ+WTbl+Pxmg0mxAEEyoQ5cDiTUv1mtQWoUqq4qCW7fvqH57qw+MbzTCBZlImEQqboMk0UCS4MPXdGnESP+Bws8XC27D7ybB7yaBWlVArSqwT8pZ/dQ1cnr6TZ2Sapw/xTW+FOwzLxlgROt3goWlFlkBv4onlvORWMG9ZYt8D//3JyAZDFKx9PR0zefzhUDtaaD2DJIZNtVAtVUipZoh2ZSMjAw57bH7z5GGZ91MXa6LY7oTqk0CavPS61a27hkA6DeCdVZqIbE0b8WiivkP7zB2EV1KwRIytnXVF2msxxMk+P0p/P4ozRQYeMjyzTNOHHLqDx6LlWjgenn6hCUv/bq4uBifS78/g34hmGcLxAq5sj0WqSUk1j7v4so7H9mBahANdd22QkK1EoscPTqMdwipBipUBhWKZHPkPv/EOVLOsGeIJOV2eDWMNtXahvMrrpu7T7cx+41ofU6wmEeIYLyrNfWLK2bcXkR0NQfD/hAM+4XEGj9+fKikpMQgVjxKq1jQOiiAQYoCgxRl5CvPXCdnuO+JgWg+rmmPzC7Zv7SwsLDfSCaRPoRn8ytPwvB6aUfkYo3NRTVFr58K5HqBtBnsASCXH4jVjNtArhBps7HsCjE4gSV41llnBWDtV+9+dIX6+a6JPBB4rYNr06ksL17xw7yFQC7ZGNH2Nfrkh+r21lukI/eDppWre0rngZ31CWl7uIYqFOpQ9/vYmVSWCGs7igMBHHk6kx+9r0Aakf1sh9KMsQ8D/3t48k1NTbV9PYrudQkm7C2X8k/SAbmE1Hr2tQvQiAcfllCDYOTiW9uiL0gwbbCSC6H/7fiShQoKClrKbrzzPf9X31zCg8FXo14oSee4vn/8Zy/mZY4iuuOX9BF69QfFZMyDrcVqGhbX3HIvqkN0kmowTA/V19cjoYIwqmJxPCrsbUhgMshgLjhz1/3hV1Jq8n2wK93ybDD+pW8PXzj+z3/bu27dOq0vIgC99hM8m9aMI5S9FZVcoBIbt304pWX5a+V6GEeD4HKQhIkVShArZqDadBz/u3tHJY3N3xxVZTJWpvrqp1ZMv72EhE2QXv/Fehw6uVByHW91Drofan+/anJo47uH9fggjhCRXKgWQxGxwQQ6hnDRNL33cX3yqfmbIQaVRyXpe6ZnUpouJSf/IvWic96/SEk7CM+Z9CZ6XIJFkMtypIj2VtlVNz6MuVURKlEQi7T5tBLoGtBv5sx948UHpeSk+6Oc51Prai8ESfY56cVn3qNGvrC5wmrRklxavW8xkAs9+BjmUdGQB4L5YXSDBEuQq5uAAYAK5kWgbPKcR7g/8FiUU9OVjKHrRjz3OBr+qMl6xVzqsZvGYtCr1bWFtTffVxRhb/lhN6pFdEXY2WHa1zCC6gpIsnkgyR63PBMM/8C+8p9X/uqBPUDOHh+l9wjBwn4udEVQj9U56oGD8yrm3LWW6DFE8OMEqqqqkFwhkiBWbwG/X0fuH5+fJQ1J/YPlWRgo/3Tn6Z7iT6t7OobZMypSOFGpx+qweuhocsHiz83NDaA/hyTI1ZsQz7tsys0rWHPLTZZnUZLHx49dD+RykB72k3WbYJ4ta6ImCAq1OPfhdST8xyKhhFoE3406mJ2mfQgRasv+7fMruL/lHquTIKx0Vt6bKxaNHj0aBwkDg2AicM35AqvjaNBjPLG5uZlhoJqE7a1ImyuBvgH/7LPP1NL/uGEpeP0ftTqJJjluDT5+3x2wqYD91iParctM1Y36f1qNGJFc5dfMXQyuCIajRaJLLpIgV38Cv28lb+OKJdThuM3iHB/78v8mZK/f/DVqGTBjSHc0TZdYKoz68IjRlFwsEHgXyUXCrgg0Gg0fV4Jc/Qthk5VePvtOorGPLM5Jl8aetLn0jDOyYVvurhnTNTEoMlGpx/QYhH+OFP/tIUwOhE/o5xJqEURuglwDA+J78X/5P5PFNDgzQKgp5bwfPQhbaPR3K9rTaRXp2bRqFqHSCtODELhu3Pb++TXLVuKMaDQug2A0+q+99tpQP0+2SKA9pJwVy0Ypw4b+w0oTqYcOXVox+86/kLD26dL31ykJFvbUi2llpsAMVCBXOWxyDP/AOvDDH/5QTZBrQIJVzL5jH9fU31idoGRn//67v5ojVCXpor3eORXJHXdYqUbW4l+rpzcjVIwt6hkRvR6xT6BrwOTN01ZtXsZD2jOmJ4CqVH565gOw5YTvskv+sZgvCI8aHftND+ppN/6XXi+DEFAoKSkpkJ+f7x8oM1sSsAaOEkcsXpjlGjPqUyvhETpQOfHbOXe/R7qgKmOXYGLUaI7Anv3zkFww4sD4YghDQAlyxQcw6bDyrgU1UkCbY3WO8p3s+7Oyspyw2enc/pgIJgx7Qj1mx1hz87rK+Qs+wen6TU1Nak5OTsIdEX/ge6+Y+T5XtafNDlJFmZD87H+h30w577zzOjWqjE2CWRn2oBqDH326CF0Suqfef8YZZ6BbIkGuOAP6u9SybxeGixe3h5yWem/mdVOzKyoqOmXwd0iwcKyResyOqYeqFh9cVoTpzlpDQwNKLVU36hMEi0N8e9sDtYRpj1gcTk+beP7cPXv2YKwyZpJFPSlqjhdIL++kmaeRMJlQarXo64RLIr5BPZtWbweRdq7JMV9gw7snV76w+hCJ0eDvQII5Z1pJr8DXe+frpSXVYcOGGTHGBLniH1zWuKUUc/zsrLkk7OGPybyyPCkcb2SzzI4Jw/7ORz7WK9uAw/dQglw2wt7LZmwH/8UHZsektJSbMqZNyyIxZlxYn+CUr7CSXkfAsCdtM6+NUWOCYPYB5yG20OJYuvvK826BtaN7BLMYOWKmRM2yogosmEvCxDKq2yRgI5ReMXO7KKduApRiJDx7qUNj35Rg0fxeob3lL6BbAjz2Rs2IBLlsCs6spdiIpx87G2xvg2SWMJdgVJpp+gNVdRdWFkTbS3dLdDnKnsDAR+nEmcVWtpgjd8Q9wWBQwTKgJIoUa0cw4ZqwyLHXDtcWNTc3C9sLPfZYN4IkfF52BidUXmp2AAsWs3PPzdIL5FmaWu0PcMcVpmeC36tizq/XYvVm+KRiHVS9dkQCNgarq//AyrufPu0itMWMpERTKWbCPH6H6Q8KBLBmF4YUWis4k4T0sj3Kpt9aB9/yMrNjUsqQabCSPR6PpKfztD8n8oNn04pxHbgmSGNjozZ69OiEW2IQgXNmaodhTf8Rz/zX2V6vVwFtFosEU2aZ/gAw7v0vvoqZqkJ6paenJ2yvQQQw9iF0RIrNjilZx03AFQgd01Qe5eiPpvEnotU3rNPbsqBa1EpKSmwtvUTtfod0iuiYS6Rx4R7ekf0o9XbJlHsJg1FWMG2D98or7d2jG/9OSguO3U2HJF8Cq8chCC7rHU2Oclu1Mi5axmrjux+cBs5VnMiB08+accq/3WZl90BXt5e5yrB/kNeOM9bz3l51AlWkfWbHmrZ/OJ6sePOb6upqLNB8FMHaVCSTC8wuRvWoe+5ZdnY2lgayXZ1UIbFcyv7wLPUutwycSWVpu+et1VfCNu2vqs69hXAbQezK2x7Jp5x8id7oq91oso1glF5udjFv8WNnDcxWZVVVVcyWrglJ8pCeaHJKSR5Nkt7I2/TyfD3z01YkA+m+0Ww3dbmwr5ICvtEoBCPEtJF66MDBrfokWmF/4SSBBKKDUnnx3hsm/4yEbVzbkEyRlA1m+6WU5J/jCnyjohXOUcfwv2juiabtf9ulq0RBsMFSEYeH1F2sqXkd1tgIVR6aj2ss/Ym1ZWO5Xk7PeCHrttu6NadwoEH1+7+wOJSedfucXOyttG/fvqM8E/ooUjaVXvgwG9/e6sNmnnq/RZuTi/lYw5EX/N/s3Xb4oUW7iO6KiWgVKDD8zltyHaeefJXkTrvb8lYSzU0+e+zM4W8MXwbPzSgPGtfwXjm73rPlFYhPtg8lJo0bO6Fp1R/3+nw+IzYpnp3ONmpOsGDwK1yjczWimac9AUFd/5ffTCibdssTQK5/waBGhRdLTGRxuVyYDo7VgXCU1FK5+PffwHmPqoerro12Sykp6VK/3+/Apla2MfoZ32m2W0pNya+vr5dVVaWRZlSYYJSeYnaRWuMzWrpE9l60H4LBDd5Lr/vZwft+44VPGjiSgzCo8QPJkFjNtbW1zdhZg4RJJvbhUjFr/hs8FHrG6rYQEB5bV1fnwICw7iOKf0iSqZqkSY4J8EJiD3M58m/VN7ipBFOrDlcQvSUxsbH0QtFP2sp7BkDMI5H8ILVxLTJ2i4uLjfhrZP+kgMzohii3TgeS4jM2Mg5sIMWCxWZ7KYSNQNO19ig39kvCwWg2ROe84XDh4n8BKyMlmJ3RWj+WhB3KRrw1mtTm+66c9X6U4wQkIT5s0cCK2ADei2d7TbMrKHVnzf9lHmzJkTliElEUc/tL0zD2iPYXB/8Gx37XNocxUu6sOcCtHJD4kupbNvOHmf+9ru+dhP4wCiZBmwQLOxlN7qFpqB6J2+3m4N9gQLDB4gDrwt8ZGaeM2Ku/pPo9jf7c8Q/KTA196nK6SVsTVQHYYB6zk8GD/xUOz/UOs4kmCRYI+xDNAb40fIYEBg340T5mBqemgX2alIRNuCTQeOIj/idB1MxjehON+bCgCUmQKzok5+VWh0JlFVi+ncCggYFdQuwDi5Gky4nMoqFQKMIGI1Ke6T0am1FFCgMfhugJgpkgnIGC2RcmAPVoVB2CT8xW3eM0zVyCyeFelYyxVnPAcmSjBgI+okuu7OzsBMGOgcjAiFJp27/twymw4jAKN1wb9iGYLHtN90vySHDL0KqqqlZeKeEYZHv+BL37yuHhEEzTWb9+PUlAzxnDUbdMo3c3OXBw3sGnl5fhs4NRuDE52T4vqRSsJ9zRbjf4V93glhGb48ePpyUlJcdmtEacLEkcHg4SDD8OGgkmylWxYwY+VEIpNc5qtNgKzhoCX++bDarRSHEKeTyeAHi3B1NBPqEegVyGijR/aNVPviRsMIxBDgIfWBs4L4BXcdZRC+FXRCUXEIvXNy6u+cOrpxnkAumPpArakVxhZ6sJZGkkrjIyMog+qKGWEkzvRiu2B5EPrLPwafW+F+tff6cIs06IbnOhWsTe4zA4GpS1aiHoLWVlZYmMCksjH8mVmD3UIdLljPQ7j7vhmj/nvvHi0hHPPf4TIBaGmUS4aZAWQhbE2rNnD25LUeNjeoqJfTzQvQVQDVJy0lVOz3c3ejat+lPuH5ePwBr0ZJC+nOhYHj16tNhWop0IXnxcDTJHKysFwV4Khr54+bj+coGPJyemy6l0jjTEVeJ542UsC/4WGYSOanAsU1wIFr+3Okm3wTgyEcRda4ai3eG9ZMZsEn7xkmEE7YKRoChPhM8jac41I5P+/cR8+TvZP5ecjjNxZrPFbTLoEOWPOSuf+snolW9+PkhVpZHRah4ZT4OHCSuKGYqDahTZlmCpArmw9qzIDYOXzV+zrOibb2+5f2PZ5Dm3eifN/BFvOPJEtBsp2Znrvhr3vWww9m01w0ivwNQeEL3Q6/YaL5N1lqUqaeIkGGYPRjuC4wgQ1i0w3BZp0kTPYtUX8bl02k2/0fbsPQdz+U3vQmnekLNOvR17YduNZOagrZ4HHTCK5BaF97Oy0t1uNwFH4WCTYAimZ7CGIIZotIIO6QtuB+CZ+DGN2vXU6n+wluBjVjeShiRjPVMX3M8+BFMVj9luPT1JCCTDyJdEfQUTKEOzRoKRjznWg3kEyS0WdD4LEoJ9Ggz+794VVjW0AOnZ9918Aqyx14898vI5z7DYb3AF3RTiWaEn31S8Y/IYJvFH5vYkYApe+cBjVbDaaHWC69/+7SwSTpu2hxRTLJJUVa0s8iMRNphF+quUmpyPsciKigo6depUkoA1sGOZVRKeAKeRefnxTzALCcZDwQp908gcQQkmeU1vQkVuj3CyJrIpuom2/Ch67NT6uAQlptMcuT9Upo8ixUf8T7JMHnM5xuqZFAlPfiygJM/qkFbfUI55UtnZ2TaxwajHbLfma6jQZ8C35r5JxKGZp7+CE1GfciVhbg9JwBLRKnMjtJamBsyTqqqqsofLxyLNPrR9h1FuoTV6IXUwzw2T+GlLS0tCikWFaBpmPrKCofvhhxZhCQYRmwRzI65JphfKMZ1HW61nlMDCCgsLDU8+sZznlnTyKWfgOcFg0LYE82xevd+z5TUP6SI8m1+ZGS5cZw6jOjdpixDEtxTTZI/Zbh4MofQS0xzx48KFC8V+o3TAB2YXSSlDxoKrQtJjkTYF9YCHcL/nT6tW5q557kQSrk7Y4VWYPg3kehI2V1qexFlDROMwg1zxTTC5fZ1WBA+qolCOJEnG3ynsMD3YjdOQ2v/d1KmM1esN2D/MIUkzpUz3TJBoH5ywZc0GkGpfsFq2s2z69DrjFCCVh8iucUTWCuBpgFokUasiar7GIohfondbw/KjYIPFf18ni0I5rLEJJRirr68/6iUKE0wKFpsm8TsdZ7ovuyyj4e23MeA7SGwwUWn7XJBqRMoUKvCY4/hidvwosFhd+TVzF+kXaECuuO8tEK5jYj6YYZUHdmEHPiy1SiIIJlSkpaEPSLngVKw3YJviHX0B1tyyruyqGwv1jyi17NER2KKOCQ5kDsBABsjFhw0bxvQeVgIRpDEPdTiGHX8xngfBSxpLA8pBDbC51OrawrIpN8zT69qqQ4cONQLk8a8eJWLax4qp6m5cYyWmQ4cOaZEj5QjCmE8Hl5JdF6OhDw402ZZZFZzNhv+8pJvg/sBW/7aPzq+YcXsRkIvB8xKzimprazHzwiYJh+aNOlidbwvBsFDYwD9KRcbUiCHwl49/HHp5/dfV1dWYB6US+8GZ8/LSKXJa6iTqcEyIkqnaBpyqFlR3sZaWHfXrNr2gbStuxEZhRh9zMOpDYHcFgVwqZl6QOEc0fvg3b/9J08q1XqwKScK5ciHj2FHWqmfTK/+EPe30LGtofAJrkpJwlw/VhpWmcbDjzMjIcMIoSHFPvSwj/ZzTx4LNkcEdiqi3YPR1ZS3+BvbN3l0Hn1wemTlgvLVG9UPD5rJNqjQMdrAGx5PH7sdGHaWXzTqfhP9eJJdRvE/gmJx8tMPaFwSmyUnY8EikmwC57Jhfjn9TYNSoUaEDBw44Kte/HWhY/3YN0WtdYQkFzCwhEdWTEfp+UXcCJJamuyEMktmrIiQHt4zJ4Jm3BHfomywnJ4dhH9HI40cb7cy8oxaojTOxbRtpqzVqNwjpU1JSouolx/FNPAIDG8z/PQLD78i06RbjeHp6+hF9X3N+fr4fVGEA+zgRm5FLqEdq3qjD//XXWKKKgfRnSUlJ7SIV7Tjp2bxmv9k0eVSTDTff/xioEHygIWI/KWaGyPyt1okMpK1iobHPXtLqGHg2r1oJj2JmuwOaVuadNPN0Epbaxot3lI1u0lKZvUxMILnTbuSTLsjU+9EMFneFUWE7snardsza1uQKw3z0qNb5lke0GTI1C9oRhdU3mrbPJViS+5zTzwYda1c1mYAJPJtWzQqX+GqPlh2fbdVbbBsvWzut1o4o4R7N5sFvZdhxNxJb1XxPoGNIpj3csc1QzfOrcCRtlH83HfyZSiLO2UKz/VRRJox47jE7G/sJREBUcbQw7nld/Vpcg+9LkAvCQ6Y2uSlJSifOLLaKTTpGDL+XhAk2CCaSDnLIxFR6oXFffduD6wz7a8yYMRgeMg2FWUkhDv9MbTHMsBjx7O/OITbrhZjA0QingVPT2KN6qGZJc3MzdqDThg8fru7evdsyzmpdOqCy6ilLKZZzfEKK2R1cedJ0v6aV+958bwtKL/B9od8waoFjS4JVzPl1LWH8KbNj1AG22PO/w6FrQorZEML2spBeWmPTusbNmxsw5go+UfSHRo3sRDXUma9pqbUtJqQY9kJU7NYAfdBDJitM94P0av7rp2jcc4hiRHafs0RUggmXhZUUgxHlyLXPz7VVL8QEovq9QHqtrXlupUgBdzgcRkvDqBGdDomRRmRLKSanpd6bcc012Jc6oSptgHDMkRaaHoSRY+0N9yxG2wukl1ZdXR3Uy4RGRYcE+9fE6fUgxR6xOJzunvKz+2CNCf0Jgz/eweUFVtJLrapZgrW/0Pby+Xyh8ePHs1jStmIiBNpYJ2x+ZTuw2zQmFar4dtK3N977HgnnQQ2C2Jz9IAx7mW43PQjS6/BVt5wOrgn8bo1sE/yuOyRYTLYTMpVrISsphs7XZ4fOmZMFmwmDPw4hVKOVYQ9o/PNfp+jSSky/I51IpIzZOC+97Jfbuao9bX4XKTft4tMfgC3D4E+QLJ4QRTXi9Dv/8lfLsSB0ZmYmpoGHQIjEPIGlM6M/nuIPLbCaIEGTk27JXfeH20nYHksQLE7g2brmDtNcLwSoxuBHf3+RhKVVqK6uTqSCdyZlvlPuhd2/mFPH/aHrLW+WmnLfsAV3YXHOxKgyDiBUI2MLrI6rh6qWHHxmeZk+kQVdEp1OBe8KCaS8t19eShX5V6ZHGStr2vqPM6qfeeYwsdGkBzsBiCVWer9Lj9k5oBpfqPnl/EK9oaph2Hc6HbwrDlKmln270HIuIdhjKReeit5ex9SpUxMO2IEIrtBwrJF6TI+DasSZ6Uguo2scfJddmsjSVTVGT1yzbDTLHPoPq7pYPBh6rvSK2XeCQRiw4TS3uIVnyxpcLQDfk7lDlTNf45YPLqwB1YjkAo89Th7G+Y5dmofRVQnDZ3xTt1fS2G+sTqBOx615by5/CMjl6MbPSaAH0SG5AGpN/RIgF4aDmCzLKs5MJ93o2NtdQ1zO2wj2mEO+zeoE7g/ck/Lg4mV6Q4OEJOsnwGgRV/MgKvOk1TlavW9R+TVzRTgI1GNw+PDhAX0aX5franRXsrDSy2fOB8P+Q6sTaJLrv5sW3D4LNpVE8ZT+gShBxfisaOTigeAOINcS3NbraoSAXN0u2iKT7oO7vjdqk2PEsF+Ay9/UHqNO56SMKy76dsPcu3Ya15AE+gR6fbNZsFh66jENp7botanBr/catpZol0N6oCJQT0gUfmjBoir1cOUFoNtLLc9KSXkebDKsb5AIivcRhFqUKD7zqORq3PbhlMY/bcOMGTG/MT8/v8cqAvWEBBO4yJnhK80esklOc19mKckU5YL0qRMl3+sb/0oSQfFeRYRB/1vLk5Bc722f7F++rtzlcmlDhgwJ5eTk+KdNm6YuXLiwR76fnpYk8glrnhrPMzO2wauTbnUSV4OPQmwTg+f2KxIyAABqEb9XtKfmWZ7EWUPz519O1kusa5ih6vP5Ip2pPWLG9DTBRDWanJeW/lg5fui70UhGNPaOWt/464rr5u7Fqs4JX1n34XlrBX4DmcTpeJNEaQyBvq7g519OOdBWvx9J5QdnanD9+vU9Ri5Eb9lCCpBsvDLsuLXYlNPyLE5K1cM1F8wprdsLOj/+S3z3I/TwzwngoX/f0kOPAC998+c75xwuXPIvottchjsCsyREY68eRG8RTJQ+H/70Y6NdJ47cGpVkhPi4pj1SOmkmzsPs0bdnsED3cd0RDlxT69LqQK7Gdz+c6l/xemQAO6AvvfLse200h4mHANkDJCMdkwwvWKU1ND9SfvVN+0iCZDGhVSW6nEvg+c2KerJOLgwBpaamajjlHw36iooKkVvfWyZKr7oLDJLlPTAvm575o7UQCD+7gwtKWTBwfdmVczB1N6Eyo8DzzmpcnQd+gJeiqkQSdqLWrlj3S/aXj3w4G5u0SS4jxb3XnnNf+KOEuoS3xSEtW/CQlJx0f4dXgDRjLcGFZVOu308SJDsKQmphhxGXA+OJ8zo6PyLtBj8a5BIO1d6UXAb60uEpezweB1v84O1SsvOBqCNMBEgzztgjs0v2rywsLGQ9bXzGI2K2tRAwUmQ1DUvKZtxWhJ90tYgSC8llTJjt9Ze3L2OD2qxZs4Jlk+cs9X+5awImJkY9G2w2KsvLV546ah+8tT8lgzgjA9WhmPXD+HZYlnZILmFvfXSBTi5RVj0pKck/ZswYw8/VZ4mg/SEW6Pjx45WSkhIXhI4eh2D4rTFdNQjVpm5n4XSyQhLNrxUB1thUVPfa24saN2xuIDq5srOzg1VVVUZssU8d231OMN3wx00MUzlGrn1+ppwy5H7MhI3pBpRsBLfGMu+lM7bbVW12hVgotdQ9pfMr5j8syorrKtEw5kO6j6vPX8x+/YYwfeeVV15xNM25erTrpBPm0mTnLTFfzMlOUBfLvJOuW0lsINFajXdZLiCKKFtZEOu1OLWs+bUNi6o3bMZi/lpaWprW2NiI9laI9HDop7PodxGAJIMFpZnzOwvuGjXkxye/E7M0E8BuvfwDrrKFpZfN2E/iDK3SSpHOBcN8Xof2VQTQ/aDtK19ScWfhx/ouMUocMWJEMDMzU50yZQoGrfvV3TNQdIyIYeIo0+v1Oke++uy1sjvt3s4RjYSlGiUrCZU3eC++2ksGKHRp5SFJTmzHXEA6Ia0EYISoVh4urJhzFzZB4HoGqpicMXr06OCePXvUvnBBxIKBZsTg76OAz0wBD7Mzd/0L94Pf7OpOEw3BkGy0mEhsA6tt3ClKUfUTWtUf9lvElnhUutys2UWH4KwBu+i2vP5OETZgjyAWxhMxA9UYIQ6YDJWBaiXLMKSWd+/e7cgBtSl9/6Tp0hAgWixd0KxASTFhNEw6hXu9F07/gvQSWiWU01kA3/U4vQ1xAekqsLOb70hR7bp3RFc3vQgJtm8JuVyu0HHHHRfS66QOuFjuQB6GCbVJwqUIlOHXX3OcfPZpk5SsoXd3SaK1R33YfiNe+AJ3ElmqI0FaSqhWT1QV9xPvlbO9x17USh6E05lBNOohMs8QRCIEnMcSEIp5OmNLWUKXWPWr3ilq3LrVR9qarRseeSNnfsBOcI6Hcb6kLwr4cxTw5zhyVj81XXa7p2GtWGJDoPEe3Fu6uPKuhTtADYqaXDAyZHpnN6OyYFy0C4wXRxLVF2ztLIMR6wD1oDhuneVJGnvSpXJa6k3dUp8DAFxjFcCgtSittA8/bEADXScWuhyEnUXapNWAsrOiIR49lYZEk/VFTOzNeeI/T5E8edOoyzWBKvJYEgfgIXUXO3Jkq3ro8I7K+QuNvouRatBQherUqVONXthxlWIez65wIdEg7CRB2Mmo2S/Ww++emyfnn3SW7E69mDoc+QNGuoFNxVr8W2lL4Kumv3/6bs0zq4x4LAPPOwfPuxHa0UA1quCyiezoFpfOZDvEWgz1SfWRZyvR3G631NDQIA377X0nO4YfP1YakpJPHfIPqFPJB1eBm/QmcOSnsnLu9+9gR5p3tXzx5Y6ap1aW6zaV4fxk8Dsy+B0jVd+xpIrrKIXdgnk0YhFqdNiwYfKhQ4fk9PR02efzhasvUiK5/2Niuhv7cruH5NKkpBwYMORSWRGSjipKDsd8DlnKMfshaC+JDcZ8XA3hdj0Y5hXcHyjngYBP27VnN9bVirgEJRTRJZRBHDGjKqINsW1IFQk7J1m1kk1XoyLxkeg2HIRSpLq6OkE4MKQpGNJSxHUEJA3Vk/Ran5Hu2Ix8ZqLzrb6fkbYuuGLRe3ob9pRhP4mloKBAKy4uZhH3SSRWxjmEVDv33HNRfSpAOhwcuGBJhmUILClg+6QSbA1AiBtGqejHysQF1NhQkICZxmdjG9f6eZg86R46dCiq3VR9wXsm6T/DSdp6OyVq2A4SGGq0VZ2SMAkUnYQGAV3gGsG1QZbIBYnjys/PdxrExfvAiK9VUpJBTqbEmxQdhpqNbAhPyNHqLKHaouD/AUTRW8AiuP4QAAAAAElFTkSuQmCC\"","module.exports = __webpack_public_path__ + \"static/media/time.599c4eb9.png\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAACYCAYAAAAYwiAhAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAACQcSURBVHgB7V0LeBX1lT/zuA8S8oTIRgNcK99uBeSxqQ8EJVq04quukF20uqJ2a31Uo1YefrVJ8KsLCBhL1ZVsS3xsXcAibHcVrUpcMWwtkYchthXhEtJiSCC5ed7XzOw5/5lJLmTm5uaS1507v++bzNyZuXNz5/7mnPM/5/zP4SBZsXSvBxRhBvB8JiiKBzhuIihcJvC4TWsG3DYE59WOa2vw4jWO4jVo7YVAeB+UzWwBG8BBMoDIxDkKkBAzkARzQWaEyoTBhKK04Gfsw439uN4LYdgPz07dB0kGaxKMCCWI3wWZm4E/9C2DTqbYgRIOScdJ20FxVMKqC71gcViHYEs/LwCOnwscEkqBGZAIIAmnKB8BDxXwjDWlW2ITrGhvJridj+DWYnN7KVGA9hunPA+ysM1Kki0xCcakFVeMWwVgSaBUA64CVk6tgARH4hBMl1aKXDQgNpUsteK1jkHYfxBf+fiA7yAXCvo4X30919XkA0XiQv9dWkenpqam0krp6OjgaLvjisfGAzgAzvlmHoiODEhJGw+8Mx1E10UguM7D/28C8EI6nDVotCqV4sZ2WDmtGRIQI59gA0WscGA3SMEa6PQdBO/Hu1N3ldUhYSLPkEePHq20t7cr+o60tDSlra1NiTiHtrmItX7/Iu8j2y8u+reLwqm5eZCeczkI7qkgOi+HuEHuj/CrIKGttmb6EUggjFyCnS2xZKkeQu3vCM3Hdgifb68NVr+h+6WIHLJ+lrYo2dnZ8qlTp2TtODuWl5cH9fX1isfjAVEUlUOHDrED+Jrzer2Kto4kGZeTk8M1NjYKtCM9PV1obW2l/TxcujgTLpw/BbLGzwcxBUknToX+gnxtIL8Cq6aXav+nAiMcI5NgT37+CD6tJf0mFkmpQHsVfPn+ptSP1x3TJBT7IVAayRzHyTzPy0gWqampiQgkI4HkyZMnK7W1tZGk0++LUlJSArj09UMychUWFsKWLVvoNY/X5PCaKrnw2NixYwX8TF57LcCNqyfA+fnXg3vMP/WbbAocxQevFFZPe0VRFPpeMFIxsv6zeIx3tKX4QGu5fNK7O/WtH35Cu5BYCqo7GdWdBCphpNzcXOn48eO6xJKRDAqSQSFoP9CASwO6NK3x+oxk2qISDJesrCy+ublZRLJNhL+96glUo7PRdhsf+wcg0QKdV0PZJUdghEqzkUEwUocuRzH+N0Uxv4ekVcuxcte+N6sCe173ofFNRjgjE6gkCtM2ShIJJQndfEmTRjIMHzj8fLbQNv5vPP5vPKpVEdWqCES+Bz64HVLH3Nc/qab8HMJyGdpnXhhhRBt+gqlSayNueWI6n4jV8Mc1Kb/5l90oGXRSyRkZGZLP5wuh2pNQ7ekk022qkWqrREo1XbKJmZmZQlthxZVS+nk/BMeo+TFdqUdtVnTvGQEYPoL1V2ohsYSmL9dIFYuqtD10A5mUwiWkb2uqL9JYTyTw+P9z+P+TNBNx4CGcuvKpb8AFc56JnWjy+oLfP/xYZWUl3ZdhvwfDQzA1+LwTYpFaJLG+rl0Lr99ZRWqQDHXNtiJCdRMLTh8dJjqYVEMVKqAKJbI5hPt+e6WUOfEXGA6b0Oe7abTZ1jQPXrzqsGZjDhvRhp5gsY4QyRHa0bgWXphXDpqaw2F/CIf9TGLl5+eHqqurdWIlorSKBd2DAhykiDhIEeHBnXfC6DFL+iSaovjwuVtRMmpbWXFx8bCRjIehxNKa50DmyvokV6CtHCrXXozk2gA9BnsAyeVHYnXSNpIrBD02llXBBie4BOfMmRPAtT936+0bnfW7b4RQ1xtR38lxGejuXVvScXMpkkvQR7RDjaH5UOY0dbwFfbkfZOmYcOKLIrSzdkPPzdVVIVOHmt/HyqQyhartOBoI0MjT2XhLRQFkj3+hb2km/y80exeUnPvZqaEeRQ++BCN7y+3YC32Ri6TWh89eQ0Y8+rCYGkQjl57aLm0hgknJSi6C9t3pIQsVFBR0QfkN70PdZ9djPPXX0d/IXwlZ39hTcvzyC0Bz/MIQYXA/KBZjnhylHSfXjqq4idQhOUklHKaHWlpaiFBBHFXJCTwqHGzwaDIIaC444dGqH4Fz9DIkU4bp2Wj8u9rrrr35RMVXmzdvloYiAjB4n/DE3hkgMLXoMT0HVSLs37ow5eNnj2lhHAmDy0FQiRWyiRUzSG064LYNF8CEy96OqjIVuQ46Gwth/berQTVBBhWDQzAiFy/ujGrMk/vhvZV3p371to/IJQhCiByleIQIRnaXVVwOQwVSfSLc+eoFkDttNd7/G81PxRFm21+/U3ji3/cM9kM88ASLgVw82lvyc7N+ynKrelQi2VvMzgJbap0NyG/mhMc+/Qk4U5abn4Yk6zhxLUqyz2AQ7/nAGvlssgWqxWiSC+0tJBcFtCnMEyZDHgnmx9ENEcwm11kCBwBhNC8CsO6SFejKeMb8THRjpIzbDPdsI8OfVOygaLOBu2gsBn3b18UpG28uj7C3/NCjEq3sMB1q6EF1ER77fRE4U1eZnkle/4Y/XQcVCw8hOQd8lD4wBFP9XOSK8Jie03y0CF6+YRNoMUT04wQaGxuJXCGwiTVYoN/XAUWfLAZ3xsumZ2GgPPXwR5dd3LilaaBjmAOjIt19jBbPIBcu/gkTJgTInwM2uQYT6v0um70R/O33mZ7FwcSO82dvQXI5YID9ZGdPsGUHoycIklp8rXAzqF+WCMXUIvpuwsnsNB1CsFBb/scPboRA+xLTs3hxDvy4es2kSZNokDBCCEaBa1BKTI+jQU/xxM7OTpkC1aDaW5E2l42hgbJnz54wPHdZGbqHfmZ6luh64NDN/0HzTEW03wZEu8XPVDLqQdxrOmIkcq2fuxZdETKNFkGTXGCTazhBv7cISz5bB7zzIcMzFMXn/Lp69kU16/9MWgbNGDgbTRMfwfoy6kOd78LaS+6GCJsLVHLZNtfwQzX8l+x/H3jhCsMzyNv/xTuz4L+WngD194sb8YlBykQ1IxeFfw7ueIqSA/EV+bmYWkSRa0uukQH1oW+sXqBOgzMAhZr+9ts/ATa7mPnI4kb/JdiyA4uRlxsNj1GS4IE358GOp2lGNBmXQTQa/XfccUdomCdb2OgNHu577wLIzP3U1MxpPnYDvDz/A1A1T1y/X/8kGLO7+GLT45SBuuPpY7ilUPgH14GZM2eGbXKNSMjw8rWHQQo9bXpG5nkvjZpfnANn4envp4p00AjDY3go2LlJS28mhCm2qGVEDHrE3kZ8oOTNwqP/+jzI4V8YnoCqsmvKTU/ilhN/y7j8Y7G/QQ0FHTE8pqXdpO5aU4choJDb7Q5MmTLFP1JmttgwBxsl3v7GWJg47Q9gJjxOeW+EDTe+D3GoytglmBpnNMbxmiIiFw5nKb4YohCQTa7EAEs6fOP2kxAMfN/0pIzzlo8dO9aJW/3O7Y+NYMywN2F3oG0zvPa93TRdv729PZyXl6dPJbPJlThQlLV//yEo4fWGRwXH7KY7tpHfTLzqqqv6NaqMUYKZGPaoGh2HfreGXBKap94/a9YsckvY5EowMGdq++FSVrzYCK6MpTD74Zz6+vp+Gfx9s1GNNd5ieKzlWLH863+pcrlcTDXinmBtbe1ZOeZsDCP+sMkPl98XAJ7/Tq9jHOeGcZNCp95e8zH0Y7pgdCZGy/Eiw3719Eu0DyKp1aWtbZdEYoODZZ/jb87N7XUEw0ju6ten+d9f1QAxGvzRVSTnvAtMbC+h4cCjWmnJ8Lhx4+w8eutAgbC8wvAIx2X4p978IKge/pjMK/OTKN4IymLDY2jYS6/c+YlW2Sbc0NBgk8tKWDN9p1qI2ACu9PugoGgsxJhxYX6CWyC7y2N47IvfrYGemdf6qNEmmHWgoAlUaniEShLMKLwftxxnRzCzkSNlSuz4aT0VzAWVWHp1GxtWwuoZ0aWYOnupzxGlMcGi+b1OfLmB3BLosddrRtjksiqiSbF7fnMF2t46yUxhIsH4u4w/MHSQKguS7dXa2qoTzFaNVsXqGZWmUmzMN5YEg0GRyoBCFCnWm2AsY8Ikx97XUN7Z2clsL/LYU90IsJ2qVgYGKoUywyPo3W++sHCsViDP1NTqfYDnjZ2q5Pd6+bpNVL0ZX4WpDqo27dyGlaGc/MjUu3/xP5MtpiclGkqx3gRThEcMLxbqpJpdFFLoruAMtvSyPlZeQS1snjc85kpbhH8Fj8fDa+k8vXD6TqorEd01ARgSkiZNmmS7JZIJimRsh1FN/7u3XOH1ekXUZjFIMF5cbHghNO5TP15FmapMemVkZNi2VzKBuSyg0vBYeu5s/Cui0DFM5RFPf2kQfyJ0nNystWUhtShVV1cnh/SiGv4CTMfH6nxWLESX7grXApx8FB/PI7j/I6s2Ez0N1DiV4wp67XelXo9/Vx06dEjQOpqc5rbqYVy0jNV9Wy9B5ypN5KAKOJ005d+ys7JZYwigrrl39aNXkhdvZSWEwyuUZ6d5LXlvfrz/fBCFw4bHarblj/2/si+bmpqoQPNpBOtRkZxQYPhmVI+a517Oycmh0kDWrJNK9ueyGqprRpkEj/SzEZeHxW0FYSe35HNqLMENV1XnQQNrI0j9Kw1w/uzrtUZfvUaTPQRTuO8avjnkp84alK0qNzY2ypZ0TVB5dSGGQsV9gYOJIPDrYMm+Ui3z01okU+Tthvsdo6ivkoi+0SgE4zjDRupC8+Ed2iRaZn/RJAFLYVnN4n414YoFvPhU5bfW0DWjOiETD+I2w92O1OvwL4++UdYKJ/KQ+uWjuCfEmncOaiqRESwpK+LQhGJqcEpLrBDdz8L9b+fDIFYPHHIE/MaDGYpN3rBiAvVWOnz48GkPlPpCEAylFxXqpVZ55FylfouQTK4JKlLcXF8Ee7dcmvKLWd+E1dMvxuVbsHLq3wiNf/wHCLZv6vMaaec+i3arC6xCsrKZ5NGvNDw2/tLZsizzPp/vtNikSjDFWD2yHtegOlcjmnlaG8GOd2HvG5emvnTlramvL/hPeLfUSxWwQQ3sU+ZuQPrlwkpYd9n98JfPCtAu8ZleixfntE25Zyx6ukWtR2TiQ1H2G+4flTGlpaVFCIfDXKQZpRKM46YbvqmtQW/pEtl70ZqgijJfH/wHWHfp3VrDeFlLSQpQLVk0YGkIfvry2j/vgZa/3B7tsv4L592Enm5KzjurIiIjBhxnrCYdrtlpaWnUw1z3hzFoEkwxlmC+erI5IrvIWhT4VFJLlop/2oUvqJ4Zq6uBxNLJ1IUGLPkAg2csXfDy/N+xXkBmcKexERaoajLxDX4lVGm4nxfH4/3q7lHevZvl3hv5fGSlFbY89DmyMlKCWQ94w9LaGr497sOlXlC/I+tqhksnjoj0mmb6AxYpwfX7Esbbuc30+hxQBICR68wRVkJi1UyvcXYFlw7Xl0zEDSEyR4wHl2gsvSBMsUeyvxRUDwr1u7Yk8Ia1vTCvuaGhgUhE5KKiLUSwcIyFWxTgefOyCryD2rowJ6RZQDjxYOJwPW86SWuutrY2QoJxnMfwZCnEhuTp6ekKqgcZCWbpvoxUCaigoIARrN/tVaRQSwxncfn5+XqP7sQGJxsb+oI7HXqaqDKIKO4wBmnwnYNdNeRg1TrMWr1JgqJJK7oRcXxP0WN6SA7V4X3kKFmgurraIveRM36gHClMWqPGAxRK7F6iBEOCGUGRfFTQBKxPrkjE9z0VxTxuGQrU031EJyS9soqKNBtJ5tHBUCgUYYMBP9HoXMHfSiqSGbKoOuzcr2jgTWp3ELqaD9Lq1KlTimXuoywbSzBeyFAPy92mgPmwOewnByK7IeiNtglmBrWs6F1mh10Htn4C2n2srKwES0DhvYb70VUxevRorrGxMdIPxnmMzpW+PngMXRSAISLKoAAbJuCEEtNj4a4dgU9fbYXTndWJD95sUCOkt7e304Y+oIkiwXhBQReF/sqWYEZQK26bSi9o+HO5nomizWNIBjD1iAManWAmRv7bJcwGoxikZX1gZwNSjQr3nOlxKrGgVX7EV7I2j8EaEoycrUbg+fG0yszMBHS20iZnKsG00kwMFveB9R+U3kR108yyXim9p6cZBbk/wjfddFPSlFjAoDcfDAY1N4UJyG9jzx4yAOXsU8voqI1XqV/AT49p5a1YJkYSPaSMWIcOHaJtPmrwVcsrt4b3eSBA3eUoZz9aP/Kuk2vhpXkbtBnwLMUn2drooGACtDnZthjtRPTi0yqZHK3moLx9uY/UaupHvn4uK4qMoylSiazyY7KZGD6fj6MFNxVTgpENRgYqMRHFXZwhFAtA7SxHHX0Lop6nti9khfnwvumB8+Bg9MFOELDvzJtFxoNXL6URAUcZikk7iiRj3h3DbKO2r4t1coFq1OvtC61JLrUCU2/I0jFtcKh/Z85UgoUkmZ3k9XqTU3ItOXAL2lobccs8zoijReHEF3dLFYv0zF+WAQs9jVeTrH4HB1oFAB04ijQrzZP+Nxnp6eng8XiST4KRMc/zb0WdfEtNKL7YPs+95V6aN6ob9IxcmlFvYXKZZI/ILIeQCSTdyCdHq9fw5LRzx6ORTznWyTWCpMYTMlcW9ZxAx2b48NlrHB+srNfsLTYZBMMjRDDrty80zR7pns1Obgo2OBSBU3yGXgjBlU5J/DTk1HJ7rA/W1SRKk3uC7+vi1Fe/u4FUQadWZTsvLy9ALXT6naiYqBAw+mP0LeVQXcQrOgM9+YpJ+uuojCkUiyRyFRYWguVBajEaucje+rpmAfm4NDsjNHbsWDLm/XiP9L6YyWGvyryxBAsF9InJugSnhEMTgqmTFZiT1fLZFDQqkqDE9DiVDz3w5jw05qvIx4WSnTX+ampqCqA61A36ZILxNMeQvy4ixKi5KcySx0TXVPRG05b1PfnR44rHHLVbF8KOp9kUPpRewZSUFJJcRK4kbRfNeYz2Cv7mei081n1PUIJJxumvvDgevdEsgV/P7bEkovUEYJJr+4LQf5eSbUFSiqSVv6GhgYx5KXl7kRtn4Ig171H27mlp9nwf89woiZ/r6uqysBQzb3KPPq4iClrjpqQ3uQfNgQrJGtlgmSRG0l5uDez5lZ4FLRcXF+uefIKJHTZx9iw6R0u9sB7BKDPCtMl91w6yuUDzcaG5QOTSG08kb2yWEzyG+8MhNveApjniSiktLWW7tdoUJt0c3GlT0aDltVik9cCZdJMjBHy7NYOVKgsFaaRIcUVI9sC/UZ1WglYoh+d5/QFk5oMWKjKZhiQ4p2r1BqxXrY+g8NNNv1XquMc7Htz9fbyhynFkIq255bXkK4N+g5MeVZ65aLsl4pJmhXI6fXRj5JaWltOyb1SCUUELztH7TaLzcph1bybs/iWNmiwoxchYNflaPNqgZIf2nAtxIyxnI7lEar2T0M5Y1kPUOPAvNh8+6B49mpVahYjvp6pIU0OfKllcS/UGrFEZ5kz0r9Bv/PC3UhE6N5KLHujEfVDN6pjgaDu8+YEaJJcybtw4WethxRBRo1UxLPAqpU+cT+dh8JKLpQGlDQOEukg9OEHVGImsCYwnGEuBWlpRJSYqIoMP0hkSjMApJtPBU+aToY8ONMGeXRQnFIWjuC4kPEwadbSfegfIolUNfAMVSZBl4xpXPD/e/+0nPaFQyJpqcoigDZYSF6xRBxiqSEf97t3UAdnn8/UqlHP6l156cC9Kst4X6Wp5Fp6f8zNQu3yELZSlyU2ePNlRW1tLMTGHXgUHoWguCv21nkLea1sDyxw48/UZ54VzcnL8jY2NXZCIXYKX7y8CReg9D5QadayeOQ/USAd9twBExGbPkEhmhfZTqOERSTCqv2mp0SSSi8jAZv+IohhARyGrakhlNCnuSPtpH253l9DU92tBb3a+9j59CWVkZAToPbSmfdnZ2UEkV+LOLpKFuwz3B1mjDnZGXl6eXm61G2eqvErDi5C74u4tV4DlGgsAVW6UUIqxHkwo4jtbW1tJ5LAFBzZsfc4559C6U9+vL2PGjOnepnPofI/H04nXa6dr6dek40gwqpxIztrEI1gU9Qh/3bsZ/8oYSpPdbncvF0xvabTs4BHDYCaqycxXbnwGHWl0w0JgHY82uwdUZtxkell3lmbEayVi3Q3izpkCPmKfYnQ8IbDsQIVhDQ5ZqoPV0y8DVWp1actpqUsGHW/lV8AI7owf+KfdkaX1o7GUFANVkulP35lL5MhIidjudb5mm5rtS0xyMfDGo8e2xl9GlkcAg3kIvYnCtRi3z+W4DP+F11+BMTmrqUkb0RAtnenwzh1ai22jKtwMvYnCejSbBL/Tc38APXaYXU4gGaDwxj3cqdXOuz+jPDl9up5hIoCxJJKlUsP9gmM23PMbKxr7NoygNmc1NO75zkbWqwnDQ4xcOIAxtMmNSbJ6RqXpfMns85dCT+cKW4pZG8bSC417d8Wtm3X7C0fNkllPATMpRG80tsXIZXHvW1dC4sfVbEQDc01wxrFH3/F1nZ2drAZHbm5uGH2Jpo5jczUX/MvPzaWYx5ZilodoXL2R5ins/fU7JL3Q9xU+fvx41D5W5gR77rpT+L6fGx4jW+zet2joaksxK4LZXibSq6tlM3z6aivNHkKfqN7HydQnGt1Q51rL+pBiDtS/ouUaoCc71KIvvUHS68v3ybhXMASmjxyjxlWjE4y5LKJIsaJdD6L+FSP7A9pIcETze3W1bIIdT7NZVg6HgwjWZ0SnT2JkcJy5FHNlLIWrH88BW1VaA2pTiWLDYzhyTP3V9WvJ9kLpJTU1NVFxvT7nhfZJMN/KaS3AKSsMD1Iz8JmLluEWZWzaBn+iQ20q4TE8hiNHSj0i2wsD+KH8/Hw5lrStmAhBNha3vGanaUbjycM3QfnN74OaqpKks50THKphv9PwGEqvlF/MugxdE3rDVgpq02/dJ8Fisp0YU8PBFaYnZHtegPnFY3HLNvgTEarPa6Pp8QPbF2rSSsrJyTENCxkhduN8Tf5OkMLrDY9x/AS48IYncUs3+G2SJRKiqUZ/W3nqx6uo5r+SlZUVamxs1Ccgx4T+jP6U9HBnCa69hkedKffDo1UPg2qP2QRLFLC6aCb9llA1Or7c8e+gSqtQc3MzK1XVn5T5/hKBgx9XXwWi6wPjw4oPjuyaA5vu/zNYKynRmmCjRnGv6fzQ5qNF8PIN5PfSK2ezXubQj981HknDwxP7ykAQf2R4VJHr4It3ZsF/LT0ByVyFZiRj2V76VTysLpqpamzdkFp+TbHWzEs37PXiLzEjHgepDJ2HKZ3Ha3iU7LFvfodY7ygsLLQdsCMRishpsUaP4XFKhS67nJErLS2N1UXD3zKuytnx2kqc6+H3JgVG5X5qKl7DgRdxYPA4GoSBJO10MTKhFm8pQZaZOVR9sH/rtfBuaR2RCz32wVOnTpFqjMvkiVfCKMuzq77iQXra9AzR9QA8/oenkFyOs/gcGwOJvshF6Ghch+SicJAsCEIYyaXPc4xLSJztaE+AJZ+VAe98yPSMQNeSye/e9TzGLG2jfzjx5Of0twjkKE1UO06ugfVzWTiI5n7m5uYGjh8/zsqFQpw4W8kiw+q/fxQN+/81PcM1anXtteWLcUu0i6cME5bX0PymxVHJFQ5UIbnW0SaSiwWykVx6udC4MRD+Kg7ufCkHzp1D9thEs5P4YOsP5XWX/wp6ZqDYGAosZ4UHF6PuMPfUUxrOByuvheo3KKlBn63eb5eEEQZCoijw2v2N0OK9BoOWR81Okp3p/4Y2GfVbtIPiQwVSi5xS1Ce59m9dqJGLzW+cMmUKlWgfEBeTAAOEwm+EfbXKuf8Do7JvNh1ZCo5r4LJ7eajasAtsKTa4IINe4UqQIv9qeo7aYGJB6q61x1wul5SSkkJtcfyLFi0Kl5aWDsjvM9CSRIAffZAPKTnvoT8sw/SscOBn6MKg4HkStrwbAiytod91Hf665h16qXG995MFsPkB0qESZaj6fL5IZ+qADMgGmmCscQP84H++BVnj341KMkn6LXScegxevOorrWaDPcI8WxRR71TIArdjK0Rrooq+LtH7ycKwSi69FaEfnakD3tBrsGwhEUmWD1kTNkUz/PFrHIWWv15Tklv1lVZ4xCZZvFjGyHU+BlA+BDMPPYG89Ec+/j5seYj8Fszm0t0RWvtnGEgMFsHU0ueL35wE4/5uR1SSUYBckVbAqhk0DzO5mxzEC9XH9Qhr6BW9iWodGvSFqbvW1Gk9hfTuJbQMyr0ftNEcy4LlOMH5gzcnBbP6Ihl7w6vQ2boC1s8+DDbJYkO3SnSi/ypKUwmCRi4KAY0ePVqiKf9k0NfX17Pc+sEyUQbVXaCTLOXW53I6J129CXjhij7ecBRCXffCuksoym+rzGhYSi4IuAr/kG/RE/VccqJWrrsn9YttPq1Db2TfpUHVGkPhj2LqEp8WR/0/bn0KnCnL+3wHSbNAVymUXXIEbJKdDlVqZYLLURx1lKijJ+2GXunkYsHrwZRcOobS4Sl4PB6H99ZND4Nj1JNRR5gEkmaytKIkdVtFcXGxbLHSsPEhVluLgCNFvuPkOvmFq8vxlaKpRd1Dr0+YHfSHdyhjg9LixYuDsO7SMqj7v9ksMTEayGYTxF+WdC04zD3x2dWQzBkZpA6XfV6AscSdrGF93+SqgwPbr9HIRSow7Ha7/ZMnT9b9XEOWCDocYoHLz88Xq6urXfD4nlXgcD8Q07uSUW2qdlYB/qH0moKY3uNvK4eql9ZQ/QjQyJWTk0MVrvWsiCF1bA85wTTDnzYpTOWAh3fdBaPSl7NM2NiusB2f0OeVVdN3WlZtxkMslFrCiS8e1XpcgqYSdWM+pPm4hvzBHNZfiNJ3Xn/9dcehi38yCc6b/CCIKffH/m5lP8jK87B6WgVYQaLpxrtTKACela0siPm9KLVcKLUCn77ahq+ktLQ0qa2tjdXrh2FuojrsIoBIhgtJMycsePECmDTnt7FLMwJ161U+grBUCmumH4FEQ7e04ueiXVrUrw5w6H4QGv+0Tnrl9k+0PWyUeO655wazsrLCCxcupKD1sLp7RoqOYTFMNsr0ep3wUOUdkJq9tH9EI6BU47gKkIVtsOpCL4xUqGEdDz5Td+H/XAD9kVYEypv31RfDyzdQEwRFy0BlkzMmTZoUPHToUHgoXBCxYKQZMfT/iOgzE9HD7ISi3cvBlXpb/4lGQLIBV4lG3zZobdkPL1EpqmGCrv7crN/iLfgsfdew2UVfoAyIrpZy1+4N5YE9/+GLIBbFEykDVR8hjpgMlZFqJQs4pBZqa2sdzttevCA4bvr3wDn6NowEjIf4UYkL2m1yJYi8F56Zug8GCz3zDgtwA0nF2hAXQLxAYvGB1nJ5d/mGlJo327QiJNS+JeRyuUJjxowJaXVSR1wsdyQPw9TUH7UUgei++vEx/m9edxOkjXsiPol2BhRoAR7tN5nmd8r7cUzbDGF07vJcCyhhL/v0lTO9vd6nk4cgOzKBkz1olGdqRMpgZb9lxTMg3XQ1iQUosQAlFvR0GNE98nrO/Iid4JwI43xeW0T054joz3HAAx98D220RazKohVBscOGP66F175XpbUElHFkKOPIUG/ZEoIozQ9GEhLFkcRpC7V2FtCIdaB6EFsKij0wYcYN4M6+7yzV5/BDlupZiUqUVim1b7WSga4Ri1wOzM6CHmmVMBNnEtFTqUs0AXRnLb2+Y+N0OOdClGru2RhimgqJACl0EIPRO6ClvoqklbY3Ug3qqjBcWFio98JOqBTzRHaFM4mGYScew056zX62dty6emLonOlzICVrPoiuKSNGupFNFercwYe6auQvP3hX6/XDjlBLYvS866EdCVVjGF02uqRK2ERMK8RadPXJaSPPbqKlp6fzra2tPNxWPg0yJkyFURlTkH4XAS8S6dJhMEFkUuRjEO6sgs62g3D0kyqq0KzZVN2tAfF/lPF/jFR9Z5IqoaMUVgvmcRELU6Pjxo0TGhoahIyMDMHn82nVFzkeLl2cAX83H0mXPgFcKXlIvAkgOFVJxzvyaM4XkjDP8FPIXiIosg+kIG4rLRAK1EOw6xjIXT6o21dLmaOR70AJBZqE0onDZlRRG2L0+VmKVJGwcpJVN9k0NarOE9BsOAyl8M3NzYxwaEhzaEjzEe+DiAbx3fdIc2waNX9XtBx3vQsuW/C6gNfV7anI5qZyQUGBVFlZKUdcx06sTHAwqTZ37lxSnyKSjgYHLlxG4ZKCSyraPqNxnYZLOo5SyY+VRQuqsWyUgFn6a32b1tp5lDyZnp2dTWp3tLbQNd3aZzihp7eTXcM2SaCr0W51CioJRI2EOgFd6BqhtU6WyIWI45oyZYpTJy5dB0d83ZISkpxM9pMUHbqajWwID3C6OrNVWxT8P5gjuFXwe1HZAAAAAElFTkSuQmCC\"","module.exports = __webpack_public_path__ + \"static/media/twoWomen.0e368eff.jpg\";","module.exports = __webpack_public_path__ + \"static/media/woman.4d988ca2.jpg\";","module.exports = __webpack_public_path__ + \"static/media/UserNotFound.a6fb0e98.svg\";","module.exports = __webpack_public_path__ + \"static/media/loginBackgroundImage.062ec7c6.svg\";","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../../logging/src';\r\nimport {\r\n EntityPreferences,\r\n EntityType,\r\n getAppStore,\r\n getEntity,\r\n NotificationType,\r\n onLoadingChanged,\r\n onNotificationChanged,\r\n showErrorToastNotification,\r\n} from '../../../../../../@data';\r\nimport messages from '../../SettingsPage.messages';\r\nimport { onFetchPublisherPreferences } from '../actions/onSettingsPageChanged';\r\nimport { onSettingsChanged, saveRawSettings } from '../mutatorActions/settingsPageChanged';\r\nimport { INotificationPreferences, ISettingsViewModel } from '../store/schema/ISettingsViewModel';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onFetchPublisherPreferences, async () => {\r\n Log.debug('Fetching publisher preferences');\r\n const { publisher, userContext } = getAppStore();\r\n\r\n if (publisher && userContext) {\r\n try {\r\n onLoadingChanged(true);\r\n\r\n const raw = await getEntity([publisher], userContext, EntityPreferences);\r\n\r\n const notificationPreferences: INotificationPreferences = {\r\n billingAlerts: true,\r\n servingStatus: true,\r\n profileReview: true,\r\n invitedUsers: true,\r\n };\r\n\r\n if (raw.notificationPreferences) {\r\n raw.notificationPreferences.notifications.forEach((np) => {\r\n switch ((NotificationType[np.type] as unknown) as NotificationType) {\r\n case NotificationType.BillingAlert:\r\n notificationPreferences.billingAlerts = np.enabled;\r\n break;\r\n case NotificationType.ServingStatus:\r\n notificationPreferences.servingStatus = np.enabled;\r\n break;\r\n case NotificationType.ProfileReview:\r\n notificationPreferences.profileReview = np.enabled;\r\n break;\r\n case NotificationType.InvitedUser:\r\n notificationPreferences.invitedUsers = np.enabled;\r\n break;\r\n }\r\n });\r\n }\r\n\r\n const settings = getStore().active;\r\n\r\n const viewModel: ISettingsViewModel = {\r\n entityType: EntityType.Publisher,\r\n systemPreferences: settings.systemPreferences,\r\n notificationPreferences: notificationPreferences,\r\n };\r\n\r\n onSettingsChanged(viewModel);\r\n saveRawSettings(raw);\r\n } catch (e) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.publisherPreferencesFailed });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n textMessageDescriptor: messages.invalidStateLoginOrReport,\r\n });\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../../logging/src';\r\nimport {\r\n EntityPreferences,\r\n EntityType,\r\n getAppStore,\r\n getEntity,\r\n isLocalRetrieved,\r\n NotificationType,\r\n onLoadingChanged,\r\n onNotificationChanged,\r\n showErrorToastNotification,\r\n User,\r\n} from '../../../../../../@data';\r\nimport { onFetchTnC } from '../../../../../terms-and-conditions/@data/actions';\r\nimport { TNC_PRE_SIGNATURE_FLAG } from '../../../../../terms-and-conditions/useTnC';\r\nimport messages from '../../SettingsPage.messages';\r\nimport { hasAccessToNotifications } from '../../utils/roleDifferentiationUtils';\r\nimport { onFetchUserPreferences } from '../actions/onSettingsPageChanged';\r\nimport { onSettingsChanged, saveRawSettings } from '../mutatorActions/settingsPageChanged';\r\nimport { INotificationPreferences, ISettingsViewModel } from '../store/schema/ISettingsViewModel';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(onFetchUserPreferences, async (msg) => {\r\n Log.debug('fetching user preferences');\r\n const { publisher, userContext } = getAppStore();\r\n\r\n if (publisher && userContext) {\r\n try {\r\n onLoadingChanged(true);\r\n const user = new User(userContext.id);\r\n\r\n const userPreferences = await getEntity([publisher, user], userContext, EntityPreferences);\r\n const tnc = userPreferences.tncSignatureStatus;\r\n\r\n const notificationPreferences: INotificationPreferences = {};\r\n\r\n userPreferences.notificationPreferences.notifications.forEach((np) => {\r\n switch ((NotificationType[np.type as NotificationType] as unknown) as NotificationType) {\r\n case NotificationType.BillingAlert:\r\n notificationPreferences.billingAlerts = np.enabled;\r\n break;\r\n case NotificationType.ServingStatus:\r\n notificationPreferences.servingStatus = np.enabled;\r\n break;\r\n case NotificationType.ProfileReview:\r\n notificationPreferences.profileReview = np.enabled;\r\n break;\r\n case NotificationType.InvitedUser:\r\n notificationPreferences.invitedUsers = np.enabled;\r\n break;\r\n }\r\n });\r\n\r\n if (!tnc?.isLatestAccepted) {\r\n isLocalRetrieved() && onFetchTnC(msg.locale);\r\n }\r\n\r\n /** In case user level preference doesn't exist, inherit value from publisher preferences\r\n * If publisher level preference is true, we inherit the value,\r\n * if false, user level setting is undefined, so that user can't override it.\r\n */\r\n if (hasAccessToNotifications()) {\r\n const publisherPreferences = await getEntity([publisher], userContext, EntityPreferences);\r\n publisherPreferences.notificationPreferences.notifications.forEach((np) => {\r\n if (np.enabled) {\r\n if (\r\n (NotificationType[np.type] as unknown) === NotificationType.BillingAlert &&\r\n notificationPreferences.billingAlerts === undefined\r\n ) {\r\n notificationPreferences.billingAlerts = np.enabled;\r\n } else if (\r\n (NotificationType[np.type] as unknown) === NotificationType.ServingStatus &&\r\n notificationPreferences.servingStatus === undefined\r\n ) {\r\n notificationPreferences.servingStatus = np.enabled;\r\n } else if (\r\n (NotificationType[np.type] as unknown) === NotificationType.ProfileReview &&\r\n notificationPreferences.profileReview === undefined\r\n ) {\r\n notificationPreferences.profileReview = np.enabled;\r\n } else if (\r\n (NotificationType[np.type] as unknown) === NotificationType.InvitedUser &&\r\n notificationPreferences.invitedUsers === undefined\r\n ) {\r\n notificationPreferences.invitedUsers = np.enabled;\r\n }\r\n }\r\n });\r\n }\r\n\r\n const settings = getStore().active;\r\n\r\n const viewModel: ISettingsViewModel = {\r\n entityType: EntityType.User,\r\n systemPreferences: settings.systemPreferences,\r\n notificationPreferences: notificationPreferences,\r\n tncSignatureStatus: userPreferences.tncSignatureStatus,\r\n };\r\n\r\n onSettingsChanged(viewModel);\r\n saveRawSettings(userPreferences);\r\n } catch (e) {\r\n /**\r\n * this is a workaround to hide user preference call failures, the endpoint\r\n * is expected to return failures when user just signed up within the first\r\n * few minutes\r\n */\r\n !window?.localStorage.getItem(TNC_PRE_SIGNATURE_FLAG) &&\r\n showErrorToastNotification({ textMessageDescriptor: messages.userPreferencesFailed });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n textMessageDescriptor: messages.invalidStateLoginOrReport,\r\n });\r\n }\r\n});\r\n","import { getEntityAccessPermissions } from '../../../../../@data';\r\nimport { UserRoleEntity } from '../../../../../@data/services/UserRoleService';\r\nimport { UserSettings } from '../../../../../@data/store/schema/userrolemodels/UserSettings';\r\n\r\nexport function hasAccessToNotifications() {\r\n const userSettingsPermissions = getEntityAccessPermissions(UserRoleEntity.UserSettings) as UserSettings | null;\r\n if (!userSettingsPermissions) {\r\n return true; // completeAccess\r\n }\r\n\r\n const { billingAlerts, servingStatus, profileReview, invitedUsers } = userSettingsPermissions;\r\n return billingAlerts || servingStatus || profileReview || invitedUsers;\r\n}\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { deleteEntity, getAppStore, onAuthLogout, onNotificationChanged, showSuccessToastNotification } from '../../../../../../@data';\r\nimport messages from '../../SettingsPage.messages';\r\nimport { onPublisherDeleted } from '../actions/onPublisherDeleted';\r\n\r\norchestrator(onPublisherDeleted, async () => {\r\n const { publisher, userContext } = getAppStore();\r\n if (userContext && publisher) {\r\n try {\r\n await deleteEntity([publisher], undefined, userContext);\r\n\r\n showSuccessToastNotification({ textMessageDescriptor: messages.deletedPublisherSuccess });\r\n onAuthLogout();\r\n } catch (e) {\r\n onNotificationChanged({\r\n text: `Deleting the publisher caught an error \"${e}\"`,\r\n messageBarType: MessageBarType.error,\r\n });\r\n }\r\n } else {\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n textMessageDescriptor: messages.invalidStateLoginOrReport,\r\n });\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { deepClone } from '../../../../../../utils';\r\nimport {\r\n onUpdateNotificationPreferences,\r\n toggleBillingAlerts,\r\n toggleInvitedUsers,\r\n toggleProfileReview,\r\n toggleServingStatus,\r\n} from '../actions/onNotificationPreferencesChanged';\r\nimport { getStore } from '../store/store';\r\n\r\norchestrator(toggleBillingAlerts, ({ entityType, checked }) => {\r\n const { notificationPreferences } = getStore().active;\r\n const np = deepClone(notificationPreferences);\r\n np.billingAlerts = checked;\r\n onUpdateNotificationPreferences(entityType, np);\r\n});\r\n\r\norchestrator(toggleServingStatus, ({ entityType, checked }) => {\r\n const { notificationPreferences } = getStore().active;\r\n const np = deepClone(notificationPreferences);\r\n np.servingStatus = checked;\r\n onUpdateNotificationPreferences(entityType, np);\r\n});\r\n\r\norchestrator(toggleProfileReview, ({ entityType, checked }) => {\r\n const { notificationPreferences } = getStore().active;\r\n const np = deepClone(notificationPreferences);\r\n np.profileReview = checked;\r\n onUpdateNotificationPreferences(entityType, np);\r\n});\r\n\r\norchestrator(toggleInvitedUsers, ({ entityType, checked }) => {\r\n const { notificationPreferences } = getStore().active;\r\n const np = deepClone(notificationPreferences);\r\n np.invitedUsers = checked;\r\n onUpdateNotificationPreferences(entityType, np);\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../../logging/src';\r\nimport {\r\n EntityType,\r\n getAppStore,\r\n NotificationPreference,\r\n NotificationPreferencesUpdate,\r\n NotificationType,\r\n onLoadingChanged,\r\n onNotificationChanged,\r\n patchEntity,\r\n showErrorToastNotification,\r\n showSuccessToastNotification,\r\n User,\r\n} from '../../../../../../@data';\r\nimport messages from '../../SettingsPage.messages';\r\nimport { onUpdateNotificationPreferences } from '../actions/onNotificationPreferencesChanged';\r\nimport { setNotificationPreferences } from '../mutatorActions';\r\n\r\norchestrator(onUpdateNotificationPreferences, async ({ entityType, np }) => {\r\n Log.debug('Updating notification preferences');\r\n const { publisher, userContext } = getAppStore();\r\n\r\n if (publisher && userContext) {\r\n const notifications: NotificationPreference[] = [];\r\n\r\n if (np.billingAlerts !== undefined) {\r\n notifications.push({ type: NotificationType.BillingAlert, enabled: np.billingAlerts });\r\n }\r\n if (np.servingStatus !== undefined) {\r\n notifications.push({ type: NotificationType.ServingStatus, enabled: np.servingStatus });\r\n }\r\n if (np.profileReview !== undefined) {\r\n notifications.push({ type: NotificationType.ProfileReview, enabled: np.profileReview });\r\n }\r\n if (np.invitedUsers !== undefined) {\r\n notifications.push({ type: NotificationType.InvitedUser, enabled: np.invitedUsers });\r\n }\r\n\r\n const notificationPreferencesUpdate: NotificationPreferencesUpdate = new NotificationPreferencesUpdate();\r\n notificationPreferencesUpdate.notificationPreferences = {\r\n notifications: notifications,\r\n };\r\n\r\n try {\r\n onLoadingChanged(true);\r\n const pathModels = [publisher];\r\n\r\n if (entityType === EntityType.User) {\r\n const user = new User(userContext.id);\r\n pathModels.push(user);\r\n }\r\n await patchEntity(pathModels, NotificationPreferencesUpdate, notificationPreferencesUpdate, userContext);\r\n\r\n setNotificationPreferences(np);\r\n\r\n showSuccessToastNotification({ textMessageDescriptor: messages.updatedNotificationPreferencesSuccessfully });\r\n } catch (e) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.notificationPreferencesFailed });\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n textMessageDescriptor: messages.invalidStateLoginOrReport,\r\n });\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../../logging/src';\r\nimport {\r\n UserUpdateLanguage,\r\n getAppStore,\r\n onLoadingChanged,\r\n onNotificationChanged,\r\n patchEntity,\r\n showErrorToastNotification,\r\n} from '../../../../../../@data';\r\nimport { LOCAL_STORAGE_LOCALE } from '../../../../../../constants';\r\nimport { onFetchTnC } from '../../../../../terms-and-conditions/@data';\r\nimport { getPrimaryUserRawData } from '../../../../Profile/@data';\r\nimport { setPrimaryUserDetailsETagAction } from '../../../../Profile/@data/actions';\r\nimport messages from '../../components/SystemConfiguration/SystemConfiguration.messages';\r\nimport { onUpdateUserLanguage } from '../actions';\r\nimport { onLanguageChanged } from '../mutatorActions';\r\n\r\norchestrator(onUpdateUserLanguage, async (msg) => {\r\n Log.debug('Updating user language');\r\n const { publisher, userContext } = getAppStore();\r\n const user = getPrimaryUserRawData();\r\n\r\n if (publisher && userContext && user && user.language) {\r\n try {\r\n onLoadingChanged(true);\r\n const updatedUserLanguage: UserUpdateLanguage = new UserUpdateLanguage();\r\n updatedUserLanguage.language = msg.locale;\r\n updatedUserLanguage.userId = user.id;\r\n updatedUserLanguage.eTag = user.eTag;\r\n\r\n const updateUserResp = await patchEntity([publisher, user], UserUpdateLanguage, updatedUserLanguage, userContext);\r\n if (updateUserResp.eTag) {\r\n setPrimaryUserDetailsETagAction(updateUserResp.eTag);\r\n }\r\n\r\n onLanguageChanged(msg.locale, LOCAL_STORAGE_LOCALE);\r\n onFetchTnC(msg.locale);\r\n\r\n const element = document.getElementById('apex_platform_chrome');\r\n element?.remove();\r\n\r\n msg?.closePanel?.();\r\n msg?.setFormChanged?.(false);\r\n } catch (error) {\r\n showErrorToastNotification({ textMessageDescriptor: messages.updateLanguageFailed });\r\n Log.error(error);\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n } else {\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n textMessageDescriptor: messages.invalidStateReLoginOrReport,\r\n });\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport {\r\n deleteEntity,\r\n getAppStore,\r\n NotificationLabel,\r\n NotificationSeverity,\r\n onAuthLogout,\r\n onNotificationCardAdded,\r\n onNotificationChanged,\r\n showErrorToastNotification,\r\n showSuccessToastNotification,\r\n User,\r\n} from '../../../../../../@data';\r\nimport notificationMessages from '../../../../../../NotificationsPanel.Types.messages';\r\nimport messages from '../../SettingsPage.messages';\r\nimport { onUserSelfDeleted } from '../actions/onUserSelfDeleted';\r\n\r\norchestrator(onUserSelfDeleted, async () => {\r\n const { publisher, userContext } = getAppStore();\r\n\r\n if (userContext && publisher) {\r\n try {\r\n const user = new User(userContext.id);\r\n\r\n await deleteEntity([publisher, user], undefined, userContext);\r\n\r\n showSuccessToastNotification({ textMessageDescriptor: messages.deletingUserSuccess, intlMessageValues: { name: userContext.name } });\r\n\r\n onAuthLogout();\r\n } catch (e) {\r\n showErrorToastNotification({ textMessageDescriptor: notificationMessages.DeletingUserWentWrongContent });\r\n onNotificationCardAdded({\r\n // tslint:disable-next-line: no-any\r\n severity: NotificationSeverity.Error,\r\n titleMessageDescriptor: notificationMessages.DeletingUserWentWrongTitle,\r\n contentMessageDescriptor: notificationMessages.DeletingUserWentWrongContent,\r\n notificationLabel: NotificationLabel.DeletingUserWentWrong,\r\n });\r\n }\r\n } else {\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n textMessageDescriptor: messages.invalidStateLoginOrReport,\r\n });\r\n }\r\n});\r\n","import { MessageBarType } from '@fluentui/react';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../../../../logging/src';\r\nimport { getAppStore, onNotificationChanged, postEntity } from '../../../../../../../../@data';\r\nimport { onPopupOpenChanged, showErrorToastNotification, showSuccessToastNotification } from '../../../../../../../../@data/mutatorActions';\r\nimport { AdSenseOAuthStatus } from '../../../../../../../../@data/store/schema/enums/AdSenseOAuthStatus';\r\nimport { PopupType } from '../../../../../../../../@data/store/schema/enums/PopupType';\r\nimport { AdSenseMediationOptIn } from '../../../../../../../../@data/store/schema/models/AdSenseMediation';\r\nimport { fetchAccountById } from '../../../../../../../partner-management/Account/@data/services/AccountService';\r\nimport { googleConnectorMessages } from '../../GoogleConnector.messages';\r\nimport { onConnectGoogleAccount } from '../actions';\r\nimport { NOTIFICATION_FAILED_WITH_REASON_ERROR_CODE } from '../constants';\r\nimport { onChangeConnection } from '../mutatorActions';\r\n\r\norchestrator(onConnectGoogleAccount, async ({ code }) => {\r\n const { publisher, account, userContext } = getAppStore();\r\n\r\n try {\r\n if (publisher && account && userContext) {\r\n const urlParams = new URLSearchParams();\r\n const accountDetails = await fetchAccountById(publisher!, account?.id, userContext);\r\n urlParams.append(\r\n 'routeSuffix',\r\n `api/mediation/oauth/optIn?oneTimeAuthorizationCode=${code}¤cyCode=${accountDetails.currencyCode}`\r\n );\r\n const response = await postEntity([], AdSenseMediationOptIn, new AdSenseMediationOptIn(), undefined, urlParams, undefined);\r\n\r\n if (\r\n response &&\r\n response?.oAuthConnectionStatus &&\r\n AdSenseOAuthStatus[response?.oAuthConnectionStatus] === AdSenseOAuthStatus.Success\r\n ) {\r\n showSuccessToastNotification({ textMessageDescriptor: googleConnectorMessages.googleAccountConnectedSuccessfully });\r\n\r\n onChangeConnection({\r\n email: response?.email,\r\n isMediationEnabled: response?.mediationStatus,\r\n connectionStatus: AdSenseOAuthStatus[response?.oAuthConnectionStatus],\r\n connectedDate: response?.connectedTimeStamp,\r\n connectedImageSrc: response?.userImageUri,\r\n });\r\n } else if (response?.oAuthConnectionStatus && AdSenseOAuthStatus[response?.oAuthConnectionStatus] !== AdSenseOAuthStatus.Success) {\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n text: response.oauthFailureReasons?.[0].description || 'Connecting to your Google account failed.',\r\n id: NOTIFICATION_FAILED_WITH_REASON_ERROR_CODE,\r\n });\r\n onChangeConnection({\r\n email: response.email,\r\n isMediationEnabled: response.mediationStatus,\r\n connectionStatus: AdSenseOAuthStatus[response.oAuthConnectionStatus],\r\n connectedDate: response.connectedTimeStamp,\r\n connectionStatusTip: response.oauthFailureReasons?.[0].description,\r\n actionItems: response.oauthFailureReasons,\r\n });\r\n } else {\r\n onNotificationChanged({\r\n messageBarType: MessageBarType.error,\r\n text: response.oauthFailureReasons?.[0].description || 'Connecting to your Google account failed.',\r\n });\r\n onChangeConnection({\r\n connectionStatus: AdSenseOAuthStatus.None,\r\n });\r\n }\r\n }\r\n } catch (error) {\r\n showErrorToastNotification({ textMessageDescriptor: googleConnectorMessages.connectGoogleAccountFailed });\r\n Log.error(`Error while connecting google account ${error}`);\r\n } finally {\r\n onPopupOpenChanged(PopupType.None);\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../../../../logging/src';\r\nimport { deleteEntity, getAppStore, onLoadingChanged } from '../../../../../../../../@data';\r\nimport { showErrorToastNotification, showSuccessToastNotification } from '../../../../../../../../@data/mutatorActions';\r\nimport { AdSenseOAuthStatus } from '../../../../../../../../@data/store/schema/enums/AdSenseOAuthStatus';\r\nimport { AdSenseMediationOptOut } from '../../../../../../../../@data/store/schema/models/AdSenseMediation';\r\nimport { googleConnectorMessages } from '../../GoogleConnector.messages';\r\nimport { onDisconnectGoogleAccount } from '../actions';\r\nimport { onChangeConnection } from '../mutatorActions';\r\n\r\norchestrator(onDisconnectGoogleAccount, async () => {\r\n const { publisher, account } = getAppStore();\r\n\r\n onLoadingChanged(true);\r\n\r\n try {\r\n if (publisher && account) {\r\n const urlParams = new URLSearchParams();\r\n urlParams.append('routeSuffix', 'api/mediation/admanager/optOut');\r\n const response = (await deleteEntity([], AdSenseMediationOptOut, undefined, urlParams, undefined)) as AdSenseMediationOptOut;\r\n\r\n if (response && response?.mediationStatus === false) {\r\n onChangeConnection({\r\n connectionStatus: AdSenseOAuthStatus.None,\r\n });\r\n\r\n showSuccessToastNotification({ textMessageDescriptor: googleConnectorMessages.disconnectingGoogleAccountSuccess });\r\n } else {\r\n showErrorToastNotification({ textMessageDescriptor: googleConnectorMessages.disconnectingGoogleAccountFailed });\r\n }\r\n }\r\n } catch (error) {\r\n showErrorToastNotification({ textMessageDescriptor: googleConnectorMessages.disconnectGoogleAccountFailed });\r\n Log.error(`Error while initializing google account ${error}`);\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../../../../logging/src';\r\nimport { getAppStore, getEntity, onLoadingChanged, putEntity, showErrorToastNotification } from '../../../../../../../../@data';\r\nimport { AdSenseOAuthStatus } from '../../../../../../../../@data/store/schema/enums/AdSenseOAuthStatus';\r\nimport { AdSenseMediation, AdSenseMediationHealthCheck } from '../../../../../../../../@data/store/schema/models/AdSenseMediation';\r\nimport { googleConnectorMessages } from '../../GoogleConnector.messages';\r\nimport { onInitializeGoogleAccount } from '../actions';\r\nimport { onChangeConnection } from '../mutatorActions';\r\n\r\nexport const handleMediationResponse = (response: AdSenseMediation) => {\r\n if (response && response?.oAuthConnectionStatus && AdSenseOAuthStatus[response?.oAuthConnectionStatus] === AdSenseOAuthStatus.Success) {\r\n onChangeConnection({\r\n email: response?.email,\r\n isMediationEnabled: response?.mediationStatus,\r\n connectionStatus: AdSenseOAuthStatus[response?.oAuthConnectionStatus],\r\n connectedDate: response?.connectedTimeStamp,\r\n connectedImageSrc: response?.userImageUri,\r\n });\r\n } else if (\r\n response.oAuthConnectionStatus &&\r\n AdSenseOAuthStatus[response.oAuthConnectionStatus] !== AdSenseOAuthStatus.Success &&\r\n AdSenseOAuthStatus[response.oAuthConnectionStatus] !== AdSenseOAuthStatus.None\r\n ) {\r\n onChangeConnection({\r\n email: response.email,\r\n isMediationEnabled: response.mediationStatus,\r\n connectionStatus: AdSenseOAuthStatus[response.oAuthConnectionStatus],\r\n connectedDate: response.connectedTimeStamp,\r\n connectionStatusTip: response.oauthFailureReasons?.[0].description,\r\n actionItems: response.oauthFailureReasons,\r\n });\r\n } else {\r\n onChangeConnection({\r\n connectionStatus: AdSenseOAuthStatus.None,\r\n });\r\n }\r\n};\r\n\r\norchestrator(onInitializeGoogleAccount, async ({ showLoadingSpinner = true, showNotifications = true, onFinished = () => null }) => {\r\n const { publisher, account } = getAppStore();\r\n\r\n if (showLoadingSpinner) {\r\n onLoadingChanged(true);\r\n }\r\n\r\n if (publisher && account) {\r\n try {\r\n const urlParams = new URLSearchParams();\r\n urlParams.append('routeSuffix', 'api/mediation/oauth/getDetails');\r\n let response = await getEntity([], undefined, AdSenseMediation, urlParams, undefined);\r\n\r\n // perform health check if oAuthConnectionStatus is valid, endpoint will return same contract as getDetails response\r\n if (response && response.mediationStatus) {\r\n const healthCheckUrlParams = new URLSearchParams();\r\n healthCheckUrlParams.append('routeSuffix', 'api/mediation/admanager/healthCheck');\r\n const request: AdSenseMediationHealthCheck = {\r\n apiPath: 'preauth/mediation',\r\n className: 'oauth',\r\n };\r\n\r\n const healthCheckResponse = await putEntity([], request, undefined, AdSenseMediationHealthCheck, healthCheckUrlParams, undefined);\r\n response = healthCheckResponse;\r\n }\r\n // extract response logic handler and reuse it to handle GAM network selection response\r\n handleMediationResponse(response);\r\n } catch (error) {\r\n if (showNotifications) {\r\n showErrorToastNotification({ textMessageDescriptor: googleConnectorMessages.googleConnectorFailedToFetchAdSenseConnectionDetails });\r\n }\r\n Log.error(`Error while fetching google account ${error}`);\r\n onChangeConnection({\r\n connectionStatus: AdSenseOAuthStatus.None,\r\n });\r\n } finally {\r\n if (showLoadingSpinner) {\r\n onLoadingChanged(false);\r\n }\r\n onFinished();\r\n }\r\n } else {\r\n if (showNotifications) {\r\n showErrorToastNotification({ textMessageDescriptor: googleConnectorMessages.initializeGoogleAccountFailed });\r\n }\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../../../../../logging/src';\r\nimport { getAppStore, onLoadingChanged, putEntity, showErrorToastNotification } from '../../../../../../../../@data';\r\nimport { AdSenseMediationToggle } from '../../../../../../../../@data/store/schema/models/AdSenseMediation';\r\nimport { googleConnectorMessages } from '../../GoogleConnector.messages';\r\nimport { onMediateGoogleAccount } from '../actions';\r\nimport { onChangeMediationToggle } from '../mutatorActions';\r\n\r\norchestrator(onMediateGoogleAccount, async ({ mediate, formatMessage }) => {\r\n const { publisher, account } = getAppStore();\r\n\r\n onLoadingChanged(true);\r\n const operation = mediate ? 'Enabling' : 'Disabling';\r\n let errorToastNotification = mediate\r\n ? formatMessage(googleConnectorMessages.googleConnectorMediationOperationEnabling)\r\n : formatMessage(googleConnectorMessages.googleConnectorMediationOperationDisabling);\r\n\r\n errorToastNotification = errorToastNotification + formatMessage(googleConnectorMessages.googleConnectorMediationFailed);\r\n\r\n if (publisher && account) {\r\n try {\r\n const urlParams = new URLSearchParams();\r\n urlParams.append('routeSuffix', 'api/mediation/admanager/toggleMediation');\r\n const request: AdSenseMediationToggle = {\r\n apiPath: 'preauth/mediation',\r\n className: 'oauth',\r\n toggle: mediate,\r\n };\r\n\r\n const response = await putEntity([], request, undefined, AdSenseMediationToggle, urlParams, undefined);\r\n\r\n if (response && response?.mediationStatus === mediate) {\r\n onChangeMediationToggle(mediate);\r\n } else {\r\n onChangeMediationToggle(!mediate);\r\n showErrorToastNotification({ text: errorToastNotification });\r\n }\r\n } catch (error) {\r\n onChangeMediationToggle(!mediate);\r\n showErrorToastNotification({ text: errorToastNotification });\r\n Log.error(`Error while ${operation} adSense mediation: ${error}`);\r\n } finally {\r\n onLoadingChanged(false);\r\n }\r\n }\r\n});\r\n","import { classNamesFunction, getTheme } from '@fluentui/react';\r\nimport { IPubcenterPalette, IPubcenterSpacing } from '../theme';\r\nimport { IAppPageStyleProps, IAppPageStyles } from './App.types';\r\n\r\nexport const getStyles = (props: IAppPageStyleProps): IAppPageStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n\r\n return {\r\n skipButton: {\r\n left: '50%',\r\n padding: spacing.size16,\r\n zIndex: '1',\r\n position: 'absolute',\r\n transform: 'translateY(-100%)',\r\n transition: 'transform 0.3s',\r\n backgroundColor: palette.neutralLight,\r\n selectors: {\r\n '&:focus, &:hover': {\r\n transform: 'translateY(0%)',\r\n },\r\n },\r\n },\r\n };\r\n};\r\n\r\nconst classNames = classNamesFunction<IAppPageStyleProps, IAppPageStyles>();\r\n\r\nexport function getClassNames<PropType>(props?: PropType) {\r\n return classNames(getStyles, { theme: getTheme(), ...props });\r\n}\r\n","import { Log } from '../../../logging/src';\r\nimport { UnauthorizedInternalUserPageRoute } from '../../Routes';\r\n\r\nexport const PubCenterUserRoles = [41, 42, 43, 49, 61, 62, 91, 116, 124, 125, 156, 169, 170, 171, 172, 174];\r\n\r\nexport function checkInternalUserAccess(roleIds?: number[]) {\r\n if (!roleIds) {\r\n return;\r\n }\r\n\r\n const usersPubCenterRoles = roleIds.filter((roleId: number) => PubCenterUserRoles.includes(roleId));\r\n\r\n if (usersPubCenterRoles.length > 0) {\r\n return;\r\n }\r\n\r\n const UnauthorizedInternalUserRoute = encodeURI(\r\n window.location.protocol + '//' + window.location.host + UnauthorizedInternalUserPageRoute\r\n );\r\n Log.error(\r\n `User does not have access to PubCenter with following roles: ${roleIds}. Redirecting to ${UnauthorizedInternalUserPageRoute} error page`\r\n );\r\n\r\n window.location.replace(UnauthorizedInternalUserRoute);\r\n}\r\n","import { nullRender } from '@fluentui/utilities';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { Redirect, Route, RouteComponentProps } from 'react-router';\r\nimport { Log } from '../logging/src';\r\nimport { getAppStore, onAuthLogout } from './@data';\r\nimport { checkInternalUserAccess } from './@data/services/AuthorizationService';\r\nimport { isLocationPubCenter } from './utils/UrlUtils';\r\n\r\ninterface IAuthenticatedRouteProps {\r\n key: string;\r\n path: string;\r\n component: React.ComponentType<RouteComponentProps> | React.ComponentType;\r\n routeProps: RouteComponentProps;\r\n}\r\n\r\nexport const AuthenticatedRoute = observer(\r\n class extends React.Component<IAuthenticatedRouteProps> {\r\n public render(): JSX.Element | null {\r\n const { path, component, routeProps } = this.props;\r\n const { userContext, isInviteUserFlow } = getAppStore();\r\n\r\n const redirectToOldLoginPage = {\r\n pathname: '/loginV2',\r\n state: { from: routeProps.location },\r\n };\r\n const redirectToNewLoginPage = {\r\n pathname: '/',\r\n state: { from: routeProps.location },\r\n };\r\n\r\n if (!userContext) {\r\n return <Redirect to={isLocationPubCenter() ? redirectToOldLoginPage : redirectToNewLoginPage} />;\r\n }\r\n\r\n checkInternalUserAccess(userContext?.userRoles);\r\n if (!isInviteUserFlow && userContext?.token && userContext?.userRoles) {\r\n return <Route path={path} component={component} />;\r\n } else {\r\n Log.error(`User not authenticated logging out ${userContext?.email}`);\r\n onAuthLogout();\r\n return nullRender();\r\n }\r\n }\r\n }\r\n);\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n title: {\r\n id: 'loginPage.title',\r\n defaultMessage: 'Microsoft pubCenter',\r\n },\r\n welcome: {\r\n id: 'loginPage.welcome',\r\n defaultMessage: 'Welcome to pubCenter!',\r\n },\r\n description: {\r\n id: 'loginPage.description',\r\n defaultMessage: `We understand that creating content can be time-consuming. Making it profitable should be simple and hassle-free.`,\r\n },\r\n emailPlaceholder: {\r\n id: 'loginPage.emailPlaceholder',\r\n defaultMessage: 'Enter your email address',\r\n },\r\n signInButton: {\r\n id: 'loginPage.signInButton',\r\n defaultMessage: 'Sign in',\r\n },\r\n signInButtonAriaLabel: {\r\n id: 'loginPage.signInButtonAriaLabel',\r\n defaultMessage: 'Click to sign in',\r\n },\r\n imageAlt: {\r\n id: 'loginPage.imageAlt',\r\n defaultMessage: 'login background image',\r\n },\r\n redirectionMessage: {\r\n id: 'loginPage.redirectionMessage',\r\n defaultMessage: 'Redirecting to Monetize Now',\r\n },\r\n});\r\n","import { Overlay, Spinner, mergeStyleSets } from '@fluentui/react';\r\nimport React from 'react';\r\n\r\nexport interface IRedirectionSpinnerStyles {\r\n overlayStyle: string;\r\n spinnerStyle: string;\r\n}\r\n\r\nconst getStyles = () =>\r\n mergeStyleSets({\r\n overlayStyle: {\r\n flex: 1,\r\n display: 'flex',\r\n position: 'fixed',\r\n zIndex: 9999999,\r\n },\r\n spinnerStyle: {\r\n flex: 1,\r\n display: 'flex',\r\n selectors: {\r\n '.ms-Spinner-circle': {\r\n height: 67,\r\n width: 67,\r\n borderWidth: '4px',\r\n },\r\n '.ms-Spinner-label': {\r\n color: '#000',\r\n fontSize: '24px',\r\n fontWeight: 'bold',\r\n },\r\n },\r\n },\r\n });\r\n\r\nexport const RedirectionSpinner = ({ label }) => {\r\n const { overlayStyle, spinnerStyle } = getStyles();\r\n return (\r\n <>\r\n <Overlay className={overlayStyle}>\r\n <Spinner className={spinnerStyle} label={label} labelPosition=\"bottom\" />\r\n </Overlay>\r\n </>\r\n );\r\n};\r\n","export enum ResourceType {\r\n AdUnit,\r\n Filter,\r\n Channel,\r\n Publisher,\r\n Reporting,\r\n WebProperty,\r\n Account,\r\n User\r\n}\r\n\r\nexport enum CrossEntityResourceType {\r\n PublisherByAdunit,\r\n PublisherByAccount,\r\n PublisherByUser,\r\n PublisherByWebProperty,\r\n PublisherByChannel,\r\n PublisherByFilter\r\n}\r\n\r\nexport const crossEntityResourceTypeMap: Map<string, string[]> = new Map([\r\n [\r\n ResourceType[ResourceType.Publisher],\r\n [\r\n CrossEntityResourceType[CrossEntityResourceType.PublisherByAccount],\r\n CrossEntityResourceType[CrossEntityResourceType.PublisherByAdunit],\r\n CrossEntityResourceType[CrossEntityResourceType.PublisherByUser],\r\n CrossEntityResourceType[CrossEntityResourceType.PublisherByWebProperty]\r\n ]\r\n ]\r\n]);\r\n","export enum ResourceTypeDistribution {\r\n EqualBucketSize = 0,\r\n DynamicBucketSize = 1\r\n}\r\n","/* eslint-disable jsx-a11y/interactive-supports-focus */\r\nimport {\r\n Callout,\r\n classNamesFunction,\r\n DirectionalHint,\r\n FocusZone,\r\n FocusZoneDirection,\r\n ICalloutProps,\r\n IProcessedStyleSet,\r\n SearchBox,\r\n Shimmer,\r\n ShimmerElementType,\r\n} from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { PubcenterTheme } from '../../../theme';\r\nimport { useWindowSize } from '../../hooks';\r\nimport { getStore } from '../../hooks/useWindowSize/store/store';\r\nimport { ISearchBarStyleProps, ISearchBarStyles, ISearchProps, ISearchState } from './Search.types';\r\n\r\nconst getClassNames = classNamesFunction<ISearchBarStyleProps, ISearchBarStyles>();\r\nconst defaultMinLettersToSearch = 3;\r\nconst defaultCalloutWidth = `clamp(${PubcenterTheme.spacing.size256}, 50vw, ${PubcenterTheme.spacing.size960})`;\r\nconst maxCalloutHeight = 614;\r\n\r\nexport class SearchBase<T> extends React.Component<ISearchProps<T>, ISearchState> {\r\n private _classNames: IProcessedStyleSet<ISearchBarStyles>;\r\n private _searchBarElement = React.createRef<HTMLDivElement>();\r\n\r\n constructor(props: ISearchProps<T>) {\r\n super(props);\r\n this.state = {\r\n calloutVisible: false,\r\n };\r\n }\r\n\r\n public handleClickOutside = (event) => {\r\n if (this._searchBarElement && !this._searchBarElement?.current?.contains(event.target)) {\r\n this.props.onClearInResponsiveView?.();\r\n }\r\n };\r\n\r\n public componentWillUnmount() {\r\n document.removeEventListener('mousedown', this.handleClickOutside);\r\n }\r\n\r\n public componentDidMount() {\r\n document.addEventListener('mousedown', this.handleClickOutside);\r\n this.setState({ calloutVisible: false });\r\n }\r\n\r\n public componentDidUpdate(prevProps: ISearchProps<T>) {\r\n if (prevProps.searchInProgress === true && this.props.searchInProgress === false) {\r\n this.setState({ calloutVisible: true });\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n styles,\r\n theme,\r\n searchBoxProps,\r\n searchInProgress,\r\n minLettersToSearch,\r\n calloutProps,\r\n searchResultList,\r\n searchResultListAriaLabel,\r\n } = this.props;\r\n\r\n const { windowStoreSerializer } = useWindowSize();\r\n const windowSize = windowStoreSerializer(getStore());\r\n const { width: screenWidth, height: screenHeight, isWindowSmallSize, isWindowExtraSmallSize } = windowSize;\r\n this._classNames = getClassNames(styles, { theme: theme! });\r\n\r\n let searchCalloutProps: ICalloutProps = {\r\n calloutMaxHeight: isWindowSmallSize || isWindowExtraSmallSize ? screenHeight : maxCalloutHeight,\r\n style: {\r\n width: isWindowSmallSize || isWindowExtraSmallSize ? screenWidth : calloutProps?.calloutWidth ?? defaultCalloutWidth,\r\n },\r\n };\r\n if (calloutProps) {\r\n const { calloutWidth, calloutMaxHeight, ...otherCalloutProps } = calloutProps;\r\n searchCalloutProps = { ...otherCalloutProps };\r\n }\r\n\r\n return (\r\n <>\r\n <div role=\"search\" className={this._classNames.searchBar} ref={this._searchBarElement}>\r\n <SearchBox\r\n styles={this._classNames.subComponentStyles.searchBox}\r\n placeholder={searchBoxProps.placeholder}\r\n disableAnimation={true}\r\n onSearch={(value) => {\r\n this.setState({ calloutVisible: true });\r\n this._onChange(value, minLettersToSearch ? minLettersToSearch : defaultMinLettersToSearch);\r\n }}\r\n onClear={this._onClear}\r\n onChange={(_, value: string) => this._onChange(value, minLettersToSearch ? minLettersToSearch : defaultMinLettersToSearch)}\r\n ariaLabel={searchBoxProps.searchBoxAriaLabel}\r\n />\r\n </div>\r\n {searchInProgress && (\r\n <Callout\r\n target={this._searchBarElement.current}\r\n className={this._classNames.calloutWrapper}\r\n {...searchCalloutProps}\r\n role={'dialog'}\r\n directionalHint={DirectionalHint.bottomCenter}\r\n directionalHintFixed={true}\r\n isBeakVisible={false}\r\n gapSpace={2}\r\n >\r\n {this._onRenderShimmer()}\r\n </Callout>\r\n )}\r\n {!searchInProgress && searchResultList && this.state.calloutVisible && (\r\n <Callout\r\n target={this._searchBarElement.current}\r\n className={this._classNames.calloutWrapper}\r\n {...searchCalloutProps}\r\n role={'dialog'}\r\n onDismiss={() => this.setState({ calloutVisible: false })}\r\n directionalHint={DirectionalHint.bottomCenter}\r\n directionalHintFixed={true}\r\n isBeakVisible={false}\r\n gapSpace={2}\r\n setInitialFocus={searchResultList ? true : false}\r\n >\r\n <FocusZone\r\n onClick={() => this.setState({ calloutVisible: false })}\r\n onKeyDown={(ev) => {\r\n // Earlier clicking tab was taking focus out of context and hence breaking the navigation order\r\n // Dismissing the callout makes sure that it will focus on the next active element in the tab order.\r\n\r\n if (ev.key === 'Tab' || (ev.shiftKey && ev.key === 'Tab') || ev.key === ' ' || ev.key === 'Enter') {\r\n this.setState({ calloutVisible: false });\r\n }\r\n }}\r\n role=\"listbox\"\r\n isCircularNavigation={true}\r\n direction={FocusZoneDirection.vertical}\r\n aria-label={searchResultListAriaLabel}\r\n aria-live=\"assertive\"\r\n >\r\n {searchResultList.length > 0 &&\r\n searchResultList.map((category) => this.props.onRenderSearchResult && this.props.onRenderSearchResult(category))}\r\n {this.props.onRenderSearchResultFooter && this.props.onRenderSearchResultFooter()}\r\n </FocusZone>\r\n </Callout>\r\n )}\r\n </>\r\n );\r\n }\r\n\r\n private _onRenderShimmer = (): JSX.Element => {\r\n return (\r\n <div className={this._classNames.shimmerCallout}>\r\n <Shimmer\r\n className={this._classNames.shimmerElement}\r\n shimmerElements={[\r\n { type: ShimmerElementType.circle, height: 28, width: 28 },\r\n { type: ShimmerElementType.gap, height: 28, width: 16 },\r\n { type: ShimmerElementType.line, height: 20, width: 390 },\r\n { type: ShimmerElementType.gap, height: 28, width: '100%' },\r\n ]}\r\n />\r\n <Shimmer\r\n className={this._classNames.shimmerElement}\r\n shimmerElements={[\r\n { type: ShimmerElementType.circle, height: 28, width: 28 },\r\n { type: ShimmerElementType.gap, height: 28, width: 16 },\r\n { type: ShimmerElementType.line, height: 20, width: 390 },\r\n { type: ShimmerElementType.gap, height: 28, width: '100%' },\r\n ]}\r\n />\r\n <Shimmer\r\n className={this._classNames.shimmerElement}\r\n shimmerElements={[\r\n { type: ShimmerElementType.circle, height: 28, width: 28 },\r\n { type: ShimmerElementType.gap, height: 28, width: 16 },\r\n { type: ShimmerElementType.line, height: 20, width: 390 },\r\n { type: ShimmerElementType.gap, height: 28, width: '100%' },\r\n ]}\r\n />\r\n </div>\r\n );\r\n };\r\n\r\n private _onChange = (queryText: string, minNumLettersForSearchTrigger: number): void => {\r\n if (this.props.searchBoxProps && this.props.searchBoxProps.onChange) {\r\n this.props.searchBoxProps.onChange(queryText, minNumLettersForSearchTrigger);\r\n }\r\n };\r\n\r\n private _onClear = (): void => {\r\n this.setState({ calloutVisible: false });\r\n this.props.onClearInResponsiveView?.();\r\n if (this.props.searchBoxProps && this.props.searchBoxProps.onClear) {\r\n this.props.searchBoxProps.onClear();\r\n }\r\n };\r\n}\r\n","import { BreakPoints, IPubcenterPalette, IPubcenterSpacing } from '../../../theme';\r\nimport { ISearchBarStyleProps, ISearchBarStyles } from './Search.types';\r\n\r\nconst { ResponsiveSmall } = BreakPoints;\r\n\r\nexport const getSearchStyles = (props: ISearchBarStyleProps): ISearchBarStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const pallete = theme.palette as IPubcenterPalette;\r\n\r\n return {\r\n root: ['ms-GlobalSearch'],\r\n searchBar: [\r\n 'ms-GlobalSearchBar',\r\n {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n ],\r\n calloutWrapper: {\r\n [ResponsiveSmall]: {\r\n left: '0 !important',\r\n right: '0 !important',\r\n '>div[role=\"dialog\"]': {\r\n height: '100vh',\r\n },\r\n },\r\n },\r\n shimmerCallout: {\r\n flexDirection: 'column',\r\n width: spacing.size480,\r\n },\r\n shimmerElement: {\r\n width: spacing.size480,\r\n height: spacing.size48,\r\n padding: '0 16px',\r\n },\r\n subComponentStyles: {\r\n searchBox: {\r\n root: [\r\n 'ms-fontSize-Body14',\r\n {\r\n height: spacing.size32,\r\n width: `clamp(${spacing.size256}, 50vw, ${spacing.size960})`,\r\n borderRadius: '2px',\r\n background: pallete.neutralQuaternaryAlt,\r\n selectors: {\r\n ':hover': {\r\n background: pallete.white,\r\n },\r\n },\r\n [ResponsiveSmall]: {\r\n width: `clamp(30vw, 40vw, 45vw);`,\r\n },\r\n },\r\n ],\r\n },\r\n },\r\n };\r\n};\r\n","import { styled } from '@fluentui/react';\r\nimport { SearchBase } from './Search.base';\r\nimport { getSearchStyles } from './Search.styles';\r\n\r\n// Use Fabric Base guidelines since this might be contributed back to Fabric.\r\nexport const Search = styled(SearchBase, getSearchStyles, undefined, {\r\n scope: 'Search',\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n homeButtonAriaLabel: {\r\n id: 'header.homeButtonAriaLabel',\r\n defaultMessage: '{appName} home',\r\n },\r\n dropdownAriaLabel: {\r\n id: 'header.dropdownAriaLabel',\r\n defaultMessage: 'Module Selector',\r\n },\r\n myAccountDescribedByLabel: {\r\n id: 'header.myAccountDescribedByLabel',\r\n defaultMessage: 'Click on the icon to view more details and get a link to sign out',\r\n },\r\n myAccountStatusLabel: {\r\n id: 'header.myAccountStatusLabel',\r\n defaultMessage: 'Your profile picture with status set as online',\r\n },\r\n defaultRouteDirection: {\r\n id: 'header.defaultRouteDirection',\r\n defaultMessage: 'At {appName} Home',\r\n }\r\n});\r\n","import { FontWeights, IButtonStyles, ITheme } from '@fluentui/react';\r\nimport { BreakPoints, IPubcenterTheme } from '../../../theme';\r\nimport { IHeaderStyleProps, IHeaderStyles } from './Header.types';\r\n\r\nconst { ResponsiveExtraLarge, ResponsiveSmall } = BreakPoints;\r\n\r\nexport const getStyles = (props: IHeaderStyleProps): IHeaderStyles => {\r\n const theme = (props.theme as unknown) as IPubcenterTheme;\r\n const { spacing, fonts, palette } = theme;\r\n\r\n return {\r\n root: {\r\n backgroundColor: props.isTythonExperience ? palette['NeutralBackground5.Rest'] : palette.headerGlobal,\r\n color: 'white',\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n defaultButtonStyle: {\r\n borderRadius: '5px',\r\n whiteSpace: 'nowrap',\r\n },\r\n defaultButtonWrapperStyle: {\r\n position: 'relative',\r\n display: 'flex',\r\n flexWrap: 'nowrap',\r\n flexGrow: '100',\r\n justifyContent: 'flex-end',\r\n },\r\n itemIcon: {\r\n fontSize: fonts.size16.fontSize,\r\n width: spacing.size48,\r\n height: spacing.size48,\r\n textAlign: 'center',\r\n lineHeight: spacing.size48,\r\n selectors: {\r\n ':hover': {\r\n background: palette.themeSecondary,\r\n },\r\n },\r\n },\r\n dot: {\r\n position: 'absolute',\r\n top: spacing.size12,\r\n marginLeft: spacing.size24,\r\n width: spacing.size10,\r\n height: spacing.size10,\r\n backgroundColor: 'red',\r\n borderRadius: '50%',\r\n },\r\n moreInfoIcon: {\r\n color: '#ffffff',\r\n [ResponsiveSmall]: {\r\n color: palette.neutralLight,\r\n },\r\n },\r\n overflowIcon: {\r\n color: '#000000',\r\n },\r\n overflowMenuWrapper: {\r\n '.ms-ContextualMenu-link': {\r\n ':hover': {\r\n '.ms-ContextualMenu-icon': {\r\n color: '#000000',\r\n },\r\n },\r\n },\r\n },\r\n navigationLm: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n flexGrow: 1,\r\n // adding padding to accormodate the focus indicator outline within the header\r\n padding: `${spacing.size2} 0`,\r\n },\r\n leftSection: {\r\n [ResponsiveExtraLarge]: {\r\n marginRight: theme.spacing.s1,\r\n },\r\n },\r\n rightSection: {\r\n flexGrow: 1,\r\n justifyContent: 'flex-end',\r\n ...(props.isTythonExperience\r\n ? {\r\n '.ms-OverflowSet-item': {\r\n 'i[role=\"img\"]': { color: palette['NeutralForeground2.Rest'] },\r\n 'i[role=\"img\"]:hover': { background: palette['NeutralBackground3.Rest'] },\r\n '.ms-Persona:hover': { background: palette['NeutralBackground3.Rest'] },\r\n },\r\n }\r\n : {}),\r\n [ResponsiveSmall]: {\r\n zIndex: 9999,\r\n },\r\n },\r\n logo: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n ...(props.isTythonExperience ? { color: palette['NeutralForeground1.Rest'] } : {}),\r\n marginLeft: theme.spacing.s1,\r\n marginRight: theme.spacing.s1,\r\n height: 44,\r\n selectors: {\r\n i: {\r\n fontSize: 28,\r\n marginRight: theme.spacing.s1,\r\n },\r\n span: {\r\n fontSize: fonts.size16.fontSize,\r\n fontWeight: FontWeights.semibold,\r\n marginRight: theme.spacing.s1,\r\n ...(props.isTythonExperience ? { marginLeft: theme.spacing.size30 } : {}),\r\n },\r\n },\r\n [ResponsiveSmall]: {\r\n paddingLeft: 0,\r\n },\r\n },\r\n helpCenterIcon: { color: '#ffffff' },\r\n textHeader: {\r\n marginLeft: 8,\r\n },\r\n dropdownOption: {\r\n marginRight: theme.spacing.s1,\r\n },\r\n navItem: {\r\n cursor: 'pointer',\r\n },\r\n subComponentStyles: {\r\n dropdown: {\r\n root: {\r\n width: 200,\r\n marginRight: theme.spacing.m,\r\n },\r\n dropdown: [\r\n {\r\n selectors: {\r\n '&:focus $title': {\r\n borderColor: palette.themeSecondary,\r\n },\r\n },\r\n },\r\n ],\r\n },\r\n itemIdentity: {\r\n root: {\r\n flexDirection: 'row-reverse',\r\n height: '100%',\r\n padding: '10px',\r\n marginRight: '10px',\r\n selectors: {\r\n '&:hover': {\r\n background: palette.themeSecondary,\r\n },\r\n '&:hover $primaryText': {\r\n color: 'white',\r\n },\r\n },\r\n },\r\n primaryText: {\r\n color: 'white',\r\n },\r\n secondaryText: {\r\n color: 'white',\r\n },\r\n },\r\n },\r\n };\r\n};\r\n\r\nexport const getOverflowIconStyle = (theme: ITheme): Partial<IButtonStyles> => {\r\n return {\r\n root: {\r\n fontSize: 16,\r\n minWidth: 0,\r\n color: '#ffffff',\r\n width: 48,\r\n // adjusting the height with extra padding to accomodate the focus indicator outline within the header\r\n height: 44,\r\n textAlign: 'center',\r\n lineHeight: 44,\r\n },\r\n rootHovered: {\r\n background: theme.palette.themeSecondary,\r\n },\r\n rootExpanded: {\r\n background: theme.palette.themeSecondary,\r\n },\r\n };\r\n};\r\n","import {\r\n Announced,\r\n classNamesFunction,\r\n ContextualMenu,\r\n css,\r\n DefaultButton,\r\n Dropdown,\r\n getTheme,\r\n Icon,\r\n IconButton,\r\n IContextualMenuItem,\r\n IContextualMenuProps,\r\n IDropdownOption,\r\n IProcessedStyleSet,\r\n OverflowSet,\r\n Panel,\r\n PanelType,\r\n Persona,\r\n PersonaPresence,\r\n PersonaSize,\r\n ResizeGroup,\r\n} from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { getAppStore, LayoutMode } from '../../@data';\r\nimport { isNotAuthorizedUser, isTythonSelfServeUser } from '../../@data/utils/checkUserType';\r\nimport { getSupportedLocalesMapping } from '../../@data/utils/supportedLanguages';\r\nimport AppMessages from '../../App.messages';\r\nimport { reverseLocales, userLocales } from '../../config/locale';\r\nimport {\r\n APP_NAME_NEW,\r\n APP_NAME_PUBCENTER,\r\n CUSTOM_NOTIFICATIONS_WIDTH,\r\n CUSTOM_WIDTH,\r\n EN_LOCALE_KEY,\r\n UNAUTHORIZED_LOCAL_STORAGE_LOCALE,\r\n} from '../../constants/AppConstants';\r\nimport { useWindowSize } from '../../hooks';\r\nimport { getStore } from '../../hooks/useWindowSize/store/store';\r\nimport { onLanguageChanged } from '../../pages/ad-management/Account/Settings/@data/mutatorActions';\r\nimport { AcceptInvitePageRoute, DefaultRoute, LandingPageRoute, SignUpPageRoute } from '../../Routes';\r\nimport { isLocationPubCenter } from '../../utils';\r\nimport { isButtonPressKey } from '../../utils/AccessibilityUtils';\r\nimport { Logo } from '../Logo/Logo';\r\nimport { Search } from '../Search/Search';\r\nimport messages from './Header.messages';\r\nimport { getOverflowIconStyle, getStyles } from './Header.styles';\r\nimport { IHeaderDropdownItem, IHeaderItem, IHeaderProps, IHeaderState, IHeaderStyleProps, IHeaderStyles, PanelTypes } from './Header.types';\r\n\r\nconst getClassNames = classNamesFunction<IHeaderStyleProps, IHeaderStyles>();\r\nconst defaultLang = getSupportedLocalesMapping(localStorage.getItem(UNAUTHORIZED_LOCAL_STORAGE_LOCALE))\r\n ? getSupportedLocalesMapping(localStorage.getItem(UNAUTHORIZED_LOCAL_STORAGE_LOCALE))[\r\n reverseLocales[localStorage.getItem(UNAUTHORIZED_LOCAL_STORAGE_LOCALE) ?? EN_LOCALE_KEY]\r\n ]\r\n : 'English - United States';\r\n\r\ninterface IHeaderData {\r\n items?: IHeaderItem[];\r\n isSearchBarActiveInNonRegularView?: boolean;\r\n}\r\n\r\nexport class Header<T> extends React.Component<IHeaderProps<T>, IHeaderState> {\r\n private _classNames: IProcessedStyleSet<IHeaderStyles>;\r\n constructor(props: IHeaderProps<T>) {\r\n super(props);\r\n\r\n const initialRouteMatch = window.location.pathname.match(/(\\/[\\w-]+)\\/?/);\r\n const initialRoute = initialRouteMatch ? initialRouteMatch[1] : DefaultRoute;\r\n this.state = {\r\n title: this.props.loadingText || '...',\r\n currentRoute: initialRoute,\r\n announcedMessage: undefined,\r\n panelType: undefined,\r\n isSearchBarActiveInNonRegularView: false,\r\n selectedLanguage: defaultLang,\r\n };\r\n }\r\n\r\n public componentDidMount(): void {\r\n getAppStore().userContext?.id === undefined &&\r\n onLanguageChanged(localStorage.getItem(UNAUTHORIZED_LOCAL_STORAGE_LOCALE) ?? EN_LOCALE_KEY, UNAUTHORIZED_LOCAL_STORAGE_LOCALE);\r\n }\r\n\r\n public componentDidUpdate(prevProps: IHeaderProps<T>) {\r\n const routeMatch = window.location.pathname.match(/(\\/[\\w-]+)\\/?/);\r\n const route = routeMatch ? routeMatch[1] : DefaultRoute;\r\n\r\n if (route !== this.state.currentRoute) {\r\n this.setState({\r\n currentRoute: route,\r\n });\r\n }\r\n\r\n // make sure this state get's reset so screen reader will announce every time when redirection is triggered\r\n if (this.state.announcedMessage) {\r\n setTimeout(\r\n () =>\r\n this.setState({\r\n announcedMessage: undefined,\r\n }),\r\n 500\r\n );\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n items,\r\n useCMUIHelpExperience: { CMUIHeaderMenuItemSerializer },\r\n } = this.props;\r\n this._classNames = getClassNames(getStyles, {\r\n theme: getTheme(),\r\n isTythonExperience: isTythonSelfServeUser() || !isLocationPubCenter(),\r\n });\r\n\r\n const headerData: IHeaderData = {\r\n items: CMUIHeaderMenuItemSerializer(isTythonSelfServeUser(), items),\r\n };\r\n\r\n return <ResizeGroup data={headerData} onRenderData={this._onRenderData} onReduceData={this._onReduceData} />;\r\n }\r\n\r\n private _onReduceData = (data: IHeaderData): IHeaderProps<T> | undefined => {\r\n return undefined;\r\n };\r\n\r\n private _onRenderData = (data?: IHeaderData): JSX.Element => {\r\n const { publisher, userContext } = getAppStore();\r\n const signingUp: boolean = publisher === undefined && userContext?.id === undefined;\r\n const shouldRenderCustomLeftIcon = !!this.props.renderLeftIcon;\r\n const { formatMessage } = this.props.intl;\r\n const { windowStoreSerializer } = useWindowSize();\r\n const { isWindowSmallSize, isWindowRegularSize, isWindowExtraSmallSize } = windowStoreSerializer(getStore());\r\n const { isSearchBarActiveInNonRegularView } = this.state;\r\n const shouldHideDropdownInResponsiveView = !isWindowRegularSize && isSearchBarActiveInNonRegularView;\r\n const shouldRenderSearchBarInResponsiveView = (isSearchBarActiveInNonRegularView && !isWindowRegularSize) || isWindowRegularSize;\r\n const SearchBarIconButton: IHeaderItem[] =\r\n // responsive logic to hide search icon\r\n isWindowRegularSize || isSearchBarActiveInNonRegularView\r\n ? []\r\n : [\r\n // render logic to disable search icon for tython user\r\n ...(isTythonSelfServeUser()\r\n ? []\r\n : [\r\n {\r\n title: '',\r\n icon: 'Search',\r\n onClick: () => this.setState({ isSearchBarActiveInNonRegularView: true }),\r\n key: 'HeaderSearchIcon',\r\n shouldOverflowUnderExtraSmallScreen: true,\r\n },\r\n ]),\r\n ];\r\n const headerItems = [...SearchBarIconButton, ...(data?.items ?? [])];\r\n const [headerIconItems, headerIconOverflowItems] = [\r\n isWindowExtraSmallSize ? headerItems.filter((item) => !item.shouldOverflowUnderExtraSmallScreen) : headerItems,\r\n isWindowExtraSmallSize\r\n ? headerItems\r\n .filter((item) => item.shouldOverflowUnderExtraSmallScreen)\r\n // as a11y enhancement, make sure first item gets auto focused\r\n .map((item, index) => (index === 0 ? { ...item, autoFocus: 'true' } : item))\r\n : [],\r\n ];\r\n const isContentOnlyLayout = getAppStore().layout === LayoutMode.ContentOnly;\r\n const selectedLang = getSupportedLocalesMapping(localStorage.getItem(UNAUTHORIZED_LOCAL_STORAGE_LOCALE))\r\n ? getSupportedLocalesMapping(localStorage.getItem(UNAUTHORIZED_LOCAL_STORAGE_LOCALE))[\r\n reverseLocales[localStorage.getItem(UNAUTHORIZED_LOCAL_STORAGE_LOCALE) ?? EN_LOCALE_KEY]\r\n ]\r\n : 'English - United States';\r\n const selectedHeaderItem = headerItems.find((item) => item.key === this.state.selectedItem?.key);\r\n\r\n localStorage.getItem(UNAUTHORIZED_LOCAL_STORAGE_LOCALE) ?? localStorage.setItem(UNAUTHORIZED_LOCAL_STORAGE_LOCALE, EN_LOCALE_KEY);\r\n\r\n const menuProps: IContextualMenuProps = {\r\n onItemClick: (ev, item) => {\r\n if (item && item.text && item.key !== localStorage.getItem(UNAUTHORIZED_LOCAL_STORAGE_LOCALE)) {\r\n onLanguageChanged(item.key, UNAUTHORIZED_LOCAL_STORAGE_LOCALE);\r\n }\r\n },\r\n items: this._getLanguageContextualMenuItems(getAppStore().locale),\r\n directionalHintFixed: true,\r\n };\r\n\r\n return (\r\n <header className={this._classNames.root}>\r\n {this.state.announcedMessage ? <Announced message={this.state.announcedMessage} /> : undefined}\r\n\r\n <div\r\n className={css(this._classNames.logo, shouldRenderCustomLeftIcon ? '' : this._classNames.navItem)}\r\n onClick={() => {\r\n if (!shouldRenderCustomLeftIcon) {\r\n this._navigateTo(DefaultRoute);\r\n this.setState({\r\n announcedMessage: formatMessage(messages.defaultRouteDirection, {\r\n appName: isTythonSelfServeUser() ? APP_NAME_NEW : APP_NAME_PUBCENTER,\r\n }),\r\n });\r\n }\r\n }}\r\n onKeyDown={(ev) => {\r\n if (!shouldRenderCustomLeftIcon && isButtonPressKey(ev.key)) {\r\n this._navigateTo(DefaultRoute);\r\n this.setState({\r\n announcedMessage: formatMessage(messages.defaultRouteDirection, {\r\n appName: isTythonSelfServeUser() ? APP_NAME_NEW : APP_NAME_PUBCENTER,\r\n }),\r\n });\r\n }\r\n }}\r\n role=\"link\"\r\n tabIndex={0}\r\n aria-label={formatMessage(messages.homeButtonAriaLabel, {\r\n appName: isTythonSelfServeUser() ? APP_NAME_NEW : APP_NAME_PUBCENTER,\r\n })}\r\n >\r\n {this.props.renderLeftIcon ?? (\r\n <Logo\r\n shouldRenderLogo={!(isWindowSmallSize || isWindowExtraSmallSize) || isContentOnlyLayout}\r\n renderGreyLogo={!isLocationPubCenter() || isTythonSelfServeUser()}\r\n />\r\n )}\r\n </div>\r\n\r\n <nav className={css(this._classNames.navigationLm)}>\r\n {/* Temporarily hiding module selection dropDown and global search for tython MVP users (including signup page) */}\r\n {this._shouldShowDropdownSearch() && (\r\n <>\r\n {!shouldHideDropdownInResponsiveView && (\r\n <div className={this._classNames.leftSection}>\r\n <Dropdown\r\n className={this._classNames.navItem}\r\n styles={this._classNames.subComponentStyles.dropdown}\r\n onRenderOption={this._onRenderOption}\r\n options={this._initializeRoutesData()}\r\n selectedKey={this.state.currentRoute}\r\n onChange={this._onDropdownChange}\r\n ariaLabel={formatMessage(messages.dropdownAriaLabel)}\r\n />\r\n </div>\r\n )}\r\n\r\n {this.props.searchProps && shouldRenderSearchBarInResponsiveView && (\r\n <Search\r\n {...this.props.searchProps}\r\n onClearInResponsiveView={\r\n isSearchBarActiveInNonRegularView ? () => this.setState({ isSearchBarActiveInNonRegularView: false }) : undefined\r\n }\r\n />\r\n )}\r\n </>\r\n )}\r\n\r\n {signingUp && (\r\n <div className={this._classNames.defaultButtonWrapperStyle}>\r\n <DefaultButton\r\n text={selectedLang}\r\n iconProps={{ iconName: 'LocaleLanguage' }}\r\n menuProps={menuProps}\r\n menuAs={this._getMenu}\r\n persistMenu={true}\r\n className={this._classNames.defaultButtonStyle}\r\n />\r\n </div>\r\n )}\r\n\r\n <OverflowSet\r\n className={this._classNames.rightSection}\r\n items={headerIconItems}\r\n overflowItems={headerIconOverflowItems}\r\n onRenderItem={this._onRenderItem}\r\n onRenderOverflowButton={this._onRenderOverflowButton}\r\n overflowSide=\"start\"\r\n />\r\n\r\n {this._createPanel(selectedHeaderItem)}\r\n </nav>\r\n </header>\r\n );\r\n };\r\n\r\n private _getMenu = (props: IContextualMenuProps): JSX.Element => {\r\n return <ContextualMenu {...props} />;\r\n };\r\n\r\n private _getLanguageContextualMenuItems = (locale: string): IContextualMenuItem[] => {\r\n const isProdEnv = process.env.REACT_APP_ENV === 'production';\r\n const supportedLocales = getSupportedLocalesMapping(locale);\r\n const supportedLanguages: IContextualMenuItem[] = [];\r\n\r\n Object.keys(supportedLocales).forEach((localeCode) => {\r\n supportedLanguages.push({\r\n key: userLocales[localeCode].toLocaleLowerCase(),\r\n text: supportedLocales[localeCode],\r\n });\r\n });\r\n\r\n supportedLanguages.sort((a, b) => {\r\n const firstValue = a.text;\r\n const secondValue = b.text;\r\n\r\n return firstValue!.toLowerCase() > secondValue!.toLowerCase() ? 1 : -1;\r\n });\r\n\r\n const filteredLanguages = supportedLanguages.filter((value, index) => value.key === EN_LOCALE_KEY);\r\n\r\n return isProdEnv ? filteredLanguages : supportedLanguages;\r\n };\r\n\r\n private _createPanel(item?: IHeaderItem): JSX.Element {\r\n // For icons such as CMUI help icon, panels are integrated with 3rd party libraries no need to render native panel\r\n if (item && !item.panel) {\r\n return <></>;\r\n }\r\n\r\n return (\r\n <Panel\r\n headerText={item?.title}\r\n type={item ? (item.type && item.type === PanelTypes.Profile ? PanelType.smallFixedFar : PanelType.custom) : undefined}\r\n customWidth={item?.type === PanelTypes.Notifications ? CUSTOM_NOTIFICATIONS_WIDTH : CUSTOM_WIDTH}\r\n isOpen={!!item}\r\n isLightDismiss={true}\r\n onDismiss={this._hidePanel}\r\n closeButtonAriaLabel={this.props.intl.formatMessage(AppMessages.close)}\r\n isFooterAtBottom={item?.panelProps?.isFooterAtBottom}\r\n onRenderFooterContent={() => item?.panelProps?.onRenderFooterContent?.({ onDismiss: this._hidePanel }) || null}\r\n >\r\n {item?.panel ? React.cloneElement(<item.panel />, { hidePanel: this._hidePanel }) : <p>Loading...</p>}\r\n </Panel>\r\n );\r\n }\r\n\r\n private _initializeRoutesData(): IDropdownOption[] {\r\n if (!this.props.dropdownItems) {\r\n return [];\r\n }\r\n\r\n return this.props.dropdownItems.map((item: IHeaderDropdownItem) => {\r\n return {\r\n key: item.key,\r\n text: item.text,\r\n title: '',\r\n ariaLabel: item.text,\r\n data: {\r\n icon: item.icon,\r\n },\r\n };\r\n });\r\n }\r\n\r\n private _onRenderOption = (option: IDropdownOption): JSX.Element => {\r\n return (\r\n <div>\r\n {option.data && option.data.icon && (\r\n <Icon className={this._classNames.dropdownOption} iconName={option.data.icon} aria-hidden=\"true\" title={option.data.icon} />\r\n )}\r\n <span>{option.text}</span>\r\n </div>\r\n );\r\n };\r\n\r\n private _onDropdownChange = (event: React.FormEvent<HTMLDivElement>, option?: IDropdownOption): void => {\r\n if (option) {\r\n const currentRoute = option.key.toString();\r\n this._navigateTo(currentRoute);\r\n }\r\n };\r\n\r\n private _navigateTo = (route: string): void => {\r\n this.setState({\r\n currentRoute: route,\r\n });\r\n\r\n if (this.props.onNavigate) {\r\n this.props.onNavigate(route);\r\n }\r\n };\r\n\r\n private _onRenderItem = (item: IHeaderItem): JSX.Element | React.ReactNode => {\r\n return item.identity ? this._renderIdentity(item) : this._renderIcon(item);\r\n };\r\n\r\n private _onRenderOverflowButton = (overflowItems: IHeaderItem[]): JSX.Element => {\r\n const overflowItemSerializer = (items: IHeaderItem[]) =>\r\n items.map((item) => ({\r\n ...item,\r\n name: item.title,\r\n ...(item.icon ? { iconProps: { iconName: item.icon, className: this._classNames.overflowIcon } } : {}),\r\n ...(item.panel ? { onClick: () => this._showPanel(item) } : {}),\r\n }));\r\n return (\r\n <IconButton\r\n title=\"More options\"\r\n styles={getOverflowIconStyle(getTheme())}\r\n menuIconProps={{ iconName: 'More', className: this._classNames.moreInfoIcon }}\r\n menuProps={{ items: overflowItemSerializer(overflowItems!), className: this._classNames.overflowMenuWrapper }}\r\n />\r\n );\r\n };\r\n\r\n private _renderIdentity = (item: IHeaderItem): JSX.Element => {\r\n const identity = item.identity!;\r\n\r\n return (\r\n <Persona\r\n className={this._classNames.navItem}\r\n title={item.title}\r\n styles={this._classNames.subComponentStyles.itemIdentity}\r\n text={identity.name}\r\n secondaryText={identity.email}\r\n size={PersonaSize.size24}\r\n presence={PersonaPresence.online}\r\n showSecondaryText={false}\r\n hidePersonaDetails={true}\r\n role=\"button\"\r\n aria-haspopup={true}\r\n aria-describedby={this.props.intl.formatMessage(messages.myAccountDescribedByLabel)}\r\n imageAlt={this.props.intl.formatMessage(messages.myAccountStatusLabel)}\r\n onClick={() => this._showPanel(item)}\r\n aria-expanded={this.state.selectedItem !== undefined}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key) && this._showPanel(item)}\r\n tabIndex={0}\r\n />\r\n );\r\n };\r\n\r\n private _renderIcon = (item: IHeaderItem): JSX.Element => {\r\n /**\r\n * when icon has a `query` prop that means icon is for bingads helpcenter use, in this case we\r\n * will need to wrap it in an anchor tag with query attribute\r\n * */\r\n if (item.query) {\r\n return (\r\n <a href=\"/#\" query={item.query} className={css(item.className, this._classNames.helpCenterIcon)}>\r\n <Icon\r\n className={css(this._classNames.navItem, this._classNames.itemIcon, item.className)}\r\n title={item.title}\r\n iconName={item.icon}\r\n onKeyDown={(ev) => (item.panel ? isButtonPressKey(ev.key) && this._showPanel(item) : null)}\r\n // not to show panel for icons don't have panels\r\n onClick={() => (item.panel ? this._showPanel(item) : item.onClick?.() ?? null)}\r\n />\r\n </a>\r\n );\r\n } else if (item.showRedDot) {\r\n return (\r\n <div>\r\n <span className={this._classNames.dot} />\r\n <Icon\r\n className={css(this._classNames.navItem, this._classNames.itemIcon, item.className)}\r\n title={item.title}\r\n iconName={item.icon}\r\n onKeyDown={(ev) => (item.panel ? isButtonPressKey(ev.key) && this._showPanel(item) : null)}\r\n tabIndex={0}\r\n // not to show panel for icons don't have panels\r\n onClick={() => (item.panel ? this._showPanel(item) : item.onClick?.() ?? null)}\r\n />\r\n </div>\r\n );\r\n }\r\n return (\r\n <Icon\r\n className={css(this._classNames.navItem, this._classNames.itemIcon, item.className)}\r\n title={item.title}\r\n iconName={item.icon}\r\n onKeyDown={(ev) => (item.panel ? isButtonPressKey(ev.key) && this._showPanel(item) : null)}\r\n tabIndex={0}\r\n // not to show panel for icons don't have panels\r\n onClick={() => (item.panel ? this._showPanel(item) : item.onClick?.() ?? null)}\r\n />\r\n );\r\n };\r\n\r\n private _showPanel(item: IHeaderItem) {\r\n this.setState({\r\n title: item.title,\r\n selectedItem: item,\r\n panelType: item.type && item.type === PanelTypes.Profile ? PanelType.smallFixedFar : PanelType.custom,\r\n });\r\n }\r\n\r\n private _hidePanel = (): void => {\r\n this.setState({ selectedItem: undefined });\r\n };\r\n\r\n private _shouldShowDropdownSearch = () =>\r\n !isTythonSelfServeUser() &&\r\n !window.location.pathname.includes(AcceptInvitePageRoute) &&\r\n ![SignUpPageRoute, LandingPageRoute, '/'].includes(window.location.pathname) &&\r\n !isNotAuthorizedUser();\r\n}\r\n","import { action } from 'satcheljs';\r\nimport { ResourceType } from '../../../../@data/store/schema/enums/ResourceType';\r\nimport { ResourceTypeDistribution } from '../../../../@data/store/schema/enums/ResourceTypeDistribution';\r\nimport { IGlobalSearchFilter } from '../../../../@data/store/schema/interfaces/IGlobalSearchFilter';\r\nimport { IGlobalSearchResultData } from '../../../../@data/store/schema/interfaces/IGlobalSearchResultData';\r\n\r\nexport const onSearchTriggered = action(\r\n 'onSearchTriggered',\r\n (\r\n query: string,\r\n resourceTypes?: ResourceType[],\r\n globalFilters?: IGlobalSearchFilter[],\r\n resourceTypeDistribution?: ResourceTypeDistribution,\r\n pageSize?: number\r\n ) => ({\r\n query,\r\n resourceTypes,\r\n globalFilters,\r\n resourceTypeDistribution,\r\n pageSize\r\n })\r\n);\r\n\r\nexport const setGlobalSearchResult = action('setGlobalSearchResult', (data?: IGlobalSearchResultData) => ({ data }));\r\n\r\nexport const setSearchQuery = action('setSearchQuery', (searchQuery: string) => ({ searchQuery }));\r\n\r\nexport const setSearchingStatus = action('setSearchingStatus', (searching: boolean) => ({ searching }));\r\n","import { createStore } from 'satcheljs';\r\nimport { IGlobalSearchCalloutState } from './schema/IGlobalSearchCalloutState';\r\n\r\nexport const getGlobalSearchCalloutStore = createStore<IGlobalSearchCalloutState>('GlobalSearchResultCalloutState', {\r\n searchText: '',\r\n data: { results: [] },\r\n searching: false\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { setGlobalSearchResult, setSearchingStatus, setSearchQuery } from '../actions/onSearchTriggered';\r\nimport { getGlobalSearchCalloutStore } from '../store/store';\r\n\r\nmutator(setGlobalSearchResult, msg => {\r\n const store = getGlobalSearchCalloutStore();\r\n store.data = msg.data;\r\n});\r\n\r\nmutator(setSearchQuery, msg => {\r\n const store = getGlobalSearchCalloutStore();\r\n store.searchText = msg.searchQuery;\r\n});\r\n\r\nmutator(setSearchingStatus, msg => {\r\n getGlobalSearchCalloutStore().searching = msg.searching;\r\n});\r\n","import { handleApiErrors, handleError } from '..';\r\nimport { uiConfig } from '../../config/ui.config';\r\nimport { UserContext } from '../store/schema';\r\nimport { IGlobalSearchResultData } from '../store/schema/interfaces/IGlobalSearchResultData';\r\nimport { GlobalSearchRequest } from '../store/schema/models/GlobalSearchRequest';\r\nimport { GlobalSearchResponse } from '../store/schema/models/GlobalSearchResponse';\r\nimport { buildRequestHeadersWithAuthToken } from '../utils/requestUtils';\r\nimport { ApiError } from './ApiService';\r\n\r\nexport async function postSearch(body: GlobalSearchRequest, userContext?: UserContext): Promise<IGlobalSearchResultData> {\r\n const url = uiConfig.getApiBaseAddress() + '/search';\r\n const headers = await buildRequestHeadersWithAuthToken(url, userContext);\r\n\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: JSON.stringify(body),\r\n });\r\n\r\n if (!response.ok) {\r\n return handleApiErrors<IGlobalSearchResultData>(response, url);\r\n }\r\n\r\n const responseJson: GlobalSearchResponse = await response.json();\r\n if (responseJson.data) {\r\n return responseJson.data;\r\n }\r\n return Promise.resolve({} as IGlobalSearchResultData);\r\n } catch (err) {\r\n const error = `Search operation failed for ${url}. Errors: ${err}`;\r\n return handleError(new ApiError(500, error), url);\r\n }\r\n}\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../logging/src/Log';\r\nimport { getAppStore } from '../../../../@data';\r\nimport { postSearch } from '../../../../@data/services/GlobalSearchApiService';\r\nimport { ResourceType } from '../../../../@data/store/schema/enums/ResourceType';\r\nimport { IGlobalSearchResultData } from '../../../../@data/store/schema/interfaces/IGlobalSearchResultData';\r\nimport { GlobalSearchRequest } from '../../../../@data/store/schema/models/GlobalSearchRequest';\r\nimport { onSearchTriggered, setGlobalSearchResult, setSearchingStatus } from '../actions/onSearchTriggered';\r\nimport { getGlobalSearchCalloutStore } from '../store/store';\r\n\r\norchestrator(onSearchTriggered, async (msg) => {\r\n const { userContext } = getAppStore();\r\n const pageSize = 8;\r\n const resourceTypes: string[] = [];\r\n\r\n if (msg.resourceTypes) {\r\n msg.resourceTypes.map((resourceType: ResourceType) => resourceTypes.push(ResourceType[resourceType]));\r\n }\r\n\r\n const request: GlobalSearchRequest = {\r\n query: msg.query,\r\n globalFilters: [],\r\n resourceTypes: resourceTypes,\r\n options: {\r\n paginationOptions: {\r\n pageSize: msg.pageSize ? msg.pageSize : pageSize,\r\n pageToken: '',\r\n },\r\n resourceTypeDistribution: msg.resourceTypeDistribution,\r\n highlightingOptions: {\r\n highlightPreTag: '<b>',\r\n highlightPostTag: '</b>',\r\n },\r\n },\r\n };\r\n\r\n try {\r\n const response: IGlobalSearchResultData = await postSearch(request, userContext);\r\n if (request.query === getGlobalSearchCalloutStore().searchText) {\r\n setGlobalSearchResult(response);\r\n setSearchingStatus(false);\r\n } else if (getGlobalSearchCalloutStore().searchText === '') {\r\n setSearchingStatus(false);\r\n }\r\n } catch (e) {\r\n Log.error(`Error: ${JSON.stringify(e)}`);\r\n setSearchingStatus(false);\r\n }\r\n});\r\n","import { IPubcenterPalette, IPubcenterSpacing } from '../../../theme';\r\nimport { IGlobalSearchHeaderStyleProps, IGlobalSearchHeaderStyles } from './GlobalSearchHeader.types';\r\n\r\nexport const getStyles = (props: IGlobalSearchHeaderStyleProps): IGlobalSearchHeaderStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const pallete = theme.palette as IPubcenterPalette;\r\n\r\n return {\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: 'inherit',\r\n overflow: 'hidden'\r\n },\r\n wrapper: {\r\n flex: 1,\r\n position: 'relative',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: 'inherit'\r\n },\r\n searchResultHeader: [\r\n 'ms-fontWeight-semibold',\r\n {\r\n height: theme.spacing.l2,\r\n fontSize: theme.fonts.medium.fontSize,\r\n paddingLeft: theme.spacing.m,\r\n color: pallete.themePrimary,\r\n selectors: {\r\n ':hover': {\r\n cursor: 'pointer'\r\n }\r\n }\r\n }\r\n ],\r\n categorySeparator: {\r\n display: 'inline-block',\r\n height: spacing.size12,\r\n borderTop: '1px',\r\n borderTopColor: pallete.neutralLighter,\r\n width: '95%',\r\n marginTop: '0px'\r\n },\r\n entityContainer: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n height: spacing.size48,\r\n selectors: {\r\n ':hover': {\r\n cursor: 'pointer'\r\n }\r\n }\r\n },\r\n iconContainer: {\r\n width: spacing.size64\r\n },\r\n entityIcon: {\r\n fontSize: '28px',\r\n color: theme.palette.neutralDark,\r\n alignItems: 'center',\r\n paddingLeft: theme.spacing.m,\r\n paddingRight: theme.spacing.m,\r\n paddingTop: '10px',\r\n paddingBottom: '10px'\r\n },\r\n entityInfo: [\r\n 'ms-fontSize-Body14',\r\n {\r\n paddingTop: '13px',\r\n paddingBottom: '16px',\r\n color: pallete.neutralPrimary,\r\n height: '19px',\r\n lineHeight: '19px',\r\n alignItems: 'center'\r\n }\r\n ],\r\n textLinkFooter: [\r\n 'ms-fontSize-Body14',\r\n {\r\n display: 'flex',\r\n alignItems: 'center',\r\n height: spacing.size48,\r\n justifyContent: 'center',\r\n color: pallete.themePrimary,\r\n selectors: {\r\n ':hover': {\r\n cursor: 'pointer'\r\n }\r\n }\r\n }\r\n ],\r\n footer: [\r\n 'ms-fontSize-Body14',\r\n {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n color: pallete.neutralPrimary\r\n }\r\n ],\r\n };\r\n};\r\n","import { classNamesFunction, getId, getTheme, Icon, IProcessedStyleSet, nullRender } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { getAppStore, IGlobalSearchResultItem, onLoadingChanged } from '../../@data';\r\nimport { completeAccess, hasReadAccess, UserRoleEntity, userRoleKey } from '../../@data/services/UserRoleService';\r\nimport { ResourceType } from '../../@data/store/schema/enums/ResourceType';\r\nimport { ResourceTypeDistribution } from '../../@data/store/schema/enums/ResourceTypeDistribution';\r\nimport { IGlobalSearchResultData } from '../../@data/store/schema/interfaces/IGlobalSearchResultData';\r\nimport { DropdownMenu as MenuAccessPermissions } from '../../@data/store/schema/userrolemodels/DropdownMenu';\r\nimport { isTythonSelfServeUser } from '../../@data/utils/checkUserType';\r\nimport { Header } from '../../components/Header/Header';\r\nimport { IHeaderItem, PanelTypes } from '../../components/Header/Header.types';\r\nimport { ISearchProps, ISearchResultList } from '../../components/Search/Search.types';\r\nimport { APP_NAME_NEW, APP_NAME_PUBCENTER } from '../../constants/AppConstants';\r\nimport { debounce, useCMUIHelpExperience } from '../../hooks';\r\nimport { AdManagementRouter } from '../../pages/ad-management/AdManagementRouter';\r\nimport { PartnerManagementRouter } from '../../pages/partner-management/PartnerManagementRouter';\r\nimport { ReportRouter } from '../../pages/report/ReportRouter';\r\nimport { DefaultRoute, RoutePrefix } from '../../Routes';\r\nimport { IRoute } from '../../Routes.types';\r\nimport { groupBy, injectRouterAndIntlWithObserver, pluralize } from '../../utils';\r\nimport { isButtonPressKey } from '../../utils/AccessibilityUtils';\r\nimport { getScreenReaderTextStyles } from '../../utils/GlobalStyleUtils';\r\nimport {\r\n FeedbackPanel,\r\n NotificationsPanel,\r\n ProfilePanel,\r\n renderFooterContent,\r\n renderNotificationFooterContent,\r\n} from '../PageLayout/header-panels';\r\nimport { onSearchTriggered, setGlobalSearchResult, setSearchingStatus, setSearchQuery } from './@data/actions/onSearchTriggered';\r\nimport './@data/mutators/searchTriggered';\r\nimport './@data/orchestrators/searchTriggered';\r\nimport { getGlobalSearchCalloutStore } from './@data/store/store';\r\nimport messages from './GlobalSearchHeader.messages';\r\nimport { getStyles } from './GlobalSearchHeader.styles';\r\nimport { IGlobalSearchHeaderProps, IGlobalSearchHeaderStyleProps, IGlobalSearchHeaderStyles } from './GlobalSearchHeader.types';\r\n\r\nconst theme = getTheme();\r\nconst getClassNames = classNamesFunction<IGlobalSearchHeaderStyleProps, IGlobalSearchHeaderStyles>();\r\nconst defaultMinLettersToSearch = 3;\r\nconst globalSearchBaseRoute = '/search';\r\n\r\nconst EntityIconMap = {\r\n Publisher: 'EMI',\r\n Account: 'Work',\r\n User: 'Contact',\r\n AdUnit: 'AdUnit',\r\n Channel: 'AdUnitChannel',\r\n Filter: 'Filter',\r\n WebProperty: 'Favicon',\r\n PublisherByAccount: 'EMI',\r\n PublisherByUser: 'EMI',\r\n PublisherByAdUnit: 'EMI',\r\n PublisherByWebProperty: 'EMI',\r\n PublisherByChannel: 'EMI',\r\n PublisherByFilter: 'EMI',\r\n};\r\n\r\nexport const GlobalSearchHeader = injectRouterAndIntlWithObserver(\r\n class extends React.Component<IGlobalSearchHeaderProps> {\r\n private _classNames: IProcessedStyleSet<IGlobalSearchHeaderStyles>;\r\n\r\n public render(): JSX.Element {\r\n this._classNames = getClassNames(getStyles, { theme });\r\n const userContext = getAppStore().userContext;\r\n let _searchProps: ISearchProps<IGlobalSearchResultItem>;\r\n const layoutStore = getGlobalSearchCalloutStore();\r\n let searchResults: ISearchResultList<IGlobalSearchResultItem>[] = [];\r\n const searchInProgress = layoutStore.searching;\r\n if (layoutStore.data) {\r\n searchResults = this._searchResultToCategories(layoutStore.data);\r\n }\r\n const notifications = getAppStore().panelNotifications;\r\n const headerItems: IHeaderItem[] = [\r\n // {\r\n // key: 'settings',\r\n // icon: 'Settings',\r\n // title: this.props.intl.formatMessage(messages.settings),\r\n // panel: SettingsPanel\r\n // },\r\n // {\r\n // key: 'help',\r\n // icon: 'Help',\r\n // title: this.props.intl.formatMessage(messages.help),\r\n // panel: HelpPanel\r\n // }\r\n ];\r\n if (isTythonSelfServeUser()) {\r\n headerItems.push({\r\n key: 'feedback',\r\n icon: 'Feedback',\r\n title: this.props.intl.formatMessage(messages.feedback, { appName: isTythonSelfServeUser() ? APP_NAME_NEW : APP_NAME_PUBCENTER }),\r\n type: PanelTypes.Feedback,\r\n panel: FeedbackPanel,\r\n panelProps: {\r\n isFooterAtBottom: true,\r\n onRenderFooterContent: renderFooterContent,\r\n },\r\n shouldOverflowUnderExtraSmallScreen: true,\r\n });\r\n }\r\n\r\n if (userContext && userContext.token) {\r\n // show notifications only if user is logged in. Icon shouldn't be shown on other login page\r\n headerItems.push({\r\n key: 'notifications',\r\n icon: 'Notifications',\r\n title: this.props.intl.formatMessage(messages.notifications),\r\n type: PanelTypes.Notifications,\r\n panel: NotificationsPanel,\r\n panelProps: {\r\n isFooterAtBottom: true,\r\n onRenderFooterContent: renderNotificationFooterContent,\r\n },\r\n shouldOverflowUnderExtraSmallScreen: true,\r\n showRedDot: notifications && notifications.length > 0,\r\n });\r\n\r\n headerItems.push({\r\n key: 'profile',\r\n title: this.props.intl.formatMessage(messages.account),\r\n identity: {\r\n name: userContext?.name ?? '',\r\n email: userContext?.email ?? '',\r\n },\r\n type: PanelTypes.Profile,\r\n // @ts-ignore\r\n panel: ProfilePanel,\r\n shouldOverflowUnderExtraSmallScreen: false,\r\n });\r\n }\r\n\r\n const menuAccessPermissions = this._getMenuAccessPermission();\r\n\r\n const newRoutes: IRoute[] = [];\r\n\r\n if (hasReadAccess(menuAccessPermissions === null ? completeAccess : menuAccessPermissions.adManagement)) {\r\n newRoutes.push({\r\n key: `/${RoutePrefix.adManagement}`,\r\n text: 'Ad Management',\r\n icon: 'DocumentManagement',\r\n component: AdManagementRouter,\r\n } as IRoute);\r\n }\r\n\r\n if (hasReadAccess(menuAccessPermissions === null ? completeAccess : menuAccessPermissions.partnerManagment)) {\r\n newRoutes.push({\r\n key: `/${RoutePrefix.partnerManagement}`,\r\n text: 'Partner Management',\r\n icon: 'AccountManagement',\r\n component: PartnerManagementRouter,\r\n } as IRoute);\r\n }\r\n\r\n if (hasReadAccess(menuAccessPermissions === null ? completeAccess : menuAccessPermissions.reporting)) {\r\n newRoutes.push({\r\n key: `/${RoutePrefix.report}`,\r\n text: 'Reporting',\r\n icon: 'CRMReport',\r\n component: ReportRouter,\r\n } as IRoute);\r\n }\r\n\r\n _searchProps = {\r\n searchBoxProps: {\r\n placeholder: this.props.intl.formatMessage(messages.searchPlaceHolder, {\r\n appName: isTythonSelfServeUser() ? APP_NAME_NEW : APP_NAME_PUBCENTER,\r\n }),\r\n onChange: debounce(this._onSearchQueryChange, 300),\r\n onClear: this._onClearSearch,\r\n searchBoxAriaLabel: this.props.intl.formatMessage(messages.searchBoxAriaLabel),\r\n },\r\n minLettersToSearch: defaultMinLettersToSearch,\r\n searchInProgress: searchInProgress,\r\n onRenderSearchResult: this._onRenderSearchResult,\r\n onRenderSearchResultFooter: this._onRenderSearchCalloutFooter,\r\n searchResultList: searchResults,\r\n searchResultListAriaLabel: this.props.intl.formatMessage(messages.searchResultListAriaLabel),\r\n };\r\n\r\n return (\r\n <Header\r\n intl={this.props.intl}\r\n items={headerItems}\r\n searchProps={_searchProps}\r\n dropdownItems={newRoutes}\r\n onNavigate={(path) => this.props.history.push(path)}\r\n renderLeftIcon={this.props.renderLeftMost}\r\n useCMUIHelpExperience={useCMUIHelpExperience()}\r\n />\r\n );\r\n }\r\n\r\n private _searchResultToCategories = (searchResult: IGlobalSearchResultData): ISearchResultList<IGlobalSearchResultItem>[] => {\r\n const retVal: ISearchResultList<IGlobalSearchResultItem>[] = [];\r\n if (searchResult.results.length > 0) {\r\n // Group all search results into bucket of entity type\r\n const searchResultByCategory = groupBy(searchResult.results, (item) => item.resourceType);\r\n searchResultByCategory.forEach((item) => {\r\n const entityType = item[0];\r\n // Create a category of the entity type\r\n const searchCategory: ISearchResultList<IGlobalSearchResultItem> = {\r\n categoryName: entityType,\r\n totalCount: searchResult.resultMetadata ? searchResult.resultMetadata.ResultCountPerResourceType[entityType] : 0,\r\n searchResults: [],\r\n };\r\n const categoryItems = item[1];\r\n // Create entities and push them to list\r\n categoryItems.forEach((resultItem) => {\r\n const searchResultItem: IGlobalSearchResultItem = {\r\n name: resultItem.resourceName,\r\n id: resultItem.resourceId,\r\n icon: EntityIconMap[resultItem.resourceType],\r\n };\r\n const publisherId: string = resultItem.propertyBag ? resultItem.propertyBag.PublisherId : '';\r\n const accountId: string = resultItem.propertyBag ? resultItem.propertyBag.AccountId : '';\r\n searchResultItem.route = this._createRoutePath(entityType, resultItem.resourceId, publisherId, accountId);\r\n searchResultItem.onClick = (url: string) => {\r\n if (resultItem.propertyBag) {\r\n onLoadingChanged(true);\r\n this.props.history.push(url);\r\n }\r\n };\r\n searchCategory.searchResults && searchCategory.searchResults.push(searchResultItem);\r\n });\r\n retVal.push(searchCategory);\r\n });\r\n }\r\n return retVal;\r\n };\r\n\r\n private _createRoutePath = (entityType: string, entityId: string, publisherId: string, accountId: string): string => {\r\n let route = '';\r\n\r\n switch (entityType) {\r\n case 'AdUnit':\r\n case 'AdUnitByProperty': {\r\n if (publisherId && accountId) {\r\n route = `${DefaultRoute}/${publisherId}-${accountId}/adunit/edit/${entityId}`;\r\n }\r\n break;\r\n }\r\n case 'Channel': {\r\n if (publisherId && accountId) {\r\n route = `${DefaultRoute}/${publisherId}-${accountId}/channel/edit/${entityId}`;\r\n }\r\n break;\r\n }\r\n case 'WebProperty':\r\n case 'PropertyByAdUnit': {\r\n if (publisherId) {\r\n route = `${DefaultRoute}/${publisherId}/property/edit/${entityId}`;\r\n }\r\n break;\r\n }\r\n case 'Filter': {\r\n if (publisherId && accountId) {\r\n route = `${DefaultRoute}/${publisherId}-${accountId}/adfilter/edit/${entityId}`;\r\n }\r\n break;\r\n }\r\n case 'Publisher':\r\n case 'PublisherByAccount':\r\n case 'PublisherByUser':\r\n case 'PublisherByAdUnit':\r\n case 'PublisherByWebProperty':\r\n case 'PublisherByChannel':\r\n case 'PublisherByFilter': {\r\n route = `/${RoutePrefix.partnerManagement}/${entityId}/publisher/edit/${entityId}`;\r\n break;\r\n }\r\n case 'Account': {\r\n route = `/${RoutePrefix.partnerManagement}/${publisherId}/account/edit/${entityId}`;\r\n break;\r\n }\r\n case 'User': {\r\n route = `/${RoutePrefix.partnerManagement}/${publisherId}/user/edit/${entityId}`;\r\n break;\r\n }\r\n default: {\r\n route = `${DefaultRoute}`;\r\n }\r\n }\r\n return route;\r\n };\r\n\r\n private _onSearchQueryChange = (value: string, minLettersToSearch: number): void => {\r\n if (value.length >= minLettersToSearch) {\r\n setSearchQuery(value);\r\n setSearchingStatus(true);\r\n const resourceTypes: ResourceType[] = [\r\n ResourceType.AdUnit,\r\n ResourceType.Filter,\r\n ResourceType.Channel,\r\n ResourceType.WebProperty,\r\n ResourceType.Publisher,\r\n ResourceType.Account,\r\n ResourceType.User,\r\n ];\r\n onSearchTriggered(value, resourceTypes, undefined, ResourceTypeDistribution.DynamicBucketSize);\r\n } else {\r\n setSearchQuery(value);\r\n const emptyResult: IGlobalSearchResultData = { results: [] };\r\n setGlobalSearchResult(emptyResult);\r\n }\r\n };\r\n\r\n private _onClearSearch = (): void => {\r\n setSearchQuery('');\r\n setSearchingStatus(false);\r\n const emptyResult: IGlobalSearchResultData = { results: [] };\r\n setGlobalSearchResult(emptyResult);\r\n };\r\n\r\n private _onViewMoreResultClicked = (searchText: string, filter?: string): void => {\r\n let sourceRef = '';\r\n for (const route in RoutePrefix) {\r\n if (this.props.location.pathname.search(RoutePrefix[route]) >= 0) {\r\n sourceRef = RoutePrefix[route];\r\n break;\r\n }\r\n }\r\n this.props.history.push(encodeURI(`${globalSearchBaseRoute}?q=${searchText}&filter=${filter}&sourceRef=${sourceRef}`));\r\n };\r\n\r\n private _onRenderSearchResult = (searchResultCategory?: ISearchResultList<IGlobalSearchResultItem>): JSX.Element | null => {\r\n const searchQuery = getGlobalSearchCalloutStore().searchText;\r\n const searchResultHeaderDescId = getId('searchResultHeader');\r\n\r\n if (searchResultCategory) {\r\n return (\r\n <>\r\n <div\r\n className={this._classNames.searchResultHeader}\r\n tabIndex={-1}\r\n role=\"option\"\r\n aria-selected={false}\r\n onClick={() => this._onViewMoreResultClicked(searchQuery, searchResultCategory.categoryName)}\r\n onKeyDown={(ev) => {\r\n if (isButtonPressKey(ev.key)) {\r\n this._onViewMoreResultClicked(searchQuery, searchResultCategory.categoryName);\r\n }\r\n }}\r\n aria-describedby={searchResultHeaderDescId}\r\n data-is-focusable={true}\r\n >\r\n {this.props.intl.formatMessage(messages.viewCategoryResult, {\r\n category: pluralize(searchResultCategory.categoryName),\r\n totalCount: searchResultCategory.totalCount,\r\n })}\r\n </div>\r\n {searchResultCategory.searchResults\r\n ? searchResultCategory.searchResults.map((item: IGlobalSearchResultItem, index: number) =>\r\n this._onRenderCell(item, searchQuery, index)\r\n )\r\n : []}\r\n <hr className={this._classNames.categorySeparator} />\r\n\r\n <span id={searchResultHeaderDescId} style={getScreenReaderTextStyles()}>\r\n {this.props.intl.formatMessage(messages.viewCategoryResultsAriaDescription, {\r\n categoryName: searchResultCategory.categoryName,\r\n })}\r\n </span>\r\n </>\r\n );\r\n } else {\r\n return nullRender();\r\n }\r\n };\r\n\r\n private _onRenderCell = (item: IGlobalSearchResultItem, searchQuery: string, index: number): JSX.Element => {\r\n const cellDescId = getId('searchResult');\r\n return (\r\n <div\r\n className={this._classNames.entityContainer}\r\n key={'searchResultOption-' + index}\r\n role=\"option\"\r\n aria-selected={false}\r\n tabIndex={-1}\r\n onClick={() => this._onItemClicked(item)}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key) && this._onItemClicked(item)}\r\n aria-describedby={cellDescId}\r\n data-is-focusable={true}\r\n >\r\n <Icon className={this._classNames.entityIcon} iconName={item.icon} />\r\n <span className={this._classNames.entityInfo}>{this._getHighlightedText(item.name + ' - ' + item.id, searchQuery)}</span>\r\n\r\n <span id={cellDescId} style={getScreenReaderTextStyles()}>\r\n {this.props.intl.formatMessage(messages.entityInfoButtonAriaDescription)}\r\n </span>\r\n </div>\r\n );\r\n };\r\n\r\n private _getHighlightedText = (text: string, highlight: string): JSX.Element => {\r\n const parts = text.split(new RegExp(`(${highlight})`, 'gi'));\r\n return (\r\n <span>\r\n {' '}\r\n {parts.map((part, i) => (\r\n <span key={i} style={part.toLowerCase() === highlight.toLowerCase() ? { fontWeight: 'bold' } : {}}>\r\n {part}\r\n </span>\r\n ))}{' '}\r\n </span>\r\n );\r\n };\r\n\r\n private _onItemClicked = (item: IGlobalSearchResultItem): void => {\r\n if (item.onClick && item.route) {\r\n item.onClick(item.route);\r\n }\r\n };\r\n\r\n private _onRenderSearchCalloutFooter = (): JSX.Element => {\r\n const searchQuery = getGlobalSearchCalloutStore().searchText;\r\n const searchResult = getGlobalSearchCalloutStore().data;\r\n const elementId = getId('searchCalloutFooter');\r\n\r\n return (\r\n <>\r\n {!!searchResult && searchResult.results!.length > 0 && (\r\n <div\r\n className={this._classNames.textLinkFooter}\r\n role=\"button\"\r\n tabIndex={-1}\r\n onClick={() => this._onViewMoreResultClicked(searchQuery, 'all')}\r\n onKeyDown={(ev) => isButtonPressKey(ev.key) && this._onViewMoreResultClicked(searchQuery, 'all')}\r\n aria-describedby={elementId}\r\n data-is-focusable={true}\r\n >\r\n {this.props.intl.formatMessage(messages.viewAllResult, { searchQuery: searchQuery })}\r\n </div>\r\n )}\r\n {!searchResult ||\r\n (searchResult.results!.length === 0 && searchQuery.length >= defaultMinLettersToSearch && (\r\n <div className={this._classNames.footer} data-is-focusable>\r\n {this.props.intl.formatMessage(messages.viewNoResult, { searchQuery: searchQuery })}\r\n </div>\r\n ))}\r\n <span id={elementId} style={getScreenReaderTextStyles()}>\r\n {this.props.intl.formatMessage(messages.footerAriaDescription)}\r\n </span>\r\n </>\r\n );\r\n };\r\n\r\n private _getMenuAccessPermission(): MenuAccessPermissions | null {\r\n const userRoles = localStorage.getItem(userRoleKey);\r\n if (userRoles === null) {\r\n return null;\r\n }\r\n const userRolesJSON = JSON.parse(userRoles);\r\n\r\n for (const value in userRolesJSON) {\r\n if (value === UserRoleEntity.DropdownMenu) {\r\n return JSON.parse(userRolesJSON[value]);\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n }\r\n);\r\n","import { IPubcenterSpacing } from '../../../theme';\r\nimport { IPageLayoutStyleProps, IPageLayoutStyles } from './PageLayout.types';\r\n\r\nexport const getStyles = (props: IPageLayoutStyleProps): IPageLayoutStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return {\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: 'inherit',\r\n overflow: 'hidden',\r\n },\r\n wrapper: {\r\n flex: 1,\r\n position: 'relative',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: 'inherit',\r\n overflowY: 'auto',\r\n overflowX: 'hidden',\r\n },\r\n supportButtonWrapper: {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n },\r\n supportButton: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n marginRight: spacing.size12,\r\n img: {\r\n marginRight: spacing.size6,\r\n },\r\n },\r\n spinnerStyle: {\r\n flex: 1,\r\n display: 'flex',\r\n selectors: {\r\n '.ms-Spinner-circle': {\r\n height: 67,\r\n width: 67,\r\n },\r\n },\r\n },\r\n overlayStyle: {\r\n flex: 1,\r\n display: 'flex',\r\n position: 'fixed',\r\n backgroundColor: 'white',\r\n zIndex: 9999999,\r\n },\r\n };\r\n};\r\n","import { IProcessedStyleSet, Overlay, classNamesFunction, getTheme } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { IAppState, getAppStore, isPublisherRejectionUnappealable, isTythonSelfServeUser } from '../../@data';\r\nimport AppMessages from '../../App.messages';\r\nimport { SupportPageRoute } from '../../Routes';\r\nimport { PageSpinner } from '../../components/Spinners';\r\nimport { LOCAL_STORAGE_LOCALE, TYTHON_DOMAIN_REDIRECTION_CACHE_KEY } from '../../constants/AppConstants';\r\nimport { useWindowSize } from '../../hooks';\r\nimport { getAdManagementStore } from '../../pages/ad-management/@data';\r\nimport '../../pages/ad-management/@data/actions';\r\nimport LoginPageMessages from '../../pages/login/LoginPage.messages';\r\nimport { RedirectionSpinner } from '../../pages/login/components/RedirectionSpinner';\r\nimport { injectIntlWithObserver } from '../../utils';\r\nimport { GlobalSearchHeader } from '../GlobalSearchHeader/GlobalSearchHeader';\r\nimport { getStyles } from './PageLayout.styles';\r\nimport { IPageLayoutProps, IPageLayoutStyleProps, IPageLayoutStyles } from './PageLayout.types';\r\nconst theme = getTheme();\r\nconst getClassNames = classNamesFunction<IPageLayoutStyleProps, IPageLayoutStyles>();\r\n\r\nconst { onWindowResize } = useWindowSize();\r\n/**\r\n * PageLayout component is used to render the outermost layout of the application.\r\n * This layout renders the global search header, page level overlay spinner, and footer.\r\n */\r\nexport const Page = injectIntlWithObserver(\r\n class PageLayout extends React.Component<IPageLayoutProps> {\r\n private _classNames: IProcessedStyleSet<IPageLayoutStyles>;\r\n\r\n public handleResize = () => {\r\n onWindowResize(window);\r\n };\r\n\r\n public componentDidMount() {\r\n window.addEventListener('resize', this.handleResize);\r\n }\r\n\r\n public componentWillUnmount() {\r\n window.removeEventListener('resize', this.handleResize);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const appStore = getAppStore();\r\n this._classNames = getClassNames(getStyles, { theme });\r\n\r\n // Show spinner until publisher info is fetched from the backend\r\n if (appStore.loading && appStore.defaultPublisher !== 0 && !appStore.publisher) {\r\n return this._renderSpinner(appStore);\r\n }\r\n\r\n /** Do not render new UI content until publisher info fetched\r\n * Tython Publisher will be redirected to homePage\r\n * Non-Tython MSA user is redirected to the reporting dashboard\r\n */\r\n if (getAdManagementStore().doNotRenderDefaultPage) {\r\n return this._renderSpinner(appStore);\r\n }\r\n\r\n const localStorageLocal = localStorage.getItem(LOCAL_STORAGE_LOCALE);\r\n\r\n return (\r\n <div className={this._classNames.root}>\r\n {isPublisherRejectionUnappealable() && this.props.location.pathname !== SupportPageRoute && <Overlay style={{ zIndex: 9999 }} />}\r\n <div style={{ zIndex: isPublisherRejectionUnappealable() ? 99999 : undefined }}>\r\n <GlobalSearchHeader renderLeftMost={this.props.renderLeftMostSection} />\r\n </div>\r\n <div className={this._classNames.wrapper}>{this.props.children}</div>\r\n {(appStore.loading || (isTythonSelfServeUser() && !localStorageLocal)) &&\r\n this._renderSpinner(appStore, isTythonSelfServeUser() && !localStorageLocal)}\r\n </div>\r\n );\r\n }\r\n\r\n private _renderSpinner = (appStore: IAppState, renderWhiteBackground?: boolean): JSX.Element => {\r\n return sessionStorage.getItem(TYTHON_DOMAIN_REDIRECTION_CACHE_KEY) === 'true' ? (\r\n <RedirectionSpinner label={this.props.intl.formatMessage(LoginPageMessages.redirectionMessage)} />\r\n ) : (\r\n <PageSpinner\r\n styleProps={{\r\n overlayStyle: renderWhiteBackground ? this._classNames.overlayStyle : undefined,\r\n }}\r\n label={this.props.intl.formatMessage(appStore.waiting ? AppMessages.loadingWaitingLabel : AppMessages.loadingLabel)}\r\n />\r\n );\r\n };\r\n }\r\n);\r\n","import { action } from 'satcheljs';\r\nimport { ISearchResultInfo } from '../store/schema/IGlobalSearchResultPageState';\r\n\r\nexport const onSearchTriggered = action('onSearchTriggered', (resourceType?: string) => ({ resourceType }));\r\n\r\nexport const setData = action('setData', (results: Map<string, ISearchResultInfo>, resourceTypes: Map<string, number>) => ({\r\n results,\r\n resourceTypes\r\n}));\r\n\r\nexport const setSearchParams = action('setSearchParams', (query: string, sourceRef?: string) => ({ query, sourceRef }));\r\n\r\nexport const showMoreLoading = action('showMoreLoading', (resourceType: string, value: boolean) => ({ resourceType, value }));\r\n\r\nexport const clearStore = action('clearStore');\r\n","import { createStore } from 'satcheljs';\r\nimport { IGlobalSearchResultPageState, ISearchResultInfo } from './schema/IGlobalSearchResultPageState';\r\n\r\nexport enum Filters {\r\n adunits,\r\n adfilters,\r\n channels,\r\n publishers,\r\n reporting,\r\n properties,\r\n accounts,\r\n users\r\n}\r\n\r\nexport const getStore = createStore<IGlobalSearchResultPageState>('GlobalSearchResultPageState', {\r\n resourceTypes: new Map<string, number>(),\r\n results: new Map<string, ISearchResultInfo>(),\r\n isShowMoreLoading: new Map<string, boolean>(),\r\n searchQuery: '',\r\n sourceRef: ''\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { getAppStore } from '../../../../@data';\r\nimport { clearStore, setData, setSearchParams, showMoreLoading } from '../actions/onSearchTriggered';\r\nimport { ISearchResultInfo } from '../store/schema/IGlobalSearchResultPageState';\r\nimport { getStore } from '../store/store';\r\n\r\nmutator(setData, msg => {\r\n const store = getStore();\r\n const appStore = getAppStore();\r\n\r\n msg.results.forEach((searchResultInfo: ISearchResultInfo, key: string) => {\r\n const resultInfo = store.results.get(key);\r\n if (resultInfo) {\r\n resultInfo.pageToken = searchResultInfo.pageToken;\r\n resultInfo.resultData = resultInfo.resultData.concat(searchResultInfo.resultData);\r\n store.results.set(key, resultInfo);\r\n } else {\r\n store.results.set(key, searchResultInfo);\r\n }\r\n });\r\n msg.resourceTypes.forEach((value: number, key: string) => {\r\n if (value) {\r\n store.resourceTypes.set(key, value);\r\n }\r\n });\r\n appStore.loading = false;\r\n});\r\n\r\nmutator(setSearchParams, msg => {\r\n const store = getStore();\r\n store.searchQuery = msg.query;\r\n store.sourceRef = msg.sourceRef;\r\n});\r\n\r\nmutator(showMoreLoading, msg => {\r\n const store = getStore();\r\n store.isShowMoreLoading.set(msg.resourceType, msg.value);\r\n});\r\n\r\nmutator(clearStore, () => {\r\n getStore().resourceTypes.clear();\r\n getStore().isShowMoreLoading.clear();\r\n getStore().results.clear();\r\n getStore().searchQuery = '';\r\n});\r\n","export abstract class SearchResult {\r\n constructor(public name?: string, public id?: string, public iconName?: string) {}\r\n public abstract getPublisherId(): string;\r\n public abstract getAccountId(): string;\r\n public abstract getResourceType(): string;\r\n}\r\n","import { ResourceType } from '../../../../../../@data/store/schema/enums/ResourceType';\r\nimport { IGlobalSearchResult } from '../../../../../../@data/store/schema/interfaces/IGlobalSearchResult';\r\nimport { SearchResult } from './SearchResult';\r\n\r\nexport class Account extends SearchResult {\r\n public createdDate?: string;\r\n public status?: string;\r\n private _item: IGlobalSearchResult;\r\n\r\n constructor(item?: IGlobalSearchResult) {\r\n super(item && item.resourceName, item && item.resourceId, 'Work');\r\n if (item) {\r\n this.createdDate = item.propertyBag && item.propertyBag.CreationDateTime;\r\n this.status = item.propertyBag && item.propertyBag.Status;\r\n this._item = item;\r\n }\r\n }\r\n\r\n public getPublisherId(): string {\r\n if (this._item && this._item.propertyBag && this._item.propertyBag.PublisherId) {\r\n return this._item.propertyBag.PublisherId;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n public getAccountId(): string {\r\n if (this._item && this._item.propertyBag && this._item.propertyBag.AccountId) {\r\n return this._item.propertyBag.AccountId;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n public getResourceType(): string {\r\n return ResourceType[ResourceType.Account];\r\n }\r\n}\r\n","import { ResourceType } from '../../../../../../@data/store/schema/enums/ResourceType';\r\nimport { IGlobalSearchResult } from '../../../../../../@data/store/schema/interfaces/IGlobalSearchResult';\r\nimport { SearchResult } from './SearchResult';\r\n\r\nexport class AdFilter extends SearchResult {\r\n public numberOfExcludedURLs?: string;\r\n public numberOfExcludedKeywords?: string;\r\n private _item: IGlobalSearchResult;\r\n\r\n constructor(item?: IGlobalSearchResult) {\r\n super(item && item.resourceName, item && item.resourceId, 'Filter');\r\n if (item) {\r\n this.numberOfExcludedURLs = item.propertyBag && item.propertyBag.NumberOfExcludedURLs;\r\n this.numberOfExcludedKeywords = item.propertyBag && item.propertyBag.NumberOfExcludedKeywords;\r\n this._item = item;\r\n }\r\n }\r\n\r\n public getPublisherId(): string {\r\n if (this._item && this._item.propertyBag && this._item.propertyBag.PublisherId) {\r\n return this._item.propertyBag.PublisherId;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n public getAccountId(): string {\r\n if (this._item && this._item.propertyBag && this._item.propertyBag.AccountId) {\r\n return this._item.propertyBag.AccountId;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n public getResourceType(): string {\r\n return ResourceType[ResourceType.Filter];\r\n }\r\n}\r\n","import { ResourceType } from '../../../../../../@data/store/schema/enums/ResourceType';\r\nimport { IGlobalSearchResult } from '../../../../../../@data/store/schema/interfaces/IGlobalSearchResult';\r\nimport { SearchResult } from './SearchResult';\r\n\r\nexport class AdUnit extends SearchResult {\r\n public numberOfChannels?: number;\r\n public status?: string;\r\n private _item: IGlobalSearchResult;\r\n\r\n constructor(item?: IGlobalSearchResult) {\r\n super(item && item.resourceName, item && item.resourceId, 'AdUnit');\r\n if (item) {\r\n this.numberOfChannels = item.propertyBag && item.propertyBag.NumberOfChannels;\r\n this.status = item.propertyBag && item.propertyBag.Status;\r\n this._item = item;\r\n }\r\n }\r\n\r\n public getPublisherId(): string {\r\n if (this._item && this._item.propertyBag && this._item.propertyBag.PublisherId) {\r\n return this._item.propertyBag.PublisherId;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n public getAccountId(): string {\r\n if (this._item && this._item.propertyBag && this._item.propertyBag.AccountId) {\r\n return this._item.propertyBag.AccountId;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n public getResourceType(): string {\r\n return ResourceType[ResourceType.AdUnit];\r\n }\r\n}\r\n","import { ResourceType } from '../../../../../../@data/store/schema/enums/ResourceType';\r\nimport { IGlobalSearchResult } from '../../../../../../@data/store/schema/interfaces/IGlobalSearchResult';\r\nimport { SearchResult } from './SearchResult';\r\n\r\nexport class Channel extends SearchResult {\r\n public numberOfAdunits?: number;\r\n public numberOfAdFilters?: number;\r\n private _item: IGlobalSearchResult;\r\n\r\n constructor(item?: IGlobalSearchResult) {\r\n super(item && item.resourceName, item && item.resourceId, 'AdUnitChannel');\r\n if (item) {\r\n this.numberOfAdunits = item.propertyBag && item.propertyBag.NumberOfAdunits;\r\n this.numberOfAdFilters = item.propertyBag && item.propertyBag.NumberOfAdFilters;\r\n this._item = item;\r\n }\r\n }\r\n\r\n public getPublisherId(): string {\r\n if (this._item && this._item.propertyBag && this._item.propertyBag.PublisherId) {\r\n return this._item.propertyBag.PublisherId;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n public getAccountId(): string {\r\n if (this._item && this._item.propertyBag && this._item.propertyBag.AccountId) {\r\n return this._item.propertyBag.AccountId;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n public getResourceType(): string {\r\n return ResourceType[ResourceType.Channel];\r\n }\r\n}\r\n","import { ResourceType } from '../../../../../../@data/store/schema/enums/ResourceType';\r\nimport { IGlobalSearchResult } from '../../../../../../@data/store/schema/interfaces/IGlobalSearchResult';\r\nimport { SearchResult } from './SearchResult';\r\n\r\nexport class Publisher extends SearchResult {\r\n public createdDate?: string;\r\n public lastModifiedDateTime?: string;\r\n public notes: string;\r\n private _item: IGlobalSearchResult;\r\n\r\n constructor(item?: IGlobalSearchResult) {\r\n super(item && item.resourceName, item && item.resourceId, 'EMI');\r\n if (item) {\r\n this.createdDate = item.propertyBag && item.propertyBag.CreationDateTime;\r\n this.lastModifiedDateTime = item.propertyBag && item.propertyBag.LastModifiedDateTime;\r\n this.notes = item.resourceType;\r\n this._item = item;\r\n }\r\n }\r\n\r\n public getPublisherId(): string {\r\n if (this._item && this._item.propertyBag && this._item.propertyBag.PublisherId) {\r\n return this._item.propertyBag.PublisherId;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n public getAccountId(): string {\r\n if (this._item && this._item.propertyBag && this._item.propertyBag.AccountId) {\r\n return this._item.propertyBag.AccountId;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n public getResourceType(): string {\r\n return ResourceType[ResourceType.Publisher];\r\n }\r\n}\r\n","import { ResourceType } from '../../../../../../@data/store/schema/enums/ResourceType';\r\nimport { IGlobalSearchResult } from '../../../../../../@data/store/schema/interfaces/IGlobalSearchResult';\r\nimport { SearchResult } from './SearchResult';\r\n\r\nexport class User extends SearchResult {\r\n public fullName?: string;\r\n public publisherName?: string;\r\n private _item: IGlobalSearchResult;\r\n\r\n constructor(item?: IGlobalSearchResult) {\r\n super(item && item.resourceName, item && item.resourceId, 'Contact');\r\n if (item) {\r\n this.fullName = item.propertyBag && item.propertyBag.FullName;\r\n this.publisherName = item.propertyBag && item.propertyBag.PublisherName;\r\n this._item = item;\r\n }\r\n }\r\n\r\n public getPublisherId(): string {\r\n if (this._item && this._item.propertyBag && this._item.propertyBag.PublisherId) {\r\n return this._item.propertyBag.PublisherId;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n public getAccountId(): string {\r\n if (this._item && this._item.propertyBag && this._item.propertyBag.AccountId) {\r\n return this._item.propertyBag.AccountId;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n public getResourceType(): string {\r\n return ResourceType[ResourceType.User];\r\n }\r\n}\r\n","import { ResourceType } from '../../../../../../@data/store/schema/enums/ResourceType';\r\nimport { IGlobalSearchResult } from '../../../../../../@data/store/schema/interfaces/IGlobalSearchResult';\r\nimport { SearchResult } from './SearchResult';\r\n\r\nexport class WebProperty extends SearchResult {\r\n public publisherName?: string;\r\n public websiteURL?: string;\r\n private _item: IGlobalSearchResult;\r\n\r\n constructor(item?: IGlobalSearchResult) {\r\n super(item && item.resourceName, item && item.resourceId, 'BusinessHoursSign');\r\n if (item) {\r\n this.websiteURL = item.propertyBag && item.propertyBag.WebSiteURL;\r\n this.publisherName = item.propertyBag && item.propertyBag.PublisherName;\r\n this._item = item;\r\n }\r\n }\r\n\r\n public getPublisherId(): string {\r\n if (this._item && this._item.propertyBag && this._item.propertyBag.PublisherId) {\r\n return this._item.propertyBag.PublisherId;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n public getAccountId(): string {\r\n if (this._item && this._item.propertyBag && this._item.propertyBag.AccountId) {\r\n return this._item.propertyBag.AccountId;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n public getResourceType(): string {\r\n return ResourceType[ResourceType.WebProperty];\r\n }\r\n}\r\n","import { crossEntityResourceTypeMap, ResourceType } from '../../../../@data/store/schema/enums/ResourceType';\r\nimport { IGlobalSearchResult } from '../../../../@data/store/schema/interfaces/IGlobalSearchResult';\r\nimport { IGlobalSearchResultData } from '../../../../@data/store/schema/interfaces/IGlobalSearchResultData';\r\nimport { RoutePrefix } from '../../../../Routes';\r\nimport { ISearchResultInfo } from '../store/schema/IGlobalSearchResultPageState';\r\nimport { Account, AdFilter, AdUnit, Channel, Publisher, User, WebProperty } from '../store/schema/models/Index';\r\n\r\nconst resourceTypePriorityMap = new Map<string, string[]>([\r\n [\r\n RoutePrefix.adManagement,\r\n [\r\n ResourceType[ResourceType.Filter],\r\n ResourceType[ResourceType.Channel],\r\n ResourceType[ResourceType.AdUnit],\r\n ResourceType[ResourceType.WebProperty],\r\n ResourceType[ResourceType.Reporting],\r\n ResourceType[ResourceType.Account],\r\n ResourceType[ResourceType.Publisher],\r\n ResourceType[ResourceType.User]\r\n ]\r\n ],\r\n [\r\n RoutePrefix.partnerManagement,\r\n [\r\n ResourceType[ResourceType.Account],\r\n ResourceType[ResourceType.Publisher],\r\n ResourceType[ResourceType.User],\r\n ResourceType[ResourceType.Reporting],\r\n ResourceType[ResourceType.Filter],\r\n ResourceType[ResourceType.Channel],\r\n ResourceType[ResourceType.AdUnit],\r\n ResourceType[ResourceType.WebProperty]\r\n ]\r\n ],\r\n [\r\n RoutePrefix.report,\r\n [\r\n ResourceType[ResourceType.Reporting],\r\n ResourceType[ResourceType.Filter],\r\n ResourceType[ResourceType.Channel],\r\n ResourceType[ResourceType.AdUnit],\r\n ResourceType[ResourceType.WebProperty],\r\n ResourceType[ResourceType.Account],\r\n ResourceType[ResourceType.Publisher],\r\n ResourceType[ResourceType.User]\r\n ]\r\n ]\r\n]);\r\n\r\nexport function buildSearchResults(data: IGlobalSearchResultData): ISearchResultInfo {\r\n const searchResultInfo: ISearchResultInfo = { pageToken: '', resultData: [] };\r\n const publisherCrossEntities = crossEntityResourceTypeMap.get(ResourceType[ResourceType.Publisher]);\r\n if (data.results.length > 0) {\r\n // eslint-disable-next-line\r\n data.results.map((item: IGlobalSearchResult) => {\r\n if (item.resourceType === ResourceType[ResourceType.Account]) {\r\n const searchResult = new Account(item);\r\n searchResultInfo.resultData.push(searchResult);\r\n } else if (item.resourceType === ResourceType[ResourceType.AdUnit]) {\r\n const searchResult = new AdUnit(item);\r\n searchResultInfo.resultData.push(searchResult);\r\n } else if (item.resourceType === ResourceType[ResourceType.Filter]) {\r\n const searchResult = new AdFilter(item);\r\n searchResultInfo.resultData.push(searchResult);\r\n } else if (item.resourceType === ResourceType[ResourceType.Channel]) {\r\n const searchResult = new Channel(item);\r\n searchResultInfo.resultData.push(searchResult);\r\n } else if (item.resourceType === ResourceType[ResourceType.WebProperty]) {\r\n const searchResult = new WebProperty(item);\r\n searchResultInfo.resultData.push(searchResult);\r\n } else if (item.resourceType === ResourceType[ResourceType.Publisher]) {\r\n const searchResult = new Publisher(item);\r\n searchResultInfo.resultData.push(searchResult);\r\n } else if (item.resourceType === ResourceType[ResourceType.User]) {\r\n const searchResult = new User(item);\r\n searchResultInfo.resultData.push(searchResult);\r\n } else if (publisherCrossEntities && publisherCrossEntities.find((value: string) => value === item.resourceType)) {\r\n const searchResult = new Publisher(item);\r\n searchResultInfo.resultData.push(searchResult);\r\n }\r\n });\r\n }\r\n searchResultInfo.pageToken = data.resultMetadata ? data.resultMetadata.NextPageToken : '';\r\n return searchResultInfo;\r\n}\r\n\r\nexport function getOrderedResources(resourceTypes: Map<string, number>, routePrefix: string): Map<string, number> {\r\n const orderedResourceTypesMap = new Map<string, number>();\r\n const orderedResourceTypes = resourceTypePriorityMap.get(routePrefix);\r\n\r\n if (orderedResourceTypes) {\r\n orderedResourceTypes.forEach((resource: string) => {\r\n const value = resourceTypes.get(resource);\r\n if (value) {\r\n orderedResourceTypesMap.set(resource, value);\r\n resourceTypes.delete(resource);\r\n }\r\n });\r\n\r\n resourceTypes.forEach((value: number, resource: string) => {\r\n orderedResourceTypesMap.set(resource, value);\r\n });\r\n\r\n return orderedResourceTypesMap;\r\n }\r\n\r\n return resourceTypes;\r\n}\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../logging/src/Log';\r\nimport { getAppStore, onLoadingChanged } from '../../../../@data';\r\nimport { postSearch } from '../../../../@data/services/GlobalSearchApiService';\r\nimport { ResourceType } from '../../../../@data/store/schema/enums/ResourceType';\r\nimport { ResourceTypeDistribution } from '../../../../@data/store/schema/enums/ResourceTypeDistribution';\r\nimport { IGlobalSearchResultData } from '../../../../@data/store/schema/interfaces/IGlobalSearchResultData';\r\nimport { GlobalSearchRequest } from '../../../../@data/store/schema/models/GlobalSearchRequest';\r\nimport { getEnumNames } from '../../../../utils';\r\nimport { onSearchTriggered, setData, showMoreLoading } from '../actions/onSearchTriggered';\r\nimport { buildSearchResults, getOrderedResources } from '../services/GlobalSearchHelperService';\r\nimport { ISearchResultInfo } from '../store/schema/IGlobalSearchResultPageState';\r\nimport { getStore } from '../store/store';\r\n\r\nconst defaultPageToken = '';\r\nconst defaultPageSize = 5;\r\nconst showMorePagesize = 20;\r\n\r\norchestrator(onSearchTriggered, async (msg) => {\r\n const { userContext } = getAppStore();\r\n const store = getStore();\r\n let resourceTypes: string[] = [];\r\n let pageSize: number;\r\n let pageToken = '';\r\n\r\n if (msg.resourceType) {\r\n pageSize = showMorePagesize;\r\n const searchResultInfo = store.results.get(msg.resourceType);\r\n resourceTypes.push(msg.resourceType);\r\n if (searchResultInfo) {\r\n pageToken = searchResultInfo.pageToken;\r\n }\r\n showMoreLoading(msg.resourceType, true);\r\n } else {\r\n pageSize = defaultPageSize;\r\n pageToken = defaultPageToken;\r\n resourceTypes = getEnumNames(ResourceType);\r\n onLoadingChanged(true);\r\n }\r\n\r\n try {\r\n const promiseResponses: Promise<IGlobalSearchResultData>[] = [];\r\n for (const resource of resourceTypes) {\r\n const reqResourceTypes = [resource];\r\n /* const crossEntityResourceTypes = crossEntityResourceTypeMap.get(resource);\r\n if (crossEntityResourceTypes) {\r\n // eslint-disable-next-line\r\n crossEntityResourceTypes.map((resourceType: string) => {\r\n reqResourceTypes.push(resourceType);\r\n });\r\n }*/\r\n\r\n const request: GlobalSearchRequest = {\r\n query: store.searchQuery,\r\n resourceTypes: reqResourceTypes,\r\n globalFilters: [],\r\n options: {\r\n paginationOptions: { pageSize: pageSize, pageToken: pageToken },\r\n resultPriorityOptions: { resourceTypeDistribution: ResourceTypeDistribution[ResourceTypeDistribution.DynamicBucketSize] },\r\n },\r\n };\r\n promiseResponses.push(postSearch(request, userContext));\r\n }\r\n\r\n const responses = await Promise.all(promiseResponses);\r\n const responseMap: Map<string, ISearchResultInfo> = new Map<string, ISearchResultInfo>();\r\n const resourceTypeMap: Map<string, number> = new Map<string, number>();\r\n\r\n for (let i = 0; i < resourceTypes.length; i++) {\r\n // Setting search result items for each resource type\r\n const searchResultInfo = buildSearchResults(responses[i]);\r\n responseMap.set(resourceTypes[i], searchResultInfo);\r\n // Setting search result item count for each resource type\r\n let totalResultCount = 0;\r\n const resultMetadata = responses[i].resultMetadata;\r\n if (resultMetadata) {\r\n totalResultCount = resultMetadata.ResultCountPerResourceType[resourceTypes[i]];\r\n }\r\n resourceTypeMap.set(resourceTypes[i], totalResultCount);\r\n }\r\n\r\n setData(responseMap, getOrderedResources(resourceTypeMap, store.sourceRef || ''));\r\n if (msg.resourceType) {\r\n showMoreLoading(msg.resourceType, false);\r\n }\r\n } catch (e) {\r\n Log.error(`To do error handling in search page: ${JSON.stringify(e)}`);\r\n }\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n id: {\r\n id: 'globalSearch.id',\r\n defaultMessage: 'ID'\r\n },\r\n name: {\r\n id: 'globalSearch.name',\r\n defaultMessage: 'Name'\r\n },\r\n createdDate: {\r\n id: 'globalSearch.createdDate',\r\n defaultMessage: 'Created date'\r\n },\r\n numberOfChannels: {\r\n id: 'globalSearch.numberOfChannels',\r\n defaultMessage: 'Channels'\r\n },\r\n numberOfExcludedURLs: {\r\n id: 'globalSearch.numberOfExcludedURLs',\r\n defaultMessage: 'Excluded URLs'\r\n },\r\n numberOfExcludedKeywords: {\r\n id: 'globalSearch.numberOfExcludedKeywords',\r\n defaultMessage: 'Excluded keywords'\r\n },\r\n numberOfAdunits: {\r\n id: 'globalSearch.numberOfAdunits',\r\n defaultMessage: 'AdUnits'\r\n },\r\n numberOfAdFilters: {\r\n id: 'globalSearch.numberOfAdfilters',\r\n defaultMessage: 'AdFilters'\r\n },\r\n lastModifiedDateTime: {\r\n id: 'globalSearch.lastModifiedDateTime',\r\n defaultMessage: 'Modified date'\r\n },\r\n fullName: {\r\n id: 'globalSearch.fullName',\r\n defaultMessage: 'Full name'\r\n },\r\n publisherName: {\r\n id: 'globalSearch.publisherName',\r\n defaultMessage: 'Publisher name'\r\n },\r\n websiteUrl: {\r\n id: 'globalSearch.websiteUrl',\r\n defaultMessage: 'Website URL'\r\n },\r\n notes: {\r\n id: 'globalSearch.notes',\r\n defaultMessage: 'Notes'\r\n },\r\n clickableCellAriaDesc: {\r\n id: 'globalSearch.clickableCellAriaDesc',\r\n defaultMessage: 'Click to view or edit entity'\r\n },\r\n showMoreDescription: {\r\n id: 'globalSearch.showMoreDescription',\r\n defaultMessage: 'Click to fetch more results for {entity}'\r\n }\r\n});\r\n","import { IPubcenterPalette, IPubcenterSpacing } from '../../../../theme';\r\nimport { IGlobalSearchResultListStyleProps, IGlobalSearchResultListStyles } from './GlobalSearchResultList.types';\r\n\r\nexport const getStyles = (props: IGlobalSearchResultListStyleProps): IGlobalSearchResultListStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const pallete = theme.palette as IPubcenterPalette;\r\n return {\r\n root: {\r\n backgroundColor: theme.palette.white,\r\n paddingTop: spacing.size32\r\n },\r\n header: [\r\n 'ms-fontWeight-semibold',\r\n {\r\n fontSize: '14px',\r\n paddingBottom: spacing.size16,\r\n margin: 0\r\n }\r\n ],\r\n button: [\r\n 'ms-showmore-button',\r\n {\r\n color: pallete.themeDark,\r\n paddingTop: spacing.size16,\r\n selectors: {\r\n ':hover': {\r\n color: pallete.blueDark\r\n },\r\n ':disabled': {\r\n color: pallete.neutralQuaternary\r\n }\r\n }\r\n }\r\n ],\r\n buttonIcon: {\r\n paddingLeft: spacing.size8\r\n },\r\n iconHeader: {\r\n padding: 0,\r\n fontSize: spacing.size16\r\n },\r\n iconCell: {\r\n textAlign: 'center',\r\n selectors: {\r\n '&:before': {\r\n content: '.',\r\n display: 'inline-block',\r\n verticalAlign: 'middle',\r\n height: '100%',\r\n width: '0px',\r\n visibility: 'hidden'\r\n }\r\n }\r\n },\r\n iconImg: {\r\n verticalAlign: 'middle',\r\n maxHeight: spacing.size16,\r\n maxWidth: spacing.size16\r\n },\r\n };\r\n};\r\n","import {\r\n ActionButton,\r\n classNamesFunction,\r\n getId,\r\n getTheme,\r\n IColumn,\r\n Icon,\r\n Link,\r\n nullRender,\r\n SelectionMode,\r\n ShimmeredDetailsList,\r\n} from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { CrossEntityResourceType, ResourceType } from '../../../@data/store/schema/enums/ResourceType';\r\nimport AppMessages from '../../../App.messages';\r\nimport { RoutePrefix } from '../../../Routes';\r\nimport { injectIntlWithObserver } from '../../../utils';\r\nimport { getScreenReaderTextStyles } from '../../../utils/GlobalStyleUtils';\r\nimport { onSearchTriggered } from '../@data/actions/onSearchTriggered';\r\nimport { SearchResult } from '../@data/store/schema/models/SearchResult';\r\nimport { getStore } from '../@data/store/store';\r\nimport GlobalSearchResultListMessages from './GlobalSearchResultList.messages';\r\nimport { getStyles } from './GlobalSearchResultList.styles';\r\nimport {\r\n IGlobalSearchResultListProps,\r\n IGlobalSearchResultListStyleProps,\r\n IGlobalSearchResultListStyles,\r\n} from './GlobalSearchResultList.types';\r\n\r\nconst getClassNames = classNamesFunction<IGlobalSearchResultListStyleProps, IGlobalSearchResultListStyles>();\r\n\r\nexport const GlobalSearchResultList = injectIntlWithObserver(\r\n class extends React.Component<IGlobalSearchResultListProps> {\r\n private _columns: Map<string, string> = new Map([\r\n ['id', this.props.intl.formatMessage(GlobalSearchResultListMessages.id)],\r\n ['name', this.props.intl.formatMessage(GlobalSearchResultListMessages.name)],\r\n ['status', this.props.intl.formatMessage(AppMessages.status)],\r\n ['createdDate', this.props.intl.formatMessage(GlobalSearchResultListMessages.createdDate)],\r\n ['numberOfExcludedURLs', this.props.intl.formatMessage(GlobalSearchResultListMessages.numberOfExcludedURLs)],\r\n ['numberOfExcludedKeywords', this.props.intl.formatMessage(GlobalSearchResultListMessages.numberOfExcludedKeywords)],\r\n ['numberOfChannels', this.props.intl.formatMessage(GlobalSearchResultListMessages.numberOfChannels)],\r\n ['numberOfAdunits', this.props.intl.formatMessage(GlobalSearchResultListMessages.numberOfAdunits)],\r\n ['numberOfAdFilters', this.props.intl.formatMessage(GlobalSearchResultListMessages.numberOfAdFilters)],\r\n ['lastModifiedDateTime', this.props.intl.formatMessage(GlobalSearchResultListMessages.lastModifiedDateTime)],\r\n ['fullName', this.props.intl.formatMessage(GlobalSearchResultListMessages.fullName)],\r\n ['publisherName', this.props.intl.formatMessage(GlobalSearchResultListMessages.publisherName)],\r\n ['websiteURL', this.props.intl.formatMessage(GlobalSearchResultListMessages.websiteUrl)],\r\n ['notes', this.props.intl.formatMessage(GlobalSearchResultListMessages.notes)],\r\n ]);\r\n\r\n private _columnNames: Map<string, string[]> = new Map([\r\n [ResourceType[ResourceType.Account], ['name', 'id', 'createdDate', 'status']],\r\n [ResourceType[ResourceType.AdUnit], ['name', 'id', 'numberOfChannels', 'status']],\r\n [ResourceType[ResourceType.Filter], ['name', 'id', 'numberOfExcludedURLs', 'numberOfExcludedKeywords']],\r\n [ResourceType[ResourceType.Channel], ['name', 'id', 'numberOfAdunits', 'numberOfAdFilters']],\r\n [ResourceType[ResourceType.Publisher], ['name', 'id', 'createdDate', 'lastModifiedDateTime', 'notes']],\r\n [ResourceType[ResourceType.User], ['name', 'id', 'fullName', 'publisherName']],\r\n [ResourceType[ResourceType.WebProperty], ['name', 'id', 'publisherName', 'websiteURL']],\r\n ]);\r\n\r\n public render(): JSX.Element | null {\r\n const classNames = getClassNames(getStyles, { theme: getTheme() });\r\n const store = getStore();\r\n const searchResultInfo = store.results.get(this.props.resourceType);\r\n const { formatMessage } = this.props.intl;\r\n\r\n if (searchResultInfo === undefined) {\r\n return nullRender();\r\n }\r\n\r\n const isLoading = store.isShowMoreLoading.get(this.props.resourceType);\r\n const totalCount = store.resourceTypes.get(this.props.resourceType) || 0;\r\n /* const crossEntityResourceTypes = crossEntityResourceTypeMap.get(this.props.resourceType);\r\n\r\n if (crossEntityResourceTypes) {\r\n crossEntityResourceTypes.forEach((resourceType: string) => {\r\n totalCount += store.resourceTypes.get(resourceType) || 0;\r\n });\r\n }*/\r\n\r\n const header = this.props.headerText + ' (' + totalCount + ')';\r\n\r\n return (\r\n <div className={classNames.root}>\r\n <h2 className={classNames.header}>{header}</h2>\r\n <ShimmeredDetailsList\r\n items={searchResultInfo.resultData}\r\n onRenderItemColumn={this._renderItemColumn}\r\n columns={this._buildSearchResultListColumns(this.props.resourceType)}\r\n selectionMode={SelectionMode.none}\r\n />\r\n {isLoading && (\r\n <ShimmeredDetailsList\r\n items={[]}\r\n columns={this._buildSearchResultListColumns(this.props.resourceType)}\r\n selectionMode={SelectionMode.none}\r\n enableShimmer={true}\r\n isHeaderVisible={false}\r\n shimmerLines={5}\r\n />\r\n )}\r\n <ActionButton\r\n disabled={searchResultInfo.pageToken === ''}\r\n className={classNames.button}\r\n onClick={() => onSearchTriggered(this.props.resourceType)}\r\n ariaDescription={formatMessage(GlobalSearchResultListMessages.showMoreDescription, { entity: this.props.headerText })}\r\n >\r\n {formatMessage(AppMessages.showMore)}\r\n <Icon className={classNames.buttonIcon} iconName=\"ChevronDown\" />\r\n </ActionButton>\r\n </div>\r\n );\r\n }\r\n\r\n private _buildSearchResultListColumns(resourceType: string): IColumn[] {\r\n const columns = this._columnNames.get(resourceType);\r\n const classNames = getClassNames(getStyles, { theme: getTheme() });\r\n const newColumns: IColumn[] = [];\r\n\r\n const iconColumn: IColumn = {\r\n key: 'iconColumn',\r\n name: 'File Type',\r\n className: classNames.iconCell,\r\n iconClassName: classNames.iconHeader,\r\n iconName: 'Page',\r\n isIconOnly: true,\r\n fieldName: 'iconName',\r\n minWidth: 16,\r\n maxWidth: 16,\r\n onRender: (item: SearchResult) => {\r\n return <Icon className={classNames.iconImg} iconName={item.iconName} />;\r\n },\r\n };\r\n newColumns.push(iconColumn);\r\n if (columns) {\r\n // eslint-disable-next-line\r\n columns.map((column: string) => {\r\n const newColumn: IColumn = {\r\n key: column,\r\n name: this._columns.get(column) || '',\r\n fieldName: column,\r\n isCollapsable: false,\r\n minWidth: 100,\r\n maxWidth: 300,\r\n isResizable: true,\r\n isPadded: true,\r\n };\r\n newColumns.push(newColumn);\r\n });\r\n }\r\n\r\n return newColumns;\r\n }\r\n\r\n private _onClick = (item: SearchResult): void => {\r\n const publisherId = item.getPublisherId();\r\n const accountId = item.getAccountId();\r\n const resourceType = item.getResourceType();\r\n const entityId = item.id;\r\n let route = '';\r\n\r\n switch (resourceType) {\r\n case ResourceType[ResourceType.AdUnit]: {\r\n if (publisherId !== '' && accountId !== '') {\r\n route = `/${RoutePrefix.adManagement}/${publisherId}-${accountId}/adunit/edit/${entityId}`;\r\n }\r\n break;\r\n }\r\n case ResourceType[ResourceType.Channel]: {\r\n if (publisherId !== '' && accountId !== '') {\r\n route = `/${RoutePrefix.adManagement}/${publisherId}-${accountId}/channel/edit/${entityId}`;\r\n }\r\n break;\r\n }\r\n case ResourceType[ResourceType.WebProperty]: {\r\n if (publisherId !== '') {\r\n route = `/${RoutePrefix.adManagement}/${publisherId}/property/edit/${entityId}`;\r\n }\r\n break;\r\n }\r\n case ResourceType[ResourceType.Filter]: {\r\n if (publisherId !== '' && accountId !== '') {\r\n route = `/${RoutePrefix.adManagement}/${publisherId}-${accountId}/adfilter/edit/${entityId}`;\r\n }\r\n break;\r\n }\r\n case ResourceType[ResourceType.Account]: {\r\n if (publisherId !== '') {\r\n route = `/${RoutePrefix.partnerManagement}/${publisherId}/account/edit/${entityId}`;\r\n }\r\n break;\r\n }\r\n case ResourceType[ResourceType.Publisher]:\r\n case CrossEntityResourceType[CrossEntityResourceType.PublisherByAccount]:\r\n case CrossEntityResourceType[CrossEntityResourceType.PublisherByAdunit]:\r\n case CrossEntityResourceType[CrossEntityResourceType.PublisherByChannel]:\r\n case CrossEntityResourceType[CrossEntityResourceType.PublisherByFilter]:\r\n case CrossEntityResourceType[CrossEntityResourceType.PublisherByUser]:\r\n case CrossEntityResourceType[CrossEntityResourceType.PublisherByWebProperty]: {\r\n if (entityId !== '') {\r\n route = `/${RoutePrefix.partnerManagement}/${entityId}/publisher/edit/${entityId}`;\r\n }\r\n break;\r\n }\r\n case ResourceType[ResourceType.User]: {\r\n if (publisherId !== '') {\r\n route = `/${RoutePrefix.partnerManagement}/${publisherId}/user/edit/${entityId}`;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n if (route !== '') {\r\n this.props.history.push(route);\r\n }\r\n };\r\n\r\n private _renderItemColumn = (item: SearchResult, index: number, column: IColumn): JSX.Element => {\r\n const cellAriaDescId = getId('clickableCellAriaDesc-');\r\n\r\n if (column.key === 'name') {\r\n return (\r\n <>\r\n <Link onClick={() => this._onClick(item)} aria-describedby={cellAriaDescId}>\r\n {item.name}\r\n </Link>\r\n <span id={cellAriaDescId} style={getScreenReaderTextStyles()}>\r\n {this.props.intl.formatMessage(GlobalSearchResultListMessages.clickableCellAriaDesc)}\r\n </span>\r\n </>\r\n );\r\n }\r\n return <span>{item[column.fieldName || '']}</span>;\r\n };\r\n }\r\n);\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n searchResults: {\r\n id: 'globalSearch.searchResults',\r\n defaultMessage: 'Search results'\r\n },\r\n filterSearchBy: {\r\n id: 'globalSearch.filterSearchBy',\r\n defaultMessage: 'Filter search by'\r\n },\r\n clearFilters: {\r\n id: 'globalSearch.clearFilters',\r\n defaultMessage: 'Clear filters'\r\n },\r\n filterCheckboxAriaDesc: {\r\n id: 'globalSearch.filterCheckboxAriaDesc',\r\n defaultMessage: 'Check this to include {entity} search results'\r\n }\r\n});\r\n","import { IPubcenterPalette, IPubcenterSpacing } from '../../../../theme';\r\nimport { IGlobalSearchResultPageStyleProps, IGlobalSearchResultPageStyles } from './GlobalSearchResultPage.types';\r\n\r\nexport const getStyles = (props: IGlobalSearchResultPageStyleProps): IGlobalSearchResultPageStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const pallete = theme.palette as IPubcenterPalette;\r\n return {\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: 'inherit',\r\n maxHeight: '95vh',\r\n flex: 1,\r\n backgroundColor: theme.palette.white\r\n },\r\n header: [\r\n 'ms-fontWeight-semibold',\r\n {\r\n display: 'flex',\r\n fontSize: `calc(${spacing.size16} + ${spacing.size4})`,\r\n paddingTop: spacing.size32,\r\n paddingBottom: spacing.size24\r\n }\r\n ],\r\n filter: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center'\r\n },\r\n filterContent: {\r\n display: 'flex',\r\n paddingRight: spacing.size24\r\n },\r\n clearFilterButton: {\r\n display: 'flex',\r\n color: pallete.themeDarkAlt,\r\n marginLeft: 'auto',\r\n selectors: {\r\n ':hover': {\r\n color: pallete.blueDark\r\n }\r\n }\r\n },\r\n navBackButton: [\r\n 'ms-navBackButton',\r\n {\r\n display: 'flex',\r\n color: pallete.themeDarkAlt,\r\n backgroundColor: theme.palette.neutralLighter,\r\n height: spacing.size44,\r\n alignItems: 'center',\r\n selectors: {\r\n ':hover': {\r\n color: pallete.blueDark\r\n }\r\n }\r\n }\r\n ],\r\n scrollablePanel: {\r\n borderBottomStyle: 'solid',\r\n borderColor: theme.palette.neutralLight,\r\n borderBottomWidth: 1,\r\n overflowY: 'auto',\r\n flex: 1\r\n },\r\n pageContent: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n paddingLeft: spacing.size44,\r\n paddingRight: spacing.size44,\r\n paddingBottom: spacing.size44\r\n },\r\n };\r\n};\r\n","import { ActionButton, Checkbox, classNamesFunction, getId, getTheme, nullRender } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { getAppStore, onNavigateBack } from '../../../@data';\r\nimport { ResourceType } from '../../../@data/store/schema/enums/ResourceType';\r\nimport AppMessages from '../../../App.messages';\r\nimport { Main } from '../../../components/Main/Main';\r\nimport { injectIntlWithObserver } from '../../../utils';\r\nimport { getScreenReaderTextStyles } from '../../../utils/GlobalStyleUtils';\r\nimport { clearStore, onSearchTriggered, setSearchParams } from '../@data/actions/onSearchTriggered';\r\nimport '../@data/mutators/searchChanged';\r\nimport '../@data/orchestrators/searchTriggered';\r\nimport { getStore } from '../@data/store/store';\r\nimport { GlobalSearchResultList } from '../GlobalSearchResultList/GlobalSearchResultList';\r\nimport GlobalSearchResultPageMessages from './GlobalSearchResultPage.messages';\r\nimport { getStyles } from './GlobalSearchResultPage.styles';\r\nimport {\r\n IFilter,\r\n IGlobalSearchResultPageProps,\r\n IGlobalSearchResultPageState,\r\n IGlobalSearchResultPageStyleProps,\r\n IGlobalSearchResultPageStyles,\r\n} from './GlobalSearchResultPage.types';\r\n\r\nconst getClassNames = classNamesFunction<IGlobalSearchResultPageStyleProps, IGlobalSearchResultPageStyles>();\r\n\r\nexport const GlobalSearchResultPage = injectIntlWithObserver(\r\n class GlobalSearchResultPageComponent extends React.Component<IGlobalSearchResultPageProps, IGlobalSearchResultPageState> {\r\n private _classNames = getClassNames(getStyles, { theme: getTheme() });\r\n private _filters: Map<string, IFilter> = new Map<string, IFilter>([\r\n [ResourceType[ResourceType.AdUnit], { text: this.props.intl.formatMessage(AppMessages.adUnits), isSelected: true }],\r\n [ResourceType[ResourceType.Filter], { text: this.props.intl.formatMessage(AppMessages.adFilters), isSelected: true }],\r\n [ResourceType[ResourceType.Channel], { text: this.props.intl.formatMessage(AppMessages.channels), isSelected: true }],\r\n [ResourceType[ResourceType.Publisher], { text: this.props.intl.formatMessage(AppMessages.publishers), isSelected: true }],\r\n [ResourceType[ResourceType.Reporting], { text: this.props.intl.formatMessage(AppMessages.reporting), isSelected: true }],\r\n [ResourceType[ResourceType.WebProperty], { text: this.props.intl.formatMessage(AppMessages.properties), isSelected: true }],\r\n [ResourceType[ResourceType.Account], { text: this.props.intl.formatMessage(AppMessages.accounts), isSelected: true }],\r\n [ResourceType[ResourceType.User], { text: this.props.intl.formatMessage(AppMessages.users), isSelected: true }],\r\n ]);\r\n\r\n constructor(props: IGlobalSearchResultPageProps) {\r\n super(props);\r\n this.state = {\r\n filters: this._filters,\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n const params = new URLSearchParams(this.props.location.search);\r\n const query = params.get('q') || '';\r\n const sourceRef = params.get('sourceRef') || '';\r\n const filter = params.get('filter') || '';\r\n\r\n setSearchParams(query, sourceRef);\r\n this._updateFilters(filter);\r\n onSearchTriggered();\r\n }\r\n\r\n public componentDidUpdate() {\r\n const params = new URLSearchParams(this.props.location.search);\r\n const store = getStore();\r\n const query = params.get('q') || '';\r\n const sourceRef = params.get('sourceRef') || '';\r\n const filter = params.get('filter') || '';\r\n\r\n if (query !== '' && store.searchQuery !== query) {\r\n clearStore();\r\n setSearchParams(query, sourceRef);\r\n this._updateFilters(filter);\r\n onSearchTriggered();\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n clearStore();\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const classNames = this._classNames;\r\n const { formatMessage } = this.props.intl;\r\n const appStore = getAppStore();\r\n\r\n if (appStore.loading === true) {\r\n return nullRender();\r\n }\r\n\r\n return (\r\n <div className={classNames.root}>\r\n <ActionButton\r\n className={classNames.navBackButton}\r\n iconProps={{\r\n iconName: 'Back',\r\n }}\r\n onClick={() => onNavigateBack()}\r\n >\r\n {formatMessage(AppMessages.back)}\r\n </ActionButton>\r\n <div className={classNames.scrollablePanel}>\r\n <Main className={classNames.pageContent} aria-labelledby=\"searchResultHeading\">\r\n <div id=\"searchResultHeading\" className={classNames.header} role=\"heading\" aria-level={1}>\r\n {formatMessage(GlobalSearchResultPageMessages.searchResults)}\r\n </div>\r\n <div className={classNames.filter} role=\"region\" aria-labelledby=\"filtersLabel\">\r\n <div id=\"filtersLabel\" className={classNames.filterContent}>\r\n {formatMessage(GlobalSearchResultPageMessages.filterSearchBy)}\r\n </div>\r\n {this._getFilters()}\r\n <ActionButton className={classNames.clearFilterButton} onClick={() => this._clearFilters()}>\r\n {formatMessage(GlobalSearchResultPageMessages.clearFilters)}\r\n </ActionButton>\r\n </div>\r\n {this._getSearchResultLists()}\r\n </Main>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n private _getFilters(): JSX.Element {\r\n const element: JSX.Element[] = [];\r\n const classNames = getClassNames(getStyles, { theme: getTheme() });\r\n const store = getStore();\r\n store.resourceTypes.forEach((value: number, key: string) => {\r\n const filterState = this.state.filters.get(key);\r\n const checkboxAriaDescId = getId('checkBoxAriaDesc-');\r\n\r\n if (filterState && value > 0) {\r\n element.push(\r\n <>\r\n <Checkbox\r\n className={classNames.filterContent}\r\n key={key}\r\n label={filterState.text}\r\n ariaLabel={filterState.text}\r\n checked={filterState.isSelected}\r\n onChange={() => this._checkBoxClicked(key)}\r\n ariaDescribedBy={checkboxAriaDescId}\r\n />\r\n <span id={checkboxAriaDescId} style={getScreenReaderTextStyles()}>\r\n {this.props.intl.formatMessage(GlobalSearchResultPageMessages.filterCheckboxAriaDesc, { entity: filterState.text })}\r\n </span>\r\n </>\r\n );\r\n }\r\n });\r\n return <React.Fragment>{element}</React.Fragment>;\r\n }\r\n\r\n private _getSearchResultLists(): JSX.Element {\r\n const element: JSX.Element[] = [];\r\n const store = getStore();\r\n store.resourceTypes.forEach((value: number, key: string) => {\r\n const filterState = this.state.filters.get(key);\r\n if (filterState && filterState.isSelected && value > 0) {\r\n element.push(<GlobalSearchResultList {...this.props} resourceType={key} headerText={filterState.text} key={key} />);\r\n }\r\n });\r\n return <React.Fragment>{element}</React.Fragment>;\r\n }\r\n\r\n private _clearFilters() {\r\n const filters = this.state.filters;\r\n\r\n filters.forEach((filter: IFilter) => {\r\n filter.isSelected = false;\r\n });\r\n\r\n this.setState({ filters: filters });\r\n }\r\n\r\n private _checkBoxClicked(resourceType: string) {\r\n const filters = this.state.filters;\r\n const filterState = filters.get(resourceType);\r\n if (filterState) {\r\n filterState.isSelected = !filterState.isSelected;\r\n }\r\n this.setState({ filters: filters });\r\n }\r\n\r\n private _updateFilters(resourceType: string) {\r\n const filterResource = this._filters.get(resourceType);\r\n\r\n if (filterResource) {\r\n const filters = this.state.filters;\r\n\r\n filters.forEach((filter: IFilter) => {\r\n if (filter !== filterResource) {\r\n filter.isSelected = false;\r\n } else {\r\n filter.isSelected = true;\r\n }\r\n });\r\n\r\n this.setState({ filters: filters });\r\n }\r\n }\r\n }\r\n);\r\n","import * as React from 'react';\r\nimport { injectIntlWithObserver, IRouterWithIntl } from '../../utils';\r\nimport { GlobalSearchResultPage } from './GlobalSearchResultPage/GlobalSearchResultPage';\r\n\r\nexport const GlobalSearchResultRouter = injectIntlWithObserver(\r\n class extends React.Component<IRouterWithIntl> {\r\n public render(): JSX.Element {\r\n return <GlobalSearchResultPage {...this.props} />;\r\n }\r\n }\r\n);\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n productName: {\r\n id: 'aboutUs.productName',\r\n defaultMessage: '{appName}',\r\n },\r\n pubCenterNewBrand: {\r\n id: 'aboutUs.pubCenterNewBrand',\r\n defaultMessage: 'Microsoft Monetize Now',\r\n },\r\n slogan: {\r\n id: 'aboutUs.slogan',\r\n defaultMessage: 'Earn more money from your site with Microsoft',\r\n },\r\n incentive: {\r\n id: 'aboutUs.incentive',\r\n defaultMessage: 'Get more out of your site with high-quality, relevant ads.',\r\n },\r\n contactUs: {\r\n id: 'aboutUs.contactUs',\r\n defaultMessage: 'Contact us',\r\n },\r\n alreadyMember: {\r\n id: 'aboutUs.alreadyMember',\r\n defaultMessage: 'Already using {appName}?',\r\n },\r\n alreadyMemberNewBrand: {\r\n id: 'aboutUs.alreadyMemberNewBrand',\r\n defaultMessage: 'Already using Microsoft Monetize Now?',\r\n },\r\n emailAddressLabel: {\r\n id: 'aboutUs.emailAddressLabel',\r\n defaultMessage: 'Enter your email address to sign in:',\r\n },\r\n signIn: {\r\n id: 'aboutUs.signIn',\r\n defaultMessage: 'Sign In',\r\n },\r\n signUp: {\r\n id: 'aboutUs.signUp',\r\n defaultMessage: 'Sign Up',\r\n },\r\n usersToBeQuestion: {\r\n id: 'aboutUs.usersToBeQuestion',\r\n defaultMessage: 'Who should get started?',\r\n },\r\n usersToBeQuirkOne: {\r\n id: 'aboutUs.usersToBeQuirkOne',\r\n defaultMessage: 'Any small publisher or blog looking to build their audience and make it profitable through native ads.',\r\n },\r\n usersToBeQuirkTwo: {\r\n id: 'aboutUs.usersToBeQuirkTwo',\r\n defaultMessage: 'Sites focused on travel, entertainment, sports, food, finance, auto, community, news, telecom, and others.',\r\n },\r\n usersToBeQuirkThree: {\r\n id: 'aboutUs.usersToBeQuirkThree',\r\n defaultMessage: 'Publishers with up to 5M page views per month.',\r\n },\r\n moneyLabel: {\r\n id: 'aboutUs.moneyLabel',\r\n defaultMessage: 'Earn more money',\r\n },\r\n moneyDesc: {\r\n id: 'aboutUs.moneyDesc',\r\n defaultMessage: 'Serve ads that drive higher engagement and more revenue for you.',\r\n },\r\n adsLabel: {\r\n id: 'aboutUs.adsLabel',\r\n defaultMessage: 'Show beautiful ads',\r\n },\r\n adsDesc: {\r\n id: 'aboutUs.adsDesc',\r\n defaultMessage: 'Engage your audience with impactful images that blend naturally with your site experience.',\r\n },\r\n timeLabel: {\r\n id: 'aboutUs.timeLabel',\r\n defaultMessage: 'Save time',\r\n },\r\n timeDesc: {\r\n id: 'aboutUs.timeDesc',\r\n defaultMessage: 'Leverage the simple set up and management, so you can focus on what you do best.',\r\n },\r\n advantageOneHeader: {\r\n id: 'aboutUs.advantageOneHeader',\r\n defaultMessage: 'We make earning money easier, so you can focus on creating great content.',\r\n },\r\n advantageOneDescOne: {\r\n id: 'aboutUs.advantageOneDescOne',\r\n defaultMessage: 'Deliver ads that match the look and feel of your site and appeal to your audience.',\r\n },\r\n advantageOneDescTwo: {\r\n id: 'aboutUs.advantageOneDescTwo',\r\n defaultMessage: 'Get the flexibility to control where ads show on the page and block content that doesn’t resonate with your audience.',\r\n },\r\n advantageTwoHeader: {\r\n id: 'aboutUs.advantageTwoHeader',\r\n defaultMessage: 'Grow with your audience',\r\n },\r\n advantageTwoDescOne: {\r\n id: 'aboutUs.advantageTwoDescOne',\r\n defaultMessage: 'The more you attract an engaged audience, the more you monetize.',\r\n },\r\n advantageTwoDescTwo: {\r\n id: 'aboutUs.advantageTwoDescTwo',\r\n defaultMessage: 'And the more you monetize, the more you can invest in growing your audience.',\r\n },\r\n startingHeader: {\r\n id: 'aboutUs.startingHeader',\r\n defaultMessage: 'Get started easily',\r\n },\r\n startingDesc: {\r\n id: 'aboutUs.startingDesc',\r\n defaultMessage: 'Start earning with minimal effort on your side.',\r\n },\r\n stepOneHeader: {\r\n id: 'aboutUs.stepOneHeader',\r\n defaultMessage: 'Get access',\r\n },\r\n stepOneDesc: {\r\n id: 'aboutUs.stepOneHeader',\r\n defaultMessage: 'Access your account via a custom link (at no cost).',\r\n },\r\n stepTwoHeader: {\r\n id: 'aboutUs.stepTwoHeader',\r\n defaultMessage: 'Set up your ads',\r\n },\r\n stepTwoDesc: {\r\n id: 'aboutUs.stepTwoDesc',\r\n defaultMessage: 'Browse our templates and use them to create your ads.',\r\n },\r\n stepThreeHeader: {\r\n id: 'aboutUs.stepThreeHeader',\r\n defaultMessage: 'Connect your site',\r\n },\r\n stepThreeDesc: {\r\n id: 'aboutUs.stepThreeDesc',\r\n defaultMessage: `Place one line of code on your page. It's easy and we’ll show you how to do it.`,\r\n },\r\n monetizationHeader: {\r\n id: 'aboutUs.monetizationHeader',\r\n defaultMessage: `Start monetizing`,\r\n },\r\n monetizationDesc: {\r\n id: 'aboutUs.monetizationDesc',\r\n defaultMessage: `We’re looking for businesses like yours to help you earn more in fewer steps.`,\r\n },\r\n imgBackgroundAlt: {\r\n id: 'aboutUs.imgBackgroundAlt',\r\n defaultMessage: 'Background image in about us page sign in section',\r\n },\r\n imgMoneyBagAlt: {\r\n id: 'aboutUs.imgMoneyBagAlt',\r\n defaultMessage: 'Money bag icon',\r\n },\r\n imgAdsAlt: {\r\n id: 'aboutUs.imgAdsAlt',\r\n defaultMessage: 'Ads icon',\r\n },\r\n imgTimeAlt: {\r\n id: 'aboutUs.imgTimeAlt',\r\n defaultMessage: 'Clock icon',\r\n },\r\n imgPrimaryOnboardAlt: {\r\n id: 'aboutUs.imgPrimaryOnboardAlt',\r\n defaultMessage: 'Example with no image fit value and only width is specified.',\r\n },\r\n imgSecondaryOnboardAltOne: {\r\n id: 'aboutUs.imgSecondaryOnboardAltOne',\r\n defaultMessage: 'Example with image fit value of 1.',\r\n },\r\n imgSecondaryOnboardAltTwo: {\r\n id: 'aboutUs.imgSecondaryOnboardAltTwo',\r\n defaultMessage: 'Example with image fit value of 2.',\r\n },\r\n imgSecondaryOnboardAltThree: {\r\n id: 'aboutUs.imgSecondaryOnboardAltThree',\r\n defaultMessage: 'Example with image fit value of 3.',\r\n },\r\n emailInputPlaceholder: {\r\n id: 'aboutUs.emailInputPlaceholder',\r\n defaultMessage: 'Enter your email address',\r\n },\r\n});\r\n","import { FontWeights, getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { IPubCenterFonts, IPubcenterPalette, IPubcenterSpacing } from '../../../theme';\r\nimport { ICommonStyleProps } from '../../types';\r\nimport aboutUsBG from './resources/About-us-background-image.jpg';\r\n\r\ntype StyleProperties =\r\n | 'introductionContainer'\r\n | 'imageContainer'\r\n | 'signInContainer'\r\n | 'header'\r\n | 'smaller'\r\n | 'font18'\r\n | 'font16'\r\n | 'font14'\r\n | 'bodyContainer'\r\n | 'imageWithTextOnLeft'\r\n | 'imageWithTextOnRight'\r\n | 'iconsContainer'\r\n | 'iconContainer'\r\n | 'stepsContainer'\r\n | 'textFieldTitle'\r\n | 'textFieldGroup'\r\n | 'centerTextAlign'\r\n | 'iconsContainerPrimary'\r\n | 'monetizationContainer';\r\n\r\nexport type AboutUsPageStyles = Record<StyleProperties, string>;\r\n\r\nexport const getStyles = (props: ICommonStyleProps): AboutUsPageStyles => {\r\n const { theme } = props;\r\n const fonts = theme.fonts as IPubCenterFonts;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const space = theme.spacing as IPubcenterSpacing;\r\n\r\n const imageWithTextGrid = {\r\n display: 'grid',\r\n padding: '40px 0',\r\n gap: '30px',\r\n alignItems: 'center',\r\n '@media(max-width: 1050px)': {\r\n gridTemplateColumns: '1fr 1fr',\r\n },\r\n '@media(max-width: 850px)': {\r\n display: 'block',\r\n },\r\n };\r\n\r\n return mergeStyleSets({\r\n introductionContainer: {\r\n display: 'grid',\r\n gridTemplateColumns: '2fr 1fr',\r\n color: palette.white,\r\n '@media(max-width: 1000px)': {\r\n gridTemplateColumns: '1fr 1fr',\r\n },\r\n '@media(max-width: 850px)': {\r\n display: 'block',\r\n },\r\n },\r\n textFieldTitle: {\r\n color: palette.white,\r\n },\r\n textFieldGroup: {\r\n height: space.size50,\r\n },\r\n centerTextAlign: {\r\n textAlign: 'center',\r\n },\r\n imageContainer: {\r\n position: 'relative',\r\n background: `url(${aboutUsBG}), rgba(0,0,0,0.5)`,\r\n backgroundPosition: 'center',\r\n backgroundSize: 'cover',\r\n backgroundBlendMode: 'multiply',\r\n backgroundRepeat: 'no-repeat',\r\n boxSizing: 'border-box',\r\n padding: '50px',\r\n },\r\n signInContainer: {\r\n background: '#10152E',\r\n boxSizing: 'border-box',\r\n padding: '50px',\r\n '> button': {\r\n float: 'right',\r\n marginTop: space.size6,\r\n },\r\n },\r\n bodyContainer: {\r\n margin: '0 auto',\r\n padding: '0 20px',\r\n '@media(min-width: 1200px)': {\r\n width: '1170px',\r\n },\r\n },\r\n imageWithTextOnLeft: {\r\n ...imageWithTextGrid,\r\n gridTemplateColumns: '2fr 1fr',\r\n },\r\n imageWithTextOnRight: {\r\n ...imageWithTextGrid,\r\n gridTemplateColumns: '1fr 2fr',\r\n },\r\n iconsContainer: {\r\n display: 'grid',\r\n gridTemplateColumns: '1fr 1fr 1fr',\r\n gap: '25px',\r\n alignItems: 'baseline',\r\n textAlign: 'center',\r\n '@media(max-width: 850px)': {\r\n gridTemplateColumns: '1fr',\r\n },\r\n },\r\n iconsContainerPrimary: {\r\n padding: `${space.size40} 0`,\r\n },\r\n iconContainer: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n textAlign: 'center',\r\n },\r\n stepsContainer: {\r\n background: '#f2f2f2',\r\n padding: '40px 0',\r\n },\r\n monetizationContainer: {\r\n background: '#10152E',\r\n padding: '40px 0',\r\n color: 'white',\r\n },\r\n header: {\r\n fontSize: 38,\r\n },\r\n smaller: {\r\n ...fonts.size28,\r\n },\r\n font18: {\r\n ...fonts.size18,\r\n fontWeight: FontWeights.semibold,\r\n marginTop: '10px',\r\n },\r\n font16: {\r\n ...fonts.size16,\r\n },\r\n font14: {\r\n ...fonts.size14,\r\n },\r\n });\r\n};\r\n\r\nexport function getClassNames<PropType>(props?: PropType): AboutUsPageStyles {\r\n return getStyles({ theme: getTheme(), ...props });\r\n}\r\n","import { PrimaryButton, TextField } from '@fluentui/react';\r\nimport React, { useEffect, useLayoutEffect } from 'react';\r\n\r\nimport { Image } from '@fluentui/react';\r\nimport { LayoutMode, getAppStore, onLayoutChanged } from '../../@data';\r\nimport { DefaultRoute } from '../../Routes';\r\nimport { APP_NAME_NEW, APP_NAME_PUBCENTER, TYTHON_SUPPORT_EMAIL } from '../../constants/AppConstants';\r\nimport { Page } from '../../layout/PageLayout/PageLayout';\r\nimport { IRouterWithIntl, injectIntlWithObserver, isLocationPubCenter } from '../../utils';\r\nimport { getLoginPageStore, onEmailChanged, onLoginButtonClicked } from '../login/@data';\r\nimport messages from './AboutUsPage.messages';\r\nimport { getClassNames } from './AboutUsPage.styles';\r\nimport ads from './resources/ads.png';\r\nimport man from './resources/man.jpg';\r\nimport money from './resources/money.png';\r\nimport one from './resources/one.png';\r\nimport three from './resources/three.png';\r\nimport time from './resources/time.png';\r\nimport two from './resources/two.png';\r\nimport twoWomen from './resources/twoWomen.jpg';\r\nimport woman from './resources/woman.jpg';\r\n\r\nexport interface IAboutUsPageProps extends IRouterWithIntl {}\r\n\r\nexport const AboutUsPage = injectIntlWithObserver(function AboutUsPageComponent(props: IAboutUsPageProps) {\r\n const { formatMessage } = props.intl;\r\n const {\r\n errors,\r\n active: { email },\r\n } = getLoginPageStore();\r\n const { userContext } = getAppStore();\r\n\r\n const {\r\n introductionContainer,\r\n imageContainer,\r\n signInContainer,\r\n bodyContainer,\r\n imageWithTextOnLeft,\r\n imageWithTextOnRight,\r\n iconsContainer,\r\n iconContainer,\r\n stepsContainer,\r\n monetizationContainer,\r\n textFieldTitle,\r\n textFieldGroup,\r\n centerTextAlign,\r\n iconsContainerPrimary,\r\n header,\r\n smaller,\r\n font18,\r\n font16,\r\n font14,\r\n } = getClassNames();\r\n\r\n useEffect(() => {\r\n onLayoutChanged(LayoutMode.Default);\r\n }, []);\r\n\r\n useLayoutEffect(() => {\r\n if (userContext && userContext.token) {\r\n props.history.push(`${DefaultRoute}`);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [userContext]);\r\n\r\n const handleSignInClick = () => {\r\n onLoginButtonClicked();\r\n };\r\n\r\n // Removing signup button to prevent new user signup\r\n /*\r\n const handleSignUpClick = () => {\r\n AADLogin(true);\r\n };\r\n\r\n const AADLogin = (shouldSetSessionFlag = false) => {\r\n if (shouldSetSessionFlag) {\r\n localStorage.setItem(USER_SIGNUP_KEY, 'true');\r\n }\r\n const requestParams: Partial<RedirectRequest> = { redirectStartPage: aadConfig.auth.redirectUri };\r\n onPubCenterAADLogin(requestParams);\r\n };\r\n */\r\n\r\n return (\r\n <Page {...props}>\r\n <div className={introductionContainer}>\r\n <div className={imageContainer}>\r\n <p className={header}>\r\n {formatMessage(messages.productName, { appName: isLocationPubCenter() ? APP_NAME_PUBCENTER : APP_NAME_NEW })}\r\n </p>\r\n <span className={header}>{formatMessage(messages.slogan)}</span>\r\n <p>{formatMessage(messages.incentive)}</p>\r\n <br />\r\n <br />\r\n <PrimaryButton\r\n text={formatMessage(messages.contactUs)}\r\n href={`mailto:${TYTHON_SUPPORT_EMAIL}`}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n />\r\n </div>\r\n <div className={signInContainer}>\r\n <p className={header}>\r\n {formatMessage(messages.alreadyMember, { appName: isLocationPubCenter() ? APP_NAME_PUBCENTER : APP_NAME_NEW })}\r\n </p>\r\n <TextField\r\n label={formatMessage(messages.emailAddressLabel)}\r\n styles={{ subComponentStyles: { label: { root: textFieldTitle } }, fieldGroup: textFieldGroup }}\r\n placeholder={formatMessage(messages.emailInputPlaceholder)}\r\n onChange={(_, val) => onEmailChanged(val || '')}\r\n errorMessage={errors.email}\r\n value={email}\r\n type=\"email\"\r\n onKeyDown={(ev) => ev.key === 'Enter' && handleSignInClick()}\r\n />\r\n <PrimaryButton onClick={handleSignInClick} text={formatMessage(messages.signIn)} />\r\n </div>\r\n </div>\r\n <div className={bodyContainer}>\r\n <div className={imageWithTextOnLeft}>\r\n <Image imageFit={1} src={woman} alt={formatMessage(messages.imgBackgroundAlt)} loading=\"lazy\" />\r\n <div>\r\n <p className={smaller}>{formatMessage(messages.usersToBeQuestion)}</p>\r\n <ul>\r\n <li className={font16}>{formatMessage(messages.usersToBeQuirkOne)}</li>\r\n <li className={font16}>{formatMessage(messages.usersToBeQuirkTwo)}</li>\r\n <li className={font16}>{formatMessage(messages.usersToBeQuirkThree)}</li>\r\n </ul>\r\n </div>\r\n </div>\r\n <div className={`${iconsContainer} ${iconsContainerPrimary}`}>\r\n <div className={iconContainer}>\r\n <Image src={money} alt={formatMessage(messages.imgMoneyBagAlt)} loading=\"lazy\" />\r\n <span className={font18}>{formatMessage(messages.moneyLabel)}</span>\r\n <span className={font14}>{formatMessage(messages.moneyDesc)}</span>\r\n </div>\r\n <div className={iconContainer}>\r\n <Image src={ads} alt={formatMessage(messages.imgAdsAlt)} loading=\"lazy\" />\r\n <span className={font18}>{formatMessage(messages.adsLabel)}</span>\r\n <span className={font14}>{formatMessage(messages.adsDesc)}</span>\r\n </div>\r\n <div className={iconContainer}>\r\n <Image src={time} alt={formatMessage(messages.imgTimeAlt)} loading=\"lazy\" />\r\n <span className={font18}>{formatMessage(messages.timeLabel)}</span>\r\n <span className={font14}>{formatMessage(messages.timeDesc)}</span>\r\n </div>\r\n </div>\r\n <div className={imageWithTextOnRight}>\r\n <div>\r\n <p className={smaller}>{formatMessage(messages.advantageOneHeader)}</p>\r\n <p className={font16}>{formatMessage(messages.advantageOneDescOne)}</p>\r\n <p className={font16}>{formatMessage(messages.advantageOneDescTwo)}</p>\r\n </div>\r\n <Image imageFit={1} src={man} alt={formatMessage(messages.imgPrimaryOnboardAlt)} loading=\"lazy\" />\r\n </div>\r\n <div className={imageWithTextOnLeft}>\r\n <Image imageFit={1} src={twoWomen} alt={formatMessage(messages.imgPrimaryOnboardAlt)} loading=\"lazy\" />\r\n <div>\r\n <p className={smaller}>{formatMessage(messages.advantageTwoHeader)}</p>\r\n <p className={font16}>{formatMessage(messages.advantageTwoDescOne)}</p>\r\n <p className={font16}>{formatMessage(messages.advantageTwoDescTwo)}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className={stepsContainer}>\r\n <div className={centerTextAlign}>\r\n <span className={smaller}>{formatMessage(messages.startingHeader)}</span>\r\n <p>{formatMessage(messages.startingDesc)}</p>\r\n </div>\r\n <div className={`${bodyContainer} ${iconsContainer}`}>\r\n <div className={iconContainer}>\r\n <Image src={one} alt={formatMessage(messages.imgSecondaryOnboardAltOne)} loading=\"lazy\" />\r\n <span className={font18}>{formatMessage(messages.stepOneHeader)}</span>\r\n <span className={font14}>{formatMessage(messages.stepOneDesc)}</span>\r\n </div>\r\n <div className={iconContainer}>\r\n <Image src={two} alt={formatMessage(messages.imgSecondaryOnboardAltTwo)} loading=\"lazy\" />\r\n <span className={font18}>{formatMessage(messages.stepTwoHeader)}</span>\r\n <span className={font14}>{formatMessage(messages.stepTwoDesc)}</span>\r\n </div>\r\n <div className={iconContainer}>\r\n <Image src={three} alt={formatMessage(messages.imgSecondaryOnboardAltThree)} loading=\"lazy\" />\r\n <span className={font18}>{formatMessage(messages.stepThreeHeader)}</span>\r\n <span className={font14}>{formatMessage(messages.stepThreeDesc)}</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div className={monetizationContainer}>\r\n <div className={centerTextAlign}>\r\n <p className={smaller}>{formatMessage(messages.monetizationHeader)}</p>\r\n <p className={font16}>{formatMessage(messages.monetizationDesc)}</p>\r\n {/*\r\n <PrimaryButton text={formatMessage(messages.signUp)} target=\"_blank\" rel=\"noopener noreferrer\" onClick={handleSignUpClick} />\r\n */}\r\n </div>\r\n </div>\r\n </Page>\r\n );\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n inventoryCreationTitle: {\r\n id: 'app.layout.EntityCreationLayout.inventoryCreationTitle',\r\n defaultMessage: 'Connect your inventory',\r\n },\r\n inventoryCreationContentSectionOne: {\r\n id: 'app.layout.EntityCreationLayout.inventoryCreationContentSectionOne',\r\n defaultMessage:\r\n 'To start monetizing with Microsoft pubCenter, we need you to connect your Site or your Application. Which type of Inventory setup you would like? {helpLinkPlaceholder}',\r\n },\r\n inventoryCreationContentSectionOneLink: {\r\n id: 'app.layout.EntityCreationLayout.inventoryCreationContentSectionOneLink',\r\n defaultMessage: 'Learn more about our supported platforms.',\r\n },\r\n inventoryCreationContentSectionTwo: {\r\n id: 'app.layout.EntityCreationLayout.inventoryCreationContentSectionTwo',\r\n defaultMessage:\r\n 'We strongly suggest that you review our {helpLinkPlaceholder}. Sites and apps that do not meet these guidelines will be rejected and won’t be able to serve ads.',\r\n },\r\n inventoryCreationContentSectionTwoLink: {\r\n id: 'app.layout.EntityCreationLayout.inventoryCreationContentSectionTwoLink',\r\n defaultMessage: 'inventory guidelines',\r\n },\r\n inventoryCreationCardTitleSite: {\r\n id: 'app.layout.EntityCreationLayout.inventoryCreationCardTitleSite',\r\n defaultMessage: 'Connect Site',\r\n },\r\n adsCreationCardTitleSite: {\r\n id: 'app.layout.EntityCreationLayout.adsCreationCardTitleSite',\r\n defaultMessage: 'Site ad unit',\r\n },\r\n adsCreationCardTitleApp: {\r\n id: 'app.layout.EntityCreationLayout.adsCreationCardTitleApp',\r\n defaultMessage: 'App ad unit',\r\n },\r\n inventoryCreationCardDescriptionSite: {\r\n id: 'app.layout.EntityCreationLayout.inventoryCreationCardDescriptionSite',\r\n defaultMessage:\r\n 'Connect your website to showcase ads. Each website is reviewed in accordance with our {MSPolicyPlaceholder} and {AdRenderingPoliciesPlaceholder}. To ensure your website passes our review, please follow our {SiteApprovalGuidelinesPlaceholder} before submitting your site for approval.',\r\n },\r\n inventoryCreationCardDescriptionApp: {\r\n id: 'app.layout.EntityCreationLayout.inventoryCreationCardDescriptionApp',\r\n defaultMessage:\r\n 'Connect your App to showcase ads. Each app will be reviewed in accordance with our {MSPolicyPlaceholder} and {AdRenderingPoliciesPlaceholder}. To ensure your app passes our review, please follow our {AppApprovalGuidelinesPlaceholder} before submitting your app for approval.',\r\n },\r\n inventoryCreationCardTitleApp: {\r\n id: 'app.layout.EntityCreationLayout.inventoryCreationCardTitleApp',\r\n defaultMessage: 'Connect App',\r\n },\r\n MSPolicyPlaceholder: {\r\n id: 'app.layout.EntityCreationLayout.MSPolicyPlaceholder',\r\n defaultMessage: 'Microsoft policies',\r\n },\r\n AdRenderingPoliciesPlaceholder: {\r\n id: 'app.layout.EntityCreationLayout.AdRenderingPoliciesPlaceholder',\r\n defaultMessage: 'Ad rendering policies',\r\n },\r\n SiteApprovalGuidelinesPlaceholder: {\r\n id: 'app.layout.EntityCreationLayout.SiteApprovalGuidelinesPlaceholder',\r\n defaultMessage: 'site approval guidelines',\r\n },\r\n AppApprovalGuidelinesPlaceholder: {\r\n id: 'app.layout.EntityCreationLayout.AppApprovalGuidelinesPlaceholder',\r\n defaultMessage: 'app approval guidelines',\r\n },\r\n adsCreationTitle: {\r\n id: 'app.layout.EntityCreationLayout.adsCreationTitle',\r\n defaultMessage: 'What type of ad unit do you want to create?',\r\n },\r\n adsCreationContentSectionOne: {\r\n id: 'app.layout.EntityCreationLayout.adsCreationContentSectionOne',\r\n defaultMessage: 'Ad units allow you to control where and when ads show across your inventory. Each ad unit must be connected to an existing piece of inventory.',\r\n },\r\n\r\n});\r\n","import { makeStyles, tokens } from '@fluentui/react-components';\r\n\r\nexport const useStyles = makeStyles({\r\n root: {\r\n marginLeft: '-3rem',\r\n },\r\n title: {\r\n marginTop: '2rem',\r\n },\r\n contentSection: {\r\n width: '50rem',\r\n marginLeft: 'calc(50% - 25rem)',\r\n color: tokens.colorNeutralForeground3,\r\n },\r\n imgWrapper: {\r\n width: '8rem',\r\n },\r\n cardGroupWrapper: {\r\n width: '50rem',\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n marginLeft: 'calc(50% - 25rem)',\r\n },\r\n cardWrapper: {\r\n width: 'calc(50% - 0.75rem)',\r\n },\r\n card: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n height: '18.75rem',\r\n },\r\n cardSelected: {\r\n backgroundColor: tokens.colorNeutralBackground2Selected,\r\n },\r\n cardTitle: {\r\n color: tokens.colorNeutralForeground1,\r\n },\r\n cardDescription: {\r\n color: tokens.colorNeutralForeground3,\r\n },\r\n});\r\n","import { Body1, Body2, Card, FluentProvider, Title2, Title3, webLightTheme } from '@fluentui/react-components';\r\nimport React from 'react';\r\nimport { FormattedMessage, InjectedIntlProps } from 'react-intl';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\nimport { FormState } from '../../components/Form/FormState/FormState';\r\nimport { injectRouterWithIntl } from '../../utils/ReactUtils';\r\nimport {\r\n getTythonAdUnitCreatePageRoute,\r\n getTythonAppAdunitCreationRoute,\r\n getTythonAppInventoryCreationRoute,\r\n getTythonSiteCreatePageRoute,\r\n} from '../../utils/routeUtils';\r\nimport { DetailPage } from '../DetailPage/DetailPage';\r\nimport { Footer } from '../Footer/Footer';\r\nimport ConnectAppImg from './connectApp.svg';\r\nimport ConnectSiteImg from './connectSite.svg';\r\nimport messages from './messages';\r\nimport { useStyles } from './styles';\r\n\r\nexport enum EntityTypeCreationType {\r\n Inventory = 'inventory',\r\n Ads = 'ads',\r\n}\r\n\r\nexport enum InventoryType {\r\n Site = 'site',\r\n App = 'app',\r\n}\r\n\r\ntype EntityCreationLayoutProps = {\r\n entityType: EntityTypeCreationType;\r\n};\r\n\r\ntype EntityCreationLayoutType = React.FC<EntityCreationLayoutProps & InjectedIntlProps & RouteComponentProps>;\r\n\r\nconst useEntityCreationLayout = ({ entityType, history }) => {\r\n const [selectedInventoryType, setSelectedInventoryType] = React.useState<InventoryType | undefined>(undefined);\r\n\r\n const entityCreationUrl = {\r\n [EntityTypeCreationType.Inventory]: {\r\n [InventoryType.Site]: getTythonSiteCreatePageRoute(),\r\n [InventoryType.App]: getTythonAppInventoryCreationRoute(),\r\n },\r\n [EntityTypeCreationType.Ads]: {\r\n [InventoryType.Site]: getTythonAdUnitCreatePageRoute(),\r\n [InventoryType.App]: getTythonAppAdunitCreationRoute(),\r\n },\r\n };\r\n\r\n const detailPageProps = React.useMemo(() => {\r\n return {\r\n saving: false,\r\n loading: false,\r\n onSubmit: () => history.push(entityCreationUrl[entityType][selectedInventoryType!]),\r\n submitButtonDisabled: !selectedInventoryType,\r\n submitLabel: 'Next',\r\n hasFormTitle: false,\r\n hideNavButton: false,\r\n pageMode: FormState.Edit,\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [selectedInventoryType, entityType]);\r\n\r\n return {\r\n detailPageProps,\r\n selectedInventoryType,\r\n setSelectedInventoryType,\r\n };\r\n};\r\n\r\nconst EntityCreationLayout: EntityCreationLayoutType = ({ entityType, intl: { formatMessage }, history }) => {\r\n // TODO: enable help article when content is ready\r\n // const { CMUIPopupArticleByIdAnchor } = useCMUIHelpExperience();\r\n const styles = useStyles();\r\n const { detailPageProps, selectedInventoryType, setSelectedInventoryType } = useEntityCreationLayout({ entityType, history });\r\n\r\n const EntityCreationLayoutTitle = {\r\n [EntityTypeCreationType.Inventory]: formatMessage(messages.inventoryCreationTitle),\r\n [EntityTypeCreationType.Ads]: formatMessage(messages.adsCreationTitle),\r\n };\r\n\r\n const EntityCreationLayoutContentSectionOne = {\r\n [EntityTypeCreationType.Inventory]: (\r\n <Body2 block className={styles.contentSection}>\r\n <FormattedMessage\r\n {...messages.inventoryCreationContentSectionOne}\r\n values={{\r\n helpLinkPlaceholder: formatMessage(messages.inventoryCreationContentSectionOneLink),\r\n // helpLinkPlaceholder: (\r\n // <CMUIPopupArticleByIdAnchor\r\n // useV2Link\r\n // query=\"ext07504\"\r\n // name={formatMessage(messages.inventoryCreationContentSectionOneLink)}\r\n // />\r\n // ),\r\n }}\r\n />\r\n </Body2>\r\n ),\r\n [EntityTypeCreationType.Ads]: (\r\n <Body2 block className={styles.contentSection}>\r\n {formatMessage(messages.adsCreationContentSectionOne)}\r\n </Body2>\r\n ),\r\n };\r\n\r\n const EntityCreationLayoutContentSectionTwo = {\r\n [EntityTypeCreationType.Inventory]: (\r\n <Body2 block className={styles.contentSection}>\r\n <FormattedMessage\r\n {...messages.inventoryCreationContentSectionTwo}\r\n values={{\r\n helpLinkPlaceholder: formatMessage(messages.inventoryCreationContentSectionTwoLink),\r\n // helpLinkPlaceholder: (\r\n // <CMUIPopupArticleByIdAnchor\r\n // useV2Link\r\n // query=\"ext07504\"\r\n // name={formatMessage(messages.inventoryCreationContentSectionTwoLink)}\r\n // />\r\n // ),\r\n }}\r\n />\r\n </Body2>\r\n ),\r\n };\r\n const EntityCreationLayoutSelectableCards = {\r\n [EntityTypeCreationType.Ads]: [\r\n {\r\n inventoryType: InventoryType.Site,\r\n cardIcon: <img className={styles.imgWrapper} src={ConnectSiteImg} alt={formatMessage(messages.adsCreationCardTitleSite)} />,\r\n cardTitle: (\r\n <Title3 block className={styles.cardTitle}>\r\n {formatMessage(messages.adsCreationCardTitleSite)}\r\n </Title3>\r\n ),\r\n },\r\n {\r\n inventoryType: InventoryType.App,\r\n cardIcon: <img className={styles.imgWrapper} src={ConnectAppImg} alt={formatMessage(messages.adsCreationCardTitleApp)} />,\r\n cardTitle: (\r\n <Title3 block className={styles.cardTitle}>\r\n {formatMessage(messages.adsCreationCardTitleApp)}\r\n </Title3>\r\n ),\r\n },\r\n ],\r\n [EntityTypeCreationType.Inventory]: [\r\n {\r\n inventoryType: InventoryType.Site,\r\n cardIcon: <img className={styles.imgWrapper} src={ConnectSiteImg} alt={formatMessage(messages.inventoryCreationCardTitleSite)} />,\r\n cardTitle: (\r\n <Title3 block className={styles.cardTitle}>\r\n {formatMessage(messages.inventoryCreationCardTitleSite)}\r\n </Title3>\r\n ),\r\n cardDescription: (\r\n <Body1 block className={styles.cardDescription}>\r\n <FormattedMessage\r\n {...messages.inventoryCreationCardDescriptionSite}\r\n values={{\r\n MSPolicyPlaceholder: formatMessage(messages.MSPolicyPlaceholder),\r\n AdRenderingPoliciesPlaceholder: formatMessage(messages.AdRenderingPoliciesPlaceholder),\r\n SiteApprovalGuidelinesPlaceholder: formatMessage(messages.SiteApprovalGuidelinesPlaceholder),\r\n /**\r\n * MSPolicyPlaceholder: (\r\n <CMUIPopupArticleByIdAnchor useV2Link query=\"ext07504\" name={formatMessage(messages.MSPolicyPlaceholder)} />\r\n ),\r\n AdRenderingPoliciesPlaceholder: (\r\n <CMUIPopupArticleByIdAnchor useV2Link query=\"ext07504\" name={formatMessage(messages.AdRenderingPoliciesPlaceholder)} />\r\n ),\r\n SiteApprovalGuidelinesPlaceholder: (\r\n <CMUIPopupArticleByIdAnchor useV2Link query=\"ext07504\" name={formatMessage(messages.SiteApprovalGuidelinesPlaceholder)} />\r\n ),\r\n */\r\n }}\r\n />\r\n </Body1>\r\n ),\r\n },\r\n {\r\n inventoryType: InventoryType.App,\r\n cardIcon: <img className={styles.imgWrapper} src={ConnectAppImg} alt={formatMessage(messages.inventoryCreationCardTitleApp)} />,\r\n cardTitle: (\r\n <Title3 block className={styles.cardTitle}>\r\n {formatMessage(messages.inventoryCreationCardTitleApp)}\r\n </Title3>\r\n ),\r\n cardDescription: (\r\n <Body1 block className={styles.cardDescription}>\r\n <FormattedMessage\r\n {...messages.inventoryCreationCardDescriptionApp}\r\n values={{\r\n MSPolicyPlaceholder: formatMessage(messages.MSPolicyPlaceholder),\r\n AdRenderingPoliciesPlaceholder: formatMessage(messages.AdRenderingPoliciesPlaceholder),\r\n AppApprovalGuidelinesPlaceholder: formatMessage(messages.AppApprovalGuidelinesPlaceholder),\r\n /**\r\n * MSPolicyPlaceholder: (\r\n <CMUIPopupArticleByIdAnchor useV2Link query=\"ext07504\" name={formatMessage(messages.MSPolicyPlaceholder)} />\r\n ),\r\n AdRenderingPoliciesPlaceholder: (\r\n <CMUIPopupArticleByIdAnchor useV2Link query=\"ext07504\" name={formatMessage(messages.AdRenderingPoliciesPlaceholder)} />\r\n ),\r\n AppApprovalGuidelinesPlaceholder: (\r\n <CMUIPopupArticleByIdAnchor useV2Link query=\"ext07504\" name={formatMessage(messages.AppApprovalGuidelinesPlaceholder)} />\r\n ),\r\n */\r\n }}\r\n />\r\n </Body1>\r\n ),\r\n },\r\n ],\r\n };\r\n\r\n return (\r\n <>\r\n {' '}\r\n <DetailPage {...detailPageProps}>\r\n <FluentProvider theme={webLightTheme}>\r\n <div className={styles.root}>\r\n <Title2 align=\"center\" block className={styles.title}>\r\n {EntityCreationLayoutTitle[entityType]}\r\n </Title2>\r\n <br />\r\n {EntityCreationLayoutContentSectionOne[entityType]}\r\n <br />\r\n {EntityCreationLayoutContentSectionTwo[entityType]}\r\n <br />\r\n <br />\r\n <div className={styles.cardGroupWrapper}>\r\n {EntityCreationLayoutSelectableCards[entityType].map((card) => (\r\n <div className={styles.cardWrapper}>\r\n <Card\r\n className={styles.card}\r\n selected={card.inventoryType === selectedInventoryType}\r\n onSelectionChange={() => setSelectedInventoryType(card.inventoryType)}\r\n >\r\n {card.cardIcon}\r\n {card.cardTitle}\r\n </Card>\r\n <br />\r\n {card.cardDescription}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </FluentProvider>\r\n </DetailPage>\r\n <Footer />\r\n </>\r\n );\r\n};\r\n\r\nexport default injectRouterWithIntl(EntityCreationLayout);\r\n","import React from 'react';\r\nimport EntityCreationLayout, { EntityTypeCreationType } from '../../../../layout/EntityCreationLayout';\r\n\r\nconst AdTypePage = () => {\r\n // TODO: enhance injectRouterWithIntl type to work with functional components\r\n // @ts-ignore\r\n return <EntityCreationLayout entityType={EntityTypeCreationType.Ads} />;\r\n};\r\n\r\nexport default AdTypePage;\r\n","import React from 'react';\r\nimport EntityCreationLayout, { EntityTypeCreationType } from '../../../../layout/EntityCreationLayout';\r\n\r\nconst InventoryTypePage = () => {\r\n // TODO: enhance injectRouterWithIntl type to work with functional components\r\n // @ts-ignore\r\n return <EntityCreationLayout entityType={EntityTypeCreationType.Inventory} />;\r\n};\r\n\r\nexport default InventoryTypePage;\r\n","import { getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { BreakPoints, IPubCenterFonts, IPubcenterSpacing } from '../../../../theme';\r\n\r\nexport interface ILoginPageStyles {\r\n root: string;\r\n main: string;\r\n title: string;\r\n email: string;\r\n button: string;\r\n}\r\n\r\nexport const getClassNames = (): ILoginPageStyles => {\r\n const theme = getTheme();\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const fonts = theme.fonts as IPubCenterFonts;\r\n const { size16 } = fonts;\r\n\r\n return mergeStyleSets({\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '100vh',\r\n },\r\n main: {\r\n margin: 'auto',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n width: spacing.size360,\r\n gap: spacing.size12,\r\n alignItems: 'center',\r\n textAlign: 'center',\r\n '@media(max-width: 360px)': {\r\n width: '90%',\r\n },\r\n },\r\n title: {\r\n ...size16,\r\n fontWeight: 600,\r\n },\r\n email: {\r\n ...size16,\r\n fontWeight: 'normal',\r\n },\r\n button: {\r\n width: spacing.size320,\r\n [BreakPoints.ResponsiveSmall]: {\r\n width: '90%',\r\n },\r\n },\r\n });\r\n};\r\n","import { DefaultButton, Image, PrimaryButton } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\nimport { Footer } from '../../../layout/Footer/Footer';\r\nimport UserNotFound from '../resources/UserNotFound.svg';\r\nimport { getClassNames } from './InvalidUser.styles';\r\n\r\nexport interface IInvalidUserErrorPageProps extends InjectedIntlProps, RouteComponentProps {\r\n errorImageAltText?: string;\r\n imageSrc?: string;\r\n renderTitle?: () => JSX.Element;\r\n title?: string;\r\n email?: string;\r\n titleSubText?: string;\r\n children?: React.ReactNode;\r\n primaryButtonLabel?: string;\r\n defaultButtonLabel?: string;\r\n onPrimaryButtonClick?: () => void;\r\n onDefaultButtonClick?: () => void;\r\n}\r\n\r\nexport const InvalidUserErrorPage = function ErrorPageComponent(props: IInvalidUserErrorPageProps): JSX.Element {\r\n const {\r\n errorImageAltText,\r\n imageSrc,\r\n renderTitle,\r\n title,\r\n email,\r\n titleSubText,\r\n primaryButtonLabel,\r\n defaultButtonLabel,\r\n onPrimaryButtonClick,\r\n onDefaultButtonClick,\r\n } = props;\r\n const { root, main, title: titleStyle, email: emailStyle, button: buttonStyle } = getClassNames();\r\n\r\n return (\r\n <div className={root}>\r\n <div className={main}>\r\n <Image src={imageSrc || UserNotFound} alt={errorImageAltText} />\r\n {renderTitle ? (\r\n renderTitle()\r\n ) : (\r\n <h1 className={titleStyle}>\r\n {title}\r\n <span className={emailStyle}>{email}</span>\r\n <br />\r\n {titleSubText}\r\n </h1>\r\n )}\r\n {primaryButtonLabel && onPrimaryButtonClick && (\r\n <PrimaryButton className={buttonStyle} text={primaryButtonLabel} onClick={onPrimaryButtonClick} />\r\n )}\r\n {defaultButtonLabel && onDefaultButtonClick && (\r\n <DefaultButton className={buttonStyle} text={defaultButtonLabel} onClick={onDefaultButtonClick} />\r\n )}\r\n {props.children}\r\n </div>\r\n <Footer {...props} />\r\n </div>\r\n );\r\n};\r\n","export function _urlBase64Decode(str: string) {\r\n let output = str.replace(/-/g, '+').replace(/_/g, '/');\r\n switch (output.length % 4) {\r\n case 0:\r\n break;\r\n case 2:\r\n output += '==';\r\n break;\r\n case 3:\r\n output += '=';\r\n break;\r\n default:\r\n output = '';\r\n }\r\n\r\n return decodeURIComponent(escape(window.atob(output)));\r\n}\r\n\r\nexport function decodeToken(token: string = '') {\r\n if (token === null || token === '') {\r\n return { upn: '' };\r\n }\r\n const parts = token.split('.');\r\n if (parts.length !== 3) {\r\n throw new Error('JWT must have 3 parts');\r\n }\r\n const decoded = _urlBase64Decode(parts[1]);\r\n if (!decoded) {\r\n throw new Error('Cannot decode the token');\r\n }\r\n return JSON.parse(decoded);\r\n}\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../logging/src';\r\nimport { UserContext, getAppStore, onUserContextChanged } from '../../../../@data';\r\nimport { checkInternalUserAccess } from '../../../../@data/services/AuthorizationService';\r\nimport * as pubCenterAADAuthService from '../../../../@data/services/PubCenterAADAuthService';\r\nimport { setUserRoles } from '../../../../@data/services/UserRoleService';\r\nimport {\r\n corpTenantId,\r\n silentTokenRequest as pubSilentTokenRequest,\r\n authTokenRequest as pubTokenRequest,\r\n} from '../../../../config/pubCenterAAD.config';\r\nimport { decodeToken } from '../../../../utils/JwtDecoderUtils';\r\nimport { onAuthPageInitialized, onLoadingSet } from '../actions';\r\n\r\norchestrator(onAuthPageInitialized, async ({ loginHint }) => {\r\n const { userContext, isInviteUserFlow } = getAppStore();\r\n if (userContext || window.location.hash || loginHint) {\r\n onLoadingSet(true);\r\n let authResponse = await pubCenterAADAuthService.handleLoginRedirectAsync();\r\n\r\n // Need the second check because we need to make sure accessToken is for PubCenter endpoint\r\n if (!authResponse || !authResponse.scopes.includes(pubSilentTokenRequest.scopes[0])) {\r\n Log.write('No auth response from redirection, trying to acquire token silently');\r\n authResponse = await pubCenterAADAuthService.acquireAuthResponseAsync(pubTokenRequest, loginHint);\r\n }\r\n\r\n if (authResponse && authResponse.scopes.includes(pubSilentTokenRequest.scopes[0])) {\r\n const idToken = authResponse.idToken;\r\n const userInfo = decodeToken(idToken);\r\n\r\n // Set user context\r\n const newUserContext = new UserContext();\r\n newUserContext.userName = authResponse.account ? authResponse.account.username : undefined;\r\n newUserContext.email = userInfo.email ?? userInfo.preferred_username;\r\n newUserContext.token = authResponse.accessToken;\r\n newUserContext.name = userInfo.name;\r\n newUserContext.firstName = userInfo.given_name;\r\n newUserContext.lastName = userInfo.family_name;\r\n\r\n onUserContextChanged(newUserContext);\r\n\r\n if (!(userInfo.tid !== corpTenantId && isInviteUserFlow)) {\r\n await setUserRoles(newUserContext);\r\n checkInternalUserAccess(newUserContext.userRoles);\r\n } else {\r\n Log.write('Skipping scope call for user invitation flow');\r\n }\r\n }\r\n }\r\n onLoadingSet(false);\r\n});\r\n","import { RedirectRequest } from '@azure/msal-browser';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { getLoginPageStore } from '..';\r\nimport { envBasedConfig } from '../../../../config/pubCenterAAD.config';\r\nimport { UNAUTHORIZED_LOCAL_STORAGE_LOCALE } from '../../../../constants';\r\nimport { validateSchema } from '../../../../utils';\r\nimport { onErrorsChanged, onLoginButtonClicked, onPubCenterAADLogin } from '../actions';\r\nimport { loginPageErrorModel } from '../store/schema/LoginPageErrorModel';\r\n\r\norchestrator(onLoginButtonClicked, async () => {\r\n /**\r\n * make sure browser storage is clean before firing the login mechanism\r\n * https://msasg.visualstudio.com/Bing_Ads/_sprints/taskboard/AdSyndication%20Team/Bing_Ads/2023/05-May?workitem=5233694\r\n */\r\n const localStorageUnAuthLocale = window.localStorage.getItem(UNAUTHORIZED_LOCAL_STORAGE_LOCALE);\r\n window?.localStorage.clear();\r\n window?.sessionStorage.removeItem('msal.interaction.status');\r\n sessionStorage.removeItem(`msal.${envBasedConfig.clientId}.interaction.status`);\r\n if (localStorageUnAuthLocale) {\r\n window.localStorage.setItem(UNAUTHORIZED_LOCAL_STORAGE_LOCALE, localStorageUnAuthLocale);\r\n }\r\n\r\n const { active } = getLoginPageStore();\r\n\r\n try {\r\n await validateSchema(loginPageErrorModel(), active);\r\n onErrorsChanged();\r\n\r\n const requestParams: Partial<RedirectRequest> = { loginHint: active.email };\r\n onPubCenterAADLogin(requestParams);\r\n } catch (e) {\r\n onErrorsChanged(e);\r\n return;\r\n }\r\n});\r\n","import { object, string } from 'yup';\r\nimport { ILoginPageViewModel } from '../../../../login/@data/store/schema/ILoginPageViewModel';\r\n\r\nexport function loginPageErrorModel() {\r\n return object<ILoginPageViewModel>().shape({\r\n email: string().trim().email('Please enter a valid email address.').required('Please enter your email address.'),\r\n });\r\n}\r\n","import { RedirectRequest } from '@azure/msal-browser';\r\nimport { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../logging/src';\r\nimport { onPubCenterAADLogin, onSwitchAccount } from '../actions';\r\n\r\norchestrator(onSwitchAccount, async (msg) => {\r\n try {\r\n // passing prompt parameter as 'select_account', which will redirect user select account page listing all the accounts in session or\r\n // any remembered accounts or an option to choose to use a different account\r\n const requestParams: Partial<RedirectRequest> = { prompt: 'select_account' };\r\n onPubCenterAADLogin(requestParams);\r\n } catch (e) {\r\n Log.write(e);\r\n }\r\n});\r\n","import { orchestrator } from 'satcheljs';\r\nimport { Log } from '../../../../../logging/src';\r\nimport { getAppStore, onUserContextChanged, UserContext } from '../../../../@data';\r\nimport { loginPubCenterAADUser } from '../../../../@data/services/PubCenterAADAuthService';\r\nimport { aadConfig } from '../../../../config/pubCenterAAD.config';\r\nimport { onLoadingSet, onPubCenterAADLogin } from '../actions';\r\n\r\norchestrator(onPubCenterAADLogin, async ({ requestParams }) => {\r\n Log.write('Logging in through new integrated login flow!!');\r\n\r\n let userContext = getAppStore().userContext;\r\n if (!userContext) {\r\n userContext = new UserContext();\r\n }\r\n\r\n onUserContextChanged(userContext);\r\n onLoadingSet(true);\r\n\r\n requestParams = { redirectStartPage: aadConfig.auth.redirectUri, ...requestParams };\r\n loginPubCenterAADUser(requestParams);\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n userDoesNotExist: {\r\n id: 'InvalidUser.userDoesNotExist',\r\n defaultMessage: 'There is no {appName} account associated with this Microsoft Account, ',\r\n },\r\n userDoesNotExist2: {\r\n id: 'InvalidUser.userDoesNotExist2',\r\n defaultMessage: 'Please check that you are signed in with the Microsoft Account for your {appName} account.',\r\n },\r\n switchAccountLabel: {\r\n id: 'InvalidUser.option1',\r\n defaultMessage: 'Sign in with a different Microsoft Account',\r\n },\r\n newAccount: {\r\n id: 'InvalidUser.option2',\r\n defaultMessage: 'Create a new Microsoft Account',\r\n },\r\n gotoAdvertising: {\r\n id: 'InvalidUser.option3',\r\n defaultMessage: 'Go to Microsoft Advertising',\r\n },\r\n imageAlt: {\r\n id: 'InvalidUser.imageAlt',\r\n defaultMessage: 'User does not exist',\r\n },\r\n signupToPubCenter: {\r\n id: 'InvalidUser.signupToPubCenter',\r\n defaultMessage: 'Sign up to {appName}',\r\n },\r\n unauthorizedInternalUser: {\r\n id: 'InvalidUser.unauthorizedInternalUser',\r\n defaultMessage: 'You do not have access to {appName}. Please use the link below to set up your access.',\r\n },\r\n requestAccess: {\r\n id: 'InvalidUser.requestAccess',\r\n defaultMessage: 'Request access to {appName}',\r\n },\r\n signInWithMSA: {\r\n id: 'InvalidUser.signInWithMSA',\r\n defaultMessage: 'Sign in with a Microsoft Account',\r\n },\r\n});\r\n","import React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport { getAppStore, onUserContextChanged } from '../../../@data';\r\nimport { APP_NAME_PUBCENTER, ENTERPRISE_USER_ACCESS_URL } from '../../../constants/AppConstants';\r\nimport { onSwitchAccount } from '../../login/@data';\r\nimport '../../login/@data/orchestrators';\r\nimport { InvalidUserErrorPage } from './InvalidUser';\r\nimport messages from './InvalidUser.messages';\r\nimport { getClassNames } from './InvalidUser.styles';\r\n\r\ninterface IUnauthorizedInternalUserPageProps extends InjectedIntlProps, RouteComponentProps {}\r\n\r\nexport const UnauthorizedInternalUserPage = injectIntl(function UnauthorizedInternalUserErrorPageComp(\r\n props: IUnauthorizedInternalUserPageProps\r\n): JSX.Element {\r\n const { formatMessage } = props.intl;\r\n const { userContext } = getAppStore();\r\n const { title: titleStyle } = getClassNames();\r\n\r\n const onSwitchAccountClicked = (): void => {\r\n if (userContext) {\r\n onUserContextChanged({ ...userContext });\r\n }\r\n onSwitchAccount();\r\n };\r\n\r\n const onRedirectToEnterpriseUserAccessUI = (): void => {\r\n window.location.replace(encodeURI(ENTERPRISE_USER_ACCESS_URL));\r\n };\r\n\r\n const renderTitle = (): JSX.Element => {\r\n return <h1 className={titleStyle}>{formatMessage(messages.unauthorizedInternalUser, { appName: APP_NAME_PUBCENTER })}</h1>;\r\n };\r\n\r\n return (\r\n <InvalidUserErrorPage\r\n {...props}\r\n errorImageAltText={formatMessage(messages.imageAlt)}\r\n renderTitle={renderTitle}\r\n primaryButtonLabel={formatMessage(messages.requestAccess, { appName: APP_NAME_PUBCENTER })}\r\n defaultButtonLabel={formatMessage(messages.signInWithMSA)}\r\n onPrimaryButtonClick={onRedirectToEnterpriseUserAccessUI}\r\n onDefaultButtonClick={onSwitchAccountClicked}\r\n />\r\n );\r\n});\r\n","import React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport { getAppStore, onUserContextChanged } from '../../../@data';\r\nimport { APP_NAME_NEW, APP_NAME_PUBCENTER } from '../../../constants';\r\nimport { GlobalSearchHeader } from '../../../layout/GlobalSearchHeader/GlobalSearchHeader';\r\nimport { onSwitchAccount } from '../../login/@data';\r\nimport '../../login/@data/orchestrators';\r\nimport { InvalidUserErrorPage } from './InvalidUser';\r\nimport messages from './InvalidUser.messages';\r\n\r\ninterface IUserDoesNotExistProps extends InjectedIntlProps, RouteComponentProps {}\r\n\r\nexport const UserDoesNotExistErrorPage = injectIntl(function UserDoesNotExistErrorPageComp(props: IUserDoesNotExistProps): JSX.Element {\r\n const { formatMessage } = props.intl;\r\n const { userContext } = getAppStore();\r\n\r\n const onSwitchAccountClicked = (): void => {\r\n if (userContext) {\r\n onUserContextChanged({ ...userContext });\r\n }\r\n onSwitchAccount();\r\n };\r\n\r\n // Removing signup button - to prevent new user signup\r\n /*\r\n const onRedirectToSignupPage = (): void => {\r\n let signupPageRoute = window.location.origin + SignUpPageRoute;\r\n\r\n if (isLocationPubCenter()) {\r\n const newDomainOrigin = PUBCENTER_TYTHON_DOMAIN_MAPPING[window.location.host];\r\n signupPageRoute = `${newDomainOrigin}${SignUpPageRoute}`;\r\n }\r\n Log.write('Redirecting to new domain: ' + signupPageRoute);\r\n window.location.replace(signupPageRoute);\r\n };\r\n */\r\n\r\n const isInternalUser = userContext?.email && userContext?.email.indexOf('@microsoft.com') !== -1;\r\n\r\n return (\r\n <>\r\n <GlobalSearchHeader />\r\n <InvalidUserErrorPage\r\n {...props}\r\n errorImageAltText={formatMessage(messages.imageAlt)}\r\n title={formatMessage(messages.userDoesNotExist, { appName: isInternalUser ? APP_NAME_PUBCENTER : APP_NAME_NEW })}\r\n titleSubText={formatMessage(messages.userDoesNotExist2, { appName: isInternalUser ? APP_NAME_PUBCENTER : APP_NAME_NEW })}\r\n email={userContext?.email}\r\n // primaryButtonLabel={formatMessage(messages.signupToPubCenter, { appName: APP_NAME_NEW })}\r\n defaultButtonLabel={formatMessage(messages.switchAccountLabel)}\r\n // onPrimaryButtonClick={onRedirectToSignupPage}\r\n onDefaultButtonClick={onSwitchAccountClicked}\r\n />\r\n </>\r\n );\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n imageAlt: {\r\n id: 'NoAccess.imageAlt',\r\n defaultMessage: 'User does not have access to this website',\r\n },\r\n pageTitle: {\r\n id: 'NoAccess.pageTitle',\r\n defaultMessage: 'No Access',\r\n },\r\n errorMessage: {\r\n id: 'NoAccess.errorMessage',\r\n defaultMessage: `{appName} does not recognize this account`,\r\n },\r\n errorDescriptionPart1: {\r\n id: 'NoAccess.errorDescription',\r\n defaultMessage: `We are unable to validate your request at this time. Please `,\r\n },\r\n contactSupport: {\r\n id: 'NoAccess.contactSupport',\r\n defaultMessage: `contact support`,\r\n },\r\n errorDescriptionPart2: {\r\n id: 'NoAccess.errorDescription',\r\n defaultMessage: ` with subject \"No access\" and use reference message code: {messageCode} and transaction ID: {transactionId}`,\r\n },\r\n});\r\n","import React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport { isTythonSelfServeUser } from '../../../../@data';\r\nimport { CUSTOM_MESSAGE_CODE } from '../../../../@data/services/OneVetIntegrationService';\r\nimport { ExternalLink } from '../../../../components/ExternalLink';\r\nimport { APP_NAME_NEW, APP_NAME_PUBCENTER, SUPPORT_EMAIL, TYTHON_SUPPORT_EMAIL } from '../../../../constants/AppConstants';\r\nimport { InvalidUserErrorPage } from '../InvalidUser';\r\nimport { getClassNames } from '../InvalidUser.styles';\r\nimport messages from './NoAccessPage.messages';\r\n\r\ninterface INoAccessErrorPageProps extends InjectedIntlProps, RouteComponentProps {}\r\n\r\nexport const NoAccessErrorPage = injectIntl(function NoAccessErrorPageComp(props: INoAccessErrorPageProps): JSX.Element {\r\n const { formatMessage } = props.intl;\r\n const { title: titleStyle } = getClassNames();\r\n\r\n const renderTitle = (): JSX.Element => {\r\n return (\r\n <div>\r\n <h1>{formatMessage(messages.pageTitle)}</h1>\r\n <h2 className={titleStyle}>\r\n {formatMessage(messages.errorMessage, { appName: isTythonSelfServeUser() ? APP_NAME_NEW : APP_NAME_PUBCENTER })}\r\n </h2>\r\n <p>\r\n {formatMessage(messages.errorDescriptionPart1)}\r\n <ExternalLink\r\n href={`mailto:${isTythonSelfServeUser() ? TYTHON_SUPPORT_EMAIL : SUPPORT_EMAIL}`}\r\n aria-label={formatMessage(messages.contactSupport)}\r\n >\r\n {formatMessage(messages.contactSupport)}\r\n </ExternalLink>\r\n {formatMessage(messages.errorDescriptionPart2, {\r\n messageCode: CUSTOM_MESSAGE_CODE,\r\n transactionId: sessionStorage.getItem('session_id'),\r\n })}\r\n </p>\r\n </div>\r\n );\r\n };\r\n\r\n return <InvalidUserErrorPage {...props} errorImageAltText={formatMessage(messages.imageAlt)} renderTitle={renderTitle} />;\r\n});\r\n","import React, { useEffect } from 'react';\r\nimport { handleDomainRedirection } from '../../@data';\r\nimport { LandingPageRoute } from '../../Routes';\r\nimport { USER_SIGNUP_KEY } from '../../constants/AppConstants';\r\nimport { Page } from '../../layout/PageLayout/PageLayout';\r\nimport { injectRouterWithIntl } from '../../utils';\r\nimport { isLocationPubCenter } from '../../utils/UrlUtils';\r\nimport { onPubCenterAADLogin } from '../login/@data';\r\n\r\nexport const LandingPage = injectRouterWithIntl(function LandingPageComponent(props) {\r\n useEffect(() => {\r\n localStorage.setItem(USER_SIGNUP_KEY, 'true');\r\n\r\n if (isLocationPubCenter()) {\r\n handleDomainRedirection('', LandingPageRoute);\r\n } else {\r\n onPubCenterAADLogin();\r\n }\r\n }, []);\r\n\r\n return <Page {...props} />;\r\n});\r\n","import { mutator } from 'satcheljs';\r\nimport { onLoadingSet } from '../actions';\r\nimport { getLoginPageStore } from '..';\r\n\r\nmutator(onLoadingSet, (msg) => {\r\n getLoginPageStore().loading = msg.value;\r\n});\r\n","import { default as React, useEffect } from 'react';\r\nimport { Redirect } from 'react-router-dom';\r\nimport { Log } from '../../../logging/src';\r\nimport { LogType } from '../../../logging/src/LogType';\r\nimport { getAppStore, showTokenExpirationNotification } from '../../@data';\r\nimport AppMessages from '../../App.messages';\r\nimport { DefaultRoute } from '../../Routes';\r\nimport { PageSpinner } from '../../components/Spinners';\r\nimport {\r\n DOMAIN_REDIRECTION_QUERY_PARAM,\r\n REDIRECT_URI_SESSION_STORAGE_KEY,\r\n TOKEN_EXPIRED_SEARCH_PARAM_KEY,\r\n TYTHON_DOMAIN_REDIRECTION_CACHE_KEY,\r\n} from '../../constants/AppConstants';\r\nimport { getUrlSearchParameter, injectIntlWithObserver } from '../../utils';\r\nimport { getLoginPageStore, onAuthPageInitialized, onLoadingSet } from './@data';\r\nimport './@data/mutators/userAuthentication';\r\nimport './@data/orchestrators';\r\nimport LoginPageMessages from './LoginPage.messages';\r\nimport { ILoginPageProps } from './components/LoginPageView';\r\nimport { RedirectionSpinner } from './components/RedirectionSpinner';\r\n\r\nexport const LoginPage = injectIntlWithObserver(function LoginPageComponent({ location, intl }: ILoginPageProps) {\r\n const { formatMessage } = intl;\r\n const { loading } = getLoginPageStore();\r\n const [isLoading, setLoading] = React.useState(true);\r\n const [isRedirectionFlow, setRedirectionFlow] = React.useState(!!sessionStorage.getItem(TYTHON_DOMAIN_REDIRECTION_CACHE_KEY));\r\n\r\n useEffect(() => {\r\n Log.info(`Navigated to new integrated login page: ${window.location.href}`);\r\n const loginHint = getUrlSearchParameter(window.location.search, DOMAIN_REDIRECTION_QUERY_PARAM);\r\n\r\n if (loginHint) {\r\n Log.write(`Setting redirected user cache for : ${loginHint}`, LogType.DEBUG);\r\n setRedirectionFlow(true);\r\n sessionStorage.setItem(TYTHON_DOMAIN_REDIRECTION_CACHE_KEY, 'true');\r\n onLoadingSet(true);\r\n }\r\n onAuthPageInitialized(loginHint);\r\n\r\n const searchParam = new URLSearchParams(location.search);\r\n if (searchParam.get(TOKEN_EXPIRED_SEARCH_PARAM_KEY) === 'true') {\r\n showTokenExpirationNotification();\r\n }\r\n // eslint-disable-next-line\r\n }, []);\r\n\r\n useEffect(() => setLoading(!!loading), [loading]);\r\n\r\n const { userContext, isInviteUserFlow, waiting } = getAppStore();\r\n // tslint:disable-next-line: no-any\r\n const { from } = (location.state as any) || { from: { pathname: DefaultRoute } };\r\n\r\n if (!isLoading) {\r\n if (isInviteUserFlow) {\r\n return <Redirect to={'acceptUserInvite/code=redirect/locale=redirect'} />;\r\n }\r\n\r\n let redirectTo = from.pathname;\r\n if (userContext && userContext.token) {\r\n if (redirectTo === '/login') {\r\n redirectTo = DefaultRoute;\r\n }\r\n\r\n if (sessionStorage.getItem(REDIRECT_URI_SESSION_STORAGE_KEY)) {\r\n redirectTo = sessionStorage.getItem(REDIRECT_URI_SESSION_STORAGE_KEY) || '';\r\n sessionStorage.removeItem(REDIRECT_URI_SESSION_STORAGE_KEY);\r\n }\r\n\r\n Log.debug(`Redirecting to: ${redirectTo} after login`);\r\n return <Redirect to={redirectTo} />;\r\n }\r\n } else if (!userContext && !isRedirectionFlow && !window.location.search.includes(DOMAIN_REDIRECTION_QUERY_PARAM)) {\r\n return <Redirect to={'/'} />;\r\n }\r\n\r\n // by default if you're here, then authentication is ongoing. Once user is authentication, then redirect user to appropriate page\r\n return isRedirectionFlow ? (\r\n <RedirectionSpinner label={formatMessage(LoginPageMessages.redirectionMessage)} />\r\n ) : (\r\n <PageSpinner label={formatMessage(waiting ? AppMessages.loadingWaitingLabel : AppMessages.loadingLabel)} />\r\n );\r\n});\r\n","import { IStyleFunctionOrObject, ITextFieldStyleProps, ITextFieldStyles, getTheme, mergeStyleSets } from '@fluentui/react';\r\nimport { BreakPoints, IPubCenterFonts, IPubcenterPalette, IPubcenterSpacing } from '../../../theme';\r\n\r\nexport interface ILoginPageStyles {\r\n titleStyle: string;\r\n descStyle: string;\r\n buttonBackground: string;\r\n signInButtonStyle: string;\r\n imageStyle: string;\r\n}\r\n\r\nconst { ResponsiveNonSmall, ResponsiveSmall, ResponsiveExtraSmall } = BreakPoints;\r\n\r\nexport const getClassNames = (): ILoginPageStyles => {\r\n const theme = getTheme();\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const fonts = theme.fonts as IPubCenterFonts;\r\n const { size32, size16 } = fonts;\r\n\r\n return mergeStyleSets({\r\n titleStyle: {\r\n ...size32,\r\n color: theme.palette.white,\r\n margin: `0 0 ${spacing.size24} 0`,\r\n textAlign: 'center',\r\n },\r\n descStyle: {\r\n color: theme.palette.white,\r\n ...size16,\r\n textAlign: 'center',\r\n [ResponsiveNonSmall]: {\r\n width: '382px',\r\n },\r\n [ResponsiveSmall]: {\r\n maxWidth: '320px',\r\n minWidth: '224px',\r\n },\r\n },\r\n buttonBackground: {\r\n borderRadius: '10px',\r\n background: '#0a152ecc',\r\n position: 'absolute',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n padding: `${spacing.size80} ${spacing.size32}`,\r\n [ResponsiveNonSmall]: {\r\n width: `446px`,\r\n },\r\n [ResponsiveSmall]: {\r\n maxWidth: `calc(100vw - ${spacing.size96})`,\r\n width: 'max-content',\r\n },\r\n [ResponsiveExtraSmall]: {\r\n maxWidth: `calc(100vw - ${spacing.size96})`,\r\n },\r\n },\r\n signInButtonStyle: {\r\n height: spacing.size48,\r\n background: 'transparent',\r\n color: theme.palette.white,\r\n border: `${spacing.size2} solid ${theme.palette.white}`,\r\n marginTop: spacing.size16,\r\n marginLeft: spacing.size24,\r\n marginRight: spacing.size24,\r\n selectors: {\r\n '&:focus': {\r\n outline: `1px solid ${theme.palette.white}`,\r\n },\r\n },\r\n [ResponsiveNonSmall]: {\r\n width: spacing.size320,\r\n },\r\n [ResponsiveSmall]: {\r\n minWidth: '224px',\r\n maxWidth: spacing.size320,\r\n width: '-webkit-fill-available',\r\n },\r\n },\r\n imageStyle: {\r\n width: '100vw',\r\n height: '100vh',\r\n },\r\n });\r\n};\r\n\r\nexport const getTextFieldStyles = (props: ITextFieldStyleProps): IStyleFunctionOrObject<ITextFieldStyleProps, ITextFieldStyles> => {\r\n const theme = getTheme();\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const { size16 } = theme.fonts as IPubCenterFonts;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const { hasErrorMessage } = props;\r\n\r\n return {\r\n root: {\r\n marginTop: spacing.size24,\r\n marginLeft: spacing.size24,\r\n marginRight: spacing.size24,\r\n [ResponsiveNonSmall]: {\r\n width: spacing.size320,\r\n },\r\n [ResponsiveSmall]: {\r\n minWidth: '224px',\r\n maxWidth: spacing.size320,\r\n width: '-webkit-fill-available',\r\n },\r\n },\r\n fieldGroup: [\r\n {\r\n height: spacing.size48,\r\n },\r\n hasErrorMessage && {\r\n background: palette.messageBarError,\r\n border: 'none',\r\n },\r\n ],\r\n field: [\r\n hasErrorMessage && {\r\n color: palette.redDark,\r\n border: `2px solid ${theme.palette.white}`,\r\n },\r\n ],\r\n errorMessage: {\r\n color: theme.palette.white,\r\n ...size16,\r\n width: spacing.size320,\r\n },\r\n };\r\n};\r\n","import { DefaultButton, IRefObject, ITextField, Image, ImageFit, TextField, getTheme } from '@fluentui/react';\r\nimport React, { useLayoutEffect, useRef } from 'react';\r\nimport { InjectedIntlProps } from 'react-intl';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\nimport { LOCAL_STORAGE_LOCALE } from '../../../constants';\r\nimport { GlobalSearchHeader } from '../../../layout/GlobalSearchHeader/GlobalSearchHeader';\r\nimport { InternationalizationLayout } from '../../../layout/InternationalizationLayout';\r\nimport { NotificationLayout } from '../../../layout/NotificationLayout';\r\nimport { injectIntlWithObserver } from '../../../utils';\r\nimport { onLanguageChanged } from '../../ad-management/Account/Settings/@data/mutatorActions';\r\nimport { getLoginPageStore, onEmailChanged, onLoginButtonClicked } from '../@data';\r\nimport '../@data/mutators/userAuthentication';\r\nimport '../@data/orchestrators';\r\nimport LoginPageMessages from '../LoginPage.messages';\r\nimport { getClassNames, getTextFieldStyles } from '../LoginPage.styles';\r\nimport loginBackgroundImage from '../resources/loginBackgroundImage.svg';\r\n\r\nexport interface ILoginPageProps extends RouteComponentProps, InjectedIntlProps {}\r\n\r\nexport const LoginPageView = injectIntlWithObserver(function LoginPageComponent({ location, intl }: ILoginPageProps) {\r\n const { formatMessage } = intl;\r\n const { title, welcome, description, emailPlaceholder, signInButton, imageAlt, signInButtonAriaLabel } = LoginPageMessages;\r\n const { active, errors } = getLoginPageStore();\r\n const { email } = active;\r\n const { buttonBackground, imageStyle, titleStyle, descStyle, signInButtonStyle } = getClassNames();\r\n const emailInputRef = useRef<{ state: { isFocused: boolean } }>(null);\r\n\r\n useLayoutEffect(() => {\r\n const localStorageLocal = localStorage.getItem(LOCAL_STORAGE_LOCALE);\r\n if (localStorageLocal) {\r\n onLanguageChanged(localStorageLocal, LOCAL_STORAGE_LOCALE);\r\n }\r\n });\r\n\r\n return (\r\n <>\r\n <GlobalSearchHeader />\r\n <InternationalizationLayout />\r\n <NotificationLayout ignoreGlobalAsync>\r\n <Image\r\n imageFit={ImageFit.cover}\r\n src={loginBackgroundImage}\r\n className={imageStyle}\r\n alt={formatMessage(imageAlt)}\r\n shouldFadeIn={true}\r\n />\r\n <div\r\n className={buttonBackground}\r\n onKeyDown={(ev) => {\r\n if (ev.key === 'Enter' && emailInputRef?.current?.state?.isFocused) {\r\n onLoginButtonClicked();\r\n }\r\n }}\r\n >\r\n <h1 className={titleStyle}>{formatMessage(title)}</h1>\r\n <label className={descStyle}>{formatMessage(welcome)}</label>\r\n <label className={descStyle}>{formatMessage(description)}</label>\r\n <TextField\r\n id=\"signInEmailInput\"\r\n componentRef={emailInputRef as IRefObject<ITextField>}\r\n styles={getTextFieldStyles({ hasErrorMessage: !!errors.email, theme: getTheme() })}\r\n value={email}\r\n placeholder={formatMessage(emailPlaceholder)}\r\n onChange={(_, val) => onEmailChanged(val || '')}\r\n errorMessage={errors.email}\r\n type=\"email\"\r\n />\r\n <DefaultButton\r\n id=\"signInButton\"\r\n className={signInButtonStyle}\r\n onClick={onLoginButtonClicked}\r\n text={formatMessage(signInButton)}\r\n ariaLabel={formatMessage(signInButtonAriaLabel)}\r\n />\r\n </div>\r\n </NotificationLayout>\r\n </>\r\n );\r\n});\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n signUpDetailsTitle: {\r\n id: 'signup.signUpDetails.title',\r\n defaultMessage: 'Before you begin',\r\n },\r\n signUpDetailsContentYes: {\r\n id: 'signup.signUpDetails.contentYes',\r\n defaultMessage: 'Yes, send me customized help and performance suggestions',\r\n },\r\n signUpDetailsContentNo: {\r\n id: 'signup.signUpDetails.contentNo',\r\n defaultMessage: `No, I don't want customized help and performance suggestions`,\r\n },\r\n signUpDetailsCountryTerritory: {\r\n id: 'signup.signUpDetails.CountryTerritory',\r\n defaultMessage: 'Your payment country / territory',\r\n },\r\n signUpDetailsTermsAndConditions: {\r\n id: 'signup.signUpDetails.TermsAndConditions',\r\n defaultMessage: 'Our terms and conditions',\r\n },\r\n signUpDetailsCountry: {\r\n id: 'signup.signUpDetails.country',\r\n defaultMessage: 'Your payment country / territory',\r\n },\r\n agreementText: {\r\n id: 'signup.agreementText',\r\n defaultMessage: 'I have read and accepted the terms and conditions. *',\r\n },\r\n defaultCountry: {\r\n id: 'signup.defaultCountry',\r\n defaultMessage: 'United States',\r\n },\r\n messageBarText: {\r\n id: 'signup.messageBar',\r\n defaultMessage:\r\n 'Select the country/region here you currently live and where your bank account is associated. This will help you get paid.',\r\n },\r\n organizationName: {\r\n id: 'signup.organizationName',\r\n defaultMessage: 'Organization name',\r\n },\r\n orgNamePlaceholder: {\r\n id: 'signup.orgNamePlaceholder',\r\n defaultMessage: 'Do not exceed {limit} characters',\r\n },\r\n firstName: {\r\n id: 'signup.firstName',\r\n defaultMessage: 'First name',\r\n },\r\n lastName: {\r\n id: 'signup.lastName',\r\n defaultMessage: 'Last name',\r\n },\r\n signupdetailsBoldBanner: {\r\n id: 'signupdetails.boldBanner',\r\n defaultMessage: '{appName} is currently only accepting payment in the United States',\r\n },\r\n signupdetailsInfoBanner: {\r\n id: 'signupdetails.infoBanner',\r\n defaultMessage:\r\n 'Note that your country and currency selections cannot be changed after submitting. Also, if you use Google Ad Manager, it is recommended that you use the same currency selection.',\r\n },\r\n signupdetailsWaitlist: {\r\n id: 'signupdetails.waitlist',\r\n defaultMessage: 'waitlist',\r\n },\r\n signupEmailOptIn: {\r\n id: 'signup.email.OptIn',\r\n defaultMessage: 'I would like information, tips, and offers about {appName}.',\r\n },\r\n signupEmailOptInPrivacyLink: {\r\n id: 'signup.email.OptIn.PrivacyLink',\r\n defaultMessage: 'Privacy Statement',\r\n },\r\n signUpDetailsPreferredLanguage: {\r\n id: 'signupdetails.preferred.language',\r\n defaultMessage: 'Preferred language',\r\n },\r\n signUpDetailsCurrency: {\r\n id: 'signupdetails.currency',\r\n defaultMessage: 'Currency',\r\n },\r\n});\r\n","import { IPubcenterSpacing } from '../../../../../theme';\r\nimport { IAcceptInviteStyleProps, IAcceptInviteStyles } from './AcceptInvite.types';\r\n\r\nexport const getStyles = (props: IAcceptInviteStyleProps): IAcceptInviteStyles => {\r\n const { theme } = props;\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n\r\n return {\r\n switchNowButton: {\r\n color: theme.palette.themePrimary,\r\n },\r\n subComponentStyles: {\r\n checkbox: {\r\n root: {\r\n marginBottom: spacing.size8,\r\n },\r\n },\r\n },\r\n privacyEmailLinkWrapper: {\r\n marginTop: `-${spacing.size12}`,\r\n display: 'flex',\r\n gap: spacing.size6,\r\n },\r\n };\r\n};\r\n","import {\r\n ActionButton,\r\n Checkbox,\r\n classNamesFunction,\r\n ComboBox,\r\n getTheme,\r\n IComboBoxOption,\r\n IProcessedStyleSet,\r\n Link,\r\n TextField,\r\n} from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport {\r\n getAppStore,\r\n onHelpInfoCalloutOpened,\r\n onHelpInfoChanged,\r\n onIsAcceptInviteFlowChanged,\r\n onUserInvitationCodeChanged,\r\n} from '../../../../@data';\r\nimport { getSupportedLanguagesDropDownOptions } from '../../../../@data/utils/supportedLanguages';\r\nimport AppMessages from '../../../../App.messages';\r\nimport { FormItem, FormState } from '../../../../components/Form';\r\nimport { FormLabel } from '../../../../components/Form/FormLabel';\r\nimport { PageSpinner } from '../../../../components/Spinners';\r\nimport { ContentLayout } from '../../../../layout/ContentLayout/ContentLayout';\r\nimport { DetailPage } from '../../../../layout/DetailPage/DetailPage';\r\nimport { injectIntlWithObserver } from '../../../../utils';\r\nimport { getLoginPageStore, onSwitchAccount } from '../../../login/@data';\r\nimport signUpMessages from '../../../signup/component/SignupDetails/SignUpDetails.messages';\r\nimport { getStore as getUserPageStore } from '../@data';\r\nimport {\r\n onAcceptInvitePageInitialized,\r\n onAcceptInvitePageSubmitted,\r\n onFormCancelled,\r\n onFormContactByEmailChanged,\r\n onFormEmailAddressChanged,\r\n onFormFirstNameChanged,\r\n onFormLanguageChanged,\r\n onFormLastNameChanged,\r\n onFormPhoneNumberChanged,\r\n onFormUserLocaleChanged,\r\n} from '../@data/actions';\r\nimport '../@data/mutators';\r\nimport '../@data/orchestrators';\r\nimport messages from '../UserPage.messages';\r\nimport { getStyles } from './AcceptInvite.styles';\r\nimport { IAccepInviteProps, IAcceptInviteStyleProps, IAcceptInviteStyles } from './AcceptInvite.types';\r\n\r\nconst getClassNames = classNamesFunction<IAcceptInviteStyleProps, IAcceptInviteStyles>();\r\n\r\nexport const AcceptInvitePage = injectIntlWithObserver(\r\n class extends React.Component<IAccepInviteProps> {\r\n private _classNames: IProcessedStyleSet<IAcceptInviteStyles>;\r\n public componentDidMount() {\r\n const invitationCode = this.props.match.params.invitationcode;\r\n const invitationLocale = this.props.match.params.invitationLocale;\r\n\r\n onAcceptInvitePageInitialized(invitationCode, invitationLocale);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { formatMessage } = this.props.intl;\r\n const theme = getTheme();\r\n const store = getUserPageStore();\r\n const loginPageStore = getLoginPageStore();\r\n const { userContext, helpInfo } = getAppStore();\r\n this._classNames = getClassNames(getStyles, { theme });\r\n\r\n // Spin till loading is set\r\n if (!userContext?.token && loginPageStore.loading) {\r\n return <PageSpinner label={formatMessage(AppMessages.loadingLabel)} />;\r\n }\r\n\r\n return (\r\n <ContentLayout {...this.props} ignoreNotificationAsync>\r\n <DetailPage\r\n titleLabel={formatMessage(messages.acceptInvite)}\r\n submitLabel={formatMessage(messages.createUser)}\r\n onSubmit={() => this._onSubmit()}\r\n onCancel={() => this._onCancel()}\r\n onNavClick={() => this._onCancel()}\r\n saving={getAppStore().saving}\r\n helpId={'pop_PCv4_AcceptInvite'}\r\n pageMode={FormState.AcceptInvite}\r\n >\r\n <>\r\n <FormItem>\r\n <TextField\r\n label={formatMessage(messages.userName)}\r\n ariaLabel={formatMessage(messages.userName)}\r\n required={true}\r\n value={store.active.userName}\r\n disabled={true}\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <TextField\r\n required={true}\r\n label={formatMessage(messages.firstName)}\r\n ariaLabel={formatMessage(messages.firstName)}\r\n onChange={(_, value) => onFormFirstNameChanged(value)}\r\n value={store.active.firstName}\r\n errorMessage={store.errors.firstName}\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <TextField\r\n required={true}\r\n label={formatMessage(messages.lastName)}\r\n ariaLabel={formatMessage(messages.lastName)}\r\n value={store.active.lastName}\r\n onChange={(_, value) => onFormLastNameChanged(value)}\r\n errorMessage={store.errors.lastName}\r\n />\r\n </FormItem>\r\n <FormItem formWidth={440}>\r\n <TextField\r\n required={true}\r\n label={formatMessage(messages.emailAddress)}\r\n ariaLabel={formatMessage(messages.emailAddress)}\r\n value={store.active.emailAddress}\r\n onChange={(_, value) => onFormEmailAddressChanged(value)}\r\n errorMessage={store.errors.emailAddress}\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <ComboBox\r\n useComboBoxAsMenuWidth={true}\r\n autoComplete=\"on\"\r\n label={formatMessage(messages.preferredLanguage)}\r\n required={true}\r\n options={getSupportedLanguagesDropDownOptions(getAppStore().locale)}\r\n selectedKey={store.active.language?.toLocaleLowerCase()}\r\n onChange={(_, value) => this._onPreferredLanguageChange(value)}\r\n errorMessage={store.errors.language}\r\n />\r\n </FormItem>\r\n <FormItem>\r\n <FormLabel\r\n labelContent={formatMessage(messages.marketingContactSetting)}\r\n calloutContent={helpInfo}\r\n iconButtonOnClick={() => onHelpInfoCalloutOpened('pop_PCv4_MarketingContactSettings')}\r\n calloutOnDismiss={() => onHelpInfoChanged()}\r\n intl={this.props.intl}\r\n />\r\n </FormItem>\r\n <div className={this._classNames.privacyEmailLinkWrapper}>\r\n <Checkbox\r\n required={false}\r\n label={formatMessage(signUpMessages.signupEmailOptIn)}\r\n ariaLabel={formatMessage(messages.email)}\r\n checked={!!store.active.contactByEmail}\r\n onChange={(_, value) => onFormContactByEmailChanged(value)}\r\n />\r\n <Link href=\"http://go.microsoft.com/fwlink/?LinkId=521839\" target=\"_blank\">\r\n {formatMessage(signUpMessages.signupEmailOptInPrivacyLink)}\r\n </Link>\r\n </div>\r\n {store.active.contactByPhone && (\r\n <FormItem>\r\n <TextField\r\n label={formatMessage(messages.telephoneNumber)}\r\n ariaLabel={formatMessage(messages.telephoneNumber)}\r\n value={store.active.phoneNumber}\r\n onChange={(_, value) => onFormPhoneNumberChanged(value)}\r\n required={true}\r\n errorMessage={store.errors.phoneNumber}\r\n />\r\n </FormItem>\r\n )}\r\n <label>{formatMessage(messages.useDifferentAccountMessage, { email: store.active.emailAddress })}</label>\r\n <ActionButton className={this._classNames.switchNowButton} onClick={this._onSwitchAccountButtonClicked}>\r\n {formatMessage(messages.switchNow)}\r\n </ActionButton>\r\n </>\r\n </DetailPage>\r\n </ContentLayout>\r\n );\r\n }\r\n\r\n private _onSwitchAccountButtonClicked = (): void => {\r\n const invitationCode = this.props.match.params.invitationcode;\r\n onIsAcceptInviteFlowChanged(true);\r\n onUserInvitationCodeChanged(invitationCode);\r\n onSwitchAccount();\r\n };\r\n\r\n private _onPreferredLanguageChange = (value?: IComboBoxOption): void => {\r\n onFormUserLocaleChanged(value);\r\n value && typeof value.key === 'string' && onFormLanguageChanged(value.key);\r\n };\r\n\r\n private _onSubmit = (): void => {\r\n onAcceptInvitePageSubmitted();\r\n };\r\n\r\n private _onCancel = (): void => {\r\n onFormCancelled();\r\n };\r\n }\r\n);\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport default defineMessages({\r\n formTitle: {\r\n id: 'support.form.title',\r\n defaultMessage: 'Contact Support',\r\n },\r\n formTitleInputHeader: {\r\n id: 'support.form.title.input.header',\r\n defaultMessage: 'Title',\r\n },\r\n formEmailInputHeader: {\r\n id: 'support.form.email.input.header',\r\n defaultMessage: 'Email',\r\n },\r\n formEmailInputPlaceholder: {\r\n id: 'support.form.email.input.placeholder',\r\n defaultMessage: 'Enter email',\r\n },\r\n formCreationFailedTitle: {\r\n id: 'support.form.creation.failed.title',\r\n defaultMessage: 'Could not be sent',\r\n },\r\n formCreationFailedDetails: {\r\n id: 'support.form.creation.failed.details',\r\n defaultMessage: '{msgTitle} This request could not be created. Please try again.',\r\n },\r\n formCreationSuccessTitle: {\r\n id: 'support.form.creation.success.title',\r\n defaultMessage: 'Your support request is sent',\r\n },\r\n formCreationSuccessDetails: {\r\n id: 'support.form.creation.success.details',\r\n defaultMessage:\r\n 'We’re reviewing your request: {ticketNumber}. You’ll receive an email confirmation as soon as possible. You can close this tab at any time.',\r\n },\r\n formTitleInputPlaceholder: {\r\n id: 'support.form.title.input.placeholder',\r\n defaultMessage: 'Subject',\r\n },\r\n formDescriptionInputHeader: {\r\n id: 'support.form.description.input.header',\r\n defaultMessage: 'Description',\r\n },\r\n formDescriptionInputPlaceholder: {\r\n id: 'support.form.description.input.placeholder',\r\n defaultMessage: 'Please share your feedback or describe your experience.',\r\n },\r\n formSubmitButton: {\r\n id: 'support.form.submit.button',\r\n defaultMessage: 'Submit',\r\n },\r\n formSubmitButtonLoading: {\r\n id: 'support.form.submit.button.loading',\r\n defaultMessage: 'Submitting Form',\r\n },\r\n formDescriptionWordsCount: {\r\n id: 'support.form.description.words.count',\r\n defaultMessage: '{count} words remaining',\r\n },\r\n formDescriptionWordCount: {\r\n id: 'support.form.description.word.count',\r\n defaultMessage: '{count} word remaining',\r\n },\r\n});\r\n","import { ITheme, classNamesFunction, getTheme } from '@fluentui/react';\r\nimport { BreakPoints, IPubcenterPalette, IPubcenterSpacing } from '../../../theme';\r\nimport { ISupportPageStyles } from './types';\r\n\r\nconst getStyles = ({ theme }) => {\r\n const spacing = theme.spacing as IPubcenterSpacing;\r\n const palette = theme.palette as IPubcenterPalette;\r\n const { ResponsiveSmall, ResponsiveMedium } = BreakPoints;\r\n const imageWidth = spacing.size192;\r\n return {\r\n footerWrapper: {\r\n height: '100%',\r\n },\r\n root: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n minHeight: `calc(100% - ${spacing.size48})`,\r\n overflowX: 'scroll',\r\n },\r\n pageTitle: {\r\n fontSize: spacing.size20,\r\n fontWeight: '600',\r\n lineHeight: spacing.size28,\r\n },\r\n formWrapper: {\r\n marginTop: spacing.size24,\r\n '.ms-TextField-fieldGroup': {\r\n borderRadius: spacing.size2,\r\n borderColor: palette.neutralTertiaryAlt,\r\n },\r\n [ResponsiveSmall]: {\r\n width: '100%',\r\n },\r\n },\r\n emailIcon: {\r\n marginLeft: `calc((100% - ${imageWidth})/2)`,\r\n width: imageWidth,\r\n },\r\n submitButton: {\r\n margin: `${spacing.size12} 0`,\r\n float: 'right',\r\n },\r\n errorBannerWrapper: {\r\n marginBottom: 0,\r\n },\r\n formSuccessHead: {\r\n marginTop: spacing.size24,\r\n },\r\n descriptionWordCountWrapper: {\r\n display: 'block',\r\n textAlign: 'right',\r\n fontSize: spacing.size10,\r\n fontColor: palette.neutralTertiaryAlt,\r\n },\r\n formInputStyles: {\r\n width: 440,\r\n [ResponsiveMedium]: { width: 324 },\r\n [ResponsiveSmall]: { width: 280 },\r\n },\r\n transparentText: {\r\n color: 'transparent',\r\n display: 'block',\r\n userSelect: 'none'\r\n }\r\n };\r\n};\r\n\r\nconst getClassNames = classNamesFunction<{ theme: ITheme }, ISupportPageStyles>();\r\nexport const classNames = getClassNames(getStyles, { theme: getTheme() });\r\n","import { useEffect, useState } from 'react';\r\nimport { Log } from '../../../logging/src/Log';\r\nimport { LayoutMode, UserContext, buildRequestHeadersWithAuthToken, onLayoutChanged } from '../../@data';\r\nimport { uiConfig } from '../../config/ui.config';\r\nimport { usePUID, usePreloadSVGImages } from '../../hooks';\r\nimport emailLogo from './emailLogo.svg';\r\nimport emailSentLogo from './emailSentLogo.svg';\r\nimport { UseSupportPage } from './types';\r\n\r\nexport const MAX_WORD_COUNT = 700;\r\nconst postFormSubmission = async (props: {\r\n title: string;\r\n description: string;\r\n email: string;\r\n puid: string;\r\n userContext: UserContext;\r\n formattedLocale: string;\r\n countryCode: string;\r\n}) => {\r\n const { title, description, email, puid, userContext, formattedLocale, countryCode } = props;\r\n const url = uiConfig.getApiBaseAddress() + '/ucmTicket/createAuthenticatedCase';\r\n const headers = await buildRequestHeadersWithAuthToken(url, userContext);\r\n\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: JSON.stringify({\r\n title,\r\n description,\r\n email,\r\n puid,\r\n SupportLanguage: formattedLocale,\r\n SupportCountry: countryCode,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n return Promise.reject(response);\r\n }\r\n\r\n const responseJson: { data: { caseNumber: string } } = await response.json();\r\n if (responseJson.data) {\r\n return Promise.resolve(responseJson.data);\r\n }\r\n } catch (err) {\r\n const error = `Search operation failed for ${url}. Errors: ${err}`;\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const useSupportPage: UseSupportPage = ({ appStore, location, formattedLocale, countryCode }) => {\r\n const { userContext } = appStore;\r\n const [titleInput, setTitleInput] = useState('');\r\n const [descriptionInput, setDescriptionInput] = useState('');\r\n const [emailInput, setEmailInput] = useState(userContext?.email ?? '');\r\n const [shouldRenderFailureMessage, setShouldRenderFailureMessage] = useState(false);\r\n const [createdTicketCaseNumber, setCreatedTicketCaseNumber] = useState('');\r\n const [isFormLoading, setIsFormLoading] = useState(false);\r\n const puid = usePUID();\r\n const emailRegex = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i;\r\n const isFormValid =\r\n titleInput.length > 0 && descriptionInput.length > 0 && emailRegex.test(emailInput) && descriptionInput.length <= MAX_WORD_COUNT;\r\n\r\n const onFormSubmit = async () => {\r\n if (puid && userContext) {\r\n setIsFormLoading(true);\r\n setShouldRenderFailureMessage(false);\r\n postFormSubmission({\r\n title: titleInput,\r\n description: descriptionInput,\r\n email: emailInput,\r\n puid,\r\n userContext,\r\n formattedLocale,\r\n countryCode,\r\n })\r\n .then((data) => {\r\n setCreatedTicketCaseNumber(data!.caseNumber);\r\n // Accessibility enhancement: once submit success, focus on terms and conditions link\r\n const termsAndConditionsLink = document?.querySelector?.('a[href=\"/terms-and-conditions\"]') as HTMLAnchorElement | null;\r\n termsAndConditionsLink?.focus?.();\r\n })\r\n .catch((err) => {\r\n Log.error(err);\r\n setShouldRenderFailureMessage(true);\r\n })\r\n .finally(() => setIsFormLoading(false));\r\n }\r\n };\r\n\r\n // Declare outside the function so it persists between calls\r\n let debounceTimeout: NodeJS.Timeout | null = null;\r\n\r\n const onDescriptionChange = (description: string) => {\r\n const prevWords = descriptionInput.split(/\\s+/).filter(Boolean).length;\r\n const newWords = description.split(/\\s+/).filter(Boolean).length;\r\n\r\n if (newWords <= MAX_WORD_COUNT) {\r\n setDescriptionInput(description);\r\n\r\n // If word count changed (word completed or deleted)\r\n if (prevWords !== newWords) {\r\n // Force screen reader to re-announce by temporarily removing and re-adding the element\r\n const wordCountElement = document.getElementById('description-word-count');\r\n if (wordCountElement) {\r\n const parent = wordCountElement.parentNode;\r\n const nextSibling = wordCountElement.nextSibling;\r\n\r\n // Clear any existing timeout before setting a new one\r\n if (debounceTimeout) {\r\n clearTimeout(debounceTimeout);\r\n }\r\n\r\n // Set new timeout\r\n debounceTimeout = setTimeout(() => {\r\n parent?.removeChild(wordCountElement);\r\n parent?.insertBefore(wordCountElement, nextSibling);\r\n }, 100);\r\n }\r\n }\r\n }\r\n };\r\n\r\n usePreloadSVGImages([emailLogo, emailSentLogo]);\r\n\r\n useEffect(() => {\r\n onLayoutChanged(LayoutMode.Default);\r\n /**\r\n * remove required attribute from the form fields, this is for accessibility\r\n * workaround that Edge is interacting with the required attribute with tooltip\r\n * rendered unexpectedly. remove the required attribute to avoid the tooltip\r\n * render by browser, in user perspective we have disabled submit button while\r\n * inputs are empty and added required UX to support the experience. Tooltip is\r\n * redundant in this case.\r\n */\r\n document.getElementById('supportTitleInput')?.removeAttribute('required');\r\n document.getElementById('supportDescriptionInput')?.removeAttribute('required');\r\n document.getElementById('supportEmailInput')?.removeAttribute('required');\r\n // eslint-disable-next-line\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (shouldRenderFailureMessage) {\r\n setShouldRenderFailureMessage(false);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [descriptionInput, titleInput, emailInput]);\r\n\r\n useEffect(() => {\r\n // Parse the query parameters\r\n const queryParams = new URLSearchParams(location.search);\r\n const subject = queryParams.get('subject');\r\n\r\n // Set the form title if 'subject' query param exists\r\n if (subject) {\r\n setTitleInput(subject);\r\n }\r\n }, [location.search]); // Depend on 'search' part of the location object\r\n\r\n return {\r\n titleInput,\r\n descriptionInput,\r\n emailInput,\r\n isFormValid,\r\n shouldRenderFailureMessage,\r\n createdTicketCaseNumber,\r\n isFormLoading,\r\n setTitleInput,\r\n setEmailInput,\r\n onDescriptionChange,\r\n onFormSubmit,\r\n };\r\n};\r\n","import { Announced, MessageBar, MessageBarType, PrimaryButton, Spinner, Text, TextField } from '@fluentui/react';\r\nimport React, { useEffect, useRef } from 'react';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport { useI18n } from '../../../i18n/useI18n';\r\nimport { getAppStore } from '../../@data';\r\nimport { FormItem } from '../../components/Form';\r\nimport { Main } from '../../components/Main/Main';\r\nimport { Footer } from '../../layout/Footer/Footer';\r\nimport { InternationalizationLayout } from '../../layout/InternationalizationLayout';\r\nimport { injectRouterAndIntlWithObserver } from '../../utils';\r\nimport { getStore } from '../ad-management/Account/Settings/@data/store/store';\r\nimport emailLogo from './emailLogo.svg';\r\nimport emailSentLogo from './emailSentLogo.svg';\r\nimport messages from './messages';\r\nimport { classNames } from './styles';\r\nimport { ISupportPageProps } from './types';\r\nimport { MAX_WORD_COUNT, useSupportPage } from './useSupportPage';\r\n\r\nexport const SupportPage = injectRouterAndIntlWithObserver(function SupportPageComponent({ intl, location }: ISupportPageProps) {\r\n const { formatMessage } = intl;\r\n const appStore = getAppStore();\r\n const { publisher, userContext } = appStore;\r\n const { systemPreferences } = getStore().active;\r\n const { formattedLocale, countryCode } = useI18n({ systemPreferences, publisher, userContext });\r\n const {\r\n emailInput,\r\n titleInput,\r\n descriptionInput,\r\n isFormValid,\r\n isFormLoading,\r\n shouldRenderFailureMessage,\r\n createdTicketCaseNumber,\r\n onDescriptionChange,\r\n onFormSubmit,\r\n setTitleInput,\r\n setEmailInput,\r\n } = useSupportPage({ appStore, location, formattedLocale, countryCode });\r\n const {\r\n root,\r\n pageTitle,\r\n formWrapper,\r\n emailIcon,\r\n submitButton,\r\n errorBannerWrapper,\r\n formSuccessHead,\r\n formInputStyles,\r\n footerWrapper,\r\n descriptionWordCountWrapper,\r\n transparentText,\r\n } = classNames;\r\n\r\n // Ref for focusing on the success message\r\n const successMessageRef = useRef(null);\r\n\r\n // Use effect to focus on the success message when a ticket is created\r\n useEffect(() => {\r\n if (createdTicketCaseNumber && successMessageRef.current) {\r\n (successMessageRef.current as HTMLElement).focus();\r\n }\r\n }, [createdTicketCaseNumber]);\r\n\r\n return (\r\n <div className={footerWrapper}>\r\n <InternationalizationLayout />\r\n <Main className={root}>\r\n <div className={formWrapper}>\r\n <h1 className={pageTitle}>{formatMessage(createdTicketCaseNumber ? messages.formCreationSuccessTitle : messages.formTitle)}</h1>\r\n <img\r\n className={emailIcon}\r\n src={createdTicketCaseNumber ? emailSentLogo : emailLogo}\r\n alt={formatMessage(createdTicketCaseNumber ? messages.formCreationSuccessTitle : messages.formTitle)}\r\n />\r\n {!createdTicketCaseNumber ? (\r\n <>\r\n <FormItem styles={{ root: formInputStyles }}>\r\n <TextField\r\n id=\"supportEmailInput\"\r\n autoComplete=\"off\"\r\n disabled={isFormLoading}\r\n label={formatMessage(messages.formEmailInputHeader)}\r\n required={true}\r\n value={emailInput}\r\n onChange={(_, value: string) => setEmailInput(value)}\r\n placeholder={formatMessage(messages.formEmailInputPlaceholder)}\r\n aria-label={formatMessage(messages.formEmailInputPlaceholder)}\r\n />\r\n </FormItem>\r\n <FormItem styles={{ root: formInputStyles }}>\r\n <TextField\r\n id=\"supportTitleInput\"\r\n autoComplete=\"off\"\r\n disabled={isFormLoading}\r\n label={formatMessage(messages.formTitleInputHeader)}\r\n required={true}\r\n value={titleInput}\r\n onChange={(_, value: string) => setTitleInput(value)}\r\n placeholder={formatMessage(messages.formTitleInputPlaceholder)}\r\n aria-label={formatMessage(messages.formTitleInputPlaceholder)}\r\n />\r\n </FormItem>\r\n <FormItem styles={{ root: formInputStyles }}>\r\n <TextField\r\n id=\"supportDescriptionInput\"\r\n autoComplete=\"off\"\r\n disabled={isFormLoading}\r\n multiline\r\n label={formatMessage(messages.formDescriptionInputHeader)}\r\n required={true}\r\n resizable={false}\r\n value={descriptionInput}\r\n onChange={(e, value: string) => onDescriptionChange(value)}\r\n placeholder={formatMessage(messages.formDescriptionInputPlaceholder)}\r\n aria-describedby=\"description-word-count\"\r\n />\r\n <Text id=\"description-word-count\" className={descriptionWordCountWrapper} aria-atomic=\"true\">\r\n {formatMessage(\r\n MAX_WORD_COUNT - descriptionInput.split(/\\s+/).filter(Boolean).length === 1\r\n ? messages.formDescriptionWordCount\r\n : messages.formDescriptionWordsCount,\r\n { count: MAX_WORD_COUNT - descriptionInput.split(/\\s+/).filter(Boolean).length }\r\n )}\r\n </Text>\r\n </FormItem>\r\n </>\r\n ) : (\r\n <>\r\n <div aria-live=\"assertive\">\r\n <Announced message={formatMessage(messages.formCreationSuccessTitle)} />\r\n <Announced message={formatMessage(messages.formCreationSuccessDetails, { ticketNumber: createdTicketCaseNumber })} />\r\n </div>\r\n <FormItem\r\n className={formSuccessHead}\r\n styles={{ root: formInputStyles }}\r\n tabIndex={-1} // Make the FormItem focusable\r\n // @ts-ignore\r\n ref={successMessageRef} // Attach the ref to focus this item\r\n role=\"alert\" // Ensure screen readers treat this as an alert\r\n >\r\n <Text>\r\n <span className={transparentText}>\r\n <FormattedMessage {...messages.formCreationSuccessTitle} />\r\n </span>\r\n <FormattedMessage {...messages.formCreationSuccessDetails} values={{ ticketNumber: createdTicketCaseNumber }} />\r\n </Text>\r\n </FormItem>\r\n </>\r\n )}\r\n\r\n {shouldRenderFailureMessage && (\r\n <FormItem className={errorBannerWrapper} styles={{ root: formInputStyles }}>\r\n <MessageBar messageBarType={MessageBarType.error} messageBarIconProps={{ iconName: 'StatusErrorFull' }}>\r\n <FormattedMessage\r\n {...messages.formCreationFailedDetails}\r\n values={{\r\n msgTitle: <b>{formatMessage(messages.formCreationFailedTitle)}</b>,\r\n }}\r\n />\r\n </MessageBar>\r\n </FormItem>\r\n )}\r\n\r\n {!createdTicketCaseNumber && (\r\n <PrimaryButton\r\n ariaLabel={formatMessage(messages.formSubmitButton)}\r\n className={submitButton}\r\n disabled={!isFormValid || isFormLoading}\r\n onClick={onFormSubmit}\r\n aria-live=\"assertive\"\r\n >\r\n {isFormLoading ? (\r\n <Spinner ariaLabel={formatMessage(messages.formSubmitButtonLoading)} />\r\n ) : (\r\n formatMessage(messages.formSubmitButton)\r\n )}\r\n </PrimaryButton>\r\n )}\r\n </div>\r\n </Main>\r\n <Footer />\r\n </div>\r\n );\r\n});\r\n","import { Spinner } from '@fluentui/react';\r\nimport { observer } from 'mobx-react-lite';\r\nimport React, { useEffect, useMemo } from 'react';\r\nimport { useI18n } from '../../../i18n/useI18n';\r\nimport { getAppStore, isTythonSelfServeUser } from '../../@data';\r\nimport { isLocationPubCenter } from '../../utils/UrlUtils';\r\nimport { getStore } from '../ad-management/Account/Settings/@data/store/store';\r\nimport { onFetchTnC } from './@data';\r\nimport { getStore as getTnCStore } from './@data/store/store';\r\n\r\nexport const TermsNConditionsPage = observer(() => {\r\n const { content, nonTythonContent, isDataLoaded } = getTnCStore();\r\n const { userContext, publisher } = getAppStore();\r\n const { systemPreferences } = getStore().active;\r\n const { locale } = useI18n({ systemPreferences, publisher, userContext });\r\n\r\n const tncContentString = useMemo(() => {\r\n // when there is no user login, we will render TnC depends on window url\r\n if (!userContext && isDataLoaded) {\r\n return isLocationPubCenter() ? nonTythonContent : content;\r\n }\r\n // when user is logged in, we will render TnC depends on user tython self serve flag\r\n if (userContext && isDataLoaded) {\r\n return isTythonSelfServeUser() ? content : nonTythonContent;\r\n }\r\n\r\n return undefined;\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [userContext, isDataLoaded]);\r\n\r\n useEffect(() => {\r\n onFetchTnC(locale);\r\n }, [locale]);\r\n\r\n return tncContentString ? (\r\n <div style={{ padding: 12, position: 'absolute' }}>\r\n <div style={{ padding: 12, border: '1px solid', borderRadius: 3 }}>\r\n <div\r\n dangerouslySetInnerHTML={{\r\n __html: isLocationPubCenter()\r\n ? tncContentString\r\n ?.replaceAll('Monetize Now', 'pubCenter')\r\n ?.replaceAll('MONETIZE NOW', 'PUBCENTER')\r\n ?.replaceAll('monetizenow', 'pubcenter')\r\n : tncContentString,\r\n }}\r\n />\r\n </div>\r\n </div>\r\n ) : (\r\n <div style={{ width: '100%', height: '100%', display: 'flex', justifyContent: 'center' }}>\r\n <Spinner size={3} />\r\n </div>\r\n );\r\n});\r\n","import { MAIN_CONTENT_ID } from '../constants/AppConstants';\r\n\r\nexport function handleSkipToMainContentClick(): void {\r\n const mainContentNode = document.getElementById(MAIN_CONTENT_ID);\r\n if (mainContentNode) {\r\n mainContentNode.tabIndex = -1;\r\n mainContentNode.focus();\r\n mainContentNode.removeAttribute('tabIndex');\r\n }\r\n}\r\n","import { defineMessages } from 'react-intl';\r\nexport default defineMessages({\r\n domainStringValidator: {\r\n id: 'yup.domain',\r\n defaultMessage: 'Invalid domain name',\r\n },\r\n duplicateDomainStringValidator: {\r\n id: 'yup.duplicateDomain',\r\n defaultMessage: 'Site domain name already exists',\r\n },\r\n nameStringValidator: {\r\n id: 'yup.name',\r\n defaultMessage: 'Invalid name',\r\n },\r\n duplicateNameStringValidator: {\r\n id: 'yup.duplicateName',\r\n defaultMessage: 'Site name already exists',\r\n },\r\n});\r\n","import { DefaultButton } from '@fluentui/react';\r\nimport * as React from 'react';\r\nimport { InjectedIntlProps, injectIntl } from 'react-intl';\r\nimport { Redirect, Route, RouteComponentProps, Switch, withRouter } from 'react-router-dom';\r\nimport './@data/mutators';\r\nimport './@data/orchestrators';\r\nimport appMessages from './App.messages';\r\nimport { getClassNames } from './App.styles';\r\nimport { AuthenticatedRoute } from './AuthenticatedRoute';\r\nimport {\r\n DefaultRoute,\r\n LandingPageRoute,\r\n LogInPageRoute,\r\n NoAccessErrorPageRoute,\r\n SupportPageRoute,\r\n UnauthorizedInternalUserPageRoute,\r\n UserDoesNotExistErrorPageRoute,\r\n getGlobalRoutes,\r\n} from './Routes';\r\nimport { IRoute } from './Routes.types';\r\nimport { TNC_HREF_PATH } from './constants/AppConstants';\r\nimport { Page } from './layout/PageLayout/PageLayout';\r\nimport { GlobalSearchResultRouter } from './pages/GlobalSearch/GlobalSearchResultRouter';\r\nimport { AboutUsPage } from './pages/about-us/AboutUsPage';\r\nimport AdTypePage from './pages/ad-management/Ads/AdTypePage';\r\nimport InventoryTypePage from './pages/ad-management/Inventory/InventoryTypePage';\r\nimport { UnauthorizedInternalUserPage, UserDoesNotExistErrorPage } from './pages/error-pages/InvalidUser';\r\nimport { NoAccessErrorPage } from './pages/error-pages/InvalidUser/NoAccessPage/NoAccesPage';\r\nimport { LandingPage } from './pages/landing-page/LandingPage';\r\nimport { LoginPage } from './pages/login/LoginPage';\r\nimport { LoginPageView } from './pages/login/components/LoginPageView';\r\nimport { AcceptInvitePage } from './pages/partner-management/User/AcceptInvite/AcceptInvite';\r\nimport { SupportPage } from './pages/support';\r\nimport { TermsNConditionsPage } from './pages/terms-and-conditions/TermsNConditionsPage';\r\nimport { handleSkipToMainContentClick } from './utils/DomUtils';\r\nimport { isLocationPubCenter } from './utils/UrlUtils';\r\nimport { getTythonAdsCreationPageRoute, getTythonInventoryCreationPageRoute } from './utils/routeUtils';\r\nimport { validatorFactory } from './utils/validation/ValidatorFactory';\r\n\r\nexport interface IAppProps extends RouteComponentProps, InjectedIntlProps {}\r\n\r\nexport const ApplicationRoute = withRouter(\r\n injectIntl(\r\n // NOTE: Use named classes for easier debugging. This name would appear in the React DevTools and error traces too.\r\n class AppRoute extends React.Component<IAppProps> {\r\n constructor(props: IAppProps) {\r\n super(props);\r\n validatorFactory(this.props.intl);\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { formatMessage } = this.props.intl;\r\n const classNames = getClassNames();\r\n\r\n return (\r\n <>\r\n <DefaultButton\r\n onClick={handleSkipToMainContentClick}\r\n text={formatMessage(appMessages.skipToMainContent)}\r\n className={classNames.skipButton}\r\n />\r\n <Switch>\r\n {isLocationPubCenter() ? <Redirect exact path=\"/\" to={DefaultRoute} /> : <Route exact path=\"/\" component={AboutUsPage} />}\r\n <Route path={LogInPageRoute} component={LoginPage} />\r\n <Route path={'/loginV2'} component={LoginPageView} />\r\n {/* <Route path={SignUpPageRoute} component={SignUpPage} /> */}\r\n <Route path={LandingPageRoute} component={LandingPage} />\r\n <Route path={UserDoesNotExistErrorPageRoute} component={UserDoesNotExistErrorPage} />\r\n <Route path={NoAccessErrorPageRoute} component={NoAccessErrorPage} />\r\n <Route path={UnauthorizedInternalUserPageRoute} component={UnauthorizedInternalUserPage} />\r\n <Route path={TNC_HREF_PATH} component={TermsNConditionsPage} />\r\n <Page {...this.props}>\r\n <Switch>\r\n <Route path=\"/acceptUserInvite/code=:invitationcode/locale=:invitationLocale\" component={AcceptInvitePage} />\r\n <Route path=\"/acceptUserInvite/code=:invitationcode\" component={AcceptInvitePage} />\r\n <AuthenticatedRoute\r\n path={getTythonInventoryCreationPageRoute()}\r\n key={getTythonInventoryCreationPageRoute()}\r\n component={InventoryTypePage}\r\n routeProps={this.props}\r\n />\r\n <AuthenticatedRoute\r\n path={getTythonAdsCreationPageRoute()}\r\n key={getTythonAdsCreationPageRoute()}\r\n component={AdTypePage}\r\n routeProps={this.props}\r\n />\r\n {getGlobalRoutes().map((route: IRoute) => (\r\n <AuthenticatedRoute key={route.key} path={route.key} component={route.component} routeProps={this.props} />\r\n ))}\r\n <AuthenticatedRoute\r\n key={SupportPageRoute}\r\n path={SupportPageRoute}\r\n component={SupportPage as React.ComponentType<{}>}\r\n routeProps={this.props}\r\n />\r\n <AuthenticatedRoute key=\"/search\" path=\"/search\" component={GlobalSearchResultRouter} routeProps={this.props} />\r\n <Redirect path=\"*\" to={DefaultRoute} />\r\n </Switch>\r\n </Page>\r\n </Switch>\r\n </>\r\n );\r\n }\r\n }\r\n )\r\n);\r\n","import { InjectedIntl } from 'react-intl';\r\nimport { domainInitialize, duplicateDomainInitialize, duplicateNameInitialize, nameInitialize } from './DomainStringValidator';\r\nimport messages from './validation.messages';\r\n\r\nexport function validatorFactory(intl: InjectedIntl) {\r\n domainInitialize(intl.formatMessage(messages.domainStringValidator));\r\n duplicateDomainInitialize(intl.formatMessage(messages.duplicateDomainStringValidator));\r\n nameInitialize(intl.formatMessage(messages.nameStringValidator));\r\n duplicateNameInitialize(intl.formatMessage(messages.duplicateNameStringValidator));\r\n}\r\n","import { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { InjectedIntlProps, IntlProvider } from 'react-intl';\r\nimport { RouteComponentProps, withRouter } from 'react-router-dom';\r\nimport { useI18n } from '../i18n/useI18n';\r\nimport { getAppStore } from './@data';\r\nimport './@data/mutators';\r\nimport './@data/orchestrators';\r\nimport { ApplicationRoute } from './ApplicationRoute';\r\nimport useWindowsAppFeatureFlag from './hooks/useWindowsAppFeatureFlag';\r\nimport { getStore } from './pages/ad-management/Account/Settings/@data/store/store';\r\n\r\nexport interface IAppProps extends RouteComponentProps, InjectedIntlProps {}\r\n\r\nexport const App = withRouter(\r\n observer(() => {\r\n const { systemPreferences } = getStore().active;\r\n const { publisher, userContext } = getAppStore();\r\n const { locale, messages } = useI18n({ systemPreferences, publisher, userContext });\r\n useWindowsAppFeatureFlag(userContext, publisher);\r\n\r\n return (\r\n <IntlProvider locale={locale} messages={messages} onError={() => null}>\r\n <ApplicationRoute />\r\n </IntlProvider>\r\n );\r\n })\r\n);\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\nimport { Log } from \"./logging/src/Log\";\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read http://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\ntype Config = {\r\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\r\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\r\n};\r\n\r\nexport function register(config?: Config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(\r\n (process as { env: { [key: string]: string } }).env.PUBLIC_URL,\r\n window.location.href\r\n );\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n Log.info(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit http://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: string, config?: Config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (!installingWorker) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n Log.info(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See http://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n Log.info('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n Log.error(`Error during service worker registration: ${JSON.stringify(error)}`);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n Log.info(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import { ThemeProvider } from '@fluentui/react';\r\nimport { QueryClient } from '@tanstack/query-core';\r\nimport { QueryClientProvider } from '@tanstack/react-query';\r\nimport { ReactQueryDevtools } from '@tanstack/react-query-devtools';\r\nimport * as React from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport { addThreatMetrixScripts } from './app/@data/services/OneVetIntegrationService';\r\nimport { tythonRedirectionUtils } from './app/@data/utils/redirectionUtils';\r\nimport { App } from './app/App';\r\nimport './index.css';\r\nimport { Log } from './logging/src/Log';\r\nimport * as serviceWorker from './serviceWorker';\r\nimport { PubcenterCustomizations } from './theme';\r\nconst queryClient = new QueryClient();\r\n\r\nReactDOM.render(\r\n <QueryClientProvider client={queryClient}>\r\n <ReactQueryDevtools initialIsOpen={false} />\r\n <BrowserRouter>\r\n <ThemeProvider theme={PubcenterCustomizations} style={{ height: 'inherit' }}>\r\n <App />\r\n </ThemeProvider>\r\n </BrowserRouter>\r\n </QueryClientProvider>,\r\n document.getElementById('root') as HTMLElement\r\n);\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: http://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n\r\n// This triggers the singleton 'Log' class and provides a single instance of\r\n// the class that can be used anywhere in the UI code. 'Log.write' can now be\r\n// used to write to ARIA and console\r\nLog.getInstance();\r\n\r\naddThreatMetrixScripts();\r\n\r\n/**\r\n * Add a iframe to transfer localstorage from pubcenter to tython domain\r\n * In the new domain, add a listener to receive and set the localstorage\r\n */\r\ntythonRedirectionUtils();\r\n","import { PUBCENTER_DOMAINS, PUBCENTER_TYTHON_DOMAIN_MAPPING } from '../../constants';\r\nimport { isLocationPubCenter } from '../../utils';\r\n\r\nexport function tythonRedirectionUtils() {\r\n if (!isLocationPubCenter()) {\r\n window.addEventListener('message', function (e) {\r\n if (PUBCENTER_DOMAINS.includes(e.origin) && e.data) {\r\n const localStorageCache = JSON.parse(e.data);\r\n\r\n Object.keys(localStorageCache)?.forEach((key) => {\r\n localStorage.setItem(key, localStorageCache[key]);\r\n });\r\n }\r\n });\r\n } else {\r\n const newDomainOrigin = PUBCENTER_TYTHON_DOMAIN_MAPPING[window.location.host];\r\n const iframe = document.createElement('iframe');\r\n iframe.id = 'redirectionIframe';\r\n iframe.src = newDomainOrigin;\r\n iframe.style.display = 'none';\r\n iframe.style.width = '0';\r\n iframe.style.height = '0';\r\n\r\n document.body.appendChild(iframe);\r\n }\r\n}\r\n"],"sourceRoot":""}