{"version":3,"file":"static/js/application.async.landing~7b72a7aa.89306f9e.chunk.js","mappings":"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","sources":["../../../node_modules/@bingads-webui-campaign/observe-in-dom/src/observe-in-dom.js","../../../node_modules/@bingads-webui-campaign/overview-diagnostic-card/src/const.js","../../../node_modules/@bingads-webui-campaign/overview-diagnostic-card/src/status-details-helpers/utils.js","../../../node_modules/@bingads-webui-campaign/overview-diagnostic-card/src/status-details-helpers/get-billing-detail.js","../../../node_modules/@bingads-webui-campaign/overview-diagnostic-card/src/status-details-helpers/get-campaign-status.js","../../../node_modules/@bingads-webui-campaign/overview-diagnostic-card/src/status-details-helpers/get-editorial-status.js","../../../node_modules/@bingads-webui-campaign/overview-diagnostic-card/src/status-details-helpers/get-bidding-status.js","../../../node_modules/@bingads-webui-campaign/overview-diagnostic-card/src/status-details-helpers/get-invalid-event-strings.js","../../../node_modules/@bingads-webui-campaign/overview-diagnostic-card/src/status-details-helpers/get-conversion-status.js","../../../node_modules/@bingads-webui-campaign/overview-diagnostic-card/src/card-status-text-helper.js","../../../node_modules/@bingads-webui-campaign/overview-diagnostic-card/src/use-data.js","../../../node_modules/@bingads-webui-campaign/overview-diagnostic-card/src/status-details-helpers/get-diagnostics-detail.js","../../../node_modules/@bingads-webui-campaign/overview-diagnostic-card/src/shimmer.js","../../../node_modules/@bingads-webui-campaign/overview-diagnostic-card/src/index.js","../../../node_modules/@bingads-webui-campaign/overview-top-changes-card-fluent/src/top-changes-card.tsx","../../../node_modules/@bingads-webui-campaign/overview-top-changes-card-fluent/src/use-top-changes-data.ts","../../../node_modules/@bingads-webui-campaign/overview-top-changes-card-fluent/src/use-fluctuation-popup.tsx","../../../node_modules/@bingads-webui-campaign/overview-welcome-tips-card/src/use-dashboard-preferences.ts","../../../node_modules/@bingads-webui-campaign/overview-welcome-tips-card/src/use-welcome-tip-pages.ts","../../../node_modules/@bingads-webui-campaign/overview-welcome-tips-card/src/welcome-tips-card.tsx","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/inline-editors/cashback-percent-base-view.js","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/inline-editors/viewmodel/cashback-percent-base-viewmodel.js","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/inline-editors/ad-group/ad-group-cashback-percent-view.js","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/inline-editors/criterion/criterion-cashback-percent-view.js","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/cashback-percent.js","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/cashback-budget.js","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/inline-editors/cashback-scope-base-view.js","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/inline-editors/viewmodel/cashback-scope-base-viewmodel.js","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/inline-editors/ad-group/ad-group-cashback-scope-view.js","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/cashback-scope.js","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/common-styles/cashback-percent-editor.js","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/inline-editors/coupon-base-view.js","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/inline-editors/viewmodel/coupon-base-viewmodel.js","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/inline-editors/ad-group/ad-group-coupon-view.js","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/coupon.js","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/cashback-budget.pug","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/cashback-scope.pug","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/coupon.pug","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/inline-editors/template/adgroup-cashback-percent.pug","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/inline-editors/template/cashback-percent.pug","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/inline-editors/template/cashback-scope.pug","../../../node_modules/@bingads-webui-campaign/personalized-offer-columns/src/inline-editors/template/coupon.pug","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/constants/metrics-data.ts","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/constants/device-color.ts","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/utils/metric-mapper.ts","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/utils/callout-legend-icon.tsx","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/helpers/default-card-custom-callout.tsx","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/styles/dropdown-styles.js","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/styles/devices-default-card.js","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/card/devices-default-card.tsx","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/styles/devices-comparison-card.js","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/helpers/svg-pattern-comparison-state.tsx","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/utils/legend-key-map.ts","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/utils/segment-data-extractor.ts","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/utils/numeric-value-extractor.ts","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/utils/total-percentage-calculator.ts","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/card/devices-comparison-card.tsx","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/helpers/shimmer-element.tsx","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/styles/shimmer-card.js","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/card/shimmer-card.tsx","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/media/computer-icon-svg.js","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/media/tablet-icon-svg.js","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/media/mobile-icon-svg.js","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/media/connectedTV-icon-svg.js","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/styles/devices-card.js","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/utils/device-legend.tsx","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/card/devices-card.tsx","../../../node_modules/@bingads-webui-campaign/overview-device-card-fluent/src/card/use-data.tsx"],"sourcesContent":["import $ from 'jquery';\r\nimport _ from 'underscore';\r\n\r\nconst observeInDOM = (el, onAttached, onDetached) => {\r\n const onAttachedToDOM = _.isFunction(onAttached) ? onAttached : _.noop;\r\n const onDetachedFromDOM = _.isFunction(onDetached) ? onDetached : _.noop;\r\n\r\n const getEl = () => {\r\n const $el = _.isString(el) ? $(el) : el;\r\n return $el.get(0);\r\n };\r\n\r\n let wasInDOM = $.contains(document.body, getEl());\r\n\r\n const observer = new MutationObserver(() => {\r\n const inDOM = $.contains(document.body, getEl());\r\n\r\n if (inDOM) {\r\n if (!wasInDOM) {\r\n wasInDOM = true;\r\n onAttachedToDOM();\r\n }\r\n } else if (wasInDOM) {\r\n wasInDOM = false;\r\n observer.disconnect();\r\n\r\n onDetachedFromDOM();\r\n }\r\n });\r\n\r\n observer.observe(document.body, { childList: true, subtree: true });\r\n};\r\n\r\nexport { observeInDOM };\r\n","export const DetailCardsKey = {\r\n campaign: 'campaign',\r\n billing: 'billing',\r\n editorial: 'editorial',\r\n conversionTracking: 'conversionTracking',\r\n bidding: 'bidding',\r\n assetGroup: 'assetGroup',\r\n};\r\n","import _ from 'underscore';\r\nimport { getRoutePathById, allSiteMap } from '@bingads-webui-react/with-site-map';\r\n\r\nexport const isCampaignEditorialPending\r\n = assetGroups => assetGroups.every(assetGroup => assetGroup.DeliveryStatus === 'EditorialUnderAppeal' || assetGroup.DeliveryStatus === 'EditorialPending');\r\n\r\nexport function statusAndActionReport({\r\n activity,\r\n type,\r\n status,\r\n details,\r\n action,\r\n}) {\r\n const message = {\r\n type,\r\n action,\r\n status,\r\n details,\r\n };\r\n activity.trace(JSON.stringify(message));\r\n}\r\n\r\nexport function auditPointDisplayed({\r\n activity,\r\n auditPoint,\r\n area,\r\n}) {\r\n activity.trace(`Diagnostic card: display ${auditPoint} area:${area}`);\r\n}\r\n\r\nexport function getFullProductUrl(routeName, scope, extraParams = []) {\r\n const baseParams = ['aid', 'cid', 'uid'];\r\n const params = baseParams.concat(extraParams);\r\n const pathname = getRoutePathById(allSiteMap, routeName);\r\n const search = params.reduce((result, param) => {\r\n const value = _.get(scope, ['values', param]);\r\n if (value != null) {\r\n return result.concat(`${param}=${value}`);\r\n }\r\n return result;\r\n }, []).join('&');\r\n\r\n return `${pathname}?${search}`;\r\n}\r\n","import { isSDK } from '@bingads-webui-campaign-react/sdk-utils';\r\nimport { getRoutePathById, allSiteMap } from '@bingads-webui-react/with-site-map';\r\nimport { Status } from '@bingads-webui-campaign-react/diagnostic-card';\r\n\r\nimport { DetailCardsKey } from '../const';\r\nimport { statusAndActionReport, auditPointDisplayed, getFullProductUrl } from './utils';\r\n\r\nconst BILLING_ISSUE_LIST = ['PrepayAccountOutOfBalance', 'AddPaymentInstrument'];\r\nconst BANNER_ALERT = 'BannerAlert';\r\nconst DANGER = 'danger';\r\n\r\nexport function getBillingDetail({\r\n billing,\r\n i18n,\r\n scope,\r\n ccBaseUrl,\r\n activity,\r\n}) {\r\n const name = i18n.getString(_TL_('Billing'));\r\n const key = DetailCardsKey.billing;\r\n\r\n const paymentError = billing.find(notification => notification.alertType === BANNER_ALERT\r\n && notification.NotificationLevel === DANGER\r\n && BILLING_ISSUE_LIST.includes(notification.NotificationId));\r\n\r\n if (paymentError) {\r\n statusAndActionReport({\r\n activity,\r\n type: 'billing',\r\n status: Status.Error,\r\n });\r\n\r\n auditPointDisplayed({ activity, auditPoint: 'Payment failed', area: 'Payment' });\r\n return {\r\n name,\r\n key,\r\n status: Status.Error,\r\n statusLabelMsg: i18n.getString(_TL_('Failed')),\r\n cardTitle: i18n.getString(_TL_('Payment failed')),\r\n cardMsg: i18n.getString(_TL_('The previous payment failed. Please make sure your payment method is still valid.')),\r\n onCardButtonClicked: () => {\r\n statusAndActionReport({\r\n activity,\r\n type: 'billing',\r\n action: 'navigate to payment methods page',\r\n details: 'AuditPoint: Payment failed',\r\n });\r\n\r\n const ccBaseUrlNoTrailingSlash = ccBaseUrl.replace(/\\/$/, '');\r\n if (!isSDK()) {\r\n const paymentPath = getRoutePathById(allSiteMap, 'paymentMethods');\r\n scope.remove(['campaignId']);\r\n scope.save(`${ccBaseUrlNoTrailingSlash}${paymentPath}`);\r\n } else {\r\n const url = `${ccBaseUrlNoTrailingSlash}${getFullProductUrl('paymentMethods', scope)}`;\r\n window.open(url);\r\n }\r\n },\r\n cardButtonText: i18n.getString(_TL_('Check payment method')),\r\n };\r\n }\r\n\r\n statusAndActionReport({\r\n activity,\r\n type: 'billing',\r\n status: Status.Active,\r\n });\r\n\r\n return {\r\n name,\r\n key,\r\n status: Status.Active,\r\n statusLabelMsg: i18n.getString(_TL_('Active')),\r\n };\r\n}\r\n","import _ from 'underscore';\r\nimport { edmCampaign } from '@bingads-webui/edm-campaign';\r\nimport { isSDK } from '@bingads-webui-campaign-react/sdk-utils';\r\nimport { Status } from '@bingads-webui-campaign-react/diagnostic-card';\r\nimport { getRoutePathById, allSiteMap } from '@bingads-webui-react/with-site-map';\r\n\r\nimport { statusAndActionReport, auditPointDisplayed, getFullProductUrl } from './utils';\r\nimport { DetailCardsKey } from '../const';\r\n\r\nconst STATUS_TEXT = {\r\n Active: _TL_('Active'),\r\n Paused: _TL_('Paused'),\r\n UnderReview: _TL_('Under review'),\r\n BudgetPaused: _TL_('Budget paused'),\r\n};\r\n\r\nconst getCardDetails = ({\r\n auditPoint, scope, i18n, activity, alertHelper, locale,\r\n}) => {\r\n const {\r\n values: {\r\n cid,\r\n aid,\r\n campaignId,\r\n },\r\n } = scope;\r\n\r\n const onNavigateToBudgetEditSettingsPage = () => {\r\n statusAndActionReport({\r\n activity,\r\n type: 'campaign',\r\n action: 'navigate to settings page',\r\n details: `AuditPoint: ${auditPoint}`,\r\n });\r\n\r\n if (!isSDK()) {\r\n scope.save(getRoutePathById(allSiteMap, 'settings'));\r\n } else {\r\n const url = getRoutePathById(allSiteMap, 'sdk-budget-settings');\r\n scope.save(url);\r\n }\r\n };\r\n\r\n const onNavigateToAssetGroupsPage = () => {\r\n statusAndActionReport({\r\n activity,\r\n type: 'campaign',\r\n action: 'navigate to asset groups page',\r\n details: `AuditPoint: ${auditPoint}`,\r\n });\r\n\r\n scope.save(getRoutePathById(allSiteMap, 'appadsassetgroups'));\r\n };\r\n\r\n auditPointDisplayed({ activity, auditPoint, area: 'Campaign' });\r\n\r\n switch (auditPoint) {\r\n case 'CampaignStatusUserPaused':\r\n return {\r\n cardTitle: i18n.getString(_TL_('Reactivate your campaign')),\r\n cardMsg: i18n.getString(_TL_('A paused campaign cannot generate impressions or conversions.')),\r\n onCardButtonClicked: () => {\r\n statusAndActionReport({\r\n activity,\r\n type: 'campaign',\r\n action: 'unpause campaign',\r\n details: `AuditPoint: ${auditPoint}`,\r\n });\r\n\r\n edmCampaign\r\n .Customers.$withKey(cid)\r\n .Accounts.$withKey(aid)\r\n .Campaigns.$withKey(campaignId)\r\n .bulkUpdate({\r\n Id: campaignId,\r\n Status: 'Active',\r\n }).then(() => {\r\n alertHelper.showSuccess(i18n.getString(_TL_('Campaign reactivated.')));\r\n }, (e) => {\r\n activity.error(JSON.stringify(e));\r\n alertHelper.showError(i18n.getString(_TL_('We\\'ve encountered an error and can\\'t continue. Please contact support for further assistance.')));\r\n });\r\n },\r\n cardButtonText: i18n.getString(_TL_('Reactivate')),\r\n };\r\n\r\n case 'AllAssetGroupsEditorialPending':\r\n return {\r\n cardMsg: i18n.getString(_TL_('There are one or multiple asset groups in this campaign still under editorial review.')),\r\n };\r\n\r\n case 'CampaignStatusBudgetPaused':\r\n case 'CampaignStatusActiveButBudgetPaused':\r\n return {\r\n statusLabelMsg: i18n.getString(_TL_('Eligible (limited)')),\r\n status: Status.Warning,\r\n cardTitle: i18n.getString(_TL_('Campaign is eligible but limited by budget')),\r\n cardMsg: i18n.getString(_TL_('Your campaign ran out of budget recently, which caused your ads not being shown as often as they could be. Raising your budget can help make sure you don\\'t lose out on potential customers. To resume your ads now, you can increase your budget.')),\r\n onCardButtonClicked: onNavigateToBudgetEditSettingsPage,\r\n cardButtonText: i18n.getString(_TL_('Fix now')),\r\n learnMoreLink: `https://help.ads.microsoft.com/#apex/ads/${locale}/53050/1`,\r\n };\r\n\r\n case 'CampaignStatusOutOfBudget':\r\n case 'CampaignStatusPausedAndOutOfBudget':\r\n return {\r\n statusLabelMsg: i18n.getString(_TL_('Paused by budget constraint')),\r\n cardTitle: i18n.getString(_TL_('Paused campaign due to budget constraints')),\r\n cardMsg: i18n.getString(_TL_('Because your campaign has run out of budget, we\\'ve paused your ads. Ad delivery will resume at the start of the next day. To resume your ads now, you can increase your budget.')),\r\n onCardButtonClicked: onNavigateToBudgetEditSettingsPage,\r\n cardButtonText: i18n.getString(_TL_('Fix now')),\r\n learnMoreLink: `https://help.ads.microsoft.com/#apex/ads/${locale}/53050/1`,\r\n };\r\n\r\n case 'MissVideoAsset':\r\n return {\r\n statusLabelMsg: i18n.getString(_TL_('Missing Video')),\r\n cardTitle: i18n.getString(_TL_('Missing video assets')),\r\n cardMsg: i18n.getString(_TL_('Your campaign has no video assets. Add videos now to boost your campaign\\'s reach and improve performance.')),\r\n onCardButtonClicked: onNavigateToAssetGroupsPage,\r\n cardButtonText: i18n.getString(_TL_('Review')),\r\n };\r\n\r\n case 'CampaignStatusActive':\r\n return {};\r\n\r\n default:\r\n activity.error(`Audit point mapping not found in getCampaignStatus:${auditPoint}`);\r\n return {};\r\n }\r\n};\r\n\r\nexport const getCampaignStatus = ({\r\n details, scope, i18n, activity, locale, alertHelper,\r\n}) => {\r\n if (_.isEmpty(details)\r\n || _.isEmpty(_.get(details, 'Value'))\r\n || _.get(details, ['Value', 'ErrorCode'], 0) !== 0\r\n || _.get(details, ['Value', 'ErrorMessage'])) {\r\n statusAndActionReport({\r\n activity,\r\n type: 'campaign',\r\n details: `Error - details: ${JSON.stringify(details)}`,\r\n });\r\n return {\r\n name: i18n.getString(_TL_('Campaign')),\r\n key: DetailCardsKey.campaign,\r\n };\r\n }\r\n\r\n const status = _.get(details, ['Value', 'Status']);\r\n const auditPoint = _.get(details, ['Value', 'AuditPoints', 0]);\r\n\r\n const cardDetails = getCardDetails({\r\n auditPoint, scope, i18n, activity, alertHelper, locale,\r\n });\r\n\r\n let statusIcon = Status.Error;\r\n\r\n if (status === 'Active') {\r\n statusIcon = Status.Active;\r\n } else if (status === 'UnderReview') {\r\n statusIcon = Status.Pending;\r\n }\r\n\r\n return {\r\n name: i18n.getString(_TL_('Campaign')),\r\n key: DetailCardsKey.campaign,\r\n\r\n status: statusIcon,\r\n statusLabelMsg: i18n.getString(_.get(STATUS_TEXT, status, _TL_(''))),\r\n\r\n ...cardDetails,\r\n };\r\n};\r\n","import _ from 'underscore';\r\nimport { isSDK } from '@bingads-webui-campaign-react/sdk-utils';\r\nimport { Status } from '@bingads-webui-campaign-react/diagnostic-card';\r\nimport { getRoutePathById, allSiteMap } from '@bingads-webui-react/with-site-map';\r\n\r\nimport { statusAndActionReport, auditPointDisplayed, getFullProductUrl } from './utils';\r\nimport { DetailCardsKey } from '../const';\r\n\r\nconst STATUS_TEXT = {\r\n InReview: _TL_('In review'),\r\n Rejected: _TL_('Rejected'),\r\n Approved: _TL_('Approved'),\r\n Limited: _TL_('Limited'),\r\n};\r\n\r\n\r\nconst getCardDetails = ({\r\n auditPoint, scope, i18n, activity, locale, campaignType,\r\n}) => {\r\n const isCampaignTypeApp = (campaignType && campaignType === 'App') ?? false;\r\n\r\n const onCardButtonClicked = () => {\r\n statusAndActionReport({\r\n activity,\r\n type: 'editorial',\r\n action: 'navigate to asset groups page',\r\n details: `AuditPoint: ${auditPoint}`,\r\n });\r\n\r\n if (!isSDK()) {\r\n const assetGroupUrl = isCampaignTypeApp ? getRoutePathById(allSiteMap, 'appads-asset-groups') : getRoutePathById(allSiteMap, 'asset-groups');\r\n scope.save(assetGroupUrl);\r\n } else {\r\n const url = getFullProductUrl('asset-groups', scope, ['campaignId']);\r\n window.open(url);\r\n }\r\n };\r\n\r\n auditPointDisplayed({ activity, auditPoint, area: 'Editorial' });\r\n\r\n switch (auditPoint) {\r\n case 'AllAssetGroupsEditorialRejected':\r\n case 'AllAssetGroupsEditorialAppealRejected':\r\n case 'AllAssetGroupsEditorialRejectedOrAppealRejected':\r\n return {\r\n cardTitle: i18n.getString(_TL_('All assets rejected')),\r\n cardMsg: i18n.getString(_TL_('None of your assets meet our requirements. Please check and fix them.')),\r\n onCardButtonClicked,\r\n cardButtonText: i18n.getString(_TL_('Fix assets')),\r\n };\r\n\r\n case 'AllAssetGroupsEditorialLimited':\r\n return {\r\n status: Status.Warning,\r\n statusLabelMsg: i18n.getString(_TL_('Approved limited')),\r\n cardMsg: i18n.getString(_TL_('The asset groups have been approved in at least one of your targeted locations, but have also been disapproved in at least one other targeted location.')),\r\n learnMoreLink: `https://help.ads.microsoft.com/#apex/ads/${locale}/52302/1`,\r\n cardTitle: i18n.getString(_TL_('Asset groups editorial limited')),\r\n onCardButtonClicked,\r\n cardButtonText: i18n.getString(_TL_('Fix assets')),\r\n };\r\n\r\n case 'NoAssetGroups':\r\n return {\r\n statusLabelMsg: i18n.getString(_TL_('No asset group')),\r\n cardTitle: i18n.getString(_TL_('There are no asset groups in this campaign')),\r\n cardMsg: i18n.getString(_TL_('Looks like your campaign doesn\\'t have asset groups yet. Create at least one asset group to get started.')),\r\n onCardButtonClicked,\r\n cardButtonText: i18n.getString(_TL_('Fix now')),\r\n learnMoreLink: isCampaignTypeApp ? `https://help.ads.microsoft.com/#apex/ads/${locale}/60350/0/#TechnicalRequirements` : `https://help.ads.microsoft.com/#apex/ads/${locale}/60176/0`,\r\n };\r\n\r\n case 'NoActiveAssetGroups':\r\n return {\r\n statusLabelMsg: i18n.getString(_TL_('No active asset group')),\r\n cardTitle: i18n.getString(_TL_('There are no active asset groups in this campaign')),\r\n cardMsg: i18n.getString(_TL_('Your campaign did not perform because there are no active asset groups. To receive clicks and conversions, add an active asset group.')),\r\n onCardButtonClicked,\r\n cardButtonText: i18n.getString(_TL_('Fix now')),\r\n learnMoreLink: isCampaignTypeApp ? `https://help.ads.microsoft.com/#apex/ads/${locale}/60350/0/#TechnicalRequirements` : `https://help.ads.microsoft.com/#apex/ads/${locale}/60176/0`,\r\n };\r\n\r\n case 'AllAssetGroupsEditorialUnderAppeal':\r\n case 'AllAssetGroupsEditorialUnderAppealOrPending':\r\n return {\r\n cardMsg: i18n.getString(_TL_('One or multiple asset groups in this campaign are under editorial review.')),\r\n };\r\n\r\n case 'AllAssetGroupsEditorialApproved':\r\n case 'AllAssetGroupsEditorialPending':\r\n return {};\r\n\r\n\r\n case 'AllAdGroupsEditorialRejected':\r\n case 'AllAdGroupsEditorialAppealRejected':\r\n case 'AllAdGroupsEditorialRejectedOrAppealRejected':\r\n return {\r\n cardTitle: i18n.getString(_TL_('All ad groups rejected')),\r\n cardMsg: i18n.getString(_TL_('None of your ad groups meet our requirements. Please check and fix them.')),\r\n onCardButtonClicked,\r\n cardButtonText: i18n.getString(_TL_('Fix ad groups')),\r\n };\r\n\r\n case 'AllAdGroupsEditorialLimited':\r\n return {\r\n status: Status.Warning,\r\n statusLabelMsg: i18n.getString(_TL_('Approved limited')),\r\n cardMsg: i18n.getString(_TL_('The ad groups have been approved in at least one of your targeted locations, but have also been disapproved in at least one other targeted location.')),\r\n learnMoreLink: `https://help.ads.microsoft.com/#apex/ads/${locale}/52302/1`,\r\n cardTitle: i18n.getString(_TL_('Ad groups editorial limited')),\r\n onCardButtonClicked,\r\n cardButtonText: i18n.getString(_TL_('Fix ad groups')),\r\n };\r\n\r\n case 'NoAdGroups':\r\n return {\r\n statusLabelMsg: i18n.getString(_TL_('No ad group')),\r\n cardTitle: i18n.getString(_TL_('There are no ad groups in this campaign')),\r\n cardMsg: i18n.getString(_TL_('Looks like your campaign doesn\\'t have ad groups yet. Create at least one ad group to get started.')),\r\n onCardButtonClicked,\r\n cardButtonText: i18n.getString(_TL_('Fix now')),\r\n learnMoreLink: isCampaignTypeApp ? `https://help.ads.microsoft.com/#apex/ads/${locale}/60350/0/#TechnicalRequirements` : `https://help.ads.microsoft.com/#apex/ads/${locale}/60176/0`,\r\n };\r\n\r\n case 'NoActiveAdGroups':\r\n return {\r\n statusLabelMsg: i18n.getString(_TL_('No active ad group')),\r\n cardTitle: i18n.getString(_TL_('There are no active ad groups in this campaign')),\r\n cardMsg: i18n.getString(_TL_('Your campaign did not perform because there are no active ad groups. To receive clicks and conversions, add an active ad group.')),\r\n onCardButtonClicked,\r\n cardButtonText: i18n.getString(_TL_('Fix now')),\r\n learnMoreLink: isCampaignTypeApp ? `https://help.ads.microsoft.com/#apex/ads/${locale}/60350/0/#TechnicalRequirements` : `https://help.ads.microsoft.com/#apex/ads/${locale}/60176/0`,\r\n };\r\n\r\n case 'AllAdGroupsEditorialUnderAppeal':\r\n case 'AllAdGroupsEditorialUnderAppealOrPending':\r\n return {\r\n cardMsg: i18n.getString(_TL_('One or multiple ad groups in this campaign are under editorial review.')),\r\n };\r\n\r\n case 'AllAdGroupsEditorialApproved':\r\n case 'AllAdGroupsEditorialPending':\r\n return {};\r\n\r\n default:\r\n activity.error(`Audit point mapping not found in getEditorialStatus:${auditPoint}`);\r\n return {};\r\n }\r\n};\r\n\r\nexport const getEditorialStatus = ({\r\n details, scope, i18n, activity, locale, campaignType,\r\n}) => {\r\n if (_.isEmpty(details)\r\n || _.isEmpty(_.get(details, 'Value'))\r\n || _.get(details, ['Value', 'ErrorCode'], 0) !== 0\r\n || _.get(details, ['Value', 'ErrorMessage'])) {\r\n statusAndActionReport({\r\n activity,\r\n type: 'editorial',\r\n details: `Error - details: ${JSON.stringify(details)}`,\r\n });\r\n return {\r\n name: i18n.getString(_TL_('Editorial')),\r\n key: DetailCardsKey.editorial,\r\n };\r\n }\r\n\r\n const status = _.get(details, ['Value', 'Status']);\r\n const auditPoint = _.get(details, ['Value', 'AuditPoints', 0]);\r\n\r\n const cardDetails = getCardDetails({\r\n auditPoint, scope, i18n, activity, locale, campaignType,\r\n });\r\n let statusIcon = Status.Error;\r\n if (status === 'Approved') {\r\n statusIcon = Status.Active;\r\n } else if (status === 'InReview') {\r\n statusIcon = Status.Pending;\r\n }\r\n\r\n return {\r\n name: i18n.getString(_TL_('Editorial')),\r\n key: DetailCardsKey.editorial,\r\n\r\n status: statusIcon,\r\n statusLabelMsg: i18n.getString(_.get(STATUS_TEXT, status, _TL_(''))),\r\n\r\n ...cardDetails,\r\n };\r\n};\r\n","import _ from 'underscore';\r\nimport { Status } from '@bingads-webui-campaign-react/diagnostic-card';\r\nimport { isSDK } from '@bingads-webui-campaign-react/sdk-utils';\r\nimport { getRoutePathById, allSiteMap } from '@bingads-webui-react/with-site-map';\r\n\r\nimport { statusAndActionReport, auditPointDisplayed, getFullProductUrl } from './utils';\r\nimport { DetailCardsKey } from '../const';\r\n\r\nconst STATUS_TEXT = {\r\n NoIssue: _TL_('No issue'),\r\n InappropriateTarget: _TL_('Inappropriate target'),\r\n};\r\n\r\nexport const getBiddingStatus = ({\r\n details, scope, i18n, activity, locale,\r\n}) => {\r\n if (_.isEmpty(details)\r\n || _.isEmpty(_.get(details, 'Value'))\r\n || _.get(details, ['Value', 'ErrorCode'], 0) !== 0\r\n || _.get(details, ['Value', 'ErrorMessage'])) {\r\n statusAndActionReport({\r\n activity,\r\n type: 'bidding',\r\n details: `Error - details: ${JSON.stringify(details)}`,\r\n });\r\n return {\r\n name: i18n.getString(_TL_('Bid strategy')),\r\n key: DetailCardsKey.bidding,\r\n };\r\n }\r\n\r\n const status = _.get(details, ['Value', 'Status']);\r\n const auditPoint = _.get(details, ['Value', 'AuditPoints', 0]);\r\n\r\n if (!['AutoBiddingLimitedUnAttainableTarget', 'BiddingStatusNormal'].includes(auditPoint)) {\r\n activity.error(`Audit point mapping not found in getBiddingStatus:${auditPoint}`);\r\n }\r\n\r\n auditPointDisplayed({ activity, auditPoint, area: 'Bidding' });\r\n\r\n const cardDetails = auditPoint === 'AutoBiddingLimitedUnAttainableTarget' ? {\r\n statusLabelMsg: i18n.getString(_TL_('Limited by auto-bidding target')),\r\n cardTitle: i18n.getString(_TL_('Set an appropriate target for your bid strategy')),\r\n cardMsg: i18n.getString(_TL_('Your campaign\\'s performance is limited by your bid\\'s target . You\\'ll improve your conversion rate by decreasing the target ROAS or increasing the target CPA.')),\r\n onCardButtonClicked: () => {\r\n statusAndActionReport({\r\n activity,\r\n type: 'bidding',\r\n action: 'navigate to settings page',\r\n details: `AuditPoint: ${auditPoint}`,\r\n });\r\n\r\n if (!isSDK()) {\r\n scope.save(getRoutePathById(allSiteMap, 'settings'));\r\n } else {\r\n const url = getRoutePathById(allSiteMap, 'sdk-budget-settings');\r\n scope.save(url);\r\n }\r\n },\r\n cardButtonText: i18n.getString(_TL_('Fix now')),\r\n learnMoreLink: `https://help.ads.microsoft.com/#apex/ads/${locale}/56786/1`,\r\n } : {};\r\n\r\n return {\r\n name: i18n.getString(_TL_('Bid strategy')),\r\n key: DetailCardsKey.bidding,\r\n\r\n status: status === 'NoIssue' ? Status.Active : Status.Error,\r\n statusLabelMsg: i18n.getString(_.get(STATUS_TEXT, status, _TL_(''))),\r\n\r\n ...cardDetails,\r\n };\r\n};\r\n","import _ from 'underscore';\r\n\r\nconst ACTION_OPERATOR_TEXT = {\r\n EqualsTo: _TL_('Action Equals to {{value}}'),\r\n BeginsWith: _TL_('Action Begins with {{value}}'),\r\n Contains: _TL_('Action Contains {{value}}'),\r\n RegularExpression: _TL_('Action Regular expression {{value}}'),\r\n};\r\n\r\nconst CATEGORY_OPERATOR_TEXT = {\r\n EqualsTo: _TL_('Category Equals to {{value}}'),\r\n BeginsWith: _TL_('Category Begins with {{value}}'),\r\n Contains: _TL_('Category Contains {{value}}'),\r\n RegularExpression: _TL_('Category Regular expression {{value}}'),\r\n};\r\n\r\nconst LABEL_OPERATOR_TEXT = {\r\n EqualsTo: _TL_('Label Equals to {{value}}'),\r\n BeginsWith: _TL_('Label Begins with {{value}}'),\r\n Contains: _TL_('Label Contains {{value}}'),\r\n RegularExpression: _TL_('Label Regular expression {{value}}'),\r\n};\r\n\r\nconst VALUE_OPERATOR_TEXT = {\r\n EqualsTo: _TL_('Value Equals to {{value}}'),\r\n LessThan: _TL_('Value Less than {{value}}'),\r\n GreaterThan: _TL_('Value Greater than {{value}}'),\r\n};\r\n\r\nexport const getInvalidEventStrings = ({ i18n, fix = {} }) => {\r\n const {\r\n CurrentEventCategory,\r\n CurrentEventCategoryOperator,\r\n CurrentEventAction,\r\n CurrentEventActionOperator,\r\n CurrentEventLabel,\r\n CurrentEventLabelOperator,\r\n CurrentEventValue,\r\n CurrentEventValueOperator,\r\n SuggestedEventCategory,\r\n SuggestedEventCategoryOperator,\r\n SuggestedEventAction,\r\n SuggestedEventActionOperator,\r\n SuggestedEventLabel,\r\n SuggestedEventLabelOperator,\r\n SuggestedEventValue,\r\n SuggestedEventValueOperator,\r\n } = fix;\r\n\r\n const currentArray = [];\r\n const suggestedArray = [];\r\n if (!_.isEmpty(CurrentEventActionOperator) && !_.isEmpty(CurrentEventAction)) {\r\n currentArray.push(i18n.getString(ACTION_OPERATOR_TEXT[CurrentEventActionOperator] || _TL_(''), { value: CurrentEventAction }));\r\n }\r\n if (!_.isEmpty(SuggestedEventActionOperator) && !_.isEmpty(SuggestedEventAction)) {\r\n suggestedArray.push(i18n.getString(ACTION_OPERATOR_TEXT[SuggestedEventActionOperator] || _TL_(''), { value: SuggestedEventAction }));\r\n }\r\n\r\n if (!_.isEmpty(CurrentEventCategoryOperator) && !_.isEmpty(CurrentEventCategory)) {\r\n currentArray.push(i18n.getString(CATEGORY_OPERATOR_TEXT[CurrentEventCategoryOperator] || _TL_(''), { value: CurrentEventCategory }));\r\n }\r\n if (!_.isEmpty(SuggestedEventCategoryOperator) && !_.isEmpty(SuggestedEventCategory)) {\r\n suggestedArray.push(i18n.getString(CATEGORY_OPERATOR_TEXT[SuggestedEventCategoryOperator] || _TL_(''), { value: SuggestedEventCategory }));\r\n }\r\n\r\n if (!_.isEmpty(CurrentEventLabelOperator) && !_.isEmpty(CurrentEventLabel)) {\r\n currentArray.push(i18n.getString(LABEL_OPERATOR_TEXT[CurrentEventLabelOperator] || _TL_(''), { value: CurrentEventLabel }));\r\n }\r\n if (!_.isEmpty(SuggestedEventLabelOperator) && !_.isEmpty(SuggestedEventLabel)) {\r\n suggestedArray.push(i18n.getString(LABEL_OPERATOR_TEXT[SuggestedEventLabelOperator] || _TL_(''), { value: SuggestedEventLabel }));\r\n }\r\n\r\n if (!_.isEmpty(CurrentEventValueOperator) && !_.isEmpty(CurrentEventValue)) {\r\n currentArray.push(i18n.getString(VALUE_OPERATOR_TEXT[CurrentEventValueOperator] || _TL_(''), { value: CurrentEventValue }));\r\n }\r\n if (!_.isEmpty(SuggestedEventValueOperator) && !_.isEmpty(SuggestedEventValue)) {\r\n suggestedArray.push(i18n.getString(VALUE_OPERATOR_TEXT[SuggestedEventValueOperator] || _TL_(''), { value: SuggestedEventValue }));\r\n }\r\n\r\n\r\n return { current: currentArray.join(','), suggested: suggestedArray.join(',') };\r\n};\r\n","import _ from 'underscore';\r\nimport { isSDK } from '@bingads-webui-campaign-react/sdk-utils';\r\nimport { Status } from '@bingads-webui-campaign-react/diagnostic-card';\r\nimport { getRoutePathById, allSiteMap } from '@bingads-webui-react/with-site-map';\r\nimport { CampaignTypes } from '@bingads-webui-campaign-react/constants';\r\n\r\nimport { getInvalidEventStrings } from './get-invalid-event-strings';\r\nimport { statusAndActionReport, auditPointDisplayed, getFullProductUrl } from './utils';\r\nimport { DetailCardsKey } from '../const';\r\n\r\nconst STATUS_TEXT = {\r\n NotSetUpGoal: _TL_('No conversion goal'),\r\n NotSetUpGoalMaxClicks: _TL_('No conversion goal'),\r\n Unverified: _TL_('Unverified UET tag'),\r\n UnverifiedMaxClicks: _TL_('Unverified UET tag'),\r\n Active: _TL_('Recording conversions'),\r\n RecordingConversions: _TL_('Recording conversions'),\r\n NoConversions: _TL_('No conversions'),\r\n NoConversionsMaxClicks: _TL_('No conversions'),\r\n NoConversionGoal: _TL_('No conversion goal'),\r\n NoConversionGoalMaxClicks: _TL_('No conversion goal'),\r\n Pending: _TL_('Pending'),\r\n MissGoalWithRevenueValue: _TL_('No goal to track revenue'),\r\n MissGoalWithRevenueValueMaxClicks: _TL_('No goal to track revenue'),\r\n InactiveDueToTagUnavailable: _TL_('Unavailable UET'),\r\n InactiveDueToTagUnavailableMaxClicks: _TL_('Unavailable UET'),\r\n TagInactive: _TL_('Inactive UET tag'),\r\n TagInactiveMaxClicks: _TL_('Inactive UET tag'),\r\n NoRecentConversion: _TL_('No recent conversions'),\r\n NoRecentConversionMaxClicks: _TL_('No recent conversions'),\r\n};\r\n\r\nconst AUDIT_POINT_STATUS_TEXT = {\r\n TrackingStatusUnverified: _TL_('Unverified UET tag'),\r\n TrackingStatusTagInactive: _TL_('Inactive UET tag'),\r\n TrackingStatusInactiveDueToTagUnavailable: _TL_('Incorrect UET tag'),\r\n};\r\n\r\nconst AUDIT_POINT_TITLE_TEXT = {\r\n TrackingStatusUnverified: _TL_('UET tag is not verified'),\r\n TrackingStatusTagInactive: _TL_('UET tag is inactive'),\r\n TrackingStatusInactiveDueToTagUnavailable: _TL_('UET tag is incorrect'),\r\n};\r\n\r\nconst OPERATORS_TEXT = {\r\n EqualsTo: _TL_('Equals to'),\r\n BeginsWith: _TL_('Begins with'),\r\n Contains: _TL_('Contains'),\r\n RegularExpression: _TL_('Regular expression'),\r\n};\r\n\r\nconst getCardDetails = ({\r\n auditPoint, scope, i18n, activity, locale, serverContext, campaignType, details,\r\n}) => {\r\n const onClickNavigateToUETTagPage = () => {\r\n statusAndActionReport({\r\n activity,\r\n type: 'conversion',\r\n action: 'navigate to uet tag page',\r\n details: `AuditPoint: ${auditPoint}`,\r\n });\r\n\r\n if (!isSDK()) {\r\n scope.remove(['campaignId']);\r\n scope.save(getRoutePathById(allSiteMap, 'uet-tag'));\r\n } else {\r\n const url = getFullProductUrl('uet-tag', scope);\r\n window.open(url);\r\n }\r\n };\r\n\r\n const onClickNavigateToOfflineConversionsPage = () => {\r\n statusAndActionReport({\r\n activity,\r\n type: 'conversion',\r\n action: 'navigate to offline conversions page',\r\n details: `AuditPoint: ${auditPoint}`,\r\n });\r\n\r\n if (!isSDK()) {\r\n scope.remove(['campaignId']);\r\n scope.save(getRoutePathById(allSiteMap, 'offline-conversions'));\r\n } else {\r\n const url = getFullProductUrl('offline-conversions', scope);\r\n window.open(url);\r\n }\r\n };\r\n\r\n const onClickNavigateToConversionGoalsPage = () => {\r\n statusAndActionReport({\r\n activity,\r\n type: 'conversion',\r\n action: 'navigate to conversion goals page',\r\n details: `AuditPoint: ${auditPoint}`,\r\n });\r\n\r\n if (!isSDK()) {\r\n scope.remove(['campaignId']);\r\n scope.save(getRoutePathById(allSiteMap, 'conversion-goals'));\r\n } else {\r\n const url = getFullProductUrl('conversion-goals', scope);\r\n window.open(url);\r\n }\r\n };\r\n\r\n const onClickNavigateToGoalCreationPage = () => {\r\n statusAndActionReport({\r\n activity,\r\n type: 'conversion',\r\n action: 'navigate to goal creation page',\r\n details: `AuditPoint: ${auditPoint}`,\r\n });\r\n\r\n const isAutoGoalEnabled = _.get(serverContext.DynamicPermissions, 'AllowAutoGoalWizard', false);\r\n let routeName = 'conversion-goals-create';\r\n\r\n if (isAutoGoalEnabled) {\r\n routeName = 'conversion-goals-auto-create';\r\n }\r\n\r\n if (!isSDK()) {\r\n scope.remove(['campaignId']);\r\n scope.save(getRoutePathById(allSiteMap, routeName));\r\n } else {\r\n const url = getFullProductUrl(routeName, scope);\r\n window.open(url);\r\n }\r\n };\r\n\r\n auditPointDisplayed({ activity, auditPoint, area: 'Conversion' });\r\n\r\n if (campaignType !== CampaignTypes.Audience && (_.get(serverContext, ['DynamicPermissions', 'DiagnosticCMMTApi']) || _.get(serverContext, ['DynamicPermissions', 'ConversionWarningImprovement']))) {\r\n switch (auditPoint) {\r\n case 'HasNoValidGoalAtCampaignOrAccountLevel':\r\n return {\r\n cardTitle: i18n.getString(_TL_('No conversion goal')),\r\n cardMsg: i18n.getString(_TL_('This campaign doesn\\'t have a conversion goal configured, which may result in missing conversion tracking. Please review your campaign settings to assign a main goal.')),\r\n onCardButtonClicked: onClickNavigateToGoalCreationPage,\r\n cardButtonText: i18n.getString(_TL_('Set up now')),\r\n learnMoreLink: `https://help.ads.microsoft.com/#apex/ads/${locale}/56709/2`,\r\n };\r\n\r\n case 'HasNoValidGoalAtCampaignOrAccountLevel_ChangeToMainGoal':\r\n return {\r\n cardTitle: i18n.getString(_TL_('Conversion goal issues')),\r\n cardMsg: i18n.getString(_TL_('Your conversion goal doesn\\'t have “Include in conversions” selected. Please add to your campaign level goal or update your existing goal settings to include conversions.')),\r\n onCardButtonClicked: onClickNavigateToConversionGoalsPage,\r\n cardButtonText: i18n.getString(_TL_('Set up now')),\r\n learnMoreLink: `https://help.ads.microsoft.com/#apex/ads/${locale}/60138/2-500`,\r\n };\r\n\r\n case 'TrackingStatusNoConversions_NotUploadOfflineConversion':\r\n return {\r\n cardTitle: i18n.getString(_TL_('No offline conversions')),\r\n cardMsg: i18n.getString(_TL_('There are no offline conversions uploaded. Please visit your offline goals to upload conversions associated to this campaign.')),\r\n onCardButtonClicked: onClickNavigateToOfflineConversionsPage,\r\n cardButtonText: i18n.getString(_TL_('Set up now')),\r\n learnMoreLink: `https://help.ads.microsoft.com/#apex/ads/${locale}/56852/1/#ext:conversiongoals`,\r\n };\r\n\r\n case 'TrackingStatusNoConversions_EventGoalInvalidParameter':\r\n\r\n if (!details || !details.FixEventGoal || (!details.FixEventGoal)) {\r\n activity.error(`Details missing for audit point ${auditPoint} - details: ${JSON.stringify(details)}`);\r\n }\r\n // eslint-disable-next-line no-case-declarations\r\n const { current, suggested } = getInvalidEventStrings({ i18n, fix: details.FixEventGoal });\r\n if (_.isEmpty(current) || _.isEmpty(suggested)) {\r\n activity.error(`Details string missing for audit point ${auditPoint} - details: ${JSON.stringify(details)} current: ${current} suggested: ${suggested}`);\r\n }\r\n return {\r\n cardTitle: i18n.getString(_TL_('Conversion goal setting error')),\r\n cardMsg: i18n.getString(_TL_('We have identified a potential error in your conversion goal setting, which may have resulted in missed tracking of conversions. The current setting is {{current}}. We recommend changing this to {{suggested}}.'), { current, suggested }),\r\n onCardButtonClicked: onClickNavigateToConversionGoalsPage,\r\n cardButtonText: i18n.getString(_TL_('Set up now')),\r\n learnMoreLink: `https://help.ads.microsoft.com/?#apex/ads/${locale}/56709/2-500`,\r\n };\r\n\r\n case 'TrackingStatusNoConversions_UrlGoalInvalidParameter':\r\n if (!details || !details.FixDestinationUrlGoal || !details.FixDestinationUrlGoal.CurrentDestinationUrlOperatorName || !details.FixDestinationUrlGoal.CurrentDestinationUrl || !details.FixDestinationUrlGoal.SuggestedDestinationUrlOperatorName || !details.FixDestinationUrlGoal.SuggestedDestinationUrl) {\r\n activity.error(`Details missing for audit point ${auditPoint} - details: ${JSON.stringify(details)}`);\r\n }\r\n // eslint-disable-next-line no-case-declarations\r\n const strings = {\r\n ...details.FixDestinationUrlGoal,\r\n CurrentDestinationUrlOperatorName: i18n.getString(OPERATORS_TEXT[details.FixDestinationUrlGoal.CurrentDestinationUrlOperatorName]),\r\n SuggestedDestinationUrlOperatorName: i18n.getString(OPERATORS_TEXT[details.FixDestinationUrlGoal.SuggestedDestinationUrlOperatorName]),\r\n };\r\n return {\r\n cardTitle: i18n.getString(_TL_('Conversion goal setting error')),\r\n cardMsg: i18n.getString(_TL_('We identified a potential error in your conversion goal setting, which might have resulted in missed tracking of conversions. The current setting is {{CurrentDestinationUrlOperatorName}}, {{CurrentDestinationUrl}}. We recommend changing this setting to {{SuggestedDestinationUrlOperatorName}}, {{SuggestedDestinationUrl}}.'), strings),\r\n onCardButtonClicked: onClickNavigateToConversionGoalsPage,\r\n cardButtonText: i18n.getString(_TL_('Set up now')),\r\n learnMoreLink: `https://help.ads.microsoft.com/?#apex/ads/${locale}/56709/2-500`,\r\n };\r\n\r\n case 'TrackingStatusNoConversions_UETMismatch':\r\n if (!details || !details.UETMismatch || !details.UETMismatch.CurrentTagId || !details.UETMismatch.SuggestedTagId) {\r\n activity.error(`Details missing for audit point ${auditPoint} - details: ${JSON.stringify(details)}`);\r\n }\r\n return {\r\n statusLabelMsg: i18n.getString(_TL_('Incorrectly matched UET tags')),\r\n cardTitle: i18n.getString(_TL_('Incorrectly matched UET tags')),\r\n cardMsg: i18n.getString(_TL_('You have events that align with the goal definition from a different UET tag. The tag ID used by the goal is {{CurrentTagId}}, while the actual Tag ID is {{SuggestedTagId}}. Please change the goal to reflect the correct tag ID.'), _.get(details, ['UETMismatch'], {})),\r\n onCardButtonClicked: onClickNavigateToConversionGoalsPage,\r\n cardButtonText: i18n.getString(_TL_('Set up now')),\r\n learnMoreLink: `https://help.ads.microsoft.com/#apex/ads/${locale}/56685/2-500`,\r\n };\r\n\r\n case 'TrackingStatusNoConversions_UETActiveMissingConversionEvent':\r\n return {\r\n statusLabelMsg: i18n.getString(_TL_('UET tag issues')),\r\n cardTitle: i18n.getString(_TL_('UET tag issues')),\r\n cardMsg: i18n.getString(_TL_('You have UET Tags on your website, but no events matched the goal definition in the last 7 days.')),\r\n onCardButtonClicked: onClickNavigateToUETTagPage,\r\n cardButtonText: i18n.getString(_TL_('Set up now')),\r\n learnMoreLink: `https://help.ads.microsoft.com/?#apex/ads/${locale}/56951/2`,\r\n };\r\n\r\n case 'TrackingStatusNoConversions':\r\n return {\r\n cardTitle: i18n.getString(_TL_('No recent conversions')),\r\n cardMsg: i18n.getString(_TL_('Your campaign has not recorded any conversions in the past seven days. Please review common issues related to conversion tracking, conversion goals and offline conversions. For further questions, please contact Support.')),\r\n learnMoreLink: `https://help.ads.microsoft.com/#apex/ads/${locale}/60398/2`,\r\n };\r\n\r\n case 'TrackingStatusUnverified_UETMismatch':\r\n case 'TrackingStatusTagInactive_UETMismatch':\r\n case 'TrackingStatusInactiveDueToTagUnavailable_UETMismatch':\r\n if (!details || !details.UETMismatch || !details.UETMismatch.CurrentTagId || !details.UETMismatch.SuggestedTagId) {\r\n activity.error(`Details missing for audit point ${auditPoint} - details: ${JSON.stringify(details)}`);\r\n }\r\n return {\r\n cardTitle: i18n.getString(_TL_('Incorrectly matched UET tags')),\r\n cardMsg: i18n.getString(_TL_('You are recording conversion events from a different UET tag. The tag ID used by this goal is {{CurrentTagId}}, while the suggested Tag ID is {{SuggestedTagId}}. Please check the goal is using the correct tag ID.'), _.get(details, ['UETMismatch'], {})),\r\n onCardButtonClicked: onClickNavigateToConversionGoalsPage,\r\n cardButtonText: i18n.getString(_TL_('Set up now')),\r\n learnMoreLink: `https://help.ads.microsoft.com/?#apex/ads/${locale}/56951/2`,\r\n };\r\n\r\n case 'TrackingStatusUnverified':\r\n return {\r\n cardTitle: i18n.getString(_TL_('UET tag is not verified')),\r\n cardMsg: i18n.getString(_TL_('The UET tag associated with your website has had no activity in the past 24 hours. Please check your UET tag setup.')),\r\n onCardButtonClicked: onClickNavigateToUETTagPage,\r\n cardButtonText: i18n.getString(_TL_('Set up now')),\r\n learnMoreLink: `https://help.ads.microsoft.com/?#apex/ads/${locale}/56951/2`,\r\n };\r\n\r\n case 'TrackingStatusTagInactive':\r\n return {\r\n cardTitle: i18n.getString(_TL_('Inactive UET tag')),\r\n cardMsg: i18n.getString(_TL_('Your UET tag has not recorded any conversions in the past seven days. Go to UET page to troubleshoot.')),\r\n onCardButtonClicked: onClickNavigateToUETTagPage,\r\n cardButtonText: i18n.getString(_TL_('Set up now')),\r\n learnMoreLink: `https://help.ads.microsoft.com/?#apex/ads/${locale}/56951/2`,\r\n };\r\n\r\n case 'TrackingStatusInactiveDueToTagUnavailable':\r\n return {\r\n cardTitle: i18n.getString(_TL_('Unavailable UET')),\r\n cardMsg: i18n.getString(_TL_('This goal is not associated with an active UET tag. Please check your UET tag setup and make sure to associate the goal with an active UET tag.')),\r\n onCardButtonClicked: onClickNavigateToConversionGoalsPage,\r\n cardButtonText: i18n.getString(_TL_('Set up now')),\r\n learnMoreLink: `https://help.ads.microsoft.com/?#apex/ads/${locale}/56951/2`,\r\n };\r\n\r\n case 'MissGoalWithRevenueValue':\r\n return {\r\n cardTitle: i18n.getString(_TL_('Revenue value not set up')),\r\n cardMsg: i18n.getString(_TL_('You haven\\'t set a specific revenue value for this conversion goal.')),\r\n onCardButtonClicked: onClickNavigateToConversionGoalsPage,\r\n cardButtonText: i18n.getString(_TL_('Check now')),\r\n learnMoreLink: `https://help.ads.microsoft.com/#apex/ads/${locale}/56687/2`,\r\n };\r\n\r\n case 'ConversionGoalPending':\r\n return {\r\n cardTitle: i18n.getString(_TL_('Check your conversion tracking')),\r\n cardMsg: i18n.getString(_TL_('Tag verified at least for one conversion goal, but no conversion data yet.')),\r\n };\r\n\r\n case 'TrackingStatusRecordingConversions':\r\n return {};\r\n\r\n default:\r\n activity.error(`Audit point mapping not found for new API in getConversionStatus:${auditPoint}`);\r\n return {};\r\n }\r\n }\r\n\r\n switch (auditPoint) {\r\n case 'HasNoValidGoalAtCampaignOrAccountLevel':\r\n return {\r\n cardTitle: i18n.getString(_TL_('Create conversion goal')),\r\n cardMsg: i18n.getString(_TL_('Your campaign doesn\\'t have a conversion goal to track conversions. When you create a conversion goal and associate it with this campaign, you can specify which actions count as conversions.')),\r\n onCardButtonClicked: () => {\r\n statusAndActionReport({\r\n activity,\r\n type: 'conversion',\r\n action: 'navigate to goal creation page',\r\n details: `AuditPoint: ${auditPoint}`,\r\n });\r\n\r\n const isAutoGoalEnabled = _.get(serverContext.DynamicPermissions, 'AllowAutoGoalWizard', false);\r\n let routeName = 'conversion-goals-create';\r\n\r\n if (isAutoGoalEnabled) {\r\n routeName = 'conversion-goals-auto-create';\r\n }\r\n\r\n if (!isSDK()) {\r\n scope.remove(['campaignId']);\r\n scope.save(getRoutePathById(allSiteMap, routeName));\r\n } else {\r\n const url = getFullProductUrl(routeName, scope);\r\n window.open(url);\r\n }\r\n },\r\n cardButtonText: i18n.getString(_TL_('Set up now')),\r\n learnMoreLink: `https://help.ads.microsoft.com/#apex/ads/${locale}/56709/2`,\r\n };\r\n\r\n case 'MissGoalWithRevenueValue':\r\n return {\r\n statusLabelMsg: i18n.getString(_TL_('No goal to track revenue')),\r\n cardTitle: i18n.getString(_TL_('Check you conversion tracking')),\r\n cardMsg: i18n.getString(_TL_('Something doesn\\'t seem right with your conversion tracking. Please check your conversion tracking setup.')),\r\n onCardButtonClicked: () => {\r\n statusAndActionReport({\r\n activity,\r\n type: 'conversion',\r\n action: 'navigate to conversion goals page',\r\n details: `AuditPoint: ${auditPoint}`,\r\n });\r\n\r\n if (!isSDK()) {\r\n scope.remove(['campaignId']);\r\n scope.save(getRoutePathById(allSiteMap, 'conversion-goals'));\r\n } else {\r\n const url = getFullProductUrl('conversion-goals', scope);\r\n window.open(url);\r\n }\r\n },\r\n cardButtonText: i18n.getString(_TL_('Check now')),\r\n };\r\n\r\n case 'TrackingStatusUnverified':\r\n case 'TrackingStatusTagInactive':\r\n case 'TrackingStatusInactiveDueToTagUnavailable':\r\n return {\r\n statusLabelMsg: i18n.getString(_.get(AUDIT_POINT_STATUS_TEXT, auditPoint, _TL_(''))),\r\n cardTitle: i18n.getString(_.get(AUDIT_POINT_TITLE_TEXT, auditPoint, _TL_(''))),\r\n cardMsg: i18n.getString(_TL_('Something doesn\\'t seem right with your UET tag. Please check your UET tag setup.')),\r\n onCardButtonClicked: onClickNavigateToUETTagPage,\r\n cardButtonText: i18n.getString(_TL_('Check now')),\r\n learnMoreLink: `https://help.ads.microsoft.com/apex/index/3/${locale}/56692`,\r\n };\r\n\r\n case 'TrackingStatusNoConversions':\r\n return {\r\n cardTitle: i18n.getString(_TL_('There are no conversions for this campaign')),\r\n cardMsg: i18n.getString(_TL_('You\\'ve received no conversions for this campaign in the past 7 days. Please review common issues with UET tracking, conversion goals, and offline conversions or contact Support for additional help.')),\r\n learnMoreLink: `https://help.ads.microsoft.com/#apex/ads/${locale}/60398/2`,\r\n };\r\n\r\n case 'NoOfflineConversions':\r\n return {\r\n cardTitle: i18n.getString(_TL_('There are no conversions for this campaign')),\r\n cardMsg: i18n.getString(_TL_('There are no conversions recorded for this campaign in the past 7 days. Please check the UET setup for your online conversion tracking. Please also ensure your import tool is operating correctly, and that your offline conversions are imported.')),\r\n onCardButtonClicked: onClickNavigateToOfflineConversionsPage,\r\n cardButtonText: i18n.getString(_TL_('Fix now')),\r\n learnMoreLink: `https://help.ads.microsoft.com/#apex/ads/${locale}/56852/2`,\r\n };\r\n\r\n case 'ConversionGoalPending':\r\n return {\r\n cardTitle: i18n.getString(_TL_('Check your conversion tracking')),\r\n cardMsg: i18n.getString(_TL_('Tag verified at least for one conversion goal, but no conversion data yet.')),\r\n };\r\n\r\n case 'TrackingStatusRecordingConversions':\r\n case 'HasOfflineConversions':\r\n case 'HasValidAccountLevelGoal':\r\n return {};\r\n\r\n default:\r\n activity.error(`Audit point mapping not found in getConversionStatus:${auditPoint}`);\r\n return {};\r\n }\r\n};\r\n\r\nexport const isConversionApplicable = ({\r\n conversionDetails,\r\n}) => {\r\n const statusValue = _.get(conversionDetails, ['Value', 'Status']);\r\n return statusValue !== 'ConversionNotApplicable';\r\n};\r\n\r\nexport const getConversionStatus = ({\r\n details, scope, i18n, activity, locale, serverContext, campaignType,\r\n}) => {\r\n if (_.isEmpty(details)\r\n || _.isEmpty(_.get(details, 'Value'))\r\n || _.get(details, ['Value', 'ErrorCode'], 0) !== 0\r\n || _.get(details, ['Value', 'ErrorMessage'])) {\r\n statusAndActionReport({\r\n activity,\r\n type: 'conversion',\r\n details: `Error - details: ${JSON.stringify(details)}`,\r\n });\r\n return {\r\n name: i18n.getString(_TL_('Conversions')),\r\n key: DetailCardsKey.conversionTracking,\r\n };\r\n }\r\n\r\n const statusValue = _.get(details, ['Value', 'Status']);\r\n const auditPoint = _.get(details, ['Value', 'AuditPoints', 0]);\r\n const diagnosticDetails = _.get(JSON.parse(_.get(details, ['Value', 'DiagnosticDetails'], '{}')), ['GoalWithTopPriorityDiagnose']);\r\n\r\n const cardDetails = getCardDetails({\r\n auditPoint, scope, i18n, activity, locale, serverContext, campaignType, details: diagnosticDetails,\r\n });\r\n\r\n let status = Status.Error;\r\n if (statusValue === 'Active') {\r\n status = Status.Active;\r\n } else if (statusValue === 'Pending') {\r\n status = Status.Pending;\r\n } else if (statusValue === 'NoConversions' || (statusValue && statusValue.includes('MaxClicks'))) {\r\n status = Status.Warning;\r\n }\r\n\r\n return {\r\n name: i18n.getString(_TL_('Conversions')),\r\n key: DetailCardsKey.conversionTracking,\r\n\r\n status,\r\n statusLabelMsg: i18n.getString(_.get(STATUS_TEXT, statusValue, _TL_(''))),\r\n\r\n ...cardDetails,\r\n };\r\n};\r\n","import _ from 'underscore';\r\nimport { Status } from '@bingads-webui-campaign-react/diagnostic-card';\r\n\r\nimport { DetailCardsKey } from './const';\r\n\r\nconst CardStatus = {\r\n Error: {\r\n title: _TL_('Your campaign\\'s performance is blocked'),\r\n text: _TL_('Troubleshoot your campaign\\'s performance by following these steps:'),\r\n },\r\n Warning: {\r\n title: _TL_('Let\\'s improve your campaign\\'s performance'),\r\n text: _TL_('You can improve your campaigns by using following these steps:'),\r\n },\r\n Active: {\r\n title: _TL_('Your campaign is performing well'),\r\n text: _TL_('Check in regularly to ensure your campaign continues to perform.'),\r\n },\r\n Pending: {\r\n title: _TL_('Your campaign is under review'),\r\n text: _TL_('The review may take up to two days. In the meantime, please consider these suggestions to optimize your campaign.'),\r\n },\r\n};\r\n\r\nconst hasError = details => details.some(item => item.status === Status.Error);\r\nconst hasWarning = details => details.some(item => item.status === Status.Warning);\r\nconst isCampaignActive = (details) => {\r\n const campaignDetail = details.find(item => item.key === DetailCardsKey.campaign);\r\n return _.get(campaignDetail, 'status') === Status.Active;\r\n};\r\n\r\nconst logStatusText = ({ status, texts, activity }) => activity.trace(`DiagnosticCard status text - status:${status} title:${texts.title} text:${texts.text}`);\r\n\r\nexport function getCardStatusText(details, activity, i18n) {\r\n let texts = {};\r\n\r\n if (hasError(details)) {\r\n texts = CardStatus.Error;\r\n logStatusText({ status: 'Error', texts, activity });\r\n } else if (hasWarning(details)) {\r\n texts = CardStatus.Warning;\r\n logStatusText({ status: 'Warning', texts, activity });\r\n } else if (isCampaignActive(details)) {\r\n texts = CardStatus.Active;\r\n logStatusText({ status: 'Active', texts, activity });\r\n } else {\r\n texts = CardStatus.Pending;\r\n logStatusText({ status: 'Pending', texts, activity });\r\n }\r\n\r\n return {\r\n campaignStatusTitle: i18n.getString(texts.title),\r\n campaignStatusMsg: i18n.getString(texts.text),\r\n };\r\n}\r\n","import _ from 'underscore';\r\nimport { useContext, useEffect, useState, useMemo } from 'react';\r\nimport { ScopeContext } from '@bingads-webui-react/scope-service';\r\nimport { InstrumentationContext } from '@bingads-webui-react/hoc-with-instrumentation';\r\nimport { AlertHelper } from '@bingads-webui-campaign/alert-helper';\r\nimport { CampaignTypes } from '@bingads-webui-campaign-react/constants';\r\nimport {\r\n getBillingStatus,\r\n getCampaignDiagnostics,\r\n Areas,\r\n getAreasForCampaignType,\r\n} from '@bingads-webui-campaign-react/pmax-overview-data';\r\n\r\nimport { getBillingDetail } from './status-details-helpers/get-billing-detail';\r\nimport { getDiagnosticsDetail } from './status-details-helpers/get-diagnostics-detail';\r\nimport { getCardStatusText } from './card-status-text-helper';\r\n\r\nexport function useData({\r\n serverContext,\r\n i18n,\r\n perfMarker,\r\n sesId,\r\n campaignType,\r\n}) {\r\n const [billing, setBilling] = useState(null);\r\n const [diagnosticsData, setDiagnosticsData] = useState(null);\r\n const [isDataFetchDone, setIsDataFetchDone] = useState(false);\r\n const [error, setError] = useState(null);\r\n\r\n const instrumentation = useContext(InstrumentationContext);\r\n const { activity } = useMemo(() => instrumentation.createScenarioAndActivity({\r\n scenarioName: 'Fluent2OverviewPage',\r\n activityName: 'DiagnosticCard',\r\n }), [instrumentation]);\r\n const alertHelper = useMemo(() => new AlertHelper({ i18n }), [i18n]);\r\n\r\n const areas = useMemo(() => getAreasForCampaignType({ activity, campaignType }), [activity, campaignType]);\r\n\r\n const { scope } = useContext(ScopeContext);\r\n const {\r\n values: {\r\n cid: scopeCID,\r\n aid,\r\n uid,\r\n campaignId,\r\n },\r\n } = scope;\r\n const cid = _.get(serverContext, ['CurrentAccount', 'AdvertiserCustomerID']) || scopeCID;\r\n\r\n useEffect(() => {\r\n if (areas.includes(Areas.Billing)) {\r\n getBillingStatus({\r\n cid: scopeCID, aid, uid, ccBaseUrl: _.get(serverContext, ['Urls', 'ClientCenterBaseUrl']), set: setBilling, dfmCacheKey: 'Diagnostic-BillingStatus', setError,\r\n });\r\n }\r\n\r\n // We don't want to overwrite the Audience campaigns pilot\r\n const isNewConversionsEnabled = campaignType !== CampaignTypes.Audience && (_.get(serverContext, ['DynamicPermissions', 'DiagnosticCMMTApi']) || _.get(serverContext, ['DynamicPermissions', 'ConversionWarningImprovement']));\r\n // This pilot checks only applies to Audience campaigns\r\n const isNewApiEnabledForAudienceCampaigns = campaignType === CampaignTypes.Audience && _.get(serverContext, ['DynamicPermissions', 'AudienceUnderspendShowTileUseNewAPI']);\r\n // New API doesn't support App campaigns yet\r\n const withNewApi = campaignType !== CampaignTypes.App && (isNewConversionsEnabled || isNewApiEnabledForAudienceCampaigns);\r\n getCampaignDiagnostics({\r\n cid,\r\n aid,\r\n campaignId,\r\n timeZoneId: _.get(serverContext, ['CurrentAccount', 'TimeZone']),\r\n adInsightBaseUrl: _.get(serverContext, ['ServicesEndpoints', 'AdInsightAPI']),\r\n Token: _.get(serverContext, 'Token'),\r\n set: setDiagnosticsData,\r\n setError,\r\n dfmCacheKey: 'Diagnostic-DiagnosticData',\r\n areas: _.without(areas, Areas.Billing),\r\n campaignType,\r\n withNewApi,\r\n useNewConversionDiagnostics: isNewConversionsEnabled,\r\n });\r\n }, [serverContext, aid, campaignId, cid, uid, sesId, scopeCID, areas, campaignType]);\r\n\r\n const billingDetail = useMemo(() => {\r\n if (!billing || !Array.isArray(billing)) {\r\n return null;\r\n }\r\n\r\n return getBillingDetail({\r\n billing,\r\n i18n,\r\n scope,\r\n ccBaseUrl: _.get(serverContext, ['Urls', 'ClientCenterBaseUrl']),\r\n activity,\r\n });\r\n }, [serverContext, activity, billing, i18n, scope]);\r\n\r\n const diagnosticsDetail = useMemo(() => {\r\n if (!diagnosticsData || !Array.isArray(_.get(diagnosticsData, 'CampaignDiagnosticDetail'))) {\r\n return {};\r\n }\r\n return getDiagnosticsDetail({\r\n diagnosticsData, i18n, scope, activity, serverContext, alertHelper, areas, campaignType,\r\n });\r\n }, [diagnosticsData, i18n, scope, activity, serverContext, alertHelper, areas, campaignType]);\r\n\r\n const rawDetails = useMemo(() => _.reduce(\r\n areas,\r\n (acc, a) => {\r\n if (a === Areas.Billing) {\r\n acc.push(billingDetail);\r\n } else if (diagnosticsDetail[a] !== undefined) {\r\n acc.push(diagnosticsDetail[a]);\r\n }\r\n return acc;\r\n },\r\n []\r\n ), [billingDetail, areas, diagnosticsDetail]);\r\n const totalStatusCount = rawDetails.length;\r\n const details = useMemo(\r\n () => rawDetails.filter(Boolean),\r\n [rawDetails]\r\n );\r\n\r\n useEffect(() => {\r\n if (!isDataFetchDone && details.length === totalStatusCount) {\r\n setIsDataFetchDone(true);\r\n perfMarker.done();\r\n }\r\n }, [details, isDataFetchDone, perfMarker, totalStatusCount]);\r\n\r\n useEffect(() => {\r\n if (error) {\r\n if (details.length > 0) {\r\n // If we have some details to show, we can dismiss the shimmer\r\n setIsDataFetchDone(true);\r\n }\r\n\r\n // readyState 0 means we didn't even send out the request (browser lose focus, unload, etc)\r\n if (error.readyState && error.readyState !== 0) {\r\n activity.error(`Diagnostic data fetch error: ${JSON.stringify(error)}`);\r\n alertHelper.showError(i18n.getString(_TL_('We’ve encountered an error and can’t continue. Please contact support for further assistance.')));\r\n }\r\n }\r\n }, [activity, alertHelper, details.length, error, i18n]);\r\n\r\n const {\r\n campaignStatusTitle,\r\n campaignStatusMsg,\r\n } = getCardStatusText(details, activity, i18n);\r\n\r\n return {\r\n isDataFetchDone,\r\n campaignStatusTitle,\r\n campaignStatusMsg,\r\n details,\r\n totalStatusCount,\r\n };\r\n}\r\n","import _ from 'underscore';\r\nimport { Areas } from '@bingads-webui-campaign-react/pmax-overview-data';\r\n\r\nimport { getCampaignStatus } from './get-campaign-status';\r\nimport { getEditorialStatus } from './get-editorial-status';\r\nimport { getBiddingStatus } from './get-bidding-status';\r\nimport { getConversionStatus, isConversionApplicable } from './get-conversion-status';\r\n\r\nexport function getDiagnosticsDetail({\r\n diagnosticsData,\r\n i18n,\r\n scope,\r\n activity,\r\n serverContext,\r\n alertHelper,\r\n areas,\r\n campaignType,\r\n}) {\r\n activity.trace(`getDiagnosticsDetail - diagnosticsData: ${JSON.stringify(diagnosticsData)}`);\r\n const details = _.get(diagnosticsData, 'CampaignDiagnosticDetail', []);\r\n const locale = _.get(serverContext, ['CurrentLocale'], 'en-us').toLowerCase().split('-')[0];\r\n\r\n const result = {};\r\n\r\n if (areas.includes(Areas.Campaign)) {\r\n const campaignDetails = _.findWhere(details, { Key: 'Campaign' });\r\n result[Areas.Campaign] = getCampaignStatus({\r\n details: campaignDetails, scope, i18n, activity, locale, alertHelper,\r\n });\r\n }\r\n\r\n if (areas.includes(Areas.Editorial)) {\r\n const editorialDetails = _.findWhere(details, { Key: 'EditorialStatus' });\r\n result[Areas.Editorial] = getEditorialStatus({\r\n details: editorialDetails, scope, i18n, activity, locale, campaignType,\r\n });\r\n }\r\n\r\n if (areas.includes(Areas.Bidding)) {\r\n const biddingDetails = _.findWhere(details, { Key: 'Bidding' });\r\n result[Areas.Bidding] = getBiddingStatus({\r\n details: biddingDetails, scope, i18n, activity, locale,\r\n });\r\n }\r\n\r\n if (areas.includes(Areas.Conversion)) {\r\n const conversionDetails = _.findWhere(details, { Key: 'Conversion' });\r\n if (isConversionApplicable({ conversionDetails })) {\r\n result[Areas.Conversion] = getConversionStatus({\r\n details: conversionDetails, scope, i18n, activity, locale, serverContext, campaignType,\r\n });\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Shimmer, ShimmerElementType, Separator, mergeStyles } from '@fluentui/react';\r\n\r\nconst wrapperClass = mergeStyles({\r\n padding: 2,\r\n overflowX: 'hidden',\r\n selectors: {\r\n '& > .ms-Shimmer-container': {\r\n margin: '8px 0',\r\n },\r\n },\r\n});\r\n\r\nconst titleShimmerClass = mergeStyles({\r\n width: 'min(320px, 80%)',\r\n});\r\n\r\nconst messageShimmerClass = mergeStyles({\r\n width: 'min(520px, 95%)',\r\n});\r\n\r\nconst shimmerWithElement1stRow = [\r\n { type: ShimmerElementType.line, height: 36 },\r\n];\r\nconst shimmerWithElement2ndRow = [\r\n { type: ShimmerElementType.line, height: 16 },\r\n];\r\nconst shimmerWithElement3rdRow = [\r\n { type: ShimmerElementType.line, height: 6 },\r\n];\r\nconst shimmerWithElement4thRow = [\r\n { type: ShimmerElementType.line, height: 22 },\r\n { type: ShimmerElementType.gap, width: '10%' },\r\n { type: ShimmerElementType.line, height: 22 },\r\n { type: ShimmerElementType.gap, width: '10%' },\r\n { type: ShimmerElementType.line, height: 22 },\r\n { type: ShimmerElementType.gap, width: '10%' },\r\n { type: ShimmerElementType.line, height: 22 },\r\n];\r\nconst shimmerWithElement5thRow = [\r\n { type: ShimmerElementType.line, height: 16 },\r\n];\r\nconst shimmerWithElement6thRow = [\r\n { type: ShimmerElementType.line, height: 155, width: 360 },\r\n { type: ShimmerElementType.gap, width: 20 },\r\n { type: ShimmerElementType.line, height: 155, width: 360 },\r\n];\r\n\r\nexport const DiagnosticCardShimmer = ({ responsiveSize }) => (\r\n <>\r\n
\r\n \r\n \r\n \r\n {\r\n responsiveSize !== 's' ? (\r\n \r\n ) : (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n \r\n);\r\n\r\nDiagnosticCardShimmer.propTypes = {\r\n responsiveSize: PropTypes.string.isRequired,\r\n};\r\n","import _ from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport React, { useEffect } from 'react';\r\n\r\nimport { DiagnosticCard } from '@bingads-webui-campaign-react/diagnostic-card';\r\nimport { PerfMarkerFactory } from '@bingads-webui/performance-marker';\r\n\r\nimport { useData } from './use-data';\r\nimport { DiagnosticCardShimmer } from './shimmer';\r\n\r\nlet perfMarker = null;\r\n\r\nexport function OverviewDiagnosticCard(props) {\r\n const {\r\n serverContext,\r\n i18n,\r\n sesId, // This prop is used for force refreshing card data\r\n perfMarkerUtils,\r\n responsiveSize,\r\n campaignType,\r\n } = props;\r\n\r\n if (_.isEmpty(perfMarker)) {\r\n perfMarker = PerfMarkerFactory.createMarker('Overview_DiagnosticCard');\r\n }\r\n useEffect(() => perfMarker.willInit(), []);\r\n\r\n const {\r\n details,\r\n campaignStatusTitle,\r\n campaignStatusMsg,\r\n isDataFetchDone,\r\n } = useData({\r\n serverContext,\r\n i18n,\r\n perfMarker,\r\n sesId,\r\n campaignType,\r\n });\r\n\r\n if (!isDataFetchDone) {\r\n return ;\r\n }\r\n\r\n perfMarkerUtils.done();\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nOverviewDiagnosticCard.propTypes = {\r\n serverContext: PropTypes.shape({\r\n Urls: PropTypes.shape({\r\n ClientCenterBaseUrl: PropTypes.string.isRequired,\r\n }).isRequired,\r\n }).isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n sesId: PropTypes.number,\r\n perfMarkerUtils: PropTypes.shape({\r\n done: PropTypes.func.isRequired,\r\n }).isRequired,\r\n responsiveSize: PropTypes.string.isRequired,\r\n campaignType: PropTypes.string.isRequired,\r\n};\r\n\r\nOverviewDiagnosticCard.defaultProps = {\r\n sesId: -1,\r\n};\r\n","import _ from 'underscore';\r\nimport React, { useCallback, useContext, useMemo, useState, useEffect, useRef } from 'react';\r\nimport {\r\n TopChangesFilterOption,\r\n getComparisonDateRange,\r\n} from '@bingads-webui-campaign/overview-cards-common';\r\nimport { PermissionsContext } from '@bingads-webui-react/hoc-with-permissions';\r\nimport cacheManager from '@bingads-webui-campaign-legacy/cache-manager/index';\r\nimport { ScopeContext } from '@bingads-webui-react/scope-service';\r\nimport { OverviewTopChanges } from '@bingads-webui-campaign-react/overview-top-changes';\r\nimport * as metricFormatter from '@bingads-webui-campaign-legacy/performance-metric-formatter/index';\r\nimport { getRoutePathById, allSiteMap } from '@bingads-webui-react/with-site-map';\r\nimport { useHeaderStateContext } from '@bingads-webui-campaign-react/overview-card';\r\nimport { getTopChangesAllMetrics } from '@bingads-webui-campaign/fluent-page-data';\r\n\r\nimport { useTopChangesData } from './use-top-changes-data';\r\nimport { useFluctuationPopup } from './use-fluctuation-popup';\r\n\r\nconst entityName = {\r\n customer: 'Account',\r\n account: 'Campaign',\r\n campaign: 'AdGroup',\r\n};\r\n\r\ntype TopChangesCardProps = {\r\n i18n: {\r\n getString: (key: string, params?: any) => string;\r\n };\r\n dateRange: { start: Date; end: Date; };\r\n legacyI18n: any;\r\n filter: any,\r\n jsdata: object;\r\n dateUtil: any;\r\n cardTypeId: string;\r\n constructOptions: Function;\r\n navigationLevel: string;\r\n perfMarkerUtils: {\r\n willFetchData: Function;\r\n willRender: Function;\r\n done: Function;\r\n };\r\n getCardsConfig: Function;\r\n preferenceFromServer: string;\r\n patchPreference: Function;\r\n campaignType: number | string;\r\n};\r\n\r\nexport const TopChangesCard: React.FC = ({\r\n i18n,\r\n legacyI18n,\r\n dateRange,\r\n filter,\r\n jsdata,\r\n dateUtil,\r\n cardTypeId,\r\n constructOptions,\r\n navigationLevel,\r\n perfMarkerUtils,\r\n getCardsConfig,\r\n preferenceFromServer,\r\n patchPreference,\r\n campaignType,\r\n}) => {\r\n const permissions = useContext(PermissionsContext);\r\n const { scope } = useContext(ScopeContext) as any;\r\n const {\r\n aid, cid, uid, campaignId,\r\n } = scope?.values;\r\n const comparisonDateRange = getComparisonDateRange(dateRange);\r\n const headerState = useHeaderStateContext();\r\n const selectedMenuItem = headerState?.selectedItemValue || TopChangesFilterOption.AllChanges;\r\n const [dismissLastFluctuation, setDismissLastFluctuation] = useState(false);\r\n const fetchSingleTile = useRef(false);\r\n\r\n const [selectedMetric, setSelectedMetric] = useState(preferenceFromServer);\r\n const onMetricSelect = useCallback((selection) => {\r\n patchPreference({ metric: selection });\r\n setSelectedMetric(selection);\r\n fetchSingleTile.current = true;\r\n }, [patchPreference]);\r\n\r\n useEffect(() => {\r\n fetchSingleTile.current = true;\r\n }, [selectedMenuItem]);\r\n\r\n useEffect(() => {\r\n fetchSingleTile.current = false;\r\n }, [dateRange]);\r\n\r\n const onFooterButtonClick = useCallback(() => {\r\n if (navigationLevel === 'account') {\r\n scope.save(getRoutePathById(allSiteMap, 'campaigns'));\r\n } else if (navigationLevel === 'customer') {\r\n scope.save(getRoutePathById(allSiteMap, 'performance'));\r\n } else if (navigationLevel === 'campaign') {\r\n scope.save(getRoutePathById(allSiteMap, 'adgroups'));\r\n }\r\n }, [navigationLevel, scope]);\r\n\r\n const footerButtonConfigs = useMemo(() => {\r\n switch (navigationLevel) {\r\n case 'account':\r\n return [\r\n {\r\n text: i18n.getString(_TL_('View all campaigns')),\r\n onClick: onFooterButtonClick,\r\n },\r\n ];\r\n case 'customer':\r\n return [\r\n {\r\n text: i18n.getString(_TL_('View all accounts')),\r\n onClick: onFooterButtonClick,\r\n },\r\n ];\r\n\r\n case 'campaign':\r\n return [\r\n {\r\n text: i18n.getString(_TL_('View all ad groups')),\r\n onClick: onFooterButtonClick,\r\n },\r\n ];\r\n default:\r\n return [];\r\n }\r\n }, [navigationLevel, i18n, onFooterButtonClick]);\r\n\r\n const getHref = useCallback((entityId, campaignType) => {\r\n if (navigationLevel === 'account' && campaignType === 'Smart') {\r\n return `/campaign/smart?cid=${cid}&uid=${uid}&aid=${aid}#/campaign/${entityId}`;\r\n }\r\n\r\n let route = getRoutePathById(allSiteMap, 'overview');\r\n let search = '';\r\n switch (navigationLevel) {\r\n case 'account':\r\n search = `cid=${cid}&uid=${uid}&aid=${aid}&campaignId=${entityId}`;\r\n break;\r\n case 'customer':\r\n search = `cid=${cid}&uid=${uid}&aid=${entityId}`;\r\n break;\r\n case 'campaign':\r\n route = getRoutePathById(allSiteMap, 'keywords');\r\n search = `cid=${cid}&uid=${uid}&aid=${aid}&campaignId=${campaignId}&adGroupId=${entityId}`;\r\n break;\r\n default:\r\n }\r\n\r\n return `${route}?${search}`;\r\n }, [navigationLevel, cid, uid, aid, campaignId]);\r\n\r\n\r\n const { isLoading, data, error } = useTopChangesData({\r\n dateRange,\r\n filter,\r\n comparisonDateRange,\r\n selectedMenuItem,\r\n metric: selectedMetric,\r\n jsdata,\r\n dateUtil,\r\n permissions,\r\n cardTypeId,\r\n constructOptions,\r\n dismissLastFluctuation,\r\n cacheManager,\r\n fetchSingleTile: fetchSingleTile.current,\r\n perfMarkerUtils,\r\n i18n,\r\n getCardsConfig,\r\n campaignType,\r\n });\r\n\r\n useEffect(() => {\r\n if (!isLoading) {\r\n perfMarkerUtils?.done();\r\n }\r\n }, [perfMarkerUtils, isLoading]);\r\n\r\n const allMetrics = useMemo(() => getTopChangesAllMetrics(i18n), [i18n]);\r\n\r\n const renderFluctuationPopup = useFluctuationPopup({\r\n legacyI18n, dateRange, setDismissLastFluctuation, navigationLevel,\r\n });\r\n\r\n return ();\r\n};\r\n","import _ from 'underscore';\r\nimport { useCallback, useContext, useMemo } from 'react';\r\nimport useSwr from 'swr';\r\nimport { AccountUtils } from '@bingads-webui-clientcenter/entity-utils';\r\nimport { InstrumentationContext } from '@bingads-webui-react/hoc-with-instrumentation';\r\nimport {\r\n TopChangesFilterOption,\r\n fetchTopChanges,\r\n isInsightsMetric,\r\n} from '@bingads-webui-campaign/overview-cards-common';\r\n\r\n\r\nconst accountsMode = 1; // 1 for expert mode, we don't expect to have smart mode account anymore\r\n\r\nexport function useTopChangesData({\r\n dateRange,\r\n filter,\r\n comparisonDateRange,\r\n selectedMenuItem,\r\n metric,\r\n jsdata,\r\n dateUtil,\r\n permissions,\r\n cardTypeId,\r\n constructOptions,\r\n dismissLastFluctuation,\r\n cacheManager,\r\n fetchSingleTile,\r\n perfMarkerUtils,\r\n getCardsConfig,\r\n campaignType,\r\n i18n,\r\n}) {\r\n const {\r\n entitySet,\r\n } = constructOptions();\r\n\r\n\r\n const instrumentation = useContext(InstrumentationContext) as any;\r\n const uiActivity = useMemo(() => {\r\n if (instrumentation) {\r\n const scenario = instrumentation.createScenarioAndActivity({\r\n scenarioName: 'Fluent2OverviewPage',\r\n activityName: 'TopChanges',\r\n });\r\n if (scenario?.activity?.trace && scenario?.activity?.error) {\r\n return scenario.activity;\r\n }\r\n }\r\n\r\n return { trace: _.noop, error: _.noop };\r\n }, [instrumentation]);\r\n\r\n const fetch = useCallback(({\r\n dateRange, filter, selectedMenuItem, cardTypeId, metric,\r\n }) => {\r\n perfMarkerUtils?.willFetchData();\r\n return fetchTopChanges({\r\n entitySet,\r\n dateRange,\r\n filter,\r\n comparisonDateRange,\r\n selectedMenuItem,\r\n metric,\r\n jsdata,\r\n dateUtil,\r\n fetchSingleTile,\r\n isDevice: true,\r\n permissions,\r\n disableCache: dismissLastFluctuation,\r\n cacheManager,\r\n accountsMode,\r\n dfmCacheKey: cardTypeId,\r\n getCardsConfig,\r\n campaignType,\r\n }).then((data) => {\r\n perfMarkerUtils?.willRender();\r\n\r\n if (!data || (data.status !== null && data.status !== undefined)) {\r\n // If we have error status. Those are already logged in ajax stub.\r\n // Add a trace log.\r\n uiActivity.trace(`top-changes-card failed to load data - data:${JSON.stringify(data)}`);\r\n if (data?.readyState === 0) {\r\n uiActivity.error('top-changes-card failed to load data - readyState=0');\r\n }\r\n throw new Error(i18n.getString(_TL_('Failed to load data')));\r\n }\r\n\r\n let dataError = false;\r\n\r\n let gridData = _.map(data, (entity) => {\r\n if (!entity || !entity.PerformanceMetricsChange) {\r\n dataError = true;\r\n }\r\n if (entity.AvailableInsightTypeIds && entity.AvailableInsightTypeIds.length) {\r\n const fromScenario = entity.CampaignType ? 'CampaignsOverview' : 'AccountsOverView';\r\n uiActivity.trace(`top-changes-card Fluctuations Rendered. FromScenario: ${fromScenario}, FilterOption: ${selectedMenuItem}, Metric: ${metric}, TypeIds: ${entity.AvailableInsightTypeIds.toString()}, id: ${entity.Id}}.`);\r\n }\r\n if (entity?.AccountInactiveReasons) {\r\n return { ...entity, Status: AccountUtils.activityStatus(entity) };\r\n }\r\n return entity;\r\n });\r\n\r\n if (dataError) {\r\n uiActivity.error(`top-changes-card data error - data:${JSON.stringify(data)}`);\r\n if (data?.readyState === 0) {\r\n uiActivity.error('top-changes-card data error - readyState=0');\r\n }\r\n throw new Error(i18n.getString(_TL_('Failed to load data')));\r\n }\r\n\r\n if (selectedMenuItem === TopChangesFilterOption.TopDecliners) {\r\n gridData = _.filter(gridData, entity => entity.PerformanceMetricsChange[metric] < 0);\r\n } else if (selectedMenuItem === TopChangesFilterOption.TopGainers) {\r\n gridData = _.filter(gridData, entity => entity.PerformanceMetricsChange[metric] > 0);\r\n } else if (selectedMenuItem === TopChangesFilterOption.Insights) {\r\n gridData = isInsightsMetric(metric) ? _.filter(\r\n gridData,\r\n entity => !_.isEmpty(entity.AvailableInsightTypeIds)\r\n ) : [];\r\n }\r\n\r\n return gridData;\r\n }).catch((response) => {\r\n uiActivity.error(`top-changes-card catch error - response:${JSON.stringify(response)}`);\r\n if (response?.readyState === 0) {\r\n uiActivity.error('top-changes-card catch error - readyState=0');\r\n }\r\n throw new Error(i18n.getString(_TL_('Failed to load data')));\r\n });\r\n }, [perfMarkerUtils, entitySet, comparisonDateRange, jsdata, dateUtil, fetchSingleTile, permissions, dismissLastFluctuation, cacheManager, getCardsConfig, campaignType, uiActivity, i18n]);\r\n\r\n\r\n return useSwr({\r\n dateRange, filter, selectedMenuItem, cardTypeId, metric,\r\n }, fetch, {\r\n revalidateOnFocus: false,\r\n });\r\n}\r\n","import React, { useContext, useCallback } from 'react';\r\nimport { ServerContext } from '@bingads-webui-campaign-react/server-context';\r\nimport { ScopeContext } from '@bingads-webui-react/scope-service';\r\nimport { InstrumentationContext } from '@bingads-webui-react/hoc-with-instrumentation';\r\nimport appConfig from '@bingads-webui-component-legacy/config';\r\nimport { FluctuationPopup } from '@bingads-webui-campaign-react/fluctuation-popup';\r\nimport { PerformanceMarkerContext } from '@bingads-webui-campaign-react/performance-marker-provider';\r\n\r\ninterface useFluctuationPopupProps {\r\n legacyI18n: any;\r\n dateRange: { start?: Date; end?: Date; };\r\n setDismissLastFluctuation: Function;\r\n navigationLevel: string;\r\n}\r\n\r\nexport function useFluctuationPopup({\r\n legacyI18n, dateRange, setDismissLastFluctuation, navigationLevel,\r\n}: useFluctuationPopupProps) {\r\n const serverContext = useContext(ServerContext) as any;\r\n const { scope } = useContext(ScopeContext) as any;\r\n const instrumentation = useContext(InstrumentationContext) as any;\r\n const perfMarker = useContext(PerformanceMarkerContext);\r\n\r\n return useCallback(({\r\n fluctuationTypeIds, isOpen, setIsOpen, entity, metric,\r\n }) => {\r\n const onFlucDismiss = ({ isLastFluc }) => {\r\n if (isLastFluc) {\r\n setDismissLastFluctuation(true);\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n const context = {\r\n ...serverContext,\r\n scope,\r\n CurrentCampaign: {\r\n Id: entity ? entity.Id : '',\r\n },\r\n isFluctuationsExperiementEnabled: serverContext?.Permissions?.IsFluctuationExperimentEnabled,\r\n };\r\n\r\n if (navigationLevel === 'customer') {\r\n context.CurrentCampaign = undefined;\r\n context.CurrentAccount = { Id: entity ? entity.Id : '' };\r\n }\r\n\r\n return (\r\n setIsOpen(false)}\r\n onFlucDismiss={onFlucDismiss}\r\n canViewAllInsights\r\n asyncLoadFluctuationConfig={{ dateRange: { startDate: dateRange?.start, endDate: dateRange?.end }, fluctuationTypeIds }}\r\n perfMarker={perfMarker}\r\n withPopoverAdapter={false}\r\n />\r\n );\r\n }, [serverContext, instrumentation, legacyI18n, scope, navigationLevel, dateRange?.start, dateRange?.end, perfMarker, setDismissLastFluctuation]);\r\n}\r\n","import _ from 'underscore';\r\nimport { useState, useCallback } from 'react';\r\n\r\nconst dashboardPreferencesName = 'dashboard/preferences';\r\n\r\nexport const useDashboardPreferences = ({ preference, navigationLevel }) => {\r\n const dashboardPreferences = preference.findByNameAtAccountLevel(dashboardPreferencesName);\r\n const dashboardId = `default-${navigationLevel}`;\r\n const [options, setOptions] = useState(_.get(dashboardPreferences, ['Data', dashboardId, 'options'], {}));\r\n const saveDashBoardOptions = useCallback((newOptions) => {\r\n preference.setAtAccountLevel({\r\n Name: dashboardPreferencesName,\r\n Data: {\r\n ...dashboardPreferences?.Data,\r\n [dashboardId]: {\r\n cards: _.get(dashboardPreferences, ['Data', dashboardId, 'cards']),\r\n options: _.extend({}, options, newOptions),\r\n },\r\n },\r\n });\r\n setOptions(newOptions);\r\n }, [dashboardId, dashboardPreferences, options, preference]);\r\n\r\n return {\r\n options,\r\n saveDashBoardOptions,\r\n };\r\n};\r\n","import _ from 'underscore';\r\nimport { useCallback, useContext, useMemo } from 'react';\r\nimport useSwr from 'swr';\r\nimport getClientCenterAlerts from '@bingads-webui-campaign-legacy/alert/model/client-center';\r\nimport * as scopes from '@bingads-webui-campaign-legacy/alert/model/scopes';\r\nimport { PreferenceContext } from '@bingads-webui-react/preference-context';\r\nimport { ScopeContext } from '@bingads-webui-react/scope-service';\r\nimport { InstrumentationContext } from '@bingads-webui-react/hoc-with-instrumentation';\r\nimport getCouponStatus from '@bingads-webui-campaign-legacy/dashboard-cards/welcome-tips-card/coupon-status';\r\nimport { TIP_ID } from '@bingads-webui-campaign-react/overview-welcome-tips';\r\n\r\nimport { useDashboardPreferences } from './use-dashboard-preferences';\r\n\r\nconst logApi = 'tips-card/index';\r\nconst couponStatusUpfrontSpending = 249;\r\nconst couponStatusActiveCoupon = 250;\r\n\r\nexport function useWelcomeTipPages({\r\n createdCampaign,\r\n skippedBothAtAccountCreation,\r\n skippedNoneAtAccountCreation,\r\n navigationLevel,\r\n perfMarkerUtils,\r\n}) {\r\n const instrumentation = useContext(InstrumentationContext) as any;\r\n const { activity } = useMemo(() => instrumentation.createScenarioAndActivity({\r\n scenarioName: 'WelcomeTipsCard',\r\n activityName: 'WelcomeTipPages',\r\n }), [instrumentation]);\r\n\r\n const preference = useContext(PreferenceContext);\r\n const { scope } = useContext(ScopeContext) as any;\r\n const { aid: accountId, uid: userId, cid: customerId } = scope?.values || {};\r\n const { saveDashBoardOptions } = useDashboardPreferences({ preference, navigationLevel });\r\n const fetch = useCallback(() => {\r\n perfMarkerUtils?.willFetchData();\r\n return getClientCenterAlerts(scopes.$root)\r\n .then((alerts) => {\r\n const paymentAlert = _.filter(alerts, alert => alert.id && alert.id.indexOf('AddPaymentInstrument') !== -1);\r\n let hasValidPaymentMethod = false;\r\n let skippedNoneInFirstLoad = skippedNoneAtAccountCreation;\r\n\r\n if (_.isEmpty(paymentAlert)) {\r\n hasValidPaymentMethod = true;\r\n }\r\n\r\n let hasPaymentPermission = true;\r\n\r\n if (!hasValidPaymentMethod) {\r\n hasPaymentPermission = paymentAlert[0].id.indexOf('NoPermission') === -1;\r\n }\r\n\r\n const newOptions = {};\r\n if (hasValidPaymentMethod && createdCampaign) {\r\n // Skipped none payment and campaign creation.\r\n // Store it in preference so that we show different tips if user added them later\r\n if (skippedNoneAtAccountCreation === undefined) {\r\n newOptions[skippedNoneAtAccountCreation] = true;\r\n skippedNoneInFirstLoad = true;\r\n }\r\n } else if (skippedNoneAtAccountCreation === undefined) {\r\n newOptions[skippedNoneAtAccountCreation] = false;\r\n }\r\n\r\n if (!hasValidPaymentMethod && !createdCampaign) {\r\n // Skipped both payment and campaign creation.\r\n // Store it in preference so that we show different tips when user adds campaign\r\n if (skippedBothAtAccountCreation === undefined) {\r\n newOptions[skippedBothAtAccountCreation] = true;\r\n }\r\n } else if (skippedBothAtAccountCreation === undefined) {\r\n newOptions[skippedBothAtAccountCreation] = false;\r\n }\r\n saveDashBoardOptions(newOptions);\r\n\r\n let hasCoupon = false;\r\n const showWelcomeMsg = hasValidPaymentMethod ? skippedNoneInFirstLoad : !skippedBothAtAccountCreation;\r\n\r\n return getCouponStatus()\r\n .then((coupon) => {\r\n if (hasValidPaymentMethod && coupon && coupon.Redemptions) {\r\n const redeemedCoupons = _.filter(coupon.Redemptions, redeemed => redeemed.StatusId === couponStatusUpfrontSpending || redeemed.StatusId === couponStatusActiveCoupon);\r\n\r\n hasCoupon = !_.isEmpty(redeemedCoupons);\r\n } else if (coupon && coupon.AssociatedCoupon) {\r\n const rex = /\\/Date\\((\\d+)\\)\\//;\r\n const matchResult = rex.exec(coupon.AssociatedCoupon.ExpiryDateFromAssociation);\r\n\r\n if (matchResult && matchResult[1]) {\r\n const expirationDate = parseInt(matchResult[1], 10);\r\n\r\n if (!_.isNaN(expirationDate) && new Date() < new Date(expirationDate)) {\r\n hasCoupon = true;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n showWelcomeMsg,\r\n createdCampaign,\r\n hasPaymentPermission,\r\n hasValidPaymentMethod,\r\n hasCoupon,\r\n };\r\n }).catch((response) => {\r\n // no need to log ajax error here.\r\n if (response.status === undefined) {\r\n activity.error(`${logApi} ${response.stack}`);\r\n }\r\n\r\n return {\r\n showWelcomeMsg,\r\n hasPaymentPermission,\r\n hasCoupon,\r\n createdCampaign,\r\n hasValidPaymentMethod,\r\n };\r\n });\r\n }).catch((response) => {\r\n // no need to log ajax error here.\r\n if (response.status === undefined) {\r\n activity.error(`${logApi} ${response.stack}`);\r\n }\r\n\r\n return {\r\n showWelcomeMsg: true,\r\n hasPaymentPermission: false,\r\n hasCoupon: false,\r\n createdCampaign,\r\n hasValidPaymentMethod: true,\r\n };\r\n });\r\n }, [accountId, activity, createdCampaign, customerId, perfMarkerUtils, saveDashBoardOptions, skippedBothAtAccountCreation, skippedNoneAtAccountCreation, userId]);\r\n\r\n const { isLoading, data, error } = useSwr({}, fetch);\r\n\r\n return useMemo(() => {\r\n const {\r\n showWelcomeMsg,\r\n hasPaymentPermission,\r\n hasCoupon,\r\n createdCampaign,\r\n hasValidPaymentMethod,\r\n } = data || {};\r\n const pages = [];\r\n if (hasValidPaymentMethod && createdCampaign && hasCoupon) {\r\n pages.push(TIP_ID.PROMO);\r\n }\r\n if (!createdCampaign) {\r\n pages.push(TIP_ID.CREATE_CAMPAIGN);\r\n }\r\n if (!hasValidPaymentMethod) {\r\n pages.push(TIP_ID.ADD_PAYMENT);\r\n }\r\n if (hasValidPaymentMethod && createdCampaign) {\r\n pages.push(TIP_ID.COACHING);\r\n pages.push(TIP_ID.HELP);\r\n }\r\n\r\n return {\r\n isLoading,\r\n error,\r\n pages,\r\n hasPaymentPermission,\r\n showWelcomeMsg,\r\n isPaymentFirstTile: createdCampaign && !hasValidPaymentMethod,\r\n hasCoupon,\r\n };\r\n }, [isLoading, error, data]);\r\n}\r\n","import _ from 'underscore';\r\nimport React, { useEffect } from 'react';\r\nimport { OverviewWelcomeTips } from '@bingads-webui-campaign-react/overview-welcome-tips';\r\nimport { getLocalizedSupportLink } from '@bingads-webui-campaign/overview-cards-common';\r\n\r\nimport { useWelcomeTipPages } from './use-welcome-tip-pages';\r\n\r\ntype WelcomeTipsCardProps = {\r\n i18n: {\r\n getString: (key: string, params?: any) => string;\r\n };\r\n\r\n serverContext: any;\r\n perfMarkerUtils: {\r\n willFetchData: Function;\r\n willRender: Function;\r\n done: Function;\r\n };\r\n createdCampaign: boolean;\r\n skippedBothAtAccountCreation: boolean;\r\n skippedNoneAtAccountCreation: boolean;\r\n navigationLevel: string;\r\n};\r\n\r\nexport const WelcomeTipsCard: React.FC = ({\r\n i18n,\r\n serverContext,\r\n perfMarkerUtils,\r\n createdCampaign,\r\n skippedBothAtAccountCreation,\r\n skippedNoneAtAccountCreation,\r\n navigationLevel,\r\n}) => {\r\n const {\r\n isLoading, error, pages, hasPaymentPermission, showWelcomeMsg, isPaymentFirstTile, hasCoupon,\r\n } = useWelcomeTipPages({\r\n createdCampaign,\r\n skippedBothAtAccountCreation,\r\n skippedNoneAtAccountCreation,\r\n navigationLevel,\r\n perfMarkerUtils,\r\n });\r\n\r\n useEffect(() => {\r\n if (!isLoading) {\r\n perfMarkerUtils?.willRender();\r\n perfMarkerUtils?.done();\r\n }\r\n }, [perfMarkerUtils, isLoading]);\r\n\r\n return ();\r\n};\r\n","import Backbone from 'backbone';\r\nimport ko from 'knockout';\r\nimport _ from 'underscore';\r\nimport { CashbackPercentControlView } from '@bingads-webui-campaign/cashback-percent-control-view';\r\n\r\n// Child provide the viewModel and the template\r\nexport class CashbackPercentBaseView extends Backbone.View {\r\n initialize({\r\n view,\r\n i18n,\r\n viewModel,\r\n item,\r\n template,\r\n key = 'Percent',\r\n CashbackPercent = null,\r\n campaign,\r\n adGroup,\r\n decimal,\r\n } = {}) {\r\n this.i18n = i18n;\r\n this.decimal = decimal;\r\n this.view = view; // for refreshing or get the information of the grid view\r\n this.template = template;\r\n this.item = item;\r\n this.viewModel = viewModel;\r\n this.campaign = campaign;\r\n this.adGroup = adGroup;\r\n\r\n this.on('cancel', () => {\r\n this.remove();\r\n });\r\n this.percentValue = key;\r\n this.initializeCashbackPercentControlView(CashbackPercent);\r\n }\r\n\r\n initializeCashbackPercentControlView(CashbackPercent) {\r\n this.cashbackPercentControlView = new CashbackPercentControlView({\r\n viewContext: {\r\n currentCampaign: this.campaign,\r\n currentAdGroup: this.adGroup,\r\n },\r\n i18n: this.i18n,\r\n decimal: this.decimal,\r\n CashbackPercent,\r\n });\r\n }\r\n\r\n render() {\r\n this.$el.html(this.template({\r\n i18n: this.i18n,\r\n }));\r\n\r\n this.$('.cashback-percent-control-container')\r\n .empty()\r\n .append(this.cashbackPercentControlView.render().$el);\r\n\r\n ko.applyBindings(this.viewModel, this.el);\r\n\r\n return this;\r\n }\r\n\r\n get events() {\r\n return {\r\n 'click .save': 'save',\r\n 'click .cancel': 'cancel',\r\n };\r\n }\r\n\r\n validate() {\r\n const isValid = this.cashbackPercentControlView.validate();\r\n\r\n return isValid;\r\n }\r\n\r\n // This should be for bulk edit\r\n getErrors(data) {\r\n return _.reduce(data.Records, (memo, record) => {\r\n const errorMessages = _.chain(record.Errors)\r\n .pluck('Message')\r\n .flatten()\r\n .value();\r\n\r\n return _.extend(memo, {\r\n [record.Id]: errorMessages,\r\n });\r\n }, {});\r\n }\r\n\r\n save() {\r\n if (!this.validate()) {\r\n return false;\r\n }\r\n this.trigger('save', {\r\n Percent: this.cashbackPercentControlView.getCashbackPercentValue(),\r\n });\r\n return true;\r\n }\r\n\r\n setErrors(errorMapping) {\r\n this.viewModel.errors(_.values(errorMapping));\r\n }\r\n\r\n cancel() {\r\n this.trigger('cancel');\r\n }\r\n}\r\n","/* eslint new-cap:0 */\r\nimport _ from 'underscore';\r\nimport { KoSchema } from '@bingads-webui/ko-schema';\r\nimport { AdGroup, ProductGroup } from '@bingads-webui-campaign/campaign-ui-schemas';\r\n\r\n\r\nexport class CashbackPercentBaseViewModel {\r\n constructor({\r\n i18n,\r\n percentSchema = AdGroup.properties.AdGroupCashback.schema,\r\n model,\r\n customValidators = {\r\n Percent: {\r\n isValid: v => v >= 0 && v <= 50,\r\n message: i18n.getString('Validation_Number_Range_Between', { min: 0, max: 50 }),\r\n },\r\n },\r\n } = {}) {\r\n // Use a key-Value model and MT schema to create knockout module with validation\r\n KoSchema(this, percentSchema, _.keys(model), model, customValidators, i18n);\r\n }\r\n}\r\n\r\nexport class AdGroupCashbackPercentViewModel extends CashbackPercentBaseViewModel {\r\n constructor(options) {\r\n const percentSchema = AdGroup.properties.AdGroupCashback.schema;\r\n super({\r\n ...options,\r\n percentSchema,\r\n });\r\n }\r\n}\r\n\r\nexport class ProductGroupsCashbackPercentViewModel extends CashbackPercentBaseViewModel {\r\n constructor(options) {\r\n const percentSchema = ProductGroup.properties.ProductGroupCashback.schema;\r\n super({\r\n ...options,\r\n percentSchema,\r\n });\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport { CashbackPercentBaseView } from '../cashback-percent-base-view';\r\nimport template from '../template/adgroup-cashback-percent.pug';\r\nimport { AdGroupCashbackPercentViewModel } from '../viewmodel/cashback-percent-base-viewmodel';\r\n\r\nexport class AdGroupCashbackPercentView extends CashbackPercentBaseView {\r\n initialize({\r\n view,\r\n i18n,\r\n item,\r\n decimal,\r\n updater,\r\n } = {}) {\r\n const cashbackPercent = item.AdGroupCashback ? item.AdGroupCashback.Percent : null;\r\n const viewModel = new AdGroupCashbackPercentViewModel({\r\n i18n,\r\n model: {\r\n Percent: cashbackPercent,\r\n },\r\n });\r\n this.updater = updater;\r\n\r\n super.initialize({\r\n view,\r\n i18n,\r\n item,\r\n viewModel,\r\n decimal,\r\n template,\r\n key: 'Percent',\r\n CashbackPercent: cashbackPercent,\r\n campaign: item.Campaign,\r\n });\r\n }\r\n\r\n isDataUpdated(currentPercent, item) {\r\n const oldPercent = item.AdGroupCashback ? item.AdGroupCashback.Percent : null;\r\n return currentPercent !== oldPercent;\r\n }\r\n\r\n save() {\r\n if (super.save()) {\r\n const data = this.cashbackPercentControlView.getCashbackPercentValue();\r\n if (this.isDataUpdated(data, this.item)) {\r\n // { CashbackPercent: data } is the real data to be used to send the API\r\n const updated = _.defaults({\r\n CashbackPercent: data,\r\n }, this.item);\r\n this.updater({\r\n view: this.view,\r\n i18n: this.i18n,\r\n fieldName: 'CashbackPercent',\r\n editorView: this,\r\n updated,\r\n editorViewCallbackAfterUpdate: () => {\r\n // Update the original data to reduce the API call towards MT\r\n // But, this may not find the problem if MT does the actual update\r\n // with this, we could show the data with didEdit event but refresh the whole grid\r\n if (this.item.AdGroupCashback) {\r\n this.item.AdGroupCashback.Percent = data;\r\n } else {\r\n this.item.AdGroupCashback = {\r\n Percent: data,\r\n };\r\n }\r\n this.trigger('close');\r\n }, // Trigger the close event inside GridCustomizedPopupEditor\r\n });\r\n } else {\r\n this.trigger('cancel');\r\n }\r\n }\r\n }\r\n}\r\n","import { CashbackPercentBaseView } from '../cashback-percent-base-view';\r\nimport template from '../template/cashback-percent.pug';\r\nimport { CashbackPercentBaseViewModel } from '../viewmodel/cashback-percent-base-viewmodel';\r\n\r\nexport class CriterionCashbackPercentView extends CashbackPercentBaseView {\r\n initialize({\r\n view,\r\n i18n,\r\n item,\r\n decimal,\r\n } = {}) {\r\n const viewModel = new CashbackPercentBaseViewModel({\r\n i18n,\r\n model: {\r\n Percent: item.CriterionCashback.CashbackPercent,\r\n },\r\n });\r\n\r\n super.initialize({\r\n view,\r\n i18n,\r\n item,\r\n viewModel,\r\n template,\r\n decimal,\r\n CashbackPercent: item.CriterionCashback.CashbackPercent,\r\n campaign: item.Campaign,\r\n adGroup: item.AdGroup,\r\n });\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport { ProjectionGridBaseColumn } from '@bingads-webui/projection-grid-base-column';\r\nimport { GridCustomizedPopupEditor } from '@bingads-webui-campaign/grid-customized-popup-editor';\r\nimport { isPersonalizedOfferAvailable, shouldSupportCashbackSettings, isCashbackPercentEmpty, getParentLevelCashbackPercent } from '@bingads-webui-campaign/personalized-offer-shared';\r\nimport { ProductGroupsCashbackPercentView } from './inline-editors/product-groups/product-groups-cashback-percent-view';\r\nimport { AdGroupCashbackPercentView } from './inline-editors/ad-group/ad-group-cashback-percent-view';\r\nimport { CriterionCashbackPercentView } from './inline-editors/criterion/criterion-cashback-percent-view';\r\n\r\nfunction getCashbackPercentDisplayValue(\r\n cashbackPercent,\r\n i18n,\r\n {\r\n adGroup,\r\n campaign,\r\n }\r\n) {\r\n if (isCashbackPercentEmpty(cashbackPercent)) {\r\n const { level, value } = getParentLevelCashbackPercent({\r\n currentAdGroup: adGroup,\r\n currentCampaign: campaign,\r\n });\r\n const formattedValue = isCashbackPercentEmpty(value) ? '-' : i18n.formatPercentToFixed(value / 100, { digits: 2 });\r\n return `${i18n.getString(`CashbackOption_InheritFrom${level}`)} (${formattedValue})`;\r\n }\r\n\r\n const formattedValue = i18n.formatPercentToFixed(cashbackPercent / 100, { digits: 2 });\r\n return formattedValue;\r\n}\r\nexport class CashbackPercentBaseColumn extends ProjectionGridBaseColumn {\r\n constructor(options) {\r\n const {\r\n i18n,\r\n key,\r\n view,\r\n decimal,\r\n permissions,\r\n enableEdit = () => true,\r\n } = options;\r\n super({\r\n ...options,\r\n name: 'CashbackPercent',\r\n title: 'ColumnName_CashbackPercent', // if we defined the i18n, this will be the key\r\n format: 'percentage-value',\r\n sortable: {\r\n direction: [1, -1],\r\n key,\r\n },\r\n type: 'number',\r\n enableEdit,\r\n helpAriaLabel: i18n.getString(\r\n 'Click to learn more about {{item}}',\r\n { item: options.i18n.getString('ColumnName_CashbackPercent') }\r\n ),\r\n });\r\n this.i18n = i18n;\r\n this.view = view;\r\n this.decimal = decimal;\r\n this.permissions = permissions;\r\n }\r\n}\r\n\r\nfunction showPopEditorView(editor, newPosition) {\r\n const popupEditor = new GridCustomizedPopupEditor({\r\n editorView: editor,\r\n cellPosition: newPosition,\r\n parentContainerSelector: '.grid-and-disclaim-container',\r\n });\r\n\r\n popupEditor.render();\r\n}\r\n\r\nexport function AdGroupCashbackPercentColumnFactory({\r\n updater = () => {},\r\n}) {\r\n return class AdGroupCashbackPercentColumn extends CashbackPercentBaseColumn {\r\n constructor(options) {\r\n super({\r\n ...options,\r\n property: 'AdGroupCashback/Percent',\r\n key: 'AdGroupCashback/Percent',\r\n enableEdit: item => shouldSupportCashbackSettings(item.Campaign, this.permissions),\r\n helpId: 'pop_BA_CampaignGrids_CashbackOffer',\r\n });\r\n }\r\n\r\n onPrompt({ item, newPosition }) {\r\n const percentEditor = new AdGroupCashbackPercentView({\r\n view: this.view,\r\n i18n: this.i18n,\r\n decimal: this.decimal,\r\n item,\r\n updater,\r\n }).render();\r\n\r\n showPopEditorView(percentEditor, newPosition);\r\n }\r\n\r\n pickProperty(item) {\r\n return item;\r\n }\r\n\r\n template({ value }) {\r\n if (value.$total) {\r\n return '
';\r\n }\r\n\r\n if (!shouldSupportCashbackSettings(value.Campaign, this.permissions)) {\r\n return '-';\r\n }\r\n\r\n const adGroupCashbackPercent = _.chain(value)\r\n .result('AdGroupCashback')\r\n .result('Percent')\r\n .value();\r\n const displayValue = getCashbackPercentDisplayValue(\r\n adGroupCashbackPercent,\r\n this.i18n,\r\n {\r\n campaign: value.Campaign,\r\n }\r\n );\r\n return displayValue;\r\n }\r\n };\r\n}\r\n\r\nexport function ProductGroupsCashbackPercentColumnFactory({\r\n updater = () => {},\r\n}) {\r\n return class ProductGroupsCashbackPercentColumn extends CashbackPercentBaseColumn {\r\n constructor(options) {\r\n const {\r\n i18n,\r\n } = options.deps;\r\n super({\r\n ...options,\r\n i18n,\r\n property: 'ProductGroupCashback/Percent',\r\n key: 'ProductGroupCashback/Percent',\r\n enableEdit: () => true,\r\n // enableEdit: item => shouldSupportCashbackSettings(item),\r\n });\r\n }\r\n\r\n onPrompt({ item, newPosition }) {\r\n const percentEditor = new ProductGroupsCashbackPercentView({\r\n view: this.view,\r\n i18n: this.i18n,\r\n item,\r\n updater,\r\n }).render();\r\n\r\n showPopEditorView(percentEditor, newPosition);\r\n }\r\n };\r\n}\r\n\r\nexport class CampaignCashbackPercentColumn extends CashbackPercentBaseColumn {\r\n constructor(options) {\r\n super({\r\n ...options,\r\n property: ['CampaignCashback/Percent', 'BiddingScheme', 'BidStrategyName'],\r\n key: 'CampaignCashback/Percent',\r\n enableEdit: item => isPersonalizedOfferAvailable(\r\n options.permissions,\r\n item.CampaignType,\r\n item.CampaignSubType\r\n ),\r\n helpId: 'pop_BA_CampaignCreate_Settings_PP_CashbackOffer',\r\n });\r\n }\r\n // Create the top panel view to edit the Cashback offer, scope and budget\r\n onPrompt({ item }) {\r\n this.view.trigger('inlineEditCashbackSetting', item);\r\n }\r\n\r\n pickProperty(item) {\r\n return item;\r\n }\r\n\r\n template({ value }) {\r\n const cashbackPercent = _.chain(value)\r\n .result('CampaignCashback')\r\n .result('Percent')\r\n .value();\r\n if (value.$total) {\r\n return '
';\r\n }\r\n\r\n if (isCashbackPercentEmpty(cashbackPercent)) {\r\n return '-';\r\n }\r\n\r\n return this.i18n.formatPercentToFixed(cashbackPercent / 100, { digits: 2 });\r\n }\r\n}\r\n\r\nclass CriterionCashbackColumnBase extends CashbackPercentBaseColumn {\r\n pickProperty(item) {\r\n const { LevelOfDetails, Level } = item;\r\n const inherited = LevelOfDetails === 'Campaign';\r\n const CriterionCashback = {\r\n CashbackPercent: this.getCashbackValue(item),\r\n };\r\n\r\n return {\r\n $total: item.$total,\r\n CriterionCashback,\r\n inherited,\r\n level: Level,\r\n adGroup: item.AdGroup,\r\n campaign: item.Campaign,\r\n Status: item.Status,\r\n };\r\n }\r\n\r\n template({ value }) {\r\n if (value.$total) {\r\n return '
';\r\n }\r\n\r\n if (value.Status === 'Excluded') {\r\n return '-';\r\n }\r\n\r\n // for exluded criterion, CriterionCashback is null\r\n const { CriterionCashback } = value;\r\n const displayValue = getCashbackPercentDisplayValue(\r\n CriterionCashback != null ? CriterionCashback.CashbackPercent : null,\r\n this.i18n,\r\n {\r\n campaign: value.campaign,\r\n adGroup: value.inherited ? null : value.adGroup,\r\n }\r\n );\r\n\r\n return `${displayValue}`;\r\n }\r\n}\r\n\r\nexport function audienceCriterionCashbackPercentColumnFactory({\r\n criterionCashbackUpdater = () => {},\r\n decimal,\r\n}) {\r\n return class AudienceCriterionCashbackPercentColumn extends CriterionCashbackColumnBase {\r\n constructor(options) {\r\n const { i18n, view, context } = options; // eslint-disable-line\r\n super({\r\n i18n,\r\n property: 'AudienceCriterion/CashbackAdjustment',\r\n key: 'AudienceCriterion/CashbackAdjustment',\r\n enableEdit: item => this.shouldEnableEdit(item),\r\n // enableEdit: () => true,\r\n });\r\n this.view = view;\r\n this.decimal = decimal;\r\n this.columnContext = context;\r\n }\r\n\r\n shouldEnableEdit(item) {\r\n if (this.columnContext.currentScope === 'adgroup' && item.Level === 'Campaign') {\r\n return false;\r\n }\r\n\r\n const isExcluded = item.Status === 'Excluded';\r\n return _.chain(item)\r\n .result('Campaign')\r\n .result('CampaignCashback')\r\n .result('MonthlyBudget', 0)\r\n .value() > 0 && !isExcluded;\r\n }\r\n\r\n getCashbackValue(item) {\r\n return item.AudienceCriterion ? item.AudienceCriterion.CashbackAdjustment : null;\r\n }\r\n\r\n onSave(model, item) {\r\n const { Percent: newCashbackPercent } = model;\r\n const originalCashbackPercent = _.chain(item)\r\n .result('AudienceCriterion')\r\n .result('CashbackAdjustment', null)\r\n .value();\r\n if (newCashbackPercent !== originalCashbackPercent) {\r\n const param = {\r\n ...item,\r\n AudienceCriterion: {\r\n ...item.AudienceCriterion,\r\n CashbackAdjustment: newCashbackPercent == null ? -1 : newCashbackPercent,\r\n },\r\n };\r\n\r\n criterionCashbackUpdater(this.view, param, model);\r\n }\r\n }\r\n\r\n onPrompt({ item, newPosition }) {\r\n const percentEditor = new CriterionCashbackPercentView({\r\n view: this.view,\r\n i18n: this.i18n,\r\n item: {\r\n CriterionCashback: {\r\n CashbackPercent: this.getCashbackValue(item),\r\n },\r\n Campaign: item.Campaign,\r\n AdGroup: item.AdGroup,\r\n },\r\n decimal: this.decimal,\r\n }).render();\r\n\r\n const popupEditor = new GridCustomizedPopupEditor({\r\n editorView: percentEditor,\r\n cellPosition: newPosition,\r\n parentContainerSelector: '.grid-and-disclaim-container',\r\n });\r\n\r\n percentEditor.on('save', (model) => {\r\n this.onSave(model, item);\r\n percentEditor.trigger('cancel');\r\n });\r\n\r\n popupEditor.render();\r\n }\r\n\r\n template({ value }) {\r\n if (value.$total) {\r\n return '
';\r\n }\r\n\r\n if (value.Status === 'Excluded') {\r\n return '-';\r\n }\r\n\r\n // for exluded criterion, CriterionCashback is null\r\n const { CriterionCashback } = value;\r\n const displayValue = getCashbackPercentDisplayValue(\r\n CriterionCashback != null ? CriterionCashback.CashbackPercent : null,\r\n this.i18n,\r\n value\r\n );\r\n const canBidEditable = !(this.columnContext.currentScope === 'adgroup' && value.level === 'Campaign') && (value.status !== 'Excluded');\r\n\r\n return `${displayValue}`;\r\n }\r\n };\r\n}\r\n\r\nexport function criterionCashbackPercentColumnFactory({\r\n criterionLevel = 'AdGroup',\r\n criterionCashbackOverrideUpdater = () => {},\r\n criterionCashbackUpdater = () => {},\r\n modelName,\r\n decimal,\r\n}) {\r\n let property;\r\n if (criterionLevel === 'Campaign') {\r\n property = `${modelName}/CriterionCashback`;\r\n } else if (criterionLevel === 'AdGroup') {\r\n property = [`${modelName}/CriterionCashback`, 'LevelOfDetails'];\r\n }\r\n\r\n return class CriterionCashbackPercentColumn extends CriterionCashbackColumnBase {\r\n constructor(options) {\r\n const { i18n, view } = options;\r\n super({\r\n i18n,\r\n property,\r\n key: 'CriterionCashback',\r\n enableEdit: item => this.shouldEnableEdit(item),\r\n // enableEdit: () => true,\r\n });\r\n this.criterionLevel = criterionLevel;\r\n this.view = view;\r\n this.decimal = decimal;\r\n }\r\n\r\n shouldEnableEdit(item) {\r\n const isExcluded = item.Status === 'Excluded';\r\n const hasCashbackBudget = _.chain(item)\r\n .result('Campaign')\r\n .result('CampaignCashback')\r\n .result('MonthlyBudget', 0)\r\n .value() > 0;\r\n return hasCashbackBudget && !isExcluded;\r\n }\r\n\r\n getCashbackValue(item) {\r\n return item.CriterionCashback ? item.CriterionCashback.CashbackPercent : null;\r\n }\r\n\r\n onSave(model, item) {\r\n const { Percent: newCashbackPercent } = model;\r\n const originalCashbackPercent = _.chain(item)\r\n .result('CriterionCashback')\r\n .result('CashbackPercent', null)\r\n .value();\r\n if (newCashbackPercent !== originalCashbackPercent) {\r\n const param = {\r\n ...item,\r\n CriterionCashback: {\r\n ...item.CriterionCashback,\r\n // '@odata.type': 'Model.CriterionCashback',\r\n CashbackPercent: newCashbackPercent == null ? -1 : newCashbackPercent,\r\n },\r\n };\r\n\r\n criterionCashbackUpdater(this.view, param, model);\r\n }\r\n }\r\n\r\n onPrompt({ item, newPosition }) {\r\n if (item.LevelOfDetails === 'Campaign') {\r\n criterionCashbackOverrideUpdater(this.view, item);\r\n } else {\r\n const percentEditor = new CriterionCashbackPercentView({\r\n view: this.view,\r\n i18n: this.i18n,\r\n decimal: this.decimal,\r\n item: {\r\n CriterionCashback: {\r\n CashbackPercent: this.getCashbackValue(item),\r\n },\r\n Campaign: item.Campaign,\r\n AdGroup: item.AdGroup,\r\n },\r\n }).render();\r\n\r\n const popupEditor = new GridCustomizedPopupEditor({\r\n editorView: percentEditor,\r\n cellPosition: newPosition,\r\n parentContainerSelector: '.grid-and-disclaim-container',\r\n });\r\n\r\n percentEditor.on('save', (model) => {\r\n this.onSave(model, item);\r\n percentEditor.trigger('cancel');\r\n });\r\n\r\n popupEditor.render();\r\n }\r\n }\r\n };\r\n}\r\n","import { ProjectionGridBaseColumn } from '@bingads-webui/projection-grid-base-column';\r\nimport { isPersonalizedOfferAvailable } from '@bingads-webui-campaign/personalized-offer-shared';\r\nimport cashbackBudgetTemplate from './cashback-budget.pug';\r\n\r\nexport class CashbackBudgetColumn extends ProjectionGridBaseColumn {\r\n constructor(options) {\r\n // Reference the MT metadata\r\n const { i18n, view } = options;\r\n super({\r\n name: 'CashbackBudget',\r\n title: 'ColumnName_CashbackBudget',\r\n property: 'CampaignCashback/MonthlyBudget',\r\n i18n,\r\n sortable: {\r\n direction: [-1, 1],\r\n key: 'CampaignCashback/MonthlyBudget',\r\n },\r\n type: 'number',\r\n enableEdit: item => isPersonalizedOfferAvailable(\r\n options.permissions,\r\n item.CampaignType,\r\n item.CampaignSubType\r\n ),\r\n });\r\n this.i18n = i18n;\r\n this.view = view;\r\n }\r\n\r\n template({ value }) {\r\n let params = null;\r\n if (value) {\r\n const CashbackMonthlyBudget = this.i18n.decimalToFixedFormatter()(Number(value));\r\n const cashbackBudgetRange = this.i18n.getString('CampaignCashback_MonthlyBudget_Range');\r\n params = {\r\n CashbackMonthlyBudget,\r\n cashbackBudgetRange,\r\n };\r\n }\r\n return cashbackBudgetTemplate({ model: params });\r\n }\r\n\r\n // Create the top panel view to edit the Cashback offer, scope and budget\r\n onPrompt({ item }) {\r\n this.view.trigger('inlineEditCashbackSetting', item);\r\n }\r\n}\r\n","import Backbone from 'backbone';\r\nimport ko from 'knockout';\r\nimport _ from 'underscore';\r\n\r\n// Child provide the viewModel and the template\r\n// TODO: check if campaign enable the personalized offer\r\nexport class CashbackScopeBaseView extends Backbone.View {\r\n initialize({\r\n view,\r\n i18n,\r\n viewModel,\r\n item,\r\n template,\r\n showProductScope,\r\n noneScopeText,\r\n } = {}) {\r\n this.i18n = i18n;\r\n this.view = view; // TODO: check usage\r\n this.template = template;\r\n this.item = item;\r\n this.viewModel = viewModel;\r\n this.showProductScope = showProductScope;\r\n this.noneScopeText = noneScopeText;\r\n\r\n this.on('cancel', () => {\r\n this.remove();\r\n });\r\n }\r\n\r\n render() {\r\n this.$el.html(this.template({\r\n i18n: this.i18n,\r\n showProductScope: this.showProductScope,\r\n noneScopeText: this.noneScopeText,\r\n }));\r\n\r\n ko.applyBindings(this.viewModel, this.el);\r\n this.validate(); // use MT schema and koSchema to do the validation\r\n\r\n return this;\r\n }\r\n\r\n get events() {\r\n return {\r\n 'click .save': 'save',\r\n 'click .cancel': 'cancel',\r\n };\r\n }\r\n\r\n validate() {\r\n const isValid = this.viewModel.validate();\r\n\r\n return isValid;\r\n }\r\n\r\n // This should be for bulk edit\r\n getErrors(data) {\r\n return _.reduce(data.Records, (memo, record) => {\r\n const errorMessages = _.chain(record.Errors)\r\n .pluck('Message')\r\n .flatten()\r\n .value();\r\n\r\n return _.extend(memo, {\r\n [record.Id]: errorMessages,\r\n });\r\n }, {});\r\n }\r\n\r\n save() {\r\n if (!this.validate()) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n setErrors(errorMapping) {\r\n this.viewModel.errors(_.values(errorMapping));\r\n }\r\n\r\n cancel() {\r\n this.trigger('cancel');\r\n }\r\n}\r\n","/* eslint new-cap:0 */\r\nimport _ from 'underscore';\r\n// import ko from 'knockout';\r\nimport { KoSchema } from '@bingads-webui/ko-schema';\r\n\r\nlet guid = -1;\r\n\r\nexport class CashbackScopeBaseViewModel {\r\n constructor({\r\n i18n,\r\n scopeSchema,\r\n model,\r\n } = {}) {\r\n // Use a key-Value model and MT schema to create knockout module with validation\r\n KoSchema(this, scopeSchema, _.keys(model), model, {}, i18n);\r\n guid += 1;\r\n // there may be multiple editor instances\r\n // the name should be different\r\n this.formName = `Scope_${guid}`;\r\n }\r\n}\r\n","import { AdGroup } from '@bingads-webui-campaign/campaign-ui-schemas';\r\nimport _ from 'underscore';\r\nimport { CashbackScopeBaseView } from '../cashback-scope-base-view';\r\nimport template from '../template/cashback-scope.pug';\r\nimport { CashbackScopeBaseViewModel } from '../viewmodel/cashback-scope-base-viewmodel';\r\n\r\nexport class AdGroupCashbackScopeView extends CashbackScopeBaseView {\r\n initialize({\r\n view,\r\n i18n,\r\n item,\r\n updater,\r\n noneScopeText,\r\n } = {}) {\r\n const scopeSchema = AdGroup.properties.AdGroupCashback.schema;\r\n const scope = _.chain(item)\r\n .result('AdGroupCashback')\r\n .result('Scope')\r\n .value() || 'None';\r\n const viewModel = new CashbackScopeBaseViewModel({\r\n i18n,\r\n scopeSchema,\r\n model: {\r\n Scope: scope,\r\n },\r\n });\r\n\r\n this.updater = updater;\r\n\r\n // for search campaign we should not show product scope option\r\n const showProductScope = _.chain(item)\r\n .result('Campaign')\r\n .result('CampaignType')\r\n .value() !== 'Default';\r\n\r\n super.initialize({\r\n view,\r\n i18n,\r\n item,\r\n viewModel,\r\n template,\r\n showProductScope,\r\n noneScopeText,\r\n });\r\n }\r\n\r\n isDataUpdated(currentScope, item) {\r\n const oldScope = item.AdGroupCashback ? item.AdGroupCashback.Scope : null;\r\n return currentScope !== oldScope;\r\n }\r\n\r\n save() {\r\n if (super.save()) {\r\n const data = this.viewModel.toObject().Scope;\r\n if (this.isDataUpdated(data, this.item)) {\r\n const updated = _.defaults({ CashbackScope: data }, this.item);\r\n this.updater({\r\n view: this.view,\r\n i18n: this.i18n,\r\n fieldName: 'CashbackScope',\r\n editorView: this,\r\n updated,\r\n editorViewCallbackAfterUpdate: () => {\r\n if (this.item.AdGroupCashback) {\r\n this.item.AdGroupCashback.Scope = data;\r\n } else {\r\n this.item.AdGroupCashback = {\r\n Scope: data,\r\n };\r\n }\r\n this.trigger('close'); // Trigger the close event inside GridCustomizedPopupEditor\r\n },\r\n });\r\n } else {\r\n this.trigger('cancel');\r\n }\r\n }\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport { ProjectionGridBaseColumn } from '@bingads-webui/projection-grid-base-column';\r\nimport { GridCustomizedPopupEditor } from '@bingads-webui-campaign/grid-customized-popup-editor';\r\nimport {\r\n isPersonalizedOfferAvailable,\r\n shouldSupportCashbackSettings,\r\n getParentLevelCashbackScope,\r\n} from '@bingads-webui-campaign/personalized-offer-shared';\r\nimport cashbackScopeTemplate from './cashback-scope.pug';\r\nimport { AdGroupCashbackScopeView } from './inline-editors/ad-group/ad-group-cashback-scope-view';\r\nimport { ProductGroupsCashbackScopeView } from './inline-editors/product-groups/product-groups-cashback-scope-view';\r\n\r\nexport class CashbackScopeColumn extends ProjectionGridBaseColumn {\r\n constructor(options) {\r\n // Reference the MT metadata\r\n const {\r\n i18n,\r\n key,\r\n view,\r\n permissions,\r\n } = options;\r\n super({\r\n ...options,\r\n name: 'CashbackScope',\r\n title: 'ColumnName_CashbackScope',\r\n sortable: {\r\n direction: [-1, 1],\r\n key,\r\n },\r\n type: 'string',\r\n helpAriaLabel: i18n.getString(\r\n 'Click to learn more about {{item}}',\r\n { item: options.i18n.getString('ColumnName_CashbackScope') }\r\n ),\r\n });\r\n this.i18n = i18n;\r\n this.view = view;\r\n this.permissions = permissions;\r\n }\r\n\r\n pickProperty(item) {\r\n return item;\r\n }\r\n\r\n getCashbackScope() {}\r\n\r\n getInheritOptionText() {\r\n return '-';\r\n }\r\n\r\n template({ value }) {\r\n if (value.$total) {\r\n return '
';\r\n }\r\n let params = null;\r\n const scope = this.getCashbackScope(value);\r\n if (scope) {\r\n if (scope === 'Product') {\r\n params = ({\r\n cashbackScope: this.i18n.getString('ColumnField_CashbackScope_Product'),\r\n });\r\n } else if (scope === 'Store') {\r\n params = ({\r\n cashbackScope: this.i18n.getString('ColumnField_CashbackScope_Store'),\r\n });\r\n } else {\r\n params = {\r\n cashbackScope: this.getInheritOptionText(value),\r\n };\r\n }\r\n }\r\n return cashbackScopeTemplate({\r\n model: params,\r\n });\r\n }\r\n}\r\n\r\nfunction showPopEditorView(editor, newPosition) {\r\n const popupEditor = new GridCustomizedPopupEditor({\r\n editorView: editor,\r\n cellPosition: newPosition,\r\n parentContainerSelector: '.grid-and-disclaim-container',\r\n });\r\n\r\n popupEditor.render();\r\n}\r\n\r\nexport function AdGroupCashbackScopeColumnFactory({\r\n updater = () => {},\r\n}) {\r\n return class AdGroupCashbackScopeColumn extends CashbackScopeColumn {\r\n constructor(options) {\r\n super({\r\n ...options,\r\n key: 'AdGroupCashback/Scope',\r\n property: 'AdGroupCashback/Scope',\r\n enableEdit: item => this.shouldEnableEdit(item),\r\n helpId: 'pop_BA_CampaignGrids_CashbackOfferScope',\r\n });\r\n }\r\n\r\n shouldEnableEdit(item) {\r\n const campaignType = _.chain(item)\r\n .result('Campaign')\r\n .result('CampaignType')\r\n .value();\r\n\r\n if (campaignType === 'Default') {\r\n return false;\r\n }\r\n\r\n return shouldSupportCashbackSettings(item.Campaign, this.permissions);\r\n }\r\n\r\n template(arg) {\r\n if (arg.value.$total) {\r\n return '
';\r\n }\r\n if (!shouldSupportCashbackSettings(arg.value.Campaign, this.permissions)) {\r\n return '-';\r\n }\r\n return super.template(arg);\r\n }\r\n\r\n onPrompt({ item, newPosition }) {\r\n const scopeEditor = new AdGroupCashbackScopeView({\r\n view: this.view,\r\n i18n: this.i18n,\r\n item,\r\n updater,\r\n noneScopeText: this.getInheritOptionText(item),\r\n }).render();\r\n\r\n showPopEditorView(scopeEditor, newPosition);\r\n }\r\n\r\n getCashbackScope(item) {\r\n return _.chain(item)\r\n .result('AdGroupCashback')\r\n .result('Scope')\r\n .value() || 'None';\r\n }\r\n\r\n getInheritOptionText(item) {\r\n const campaignLevelScope = getParentLevelCashbackScope({\r\n currentCampaign: item.Campaign,\r\n });\r\n const campaignLevelScopeText = campaignLevelScope === 'None' ? '-' : this.i18n.getString(`ColumnField_CashbackScope_${campaignLevelScope}`);\r\n\r\n return `${this.i18n.getString('CashbackOption_InheritFromCampaign')} (${campaignLevelScopeText})`;\r\n }\r\n };\r\n}\r\n\r\nexport function ProductGroupsCashbackScopeColumnFactory({\r\n updater = () => {},\r\n}) {\r\n return class ProductGroupsCashbackScopeColumn extends CashbackScopeColumn {\r\n constructor(options) {\r\n const {\r\n i18n,\r\n } = options.deps;\r\n super({\r\n ...options,\r\n i18n,\r\n key: 'ProductGroupCashback/Scope',\r\n property: 'ProductGroupCashback/Scope',\r\n enableEdit: () => true,\r\n });\r\n }\r\n\r\n onPrompt({ item, newPosition }) {\r\n const scopeEditor = new ProductGroupsCashbackScopeView({\r\n view: this.view,\r\n i18n: this.i18n,\r\n item,\r\n updater,\r\n }).render();\r\n\r\n showPopEditorView(scopeEditor, newPosition);\r\n }\r\n };\r\n}\r\n\r\nexport class CampaignCashbackScopeColumn extends CashbackScopeColumn {\r\n constructor(options) {\r\n super({\r\n ...options,\r\n key: 'CampaignCashback/Scope',\r\n property: ['CampaignCashback/Scope', 'BiddingScheme', 'BidStrategyName'],\r\n enableEdit: item => this.shouldEnableEdit(options.permissions, item),\r\n helpId: 'pop_BA_CampaignCreate_Settings_PP_Scope',\r\n });\r\n }\r\n\r\n shouldEnableEdit(permissions, item) {\r\n return isPersonalizedOfferAvailable(\r\n permissions,\r\n item.CampaignType,\r\n item.CampaignSubType\r\n );\r\n }\r\n\r\n // Create the top panel view to edit the Cashback offer, scope and budget\r\n onPrompt({ item }) {\r\n this.view.trigger('inlineEditCashbackSetting', item);\r\n }\r\n\r\n getCashbackScope(item) {\r\n return _.chain(item)\r\n .result('CampaignCashback')\r\n .result('Scope')\r\n .value() || 'None';\r\n }\r\n}\r\n","export const cashbackPercentGridCommonStyle = ({ palette }) => ({ // eslint-disable-line\r\n '.grid-popupeditor': {\r\n '& .popover-edit-cashback-percent': {\r\n width: 342,\r\n '& .cashback-percent-input, & .inherit-value-span': {\r\n width: 64,\r\n marginLeft: 7,\r\n },\r\n '& .inherit-value-span': {\r\n border: `1px solid ${palette.neutralSecondary}`,\r\n },\r\n '& .cashback-option-select': {\r\n maxWidth: 176,\r\n },\r\n },\r\n },\r\n '.top-grid-form .audience__association': {\r\n '& .cashback-settings-section': {\r\n '& .input-group-addon': {\r\n background: 'none',\r\n border: 'none',\r\n paddingLeft: '8px !important',\r\n },\r\n '& .cashback-option-select': {\r\n width: '205px !important',\r\n },\r\n '& .inline-input': {\r\n marginLeft: '0 !important',\r\n marginRight: '0 !important',\r\n width: '205px !important',\r\n },\r\n },\r\n },\r\n '.bingadsgrid .table-container': {\r\n '& td[data-column=\"CashbackPercent\"]': {\r\n paddingRight: '30px !important',\r\n '& .grid-editable-cell-container': {\r\n marginRight: -22,\r\n },\r\n },\r\n },\r\n});\r\n","import Backbone from 'backbone';\r\nimport ko from 'knockout';\r\nimport _ from 'underscore';\r\n\r\nexport class CouponBaseView extends Backbone.View {\r\n initialize({\r\n view,\r\n i18n,\r\n viewModel,\r\n item,\r\n template,\r\n noneCouponText,\r\n } = {}) {\r\n this.i18n = i18n;\r\n this.view = view;\r\n this.template = template;\r\n this.item = item;\r\n this.viewModel = viewModel;\r\n this.noneCouponText = noneCouponText;\r\n\r\n this.on('cancel', () => {\r\n this.remove();\r\n });\r\n }\r\n\r\n render() {\r\n this.$el.html(this.template({\r\n i18n: this.i18n,\r\n noneCouponText: this.noneCouponText,\r\n }));\r\n\r\n ko.applyBindings(this.viewModel, this.el);\r\n this.validate(); // use MT schema and koSchema to do the validation\r\n\r\n return this;\r\n }\r\n\r\n get events() {\r\n return {\r\n 'click .save': 'save',\r\n 'click .cancel': 'cancel',\r\n };\r\n }\r\n\r\n validate() {\r\n const isValid = this.viewModel.validate();\r\n\r\n return isValid;\r\n }\r\n\r\n // This should be for bulk edit\r\n getErrors(data) {\r\n return _.reduce(data.Records, (memo, record) => {\r\n const errorMessages = _.chain(record.Errors)\r\n .pluck('Message')\r\n .flatten()\r\n .value();\r\n\r\n return _.extend(memo, {\r\n [record.Id]: errorMessages,\r\n });\r\n }, {});\r\n }\r\n\r\n save() {\r\n if (!this.validate()) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n setErrors(errorMapping) {\r\n this.viewModel.errors(_.values(errorMapping));\r\n }\r\n\r\n cancel() {\r\n this.trigger('cancel');\r\n }\r\n}\r\n","/* eslint new-cap:0 */\r\nimport _ from 'underscore';\r\n// import ko from 'knockout';\r\nimport { KoSchema } from '@bingads-webui/ko-schema';\r\n\r\nlet guid = -1;\r\n\r\nexport class CouponBaseViewModel {\r\n constructor({\r\n i18n,\r\n couponSchema,\r\n model,\r\n } = {}) {\r\n // Use a key-Value model and MT schema to create knockout module with validation\r\n KoSchema(this, couponSchema, _.keys(model), model, {}, i18n);\r\n guid += 1;\r\n // there may be multiple editor instances\r\n // the name should be different\r\n this.formName = `Coupon_${guid}`;\r\n }\r\n}\r\n","import { AdGroup } from '@bingads-webui-campaign/campaign-ui-schemas';\r\nimport _ from 'underscore';\r\nimport { CouponBaseView } from '../coupon-base-view';\r\nimport template from '../template/coupon.pug';\r\nimport { CouponBaseViewModel } from '../viewmodel/coupon-base-viewmodel';\r\n\r\nexport class AdGroupCouponView extends CouponBaseView {\r\n initialize({\r\n view,\r\n i18n,\r\n item,\r\n updater,\r\n noneCouponText,\r\n } = {}) {\r\n const couponSchema = AdGroup.properties.AdGroupCashback.schema;\r\n const coupon = _.chain(item)\r\n .result('AdGroupCashback')\r\n .result('CouponsEnabled')\r\n .value() || 'None';\r\n const viewModel = new CouponBaseViewModel({\r\n i18n,\r\n couponSchema,\r\n model: {\r\n CouponsEnabled: coupon,\r\n },\r\n });\r\n\r\n this.updater = updater;\r\n\r\n super.initialize({\r\n view,\r\n i18n,\r\n item,\r\n viewModel,\r\n template,\r\n noneCouponText,\r\n });\r\n }\r\n\r\n isDataUpdated(currentCoupon, item) {\r\n const oldCoupon = _.chain(item)\r\n .result('AdGroupCashback')\r\n .result('CouponsEnabled')\r\n .value() || 'None';\r\n\r\n return currentCoupon !== oldCoupon;\r\n }\r\n\r\n save() {\r\n if (super.save()) {\r\n const data = this.viewModel.toObject().CouponsEnabled;\r\n if (this.isDataUpdated(data, this.item)) {\r\n const updated = _.defaults({ CouponsEnabled: data }, this.item);\r\n this.updater({\r\n view: this.view,\r\n i18n: this.i18n,\r\n fieldName: 'CouponsEnabled',\r\n editorView: this,\r\n updated,\r\n editorViewCallbackAfterUpdate: () => {\r\n if (this.item.AdGroupCashback) {\r\n this.item.AdGroupCashback.CouponsEnabled = data;\r\n } else {\r\n this.item.AdGroupCashback = {\r\n CouponsEnabled: data,\r\n };\r\n }\r\n this.trigger('close'); // Trigger the close event inside GridCustomizedPopupEditor\r\n },\r\n });\r\n } else {\r\n this.trigger('cancel');\r\n }\r\n }\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport { ProjectionGridBaseColumn } from '@bingads-webui/projection-grid-base-column';\r\nimport { GridCustomizedPopupEditor } from '@bingads-webui-campaign/grid-customized-popup-editor';\r\nimport {\r\n getParentLevelCoupon,\r\n isPersonalizedOfferAvailable,\r\n shouldSupportCashbackSettings,\r\n isShowCoupon,\r\n} from '@bingads-webui-campaign/personalized-offer-shared';\r\nimport { AdGroupCouponView } from './inline-editors/ad-group/ad-group-coupon-view';\r\nimport couponTemplate from './coupon.pug';\r\n\r\nexport class CouponColumn extends ProjectionGridBaseColumn {\r\n constructor(options) {\r\n const {\r\n i18n,\r\n key,\r\n view,\r\n } = options;\r\n\r\n super({\r\n ...options,\r\n name: 'Coupon',\r\n title: 'ColumnName_Coupon',\r\n sortable: {\r\n direction: [-1, 1],\r\n key,\r\n },\r\n type: 'string',\r\n helpAriaLabel: i18n.getString(\r\n 'Click to learn more about {{item}}',\r\n { item: options.i18n.getString('ColumnName_Coupon') }\r\n ),\r\n });\r\n\r\n this.permissions = options.permissions;\r\n this.i18n = i18n;\r\n this.view = view;\r\n }\r\n\r\n pickProperty(item) {\r\n return item;\r\n }\r\n\r\n getCoupon() {}\r\n\r\n getInheritOptionText() {\r\n return this.i18n.getString('ColumnField_Coupon_None');\r\n }\r\n\r\n shouldEnableEdit() {\r\n return false;\r\n }\r\n\r\n template({ value }) {\r\n if (value.$total) {\r\n return '
';\r\n }\r\n\r\n let params = null;\r\n const coupon = this.getCoupon(value);\r\n\r\n switch (coupon) {\r\n case 'Enabled':\r\n params = ({\r\n coupon: this.i18n.getString('ColumnField_Coupon_Enabled'),\r\n });\r\n break;\r\n case 'Disabled':\r\n params = ({\r\n coupon: this.i18n.getString('ColumnField_Coupon_Disabled'),\r\n });\r\n break;\r\n case 'None':\r\n default:\r\n params = {\r\n coupon: this.getInheritOptionText(value),\r\n };\r\n }\r\n\r\n return couponTemplate({\r\n model: params,\r\n });\r\n }\r\n}\r\n\r\nfunction showPopEditorView(editor, newPosition) {\r\n const popupEditor = new GridCustomizedPopupEditor({\r\n editorView: editor,\r\n cellPosition: newPosition,\r\n parentContainerSelector: '.grid-and-disclaim-container',\r\n });\r\n\r\n popupEditor.render();\r\n}\r\n\r\nexport function AdGroupCouponColumnFactory({\r\n updater = () => {},\r\n}) {\r\n return class AdGroupCouponColumn extends CouponColumn {\r\n constructor(options) {\r\n super({\r\n ...options,\r\n key: 'AdGroupCashback/CouponsEnabled',\r\n property: 'AdGroupCashback/CouponsEnabled',\r\n enableEdit: item => this.shouldEnableEdit(item),\r\n helpId: 'pop_BA_CampaignGrids_Coupons',\r\n });\r\n }\r\n\r\n shouldEnableEdit(item) {\r\n const { Campaign: campaign } = item;\r\n\r\n return shouldSupportCashbackSettings(campaign, this.permissions)\r\n && isShowCoupon(campaign, this.permissions);\r\n }\r\n\r\n onPrompt({ item, newPosition }) {\r\n const couponEditor = new AdGroupCouponView({\r\n view: this.view,\r\n i18n: this.i18n,\r\n item,\r\n updater,\r\n noneCouponText: this.getInheritOptionText(item),\r\n }).render();\r\n\r\n showPopEditorView(couponEditor, newPosition);\r\n }\r\n\r\n template(arg) {\r\n if (arg.value.$total) {\r\n return '
';\r\n }\r\n if (!shouldSupportCashbackSettings(arg.value.Campaign, this.permissions) ||\r\n !isShowCoupon(arg.value.Campaign, this.permissions)) {\r\n return '-';\r\n }\r\n return super.template(arg);\r\n }\r\n\r\n getCoupon(item) {\r\n return _.chain(item)\r\n .result('AdGroupCashback')\r\n .result('CouponsEnabled')\r\n .value() || 'None';\r\n }\r\n\r\n getInheritOptionText(item) {\r\n const campaignLevelCoupon = getParentLevelCoupon({\r\n currentCampaign: item.Campaign,\r\n });\r\n\r\n return this.i18n.getString('ColumnField_Coupon_Inherit', {\r\n value: this.i18n.getString(`ColumnField_Coupon_${campaignLevelCoupon}`),\r\n });\r\n }\r\n };\r\n}\r\n\r\nexport class CampaignCouponColumn extends CouponColumn {\r\n constructor(options) {\r\n super({\r\n ...options,\r\n key: 'CampaignCashback/CouponsEnabled',\r\n property: ['CampaignCashback/CouponsEnabled', 'BiddingScheme', 'BidStrategyName'],\r\n enableEdit: item => this.shouldEnableEdit(options.permissions, item),\r\n helpId: 'pop_BA_CampaignCreate_Settings_PP_Coupons',\r\n });\r\n }\r\n\r\n shouldEnableEdit(permissions, item) {\r\n return isPersonalizedOfferAvailable(\r\n permissions,\r\n item.CampaignType,\r\n item.CampaignSubType\r\n );\r\n }\r\n\r\n // Create the top panel view to edit the coupon with the Cashback offer, scope and budget\r\n onPrompt({ item }) {\r\n this.view.trigger('inlineEditCashbackSetting', item);\r\n }\r\n\r\n getCoupon(item) {\r\n if (isShowCoupon(item, this.permissions)) {\r\n return _.chain(item)\r\n .result('CampaignCashback')\r\n .result('CouponsEnabled')\r\n .value() || 'None';\r\n }\r\n return 'None';\r\n }\r\n}\r\n","var pug = require(\"!../../../../../node_modules/.pnpm/pug@2.0.4/node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;;var locals_for_with = (locals || {});(function (model) {if (model) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"cashback-budget-container\\\"\\u003E\\u003Cspan\\u003E\" + (pug.escape(null == (pug_interp = model.CashbackMonthlyBudget) ? \"\" : pug_interp)) + \"\\u002F\" + (pug.escape(null == (pug_interp = model.cashbackBudgetRange) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\npug_html = pug_html + (pug.escape(null == (pug_interp = '-') ? \"\" : pug_interp));\n}}.call(this,\"model\" in locals_for_with?locals_for_with.model:typeof model!==\"undefined\"?model:undefined));;return pug_html;};\nmodule.exports = template;","var pug = require(\"!../../../../../node_modules/.pnpm/pug@2.0.4/node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;;var locals_for_with = (locals || {});(function (model) {if (model) {\npug_html = pug_html + \"\\u003Cspan\\u003E\" + (pug.escape(null == (pug_interp = model.cashbackScope) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\";\n}\nelse {\npug_html = pug_html + (pug.escape(null == (pug_interp = '-') ? \"\" : pug_interp));\n}}.call(this,\"model\" in locals_for_with?locals_for_with.model:typeof model!==\"undefined\"?model:undefined));;return pug_html;};\nmodule.exports = template;","var pug = require(\"!../../../../../node_modules/.pnpm/pug@2.0.4/node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;;var locals_for_with = (locals || {});(function (model) {if (model) {\npug_html = pug_html + \"\\u003Cspan\\u003E\" + (pug.escape(null == (pug_interp = model.coupon) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\";\n}\nelse {\npug_html = pug_html + (pug.escape(null == (pug_interp = '-') ? \"\" : pug_interp));\n}}.call(this,\"model\" in locals_for_with?locals_for_with.model:typeof model!==\"undefined\"?model:undefined));;return pug_html;};\nmodule.exports = template;","var pug = require(\"!../../../../../../../node_modules/.pnpm/pug@2.0.4/node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;;var locals_for_with = (locals || {});(function (i18n) {\n\n\n\npug_mixins[\"koErrors\"] = pug_interp = function(id, cssClass){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\npug_html = pug_html + \"\\u003Cul\" + (pug.attr(\"class\", pug.classes([cssClass ? cssClass : 'alert alert-danger'], [true]), false, true)+\" data-bind=\\\"visible: errors().length > 0, foreach: errors, attr: {"aria-hidden": errors().length == 0}\\\"\"+pug.attr(\"id\", id ? id : 'KoErrors', true, true)+\" role=\\\"alert\\\"\") + \"\\u003E\\u003Cli data-bind=\\\"html: $data\\\"\\u003E\\u003C\\u002Fli\\u003E\\u003C\\u002Ful\\u003E\";\n};\npug_mixins[\"cashbackPercentInlineEditor\"] = pug_interp = function(warningMessage){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\npug_html = pug_html + \"\\u003Cdiv class=\\\"popover-edit-cashback-percent\\\"\\u003E\\u003Cdiv class=\\\"form-group cashback-percent-control-container\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\nif (!!warningMessage) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"alert alert-info\\\" role=\\\"alert\\\"\\u003E\\u003Cdiv class=\\\"alert-image\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"alert__content\\\"\\u003E\\u003Cspan class=\\\"alert__message\\\"\\u003E\" + (pug.escape(null == (pug_interp = warningMessage) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Cbutton class=\\\"save btn btn-primary inline-edit-save\\\" type=\\\"button\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Save')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"cancel btn btn-default inline-edit-cancel\\\" type=\\\"button\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Cancel')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\";\npug_mixins[\"koErrors\"]('KoErrors', 'error');\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\n};\npug_mixins[\"cashbackPercentInlineEditor\"](i18n.getString('InlineEdit_AdGroup_CashbackPercentMessage'));}.call(this,\"i18n\" in locals_for_with?locals_for_with.i18n:typeof i18n!==\"undefined\"?i18n:undefined));;return pug_html;};\nmodule.exports = template;","var pug = require(\"!../../../../../../../node_modules/.pnpm/pug@2.0.4/node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;;var locals_for_with = (locals || {});(function (i18n) {\n\n\n\npug_mixins[\"koErrors\"] = pug_interp = function(id, cssClass){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\npug_html = pug_html + \"\\u003Cul\" + (pug.attr(\"class\", pug.classes([cssClass ? cssClass : 'alert alert-danger'], [true]), false, true)+\" data-bind=\\\"visible: errors().length > 0, foreach: errors, attr: {"aria-hidden": errors().length == 0}\\\"\"+pug.attr(\"id\", id ? id : 'KoErrors', true, true)+\" role=\\\"alert\\\"\") + \"\\u003E\\u003Cli data-bind=\\\"html: $data\\\"\\u003E\\u003C\\u002Fli\\u003E\\u003C\\u002Ful\\u003E\";\n};\npug_mixins[\"cashbackPercentInlineEditor\"] = pug_interp = function(warningMessage){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\npug_html = pug_html + \"\\u003Cdiv class=\\\"popover-edit-cashback-percent\\\"\\u003E\\u003Cdiv class=\\\"form-group cashback-percent-control-container\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\nif (!!warningMessage) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"alert alert-info\\\" role=\\\"alert\\\"\\u003E\\u003Cdiv class=\\\"alert-image\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"alert__content\\\"\\u003E\\u003Cspan class=\\\"alert__message\\\"\\u003E\" + (pug.escape(null == (pug_interp = warningMessage) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Cbutton class=\\\"save btn btn-primary inline-edit-save\\\" type=\\\"button\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Save')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"cancel btn btn-default inline-edit-cancel\\\" type=\\\"button\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Cancel')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\";\npug_mixins[\"koErrors\"]('KoErrors', 'error');\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\n};\npug_mixins[\"cashbackPercentInlineEditor\"]();}.call(this,\"i18n\" in locals_for_with?locals_for_with.i18n:typeof i18n!==\"undefined\"?i18n:undefined));;return pug_html;};\nmodule.exports = template;","var pug = require(\"!../../../../../../../node_modules/.pnpm/pug@2.0.4/node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;;var locals_for_with = (locals || {});(function (i18n, noneScopeText, showProductScope) {pug_mixins[\"koErrors\"] = pug_interp = function(id, cssClass){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\npug_html = pug_html + \"\\u003Cul\" + (pug.attr(\"class\", pug.classes([cssClass ? cssClass : 'alert alert-danger'], [true]), false, true)+\" data-bind=\\\"visible: errors().length > 0, foreach: errors, attr: {"aria-hidden": errors().length == 0}\\\"\"+pug.attr(\"id\", id ? id : 'KoErrors', true, true)+\" role=\\\"alert\\\"\") + \"\\u003E\\u003Cli data-bind=\\\"html: $data\\\"\\u003E\\u003C\\u002Fli\\u003E\\u003C\\u002Ful\\u003E\";\n};\npug_html = pug_html + \"\\u003Cdiv class=\\\"popover-edit-scope\\\"\\u003E\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Cspan\\u003E\\u003Clabel\\u003E\\u003Cinput type=\\\"radio\\\" data-bind=\\\"value: "None", checked: Scope, name: formName\\\"\\u003E\" + (pug.escape(null == (pug_interp = noneScopeText) ? \"\" : pug_interp)) + \"\\u003C\\u002Flabel\\u003E\\u003Clabel\\u003E\\u003Cinput type=\\\"radio\\\" data-bind=\\\"value: "Store", checked: Scope, name: formName\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('ColumnField_CashbackScope_Store')) ? \"\" : pug_interp)) + \"\\u003C\\u002Flabel\\u003E\";\nif (showProductScope) {\npug_html = pug_html + \"\\u003Clabel\\u003E\\u003Cinput type=\\\"radio\\\" data-bind=\\\"value: "Product", checked: Scope, name: formName\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('ColumnField_CashbackScope_Product')) ? \"\" : pug_interp)) + \"\\u003C\\u002Flabel\\u003E\";\n}\npug_html = pug_html + \"\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Cbutton class=\\\"save btn btn-primary inline-edit-save\\\" type=\\\"button\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Save')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"cancel btn btn-default inline-edit-cancel\\\" type=\\\"button\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Cancel')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\";\npug_mixins[\"koErrors\"]('KoErrors', 'error');\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";}.call(this,\"i18n\" in locals_for_with?locals_for_with.i18n:typeof i18n!==\"undefined\"?i18n:undefined,\"noneScopeText\" in locals_for_with?locals_for_with.noneScopeText:typeof noneScopeText!==\"undefined\"?noneScopeText:undefined,\"showProductScope\" in locals_for_with?locals_for_with.showProductScope:typeof showProductScope!==\"undefined\"?showProductScope:undefined));;return pug_html;};\nmodule.exports = template;","var pug = require(\"!../../../../../../../node_modules/.pnpm/pug@2.0.4/node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;;var locals_for_with = (locals || {});(function (i18n, noneCouponText) {pug_mixins[\"koErrors\"] = pug_interp = function(id, cssClass){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\npug_html = pug_html + \"\\u003Cul\" + (pug.attr(\"class\", pug.classes([cssClass ? cssClass : 'alert alert-danger'], [true]), false, true)+\" data-bind=\\\"visible: errors().length > 0, foreach: errors, attr: {"aria-hidden": errors().length == 0}\\\"\"+pug.attr(\"id\", id ? id : 'KoErrors', true, true)+\" role=\\\"alert\\\"\") + \"\\u003E\\u003Cli data-bind=\\\"html: $data\\\"\\u003E\\u003C\\u002Fli\\u003E\\u003C\\u002Ful\\u003E\";\n};\npug_html = pug_html + \"\\u003Cdiv class=\\\"popover-edit-coupon\\\"\\u003E\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Cspan\\u003E\\u003Clabel\\u003E\\u003Cinput type=\\\"radio\\\" data-bind=\\\"value: "None", checked: CouponsEnabled, name: formName\\\"\\u003E\" + (pug.escape(null == (pug_interp = noneCouponText) ? \"\" : pug_interp)) + \"\\u003C\\u002Flabel\\u003E\\u003Clabel\\u003E\\u003Cinput type=\\\"radio\\\" data-bind=\\\"value: "Enabled", checked: CouponsEnabled, name: formName\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('ColumnField_Coupon_Enabled')) ? \"\" : pug_interp)) + \"\\u003C\\u002Flabel\\u003E\\u003Clabel\\u003E\\u003Cinput type=\\\"radio\\\" data-bind=\\\"value: "Disabled", checked: CouponsEnabled, name: formName\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('ColumnField_Coupon_Disabled')) ? \"\" : pug_interp)) + \"\\u003C\\u002Flabel\\u003E\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Cbutton class=\\\"save btn btn-primary inline-edit-save\\\" type=\\\"button\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Save')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"cancel btn btn-default inline-edit-cancel\\\" type=\\\"button\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Cancel')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\";\npug_mixins[\"koErrors\"]('KoErrors', 'error');\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";}.call(this,\"i18n\" in locals_for_with?locals_for_with.i18n:typeof i18n!==\"undefined\"?i18n:undefined,\"noneCouponText\" in locals_for_with?locals_for_with.noneCouponText:typeof noneCouponText!==\"undefined\"?noneCouponText:undefined));;return pug_html;};\nmodule.exports = template;","import { Metric } from '../utils/metric-formatter';\r\n\r\nexport const metrics: Metric[] = [\r\n 'Clicks',\r\n 'Impressions',\r\n 'Spend',\r\n 'CTR',\r\n 'TopImpressionRate',\r\n 'AbsoluteTopImpressionRate',\r\n 'ConversionsCredit',\r\n 'PartialConversionRate',\r\n 'PartialConversionCPA',\r\n 'AdvertiserReportedRevenue',\r\n 'RevenueOnAdSpend',\r\n 'AverageCPC',\r\n];\r\n","type Color = `#${string}`;\r\n\r\nexport const computerColor: Color = '#637CEF';\r\nexport const tabletColor: Color = '#E3008C';\r\nexport const mobileColor: Color = '#2AA0A4';\r\nexport const connectedTVColor: Color = '#9373C0';\r\n","export interface SegmentData {\r\n Key: { StringValue: string }[];\r\n Data: {\r\n Impressions: number;\r\n Clicks: number;\r\n CTR: number;\r\n Spend: number;\r\n TopImpressionRate: number;\r\n AbsoluteTopImpressionRate: number;\r\n ConversionsCredit: number;\r\n PartialConversionRate: number;\r\n PartialConversionCPA: number;\r\n AdvertiserReportedRevenue: number;\r\n RevenueOnAdSpend: number;\r\n AverageCPC: number;\r\n };\r\n}\r\n\r\ninterface MappedSegmentData {\r\n deviceType: string;\r\n Impressions: number;\r\n Clicks: number;\r\n CTR: number;\r\n Spend: number;\r\n TopImpressionRate: number;\r\n AbsoluteTopImpressionRate: number;\r\n ConversionsCredit: number;\r\n PartialConversionRate: number;\r\n PartialConversionCPA: number;\r\n AdvertiserReportedRevenue: number;\r\n RevenueOnAdSpend: number;\r\n AverageCPC: number;\r\n}\r\n\r\nexport const mapSegmentData = (segmentedData: SegmentData[]): MappedSegmentData[] =>\r\n segmentedData.map((segment) => {\r\n const deviceType = segment.Key[0].StringValue;\r\n const {\r\n Impressions,\r\n Clicks,\r\n CTR,\r\n Spend,\r\n TopImpressionRate,\r\n AbsoluteTopImpressionRate,\r\n ConversionsCredit,\r\n PartialConversionRate,\r\n PartialConversionCPA,\r\n AdvertiserReportedRevenue,\r\n RevenueOnAdSpend,\r\n AverageCPC,\r\n } = segment.Data;\r\n return {\r\n deviceType,\r\n Impressions,\r\n Clicks,\r\n CTR,\r\n Spend,\r\n TopImpressionRate,\r\n AbsoluteTopImpressionRate,\r\n ConversionsCredit,\r\n PartialConversionRate,\r\n PartialConversionCPA,\r\n AdvertiserReportedRevenue,\r\n RevenueOnAdSpend,\r\n AverageCPC,\r\n };\r\n });\r\n","import React from 'react';\r\n\r\ninterface LegendIconProps {\r\n color: string;\r\n useGradient?: boolean;\r\n}\r\n\r\nexport const LegendIcon: React.FC = ({ color, useGradient }) => {\r\n const boxStyle: React.CSSProperties = {\r\n width: '10px',\r\n height: '10px',\r\n ...(useGradient\r\n ? { backgroundImage: `linear-gradient(90deg, ${color} 50%, white 50%)` }\r\n : { backgroundColor: color }),\r\n backgroundSize: '4px 4px',\r\n };\r\n\r\n return
;\r\n};\r\n\r\nLegendIcon.defaultProps = {\r\n useGradient: false,\r\n};\r\n","import React from 'react';\r\nimport classNames from 'classnames';\r\nimport { LegendIcon } from '../utils/callout-legend-icon';\r\nimport { DeviceCardProps } from '../utils/types';\r\n\r\nexport const renderCustomCallout = (data: any, styles: any, dateRange: DeviceCardProps['dateRange'], i18n: DeviceCardProps['i18n']) => {\r\n if (!data) {\r\n return null;\r\n }\r\n\r\n const {\r\n legend, legendColor, metricValue, total, displayName,\r\n } = data;\r\n\r\n return (\r\n
\r\n
{i18n.getString(legend)}
\r\n
{displayName}
\r\n
\r\n \r\n \r\n {dateRange.RangeStartDate} - {dateRange.RangeEndDate}\r\n \r\n
\r\n
{metricValue} ({total}{i18n.getString(_TL_('% of total'))})
\r\n
\r\n );\r\n};\r\n","export const dropdownCustomStyles = () => ({\r\n root: {\r\n width: 'auto',\r\n border: 'none',\r\n padding: 0,\r\n margin: 0,\r\n },\r\n dropdown: {\r\n border: 'none',\r\n boxShadow: 'none',\r\n outline: 'none',\r\n padding: 2,\r\n margin: 2,\r\n minWidth: '150px',\r\n selectors: {\r\n ':focus': {\r\n outline: 'none',\r\n },\r\n ':focus:after': {\r\n border: 'none',\r\n outline: 'none',\r\n },\r\n },\r\n },\r\n title: {\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n paddingTop: 0,\r\n height: 'auto',\r\n lineHeight: 'normal',\r\n display: 'flex',\r\n alignItems: 'center',\r\n margin: 0,\r\n selectors: {\r\n ':focus': {\r\n outline: 'none',\r\n border: 'none',\r\n boxShadow: 'none',\r\n },\r\n ':focus-visible': {\r\n outline: 'none',\r\n border: 'none',\r\n boxShadow: 'none',\r\n },\r\n },\r\n },\r\n caretDown: {\r\n fontSize: 12,\r\n marginLeft: 4,\r\n display: 'flex',\r\n alignItems: 'center',\r\n border: 'none',\r\n boxShadow: 'none',\r\n outline: 'none',\r\n },\r\n caretDownWrapper: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n height: '100%',\r\n },\r\n dropdownItem: {\r\n padding: '4px 8px',\r\n margin: 0,\r\n },\r\n});\r\n","const deviceDefaultCard = footerVisible => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '100%',\r\n flexGrow: 1,\r\n paddingTop: footerVisible ? '5px' : '10px',\r\n});\r\n\r\nconst dropdownDefaultCard = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n};\r\n\r\nconst multiStackedChart = footerVisible => ({\r\n paddingBottom: footerVisible ? '0px' : '13px',\r\n});\r\n\r\nconst customCallout = {\r\n padding: '15px',\r\n width: '200px',\r\n lineHeight: '1.8',\r\n};\r\n\r\nconst date = {\r\n marginLeft: '8px',\r\n};\r\n\r\nconst legendIcon = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n marginBottom: '8px',\r\n};\r\n\r\nexport const getStyles = footerVisible => ({\r\n deviceDefaultCard: deviceDefaultCard(footerVisible),\r\n dropdownDefaultCard,\r\n multiStackedChart: multiStackedChart(footerVisible),\r\n customCallout,\r\n legendIcon,\r\n date,\r\n});\r\n","import React, { useCallback, useMemo, useState } from 'react';\r\nimport classNames from 'classnames';\r\nimport { Dropdown, TooltipHost } from '@fluentui/react';\r\nimport { Glyphicon } from '@bingads-webui-react/primitive-unthemed';\r\nimport { MultiStackedBarChart } from '@fluentui/react-charting';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { formatMetric } from '@bingads-webui-campaign-legacy/performance-metric-formatter/index';\r\nimport { metrics } from '../constants/metrics-data';\r\nimport { Metric } from '../utils/metric-formatter';\r\nimport { computerColor, tabletColor, mobileColor, connectedTVColor } from '../constants/device-color';\r\nimport { mapSegmentData } from '../utils/metric-mapper';\r\nimport { DeviceCardProps } from '../utils/types';\r\nimport { renderCustomCallout } from '../helpers/default-card-custom-callout';\r\nimport { dropdownCustomStyles } from '../styles/dropdown-styles';\r\nimport { getStyles } from '../styles/devices-default-card';\r\n\r\nexport function DeviceDefaultCard({\r\n i18n, deviceData, dateRange, allMetrics, initialSelectedMetrics, patchPreference, hideCurrency, footerVisible,\r\n}: DeviceCardProps) {\r\n const chartPoints = useMemo(() => {\r\n const chartPointsTemplate = (metric, dateRange, total) => ({\r\n chartData: [\r\n {\r\n legend: _TL_('Computer'), data: 0, color: computerColor, legendColor: computerColor, metric, dateRange, total, metricValue: '0', callOutAccessibilityData: { ariaLabel: 'Computer' }, displayName: allMetrics.find(m => m.key === metric)?.displayName || metric,\r\n },\r\n {\r\n legend: _TL_('Tablet'), data: 0, color: tabletColor, legendColor: tabletColor, metric, dateRange, total, metricValue: '0', callOutAccessibilityData: { ariaLabel: 'Tablet' }, displayName: allMetrics.find(m => m.key === metric)?.displayName || metric,\r\n },\r\n {\r\n legend: _TL_('Smartphone'), data: 0, color: mobileColor, legendColor: mobileColor, metric, dateRange, total, metricValue: '0', callOutAccessibilityData: { ariaLabel: 'Smartphone' }, displayName: allMetrics.find(m => m.key === metric)?.displayName || metric,\r\n },\r\n {\r\n legend: _TL_('CTV'), data: 0, color: connectedTVColor, legendColor: connectedTVColor, metric, dateRange, total, metricValue: '0', callOutAccessibilityData: { ariaLabel: 'ConnectedTV' }, displayName: allMetrics.find(m => m.key === metric)?.displayName || metric,\r\n },\r\n ],\r\n });\r\n\r\n return metrics.reduce((metricChartPointsMap, metric) => ({\r\n ...metricChartPointsMap,\r\n [metric]: [chartPointsTemplate(metric, dateRange, 0)],\r\n }), {});\r\n }, [dateRange, allMetrics]);\r\n\r\n const data = useMemo(() => {\r\n // where deviceData is an array\r\n if (Array.isArray(deviceData)) {\r\n return deviceData.flatMap(item =>\r\n // For each device in the array, check if it has `SegmentedData` within `PerformanceMetrics`.\r\n (item.PerformanceMetrics?.SegmentedData ? mapSegmentData(item.PerformanceMetrics.SegmentedData) : []));\r\n\r\n // deviceData contains a `DeviceSegmentedPerformanceData` object with `PerformanceMetrics`.\r\n } else if (deviceData?.DeviceSegmentedPerformanceData?.PerformanceMetrics?.SegmentedData) {\r\n return mapSegmentData(deviceData.DeviceSegmentedPerformanceData.PerformanceMetrics.SegmentedData);\r\n\r\n // deviceData has `PerformanceMetrics` directly without segmented data.\r\n } else if (deviceData?.PerformanceMetrics) {\r\n return mapSegmentData(deviceData.PerformanceMetrics.SegmentedData || []);\r\n }\r\n\r\n return [];\r\n }, [deviceData]);\r\n\r\n const deviceTypeMap = useMemo(() => data.reduce((deviceMetricsMap, item) => {\r\n const deviceType = item.deviceType || '';\r\n return {\r\n ...deviceMetricsMap,\r\n [deviceType.toLowerCase()]: item,\r\n };\r\n }, {} as Record), [data]);\r\n\r\n const overallTotals = useMemo(() => {\r\n if (Array.isArray(deviceData) && deviceData.length > 0) {\r\n return deviceData[0]?.PerformanceMetrics || {};\r\n } else if (deviceData?.PerformanceMetrics) {\r\n return deviceData.PerformanceMetrics;\r\n }\r\n return deviceData?.OverallTotals?.PerformanceMetrics || {};\r\n }, [deviceData]);\r\n\r\n const updatedChartPoints = useMemo(() => {\r\n const updatedPoints = { ...chartPoints };\r\n\r\n Object.keys(updatedPoints).forEach((metric) => {\r\n const typedMetric = metric as Metric;\r\n\r\n updatedPoints[typedMetric][0].chartData = updatedPoints[typedMetric][0].chartData.map((chartData) => {\r\n const deviceMetrics = deviceTypeMap[chartData.legend.toLowerCase()];\r\n\r\n const value = deviceMetrics && deviceMetrics[typedMetric] !== null && deviceMetrics[typedMetric] !== undefined\r\n ? deviceMetrics[typedMetric]\r\n : 0;\r\n const overallValue = overallTotals[typedMetric] !== null && overallTotals[typedMetric] !== undefined\r\n ? overallTotals[typedMetric]\r\n : 1;\r\n\r\n const total = (overallValue === 0) ? 0 : ((value / overallValue) * 100).toFixed(2);\r\n\r\n return {\r\n ...chartData,\r\n data: value,\r\n total,\r\n metricValue: formatMetric(typedMetric, value),\r\n };\r\n });\r\n });\r\n\r\n return updatedPoints;\r\n }, [chartPoints, deviceTypeMap, overallTotals]);\r\n\r\n const [selectedViews, setSelectedViews] = useState(initialSelectedMetrics.map(metric => metric.key));\r\n\r\n const dropdownOptions = useMemo(\r\n () =>\r\n selectedViews.map((_, index) => {\r\n const remainingMetrics = allMetrics.filter(metric => !selectedViews.includes(metric.key) || metric.key === selectedViews[index]);\r\n return {\r\n key: selectedViews[index],\r\n text: remainingMetrics.find(m => m.key === selectedViews[index])?.displayName || '',\r\n options: remainingMetrics.map(metric => ({\r\n key: metric.key,\r\n text: metric.displayName,\r\n })),\r\n };\r\n }),\r\n [selectedViews, allMetrics]\r\n );\r\n const styles = useDefaultStyles(() => getStyles(footerVisible));\r\n\r\n const dataViews = selectedViews.map(view => updatedChartPoints[view]);\r\n\r\n const handleViewChange = useCallback(index => (event, option) => {\r\n setSelectedViews((prevSelectedViews) => {\r\n const newViews = [...prevSelectedViews];\r\n newViews[index] = option.key;\r\n patchPreference({ selectedColumns: newViews });\r\n return newViews;\r\n });\r\n }, [patchPreference]);\r\n\r\n return (\r\n
\r\n {dropdownOptions.map((option, index) => (\r\n \r\n
\r\n \r\n {hideCurrency && (selectedViews[index] === 'AverageCPC' || selectedViews[index] === 'Spend' || selectedViews[index] === 'PartialConversionCPA' || selectedViews[index] === 'AdvertiserReportedRevenue') && (\r\n \r\n \r\n \r\n )}\r\n
\r\n
\r\n renderCustomCallout(data, styles, dateRange, i18n)}\r\n />\r\n
\r\n
\r\n ))}\r\n
\r\n );\r\n}\r\n","const chartStyles = {\r\n '& [class^=\"chartTitle-\"]': {\r\n display: 'none',\r\n },\r\n '& div[class*=\"singleChartRoot\"]': {\r\n margin: '0',\r\n padding: '0',\r\n },\r\n '& .ms-StackedBarChart': {\r\n gap: '0',\r\n },\r\n};\r\n\r\nconst deviceComparisonCard = footerVisible => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '100%',\r\n flexGrow: 1,\r\n paddingTop: footerVisible ? '5px' : '10px',\r\n});\r\n\r\nconst dropdownComparisonCard = footerVisible => ({\r\n display: 'flex',\r\n alignItems: 'center',\r\n paddingTop: footerVisible ? '0px' : '10px',\r\n});\r\n\r\nconst gridContainerStyle = {\r\n display: 'grid',\r\n gridTemplateColumns: '1fr auto 1fr',\r\n gridTemplateRows: 'auto auto',\r\n gap: '5px',\r\n alignItems: 'center',\r\n};\r\n\r\nconst dataItem = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n};\r\n\r\nconst separator = {\r\n borderLeft: '1px solid #ccc',\r\n height: '135%',\r\n paddingRight: 10,\r\n};\r\n\r\nconst customCallout = {\r\n padding: '15px',\r\n width: '400px',\r\n lineHeight: '1.8',\r\n};\r\n\r\nconst multiStackedBarChart = {\r\n margin: 0,\r\n padding: 0,\r\n height: '42px',\r\n};\r\n\r\nconst comparisonCardPattern = {\r\n position: 'absolute',\r\n left: 0,\r\n top: 0,\r\n overflow: 'hidden',\r\n width: '10px',\r\n height: '10px',\r\n};\r\n\r\nconst legend = {\r\n paddingLeft: '4px',\r\n};\r\n\r\nconst leftGrid = {\r\n gridColumn: '1 / 2',\r\n};\r\n\r\nconst rightGrid = {\r\n gridColumn: '3 / 4',\r\n};\r\n\r\nexport const getStyles = footerVisible => ({\r\n deviceComparisonCard,\r\n dropdownComparisonCard: dropdownComparisonCard(footerVisible),\r\n gridContainerStyle,\r\n legend,\r\n leftGrid,\r\n rightGrid,\r\n dataItem,\r\n separator,\r\n customCallout,\r\n comparisonCardPattern,\r\n multiStackedBarChart: { ...multiStackedBarChart, ...chartStyles },\r\n});\r\n","import React from 'react';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { computerColor, tabletColor, mobileColor, connectedTVColor } from '../constants/device-color';\r\nimport { getStyles } from '../styles/devices-comparison-card';\r\n\r\nconst patterns = [\r\n { id: 'pattern1', color: computerColor, path: 'M 3 0 L 3 10' },\r\n { id: 'pattern2', color: tabletColor, path: 'M 3 0 L 3 10' },\r\n { id: 'pattern3', color: mobileColor, path: 'M 3 0 L 3 10' },\r\n { id: 'pattern4', color: connectedTVColor, path: 'M 3 0 L 3 10' },\r\n];\r\n\r\nexport const DeviceComparisonPatterns: React.FC = () => {\r\n const styles = useDefaultStyles(getStyles);\r\n\r\n return (\r\n \r\n \r\n {patterns.map(pattern => (\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n );\r\n};\r\n","export const legendKeyMap = {\r\n SmartPhone: 'Smartphone',\r\n};\r\n","import _ from 'underscore';\r\nimport { mapSegmentData } from './metric-mapper';\r\n\r\nexport const getSegmentedData = (data, keyPath) => {\r\n if (keyPath.length === 0) return [];\r\n\r\n if (Array.isArray(data)) {\r\n return _.flatten(data.map((item) => {\r\n const segmentedData = _.get(item, keyPath);\r\n return segmentedData ? mapSegmentData(segmentedData) : [];\r\n }));\r\n }\r\n\r\n let segmentedData = _.get(data, keyPath);\r\n\r\n if (!segmentedData && data?.DeviceSegmentedPerformanceData) {\r\n segmentedData = _.get(data.DeviceSegmentedPerformanceData, keyPath);\r\n }\r\n\r\n return segmentedData ? mapSegmentData(segmentedData) : [];\r\n};\r\n","export const extractNumericValue = (value) => {\r\n const symbolRegex = /[^\\d.-]/g;\r\n if (typeof value === 'string') {\r\n const sanitizedValue = value.replace(symbolRegex, '');\r\n return parseFloat(sanitizedValue);\r\n }\r\n return Number(value);\r\n};\r\n","import { extractNumericValue } from './numeric-value-extractor';\r\n\r\nexport function calculatePercentageOfTotal(metricValue: string | undefined, totalMetric: number): string {\r\n if (totalMetric > 0) {\r\n const numericValue = extractNumericValue(metricValue ?? '0');\r\n return ((numericValue / totalMetric) * 100).toFixed(2);\r\n }\r\n return '0.00';\r\n}\r\n","import React, { useCallback, useState, useMemo } from 'react';\r\nimport classNames from 'classnames';\r\nimport { MultiStackedBarChart, IChartProps } from '@fluentui/react-charting';\r\nimport { TooltipHost } from '@fluentui/react';\r\nimport { Glyphicon } from '@bingads-webui-react/primitive-unthemed';\r\nimport { Dropdown } from '@fluentui/react/lib/Dropdown';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { formatMetric, formatMetricWithSign, formatChangePercentageWithSign } from '@bingads-webui-campaign-legacy/performance-metric-formatter/index';\r\nimport { computerColor, tabletColor, mobileColor, connectedTVColor } from '../constants/device-color';\r\nimport { DeviceComparisonPatterns } from '../helpers/svg-pattern-comparison-state';\r\nimport { legendKeyMap } from '../utils/legend-key-map';\r\nimport { DeviceCardProps } from '../utils/types';\r\nimport { getSegmentedData } from '../utils/segment-data-extractor';\r\nimport { LegendIcon } from '../utils/callout-legend-icon';\r\nimport { Metric } from '../utils/metric-formatter';\r\nimport { calculatePercentageOfTotal } from '../utils/total-percentage-calculator';\r\nimport { metrics } from '../constants/metrics-data';\r\nimport { dropdownCustomStyles } from '../styles/dropdown-styles';\r\nimport { getStyles } from '../styles/devices-comparison-card';\r\n\r\nexport function DeviceComparisonCard({\r\n i18n, deviceData, dateRange, allMetrics, initialSelectedMetrics, patchPreference, hideCurrency, footerVisible,\r\n}: DeviceCardProps) {\r\n const currentComparisonData = useMemo(() => getSegmentedData(deviceData, ['PerformanceMetrics', 'SegmentedData']), [deviceData]);\r\n\r\n const previousComparisonData = useMemo(() => getSegmentedData(deviceData, ['PeriodPerformanceMetrics', 'SegmentedData']), [deviceData]);\r\n\r\n const changeData = useMemo(() => {\r\n if (!currentComparisonData.length || !previousComparisonData.length) return [];\r\n\r\n const previousDataMap = previousComparisonData.reduce((acc, item) => {\r\n const deviceIdentifier = item.deviceType || 'defaultDevice';\r\n acc[deviceIdentifier] = item;\r\n return acc;\r\n }, {});\r\n\r\n return currentComparisonData.map((current) => {\r\n const deviceIdentifier = current.deviceType || 'defaultDevice';\r\n\r\n const previous = previousDataMap[deviceIdentifier] || {};\r\n\r\n return Object.keys(current).reduce((acc, key) => {\r\n acc[key] =\r\n typeof current[key] === 'number' && typeof previous[key] === 'number'\r\n ? current[key] - previous[key]\r\n : current[key];\r\n\r\n return acc;\r\n }, { deviceIdentifier });\r\n });\r\n }, [currentComparisonData, previousComparisonData]);\r\n\r\n const changeDataPercentage = useMemo(() => getSegmentedData(deviceData, ['PerformanceMetricsChangePercentage', 'SegmentedData']), [deviceData]);\r\n const currentDateRange = dateRange ? `${dateRange.RangeStartDate} - ${dateRange.RangeEndDate}` : '';\r\n const previousDateRange = dateRange && dateRange.compared ? `${dateRange.compared.formattedStart} - ${dateRange.compared.formattedEnd}` : '';\r\n\r\n const currentPeriodTotals = deviceData?.OverallTotals?.PerformanceMetrics || deviceData?.PerformanceMetrics;\r\n const previousPeriodTotals = deviceData?.OverallTotals?.PeriodPerformanceMetrics || deviceData?.PeriodPerformanceMetrics;\r\n const styles = useDefaultStyles(() => getStyles(footerVisible));\r\n\r\n const createChartSeriesData = useCallback(\r\n (deviceMetrics, metric, dateRange, isPattern = false) => {\r\n /**\r\n * Maps device types to their respective colors or patterns.\r\n * This mapping is used to set the colors or patterns for chart bars based on current or previous date range.\r\n *\r\n * @param isPattern - A boolean indicating whether to use a pattern (true) or solid color (false).\r\n * @returns An object where each device type is associated with either a pattern URL or a solid color.\r\n */\r\n const colorMap = {\r\n Computer: isPattern ? 'url(#pattern1)' : computerColor,\r\n Tablet: isPattern ? 'url(#pattern2)' : tabletColor,\r\n SmartPhone: isPattern ? 'url(#pattern3)' : mobileColor,\r\n ConnectedTV: isPattern ? 'url(#pattern4)' : connectedTVColor,\r\n };\r\n\r\n const validDevices = ['Computer', 'Tablet', 'SmartPhone', 'ConnectedTV'];\r\n\r\n return validDevices\r\n .filter(deviceType => deviceMetrics[deviceType])\r\n .map((deviceType) => {\r\n const value = deviceMetrics[deviceType][metric];\r\n const formattedValue = formatMetric(metric, value);\r\n\r\n return {\r\n legend: deviceType,\r\n data: value,\r\n color: colorMap[deviceType],\r\n legendColor: colorMap[deviceType],\r\n metric,\r\n dateRange,\r\n metricValue: formattedValue,\r\n };\r\n });\r\n },\r\n []\r\n );\r\n\r\n const prepareDeviceData = useCallback(\r\n comparisonData => comparisonData.reduce((deviceDataAccumulator, { deviceType, ...metrics }) => ({\r\n ...deviceDataAccumulator, [deviceType]: metrics,\r\n }), {}),\r\n []\r\n );\r\n\r\n const createChartPoints = useCallback(\r\n (metric: Metric): IChartProps[] => {\r\n const currentDeviceData = prepareDeviceData(currentComparisonData);\r\n const previousDeviceData = prepareDeviceData(previousComparisonData);\r\n\r\n return [\r\n {\r\n chartTitle: '',\r\n chartData: createChartSeriesData(currentDeviceData, metric, currentDateRange),\r\n },\r\n {\r\n chartTitle: '',\r\n chartData: createChartSeriesData(previousDeviceData, metric, previousDateRange, true),\r\n },\r\n ];\r\n },\r\n [prepareDeviceData, currentComparisonData, previousComparisonData, createChartSeriesData, currentDateRange, previousDateRange]\r\n );\r\n\r\n const chartPoints: Record = useMemo(\r\n () =>\r\n metrics.reduce((accumulator, metric) => ({\r\n ...accumulator,\r\n [metric]: createChartPoints(metric),\r\n }), {} as Record),\r\n [createChartPoints]\r\n );\r\n\r\n const getCombinedDataPoints = useCallback((data) => {\r\n const combined = {};\r\n\r\n if (Array.isArray(data)) {\r\n data.forEach((entry) => {\r\n if (entry.chartData) {\r\n entry.chartData.forEach((dataPoint) => {\r\n const { legend } = dataPoint;\r\n if (!combined[legend]) {\r\n combined[legend] = [];\r\n }\r\n combined[legend].push(dataPoint);\r\n });\r\n }\r\n });\r\n }\r\n\r\n return combined;\r\n }, []);\r\n\r\n const calloutStyles = useMemo(() => ({\r\n customCallout: styles.customCallout,\r\n dataItem: styles.dataItem,\r\n gridContainerStyle: styles.gridContainerStyle,\r\n separator: styles.separator,\r\n leftGrid: styles.leftGrid,\r\n rightGrid: styles.rightGrid,\r\n legend: styles.legend,\r\n }), [styles]);\r\n\r\n const renderCustomCallout = useCallback((point, combinedData) => {\r\n if (!point || !point.legend) return null;\r\n\r\n // Map legend to its updated version if needed\r\n const mappedLegend = legendKeyMap[point.legend] || point.legend;\r\n\r\n const changeDataEntry = changeData.find(entry => entry.deviceIdentifier === point.legend);\r\n const change = changeDataEntry ? changeDataEntry[point.metric] : null;\r\n let roundedValue: number = 0;\r\n\r\n if (change !== null) {\r\n const numericChange = Number(change);\r\n if (Number.isFinite(numericChange)) {\r\n roundedValue = numericChange;\r\n }\r\n }\r\n\r\n const changeDataPercentageEntry = changeDataPercentage.find(entry => entry.deviceType === point.legend);\r\n const changePercentage = changeDataPercentageEntry?.[point.metric] ?? null;\r\n let roundedValuePercentage = '0.00%';\r\n\r\n if (changePercentage !== null) {\r\n const numericChangePercentage = Number(changePercentage);\r\n\r\n if (Number.isFinite(numericChangePercentage)) {\r\n if (numericChangePercentage === 0) {\r\n roundedValuePercentage = '0.00%';\r\n } else if (numericChangePercentage > 1e10) {\r\n roundedValuePercentage = '+∞';\r\n } else if (numericChangePercentage < -1e10) {\r\n roundedValuePercentage = '-∞';\r\n } else {\r\n roundedValuePercentage = formatChangePercentageWithSign(numericChangePercentage);\r\n }\r\n }\r\n }\r\n\r\n const legendData = Array.isArray(combinedData[point.legend])\r\n ? combinedData[point.legend]\r\n : [combinedData[point.legend]];\r\n\r\n const metricDisplayName = allMetrics.find(metric => metric.key === point.metric)?.displayName || point.metric;\r\n\r\n const metricsToHidePercentage = new Set([\r\n 'CTR',\r\n 'Top impr. rate',\r\n 'Abs. top impr. rate',\r\n 'Conv. rate',\r\n 'Return on ad spend',\r\n ]);\r\n const hidePercentageOfTotal = metricsToHidePercentage.has(metricDisplayName);\r\n\r\n const metricValue = legendData[0]?.metricValue || '0';\r\n const totalMetric = currentPeriodTotals?.[point.metric] ?? 0;\r\n\r\n const currentPercentageOfTotalMetric = calculatePercentageOfTotal(metricValue, totalMetric);\r\n\r\n const previousMetricValue = legendData[1]?.metricValue ?? '0';\r\n const previousTotalMetric = previousPeriodTotals?.[point.metric] ?? 1;\r\n\r\n const previousPercentageOfTotalMetric = calculatePercentageOfTotal(previousMetricValue, previousTotalMetric);\r\n const renderMetricValue = (metricValue, percentageMetricKey, percentageMetricValue) => (\r\n \r\n {metricValue}\r\n {!hidePercentageOfTotal &&\r\n i18n.getString(_TL_(' ({{percentage}}% of total)'), {\r\n percentage: percentageMetricValue,\r\n })\r\n }\r\n \r\n );\r\n\r\n const changeValue = formatMetricWithSign(allMetrics.find(metric => metric.key === point.metric).key, roundedValue);\r\n\r\n return (\r\n
\r\n {legendData.length > 0 && (\r\n <>\r\n
{i18n.getString(mappedLegend)}
\r\n
{metricDisplayName}
\r\n
\r\n
\r\n {legendData[0] && (\r\n <>\r\n
\r\n \r\n
\r\n
{legendData[0].dateRange}
\r\n \r\n )}\r\n
\r\n
\r\n
\r\n {legendData[1] && (\r\n <>\r\n
\r\n \r\n
\r\n
{legendData[1].dateRange}
\r\n \r\n )}\r\n
\r\n
\r\n {renderMetricValue(legendData[0]?.metricValue, 'currentPercentageOfTotalMetric', currentPercentageOfTotalMetric)}\r\n
\r\n
\r\n
\r\n {renderMetricValue(legendData[1]?.metricValue, 'previousPercentageOfTotalMetric', previousPercentageOfTotalMetric)}\r\n
\r\n
\r\n
\r\n {\r\n i18n.getString(_TL_('Change: {{changeValue}} ({{roundedValuePercentage}})'), {\r\n changeValue,\r\n roundedValuePercentage,\r\n })\r\n }\r\n
\r\n \r\n )}\r\n
\r\n );\r\n }, [changeData, changeDataPercentage, currentPeriodTotals, previousPeriodTotals, allMetrics, calloutStyles, styles.legend, i18n]);\r\n\r\n const [selectedViews, setSelectedViews] = useState(initialSelectedMetrics.map(metric => ({\r\n id: metric.key,\r\n selectedKey: metric.key,\r\n })));\r\n\r\n const dropdownOptions = useMemo(\r\n () =>\r\n selectedViews.map((view, index) => {\r\n const currentMetric = allMetrics.find(metric => metric.key === view.selectedKey);\r\n const selectedKeys = selectedViews.map(v => v.selectedKey);\r\n\r\n const options = [\r\n { key: currentMetric?.key, text: currentMetric?.displayName },\r\n ...allMetrics\r\n .filter(metric => metric.key !== view.selectedKey && !selectedKeys.includes(metric.key))\r\n .map(metric => ({\r\n key: metric.key,\r\n text: metric.displayName,\r\n })),\r\n ];\r\n return options;\r\n }),\r\n [selectedViews, allMetrics]\r\n );\r\n\r\n const handleDropdownChange = useCallback(\r\n (id, option) => {\r\n const newSelectedViews = selectedViews.map(view => (view.id === id ? { ...view, selectedKey: option.key } : view));\r\n setSelectedViews(newSelectedViews);\r\n patchPreference({ selectedColumns: newSelectedViews.map(view => view.selectedKey) });\r\n },\r\n [patchPreference, selectedViews]\r\n );\r\n\r\n return (\r\n
\r\n {selectedViews.map((view, index) => (\r\n
\r\n
\r\n handleDropdownChange(view.id, option)}\r\n selectedKey={view.selectedKey}\r\n styles={dropdownCustomStyles}\r\n aria-label={i18n.getString(_TL_('Select an option from the dropdown'))}\r\n />\r\n {hideCurrency && (view.selectedKey === 'AverageCPC' || view.selectedKey === 'Spend' || view.selectedKey === 'PartialConversionCPA' || view.selectedKey === 'AdvertiserReportedRevenue') && (\r\n \r\n \r\n \r\n )}\r\n
\r\n \r\n
\r\n
\r\n renderCustomCallout(props, getCombinedDataPoints(chartPoints[view.selectedKey]))}\r\n />\r\n
\r\n
\r\n
\r\n ))}\r\n
\r\n );\r\n}\r\n","import { ShimmerElementType } from '@fluentui/react';\r\n\r\nexport const headerElement = [\r\n { type: ShimmerElementType.line, height: 20, width: '15%' },\r\n { type: ShimmerElementType.gap, width: '85%' },\r\n];\r\n\r\nexport const buttonRowElement = [\r\n { type: ShimmerElementType.line, height: 20, width: '10%' },\r\n { type: ShimmerElementType.gap, width: '5%' },\r\n { type: ShimmerElementType.line, height: 20, width: '10%' },\r\n { type: ShimmerElementType.gap, width: '5%' },\r\n { type: ShimmerElementType.line, height: 20, width: '10%' },\r\n { type: ShimmerElementType.gap, width: '5%' },\r\n { type: ShimmerElementType.line, height: 20, width: '10%' },\r\n { type: ShimmerElementType.gap, width: '60%' },\r\n];\r\n\r\nexport const largeBlockElement = [\r\n { type: ShimmerElementType.line, height: 60, width: '100%' },\r\n];\r\n\r\nexport const footerElement = [\r\n { type: ShimmerElementType.line, height: 20, width: '10%' },\r\n { type: ShimmerElementType.gap, width: '90%' },\r\n];\r\n","const shimmerContainer = {\r\n padding: 10,\r\n};\r\n\r\nconst shimmerElement = {\r\n marginBottom: 10,\r\n};\r\n\r\nconst footerElement = {\r\n marginTop: 20,\r\n};\r\n\r\nexport const getStyles = () => ({\r\n shimmerContainer,\r\n shimmerElement,\r\n footerElement,\r\n});\r\n","import React from 'react';\r\nimport classNames from 'classnames';\r\nimport { Shimmer } from '@fluentui/react';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { headerElement, buttonRowElement, largeBlockElement, footerElement } from '../helpers/shimmer-element';\r\nimport { getStyles } from '../styles/shimmer-card';\r\n\r\n\r\nexport function ShimmerCard() {\r\n const styles = useDefaultStyles(getStyles);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport const ComputerIcon = ({ color }) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\n\r\nexport const TabletIcon = ({ color }) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\n\r\nexport const MobileIcon = ({ color }) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\n\r\nexport const ConnectedTVIcon = ({ color }) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n);\r\n","const container = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '100%',\r\n};\r\n\r\nconst chartContainer = {\r\n flexGrow: 1,\r\n minHeight: 0,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n};\r\n\r\nconst deviceLegend = {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n flexDirection: 'row',\r\n columnGap: '20px',\r\n};\r\n\r\nconst title = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n cursor: 'pointer',\r\n};\r\n\r\nconst icon = {\r\n paddingTop: 3,\r\n};\r\n\r\nconst footer = {\r\n marginTop: 'auto',\r\n};\r\n\r\nexport const getStyles = () => ({\r\n container,\r\n chartContainer,\r\n deviceLegend,\r\n title,\r\n icon,\r\n footer,\r\n});\r\n","import React from 'react';\r\nimport classNames from 'classnames';\r\nimport { initializeIcons } from '@fluentui/react';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { computerColor, tabletColor, mobileColor, connectedTVColor } from '../constants/device-color';\r\nimport { ComputerIcon } from '../media/computer-icon-svg';\r\nimport { TabletIcon } from '../media/tablet-icon-svg';\r\nimport { MobileIcon } from '../media/mobile-icon-svg';\r\nimport { ConnectedTVIcon } from '../media/connectedTV-icon-svg';\r\nimport { getStyles } from '../styles/devices-card';\r\n\r\ninitializeIcons();\r\ninterface LegendProps {\r\n i18n: {\r\n getString: (key: string) => string;\r\n };\r\n}\r\ninterface LegendItem {\r\n title: string;\r\n color: string;\r\n icon: any;\r\n}\r\nexport const Legend: React.FC = ({ i18n }) => {\r\n const styles = useDefaultStyles(getStyles);\r\n const legends: LegendItem[] = [\r\n { title: i18n.getString(_TL_('Computer')), color: computerColor, icon: },\r\n { title: i18n.getString(_TL_('Tablet')), color: tabletColor, icon: },\r\n { title: i18n.getString(_TL_('Smartphone')), color: mobileColor, icon: },\r\n { title: i18n.getString(_TL_('CTV')), color: connectedTVColor, icon: },\r\n ];\r\n const renderLegend = () => (\r\n
\r\n {legends.map((legend, index) => (\r\n \r\n
{legend.icon}
\r\n {legend.title}\r\n
\r\n ))}\r\n
\r\n );\r\n return renderLegend();\r\n};\r\n","import React, { useCallback, useContext, useState, useEffect } from 'react';\r\nimport classNames from 'classnames';\r\nimport { ScopeContext } from '@bingads-webui-react/scope-service';\r\nimport { Button } from '@fluentui/react-components';\r\nimport { getUIMetrics } from '@bingads-webui-campaign/overview-cards-common';\r\nimport { cardDeviceId } from '@bingads-webui-campaign/fluent-page-consts';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { getNavigationLevel } from '@bingads-webui-campaign/fluent-page-data';\r\nimport { DeviceDefaultCard } from './devices-default-card';\r\nimport { DeviceComparisonCard } from './devices-comparison-card';\r\nimport { ShimmerCard } from './shimmer-card';\r\nimport { Legend } from '../utils/device-legend';\r\nimport { DeviceCardProps, IScopeContext } from '../utils/types';\r\nimport { useData } from './use-data';\r\nimport { getStyles } from '../styles/devices-card';\r\n\r\nexport function DeviceCard(props: DeviceCardProps | null | undefined) {\r\n const { scope } = useContext(ScopeContext) as IScopeContext;\r\n const {\r\n dateRange, filter, i18n, getCardsConfig, sesId, perfMarkerUtils, allMetrics, initialSelectedMetrics, patchPreference, campaignType,\r\n } = props;\r\n\r\n const [uiMetrics] = useState(getUIMetrics(allMetrics, campaignType, cardDeviceId));\r\n\r\n const { willFetchData, willRender, done } = perfMarkerUtils;\r\n const { aggregatedData, isLoading } = useData({\r\n dateRange,\r\n filter,\r\n campaignType,\r\n getCardsConfig,\r\n willRender,\r\n willFetchData,\r\n done,\r\n });\r\n const styles = useDefaultStyles(getStyles);\r\n const hideCurrency = aggregatedData.AccountsHaveDifferentCurrencies;\r\n\r\n const onClick = useCallback(() => {\r\n scope.save('/campaign/vnext/devices');\r\n }, [scope]);\r\n\r\n if (isLoading) {\r\n return ;\r\n }\r\n\r\n const isComparisonScenario = dateRange.compared;\r\n const navigationLevel = getNavigationLevel(scope);\r\n const footerVisible = navigationLevel !== 'customer';\r\n\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n {!isComparisonScenario && (\r\n \r\n )}\r\n {isComparisonScenario && (\r\n \r\n )}\r\n
\r\n {footerVisible && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n );\r\n}\r\n","import useSWR from 'swr';\r\nimport _ from 'underscore';\r\nimport { useState, useEffect, useMemo, useContext, useCallback } from 'react';\r\nimport edm from '@bingads-webui-component-legacy/edm-campaign/index';\r\nimport { availableGranularities, fetchAggregatedData } from '@bingads-webui-campaign/overview-cards-common';\r\nimport dateUtil from '@bingads-webui-component-legacy/humanize/date';\r\nimport jsdata from '@bingads-webui-component-legacy/js-data-campaign/index';\r\nimport config from '@bingads-webui-component-legacy/config/index';\r\nimport { ScopeContext } from '@bingads-webui-react/scope-service';\r\nimport { cardDeviceId } from '@bingads-webui-campaign/fluent-page-consts';\r\nimport { getNavigationLevel, NavigationLevel } from '@bingads-webui-campaign/fluent-page-data';\r\nimport { UseDataProps } from '../utils/types';\r\n\r\nexport function useData({\r\n dateRange,\r\n filter,\r\n campaignType,\r\n getCardsConfig,\r\n willFetchData,\r\n willRender,\r\n done,\r\n}: UseDataProps) {\r\n const { scope } = useContext(ScopeContext) as any;\r\n const { campaignId } = scope.values;\r\n const aid = _.get(scope, ['values', 'aid']);\r\n const isAccountIdAvailable = !!aid;\r\n\r\n const navigationLevel = useMemo(() => getNavigationLevel(scope.values), [scope.values]);\r\n const granularity = useMemo(() => availableGranularities(dateRange, dateUtil)[0], [dateRange]);\r\n const [hasError, setHasError] = useState(false);\r\n const [isLoading, setIsLoading] = useState(true);\r\n\r\n const extendedFilter = useMemo(() => {\r\n if (campaignId) {\r\n return [...filter, {\r\n filter: {\r\n key: 'CampaignId',\r\n value: {\r\n query: {\r\n Id: Number(campaignId),\r\n },\r\n },\r\n },\r\n }];\r\n }\r\n return filter;\r\n }, [campaignId, filter]);\r\n\r\n const fetchSingleTile = navigationLevel === NavigationLevel.Campaign;\r\n\r\n const entitySet = useMemo(() => {\r\n if (campaignId) {\r\n return edm.currentCampaign.AdGroups;\r\n }\r\n if (isAccountIdAvailable) {\r\n return edm.currentAccount.Campaigns;\r\n }\r\n return edm.currentCustomer.Accounts;\r\n }, [campaignId, isAccountIdAvailable]);\r\n\r\n const fetcher = useCallback(async () => {\r\n setIsLoading(true);\r\n const data = await fetchAggregatedData({\r\n entitySet,\r\n dateRange,\r\n filter: extendedFilter,\r\n campaignType,\r\n jsdata,\r\n dateUtil,\r\n navigationLevel,\r\n getCardsConfig,\r\n fetchSingleTile,\r\n isDevice: true,\r\n permissions: config.get('Permissions'),\r\n dfmCacheKey: cardDeviceId,\r\n });\r\n\r\n if (!data || (!data.raw && !data.OverallTotals)) {\r\n throw new Error('Error loading data for device card');\r\n }\r\n\r\n return data;\r\n }, [entitySet, dateRange, extendedFilter, getCardsConfig, navigationLevel, fetchSingleTile, campaignType]);\r\n\r\n const { data, error } = useSWR(\r\n [dateRange, extendedFilter, getCardsConfig, navigationLevel, fetchSingleTile],\r\n fetcher,\r\n {\r\n onSuccess: () => {\r\n setIsLoading(false);\r\n willRender();\r\n done();\r\n },\r\n onError: () => {\r\n setIsLoading(false);\r\n setHasError(true);\r\n },\r\n }\r\n );\r\n\r\n useEffect(() => {\r\n if (dateRange && filter) {\r\n willFetchData();\r\n }\r\n }, [dateRange, filter, getCardsConfig, granularity, navigationLevel, willFetchData]);\r\n\r\n const deviceData = useMemo(() => {\r\n if (campaignId) {\r\n return data?.raw?.['@ns.unfiltered.totals'] || {};\r\n }\r\n return data || {};\r\n }, [data, campaignId]);\r\n\r\n return {\r\n aggregatedData: deviceData || null,\r\n isLoading,\r\n hasError: !!error,\r\n };\r\n}\r\n"],"names":["observeInDOM","el","onAttached","onDetached","onAttachedToDOM","_","onDetachedFromDOM","getEl","$","get","wasInDOM","document","body","observer","MutationObserver","disconnect","observe","childList","subtree","DetailCardsKey","campaign","billing","editorial","conversionTracking","bidding","assetGroup","statusAndActionReport","_ref","activity","type","status","details","message","action","trace","JSON","stringify","auditPointDisplayed","_ref2","auditPoint","area","concat","getFullProductUrl","routeName","scope","params","arguments","length","undefined","pathname","getRoutePathById","allSiteMap","search","reduce","result","param","value","join","BILLING_ISSUE_LIST","BANNER_ALERT","DANGER","STATUS_TEXT","Active","_TL_","Paused","UnderReview","BudgetPaused","getCampaignStatus","i18n","locale","alertHelper","name","getString","key","cardDetails","_scope$values","values","cid","aid","campaignId","onNavigateToBudgetEditSettingsPage","isSDK","url","save","cardTitle","cardMsg","onCardButtonClicked","edmCampaign","Customers","$withKey","Accounts","Campaigns","bulkUpdate","Id","Status","then","showSuccess","e","error","showError","cardButtonText","statusLabelMsg","Warning","learnMoreLink","getCardDetails","statusIcon","Error","Pending","_objectSpread","InReview","Rejected","Approved","Limited","getEditorialStatus","_ref3","campaignType","isCampaignTypeApp","window","open","assetGroupUrl","NoIssue","InappropriateTarget","getBiddingStatus","includes","ACTION_OPERATOR_TEXT","EqualsTo","BeginsWith","Contains","RegularExpression","CATEGORY_OPERATOR_TEXT","LABEL_OPERATOR_TEXT","VALUE_OPERATOR_TEXT","LessThan","GreaterThan","NotSetUpGoal","NotSetUpGoalMaxClicks","Unverified","UnverifiedMaxClicks","RecordingConversions","NoConversions","NoConversionsMaxClicks","NoConversionGoal","NoConversionGoalMaxClicks","MissGoalWithRevenueValue","MissGoalWithRevenueValueMaxClicks","InactiveDueToTagUnavailable","InactiveDueToTagUnavailableMaxClicks","TagInactive","TagInactiveMaxClicks","NoRecentConversion","NoRecentConversionMaxClicks","AUDIT_POINT_STATUS_TEXT","TrackingStatusUnverified","TrackingStatusTagInactive","TrackingStatusInactiveDueToTagUnavailable","AUDIT_POINT_TITLE_TEXT","OPERATORS_TEXT","serverContext","onClickNavigateToUETTagPage","remove","onClickNavigateToOfflineConversionsPage","onClickNavigateToConversionGoalsPage","CampaignTypes","Audience","DynamicPermissions","FixEventGoal","_getInvalidEventStrin","_ref$fix","fix","CurrentEventCategory","CurrentEventCategoryOperator","CurrentEventAction","CurrentEventActionOperator","CurrentEventLabel","CurrentEventLabelOperator","CurrentEventValue","CurrentEventValueOperator","SuggestedEventCategory","SuggestedEventCategoryOperator","SuggestedEventAction","SuggestedEventActionOperator","SuggestedEventLabel","SuggestedEventLabelOperator","SuggestedEventValue","SuggestedEventValueOperator","currentArray","suggestedArray","push","current","suggested","getInvalidEventStrings","FixDestinationUrlGoal","CurrentDestinationUrlOperatorName","CurrentDestinationUrl","SuggestedDestinationUrlOperatorName","SuggestedDestinationUrl","strings","UETMismatch","CurrentTagId","SuggestedTagId","isConversionApplicable","conversionDetails","getConversionStatus","statusValue","diagnosticDetails","parse","CardStatus","title","text","hasError","some","item","hasWarning","isCampaignActive","campaignDetail","find","logStatusText","texts","useData","perfMarker","sesId","_useState","useState","_useState2","_slicedToArray","setBilling","_useState3","_useState4","diagnosticsData","setDiagnosticsData","_useState5","_useState6","isDataFetchDone","setIsDataFetchDone","_useState7","_useState8","setError","instrumentation","useContext","InstrumentationContext","useMemo","createScenarioAndActivity","scenarioName","activityName","AlertHelper","areas","getAreasForCampaignType","ScopeContext","scopeCID","uid","useEffect","Areas","Billing","getBillingStatus","ccBaseUrl","set","dfmCacheKey","isNewConversionsEnabled","isNewApiEnabledForAudienceCampaigns","withNewApi","App","getCampaignDiagnostics","timeZoneId","adInsightBaseUrl","Token","useNewConversionDiagnostics","billingDetail","Array","isArray","notification","alertType","NotificationLevel","NotificationId","ccBaseUrlNoTrailingSlash","replace","paymentPath","getBillingDetail","diagnosticsDetail","toLowerCase","split","Campaign","campaignDetails","Key","Editorial","editorialDetails","Bidding","biddingDetails","Conversion","getDiagnosticsDetail","rawDetails","acc","a","totalStatusCount","filter","Boolean","done","readyState","_getCardStatusText","campaignStatusTitle","campaignStatusMsg","getCardStatusText","wrapperClass","mergeStyles","padding","overflowX","selectors","margin","titleShimmerClass","width","messageShimmerClass","shimmerWithElement1stRow","ShimmerElementType","line","height","shimmerWithElement2ndRow","shimmerWithElement3rdRow","shimmerWithElement4thRow","gap","shimmerWithElement5thRow","shimmerWithElement6thRow","DiagnosticCardShimmer","responsiveSize","_jsxs","_Fragment","children","className","_jsx","Shimmer","shimmerElements","Separator","OverviewDiagnosticCard","props","perfMarkerUtils","PerfMarkerFactory","createMarker","willInit","_useData","DiagnosticCard","defaultProps","entityName","customer","account","TopChangesCard","legacyI18n","dateRange","jsdata","dateUtil","cardTypeId","constructOptions","navigationLevel","getCardsConfig","preferenceFromServer","patchPreference","permissions","PermissionsContext","comparisonDateRange","getComparisonDateRange","headerState","selectedMenuItem","selectedItemValue","TopChangesFilterOption","AllChanges","dismissLastFluctuation","setDismissLastFluctuation","fetchSingleTile","useRef","selectedMetric","setSelectedMetric","onMetricSelect","useCallback","selection","metric","onFooterButtonClick","footerButtonConfigs","onClick","getHref","entityId","route","isLoading","data","cacheManager","entitySet","uiActivity","scenario","fetch","willFetchData","fetchTopChanges","isDevice","disableCache","accountsMode","willRender","dataError","gridData","entity","PerformanceMetricsChange","AvailableInsightTypeIds","fromScenario","CampaignType","toString","AccountInactiveReasons","AccountUtils","activityStatus","TopDecliners","TopGainers","Insights","isInsightsMetric","catch","response","revalidateOnFocus","useTopChangesData","allMetrics","getTopChangesAllMetrics","renderFluctuationPopup","fluctuationTypeIds","isOpen","setIsOpen","context","CurrentCampaign","isFluctuationsExperiementEnabled","Permissions","IsFluctuationExperimentEnabled","CurrentAccount","FluctuationPopup","deps","token","imagePath","appConfig","metrics","onClose","onFlucDismiss","isLastFluc","canViewAllInsights","asyncLoadFluctuationConfig","startDate","start","endDate","end","withPopoverAdapter","useFluctuationPopup","metricFormatter","entityType","currentDateRange","dashboardPreferencesName","useDashboardPreferences","preference","dashboardPreferences","findByNameAtAccountLevel","dashboardId","options","setOptions","saveDashBoardOptions","newOptions","setAtAccountLevel","Name","Data","cards","logApi","WelcomeTipsCard","createdCampaign","skippedBothAtAccountCreation","skippedNoneAtAccountCreation","pages","hasPaymentPermission","showWelcomeMsg","isPaymentFirstTile","hasCoupon","PreferenceContext","accountId","userId","customerId","scopes","alerts","paymentAlert","alert","id","indexOf","hasValidPaymentMethod","skippedNoneInFirstLoad","coupon","Redemptions","redeemedCoupons","redeemed","StatusId","AssociatedCoupon","matchResult","exec","ExpiryDateFromAssociation","expirationDate","parseInt","Date","stack","PROMO","CREATE_CAMPAIGN","ADD_PAYMENT","COACHING","HELP","useWelcomeTipPages","CurrentUser","FirstName","getLocalizedSupportLink","CashbackPercentBaseView","_Backbone$View","_classCallCheck","_callSuper","_inherits","_createClass","_this","view","viewModel","template","_ref$key","_ref$CashbackPercent","CashbackPercent","adGroup","decimal","this","on","percentValue","initializeCashbackPercentControlView","cashbackPercentControlView","CashbackPercentControlView","viewContext","currentCampaign","currentAdGroup","$el","html","empty","append","render","ko","validate","Records","memo","record","errorMessages","Errors","pluck","flatten","_defineProperty","trigger","Percent","getCashbackPercentValue","errorMapping","errors","Backbone","CashbackPercentBaseViewModel","_ref$percentSchema","percentSchema","AdGroup","properties","AdGroupCashback","schema","model","_ref$customValidators","customValidators","isValid","v","min","max","KoSchema","AdGroupCashbackPercentViewModel","_CashbackPercentBaseV","AdGroupCashbackPercentView","updater","cashbackPercent","_superPropGet","currentPercent","isDataUpdated","updated","fieldName","editorView","editorViewCallbackAfterUpdate","CriterionCashbackPercentView","CriterionCashback","getCashbackPercentDisplayValue","isCashbackPercentEmpty","_getParentLevelCashba","getParentLevelCashbackPercent","level","formattedValue","formatPercentToFixed","digits","CashbackPercentBaseColumn","_ProjectionGridBaseCo","_options$enableEdit","enableEdit","format","sortable","direction","helpAriaLabel","ProjectionGridBaseColumn","showPopEditorView","editor","newPosition","GridCustomizedPopupEditor","cellPosition","parentContainerSelector","AdGroupCashbackPercentColumnFactory","_ref2$updater","_CashbackPercentBaseC","AdGroupCashbackPercentColumn","_this2","property","shouldSupportCashbackSettings","helpId","_ref4","$total","CampaignCashbackPercentColumn","_CashbackPercentBaseC3","isPersonalizedOfferAvailable","CampaignSubType","_ref7","_ref8","CriterionCashbackColumnBase","_CashbackPercentBaseC4","LevelOfDetails","Level","inherited","getCashbackValue","_ref9","displayValue","audienceCriterionCashbackPercentColumnFactory","_ref10","_ref10$criterionCashb","criterionCashbackUpdater","_CriterionCashbackCol","AudienceCriterionCashbackPercentColumn","_this3","shouldEnableEdit","columnContext","currentScope","isExcluded","AudienceCriterion","CashbackAdjustment","newCashbackPercent","_ref11","_this4","percentEditor","popupEditor","onSave","_ref12","canBidEditable","criterionCashbackPercentColumnFactory","_ref13","_ref13$criterionLevel","criterionLevel","_ref13$criterionCashb","criterionCashbackOverrideUpdater","_ref13$criterionCashb2","modelName","_CriterionCashbackCol2","CriterionCashbackPercentColumn","_this5","_ref14","_this6","CashbackBudgetColumn","CashbackMonthlyBudget","decimalToFixedFormatter","Number","cashbackBudgetRange","cashbackBudgetTemplate","CashbackScopeBaseView","showProductScope","noneScopeText","guid","CashbackScopeBaseViewModel","scopeSchema","formName","AdGroupCashbackScopeView","_CashbackScopeBaseVie","Scope","toObject","CashbackScope","CashbackScopeColumn","getCashbackScope","cashbackScope","getInheritOptionText","cashbackScopeTemplate","AdGroupCashbackScopeColumnFactory","_CashbackScopeColumn","AdGroupCashbackScopeColumn","arg","campaignLevelScope","getParentLevelCashbackScope","campaignLevelScopeText","CampaignCashbackScopeColumn","_CashbackScopeColumn3","_ref6","cashbackPercentGridCommonStyle","palette","marginLeft","border","neutralSecondary","maxWidth","background","paddingLeft","marginRight","paddingRight","CouponBaseView","noneCouponText","CouponBaseViewModel","couponSchema","AdGroupCouponView","_CouponBaseView","CouponsEnabled","currentCoupon","CouponColumn","getCoupon","couponTemplate","AdGroupCouponColumnFactory","_CouponColumn","AdGroupCouponColumn","isShowCoupon","campaignLevelCoupon","getParentLevelCoupon","CampaignCouponColumn","_CouponColumn2","pug","module","exports","locals","pug_interp","pug_html","locals_for_with","escape","call","pug_mixins","cssClass","block","attributes","attr","classes","warningMessage","computerColor","tabletColor","mobileColor","connectedTVColor","mapSegmentData","segmentedData","map","segment","deviceType","StringValue","Impressions","Clicks","CTR","Spend","TopImpressionRate","AbsoluteTopImpressionRate","ConversionsCredit","PartialConversionRate","PartialConversionCPA","AdvertiserReportedRevenue","RevenueOnAdSpend","AverageCPC","LegendIcon","color","useGradient","boxStyle","backgroundImage","backgroundColor","backgroundSize","style","renderCustomCallout","styles","legend","legendColor","metricValue","total","displayName","customCallout","legendIcon","date","RangeStartDate","RangeEndDate","dropdownCustomStyles","root","dropdown","boxShadow","outline","minWidth","paddingTop","lineHeight","display","alignItems","caretDown","fontSize","caretDownWrapper","justifyContent","dropdownItem","deviceDefaultCard","footerVisible","flexDirection","flexGrow","dropdownDefaultCard","multiStackedChart","paddingBottom","marginBottom","getStyles","DeviceDefaultCard","deviceData","initialSelectedMetrics","hideCurrency","chartPoints","chartPointsTemplate","chartData","callOutAccessibilityData","ariaLabel","m","metricChartPointsMap","flatMap","PerformanceMetrics","SegmentedData","DeviceSegmentedPerformanceData","deviceTypeMap","deviceMetricsMap","overallTotals","OverallTotals","updatedChartPoints","updatedPoints","Object","keys","forEach","typedMetric","deviceMetrics","overallValue","toFixed","formatMetric","selectedViews","setSelectedViews","dropdownOptions","index","remainingMetrics","useDefaultStyles","dataViews","handleViewChange","event","option","prevSelectedViews","newViews","selectedColumns","Dropdown","selectedKey","onChange","TooltipHost","content","Glyphicon","glyph","MultiStackedBarChart","culture","navigator","language","hideLegend","onRenderCalloutPerDataPoint","chartStyles","deviceComparisonCard","dropdownComparisonCard","gridContainerStyle","gridTemplateColumns","gridTemplateRows","dataItem","separator","borderLeft","multiStackedBarChart","comparisonCardPattern","position","left","top","overflow","leftGrid","gridColumn","rightGrid","patterns","path","DeviceComparisonPatterns","pattern","patternUnits","x1","y1","x2","y2","stroke","strokeWidth","legendKeyMap","SmartPhone","getSegmentedData","keyPath","extractNumericValue","symbolRegex","sanitizedValue","parseFloat","calculatePercentageOfTotal","totalMetric","DeviceComparisonCard","currentComparisonData","previousComparisonData","changeData","previousDataMap","deviceIdentifier","previous","changeDataPercentage","previousDateRange","compared","formattedStart","formattedEnd","currentPeriodTotals","previousPeriodTotals","PeriodPerformanceMetrics","createChartSeriesData","isPattern","colorMap","Computer","Tablet","ConnectedTV","prepareDeviceData","comparisonData","deviceDataAccumulator","createChartPoints","currentDeviceData","previousDeviceData","chartTitle","accumulator","getCombinedDataPoints","combined","entry","dataPoint","calloutStyles","point","combinedData","mappedLegend","changeDataEntry","change","roundedValue","numericChange","isFinite","changeDataPercentageEntry","changePercentage","roundedValuePercentage","numericChangePercentage","formatChangePercentageWithSign","legendData","metricDisplayName","hidePercentageOfTotal","Set","has","currentPercentageOfTotalMetric","previousPercentageOfTotalMetric","renderMetricValue","percentageMetricKey","percentageMetricValue","percentage","changeValue","formatMetricWithSign","currentMetric","selectedKeys","handleDropdownChange","newSelectedViews","chartTitleHidden","headerElement","buttonRowElement","largeBlockElement","footerElement","shimmerContainer","shimmerElement","marginTop","ShimmerCard","ComputerIcon","xmlns","viewBox","fill","d","TabletIcon","MobileIcon","ConnectedTVIcon","x","y","container","chartContainer","minHeight","deviceLegend","flexWrap","columnGap","cursor","icon","footer","Legend","legends","DeviceCard","uiMetrics","getUIMetrics","aggregatedData","isAccountIdAvailable","getNavigationLevel","granularity","availableGranularities","setHasError","setIsLoading","extendedFilter","query","NavigationLevel","AdGroups","currentAccount","currentCustomer","fetcher","async","fetchAggregatedData","config","raw","onSuccess","onError","AccountsHaveDifferentCurrencies","isComparisonScenario","Button"],"sourceRoot":""}