{"version":3,"file":"static/js/application.initial~822fe52d.39e9b886.js","mappings":"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","sources":["../../../node_modules/@bingads-webui-campaign/labels/src/column/labels-column.js","../../../node_modules/@bingads-webui-campaign/labels/src/popup/content-view.js","../../../node_modules/@bingads-webui-campaign/labels/src/popup/label-filter-util.js","../../../node_modules/@bingads-webui-campaign/labels/src/popup/index.js","../../../node_modules/@bingads-webui-campaign/labels/src/util/get-entity-set.js","../../../node_modules/@bingads-webui-campaign/labels/src/util/labels-data-source.js","../../../node_modules/@bingads-webui-campaign/labels/src/selector/selector-viewmodel.js","../../../node_modules/@bingads-webui-campaign/labels/src/selector/label-selector-view.js","../../../node_modules/@bingads-webui-campaign/labels/src/selector/create-label-view.js","../../../node_modules/@bingads-webui-campaign/labels/src/util/create.js","../../../node_modules/@bingads-webui-campaign/odata-config/src/odata-config.js","../../../node_modules/@bingads-webui-campaign/overview-base-card/src/base-card.js","../../../node_modules/@bingads-webui-campaign/overview-cards-common/src/constants.js","../../../node_modules/@bingads-webui-campaign/overview-cards-common/src/util.js","../../../node_modules/@bingads-webui-campaign/overview-cards-common/src/metrics.js","../../../node_modules/@bingads-webui-campaign/overview-cards-common/src/filter-util.js","../../../node_modules/@bingads-webui-campaign/overview-cards-common/src/fetch.js","../../../node_modules/@bingads-webui-campaign/overview-cards-common/src/fetch-coupons.js","../../../node_modules/@bingads-webui-campaign/overview-cards-common/src/top-locations-fetch.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/common/util.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/common/strings.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-react/conversion-setup/coupon-setup.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-react/empty-state.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/common/metrics.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-react/react-grid/grid-increase-graph.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-react/react-grid/grid-decline-graph.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-react/react-grid/grid-name-cell.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-react/react-grid/grid-hover-container.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-react/react-grid/grid-row.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-react/react-grid/react-grid.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/common/error-type.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-react/conversion-error-overview/popup.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-react/conversion-error-overview/line.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-react/conversion-error-overview/status-overview.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-react/conversion-error-overview/footer.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-react/react-grid/grid-metric-picker.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-react/react-grid/grid-metric-picker-fluent.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-react/react-grid/grid-header.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-react/conversion-tracking-state.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-react/conversion-tracking-card.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/common/instrumentation.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-backbone.js","../../../node_modules/@bingads-webui-campaign/overview-conversion-tracking-card/src/conversion-tracking-card-fluent.js","../../../node_modules/@bingads-webui-campaign/overview-device-card/src/metric/index.js","../../../node_modules/@bingads-webui-campaign/overview-device-card/src/order.js","../../../node_modules/@bingads-webui-campaign/overview-device-card/src/index.js","../../../node_modules/@bingads-webui-campaign/overview-grid-card/src/content.js","../../../node_modules/@bingads-webui-campaign/overview-grid-card/src/index.js","../../../node_modules/@bingads-webui-campaign/overview-grid-card/src/search-term-operations/add-keyword.js","../../../node_modules/@bingads-webui-campaign/overview-metric-picker/src/info-tooltip.js","../../../node_modules/@bingads-webui-campaign/overview-metric-picker/src/index.js","../../../node_modules/@bingads-webui-campaign/overview-panel/index.js","../../../node_modules/@bingads-webui-campaign/overview-panel/src/config/dashboard-config.js","../../../node_modules/@bingads-webui-campaign/overview-panel/src/dashboard/add-card/viewmodel.js","../../../node_modules/@bingads-webui-campaign/overview-panel/src/dashboard/add-card/index.js","../../../node_modules/@bingads-webui-campaign/overview-panel/src/config/welcome-card-config.js","../../../node_modules/@bingads-webui-campaign/overview-panel/src/dashboard/card-state.js","../../../node_modules/@bingads-webui-campaign/overview-panel/src/dashboard/datefilter-state.js","../../../node_modules/@bingads-webui-campaign/overview-panel/src/dashboard/util.js","../../../node_modules/@bingads-webui-campaign/overview-panel/src/dashboard/i18nMappings.js","../../../node_modules/@bingads-webui-campaign/overview-panel/src/dashboard/dashboard-view.js","../../../node_modules/@bingads-webui-campaign/overview-panel/src/dashboard-page/dashboard-page-view.js","../../../node_modules/@bingads-webui-campaign/overview-panel/src/instrumentation/log-helper.js","../../../node_modules/@bingads-webui-campaign/overview-recommendations-config/src/tips-config.js","../../../node_modules/@bingads-webui-campaign/overview-top-changes-card/src/content.js","../../../node_modules/@bingads-webui-campaign/overview-top-changes-card/src/index.js","../../../node_modules/@bingads-webui-campaign/personalized-offer-shared/src/utils.js","../../../node_modules/@bingads-webui-campaign/pgrid-aggregated-rows/src/plugin.js","../../../node_modules/@bingads-webui-campaign/pgrid-factory/src/pgrid-factory.js","../../../node_modules/@bingads-webui-campaign/pgrid-performance-log/src/plugin.js","../../../node_modules/@bingads-webui-campaign/pgrid-performance-log/src/pluginv2.js","../../../node_modules/@bingads-webui-campaign/positive-keywords-data/src/columns-config.js","../../../node_modules/@bingads-webui-campaign/positive-keywords-data/src/filter-config.js","../../../node_modules/@bingads-webui-campaign/positive-keywords-data/src/data-fetch-config.js","../../../node_modules/@bingads-webui-campaign/positive-keywords-data/src/data-fetch-source.js","../../../node_modules/@bingads-webui-campaign/preferences-subadapter/src/preferences-subadapter.js","../../../node_modules/@bingads-webui-campaign/projection-grid-column-chooser/src/update-filter-for-custom-column.js","../../../node_modules/@bingads-webui-campaign/projection-grid-column-chooser/src/prompt-text-view.js","../../../node_modules/@bingads-webui-campaign/projection-grid-column-chooser/src/plugin.js","../../../node_modules/@bingads-webui-campaign/projection-grid-column-chooser/src/config.js","../../../node_modules/@bingads-webui-campaign/projection-grid-date-filter/src/plugin.js","../../../node_modules/@bingads-webui-campaign/projection-grid-inline-download/src/generic-plugin.js","../../../node_modules/@bingads-webui-campaign/projection-grid-inline-download/src/set-filter-by-report-email-rule.js","../../../node_modules/@bingads-webui-campaign/projection-grid-inline-download/src/campaign-odata-plugin.js","../../../node_modules/@bingads-webui-campaign/projection-grid-inline-download/src/without-dependencies.js","../../../node_modules/@bingads-webui-campaign/projection-grid-inline-download/src/campaign-odata-plugin-without-dependencies.js","../../../node_modules/@bingads-webui-campaign/projection-grid-labels/src/create-label-selector-view.js","../../../node_modules/@bingads-webui-campaign/projection-grid-labels/src/plugin.js","../../../node_modules/@bingads-webui-campaign/projection-grid-period-over-period/src/projection/period-over-period-columns.js","../../../node_modules/@bingads-webui-campaign/projection-grid-period-over-period/src/projection/period-over-period-header.js","../../../node_modules/@bingads-webui-campaign/projection-grid-period-over-period/src/plugin.js","../../../node_modules/@bingads-webui-campaign/projection-grid-segment/src/projection/segment.js","../../../node_modules/@bingads-webui-campaign/projection-grid-segment/src/projection/segment-cell-style.js","../../../node_modules/@bingads-webui-campaign/projection-grid-segment/src/segment-alert.js","../../../node_modules/@bingads-webui-campaign/projection-grid-segment/src/plugin.js","../../../node_modules/@bingads-webui-campaign/labels/src/column/labels-column-header-template.pug","../../../node_modules/@bingads-webui-campaign/labels/src/column/labels-column-template.pug","../../../node_modules/@bingads-webui-campaign/labels/src/popup/template.pug","../../../node_modules/@bingads-webui-campaign/labels/src/selector/create-template.pug","../../../node_modules/@bingads-webui-campaign/labels/src/selector/row.checked.pug","../../../node_modules/@bingads-webui-campaign/labels/src/selector/template.pug","../../../node_modules/@bingads-webui-campaign/labels/src/shared/label-name-template.pug","../../../node_modules/@bingads-webui-campaign/overview-cards-common/src/grid-entity-name-template.pug","../../../node_modules/@bingads-webui-campaign/overview-cards-common/src/top-changes-grid-template.pug","../../../node_modules/@bingads-webui-campaign/overview-device-card/src/metric/metric-picker-button-template.pug","../../../node_modules/@bingads-webui-campaign/overview-device-card/src/metric/template-v2.pug","../../../node_modules/@bingads-webui-campaign/overview-device-card/src/template.pug","../../../node_modules/@bingads-webui-campaign/overview-grid-card/src/content-template.pug","../../../node_modules/@bingads-webui-campaign/overview-grid-card/src/cover-template.pug","../../../node_modules/@bingads-webui-campaign/overview-grid-card/src/dropdown-template.pug","../../../node_modules/@bingads-webui-campaign/overview-grid-card/src/metric-picker-template.pug","../../../node_modules/@bingads-webui-campaign/overview-grid-card/src/performance-metric-header-template.pug","../../../node_modules/@bingads-webui-campaign/overview-grid-card/src/performance-metric-template.pug","../../../node_modules/@bingads-webui-campaign/overview-grid-card/src/placeholder-template.pug","../../../node_modules/@bingads-webui-campaign/overview-grid-card/src/search-term-operations/add-keyword-template.pug","../../../node_modules/@bingads-webui-campaign/overview-grid-card/src/template.pug","../../../node_modules/@bingads-webui-campaign/overview-metric-picker/src/button-template.pug","../../../node_modules/@bingads-webui-campaign/overview-metric-picker/src/dropdown-menu-template.pug","../../../node_modules/@bingads-webui-campaign/overview-metric-picker/src/template.pug","../../../node_modules/@bingads-webui-campaign/overview-panel/src/dashboard-page/dashboard-page-template.pug","../../../node_modules/@bingads-webui-campaign/overview-panel/src/dashboard/add-card/template-vnext.pug","../../../node_modules/@bingads-webui-campaign/overview-panel/src/dashboard/dashboard-template.pug","../../../node_modules/@bingads-webui-campaign/overview-panel/src/dashboard/footer-template.pug","../../../node_modules/@bingads-webui-campaign/overview-panel/src/dashboard/new-feature-template.pug","../../../node_modules/@bingads-webui-campaign/overview-panel/src/dashboard/new-tile-banner-template.pug","../../../node_modules/@bingads-webui-campaign/overview-panel/src/dashboard/too-many-accounts-warning.pug","../../../node_modules/@bingads-webui-campaign/overview-top-changes-card/src/metric-picker-button-template.pug","../../../node_modules/@bingads-webui-campaign/overview-top-changes-card/src/template.pug","../../../node_modules/@bingads-webui-campaign/projection-grid-column-chooser/src/prompt-text-view.pug","../../../node_modules/@bingads-webui-campaign/projection-grid-period-over-period/src/projection/cell.pug","../../../node_modules/@bingads-webui-campaign/projection-grid-period-over-period/src/projection/header.pug","../../../node_modules/@bingads-webui-campaign/projection-grid-period-over-period/src/projection/period-over-period-header.pug","../../../node_modules/@bingads-webui-campaign/projection-grid-segment/src/projection/segment-value-cell-default.pug","../../../node_modules/@bingads-webui-campaign/projection-grid-segment/src/segment-alert.pug","../../../node_modules/@bingads-webui-campaign/notification-center/src/utils/mini-callout-styles.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/types/notification.types.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/utils/mini-callout.tsx","../../../node_modules/@bingads-webui-campaign/notification-center/src/top-banner/mini-callout.tsx","../../../node_modules/@bingads-webui-campaign/notification-center/src/top-banner/top-banner-layout.tsx","../../../node_modules/@bingads-webui-campaign/notification-center/src/utils/i18n-map.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/utils/filters.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/utils/index.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/route.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/context/context.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notification-data-source.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notification-dismiss-store.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notification-store.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notification-data-source-factory.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notifications/draft-store-notification.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notifications/alert-information.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notifications/disapproved-entities.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notifications/import-status.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notifications/import-notifications.tsx","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notifications/no-eligible-entities.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notifications/predefined.tsx","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notifications/uet.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notifications/mock-cc-notifications.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notifications/client-center.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notifications/pmax-campaign-upgrade-notification.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notifications/location-intent-update-notifications.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notifications/hotel-center-migration-notification.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notifications/hotel-center-migration-phase2-notification.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notifications/hotel-center-migration-phase3-notification.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notifications/broad-only-notification.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notifications/gmc-token-expired-notification.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/notification-store/notifications/deprecate-syndication-search-only-notification.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/preview-bar/preview-bar.tsx","../../../node_modules/@bingads-webui-campaign/notification-center/src/unified-notification-queue/index.tsx","../../../node_modules/@bingads-webui-campaign/notification-center/src/utils/logger.ts","../../../node_modules/@bingads-webui-campaign/notification-center/src/floating-banner/mini-callout.tsx","../../../node_modules/@bingads-webui-campaign/notification-center/src/floating-banner/floating-banner.tsx"],"sourcesContent":["import _ from 'underscore';\r\nimport { CampaignuiBaseColumn } from '@bingads-webui-campaign/campaignui-base-column';\r\nimport { toHex, contrastColor } from '@bingads-webui-universal/primitive-utilities';\r\nimport template from './labels-column-template.pug';\r\nimport headerTemplate from './labels-column-header-template.pug';\r\n\r\nexport class LabelsColumn extends CampaignuiBaseColumn {\r\n constructor(options) {\r\n const title = options.i18n.getString('ColumnName_Labels');\r\n const isMCCLabelEnabled = options.permissions ?\r\n options.permissions.IsAccountLabelsEnabled : false;\r\n\r\n super({\r\n name: 'Labels',\r\n property: 'Labels',\r\n title,\r\n type: 'array',\r\n helpId: 'pop_BA_CampaignGrids_Labels',\r\n helpAriaLabel: options.i18n.getString('Click to learn more about {{item}}', { item: title }),\r\n headerTemplate: isMCCLabelEnabled ?\r\n (args => headerTemplate({ i18n: options.i18n, ...args })) : undefined,\r\n });\r\n this.i18n = options.i18n;\r\n this.isMCCLabelEnabled = isMCCLabelEnabled;\r\n }\r\n\r\n pickProperty(item) {\r\n const { $total, Labels } = item;\r\n return {\r\n isAggregateRow: !_.isUndefined($total),\r\n labels: Labels,\r\n };\r\n }\r\n\r\n template({ value }) {\r\n const { isAggregateRow, labels } = value;\r\n const maxLabelsToShow = 2;\r\n const labelsLength = _.isEmpty(labels) ? 0 : labels.length;\r\n const labelsCountToShow = _.min([labelsLength, maxLabelsToShow]);\r\n const labelsToUse = [];\r\n\r\n for (let i = 0; i < labelsCountToShow; i += 1) {\r\n const label = labels[i];\r\n const title = _.isEmpty(label.Description) ?\r\n label.Name :\r\n this.i18n.getString('label_tooltip_format').replace('{0}', label.Name).replace('{1}', label.Description);\r\n\r\n labelsToUse.push(_.extend(\r\n _.pick(label, 'Id', 'Name', 'Scope'),\r\n {\r\n labelColor: toHex(label.ColorCode),\r\n contractColor: toHex(contrastColor(label.ColorCode)),\r\n title,\r\n }\r\n ));\r\n }\r\n\r\n return template({\r\n Labels: labelsToUse,\r\n ShowViewMoreLink: labelsLength > maxLabelsToShow,\r\n TotalLength: labelsLength,\r\n IsAggregateRow: isAggregateRow,\r\n i18n: this.i18n,\r\n isMCCLabelEnabled: this.isMCCLabelEnabled,\r\n });\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport { DeterministicView } from '@bingads-webui/deterministic-view';\r\nimport { toHex, contrastColor } from '@bingads-webui-universal/primitive-utilities';\r\n\r\nimport template from './template.pug';\r\n\r\nexport class LabelsPopupContentView extends DeterministicView {\r\n/**\r\n *\r\n * @param {object} options the option.\r\n * @param {object} target the target that the popover will show for.\r\n * @param {Object} position the position that popover view will show besides the target.\r\n * @param {String} containerClassName the class name for popover view.\r\n *\r\n * @return {Void} void\r\n */\r\n initialize({\r\n labels = [],\r\n i18n,\r\n entityType,\r\n entityName,\r\n isMCCLabelEnabled,\r\n }) {\r\n this.options = {\r\n labels,\r\n i18n,\r\n entityType,\r\n entityName,\r\n isMCCLabelEnabled,\r\n };\r\n\r\n super.initialize(this.options);\r\n }\r\n\r\n getAction(event) {\r\n const action = {\r\n name: event.currentTarget.attributes['data-action'].value,\r\n };\r\n return action;\r\n }\r\n\r\n onAction(event) {\r\n this.trigger('remove', this.getAction(event));\r\n }\r\n\r\n onLabelCellItemClicked(event) {\r\n const action = {\r\n event,\r\n ...this.getAction(event),\r\n };\r\n this.trigger('remove', action);\r\n }\r\n\r\n tooltip(i18n, label) {\r\n return _.isEmpty(label.Description) ?\r\n label.Name :\r\n i18n.getString('label_tooltip_format').replace('{0}', label.Name).replace('{1}', label.Description);\r\n }\r\n\r\n backgroundColor(label) {\r\n return `#${toHex(label.ColorCode)}`;\r\n }\r\n\r\n textColor(label) {\r\n return `#${toHex(contrastColor(label.ColorCode))}`;\r\n }\r\n\r\n get template() {\r\n return () => template(_.extendOwn({\r\n backgroundColor: this.backgroundColor,\r\n textColor: this.textColor,\r\n tooltip: this.tooltip,\r\n }, this.options));\r\n }\r\n\r\n events() {\r\n return {\r\n 'click .action': this.onAction,\r\n 'click .labels-cell-item': this.onLabelCellItemClicked,\r\n };\r\n }\r\n}\r\n\r\n","import _ from 'underscore';\r\n\r\nfunction createFilterQuery(labels, containsAll, isMCCLabelEnabled) {\r\n const labelIds = isMCCLabelEnabled ? _.map(labels, label => JSON.stringify(_.pick(label, 'Id', 'Scope'))) : _.pluck(labels, 'Id');\r\n const query = containsAll ?\r\n {\r\n Labels: {\r\n $containsall: labelIds,\r\n },\r\n } :\r\n {\r\n Labels: {\r\n $containsany: labelIds,\r\n },\r\n };\r\n\r\n return query;\r\n}\r\n\r\nexport function triggerFilter(labels, grid, containsAll, filterService, isMCCLabelEnabled = false) {\r\n // currently in new adgroup grid the filterState is mock\r\n if (filterService) {\r\n const filterQuery = createFilterQuery(labels, containsAll, isMCCLabelEnabled);\r\n return filterService.setEditableFilter(filterQuery);\r\n }\r\n\r\n if (grid && grid.filterState) {\r\n const newFilter = grid.filterState.createFilter({\r\n query: createFilterQuery(labels, containsAll, isMCCLabelEnabled),\r\n });\r\n\r\n return grid.filterState.setFilter(newFilter);\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n\r\nexport function filterOnLabelClick(event, labels, gridView, filterService, isMCCLabelEnabled) {\r\n if (!isMCCLabelEnabled) {\r\n return undefined;\r\n }\r\n\r\n const dataIdAttr = 'data-id';\r\n const dataScopeAttr = 'data-scope';\r\n const { currentTarget } = event;\r\n const labelId = parseInt(currentTarget.getAttribute(dataIdAttr), 10);\r\n const scope = currentTarget.getAttribute(dataScopeAttr);\r\n const label = labels.find(l => l.Id === labelId && l.Scope === scope);\r\n\r\n if (label) {\r\n return triggerFilter([label], gridView, true, filterService, isMCCLabelEnabled);\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function navigateToManagePage(router) {\r\n router.navigateToRoute('label_manage', {});\r\n}\r\n\r\n","import $ from 'jquery';\r\nimport { showPopup } from '@bingads-webui/automatic-positioning-popover';\r\nimport { LabelsPopupContentView } from './content-view';\r\nimport { triggerFilter, navigateToManagePage, filterOnLabelClick } from './label-filter-util';\r\n\r\n/**\r\n * Show labels content in popup format, and handle the labels click event\r\n *\r\n * @param {Object} param - An object containing these default options for view:\r\n * @param {Object} param.i18n - the localization settings, by default return the provided key\r\n * @param {String} param.entityType - entity type, such as 'campaign'\r\n * @param {String} param.entityName the name of entity to show labels popup\r\n * @param {jQuery} param.anchor - the element as position base for popup position\r\n * @param {Object[]} param.labels - the labels content, in the format of\r\n * {Id, Name, Description}\r\n * @param {Object} param.grid - the projection grid\r\n * @param {Object} param.router - the router\r\n * @param {Object} param.router.navigateToRoute - the route navigate function\r\n * @return {Promise} promise\r\n */\r\nexport function showLabelsPopup({\r\n labels,\r\n entityType,\r\n entityName,\r\n container = $('.grid-and-disclaim-container'),\r\n event,\r\n i18n,\r\n grid,\r\n router,\r\n filterService,\r\n isMCCLabelEnabled,\r\n groupClass = 'grid-group-other',\r\n}) {\r\n const contentView = new LabelsPopupContentView({\r\n i18n,\r\n labels,\r\n entityType,\r\n entityName,\r\n isMCCLabelEnabled,\r\n });\r\n\r\n const popupOptions = {\r\n positioningMethod: 'fit',\r\n positioningOptions: {\r\n threshold: 0.5,\r\n },\r\n classes: ['popup--labels', groupClass],\r\n contentView,\r\n entityType,\r\n entityName,\r\n container,\r\n };\r\n\r\n const {\r\n top, left, height, width,\r\n } = $(event.target)[0].getBoundingClientRect();\r\n\r\n const uiNextVirtualOffset = container.offset();\r\n\r\n popupOptions.positioningOptions.anchorPosition = {\r\n height,\r\n width,\r\n left: left - uiNextVirtualOffset.left,\r\n top: top - uiNextVirtualOffset.top,\r\n };\r\n\r\n\r\n return showPopup(popupOptions).then((action) => {\r\n if (action.name === 'manage') {\r\n return navigateToManagePage(router);\r\n } else if (action.name === 'filter') {\r\n return triggerFilter(labels, grid, true, filterService, isMCCLabelEnabled);\r\n } else if (action.name === 'filterLabel') {\r\n return filterOnLabelClick(action.event, labels, grid, filterService, isMCCLabelEnabled);\r\n }\r\n\r\n return undefined;\r\n });\r\n}\r\n","export const isMCCLevel = scope => !scope || !scope.values || !scope.values.aid;\r\n\r\nexport function getCurrentCustomerLabels($, edmCampaign) {\r\n if (!$ || !$.advertiser || !edmCampaign) {\r\n return undefined;\r\n }\r\n\r\n const cid = $.advertiser.getUrlParameter('cid');\r\n const customer = edmCampaign\r\n .Customers\r\n .$withKey(cid);\r\n\r\n return customer.Labels;\r\n}\r\n\r\nexport function getEntitySet(scope, edm, $, edmCampaign) {\r\n if (isMCCLevel(scope)) {\r\n return getCurrentCustomerLabels($, edmCampaign);\r\n }\r\n\r\n return edm && edm.currentAccount ? edm.currentAccount.Labels : undefined;\r\n}\r\n","/**\r\n * @file This file contains the data management logic of labels selector\r\n */\r\nimport _ from 'underscore';\r\nimport Promise from 'bluebird';\r\nimport $ from 'jquery';\r\nimport { edmCampaign } from '@bingads-webui/edm-campaign';\r\nimport { Selector } from '@bingads-webui/selector';\r\nimport { getEntitySet, isMCCLevel, getCurrentCustomerLabels } from './get-entity-set';\r\n\r\nconst selectorLoadAction = 'labelsselector/load?';\r\n\r\nclass RequestError extends Error {\r\n constructor(message, responseData) {\r\n super(message);\r\n this.responseData = responseData;\r\n }\r\n}\r\n\r\n// TODO: Remove the workaround after jsdata-odata is fixed\r\n// and no longer translate rejections to a success promise\r\nfunction requestErrorToRejection(result) {\r\n if (result &&\r\n ((result.status && result.status >= 300) ||\r\n (result.statusText && result.statusText === 'error'))) {\r\n throw new RequestError('Request failed', result);\r\n }\r\n return result;\r\n}\r\n\r\nexport function hasCustomerLabel(ids) {\r\n if (!ids) {\r\n return false;\r\n }\r\n return ids.some((id) => {\r\n const parsed = JSON.parse(id);\r\n if (parsed && typeof parsed !== 'object') {\r\n return false;\r\n }\r\n return JSON.parse(id).Scope === 'Customer';\r\n });\r\n}\r\n\r\nfunction getIsCombinedScopeRequest(customerLevelLabelEnabled, scope, ids) {\r\n return (customerLevelLabelEnabled && !isMCCLevel(scope)) || hasCustomerLabel(ids);\r\n}\r\n\r\nfunction load(params, jsdata, edm, scope, isCombinedScopeRequest) {\r\n const result = [];\r\n const cacheResponse = false;\r\n const bypassCache = true;\r\n const headers = {\r\n 'x-ms-refreshcampaigncache': true,\r\n };\r\n\r\n const currentScopeLabels = jsdata.Label\r\n .findAll(params, {\r\n cacheResponse,\r\n bypassCache,\r\n headers,\r\n entitySet: getEntitySet(scope, edm, $, edmCampaign),\r\n }).then(requestErrorToRejection);\r\n\r\n result.push(currentScopeLabels);\r\n\r\n if (isCombinedScopeRequest) {\r\n const customerLabels = jsdata.Label\r\n .findAll({ top: 0, ...params }, {\r\n cacheResponse,\r\n bypassCache,\r\n headers,\r\n entitySet: getCurrentCustomerLabels($, edmCampaign),\r\n }).then(requestErrorToRejection);\r\n result.push(customerLabels);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function getLabelsResult(newData, isCombinedScopeRequest) {\r\n const accountLabels = newData[0];\r\n if (!isCombinedScopeRequest) {\r\n return accountLabels;\r\n }\r\n\r\n const mccLabels = newData[1];\r\n // Selector component shows a max of 50, 51 will trigger message indicating this.\r\n const maxLabelsToShow = 51;\r\n\r\n return accountLabels.concat(mccLabels).slice(0, maxLabelsToShow);\r\n}\r\n\r\nfunction getLabels({\r\n jsdata,\r\n itemsDisplayLimit,\r\n searchFilter,\r\n ids = [],\r\n cacheService,\r\n dataContextManager,\r\n edm,\r\n scope,\r\n customerLevelLabelEnabled,\r\n}) {\r\n const params = {\r\n limit: itemsDisplayLimit + 1,\r\n filterOptions: {\r\n ignoreCase: true, // will take care of applying tolower to all textual\r\n // fields in the query and toLowerCase() to the values\r\n },\r\n };\r\n\r\n if (searchFilter) {\r\n params.where = {\r\n Name: {\r\n $contains: searchFilter,\r\n },\r\n };\r\n }\r\n\r\n if (ids.length > 0) {\r\n const idQuery = {\r\n $or: ids.map(id => ({\r\n Id: {\r\n $eq: (JSON.parse(id).Id ? JSON.parse(id).Id : id),\r\n },\r\n })),\r\n };\r\n const endQueries = [idQuery].concat(params.where || []);\r\n\r\n params.where = { $and: endQueries };\r\n }\r\n\r\n return new Promise((resolve) => {\r\n let cachedData;\r\n\r\n dataContextManager.getContext(selectorLoadAction, false, 'GET');\r\n const pseudoRequest = {\r\n url: selectorLoadAction,\r\n data: params,\r\n success: (data) => {\r\n _.each(data.labels, (label) => {\r\n if (label && typeof JSON.parse(label.Id) !== 'object' && label.Scope) {\r\n // eslint-disable-next-line no-param-reassign\r\n label.Id = JSON.stringify({ Id: label.Id, Scope: label.Scope });\r\n }\r\n });\r\n cachedData = data.labels;\r\n },\r\n };\r\n\r\n cacheService.cache(pseudoRequest);\r\n if (pseudoRequest.skipRequest) {\r\n resolve(cachedData);\r\n } else {\r\n const isCombinedScopeRequest =\r\n getIsCombinedScopeRequest(customerLevelLabelEnabled, scope, ids);\r\n const loadResult = load(params, jsdata, edm, scope, isCombinedScopeRequest);\r\n resolve(Promise.all(loadResult)\r\n .then((newData) => {\r\n const labels = getLabelsResult(newData, isCombinedScopeRequest);\r\n pseudoRequest.success({ labels });\r\n return labels;\r\n }));\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * LabelsDataSource: provides labels fetch functions\r\n */\r\nexport class LabelsDataSource {\r\n /**\r\n * Initilize class settings\r\n *\r\n * @param {Object} param - An object containing these default options\r\n * @param {Object} param.jsdata - jsdata which will be used in labelsDatasource\r\n * @param {Object} param.dataContextManager - dataContextManager\r\n * @param {Function} param.dataContextManager.getContext - getContext for request\r\n * @param {Object} param.cacheService - cacheService\r\n * @param {Function} param.cacheService.cache - cache function\r\n * @returns {void} void\r\n */\r\n constructor({\r\n dataContextManager,\r\n cacheService,\r\n jsdata,\r\n scope,\r\n edm,\r\n customerLevelLabelEnabled,\r\n }) {\r\n this.options = {\r\n dataContextManager,\r\n cacheService,\r\n jsdata,\r\n scope,\r\n edm,\r\n customerLevelLabelEnabled,\r\n };\r\n }\r\n\r\n get itemsDisplayLimit() {\r\n return 50;\r\n }\r\n\r\n /**\r\n * get labels\r\n *\r\n * @param {String} viewFilter - view filter\r\n * can specify to be selected or changed, or empty (means fetch everything)\r\n * @param {String} searchFilter - search filter\r\n * @param {Object} stats - selector status\r\n * @returns {Promise} result promise\r\n */\r\n get(viewFilter, searchFilter, stats) {\r\n let ids = this.lastIds || [];\r\n\r\n if (this.lastViewFilter !== viewFilter) {\r\n if (viewFilter === Selector.ViewFilter.selected) {\r\n ids = stats.checked.concat(stats.indeterminate).map(({ id }) => id);\r\n } else if (viewFilter === Selector.ViewFilter.changed) {\r\n ids = _.map(\r\n _.keys(_.extend({}, stats.changed, stats.added)),\r\n id => Number.parseInt(id, 10)\r\n );\r\n } else {\r\n ids = [];\r\n }\r\n this.lastIds = ids;\r\n this.lastViewFilter = viewFilter;\r\n }\r\n\r\n return getLabels(_.extend(\r\n {}, this.options,\r\n { itemsDisplayLimit: this.itemsDisplayLimit + 1, searchFilter, ids }\r\n ));\r\n }\r\n\r\n /**\r\n * get label by ids\r\n *\r\n * @param {Array[]} ids - ids to fetch, when empty, will return empty result\r\n * @returns {Promise} result promise\r\n */\r\n getByIds(ids) {\r\n if (ids && ids.length > 0) {\r\n return getLabels(_.extend(\r\n {}, this.options,\r\n { itemsDisplayLimit: this.itemsDisplayLimit + 1, searchFilter: undefined, ids }\r\n ));\r\n }\r\n\r\n return Promise.resolve([]);\r\n }\r\n}\r\n","import ko from 'knockout';\r\n\r\nexport default class ViewModel {\r\n constructor() {\r\n this.hasData = ko.observable(false);\r\n this.loaded = ko.observable(false);\r\n this.hasChanges = ko.observable(false);\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport Promise from 'bluebird';\r\nimport { PureKnockoutView } from '@bingads-webui/knockout-view';\r\nimport { DeterministicViewForBackBoneView } from '@bingads-webui/deterministic-wrapper-view';\r\nimport { Selector } from '@bingads-webui/selector';\r\nimport template from './template.pug';\r\nimport { LabelsDataSource } from '../util/labels-data-source';\r\nimport ViewModel from './selector-viewmodel';\r\nimport labelNameTemplate from '../shared/label-name-template.pug';\r\nimport checkboxTemplate from './row.checked.pug';\r\n\r\n/**\r\n * create event - When create menu clicked, it fires with current status.\r\n *\r\n * @event LabelsSelectorView#create\r\n * @type {void}\r\n */\r\n\r\n/**\r\n * cancel event - When cancel button clicked, it fires cancel event.\r\n *\r\n * @event LabelsSelectorView#cancel\r\n * @type {void}\r\n */\r\n\r\n/**\r\n * cancel event - When apply menu clicked, it fires apply event.\r\n *\r\n * @event LabelsSelectorView#apply\r\n * @type {void}\r\n */\r\n\r\n/**\r\n * cancel event - When apply menu clicked, it fires apply event.\r\n *\r\n * @event LabelsSelectorView#apply\r\n * @type {void}\r\n */\r\n\r\n/**\r\n * load:data event - after data loaded, it fires the event.\r\n *\r\n * @event LabelsSelectorView#load:data\r\n * @type {void}\r\n */\r\n\r\n/**\r\n * change:selection event - after data loaded, it fires the event.\r\n *\r\n * @event LabelsSelectorView#change:selection\r\n * @type {void}\r\n */\r\n\r\n/**\r\n * LabelsSelectorView: label selector view created based on selector\r\n * Trigger event LabelsSelectorView#create\r\n * Trigger event LabelsSelectorView#cancel\r\n * Trigger event LabelsSelectorView#apply\r\n * Trigger event LabelsSelectorView# change:selection\r\n * Trigger event LabelsSelectorView#load:data\r\n */\r\nexport class LabelsSelectorView extends PureKnockoutView {\r\n /**\r\n * Initilize labels selector view settings\r\n *\r\n * @param {Object} param - An object containing these default options for view:\r\n * @param {Object} param.dataSource - the datasource for fetching labels, nullable\r\n * @param {Function} param.dataSource.get - the function that will trigger labels retrival\r\n * @param {Object} param.checkAll - whether to mark all as selected\r\n * @param {Object} param.i18n - the localization settings\r\n * @param {Function} param.i18n.getString - localization settings function\r\n * @param {String} param.jsdata - jsdata which will be used in labelsDatasource\r\n * @param {Object} param.dataContextManager - dataContextManager\r\n * @param {Function} param.dataContextManager.getContext - getContext for request\r\n * @param {Object} param.cacheService - cacheService\r\n * @param {Function} param.cacheService.cache - cache function\r\n * @param {boolean} param.customerLevelLabelEnabled\r\n * - true if the customer level label feature is enabled\r\n * @returns {void} void\r\n */\r\n initialize({\r\n dataSource = null,\r\n checkAll = false,\r\n checkMap = {},\r\n i18n = { getString: _.Identity },\r\n jsdata,\r\n dataContextManager,\r\n cacheService,\r\n edm,\r\n scope,\r\n isForVNext = false,\r\n customerLevelLabelEnabled = false,\r\n useSubMenu = false,\r\n }) {\r\n this.options = {\r\n dataSource: dataSource == null ?\r\n new LabelsDataSource({\r\n jsdata,\r\n dataContextManager,\r\n cacheService,\r\n edm,\r\n scope,\r\n customerLevelLabelEnabled,\r\n }) :\r\n dataSource,\r\n checkAll,\r\n checkMap,\r\n i18n,\r\n customerLevelLabelEnabled,\r\n useSubMenu,\r\n };\r\n\r\n this.isForVNext = isForVNext;\r\n\r\n super.initialize(this.options);\r\n\r\n this.initializeSelector();\r\n }\r\n\r\n get ViewModel() {\r\n return ViewModel;\r\n }\r\n\r\n get events() {\r\n return {\r\n 'click .action': this.onAction,\r\n };\r\n }\r\n\r\n get template() {\r\n return ({ model }) => template(_.extend({ useSubMenu: this.options.useSubMenu }, model, { i18n: this.options.i18n }));\r\n }\r\n\r\n get className() {\r\n return 'labels-selector dropdown-menu';\r\n }\r\n\r\n initializeSelector() {\r\n this.selector = new Selector({\r\n checkboxTemplate,\r\n isForVNext: this.isForVNext,\r\n busyIndicator: {\r\n enabled: true,\r\n showAfterMs: 0,\r\n showForMs: 200,\r\n },\r\n data: {\r\n checkAll: this.options.checkAll,\r\n checkMap: this.options.checkMap,\r\n itemsDisplayLimit: this.options.dataSource.itemsDisplayLimit,\r\n },\r\n filter: {\r\n showSelected: false,\r\n showChanged: false,\r\n },\r\n i18n: this.options.i18n,\r\n styles: {\r\n searchIcon: this.isForVNext ?\r\n ['iconba', 'iconba-Search'] :\r\n ['glyphicon', 'filter_search_icon_small'],\r\n ariaLabel: this.options.i18n.getString('Label dropdown selector'),\r\n searchBoxAriaLabel: this.options.i18n.getString('Search by label name'),\r\n list: ['table--fixed-layout', 'table--no-border', 'table--no-header'],\r\n listAttributes: { role: 'presentation' },\r\n checkboxColumn: ['table__cell--menu-item-style', 'table__cell--icon', 'legacy-label-selector-checkbox', 'clickable'],\r\n checkboxAttributes: { role: 'checkbox', tabindex: 0 },\r\n nameColumn: ['table__cell--menu-item-style', 'table__cell--ellipsis-overflow'],\r\n },\r\n templates: this.getSelectorTemplates(),\r\n });\r\n\r\n const thiss = this;\r\n\r\n this.selector.on('request:data', ({ viewFilter, searchFilter, stats }) => {\r\n thiss.trigger('request:data:beginning');\r\n\r\n const itemsOrPromise = thiss.options.dataSource.get(viewFilter, searchFilter, stats);\r\n\r\n Promise.resolve(itemsOrPromise).finally(() => thiss.trigger('request:data:finished'));\r\n\r\n thiss.selector.setData(itemsOrPromise);\r\n });\r\n\r\n this.selector.on('load:data', (data) => {\r\n if (!this.viewModel.loaded()) {\r\n this.viewModel.hasData(data.hasData);\r\n }\r\n this.viewModel.loaded(true);\r\n this.trigger('load:data', data);\r\n });\r\n\r\n this.selector.on('change:selection', (stats) => {\r\n this.viewModel.hasChanges(stats.hasChanges());\r\n this.trigger('change:selection', stats);\r\n });\r\n\r\n const selectorViewDeterministic = new DeterministicViewForBackBoneView({ view: this.selector });\r\n this.setChild('selectorView', selectorViewDeterministic);\r\n }\r\n\r\n setCheckMap(checkMap) {\r\n this.selector.setCheckMap(checkMap);\r\n }\r\n\r\n rerender() {\r\n this.selector.rerender();\r\n }\r\n\r\n onAction(event) {\r\n const action = event.currentTarget.attributes['data-action'].value;\r\n const stats = this.selector.getStats();\r\n\r\n this.trigger(action, action, stats);\r\n }\r\n\r\n remove() {\r\n if (this.selector) {\r\n this.selector.remove();\r\n this.selector = null;\r\n }\r\n super.remove();\r\n }\r\n\r\n getSelectorTemplates() {\r\n return this.options.customerLevelLabelEnabled ? { nameTemplate: labelNameTemplate } : undefined;\r\n }\r\n}\r\n\r\nLabelsSelectorView.ViewFilter = Selector.ViewFilter;\r\nLabelsSelectorView.CheckState = Selector.CheckState;\r\nLabelsSelectorView.CheckTransition = Selector.CheckTransition;\r\nLabelsSelectorView.statCheckMap = Selector.statCheckMap;\r\n","import _ from 'underscore';\r\nimport ko from 'knockout';\r\nimport { PureKnockoutView } from '@bingads-webui/knockout-view';\r\nimport { KoSchema } from '@bingads-webui/ko-schema';\r\nimport { toDec } from '@bingads-webui-universal/primitive-utilities';\r\nimport template from './create-template.pug';\r\n\r\n/**\r\n * create event - When save button clicked, it fires with the new label settings\r\n *\r\n * @event CreateLabelView#create\r\n * @type {void}\r\n*/\r\n\r\n/**\r\n * cancel event - When cancel button clicked, it fires cancel event.\r\n *\r\n * @event CreateLabelView#cancel\r\n * @type {void}\r\n */\r\n\r\n/**\r\n * CreateLabelView: label create view\r\n * Trigger event CreateLabelView#create\r\n * Trigger event CreateLabelView#cancel\r\n*/\r\nexport class CreateLabelView extends PureKnockoutView {\r\n /**\r\n * Initialize view settings\r\n *\r\n * @param {Object} param - An object containing these default options for view:\r\n * @param {Object} param.i18n - the localization settings\r\n * @param {Object} param.i18n.getString - localization settings function\r\n * @param {Object} param.s$label - schema for label\r\n * @param {Object} param.i18nErrors - odata error settings\r\n * @param {Object} param.i18nErrors.getODataErrors - function to convert odataerrors\r\n * @returns {void} void\r\n */\r\n initialize({\r\n s$label,\r\n i18n,\r\n i18nErrors,\r\n isForVNext = false,\r\n }) {\r\n this.options = {\r\n s$label,\r\n i18n,\r\n i18nErrors,\r\n isForVNext,\r\n };\r\n\r\n super.initialize(this.options);\r\n\r\n const {\r\n instance, schema, keys, model, customValidators,\r\n } = {\r\n instance: this.viewModel,\r\n schema: s$label,\r\n keys: ['Name'],\r\n model: {},\r\n };\r\n\r\n KoSchema(instance, schema, keys, model, customValidators, i18n);\r\n }\r\n\r\n get className() {\r\n return 'create-label';\r\n }\r\n\r\n get events() {\r\n return {\r\n 'click .create-label__action[data-action=\"create\"]': this.onCreate,\r\n 'click .create-label__action[data-action=\"cancel\"]': this.onCancel,\r\n };\r\n }\r\n\r\n get template() {\r\n return ({ model }) => template(_.extend({}, model, {\r\n i18n: this.options.i18n,\r\n isForVNext: this.options.isForVNext,\r\n }));\r\n }\r\n\r\n /**\r\n * Set errors for create view, view will update the message accordingly\r\n *\r\n * @param {Array[]} errors - errors for the view\r\n * @returns {void}\r\n */\r\n setErrors(errors) {\r\n this.viewModel.errors.add(this.options.i18nErrors.getODataErrors(errors));\r\n }\r\n\r\n\r\n /**\r\n * Fires create event after click apply button\r\n *\r\n * @fires CreateLabelView#create\r\n * @returns {void}\r\n */\r\n onCreate() {\r\n const isValid = this.viewModel.Name.validate();\r\n\r\n if (isValid) {\r\n const dto = ko.toJS(this.viewModel);\r\n\r\n this.trigger('create', {\r\n Name: dto.Name,\r\n Description: '',\r\n ColorCode: toDec(`#${Math.random().toString(16).slice(-6)}`),\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Fires cancel event after click cancel button\r\n *\r\n * @fires CreateLabelView#cancel\r\n * @returns {void}\r\n */\r\n onCancel() {\r\n this.trigger('cancel');\r\n }\r\n}\r\n","import $ from 'jquery';\r\nimport { edmCampaign } from '@bingads-webui/edm-campaign';\r\nimport { getEntitySet } from './get-entity-set';\r\n\r\nfunction initCreateInstrumentationActivity(instrumentation) {\r\n const senario = instrumentation.label.create();\r\n const createActivity = senario.createLabel.create();\r\n\r\n return createActivity;\r\n}\r\n\r\n/**\r\n* Create label\r\n *\r\n * @param {Object} param - An object containing these default options\r\n * @param {Object} param.jsdata - jsdata which will be used in labelsDatasource\r\n * @param {Object} param.label - the label to be created\r\n * @param {String} param.instrumentation - instrumentation that already intilized\r\n * and which should contains the senario of label and activity of createLabel\r\n * @param {Object} param.edm - the edm reference\r\n * @param {Object} param.scope - the scope reference\r\n * @returns {Promise} result promise\r\n*/\r\nexport function create({\r\n jsdata,\r\n label,\r\n instrumentation,\r\n edm,\r\n scope,\r\n}) {\r\n const createActivity = initCreateInstrumentationActivity(instrumentation);\r\n const entitySet = getEntitySet(scope, edm, $, edmCampaign);\r\n return createActivity.monitorAsync(jsdata.Label.create(label, {\r\n cacheResponse: false,\r\n entitySet,\r\n }));\r\n}\r\n","const azureUrls = ['ads.microsoft.com', 'ads-int.microsoft.com'];\r\nconst isAzureEnv = ({ hostname, protocol }) => protocol.toLowerCase().indexOf('https') === 0 &&\r\nazureUrls.some(url => hostname.toLowerCase().indexOf(url) > -1);\r\n\r\nexport function getODataPath(location) {\r\n return isAzureEnv(location) ? 'Campaign/V2' : 'Advertiser/V2';\r\n}\r\n\r\nexport function getConfig() {\r\n return {\r\n odataPath: getODataPath(window.location),\r\n };\r\n}\r\n","import _ from 'underscore';\r\n\r\nimport { withUiBlock } from '@bingads-webui/uiblocker';\r\nimport { DeterministicView, helpers } from '@bingads-webui/deterministic-view';\r\n\r\n/* @this BaseCard */\r\nfunction cardReady() {\r\n if (!this.perfMarkerCompleted) {\r\n this.unblockCard();\r\n this.perfMarker.done({ IsCardInViewPort: this.isInViewPort === true });\r\n this.perfMarkerCompleted = true;\r\n this.trigger('cardReady', this.typeId);\r\n if (this.onCardReady) {\r\n this.onCardReady(this.typeId);\r\n }\r\n }\r\n}\r\n\r\nlet i18n;\r\nlet eventDispatcher;\r\n\r\nexport class BaseCard extends DeterministicView {\r\n constructor(options) {\r\n i18n = options.deps.i18n; // eslint-disable-line\r\n eventDispatcher = options.deps.eventDispatcher; // eslint-disable-line\r\n super(_.extend({}, options, { renderInSync: true }));\r\n this.deps = options.deps;\r\n this.container = options.container;\r\n this.typeId = options.typeId;\r\n this.isInViewPort = options.isInViewPort;\r\n this.onCardReady = options.onCardReady;\r\n this.initPerfMarker(options);\r\n\r\n this.on('attached', () => {\r\n this.attached = true;\r\n if (this.finishedRender) {\r\n cardReady.call(this);\r\n } else {\r\n this.blockCard();\r\n }\r\n });\r\n }\r\n\r\n initPerfMarker({ perfMarker, name }) {\r\n if (!this.perfMarker) {\r\n this.perfMarker = perfMarker.createChild(name);\r\n this.perfMarker.willInit();\r\n this.perfMarkerCompleted = false;\r\n }\r\n }\r\n\r\n willRenderWithData() {\r\n if (!this.perfMarkerCompleted) {\r\n this.perfMarker.willRender();\r\n }\r\n }\r\n\r\n willFetchData() {\r\n if (!this.perfMarkerCompleted) {\r\n this.perfMarker.willFetchData();\r\n }\r\n }\r\n\r\n renderedWithData() {\r\n this.finishedRender = true;\r\n if (this.attached) {\r\n cardReady.call(this);\r\n }\r\n }\r\n\r\n blockCard(el = this.el) {\r\n if (!this.unblock) {\r\n if (document.documentElement.contains(el)) {\r\n this.unblock = withUiBlock(el, i18n.getString('Loading'), true, undefined, 10);\r\n } else if (document.documentElement.contains(_.first(this.container))) {\r\n this.unblock = withUiBlock(this.container, i18n.getString('Loading'), true, undefined, 10);\r\n }\r\n }\r\n }\r\n\r\n isSmartShoppingCampaign() {\r\n const { currentCampaign } = this.options;\r\n return currentCampaign && (currentCampaign.CampaignSubType === 12 || currentCampaign.CampaignSubType === 'ShoppingSmartAds');\r\n }\r\n\r\n unblockCard() {\r\n if (this.unblock) {\r\n this.unblock();\r\n this.unblock = null;\r\n }\r\n }\r\n\r\n updateState(patch) {\r\n if (patch.requestingHelp) {\r\n this.$('.hiddenHelpBridge')[0].click();\r\n }\r\n return helpers.updateView(this, patch);\r\n }\r\n\r\n onResize(callback) {\r\n this.windowResizeHandler = _.throttle(callback, 100);\r\n this.wunderbarCallback = callback;\r\n window.addEventListener('resize', this.windowResizeHandler);\r\n eventDispatcher.on('wunderbar.collapsed', this.wunderbarCallback);\r\n eventDispatcher.on('wunderbar.expanded', this.wunderbarCallback);\r\n }\r\n\r\n remove() {\r\n if (this.windowResizeHandler) {\r\n window.removeEventListener('resize', this.windowResizeHandler);\r\n }\r\n\r\n if (this.wunderbarCallback) {\r\n eventDispatcher.off('wunderbar.collapsed', this.wunderbarCallback);\r\n eventDispatcher.off('wunderbar.expanded', this.wunderbarCallback);\r\n }\r\n\r\n this.unblockCard();\r\n\r\n super.remove();\r\n }\r\n}\r\n","export const TopChangesFilterOption = {\r\n AllChanges: 'AllChanges',\r\n TopDecliners: 'TopDecliners',\r\n TopGainers: 'TopGainers',\r\n Insights: 'Insights',\r\n};\r\n\r\nexport const TopChangesFilterSortOptionMap = {\r\n [TopChangesFilterOption.AllChanges]: 'Absolute',\r\n [TopChangesFilterOption.TopGainers]: 'Gain',\r\n [TopChangesFilterOption.TopDecliners]: 'Decline',\r\n [TopChangesFilterOption.Insights]: 'Insight',\r\n};\r\n\r\nexport const AccountsMode = {\r\n Smart: 0,\r\n Expert: 1,\r\n};\r\n\r\nexport const ConversionFilterOption = {\r\n AllChanges: 'AllChanges',\r\n TopDecliners: 'TopDecliners',\r\n TopGainers: 'TopGainers',\r\n};\r\n\r\nexport const ConversionFilterSortOptionMap = {\r\n AllChanges: 'Absolute',\r\n TopGainers: 'Gain',\r\n TopDecliners: 'Decline',\r\n};\r\n","import _ from 'underscore';\r\nimport $ from 'jquery';\r\nimport { AccountUtils } from '@bingads-webui-clientcenter/entity-utils';\r\n\r\nimport { AccountsMode } from './constants';\r\n\r\nexport const changeEvents = (...attributes) => _.map(attributes, attr => `change:${attr}`).join(' ');\r\n\r\nexport function formatDate(date) {\r\n const year = date.getFullYear();\r\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\r\n const day = date.getDate().toString().padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n}\r\n\r\nexport function getFilteredTotalsMetrics({\r\n data,\r\n metric,\r\n}) {\r\n if (data.raw) {\r\n const filteredTotals = data.raw['@ns.filtered.totals'];\r\n\r\n if (filteredTotals && filteredTotals[metric]) {\r\n return filteredTotals[metric];\r\n }\r\n\r\n const unfilteredTotals = data.raw['@ns.unfiltered.totals'];\r\n\r\n if (unfilteredTotals && unfilteredTotals[metric]) {\r\n return unfilteredTotals[metric];\r\n }\r\n } else if (data.OverallTotals) {\r\n if (data.DeviceSegmentedPerformanceData && data.DeviceSegmentedPerformanceData[metric]) {\r\n // eslint-disable-next-line no-param-reassign\r\n data.OverallTotals[metric] = _.extend(\r\n {},\r\n data.OverallTotals[metric],\r\n {\r\n SegmentedData: data.DeviceSegmentedPerformanceData[metric].SegmentedData,\r\n }\r\n );\r\n }\r\n return data.OverallTotals[metric];\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction upperLevelNavigation(entitySet) {\r\n return entitySet.navigation.source.navigation;\r\n}\r\n\r\nexport function coerceStatus(status, AccountInactiveReasons) {\r\n if (AccountInactiveReasons) {\r\n const {\r\n activityStatus,\r\n } = AccountUtils;\r\n return activityStatus({ AccountInactiveReasons });\r\n }\r\n\r\n // Here we are coercing status for both Campaigns and Adgroups for status template.\r\n // This must match what we do in Campaign and Ad-group grid.\r\n // So we are showing 'CampaignUserPaused', 'CampaignBudgetPaused' and 'CampaignBudgetUserPaused'\r\n // as active for adgroups.\r\n if (_.contains([\r\n 'UserPaused',\r\n 'BudgetUserPaused',\r\n ], status)) {\r\n return 'Paused';\r\n }\r\n\r\n return status;\r\n}\r\n\r\nexport function entityHash({\r\n id,\r\n typeName,\r\n entitySet,\r\n navigationLevel,\r\n adGroup,\r\n campaign,\r\n isSmartCampaign,\r\n status,\r\n pageContext,\r\n legacyRouter,\r\n}) {\r\n let hash;\r\n const {\r\n CurrentUser: {\r\n Id: uid,\r\n },\r\n CurrentCustomer: {\r\n Id: cid,\r\n },\r\n CurrentAccount: {\r\n Id: aid,\r\n },\r\n } = pageContext;\r\n\r\n switch (typeName) {\r\n case 'Account':\r\n // eslint-disable-next-line camelcase\r\n hash = legacyRouter.getRouteUrl('account_$summary', { account_id: id });\r\n break;\r\n case 'Campaign':\r\n if (isSmartCampaign) {\r\n if (status === 'InProgress') {\r\n hash = `/Campaign/Smart?uid=${uid}&aid=${aid}&cid=${cid}#/CreateCampaign/${id}`;\r\n } else {\r\n hash = `/Campaign/Smart?uid=${uid}&aid=${aid}&cid=${cid}#/campaign/${id}`;\r\n }\r\n } else {\r\n // eslint-disable-next-line camelcase\r\n hash = legacyRouter.getRouteUrl('campaign_$summary', { campaign_id: id });\r\n }\r\n break;\r\n case 'AdGroup':\r\n // eslint-disable-next-line camelcase\r\n hash = legacyRouter.getRouteUrl('adgroup_$summary', {\r\n campaign_id: upperLevelNavigation(entitySet).key,\r\n adgroup_id: id,\r\n });\r\n break;\r\n case 'Keyword':\r\n if (navigationLevel === 'account') {\r\n hash = legacyRouter.getRouteUrl('keyword');\r\n } else {\r\n // eslint-disable-next-line camelcase\r\n hash = legacyRouter.getRouteUrl('adgroup_keyword', { campaign_id: campaign.Id, adgroup_id: adGroup.Id });\r\n }\r\n break;\r\n case 'SearchTerm':\r\n if (navigationLevel === 'account') {\r\n hash = legacyRouter.getRouteUrl('keyword_search_term');\r\n } else {\r\n // eslint-disable-next-line camelcase\r\n hash = legacyRouter.getRouteUrl('campaign_keyword_search_term', { campaign_id: campaign.Id });\r\n }\r\n break;\r\n default:\r\n hash = '';\r\n }\r\n\r\n return hash;\r\n}\r\n\r\nexport function getEntityIds({\r\n typeName,\r\n id,\r\n entitySet,\r\n campaign,\r\n adGroup,\r\n}) {\r\n let campaignId = '';\r\n let adgroupId = '';\r\n let accountId = '';\r\n\r\n switch (typeName) {\r\n case 'Account':\r\n accountId = id;\r\n break;\r\n case 'Campaign':\r\n campaignId = id;\r\n break;\r\n case 'AdGroup':\r\n adgroupId = id;\r\n campaignId = upperLevelNavigation(entitySet).key;\r\n break;\r\n case 'Keyword':\r\n case 'SearchTerm':\r\n campaignId = campaign.Id;\r\n adgroupId = adGroup.Id;\r\n break;\r\n default:\r\n }\r\n\r\n return {\r\n campaignId,\r\n adgroupId,\r\n accountId,\r\n };\r\n}\r\n\r\nfunction saveToFilterStorage({\r\n entityType,\r\n text,\r\n createEditableFilterStorage,\r\n}) {\r\n const filterStorage = createEditableFilterStorage(entityType);\r\n\r\n filterStorage.save({\r\n id: null,\r\n name: null,\r\n query: {\r\n Text: {\r\n $eq: text,\r\n },\r\n },\r\n });\r\n}\r\n\r\nexport function navigateToEntity({\r\n event,\r\n pageContext,\r\n legacyRouter,\r\n createEditableFilterStorage,\r\n instrumentation,\r\n constants,\r\n cardType,\r\n}) {\r\n const typeName = $(event.currentTarget).data('type');\r\n const navigationLevel = $(event.currentTarget).data('navigationlevel');\r\n\r\n instrumentation.logMessage([constants.LOGCATEGORY.TRACE], constants.LOGLEVEL.INFO, cardType, `${navigationLevel} level ${typeName} type entity link clicked.`);\r\n\r\n if (event && (event.button !== 0 ||\r\n event.ctrlKey ||\r\n event.shiftKey ||\r\n event.altKey ||\r\n event.metaKey)) {\r\n return true;\r\n }\r\n const campaignId = $(event.currentTarget).data('campaignid');\r\n const adgroupId = $(event.currentTarget).data('adgroupid');\r\n const text = $(event.currentTarget).data('text');\r\n const campaignType = $(event.currentTarget).data('campaigntype');\r\n const rawStatus = $(event.currentTarget).data('rawstatus');\r\n const {\r\n CurrentCustomer: {\r\n Id: cid,\r\n },\r\n CurrentUser: {\r\n Id: uid,\r\n },\r\n } = pageContext;\r\n let returnValue = false;\r\n\r\n switch (typeName) {\r\n case 'Account': {\r\n const accountId = $(event.currentTarget).data('accountid');\r\n // eslint-disable-next-line camelcase\r\n window.location.href = legacyRouter.getRouteUrl('account_$summary', { account_id: accountId });\r\n break;\r\n }\r\n case 'Campaign': {\r\n const {\r\n CurrentAccount: {\r\n Id: aid,\r\n },\r\n } = pageContext;\r\n if (campaignType === 'Smart') {\r\n if (rawStatus === 'InProgress') {\r\n window.location.href = `/Campaign/Smart?uid=${uid}&cid=${cid}&aid=${aid}#/CreateCampaign/${campaignId}`;\r\n } else {\r\n window.location.href = `/Campaign/Smart?uid=${uid}&cid=${cid}&aid=${aid}#/campaign/${campaignId}`;\r\n }\r\n } else {\r\n // eslint-disable-next-line camelcase\r\n legacyRouter.navigateToRoute('campaign_$summary', { campaign_id: campaignId });\r\n }\r\n break;\r\n }\r\n case 'AdGroup':\r\n // eslint-disable-next-line camelcase\r\n legacyRouter.navigateToRoute('adgroup_$summary', { campaign_id: campaignId, adgroup_id: adgroupId });\r\n break;\r\n case 'Keyword':\r\n saveToFilterStorage({\r\n entityType: 'keyword',\r\n text,\r\n createEditableFilterStorage,\r\n });\r\n if (navigationLevel === 'account') {\r\n legacyRouter.navigateToRoute('keyword');\r\n } else {\r\n // eslint-disable-next-line camelcase\r\n legacyRouter.navigateToRoute('campaign_keyword', { campaign_id: campaignId });\r\n }\r\n break;\r\n case 'SearchTerm':\r\n saveToFilterStorage({\r\n entityType: 'searchTerm',\r\n text,\r\n createEditableFilterStorage,\r\n });\r\n if (navigationLevel === 'account') {\r\n legacyRouter.navigateToRoute('keyword_search_term');\r\n } else {\r\n // eslint-disable-next-line camelcase\r\n legacyRouter.navigateToRoute('campaign_keyword_search_term', { campaign_id: campaignId });\r\n }\r\n break;\r\n default:\r\n returnValue = true;\r\n }\r\n\r\n return returnValue;\r\n}\r\n\r\nexport function getLocalizedSupportLink(pageContext) {\r\n const culture = pageContext.Culture.toLowerCase();\r\n\r\n // Default to en-us.\r\n let consultationLink = 'https://help.ads.microsoft.com/apex/index/3/en-us/60029';\r\n let coachingLink = 'https://advertise.bingads.microsoft.com/en-us/resources/support/coaching';\r\n\r\n // Get culture specific pages if we have one.\r\n switch (culture) {\r\n case 'en-gb':\r\n consultationLink = 'https://help.ads.microsoft.com/apex/index/3/en-gb/60029';\r\n coachingLink = 'https://advertise.bingads.microsoft.com/en-gb/resources/support/coaching';\r\n break;\r\n case 'fr-fr':\r\n consultationLink = 'https://help.ads.microsoft.com/apex/index/3/fr-fr/60029';\r\n coachingLink = 'https://advertise.bingads.microsoft.com/fr-fr/ressources/support/un-coach-pour-demarrer';\r\n break;\r\n case 'de-de':\r\n consultationLink = 'https://help.ads.microsoft.com/apex/index/3/de-de/60029';\r\n coachingLink = 'https://advertise.bingads.microsoft.com/de-de/Ressourcen/support/coaching';\r\n break;\r\n case 'en-au':\r\n consultationLink = 'https://help.ads.microsoft.com/apex/index/3/en-au/60029';\r\n coachingLink = 'https://advertise.bingads.microsoft.com/en-au/resources/support/coaching';\r\n break;\r\n case 'en-nz':\r\n consultationLink = 'https://help.ads.microsoft.com/apex/index/3/en-nz/60029';\r\n coachingLink = 'https://advertise.bingads.microsoft.com/en-nz/resources/support/coaching';\r\n break;\r\n case 'pt-br':\r\n consultationLink = 'https://help.ads.microsoft.com/apex/index/3/pt-br/60029';\r\n coachingLink = 'https://advertise.bingads.microsoft.com/pt-br/recursos/suporte/coaching';\r\n break;\r\n case 'it-it':\r\n consultationLink = 'https://help.ads.microsoft.com/apex/index/3/it-it/60029';\r\n coachingLink = 'https://advertise.bingads.microsoft.com/it-it/risorse/supporto-di/coaching';\r\n break;\r\n case 'nl-nl':\r\n consultationLink = 'https://help.ads.microsoft.com/apex/index/3/nl-nl/60029';\r\n coachingLink = 'https://advertise.bingads.microsoft.com/nl-nl/hulpmiddelen/ondersteuning/coaching';\r\n break;\r\n case 'en-in':\r\n consultationLink = 'https://help.ads.microsoft.com/apex/index/3/en-in/60029';\r\n coachingLink = 'https://advertise.bingads.microsoft.com/en-in/resources/support/coaching';\r\n break;\r\n case 'es-es':\r\n consultationLink = 'https://help.ads.microsoft.com/apex/index/3/es-es/60029';\r\n coachingLink = 'https://advertise.bingads.microsoft.com/es-es/recursos/soporte/coaching';\r\n break;\r\n default:\r\n if (culture.indexOf('es') !== -1) {\r\n consultationLink = 'https://help.ads.microsoft.com/apex/index/3/es-mx/60029';\r\n coachingLink = 'https://advertise.bingads.microsoft.com/es-mx/recursos/soporte/coaching';\r\n }\r\n }\r\n\r\n return {\r\n consultationLink: `${consultationLink}?id=optimization-consultation-tip`,\r\n coachingLink: `${coachingLink}?id=onboarding-consultation-tip`,\r\n };\r\n}\r\n\r\nfunction periodDurationIn(dateUtil, { start, end } = {}, max, min = 0) {\r\n if (!_.isDate(start) || !_.isDate(end)) {\r\n return true;\r\n }\r\n\r\n const duration = dateUtil.diff(start, end, 'day');\r\n\r\n return duration >= min && duration <= max;\r\n}\r\n\r\nfunction periodFit(dateUtil, period, max, min = 0) {\r\n return periodDurationIn(dateUtil, period, max, min) &&\r\n periodDurationIn(dateUtil, period.compared || {}, max);\r\n}\r\n\r\nexport function availableGranularities(period = {}, dateUtil, accountsMode = AccountsMode.Expert) {\r\n const {\r\n comparativePeriod = {},\r\n } = period;\r\n\r\n const result = [];\r\n\r\n const hourlyStartDate = new Date();\r\n\r\n hourlyStartDate.setMonth(hourlyStartDate.getMonth() - 6);\r\n\r\n if (periodFit(dateUtil, period, 0)) {\r\n if (periodFit(dateUtil, {\r\n start: hourlyStartDate,\r\n end: period.start,\r\n compared: {\r\n start: hourlyStartDate,\r\n end: comparativePeriod.end,\r\n },\r\n }, Infinity) && accountsMode === AccountsMode.Expert) {\r\n result.push('Hour');\r\n } else {\r\n // we only support hourly data for a sliding 6 months window\r\n result.push('Day');\r\n }\r\n }\r\n\r\n if (periodFit(dateUtil, period, 30, 1)) {\r\n result.push('Day');\r\n }\r\n\r\n if (periodFit(dateUtil, period, 210, 7)) {\r\n result.push('Week');\r\n }\r\n\r\n if (periodFit(dateUtil, period, 900, 31)) {\r\n result.push('Month');\r\n }\r\n\r\n if (periodDurationIn(dateUtil, period, Infinity, 90)) {\r\n result.push('Quarter');\r\n }\r\n\r\n return result;\r\n}\r\nexport const getPopDescription = (i18n, comparisonDateRange) => {\r\n let comparisonDateRangeDateRangeText;\r\n let comparisonText;\r\n\r\n if (comparisonDateRange.rangeInDays <= 7) {\r\n comparisonText = i18n.getString('Dashboard_TopChanges_Period_LastWeek');\r\n } else {\r\n comparisonText = i18n.getString('Dashboard_TopChanges_Period_Previous_Period');\r\n }\r\n\r\n // eslint-disable-next-line no-param-reassign\r\n comparisonDateRange.formattedStart = i18n.formatDate(comparisonDateRange.start);\r\n // eslint-disable-next-line no-param-reassign\r\n comparisonDateRange.formattedEnd = i18n.formatDate(comparisonDateRange.end);\r\n\r\n if (comparisonDateRange.formattedStart === comparisonDateRange.formattedEnd) {\r\n comparisonDateRangeDateRangeText = `(${comparisonDateRange.formattedStart})`;\r\n } else {\r\n comparisonDateRangeDateRangeText = `(${comparisonDateRange.formattedStart} - ${comparisonDateRange.formattedEnd})`;\r\n }\r\n\r\n let comparisonDateRangeDescription = comparisonText.toLowerCase();\r\n\r\n if (comparisonDateRange.key === 'customPeriod') {\r\n comparisonDateRangeDescription = '';\r\n }\r\n\r\n return `${i18n.getString('Dashboard_TopChanges_Period_Comparison')}${comparisonDateRangeDescription} ${comparisonDateRangeDateRangeText}`;\r\n};\r\n","import _ from 'underscore';\r\nimport { applyPartialConversionColumnName } from '@bingads-webui-campaign/column-conversions';\r\nimport { AccountsMode } from './constants';\r\nimport { cardPerformanceId, cardTopCampaignsId } from '../../fluent-page-consts';\r\n\r\nconst allMetrics = (permissions = {}, accountsMode = AccountsMode.Expert, campaignType = null) => {\r\n const { AppCampaignNewCampaignGridColumns } = permissions.dynamic || {};\r\n const isAppCampaign = AppCampaignNewCampaignGridColumns && (campaignType === 128 || campaignType === 'App');\r\n const isAllCampaigns = AppCampaignNewCampaignGridColumns && campaignType === 65535;\r\n if (accountsMode === AccountsMode.Expert) {\r\n return applyPartialConversionColumnName(\r\n permissions,\r\n _.compact([\r\n 'Clicks',\r\n 'Impressions',\r\n 'CTR',\r\n 'AverageCPC',\r\n 'Spend',\r\n !permissions.IsAvgPositionDeprecationPhase2Enabled && 'AveragePosition',\r\n 'TopImpressionRate',\r\n 'AbsoluteTopImpressionRate',\r\n 'Conversions',\r\n 'ConversionRate',\r\n 'CPA',\r\n 'AdvertiserReportedRevenue',\r\n 'RevenueOnAdSpend',\r\n (isAppCampaign || isAllCampaigns) && 'Downloads',\r\n isAppCampaign && 'PostClickDownloadRate',\r\n isAppCampaign && 'CostPerDownload',\r\n (isAppCampaign || isAllCampaigns) && 'FirstLaunches',\r\n isAppCampaign && 'PostClickFirstLaunchRate',\r\n (isAppCampaign || isAllCampaigns) && 'CostPerFirstLaunch',\r\n isAppCampaign && 'Purchases',\r\n isAppCampaign && 'PostInstallPurchaseRate',\r\n isAppCampaign && 'CostPerPurchase',\r\n isAppCampaign && 'Subscriptions',\r\n isAppCampaign && 'PostInstallSubscriptionRate',\r\n isAppCampaign && 'CostPerSubscription',\r\n ])\r\n );\r\n }\r\n\r\n return [\r\n 'Clicks',\r\n 'Impressions',\r\n 'CTR',\r\n 'AverageCPC',\r\n 'Spend',\r\n 'Conversions',\r\n 'ConversionRate',\r\n 'CPA',\r\n ];\r\n};\r\n\r\n// Do we need a full list like this?\r\n// https://msasg.visualstudio.com/Bing_Ads/_git/AdsAppsCampaignUI?path=/private/component-new-grid/packages/campaignui-common-columns/src/strings.js&_a=contents&version=GBmaster\r\nconst metricToDisplayNameMap = {\r\n Clicks: _TL_('Clicks'),\r\n Impressions: _TL_('Impr.'),\r\n CTR: _TL_('CTR'),\r\n AverageCPC: _TL_('Avg. CPC'),\r\n Spend: _TL_('Spend'),\r\n AveragePosition: _TL_('Avg. pos.'),\r\n TopImpressionRate: _TL_('Top impr. rate'),\r\n AbsoluteTopImpressionRate: _TL_('Abs. top impr. rate'),\r\n Conversions: _TL_('Conv.'),\r\n ConversionRate: _TL_('Conv. rate'),\r\n CPA: _TL_('CPA'),\r\n AdvertiserReportedRevenue: _TL_('Revenue'),\r\n RevenueOnAdSpend: _TL_('Return on ad spend'),\r\n Downloads: _TL_('Downloads'),\r\n PostClickDownloadRate: _TL_('Post-click download rate'),\r\n CostPerDownload: _TL_('Cost per download'),\r\n FirstLaunches: _TL_('Installs'),\r\n PostClickFirstLaunchRate: _TL_('Post-click install rate'),\r\n CostPerFirstLaunch: _TL_('Cost per install'),\r\n Purchases: _TL_('Purchases'),\r\n PostInstallPurchaseRate: _TL_('Post-install purchase rate'),\r\n CostPerPurchase: _TL_('Cost per purchase'),\r\n Subscriptions: _TL_('Subscriptions'),\r\n PostInstallSubscriptionRate: _TL_('Post-install subscription rate'),\r\n CostPerSubscription: _TL_('Cost per subscription'),\r\n\r\n // when dynamic PartialConversions & ColumnConversion are true\r\n ConversionsCredit: _TL_('Conv.'),\r\n PartialConversionRate: _TL_('Conv. rate'),\r\n PartialConversionCPA: _TL_('CPA'),\r\n};\r\n\r\nconst UIToMTMetricNameMap = {\r\n Impressions: 'Impression',\r\n Clicks: 'Click',\r\n Spend: 'Spend',\r\n};\r\n\r\nconst metricSelect = (permissions, accountsMode = AccountsMode.Expert, campaignType) => _.map(\r\n allMetrics(permissions, accountsMode, campaignType),\r\n metric => `PerformanceMetrics/${metric}`\r\n).join(',');\r\n\r\nconst isInsightsMetric = UIMetric => _.contains(_.keys(UIToMTMetricNameMap), UIMetric);\r\n\r\nconst getInsightsMetric = (allowedMetric, UIMetric) =>\r\n _.filter(allowedMetric, MTMetric => MTMetric === UIToMTMetricNameMap[UIMetric]);\r\n\r\nconst getInsightsMetricFilterOption = metric => `Enum.FluctuationType'${UIToMTMetricNameMap[metric]}'`;\r\n\r\nconst defaultMetrics = (permissions = {}, accountsMode = AccountsMode.Expert) => {\r\n const metrics = ['Spend', 'Clicks', 'Conversions', 'Impressions'];\r\n\r\n if (accountsMode === AccountsMode.Expert) {\r\n return applyPartialConversionColumnName(\r\n permissions,\r\n metrics\r\n );\r\n }\r\n\r\n return metrics;\r\n};\r\n\r\n/**\r\n * This function filters unsupported metrics from dropdowns on the overview page, based on card and campaign types.\r\n * This ensures users can only select valid metrics, avoiding multiple API calls per page.\r\n */\r\nconst getUIMetrics = (metrics, campaignType = null, cardTypeId = null) => {\r\n const shouldExcludeAppMetrics = cardTypeId !== cardPerformanceId && cardTypeId !== cardTopCampaignsId;\r\n const isAllCampaignsScope = campaignType === 65535;\r\n const excludedMetrics = ['Downloads', 'FirstLaunches', 'CostPerFirstLaunch'];\r\n if (isAllCampaignsScope && shouldExcludeAppMetrics) {\r\n return metrics.filter(m => !excludedMetrics.includes(m.key));\r\n }\r\n return metrics;\r\n};\r\n\r\nexport {\r\n allMetrics,\r\n defaultMetrics,\r\n metricToDisplayNameMap,\r\n metricSelect,\r\n isInsightsMetric,\r\n getInsightsMetric,\r\n getInsightsMetricFilterOption,\r\n getUIMetrics,\r\n};\r\n","import _ from 'underscore';\r\nimport {\r\n Campaign,\r\n AdGroup,\r\n AssetGroup,\r\n SearchTerm,\r\n Keyword,\r\n} from '@bingads-webui-campaign/campaign-ui-schemas';\r\nimport { FilterEntity } from '@bingads-webui/filter-entity';\r\nimport { WaterfallFilterType, FilterStorageFactory } from '@bingads-webui-campaign/filter-storage';\r\nimport { flattenEntitySchema, buildNameToPropertyMapping } from '@bingads-webui/filter-schema';\r\nimport { addCampaignTypePropertyForFilter, baseEntitySchemaForAvailableInsightTypeIds, lambdaConvertForAvailableInsightTypeIds } from '@bingads-webui-campaign/common-grid-config';\r\nimport { getInsightsMetricFilterOption, isInsightsMetric } from './metrics';\r\n\r\nconst entitySchemaCopy = {};\r\n\r\nfunction getflattenEntitySchema(schemaName, permissions) {\r\n let entitySchema = entitySchemaCopy[schemaName];\r\n\r\n if (entitySchema) {\r\n return entitySchema;\r\n }\r\n\r\n switch (schemaName) {\r\n case 'SearchTerm':\r\n entitySchema = flattenEntitySchema(SearchTerm);\r\n addCampaignTypePropertyForFilter({ entitySchema, permissions });\r\n break;\r\n case 'Keyword':\r\n entitySchema = flattenEntitySchema(Keyword);\r\n addCampaignTypePropertyForFilter({ entitySchema, permissions });\r\n break;\r\n case 'Campaign':\r\n entitySchema = flattenEntitySchema(Campaign);\r\n entitySchema.properties.AvailableInsightTypeIds =\r\n baseEntitySchemaForAvailableInsightTypeIds;\r\n break;\r\n case 'AdGroup':\r\n entitySchema = flattenEntitySchema(AdGroup);\r\n addCampaignTypePropertyForFilter({ entitySchema, permissions });\r\n break;\r\n case 'AssetGroup':\r\n entitySchema = flattenEntitySchema(AssetGroup);\r\n addCampaignTypePropertyForFilter({ entitySchema, permissions });\r\n break;\r\n default:\r\n entitySchema = null;\r\n break;\r\n }\r\n\r\n entitySchemaCopy[schemaName] = entitySchema;\r\n\r\n return entitySchema;\r\n}\r\n\r\nexport function getMergedFilter({\r\n filter,\r\n typeName,\r\n metric,\r\n isFilterByInsights,\r\n permissions,\r\n}) {\r\n if (!filter) {\r\n return undefined;\r\n }\r\n\r\n const filters = _.chain(filter)\r\n .compact()\r\n .map(({\r\n filter: {\r\n key,\r\n value: { query } = {},\r\n } = {},\r\n }) => {\r\n if (!query) {\r\n return null;\r\n }\r\n\r\n let updatedQuery = query;\r\n\r\n if (typeName === 'Campaign') {\r\n if (key === WaterfallFilterType.AdGroupStatus) {\r\n return null;\r\n }\r\n\r\n if (key === WaterfallFilterType.CampaignStatus) {\r\n updatedQuery = {\r\n Status: query.CampaignStatus,\r\n };\r\n }\r\n } else if (typeName === 'AdGroup' && (key === WaterfallFilterType.AdGroupStatus)) {\r\n updatedQuery = {\r\n Status: query.AdGroupStatus,\r\n };\r\n } else if (typeName === 'AssetGroup') {\r\n // No filters support for asset groups\r\n return null;\r\n }\r\n\r\n return new FilterEntity(\r\n updatedQuery,\r\n {\r\n entitySchema: getflattenEntitySchema(typeName, permissions),\r\n }\r\n );\r\n })\r\n .compact()\r\n .value();\r\n\r\n if (typeName === 'Campaign'\r\n && isFilterByInsights\r\n && isInsightsMetric(metric)) {\r\n const query = {\r\n AvailableInsightTypeIds: {\r\n $contains: [getInsightsMetricFilterOption(metric)],\r\n },\r\n };\r\n const entitySchema = getflattenEntitySchema(typeName, permissions);\r\n const availableInsightsTypeIdFilter = new FilterEntity(\r\n query,\r\n {\r\n entitySchema,\r\n odata: {\r\n fieldMap: buildNameToPropertyMapping(entitySchema),\r\n ignoreCase: false,\r\n custom: {\r\n AvailableInsightTypeIds: {\r\n contains: lambdaConvertForAvailableInsightTypeIds(),\r\n },\r\n },\r\n },\r\n }\r\n );\r\n filters.push(availableInsightsTypeIdFilter);\r\n }\r\n\r\n if (!filters || filters.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const entitySchema = getflattenEntitySchema(typeName, permissions);\r\n const mergedFilter = new FilterEntity(\r\n FilterEntity.merge(filters),\r\n {\r\n entitySchema,\r\n odata: {\r\n fieldMap: buildNameToPropertyMapping(entitySchema),\r\n ignoreCase: false,\r\n custom: {\r\n AvailableInsightTypeIds: {\r\n contains: lambdaConvertForAvailableInsightTypeIds(),\r\n },\r\n },\r\n },\r\n }\r\n );\r\n mergedFilter.options = mergedFilter.odataOptions;\r\n return mergedFilter;\r\n}\r\n\r\nexport function getConversionGoalsFilterStore({ preferenceService }) {\r\n const conversionGoalsFilter = new FilterStorageFactory({\r\n preferenceService,\r\n featureName: 'ConversionGoalsGrid',\r\n });\r\n\r\n return conversionGoalsFilter.create('editableFilter', {\r\n filterEntityOptions: {\r\n entitySchema: { name: 'Goal' },\r\n },\r\n });\r\n}\r\n","import _ from 'underscore';\r\nimport { lastNDate } from '@bingads-webui-universal/primitive-utilities';\r\nimport { PageReady } from '@bingads-webui/page-ready';\r\nimport { withDFMCache } from '@bingads-webui/dfm-cache';\r\nimport { partialConversionPairs } from '@bingads-webui-campaign/column-conversions';\r\nimport instrumentationLegacy from '@bingads-webui-static-legacy/instrumentation/index';\r\nimport instrumentationConstants from '@bingads-webui-static-legacy/instrumentation/constants';\r\n\r\nimport { formatDate, availableGranularities } from './util';\r\nimport { metricSelect, allMetrics } from './metrics';\r\nimport { getMergedFilter } from './filter-util';\r\nimport { TopChangesFilterOption, TopChangesFilterSortOptionMap, AccountsMode, ConversionFilterSortOptionMap } from './constants';\r\n\r\n\r\nexport const defaultGridColumns = ['Spend', 'Clicks', 'Impressions'];\r\n\r\nfunction fetch({\r\n entitySet,\r\n dateRange,\r\n comparisonDateRange,\r\n top,\r\n expand,\r\n orderBy,\r\n SegmentationTypes,\r\n select,\r\n extraPayload,\r\n jsdata,\r\n dateUtil,\r\n filter,\r\n metric,\r\n selectedMenuItem,\r\n disableCache,\r\n cacheManager,\r\n permissions,\r\n}) {\r\n const gridDataParameters = _.extend({\r\n DateRange: {\r\n StartDate: formatDate(dateRange.start),\r\n EndDate: formatDate(dateRange.end),\r\n },\r\n ComparisonDateRange:\r\n comparisonDateRange &&\r\n _.isDate(comparisonDateRange.start) &&\r\n _.isDate(comparisonDateRange.end) ?\r\n {\r\n StartDate: formatDate(comparisonDateRange.start),\r\n EndDate: formatDate(comparisonDateRange.end),\r\n } : null,\r\n }, SegmentationTypes ? { SegmentationTypes } : {});\r\n const parameters = _.extend({\r\n gridDataParameters,\r\n }, extraPayload);\r\n const query = {\r\n entitySet: entitySet['Default.GridData'].$call(parameters).toJSON(),\r\n };\r\n const typeName = entitySet.type.elementType.shortName;\r\n const isFilterByInsights = selectedMenuItem === TopChangesFilterOption.Insights;\r\n const mergedFilter = getMergedFilter({\r\n filter, typeName, metric, isFilterByInsights, permissions,\r\n });\r\n const filters = mergedFilter ? mergedFilter.odataV4() : undefined;\r\n\r\n if (top) {\r\n _.extend(query, {\r\n $top: top,\r\n });\r\n }\r\n\r\n if (expand) {\r\n _.extend(query, {\r\n $expand: expand,\r\n });\r\n }\r\n\r\n if (select) {\r\n _.extend(query, {\r\n $select: select,\r\n });\r\n }\r\n\r\n if (filters) {\r\n _.extend(query, {\r\n $filter: filters,\r\n });\r\n }\r\n\r\n if (disableCache) {\r\n cacheManager.invalidate(entitySet.type.elementType.shortName);\r\n }\r\n\r\n return jsdata[entitySet.type.elementType.shortName].findAll({\r\n query,\r\n orderBy,\r\n });\r\n}\r\n\r\nconst millisecondsInDay = 86400000;\r\nconst top = 10;\r\n\r\nexport const topChangesDefaultOptions = {\r\n selectedMenuItem: 'AllChanges',\r\n metric: 'Clicks',\r\n};\r\n\r\nexport const conversionDefaultOptions = {\r\n selectedMenuItem: 'AllChanges',\r\n metric: 'ConversionsCredit', // ConversionsCredit, AdvertiserReportedRevenue\r\n};\r\n\r\nexport function getComparisonDateRange(dateRange) {\r\n let comparisonDateRange = dateRange.compared;\r\n\r\n if (!comparisonDateRange ||\r\n !_.isDate(comparisonDateRange.start) ||\r\n !_.isDate(comparisonDateRange.end)) {\r\n // Comparison date rage is not set in date filter.\r\n // Create one.\r\n comparisonDateRange = {};\r\n const timeRange = dateRange.end.getTime() - dateRange.start.getTime();\r\n const rangeInDays = Math.round(timeRange / millisecondsInDay);\r\n\r\n if (rangeInDays <= 7) {\r\n // If date range is within 7 days, compare with last weeks data.\r\n comparisonDateRange.start = lastNDate(dateRange.start, 7);\r\n comparisonDateRange.end = lastNDate(dateRange.end, 7);\r\n comparisonDateRange.key = 'last 7 days';\r\n } else {\r\n // For longer time period, compare with pervious time period.\r\n comparisonDateRange.end = lastNDate(dateRange.start, 1);\r\n comparisonDateRange.start = lastNDate(comparisonDateRange.end, rangeInDays);\r\n comparisonDateRange.key = 'previous period';\r\n }\r\n comparisonDateRange.rangeInDays = rangeInDays;\r\n }\r\n\r\n return comparisonDateRange;\r\n}\r\n\r\nexport const gridCardConfig = {\r\n entityCount: 10,\r\n select: ({\r\n typeName,\r\n isCompared,\r\n permissions,\r\n columns,\r\n campaignType,\r\n accountsMode,\r\n }) => {\r\n let select;\r\n const metricSelectUnserPermission = metricSelect(permissions, accountsMode, campaignType);\r\n\r\n switch (typeName) {\r\n case 'SearchTerm':\r\n select = `Text,DeliveredMatchType,SearchTermStatus,${_.map(columns, metric => `PerformanceMetrics/${metric}`).join(',')}`;\r\n break;\r\n case 'Keyword':\r\n select = isCompared ?\r\n `Text,Status,Id,MatchType,PerformanceMetricsChange,PerformanceMetricsChangePercentage,${metricSelectUnserPermission}` : `Text,Status,Id,MatchType,${metricSelectUnserPermission}`;\r\n break;\r\n case 'Campaign':\r\n select = isCompared ? `Name,Status,Id,PerformanceMetricsChange,PerformanceMetricsChangePercentage,ExperimentId,CampaignType,${metricSelectUnserPermission}` : `Name,Status,Id,ExperimentId,CampaignType,${metricSelectUnserPermission}`;\r\n break;\r\n default:\r\n select = isCompared ? `Name,Status,Id,PerformanceMetricsChange,PerformanceMetricsChangePercentage,${metricSelectUnserPermission}` : `Name,Status,Id,${metricSelectUnserPermission}`;\r\n break;\r\n }\r\n return select;\r\n },\r\n expand: (typeName) => {\r\n let expand;\r\n\r\n switch (typeName) {\r\n case 'SearchTerm':\r\n expand = 'Campaign($select=Id,Name),AdGroup($select=Id,Name),Keyword($select=Text)';\r\n break;\r\n case 'Keyword':\r\n expand = 'Campaign($select=Id,Name,ExperimentId),AdGroup($select=Id,Name)';\r\n break;\r\n case 'AdGroup':\r\n expand = 'Campaign($select=ExperimentId)';\r\n break;\r\n default:\r\n break;\r\n }\r\n return expand;\r\n },\r\n segmentationTypes: (typeName) => {\r\n if (typeName === 'AdGroup' || typeName === 'Campaign' || typeName === 'Account') {\r\n return ['DeviceType'];\r\n }\r\n return undefined;\r\n },\r\n defaultOptions: {\r\n columns: defaultGridColumns,\r\n orderby: 'Spend',\r\n direction: -1,\r\n directionIndex: 0,\r\n selectedMenuItem: 'PerformanceMetrics',\r\n },\r\n extraPayload: (typeName) => {\r\n if (typeName === 'SearchTerm') {\r\n return {\r\n shouldLoadShoppingTerms: true,\r\n isOverviewRequest: true,\r\n };\r\n }\r\n return {};\r\n },\r\n};\r\n\r\nfunction getColumnAndOrder({\r\n options,\r\n dateRange,\r\n}) {\r\n const metric = options.orderby;\r\n const order = options.direction === 1 ? 'ASC' : 'DESC';\r\n let orderByValue;\r\n\r\n if (dateRange.compared) {\r\n switch (options.selectedMenuItem) {\r\n case 'PerformanceMetricsChange':\r\n orderByValue = 'PoPPerformanceMetricsChange';\r\n break;\r\n case 'PerformanceMetricsChangePercentage':\r\n orderByValue = 'PoPPerformanceMetricsChangePercentage';\r\n break;\r\n case 'PerformanceMetrics':\r\n orderByValue = 'PerformanceMetrics';\r\n break;\r\n default:\r\n orderByValue = 'PerformanceMetrics';\r\n break;\r\n }\r\n } else {\r\n orderByValue = 'PerformanceMetrics';\r\n }\r\n\r\n return {\r\n column: `${orderByValue}/${metric}`,\r\n order,\r\n };\r\n}\r\n\r\nexport function processGridTileOptions({\r\n options,\r\n permissions,\r\n accountsMode,\r\n campaignType,\r\n}) {\r\n if (permissions.dynamic && (permissions.dynamic.OverviewPageFluentV2 || permissions.dynamic.OverviewPageFluent2)) {\r\n instrumentationLegacy.logMessage(\r\n [instrumentationConstants.LOGCATEGORY.TRACE],\r\n instrumentationConstants.LOGLEVEL.INFO,\r\n 'NewOverviewPage DFM',\r\n 'Start to process grid tile options for new overview page'\r\n );\r\n }\r\n\r\n // handle cases where columns might be deprecated.\r\n if (!_.isEmpty(options.columns)) {\r\n const availableMetrics = allMetrics(permissions, accountsMode, campaignType);\r\n let selectedColumns = _.intersection(options.columns, availableMetrics);\r\n\r\n if (_.size(selectedColumns) < _.size(defaultGridColumns)) {\r\n selectedColumns = _.chain(selectedColumns)\r\n .union(defaultGridColumns)\r\n .uniq()\r\n .first(_.size(defaultGridColumns))\r\n .value();\r\n\r\n const orderby = _.contains(availableMetrics, options.orderby) ?\r\n options.orderby : selectedColumns[0];\r\n\r\n return _.defaults({\r\n columns: selectedColumns,\r\n orderby,\r\n }, options);\r\n }\r\n }\r\n\r\n if (permissions.dynamic && (permissions.dynamic.OverviewPageFluentV2 || permissions.dynamic.OverviewPageFluent2)) {\r\n instrumentationLegacy.logMessage(\r\n [instrumentationConstants.LOGCATEGORY.TRACE],\r\n instrumentationConstants.LOGLEVEL.INFO,\r\n 'NewOverviewPage DFM',\r\n JSON.stringify(options)\r\n );\r\n }\r\n\r\n return options;\r\n}\r\n\r\nconst originalFetchGridData = ({\r\n entitySet,\r\n dateRange,\r\n options = gridCardConfig.defaultOptions,\r\n segmentationTypes,\r\n jsdata,\r\n dateUtil,\r\n getCardsConfig,\r\n filter,\r\n permissions,\r\n campaignType,\r\n}) => {\r\n const typeName = entitySet.type.elementType.shortName;\r\n const { column, order } = getColumnAndOrder({\r\n options: processGridTileOptions({\r\n options: options.columns && options.orderby ? options : gridCardConfig.defaultOptions,\r\n permissions,\r\n campaignType,\r\n }),\r\n dateRange,\r\n });\r\n const orderBy = [[column, order]];\r\n\r\n // fetchEntityGridCombined is only for all campaigns,\r\n // if there is a filter on CampaignId (e.g. PMax campaign overview), call fetch with the filter\r\n if (typeName === 'Campaign' && !_.any(filter, f => _.result(f, ['filter', 'key']) === 'CampaignId')) {\r\n // eslint-disable-next-line no-use-before-define\r\n return fetchEntityGridCombined({\r\n entitySet,\r\n dateRange,\r\n jsdata,\r\n dateUtil,\r\n getCardsConfig,\r\n orderBy,\r\n filter,\r\n permissions,\r\n accountsMode: AccountsMode.Expert,\r\n campaignType,\r\n });\r\n }\r\n\r\n return fetch({\r\n entitySet,\r\n dateRange,\r\n comparisonDateRange: dateRange.compared,\r\n top: gridCardConfig.entityCount,\r\n orderBy,\r\n SegmentationTypes: segmentationTypes || gridCardConfig.segmentationTypes(typeName),\r\n expand: gridCardConfig.expand(typeName),\r\n select: gridCardConfig.select({\r\n typeName,\r\n isCompared: dateRange.compared,\r\n permissions,\r\n columns: options.columns,\r\n campaignType,\r\n accountsMode: AccountsMode.Expert,\r\n }),\r\n extraPayload: gridCardConfig.extraPayload(typeName),\r\n jsdata,\r\n dateUtil,\r\n filter,\r\n });\r\n};\r\n\r\nexport const fetchGridData = withDFMCache(originalFetchGridData, args => args.dfmCacheKey);\r\n\r\nfunction getEntityGridOptions({\r\n orderBy,\r\n getCardsConfig,\r\n dateRange,\r\n permissions,\r\n typeName = 'Account',\r\n campaignType,\r\n}) {\r\n let column;\r\n let order;\r\n\r\n if (orderBy && orderBy[0]) {\r\n [[column, order]] = orderBy;\r\n } else {\r\n const cardConfig = _.find(getCardsConfig(), card => (typeName === 'Account' && card.id === 'CardType-TopAccounts') || (typeName === 'Campaign' && card.id === 'CardType-TopCampaigns'));\r\n const columnOrder = getColumnAndOrder({\r\n options: processGridTileOptions({\r\n options: cardConfig && cardConfig.options && cardConfig.options.columns && cardConfig.options.orderby ?\r\n cardConfig.options : gridCardConfig.defaultOptions,\r\n permissions,\r\n campaignType,\r\n }),\r\n dateRange,\r\n });\r\n // eslint-disable-next-line prefer-destructuring\r\n column = columnOrder.column;\r\n // eslint-disable-next-line prefer-destructuring\r\n order = columnOrder.order;\r\n }\r\n\r\n return {\r\n sortColumn: column,\r\n sortDirection: order === 'DESC' ? 'DESCENDING' : 'ASCENDING',\r\n };\r\n}\r\n\r\nexport function processTopChangesMetric({\r\n metric,\r\n permissions,\r\n accountsMode,\r\n campaignType,\r\n}) {\r\n const availableMetrics = allMetrics(permissions, accountsMode, campaignType);\r\n return _.contains(availableMetrics, metric) ?\r\n metric : topChangesDefaultOptions.metric;\r\n}\r\n\r\nconst getMetricConverter = (permissions, accountsMode) => {\r\n const {\r\n ColumnConversion: IsColumnConversionEnabled,\r\n PartialConversions: IsPartialConversionsEnabled,\r\n } = permissions.dynamic || {};\r\n if (accountsMode === AccountsMode.Expert && IsColumnConversionEnabled) {\r\n const conversionPropertyMap = IsPartialConversionsEnabled ?\r\n partialConversionPairs :\r\n _.invert(partialConversionPairs);\r\n return metric => _.result(conversionPropertyMap, metric, metric);\r\n }\r\n return _.identity;\r\n};\r\n\r\nexport const patchMetric = ({\r\n permissions = {},\r\n metric,\r\n accountsMode = AccountsMode.Expert,\r\n} = {}) => {\r\n const converter = getMetricConverter(permissions, accountsMode);\r\n return converter(metric);\r\n};\r\n\r\nexport const patchMetrics = ({\r\n permissions = {},\r\n metrics = [],\r\n accountsMode = AccountsMode.Expert,\r\n} = {}) => {\r\n const converter = getMetricConverter(permissions, accountsMode);\r\n return _.map(metrics, converter);\r\n};\r\n\r\nfunction getTopChangesOptions({\r\n getCardsConfig,\r\n typeName,\r\n selectedMenuItem,\r\n metric,\r\n permissions,\r\n accountsMode = AccountsMode.Expert,\r\n campaignType,\r\n}) {\r\n if (selectedMenuItem && metric) {\r\n return {\r\n menuItem: selectedMenuItem,\r\n selectedMetric: processTopChangesMetric({\r\n metric,\r\n permissions,\r\n accountsMode,\r\n campaignType,\r\n }),\r\n };\r\n }\r\n\r\n let cardId = 'CardType-TopChanges-Account';\r\n\r\n if (typeName === 'Campaign') {\r\n cardId = 'CardType-TopChanges-Campaign';\r\n } else if (typeName === 'AdGroup') {\r\n cardId = 'CardType-TopChanges-AdGroup';\r\n }\r\n\r\n const cardConfig = _.find(getCardsConfig(), card => card.id === cardId);\r\n\r\n return {\r\n menuItem: cardConfig && cardConfig.options ?\r\n cardConfig.options.selectedMenuItem : topChangesDefaultOptions.selectedMenuItem,\r\n selectedMetric: processTopChangesMetric({\r\n metric: cardConfig && cardConfig.options ?\r\n cardConfig.options.metric : topChangesDefaultOptions.metric,\r\n permissions,\r\n accountsMode,\r\n campaignType,\r\n }),\r\n };\r\n}\r\n\r\nfunction getConversionOptions({\r\n getCardsConfig,\r\n selectedMenuItem,\r\n metric,\r\n}) {\r\n if (selectedMenuItem && metric) {\r\n return {\r\n menuItem: selectedMenuItem,\r\n selectedMetric: metric,\r\n };\r\n }\r\n\r\n const cardId = 'CardType-Conversion-Tracking';\r\n\r\n const allCardConfig = getCardsConfig();\r\n const cardConfig = _.find(allCardConfig, card => card.id === cardId);\r\n\r\n return {\r\n menuItem: cardConfig && cardConfig.options && cardConfig.options.selectedMenuItem ?\r\n cardConfig.options.selectedMenuItem : conversionDefaultOptions.selectedMenuItem,\r\n selectedMetric: cardConfig && cardConfig.options && cardConfig.options.metric ?\r\n cardConfig.options.metric : conversionDefaultOptions.metric,\r\n };\r\n}\r\n\r\nfunction convertTopChangesOptions({\r\n topChangesOrderBy,\r\n getCardsConfig,\r\n typeName,\r\n permissions,\r\n accountsMode = AccountsMode.Expert,\r\n campaignType,\r\n}) {\r\n const { selectedMetric, menuItem } = topChangesOrderBy || getTopChangesOptions({\r\n getCardsConfig,\r\n typeName,\r\n permissions,\r\n accountsMode,\r\n campaignType,\r\n });\r\n\r\n const sortColumn = `PoPPerformanceMetricsChange/${selectedMetric}`;\r\n const sortOption = TopChangesFilterSortOptionMap[menuItem];\r\n\r\n return {\r\n sortOption,\r\n sortColumn,\r\n };\r\n}\r\n\r\nfunction convertOverviewConversionsOptions({\r\n conversionOrderBy,\r\n getCardsConfig,\r\n}) {\r\n const { selectedMetric, menuItem } = conversionOrderBy || getConversionOptions({\r\n getCardsConfig,\r\n });\r\n const sortColumn = `PerformanceMetrics/${selectedMetric}`;\r\n const sortOption = ConversionFilterSortOptionMap[menuItem];\r\n\r\n return {\r\n sortOption,\r\n sortColumn,\r\n };\r\n}\r\n\r\n\r\nfunction getGranularityForConsolidatedCalls({\r\n dateRange,\r\n dateUtil,\r\n accountsMode = AccountsMode.Expert,\r\n}) {\r\n let [PerformanceChartGranularity] = availableGranularities(dateRange, dateUtil, accountsMode);\r\n\r\n if (!PerformanceChartGranularity) {\r\n // If we have large discrepancy between time periods, we have no granularity.\r\n // In this case, get granularity from larger period.\r\n const rangeDuration = dateUtil.diff(dateRange.start, dateRange.end, 'day');\r\n const comparedDuration = dateUtil.diff(dateRange.compared.start, dateRange.compared.end, 'day');\r\n const largerRange = {};\r\n if (rangeDuration > comparedDuration) {\r\n largerRange.start = dateRange.start;\r\n largerRange.end = dateRange.end;\r\n } else {\r\n largerRange.start = dateRange.compared.start;\r\n largerRange.end = dateRange.compared.end;\r\n }\r\n ([PerformanceChartGranularity] = availableGranularities(largerRange, dateUtil, accountsMode));\r\n }\r\n\r\n return PerformanceChartGranularity;\r\n}\r\n\r\nfunction getTilesFromConfigForConsolidatedCalls({ getCardsConfig }) {\r\n const tiles = getCardsConfig().map((card) => {\r\n switch (card.id) {\r\n case 'CardType-TopAccounts':\r\n return 'AllAccounts';\r\n case 'CardType-TopCampaigns':\r\n return 'AllCampaigns';\r\n case 'CardType-Performance':\r\n return 'Performance';\r\n case 'CardType-TopChanges-Account':\r\n return 'TopChangedAccounts';\r\n case 'CardType-TopChanges-Campaign':\r\n return 'TopChangedCampaigns';\r\n case 'CardType-Conversion-Tracking':\r\n return 'Conversions';\r\n case 'CardType-Device':\r\n return 'Device';\r\n default:\r\n return '';\r\n }\r\n });\r\n return _.compact(tiles);\r\n}\r\n\r\n// TODO: [yaoyao][markel] check if we need to add campaignType here to handle metrics\r\n// getEntityGridOptions, convertTopChangesOptions can take a campaignType to decide metric\r\n// maybe we need a default value of 65535 to make it work in new customer level overview page?\r\nexport function fetchMCCOverview({\r\n entitySet,\r\n dateRange,\r\n jsdata,\r\n dateUtil,\r\n allAccountsOrderBy,\r\n topChangesOrderBy,\r\n getCardsConfig,\r\n tiles,\r\n instrumentation,\r\n constants,\r\n AccountsOverviewPrefetchQuery,\r\n isPreFetch,\r\n permissions,\r\n disableCache,\r\n cacheManager,\r\n accountsMode = AccountsMode.Expert,\r\n}) {\r\n const typeName = entitySet.type.elementType.shortName;\r\n const {\r\n sortColumn: AllAccountsSortColumn,\r\n sortDirection: AllAccountsSortDirection,\r\n } = getEntityGridOptions({\r\n allAccountsOrderBy,\r\n getCardsConfig,\r\n dateRange,\r\n permissions,\r\n typeName,\r\n });\r\n const HasGlobalComparisonPeriod = !!dateRange.compared &&\r\n _.isDate(dateRange.compared.start) &&\r\n _.isDate(dateRange.compared.end);\r\n const comparisonDateRange = getComparisonDateRange(dateRange);\r\n const PerformanceChartGranularity = getGranularityForConsolidatedCalls({\r\n dateRange,\r\n dateUtil,\r\n accountsMode,\r\n });\r\n const {\r\n sortOption: TopChangedAccountsSortOption,\r\n sortColumn: TopChangedAccountsSortColumn,\r\n } = convertTopChangesOptions({\r\n topChangesOrderBy,\r\n getCardsConfig,\r\n typeName,\r\n permissions,\r\n accountsMode,\r\n });\r\n const Tiles = tiles || getTilesFromConfigForConsolidatedCalls({ getCardsConfig });\r\n\r\n if (_.size(Tiles) === 0) {\r\n return null;\r\n }\r\n\r\n const allMetricsJoined = allMetrics(permissions, accountsMode).join(',');\r\n const popMetrics = ',PeriodPerformanceMetrics,PerformanceMetricsChange,PerformanceMetricsChangePercentage';\r\n const expand = [];\r\n const select = [\r\n // eslint-disable-next-line prefer-template\r\n `AccountsHaveDifferentCurrencies,OverallTotals($select=PerformanceMetrics($select=${allMetricsJoined})` + (\r\n HasGlobalComparisonPeriod ? (`,PeriodPerformanceMetrics($select=${allMetricsJoined})` +\r\n `,PerformanceMetricsChange($select=${allMetricsJoined})` +\r\n `,PerformanceMetricsChangePercentage($select=${allMetricsJoined}))`)\r\n : ')'\r\n ),\r\n ];\r\n const segmentSelect = 'SegmentedData($select=Key,Data)';\r\n _.each(Tiles, (tile) => {\r\n switch (tile) {\r\n case 'AllAccounts':\r\n expand.push(`AllAccounts($select=Id,AccountInactiveReasons,Currency,Name,PerformanceMetrics($select=${allMetricsJoined})${HasGlobalComparisonPeriod ? popMetrics : ''})`);\r\n break;\r\n case 'Performance':\r\n expand.push('PerformanceTimeSeries');\r\n break;\r\n case 'TopChangedAccounts':\r\n expand.push('TopChangedAccounts($select=Id,AccountInactiveReasons,Currency,Name,' +\r\n `AvailableInsightTypeIds,PerformanceMetrics($select=${allMetricsJoined})${popMetrics})`);\r\n break;\r\n case 'Device':\r\n // eslint-disable-next-line prefer-template\r\n select.push(`DeviceSegmentedPerformanceData($select=PerformanceMetrics($select=${segmentSelect})` + (\r\n HasGlobalComparisonPeriod ?\r\n (`,PeriodPerformanceMetrics($select=${segmentSelect})` +\r\n `,PerformanceMetricsChange($select=${segmentSelect})` +\r\n `,PerformanceMetricsChangePercentage($select=${segmentSelect}))`)\r\n : ')'));\r\n break;\r\n default:\r\n }\r\n });\r\n\r\n const multiAccountOverviewParameters = {\r\n DateRange: {\r\n StartDate: formatDate(dateRange.start, dateUtil),\r\n EndDate: formatDate(dateRange.end, dateUtil),\r\n },\r\n ComparisonDateRange: comparisonDateRange ? {\r\n StartDate: formatDate(comparisonDateRange.start, dateUtil),\r\n EndDate: formatDate(comparisonDateRange.end, dateUtil),\r\n } : null,\r\n Tiles,\r\n Metrics: allMetricsJoined,\r\n HasGlobalComparisonPeriod,\r\n AllAccountsSortColumn,\r\n AllAccountsSortDirection,\r\n TopChangedAccountsSortOption,\r\n TopChangedAccountsSortColumn,\r\n FetchFluctuationInsights: accountsMode === AccountsMode.Expert,\r\n };\r\n\r\n if (PerformanceChartGranularity) {\r\n _.extend(multiAccountOverviewParameters, { PerformanceChartGranularity });\r\n }\r\n\r\n const callParams = {\r\n multiAccountOverviewParameters,\r\n };\r\n const accountModes = [accountsMode === AccountsMode.Expert ? 'Expert' : 'Smart'];\r\n\r\n if (permissions.dynamic.UnifiedProductPhase2) {\r\n _.extend(callParams, {\r\n accountModes,\r\n });\r\n }\r\n\r\n const query = {\r\n entitySet: entitySet['Default.MultiAccountOverview'].$call(callParams).toJSON(),\r\n };\r\n\r\n if (!_.isEmpty(expand)) {\r\n _.extend(query, {\r\n $expand: expand.join(','),\r\n });\r\n }\r\n\r\n if (!_.isEmpty(select)) {\r\n _.extend(query, {\r\n $select: select.join(','),\r\n });\r\n }\r\n\r\n if (disableCache) {\r\n cacheManager.invalidate(entitySet.type.elementType.shortName);\r\n }\r\n\r\n // Add log for debugging\r\n if (isPreFetch) {\r\n PageReady.afterPageReady().then(() => {\r\n try {\r\n const postBody = JSON.parse(JSON.parse(AccountsOverviewPrefetchQuery).PostBody);\r\n const serverPreloadParams = postBody.multiAccountOverviewParameters;\r\n\r\n if (!_.isEqual(_.omit(serverPreloadParams, 'IsPreload'), multiAccountOverviewParameters)) {\r\n instrumentation.logMessage(\r\n [constants.LOGCATEGORY.TRACE],\r\n constants.LOGLEVEL.INFO,\r\n 'MccOverview PreFetch',\r\n `${AccountsOverviewPrefetchQuery} : ${JSON.stringify(multiAccountOverviewParameters)}`\r\n );\r\n }\r\n\r\n const serverAccountModes = postBody.accountModes;\r\n\r\n if (!_.isEqual(serverAccountModes, accountModes)) {\r\n instrumentation.logMessage(\r\n [constants.LOGCATEGORY.TRACE],\r\n constants.LOGLEVEL.INFO,\r\n 'MccOverview PreFetch',\r\n `${JSON.stringify(serverAccountModes)} : ${JSON.stringify(accountsMode)}`\r\n );\r\n }\r\n // eslint-disable-next-line no-empty\r\n } catch (e) {\r\n instrumentation.logMessage(\r\n [constants.LOGCATEGORY.TRACE],\r\n constants.LOGLEVEL.INFO,\r\n 'MccOverview PreFetch',\r\n `${AccountsOverviewPrefetchQuery} ${e.stack}`\r\n );\r\n }\r\n });\r\n }\r\n\r\n return jsdata[entitySet.type.elementType.shortName].findAll({\r\n query,\r\n });\r\n}\r\n\r\nexport function fetchCampaignOverview({\r\n entitySet,\r\n dateRange,\r\n jsdata,\r\n dateUtil,\r\n allCampaignsOrderBy,\r\n topChangesOrderBy,\r\n conversionOrderBy,\r\n getCardsConfig,\r\n tiles,\r\n permissions,\r\n filter,\r\n disableCache,\r\n cacheManager,\r\n campaignType,\r\n}) {\r\n const typeName = entitySet.type.elementType.shortName;\r\n const {\r\n sortColumn: AllCampaignsSortColumn,\r\n sortDirection: AllCampaignsSortDirection,\r\n } = getEntityGridOptions({\r\n orderBy: allCampaignsOrderBy,\r\n getCardsConfig,\r\n dateRange,\r\n permissions,\r\n typeName,\r\n campaignType,\r\n });\r\n const HasGlobalComparisonPeriod = !!dateRange.compared &&\r\n _.isDate(dateRange.compared.start) &&\r\n _.isDate(dateRange.compared.end);\r\n const comparisonDateRange = getComparisonDateRange(dateRange);\r\n const PerformanceChartGranularity = getGranularityForConsolidatedCalls({\r\n dateRange,\r\n dateUtil,\r\n });\r\n const {\r\n sortOption: TopChangedCampaignsSortOption,\r\n sortColumn: TopChangedCampaignsSortColumn,\r\n } = convertTopChangesOptions({\r\n topChangesOrderBy,\r\n getCardsConfig,\r\n typeName,\r\n permissions,\r\n campaignType,\r\n });\r\n\r\n const {\r\n sortOption: OverviewConversionsSortOption,\r\n sortColumn: OverviewConversionsSortColumn,\r\n } = convertOverviewConversionsOptions({\r\n conversionOrderBy,\r\n getCardsConfig,\r\n });\r\n const Tiles = tiles || getTilesFromConfigForConsolidatedCalls({ getCardsConfig });\r\n\r\n if (_.size(Tiles) === 0) {\r\n return null;\r\n }\r\n\r\n const mergedFilter = getMergedFilter({\r\n filter, typeName,\r\n });\r\n const filters = mergedFilter ? mergedFilter.odataV4() : undefined;\r\n\r\n const allMetricsJoined = allMetrics(permissions, AccountsMode.Expert, campaignType).join(',');\r\n const popMetrics = ',PeriodPerformanceMetrics,PerformanceMetricsChange,PerformanceMetricsChangePercentage';\r\n const expand = [];\r\n const select = [\r\n // eslint-disable-next-line prefer-template\r\n `OverallTotals($select=PerformanceMetrics($select=${allMetricsJoined})` + (\r\n HasGlobalComparisonPeriod ? (`,PeriodPerformanceMetrics($select=${allMetricsJoined})` +\r\n `,PerformanceMetricsChange($select=${allMetricsJoined})` +\r\n `,PerformanceMetricsChangePercentage($select=${allMetricsJoined}))`)\r\n : ')'\r\n ),\r\n ];\r\n const segmentSelect = 'SegmentedData($select=Key,Data)';\r\n _.each(Tiles, (tile) => {\r\n switch (tile) {\r\n case 'AllCampaigns':\r\n expand.push(`AllCampaigns($select=Name,Status,Id,ExperimentId,CampaignType,PerformanceMetrics($select=${allMetricsJoined})${HasGlobalComparisonPeriod ? popMetrics : ''})`);\r\n break;\r\n case 'Performance':\r\n expand.push('PerformanceTimeSeries');\r\n break;\r\n case 'TopChangedCampaigns':\r\n expand.push('TopChangedCampaigns($select=ExperimentId,CampaignType,Name,Status,Id,' +\r\n `AvailableInsightTypeIds,PerformanceMetrics($select=${allMetricsJoined})${popMetrics})`);\r\n break;\r\n case 'Conversions':\r\n select.push('ConversionTileResult($select=NoConversionGoalsExist,NoConversionGoalsWithRevenue,ConversionGoalTrackingStatusSummaries,' +\r\n 'ConversionGoalCategoryResults)');\r\n break;\r\n case 'Device':\r\n // eslint-disable-next-line prefer-template\r\n select.push(`DeviceSegmentedPerformanceData($select=PerformanceMetrics($select=${segmentSelect})` + (\r\n HasGlobalComparisonPeriod ?\r\n (`,PeriodPerformanceMetrics($select=${segmentSelect})` +\r\n `,PerformanceMetricsChange($select=${segmentSelect})` +\r\n `,PerformanceMetricsChangePercentage($select=${segmentSelect}))`)\r\n : ')'));\r\n break;\r\n default:\r\n }\r\n });\r\n\r\n const campaignOverviewParameters = {\r\n DateRange: {\r\n StartDate: formatDate(dateRange.start, dateUtil),\r\n EndDate: formatDate(dateRange.end, dateUtil),\r\n },\r\n ComparisonDateRange: comparisonDateRange ? {\r\n StartDate: formatDate(comparisonDateRange.start, dateUtil),\r\n EndDate: formatDate(comparisonDateRange.end, dateUtil),\r\n } : null,\r\n Tiles,\r\n Metrics: allMetricsJoined,\r\n HasGlobalComparisonPeriod,\r\n AllCampaignsSortColumn,\r\n AllCampaignsSortDirection,\r\n TopChangedCampaignsSortOption,\r\n TopChangedCampaignsSortColumn,\r\n OverviewConversionsSortColumn,\r\n OverviewConversionsSortOption,\r\n FetchFluctuationInsights: true,\r\n };\r\n\r\n if (PerformanceChartGranularity) {\r\n _.extend(campaignOverviewParameters, { PerformanceChartGranularity });\r\n }\r\n\r\n const callParams = {\r\n campaignOverviewParameters,\r\n };\r\n\r\n const query = {\r\n entitySet: entitySet['Default.CampaignOverview'].$call(callParams).toJSON(),\r\n };\r\n\r\n if (!_.isEmpty(expand)) {\r\n _.extend(query, {\r\n $expand: expand.join(','),\r\n });\r\n }\r\n\r\n if (!_.isEmpty(select)) {\r\n _.extend(query, {\r\n $select: select.join(','),\r\n });\r\n }\r\n\r\n if (filters) {\r\n _.extend(query, {\r\n $filter: filters,\r\n });\r\n }\r\n\r\n _.extend(query, {\r\n $top: 10,\r\n });\r\n\r\n if (disableCache) {\r\n cacheManager.invalidate(entitySet.type.elementType.shortName);\r\n }\r\n\r\n return jsdata[entitySet.type.elementType.shortName].findAll({\r\n query,\r\n });\r\n}\r\n\r\nexport function fetchCombinedPerformanceTimeSeries({\r\n entitySet,\r\n dateRange,\r\n jsdata,\r\n dateUtil,\r\n getCardsConfig,\r\n fetchSingleTile,\r\n filter,\r\n permissions,\r\n accountsMode,\r\n campaignType,\r\n}) {\r\n const typeName = entitySet.type.elementType.shortName;\r\n\r\n if (typeName === 'Account') {\r\n return fetchMCCOverview({\r\n entitySet,\r\n dateRange,\r\n jsdata,\r\n dateUtil,\r\n getCardsConfig,\r\n permissions,\r\n accountsMode,\r\n tiles: fetchSingleTile ? ['Performance'] : undefined,\r\n }).then((data) => {\r\n if (!_.isEmpty(data.errors)) {\r\n return data;\r\n }\r\n\r\n return {\r\n performanceTimeSeries: data.PerformanceTimeSeries,\r\n hideCurrency: data.AccountsHaveDifferentCurrencies,\r\n };\r\n });\r\n }\r\n\r\n return fetchCampaignOverview({\r\n entitySet,\r\n dateRange,\r\n jsdata,\r\n dateUtil,\r\n getCardsConfig,\r\n filter,\r\n permissions,\r\n tiles: fetchSingleTile ? ['Performance'] : undefined,\r\n campaignType,\r\n }).then((data) => {\r\n if (!_.isEmpty(data.errors)) {\r\n return data;\r\n }\r\n\r\n return {\r\n performanceTimeSeries: data.PerformanceTimeSeries,\r\n };\r\n });\r\n}\r\n\r\nexport function fetchEntityGridCombined({\r\n entitySet,\r\n dateRange,\r\n jsdata,\r\n dateUtil,\r\n getCardsConfig,\r\n orderBy,\r\n fetchSingleTile,\r\n permissions,\r\n filter,\r\n accountsMode = AccountsMode.Expert,\r\n campaignType,\r\n}) {\r\n const typeName = entitySet.type.elementType.shortName;\r\n\r\n if (typeName === 'Account') {\r\n return fetchMCCOverview({\r\n entitySet,\r\n dateRange,\r\n jsdata,\r\n dateUtil,\r\n allAccountsOrderBy: orderBy,\r\n getCardsConfig,\r\n tiles: fetchSingleTile ? ['AllAccounts'] : undefined,\r\n permissions,\r\n accountsMode,\r\n }).then((data) => {\r\n if (!_.isEmpty(data.errors)) {\r\n return data;\r\n }\r\n return data.AllAccounts;\r\n });\r\n }\r\n\r\n return fetchCampaignOverview({\r\n entitySet,\r\n dateRange,\r\n jsdata,\r\n dateUtil,\r\n allCampaignsOrderBy: orderBy,\r\n getCardsConfig,\r\n tiles: fetchSingleTile ? ['AllCampaigns'] : undefined,\r\n filter,\r\n permissions,\r\n campaignType,\r\n }).then((data) => {\r\n if (!_.isEmpty(data.errors)) {\r\n return data;\r\n }\r\n return data.AllCampaigns;\r\n });\r\n}\r\n\r\nconst originalFetchTopChanges = ({\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 getCardsConfig,\r\n fetchSingleTile,\r\n permissions,\r\n disableCache,\r\n cacheManager,\r\n accountsMode,\r\n campaignType,\r\n}) => {\r\n const typeName = entitySet.type.elementType.shortName;\r\n const { menuItem, selectedMetric } = getTopChangesOptions({\r\n getCardsConfig,\r\n typeName,\r\n selectedMenuItem,\r\n metric,\r\n permissions,\r\n campaignType,\r\n });\r\n\r\n if (typeName === 'Account') {\r\n return fetchMCCOverview({\r\n entitySet,\r\n dateRange,\r\n jsdata,\r\n dateUtil,\r\n getCardsConfig,\r\n tiles: fetchSingleTile ? ['TopChangedAccounts'] : undefined,\r\n topChangesOrderBy: {\r\n menuItem,\r\n selectedMetric,\r\n },\r\n permissions,\r\n disableCache,\r\n cacheManager,\r\n accountsMode,\r\n }).then((data) => {\r\n if (!_.isEmpty(data.errors)) {\r\n return data;\r\n }\r\n return data.TopChangedAccounts;\r\n });\r\n }\r\n\r\n if (typeName === 'Campaign') {\r\n return fetchCampaignOverview({\r\n entitySet,\r\n dateRange,\r\n jsdata,\r\n dateUtil,\r\n getCardsConfig,\r\n tiles: fetchSingleTile ? ['TopChangedCampaigns'] : undefined,\r\n topChangesOrderBy: {\r\n menuItem,\r\n selectedMetric,\r\n },\r\n filter,\r\n permissions,\r\n disableCache,\r\n cacheManager,\r\n campaignType,\r\n }).then((data) => {\r\n if (!_.isEmpty(data.errors)) {\r\n return data;\r\n }\r\n return data.TopChangedCampaigns;\r\n });\r\n }\r\n\r\n const order = menuItem === TopChangesFilterOption.TopDecliners ? 'ASC' : 'DESC';\r\n const popOrderByMetric =\r\n menuItem === TopChangesFilterOption.AllChanges || menuItem === TopChangesFilterOption.Insights\r\n ? 'PoPPerformanceMetricsAbsoluteChange' : 'PoPPerformanceMetricsChange';\r\n const orderBy = [[`${popOrderByMetric}/${selectedMetric}`, order]];\r\n let expand;\r\n let select = `Name,Status,Id,PerformanceMetricsChange,PeriodPerformanceMetrics,PerformanceMetricsChangePercentage,${metricSelect(permissions, accountsMode, campaignType)}`;\r\n\r\n if (typeName === 'Campaign') {\r\n select = `ExperimentId,CampaignType,AvailableInsightTypeIds,${select}`;\r\n } else if (typeName === 'AdGroup') {\r\n expand = 'Campaign($select=ExperimentId)';\r\n }\r\n\r\n return fetch({\r\n entitySet,\r\n dateRange,\r\n filter,\r\n comparisonDateRange: comparisonDateRange || getComparisonDateRange(dateRange),\r\n top,\r\n orderBy,\r\n select,\r\n expand,\r\n jsdata,\r\n dateUtil,\r\n metric,\r\n selectedMenuItem,\r\n disableCache,\r\n cacheManager,\r\n permissions,\r\n });\r\n};\r\n\r\nexport const fetchTopChanges = withDFMCache(originalFetchTopChanges, args => args.dfmCacheKey);\r\n\r\nconst originalFetchAggregatedData = ({\r\n entitySet,\r\n dateRange,\r\n filter,\r\n jsdata,\r\n dateUtil,\r\n navigationLevel,\r\n getCardsConfig,\r\n fetchSingleTile,\r\n isDevice,\r\n permissions,\r\n accountsMode,\r\n segmentationTypes,\r\n campaignType,\r\n}) => {\r\n if (navigationLevel === 'customer') {\r\n let tiles;\r\n\r\n if (fetchSingleTile) {\r\n tiles = isDevice ? ['Device'] : ['Performance'];\r\n }\r\n return fetchMCCOverview({\r\n entitySet,\r\n dateRange,\r\n jsdata,\r\n dateUtil,\r\n getCardsConfig,\r\n tiles,\r\n permissions,\r\n accountsMode,\r\n });\r\n }\r\n\r\n // fetchCampaignOverview is only for all campaigns,\r\n // if there is a filter on CampaignId (e.g. PMax campaign overview), call fetchGridData with the filter\r\n if (navigationLevel === 'account' && !_.any(filter, f => _.result(f, ['filter', 'key']) === 'CampaignId')) {\r\n let tiles;\r\n\r\n if (fetchSingleTile) {\r\n tiles = isDevice ? ['Device'] : ['Performance'];\r\n }\r\n return fetchCampaignOverview({\r\n entitySet,\r\n dateRange,\r\n jsdata,\r\n dateUtil,\r\n getCardsConfig,\r\n tiles,\r\n filter,\r\n permissions,\r\n campaignType,\r\n });\r\n }\r\n\r\n const cardConfig = _.find(getCardsConfig(), (card) => {\r\n if (navigationLevel === 'account') {\r\n return card.id === 'CardType-TopCampaigns';\r\n }\r\n return card.id === 'CardType-TopAdGroup';\r\n });\r\n\r\n const typeName = entitySet.type.elementType.shortName;\r\n\r\n return fetchGridData({\r\n entitySet,\r\n dateRange,\r\n filter,\r\n options: cardConfig ? cardConfig.options : undefined,\r\n segmentationTypes: segmentationTypes || gridCardConfig.segmentationTypes(typeName),\r\n jsdata,\r\n dateUtil,\r\n permissions,\r\n getCardsConfig,\r\n campaignType,\r\n });\r\n};\r\n\r\nexport const fetchAggregatedData =\r\n withDFMCache(originalFetchAggregatedData, args => args.dfmCacheKey);\r\n\r\nconst originalFetchConversions = ({\r\n entitySet,\r\n dateRange,\r\n filter,\r\n selectedMenuItem,\r\n metric,\r\n jsdata,\r\n dateUtil,\r\n getCardsConfig,\r\n permissions,\r\n disableCache,\r\n cacheManager,\r\n fetchSingleTile,\r\n campaignType,\r\n}) => {\r\n const typeName = entitySet.type.elementType.shortName;\r\n const { menuItem, selectedMetric } = getConversionOptions({\r\n getCardsConfig,\r\n typeName,\r\n selectedMenuItem,\r\n metric,\r\n permissions,\r\n });\r\n\r\n return fetchCampaignOverview({\r\n entitySet,\r\n dateRange,\r\n jsdata,\r\n dateUtil,\r\n getCardsConfig,\r\n tiles: fetchSingleTile ? ['Conversions'] : undefined,\r\n conversionOrderBy: {\r\n menuItem,\r\n selectedMetric,\r\n },\r\n filter,\r\n permissions,\r\n disableCache,\r\n cacheManager,\r\n campaignType,\r\n }).then((data) => {\r\n if (!_.isEmpty(data.errors)) {\r\n return data;\r\n }\r\n return data.ConversionTileResult;\r\n });\r\n};\r\n\r\nexport const fetchConversionTracking =\r\n withDFMCache(originalFetchConversions, args => args.dfmCacheKey);\r\n","import _ from 'underscore';\r\nimport Promise from 'bluebird';\r\nimport state from '@bingads-webui-component-legacy/state/index';\r\nimport { Constants as CCUIConstants } from '@bingads-webui-clientcenter/entity-utils';\r\n\r\n// TODO: there is an issue with import { FAC_FEATURE_ID } from '@bingads-webui-campaign/recommendation-core';\r\n// hard code FAC_FEATURE_ID.CONVERSION_TRACKING for now\r\nconst FAC_FEATUREID = 208;\r\nconst FAC_STATUS_NOT_IN_PROGRESS = CCUIConstants.RecommendationAdoptionStatus.NotInProgess;\r\nconst FAC_STATUS_ACTIVE = CCUIConstants.RecommendationAdoptionStatus.Active;\r\nlet p$Coupons = null;\r\n\r\nexport function fetchCoupons({\r\n ccJsData,\r\n}) {\r\n if (p$Coupons) {\r\n return p$Coupons;\r\n }\r\n const accountId = state.get('account_id');\r\n\r\n p$Coupons = new Promise((resolve) => {\r\n if (accountId) {\r\n // if call fails, eat the error to avoid blocking workflow\r\n resolve(ccJsData.FeatureAdoptionCoupon\r\n .findAll({ aid: accountId })\r\n .then(coupons => _.filter(\r\n coupons,\r\n ({ Status, FeatureId }) => FeatureId === FAC_FEATUREID && (Status === FAC_STATUS_NOT_IN_PROGRESS || Status === FAC_STATUS_ACTIVE)\r\n ))\r\n .catch(() => []));\r\n }\r\n resolve([]);\r\n });\r\n\r\n return p$Coupons;\r\n}\r\n\r\nexport function clearCouponsCache() {\r\n p$Coupons = null;\r\n}\r\n","/* eslint-disable indent */\r\nimport config from '@bingads-webui-component-legacy/config/index';\r\nimport { withDFMCache } from '@bingads-webui/dfm-cache';\r\nimport { edmCampaign } from '@bingads-webui/edm-campaign';\r\n\r\nimport { formatDate } from './util';\r\n\r\nexport const locationGranularity = {\r\n country: {\r\n name: 'CountryName',\r\n longitude: 'CountryLongitude',\r\n latitude: 'CountryLatitude',\r\n },\r\n county: {\r\n name: 'CountyName',\r\n longitude: 'CountyLongitude',\r\n latitude: 'CountyLatitude',\r\n },\r\n stateOrProvince: {\r\n name: 'StateOrProvince',\r\n longitude: 'SubGeographyLongitude',\r\n latitude: 'SubGeographyLatitude',\r\n },\r\n city: {\r\n name: 'City',\r\n longitude: 'CityLongitude',\r\n latitude: 'CityLatitude',\r\n },\r\n postalCode: {\r\n name: 'PostalCode',\r\n longitude: 'PostalCodeLongitude',\r\n latitude: 'PostalCodeLatitude',\r\n },\r\n};\r\n\r\nfunction mapMetric(metric) {\r\n let mappedMetric = metric;\r\n\r\n switch (metric) {\r\n case 'TopImpressionRate':\r\n mappedMetric = 'TopImpressionRatePercent';\r\n break;\r\n case 'AbsoluteTopImpressionRate':\r\n mappedMetric = 'AbsoluteTopImpressionRatePercent';\r\n break;\r\n default:\r\n break;\r\n }\r\n return mappedMetric;\r\n}\r\n\r\nfunction fetch({\r\n cid, aid, campaignId, dateRange, metric, level,\r\n}) {\r\n return edmCampaign\r\n .Customers.$withKey(cid)\r\n .Accounts.$withKey(aid)\r\n .Campaigns.$withKey(campaignId)['Default.DimensionReport']\r\n .$makeCall({\r\n functionParams: {\r\n Locale: config.get('CultureLcid'),\r\n ReportType: 'Enum.DimensionReportType\\'Geographic\\'',\r\n },\r\n query: {\r\n count: true,\r\n skip: 0,\r\n top: 15,\r\n orderby: {\r\n [mapMetric(metric)]: '-1',\r\n },\r\n select: [level.name, level.longitude, level.latitude, metric],\r\n startDate: formatDate(dateRange.start),\r\n endDate: formatDate(dateRange.end),\r\n },\r\n })\r\n .toPromise();\r\n}\r\n\r\nexport const fetchCountryData = withDFMCache(({\r\n cid, aid, campaignId, dateRange, metric,\r\n}) => fetch({\r\n cid,\r\n aid,\r\n campaignId,\r\n dateRange,\r\n metric,\r\n level: locationGranularity.country,\r\n}), 'CardType-TopLocations-country-data');\r\n\r\nexport const fetchStateOrProvinceData = withDFMCache(({\r\n cid, aid, campaignId, dateRange, metric,\r\n}) => fetch({\r\n cid,\r\n aid,\r\n campaignId,\r\n dateRange,\r\n metric,\r\n level: locationGranularity.stateOrProvince,\r\n}), 'CardType-TopLocations-state-or-province-data');\r\n\r\nexport const fetchCountyData = withDFMCache(({\r\n cid, aid, campaignId, dateRange, metric,\r\n}) => fetch({\r\n cid,\r\n aid,\r\n campaignId,\r\n dateRange,\r\n metric,\r\n level: locationGranularity.county,\r\n}), 'CardType-TopLocations-county-data');\r\n\r\nexport const fetchCityData = withDFMCache(({\r\n cid, aid, campaignId, dateRange, metric,\r\n}) => fetch({\r\n cid,\r\n aid,\r\n campaignId,\r\n dateRange,\r\n metric,\r\n level: locationGranularity.city,\r\n}), 'CardType-TopLocations-city-data');\r\n\r\nexport const fetchPostalCodeData = withDFMCache(({\r\n cid, aid, campaignId, dateRange, metric,\r\n}) => fetch({\r\n cid,\r\n aid,\r\n campaignId,\r\n dateRange,\r\n metric,\r\n level: locationGranularity.postalCode,\r\n}), 'CardType-TopLocations-postal-code-data');\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { ReactTemplate } from '@bingads-webui-react/react-template';\r\n\r\nexport const BoldSyntax = props =>\r\n ( ({text}),\r\n }}\r\n template={props.template}\r\n />);\r\n\r\nBoldSyntax.propTypes = {\r\n template: PropTypes.string.isRequired,\r\n};\r\n\r\n","export const StringsMapping = {\r\n All_Change: _TL_('All changes'),\r\n Top_Decliners: _TL_('Top decliners'),\r\n Top_Gainers: _TL_('Top gainers'),\r\n EmptyState_Title: _TL_('Track your conversions'),\r\n EmptyState_Subtitle: _TL_('Visit the conversion tracking and UET dashboard pages to start creating conversion goals that will track your conversions and revenue.'),\r\n EmptyState_Action: _TL_('Set up conversion tracking'),\r\n\r\n Footer_ManageConversions: _TL_('Manage Conversion Goals'),\r\n Footer_PageCount: _TL_('Page {{pageNumber}} of 2', 'text in {{}} must NOT be translated'),\r\n\r\n Status_Title: _TL_('You have conversion tracking status errors that need to be fixed'),\r\n Status_Subtitle: _TL_('Visit the Conversion goals page to identify issues with your goals to get them back on track.'),\r\n Status_Alert: _TL_('Alert'),\r\n Status_RecentConversions: _TL_(' with no recent conversions', 'preserve one space at the beginning'),\r\n Status_RecordingConversions: _TL_(' with revenue attribute set', 'preserve one space at the beginning'),\r\n Status_Inactive: _TL_(' with inactive tags', 'preserve one space at the beginning'),\r\n Status_Unverified: _TL_(' with unverified tags', 'preserve one space at the beginning'),\r\n Status_Unavailable: _TL_(' with inactive due to unavailable tags', 'preserve one space at the beginning'),\r\n\r\n Coupon_Title: _TL_('Get {{value}} when you set up a conversion goal.'),\r\n\r\n Coupon_Step1: _TL_('{{b}}Step 1{{/b}}: Set up a conversion goal', 'text in between {{b}} {{/b}} is bolded'),\r\n Coupon_Step2: _TL_('{{b}}Step 2{{/b}}: ', 'text in between {{b}} {{/b}} is bolded'),\r\n Coupon_Step2_Detail: _TL_('Spend {{cost}} on your campaigns and you’ll automatically receive {{value}} in advertising credit.', 'text in {{}} must NOT be translated'),\r\n\r\n Number_Of_Goals: _TL_('{{number}} goals', 'text in {{}} must NOT be translated'),\r\n\r\n StatusMessage_InactiveDueToTagUnavailable: _TL_('The account no longer has access to the UET tag. Permissions to a UET tag in another manager account may have been removed, or this account was transferred and lost permission to a UET tag in a previous manager account.'),\r\n StatusMessage_NoRecentConversion: _TL_(\"We've seen your UET tag, but haven't recorded any conversions in the last 7 days. This is most likely because you either have created the goal incorrectly, have not tagged your entire website, especially the pages that have the conversion action or you don't have any users converting on your site.\"),\r\n StatusMessage_RecordingConversions: _TL_(\"We've seen your UET tag and have recorded conversions within the last 7 days. If your conversion window is greater than 7 days and you are filtering on the last 7 days, you may see this status even if no conversions are shown in the Conversions column, as conversions are reported at the time of the click.\"),\r\n StatusMessage_TagInactive: _TL_(\"We haven't received any user activity data from your UET tag in the last 24 hours. Make sure that the UET tag tracking code is still on your website.\"),\r\n StatusMessage_Unverified: _TL_(\"We haven't received any user activity data from the UET tag on your website. It can take up to 24 hours for us to verify. If you still see this status, you either have not added the UET tag tracking code to your website or there is an issue with the setup that you need to fix.\"),\r\n\r\n\r\n NoRecentConversion: _TL_('No recent conversions'),\r\n RecordingConversions: _TL_('No revenue attribute sets'),\r\n InactiveTag: _TL_('Inactive tags'),\r\n UnverifiedTag: _TL_('Unverified tags'),\r\n UnavailableTag: _TL_('Unavailable tags'),\r\n\r\n NoReveueText: _TL_(\"None of your conversion goals are tracking revenue. This means that you haven't associated any specific revenue value to your goals. Tracking revenue is a great way of measuring the revenue gained from advertisers converting on your ad campaign.\"),\r\n See_All: _TL_('See all'),\r\n Learn_More: _TL_('Learn more'),\r\n\r\n Hover_Change: _TL_('Change: {{value}} ({{percentageValue}})', 'text in {{}} must NOT be translated'),\r\n Empty_Data: _TL_('{{b}}No data available.{{/b}} To update the tile, select a different date range. If the tile remains blank, your account might have no data.'),\r\n};\r\n\r\nexport const GoalCategory = {\r\n AddToCart: _TL_('Add to cart'),\r\n BeginCheckout: _TL_('Begin checkout'),\r\n BookAppointment: _TL_('Book appointment'),\r\n Contact: _TL_('Contact'),\r\n GetDirections: _TL_('Get directions'),\r\n InStoreVisit: _TL_('Store visit'),\r\n None: _TL_('Unassigned'),\r\n Other: _TL_('Other'),\r\n OutboundClick: _TL_('Outbound click'),\r\n PageView: _TL_('Page view'),\r\n Purchase: _TL_('Purchase'),\r\n RequestQuote: _TL_('Request quote'),\r\n Signup: _TL_('Sign - up'),\r\n Subcribe: _TL_('Subscribe'),\r\n SubmitLeadForm: _TL_('Submit lead form'),\r\n};\r\n\r\nexport const metrici18nKeys = {\r\n ConversionsCredit: _TL_('Conversions: {{value}}', 'text in {{}} must NOT be translated'),\r\n AdvertiserReportedRevenue: _TL_('Revenue: {{value}}', 'text in {{}} must NOT be translated'),\r\n};\r\n","import React, { useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { BoldSyntax } from '../../common/util';\r\nimport { StringsMapping } from '../../common/strings';\r\n\r\nfunction CouponSetup(props) {\r\n const { newI18n, coupon } = props;\r\n\r\n const { cost, value } = coupon;\r\n\r\n const stepOneImgClass = 'coupon-step-one-image';\r\n const stepTwoImgClass = 'coupon-step-two-image';\r\n const couponText = useMemo(\r\n () =>\r\n newI18n.getString(StringsMapping.Coupon_Title, { value }),\r\n [newI18n, value]\r\n );\r\n\r\n const stepOneText = useMemo(\r\n () =>\r\n newI18n.getString(StringsMapping.Coupon_Step1),\r\n [newI18n]\r\n );\r\n const stepTwo = useMemo(\r\n () =>\r\n newI18n.getString(StringsMapping.Coupon_Step2),\r\n [newI18n]\r\n );\r\n\r\n const stepTwoText = useMemo(\r\n () =>\r\n newI18n.getString(StringsMapping.Coupon_Step2_Detail, { cost, value }),\r\n [cost, newI18n, value]\r\n );\r\n\r\n\r\n return (\r\n \r\n
{couponText}
\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 {stepTwoText}\r\n
\r\n
\r\n
\r\n \r\n );\r\n}\r\n\r\nCouponSetup.defaultProps = {\r\n};\r\n\r\nCouponSetup.propTypes = {\r\n newI18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n coupon: PropTypes.shape({\r\n cost: PropTypes.string.isRequired,\r\n value: PropTypes.string.isRequired,\r\n }).isRequired,\r\n};\r\n\r\nexport default CouponSetup;\r\n","import _ from 'underscore';\r\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { GetJsDataInfo } from '@bingads-webui-clientcenter/js-data-cc-rest-base';\r\nimport { formatCoupon } from '@bingads-webui-campaign/recommendation-core';\r\nimport { Button } from '@fluentui/react-components';\r\nimport { DefaultButton } from '@fluentui/react/lib/Button';\r\nimport { fetchCoupons, clearCouponsCache } from '@bingads-webui-campaign/overview-cards-common';\r\nimport CouponSetup from './conversion-setup/coupon-setup';\r\nimport { StringsMapping } from '../common/strings';\r\n\r\nfunction fetchCouponsMethod({\r\n ccJsData,\r\n currencyCode,\r\n i18n,\r\n setDataState,\r\n instrumentationLog,\r\n blockCard,\r\n willFetchData,\r\n renderedWithData,\r\n unblockCard,\r\n}) {\r\n blockCard();\r\n willFetchData();\r\n\r\n fetchCoupons({ ccJsData })\r\n .finally(() => {\r\n renderedWithData();\r\n unblockCard();\r\n }).then((coupons) => {\r\n if (coupons.length > 0) {\r\n const couponLocalized = formatCoupon({ i18n, coupon: coupons[0], currency: currencyCode });\r\n setDataState({ isDataLoaded: true, couponLocalized });\r\n } else {\r\n setDataState({ isDataLoaded: true, couponLocalized: [] });\r\n }\r\n })\r\n .catch((response) => {\r\n instrumentationLog.Error(response.message);\r\n setDataState({ isDataLoaded: true, couponLocalized: [] });\r\n });\r\n}\r\n\r\nfunction useFetchCoupon(props) {\r\n const {\r\n pageContext,\r\n i18n,\r\n instrumentationLog,\r\n blockCard,\r\n willFetchData,\r\n renderedWithData,\r\n unblockCard,\r\n } = props;\r\n\r\n const ccJsData = useMemo(() => GetJsDataInfo({\r\n cidFetcher: () => pageContext.CurrentCustomer.Id,\r\n uidFetcher: () => pageContext.CurrentUser.Id,\r\n willSupportCors: true,\r\n }, pageContext.CCBaseUrl, ['FeatureAdoptionCoupon']).jsDataCcRest, [pageContext.CCBaseUrl, pageContext.CurrentCustomer.Id, pageContext.CurrentUser.Id]);\r\n\r\n const { Id: accountId, CurrencyCode: currencyCode } = pageContext.CurrentAccount;\r\n const [{ isDataLoaded, couponLocalized }, setDataState] = useState({ isDataLoaded: false, couponLocalized: null });\r\n\r\n const fetchDate = useCallback(\r\n () => {\r\n fetchCouponsMethod({\r\n ccJsData,\r\n accountId,\r\n currencyCode,\r\n i18n,\r\n instrumentationLog,\r\n setDataState,\r\n blockCard,\r\n willFetchData,\r\n renderedWithData,\r\n unblockCard,\r\n });\r\n },\r\n [ccJsData, accountId, currencyCode, i18n, instrumentationLog, blockCard, willFetchData, renderedWithData, unblockCard]\r\n );\r\n\r\n useEffect(() => {\r\n fetchDate();\r\n return clearCouponsCache;\r\n }, [fetchDate]);\r\n\r\n return { isDataLoaded, couponLocalized };\r\n}\r\n\r\nfunction EmptyState(props) {\r\n const {\r\n router,\r\n pageContext,\r\n instrumentationLog,\r\n i18n,\r\n newI18n,\r\n permissions,\r\n blockCard,\r\n willFetchData,\r\n renderedWithData,\r\n unblockCard,\r\n } = props;\r\n\r\n const imgClass = 'conversion_tracking_setup_img';\r\n const requiredPermission = permissions.dynamic.OverviewPageFluentV2 || permissions.dynamic.OverviewPageFluent2;\r\n\r\n const titleString = useMemo(() =>\r\n newI18n.getString(StringsMapping.EmptyState_Title), [newI18n]);\r\n const subtitleString = useMemo(() =>\r\n newI18n.getString(StringsMapping.EmptyState_Subtitle), [newI18n]);\r\n const actionString = useMemo(() =>\r\n newI18n.getString(StringsMapping.EmptyState_Action), [newI18n]);\r\n\r\n const { isDataLoaded, couponLocalized } = useFetchCoupon({\r\n pageContext,\r\n i18n,\r\n instrumentationLog,\r\n\r\n blockCard,\r\n willFetchData,\r\n renderedWithData,\r\n unblockCard,\r\n });\r\n\r\n const hasCoupons = useMemo(() => _.size(couponLocalized) > 0, [couponLocalized]);\r\n\r\n const navigateToConversionGoals = useCallback(() => {\r\n if (router) {\r\n instrumentationLog.SetUpConversionClicked(hasCoupons);\r\n router.navigateToRoute('conversiongoals');\r\n }\r\n }, [hasCoupons, instrumentationLog, router]);\r\n\r\n const renderView = useCallback(() => {\r\n if (isDataLoaded) {\r\n if (hasCoupons) {\r\n instrumentationLog.CouponIsShown();\r\n return ();\r\n }\r\n instrumentationLog.NoCoupon();\r\n }\r\n return (\r\n \r\n
\r\n
\r\n
\r\n
{titleString}
\r\n
{subtitleString}
\r\n \r\n );\r\n }, [couponLocalized, hasCoupons, instrumentationLog, isDataLoaded, newI18n, subtitleString, titleString]);\r\n\r\n return (\r\n
\r\n {renderView()}\r\n
\r\n {requiredPermission ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n
\r\n );\r\n}\r\n\r\nEmptyState.defaultProps = {\r\n router: {\r\n navigateToRoute: _.noop,\r\n },\r\n instrumentationLog: {\r\n SetUpConversionClicked: _.noop,\r\n CouponIsShown: _.noop,\r\n NoCoupon: _.noop,\r\n Error: _.noop,\r\n },\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({\r\n OverviewPageFluentV2: false,\r\n }),\r\n }),\r\n blockCard: _.noop,\r\n willFetchData: _.noop,\r\n renderedWithData: _.noop,\r\n unblockCard: _.noop,\r\n};\r\n\r\nEmptyState.propTypes = {\r\n newI18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n router: PropTypes.shape({\r\n navigateToRoute: PropTypes.func,\r\n }),\r\n instrumentationLog: PropTypes.shape({\r\n SetUpConversionClicked: PropTypes.func,\r\n CouponIsShown: PropTypes.func,\r\n NoCoupon: PropTypes.func,\r\n Error: PropTypes.func,\r\n }),\r\n pageContext: PropTypes.shape({\r\n CurrentCustomer: PropTypes.shape({\r\n Id: PropTypes.number.isRequired,\r\n }).isRequired,\r\n CurrentUser: PropTypes.shape({\r\n Id: PropTypes.number.isRequired,\r\n CurrencyCode: PropTypes.string.isRequired,\r\n }).isRequired,\r\n CurrentAccount: PropTypes.shape({\r\n Id: PropTypes.number.isRequired,\r\n CurrencyCode: PropTypes.string.isRequired,\r\n }).isRequired,\r\n CCBaseUrl: PropTypes.string.isRequired,\r\n }).isRequired,\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({\r\n OverviewPageFluentV2: PropTypes.bool,\r\n OverviewPageFluent2: PropTypes.bool,\r\n }),\r\n }),\r\n blockCard: PropTypes.func,\r\n willFetchData: PropTypes.func,\r\n renderedWithData: PropTypes.func,\r\n unblockCard: PropTypes.func,\r\n};\r\n\r\nexport default EmptyState;\r\n","export const defaultMetrics = [\r\n { key: 'ConversionsCredit', i18nKey: _TL_('Conversions') },\r\n { key: 'AdvertiserReportedRevenue', i18nKey: _TL_('Revenue') },\r\n];\r\n","import React, { useMemo } from 'react';\r\nimport classNames from 'classnames';\r\nimport PropTypes from 'prop-types';\r\n\r\nfunction GridIncreaseCell(props) {\r\n const {\r\n item,\r\n rowClass,\r\n } = props;\r\n\r\n const space = useMemo(() => item.increaseSpace, [item.increaseSpace]);\r\n const bar = useMemo(() => item.increaseBar, [item.increaseBar]);\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nGridIncreaseCell.defaultProps = {\r\n};\r\nGridIncreaseCell.propTypes = {\r\n rowClass: PropTypes.string.isRequired,\r\n item: PropTypes.shape({\r\n increaseSpace: PropTypes.number,\r\n increaseBar: PropTypes.number,\r\n }).isRequired,\r\n};\r\n\r\nexport default GridIncreaseCell;\r\n","import React, { useMemo } from 'react';\r\nimport classNames from 'classnames';\r\nimport PropTypes from 'prop-types';\r\n\r\nfunction GridDeclineCell(props) {\r\n const {\r\n item,\r\n rowClass,\r\n } = props;\r\n\r\n const space = useMemo(() => item.declineSpace, [item.declineSpace]);\r\n const bar = useMemo(() => item.declineBar, [item.declineBar]);\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nGridDeclineCell.defaultProps = {\r\n};\r\nGridDeclineCell.propTypes = {\r\n item: PropTypes.shape({\r\n declineSpace: PropTypes.number,\r\n declineBar: PropTypes.number,\r\n }).isRequired,\r\n rowClass: PropTypes.string.isRequired,\r\n};\r\n\r\nexport default GridDeclineCell;\r\n","/* eslint-disable jsx-a11y/anchor-is-valid */\r\n/* eslint-disable jsx-a11y/click-events-have-key-events */\r\n/* eslint-disable jsx-a11y/no-static-element-interactions */\r\nimport React, { useMemo, useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { Constants } from '@bingads-webui-clientcenter/entity-utils';\r\nimport _ from 'underscore';\r\n\r\nfunction GridNameCell(props) {\r\n const {\r\n item,\r\n i18n,\r\n rowClass,\r\n GoalCategoryFilterStore,\r\n router,\r\n instrumentationLog,\r\n } = props;\r\n\r\n const nameCellData = useMemo(() => ({\r\n status: item.status,\r\n name: item.name,\r\n typeName: item.typeName,\r\n campaignType: item.campaignType,\r\n rawStatus: item.rawStatus,\r\n category: item.category,\r\n }), [item]);\r\n\r\n const isAccount = useMemo(() => item.typeName === 'Account', [item]);\r\n const { AccountActivityStatus } = Constants;\r\n\r\n const statusIcon = useMemo(() => {\r\n if (isAccount) {\r\n switch (nameCellData.status) {\r\n case AccountActivityStatus.Errors:\r\n return (
);\r\n case AccountActivityStatus.Deleted:\r\n return (
);\r\n case AccountActivityStatus.Enabled:\r\n return (
);\r\n default:\r\n return (
);\r\n }\r\n } else {\r\n return (
);\r\n }\r\n }, [AccountActivityStatus.Deleted, AccountActivityStatus.Enabled, AccountActivityStatus.Errors, isAccount, nameCellData.status]);\r\n\r\n const navigateToConversionGoals = useCallback(() => {\r\n if (router) {\r\n if (instrumentationLog) {\r\n instrumentationLog.GridNameClicked(nameCellData.name);\r\n }\r\n router.navigateToRoute('conversiongoals');\r\n }\r\n }, [instrumentationLog, nameCellData.name, router]);\r\n\r\n const updateFilterAndRoute = useCallback(() => {\r\n if (GoalCategoryFilterStore) {\r\n GoalCategoryFilterStore(nameCellData.category);\r\n }\r\n navigateToConversionGoals();\r\n }, [GoalCategoryFilterStore, nameCellData.category, navigateToConversionGoals]);\r\n return (\r\n
\r\n
\r\n {statusIcon}\r\n
\r\n {nameCellData.name}\r\n \r\n
\r\n );\r\n}\r\n\r\nGridNameCell.propTypes = {\r\n item: PropTypes.shape({\r\n status: PropTypes.string,\r\n name: PropTypes.string,\r\n category: PropTypes.string,\r\n typeName: PropTypes.string,\r\n campaignType: PropTypes.string,\r\n rawStatus: PropTypes.string,\r\n hideToolTip: PropTypes.bool,\r\n }),\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n rowClass: PropTypes.string,\r\n GoalCategoryFilterStore: PropTypes.func,\r\n router: PropTypes.shape({\r\n navigateToRoute: PropTypes.func,\r\n }),\r\n instrumentationLog: PropTypes.shape({\r\n GridNameClicked: PropTypes.func,\r\n }),\r\n};\r\nGridNameCell.defaultProps = {\r\n item: {},\r\n rowClass: '',\r\n GoalCategoryFilterStore: _.noop,\r\n router: {\r\n navigateToRoute: _.noop,\r\n },\r\n instrumentationLog: {\r\n GridNameClicked: _.noop,\r\n },\r\n};\r\n\r\nexport default GridNameCell;\r\n","import React, { useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {\r\n getComparisonDateRange,\r\n} from '@bingads-webui-campaign/overview-cards-common';\r\nimport { StringsMapping, metrici18nKeys } from '../../common/strings';\r\n\r\nfunction KpiGrid(props) {\r\n const {\r\n currentDate,\r\n compareDate,\r\n item,\r\n newI18n,\r\n metric,\r\n } = props;\r\n\r\n const changeString = useMemo(() => newI18n.getString(StringsMapping.Hover_Change, {\r\n value: item.formattedValue,\r\n percentageValue: item.formattedPercentageValue,\r\n }), [item.formattedPercentageValue, item.formattedValue, newI18n]);\r\n\r\n const metricCurrent = useMemo(\r\n () => newI18n.getString(metrici18nKeys[metric], { value: item.formattedMetrics }),\r\n [item.formattedMetrics, metric, newI18n]\r\n );\r\n\r\n const metricCompared = useMemo(\r\n () => newI18n.getString(metrici18nKeys[metric], { value: item.formattedPeriodMetrics }),\r\n [item.formattedPeriodMetrics, metric, newI18n]\r\n );\r\n\r\n return (\r\n
\r\n
\r\n
\r\n {currentDate}\r\n
\r\n {metricCurrent}\r\n
\r\n
\r\n
\r\n {compareDate}\r\n
\r\n {metricCompared}\r\n
\r\n
\r\n
\r\n {changeString}\r\n
\r\n\r\n
\r\n );\r\n}\r\n\r\nfunction GridHoverContainer(props) {\r\n const {\r\n isGrid,\r\n isIncrease,\r\n item,\r\n rowClass,\r\n newI18n,\r\n dateRange,\r\n metric,\r\n } = props;\r\n\r\n const startDate = useMemo(\r\n () =>\r\n newI18n.formatDate(dateRange.start),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [dateRange.start]\r\n );\r\n\r\n const endDate = useMemo(\r\n () =>\r\n newI18n.formatDate(dateRange.end),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [dateRange.end]\r\n );\r\n\r\n const compareDate = useMemo(\r\n () => {\r\n const comparisonDateRange = getComparisonDateRange(dateRange);\r\n const comparisonStartDate = newI18n.formatDate(comparisonDateRange.start);\r\n const comparisonEndDate = newI18n.formatDate(comparisonDateRange.end);\r\n if (startDate === endDate) {\r\n return comparisonStartDate;\r\n }\r\n return `${comparisonStartDate} - ${comparisonEndDate}`;\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [dateRange]\r\n );\r\n\r\n const currentDate = useMemo(\r\n () => {\r\n if (startDate === endDate) {\r\n return startDate;\r\n }\r\n return `${startDate} - ${endDate}`;\r\n },\r\n [startDate, endDate]\r\n );\r\n\r\n const hoverClassName = useMemo(\r\n () => {\r\n if (isGrid) {\r\n return 'graph-hover-target';\r\n }\r\n return 'pop-hover-target';\r\n },\r\n [isGrid]\r\n );\r\n\r\n const KpiColorClassName = useMemo(\r\n () => (isIncrease ? 'kpi-increased' : 'kpi-declined'),\r\n [isIncrease]\r\n );\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
{item.name}
\r\n \r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nGridHoverContainer.defaultProps = {\r\n isGrid: false,\r\n isIncrease: false,\r\n};\r\n\r\nGridHoverContainer.propTypes = {\r\n isGrid: PropTypes.bool,\r\n isIncrease: PropTypes.bool,\r\n rowClass: PropTypes.string.isRequired,\r\n item: PropTypes.shape({\r\n increaseSpace: PropTypes.number,\r\n increaseBar: PropTypes.number,\r\n name: PropTypes.string,\r\n }).isRequired,\r\n newI18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n formatDate: PropTypes.func.isRequired,\r\n }).isRequired,\r\n dateRange: PropTypes.shape({\r\n start: PropTypes.shape({}).isRequired,\r\n end: PropTypes.shape({}).isRequired,\r\n }).isRequired,\r\n metric: PropTypes.string.isRequired,\r\n};\r\n\r\nKpiGrid.defaultProps = {\r\n};\r\n\r\nKpiGrid.propTypes = {\r\n currentDate: PropTypes.string.isRequired,\r\n compareDate: PropTypes.string.isRequired,\r\n item: PropTypes.shape({\r\n formattedValue: PropTypes.string,\r\n formattedPercentageValue: PropTypes.string,\r\n formattedMetrics: PropTypes.string,\r\n formattedPeriodMetrics: PropTypes.string,\r\n }).isRequired,\r\n newI18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n formatDate: PropTypes.func.isRequired,\r\n }).isRequired,\r\n metric: PropTypes.string.isRequired,\r\n};\r\n\r\nexport default GridHoverContainer;\r\n","import React, { useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport GridIncreaseCell from './grid-increase-graph';\r\nimport GridDeclineCell from './grid-decline-graph';\r\nimport GridNameCell from './grid-name-cell';\r\nimport HoverContainer from './grid-hover-container';\r\n\r\nfunction GridPopCell(props) {\r\n const {\r\n item,\r\n rowClass,\r\n } = props;\r\n\r\n return (\r\n \r\n
{item.formattedValue}
\r\n
{item.formattedPercentageValue}
\r\n
{item.fromTo}
\r\n
\r\n );\r\n}\r\n\r\nGridPopCell.defaultProps = {\r\n};\r\nGridPopCell.propTypes = {\r\n item: PropTypes.shape({\r\n formattedValue: PropTypes.string.isRequired,\r\n formattedPercentageValue: PropTypes.string.isRequired,\r\n fromTo: PropTypes.string.isRequired,\r\n }).isRequired,\r\n rowClass: PropTypes.string.isRequired,\r\n};\r\n\r\nfunction GridRow(props) {\r\n const {\r\n item,\r\n index,\r\n i18n,\r\n newI18n,\r\n dateRange,\r\n metric,\r\n } = props;\r\n\r\n const rowClass = useMemo(() => `conversion-goals-grid-row-${index + 1}`, [index]);\r\n const isIncrease = useMemo(() => item.increaseSpace < 100, [item.increaseSpace]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nGridRow.defaultProps = {\r\n};\r\n\r\nGridRow.propTypes = {\r\n item: PropTypes.shape({\r\n increaseSpace: PropTypes.number.isRequired,\r\n }).isRequired,\r\n index: PropTypes.number.isRequired,\r\n i18n: PropTypes.shape({}).isRequired,\r\n newI18n: PropTypes.shape({}).isRequired,\r\n dateRange: PropTypes.shape({}).isRequired,\r\n metric: PropTypes.string.isRequired,\r\n};\r\n\r\nexport default GridRow;\r\n","import React, { useMemo } from 'react';\r\nimport _ from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport GridRow from './grid-row';\r\nimport { StringsMapping } from '../../common/strings';\r\nimport { BoldSyntax } from '../../common/util';\r\n\r\nfunction ConversionTrackingGrid(props) {\r\n const {\r\n deps,\r\n metric,\r\n processedData,\r\n newI18n,\r\n } = props;\r\n\r\n const metricName = useMemo(\r\n () =>\r\n (metric ? deps.s$i18n.property('PerformanceMetric', metric) : ''),\r\n [deps.s$i18n, metric]\r\n );\r\n const emptyText = useMemo(\r\n () => newI18n.getString(StringsMapping.Empty_Data),\r\n [newI18n]\r\n );\r\n\r\n const renderGridRows = useMemo(() => (\r\n _.size(processedData) === 0 ?\r\n
\r\n \r\n
:\r\n\r\n
\r\n {processedData.map((currentRow, index) => (index < 4 ?\r\n : null))}\r\n
), [emptyText, metricName, processedData, props]);\r\n\r\n return (\r\n
\r\n {renderGridRows}\r\n
\r\n );\r\n}\r\n\r\nConversionTrackingGrid.defaultProps = {\r\n emptyText: '',\r\n};\r\nConversionTrackingGrid.propTypes = {\r\n deps: PropTypes.shape({\r\n s$i18n: PropTypes.shape({\r\n property: PropTypes.func.isRequired,\r\n }).isRequired,\r\n }).isRequired,\r\n metric: PropTypes.string.isRequired,\r\n processedData: PropTypes.arrayOf(PropTypes.shape({\r\n })).isRequired,\r\n newI18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n emptyText: PropTypes.string,\r\n};\r\n\r\nexport default ConversionTrackingGrid;\r\n","// this is the error type of conversion goals\r\nimport { StringsMapping } from './strings';\r\n\r\nexport const ErrorType = {\r\n NoRecentConversion: 'NoRecentConversion',\r\n RecordingConversions: 'RecordingConversions',\r\n TagInactive: 'TagInactive',\r\n Unverified: 'Unverified',\r\n UnavailableTag: 'InactiveDueToTagUnavailable',\r\n};\r\n\r\nexport const Errors = {\r\n [ErrorType.NoRecentConversion]: {\r\n ClassName: 'no-recent-conversion',\r\n Title: StringsMapping.NoRecentConversion,\r\n Message: StringsMapping.StatusMessage_NoRecentConversion,\r\n Status: StringsMapping.Status_RecentConversions,\r\n },\r\n // No revenue attribute\r\n [ErrorType.RecordingConversions]: {\r\n ClassName: 'no-revenue-attribute',\r\n Title: StringsMapping.RecordingConversions,\r\n Message: StringsMapping.StatusMessage_RecordingConversions,\r\n Status: StringsMapping.Status_RecordingConversions,\r\n },\r\n [ErrorType.TagInactive]: {\r\n ClassName: 'tag-inactive',\r\n Title: StringsMapping.InactiveTag,\r\n Message: StringsMapping.StatusMessage_TagInactive,\r\n Status: StringsMapping.Status_Inactive,\r\n },\r\n [ErrorType.Unverified]: {\r\n ClassName: 'unverified-tags',\r\n Title: StringsMapping.UnverifiedTag,\r\n Message: StringsMapping.StatusMessage_Unverified,\r\n Status: StringsMapping.Status_Unverified,\r\n },\r\n [ErrorType.UnavailableTag]: {\r\n ClassName: 'unavailable-tags',\r\n Title: StringsMapping.UnavailableTag,\r\n Message: StringsMapping.StatusMessage_InactiveDueToTagUnavailable,\r\n Status: StringsMapping.Status_Unavailable,\r\n },\r\n};\r\n","import React, { useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Callout } from '@bingads-webui-react/callout';\r\nimport { withLock, keyVault } from '@bingads-webui-react/popup-manager';\r\n\r\nexport function PopupCallout(props) {\r\n const {\r\n title,\r\n content,\r\n target,\r\n close,\r\n popoverId,\r\n } = props;\r\n\r\n const { right } = target.getBoundingClientRect();\r\n const calloutMaxWidth = 325; // this value is defined in global style\r\n const placement = useMemo(() => (right + calloutMaxWidth > window.innerWidth ? 'left' : 'right'), [right]);\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n}\r\n\r\nPopupCallout.propTypes = {\r\n title: PropTypes.oneOfType([\r\n PropTypes.element.isRequired,\r\n PropTypes.string.isRequired,\r\n ]).isRequired,\r\n /**\r\n * the content element or text of the callout\r\n */\r\n content: PropTypes.oneOfType([\r\n PropTypes.element.isRequired,\r\n PropTypes.string.isRequired,\r\n ]).isRequired,\r\n /**\r\n * target of the callout, DOM element\r\n */\r\n target: PropTypes.instanceOf(Element).isRequired,\r\n /**\r\n * function called to remove callout\r\n */\r\n close: PropTypes.func.isRequired,\r\n /**\r\n * callout id\r\n */\r\n popoverId: PropTypes.string.isRequired,\r\n /**\r\n * view that has event triggered to close the popup\r\n */\r\n view: PropTypes.shape({\r\n on: PropTypes.func.isRequired,\r\n off: PropTypes.func.isRequired,\r\n }),\r\n};\r\n\r\nPopupCallout.defaultProps = {\r\n view: null,\r\n};\r\n\r\nexport const CalloutWithLock = withLock(PopupCallout, {\r\n lockKey: keyVault.hoveringPopup,\r\n force: true,\r\n});\r\n","/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport className from 'classnames';\r\nimport { Link } from '@fluentui/react';\r\nimport { ErrorType, Errors } from '../../common/error-type';\r\nimport { StringsMapping } from '../../common/strings';\r\nimport { CalloutWithLock } from './popup';\r\n\r\nfunction PopupContent({\r\n bodyText, goalNames = [], newI18n, updateFilterAndRoute,\r\n}) {\r\n const goalList = useMemo(\r\n () => {\r\n if (goalNames.length === 0) {\r\n return null;\r\n }\r\n return (\r\n {goalNames.map(goalName =>\r\n (\r\n
  • \r\n {goalName}\r\n
  • \r\n \r\n ))\r\n }\r\n \r\n );\r\n }\r\n , [goalNames]\r\n );\r\n\r\n const seeAllText = useMemo(\r\n () => newI18n.getString(StringsMapping.See_All)\r\n , [newI18n]\r\n );\r\n return (\r\n \r\n
    \r\n {bodyText}\r\n {goalList}\r\n \r\n {seeAllText}\r\n \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nfunction PopupContentNoRevenue({\r\n newI18n,\r\n}) {\r\n const noRevenueText = useMemo(\r\n () => newI18n.getString(StringsMapping.NoReveueText)\r\n , [newI18n]\r\n );\r\n\r\n return (\r\n \r\n
    \r\n {noRevenueText}\r\n \r\n {newI18n.getString(StringsMapping.Learn_More)}\r\n \r\n
    \r\n
    \r\n );\r\n}\r\n\r\n\r\nfunction Line(props) {\r\n const {\r\n number, type, newI18n, goalNames,\r\n TrackingTypeFilterStore,\r\n router,\r\n instrumentationLog,\r\n } = props;\r\n\r\n const [hoverCardStatus, setHoverCardStatus] = useState(false);\r\n\r\n const navigateToConversionGoals = useCallback(() => {\r\n if (router) {\r\n instrumentationLog.SeeAllClicked(type);\r\n router.navigateToRoute('conversiongoals');\r\n }\r\n }, [instrumentationLog, router, type]);\r\n\r\n const updateFilterAndRoute = useCallback(() => {\r\n if (TrackingTypeFilterStore) {\r\n TrackingTypeFilterStore(type);\r\n }\r\n navigateToConversionGoals();\r\n }, [TrackingTypeFilterStore, navigateToConversionGoals, type]);\r\n\r\n const formattedNumber = useMemo(\r\n () => `${newI18n.getString(StringsMapping.Number_Of_Goals, { number })}`,\r\n [newI18n, number]\r\n );\r\n const titleText = useMemo(\r\n () => newI18n.getString(Errors[type].Title),\r\n [newI18n, type]\r\n );\r\n const statusText = useMemo(\r\n () => newI18n.getString(Errors[type].Status),\r\n [newI18n, type]\r\n );\r\n const MessageText = useMemo(\r\n () => newI18n.getString(Errors[type].Message),\r\n [newI18n, type]\r\n );\r\n const errorClassName = useMemo(() => Errors[type].ClassName, [type]);\r\n\r\n const ref = useRef(null);\r\n\r\n const renderLine = useCallback(() => {\r\n if (type === ErrorType.RecordingConversions) {\r\n return (\r\n setHoverCardStatus(false)}\r\n >\r\n {`${formattedNumber}${statusText}`}\r\n {hoverCardStatus && }\r\n close={() => { setHoverCardStatus(false); }}\r\n popoverId={type}\r\n />}\r\n
    \r\n );\r\n }\r\n return (\r\n setHoverCardStatus(false)}\r\n >\r\n setHoverCardStatus(true)}\r\n ref={ref}\r\n >{formattedNumber}\r\n
    \r\n {statusText}\r\n {hoverCardStatus && }\r\n close={() => { setHoverCardStatus(false); }}\r\n popoverId={type}\r\n />}\r\n
    \r\n );\r\n }, [MessageText, errorClassName, formattedNumber, goalNames, hoverCardStatus, newI18n, statusText, titleText, type, updateFilterAndRoute]);\r\n\r\n return renderLine();\r\n}\r\n\r\nPopupContent.defaultProps = {\r\n bodyText: '',\r\n goalNames: [],\r\n updateFilterAndRoute: _.noop,\r\n};\r\n\r\nPopupContent.propTypes = {\r\n bodyText: PropTypes.string,\r\n goalNames: PropTypes.arrayOf(PropTypes.string),\r\n newI18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n updateFilterAndRoute: PropTypes.func,\r\n};\r\n\r\n\r\nPopupContentNoRevenue.propTypes = {\r\n newI18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n};\r\nexport default Line;\r\n","import _ from 'underscore';\r\nimport React, { useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Line from './line';\r\nimport { ErrorType } from '../../common/error-type';\r\nimport { StringsMapping } from '../../common/strings';\r\n\r\nfunction StatusOverview(props) {\r\n const {\r\n newI18n,\r\n data,\r\n noConversionGoalsWithRevenue,\r\n TrackingTypeFilterStore,\r\n router,\r\n instrumentationLog,\r\n } = props;\r\n\r\n const title = useMemo(\r\n () =>\r\n newI18n.getString(StringsMapping.Status_Title),\r\n [newI18n]\r\n );\r\n const subtitle = useMemo(\r\n () =>\r\n newI18n.getString(StringsMapping.Status_Subtitle)\r\n , [newI18n]\r\n );\r\n const alertText = useMemo(\r\n () =>\r\n newI18n.getString(StringsMapping.Status_Alert)\r\n , [newI18n]\r\n );\r\n\r\n const alertNum = useMemo(\r\n () => _.reduce(data, (memo, status) => memo + status.GoalCount, 0),\r\n [data]\r\n );\r\n\r\n return (\r\n
    \r\n
    \r\n
    {alertText}
    \r\n
    {alertNum}
    \r\n
    \r\n
    \r\n
    \r\n
    {title}
    \r\n
    {subtitle}
    \r\n
    \r\n
    \r\n {_.map(data, (status, index) => (\r\n \r\n \r\n \r\n ))\r\n }\r\n {noConversionGoalsWithRevenue && (\r\n \r\n )}\r\n
    \r\n
    \r\n\r\n
    \r\n );\r\n}\r\nStatusOverview.defaultProps = {\r\n data: [],\r\n noConversionGoalsWithRevenue: false,\r\n TrackingTypeFilterStore: _.noop,\r\n router: { navigateToRoute: _.noop },\r\n instrumentationLog: { SeeAllClicked: _.noop },\r\n};\r\n\r\nStatusOverview.propTypes = {\r\n data: PropTypes.arrayOf(PropTypes.shape({\r\n GoalCount: PropTypes.number.isRequired,\r\n GoalNames: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n GoalTrackingStatus: PropTypes.string.isRequired,\r\n })),\r\n newI18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n noConversionGoalsWithRevenue: PropTypes.bool,\r\n TrackingTypeFilterStore: PropTypes.func,\r\n router: PropTypes.shape({\r\n navigateToRoute: PropTypes.func.isRequired,\r\n }),\r\n instrumentationLog: PropTypes.shape({\r\n SeeAllClicked: PropTypes.func.isRequired,\r\n }),\r\n};\r\n\r\nexport default StatusOverview;\r\n","import _ from 'underscore';\r\nimport React, { useCallback, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Button, Tooltip } from '@fluentui/react-components';\r\nimport { ChevronLeftRegular, ChevronRightRegular } from '@fluentui/react-icons';\r\nimport { IconButton, DefaultButton } from '@fluentui/react/lib/Button';\r\nimport { StringsMapping } from '../../common/strings';\r\n\r\nfunction ConversionTrackingFooter(props) {\r\n const {\r\n newI18n,\r\n pageNumber,\r\n setPageNumber,\r\n router,\r\n instrumentationLog,\r\n totalPageCount,\r\n permissions,\r\n } = props;\r\n\r\n const manageGoalsText = useMemo(\r\n () =>\r\n newI18n.getString(StringsMapping.Footer_ManageConversions),\r\n [newI18n]\r\n );\r\n\r\n const pageCount = useMemo(\r\n () =>\r\n newI18n.getString(\r\n StringsMapping.Footer_PageCount,\r\n { pageNumber: pageNumber + 1 }\r\n ),\r\n [newI18n, pageNumber]\r\n );\r\n\r\n const navigateToConversionGoals = useCallback(() => {\r\n if (router) {\r\n if (instrumentationLog) {\r\n instrumentationLog.ManageConversionsClicked();\r\n }\r\n router.navigateToRoute('conversiongoals');\r\n }\r\n }, [instrumentationLog, router]);\r\n\r\n const requiredPermission = permissions.dynamic.OverviewPageFluentV2 || permissions.dynamic.OverviewPageFluent2;\r\n\r\n if (totalPageCount === 1) {\r\n return (\r\n
    \r\n
    \r\n {requiredPermission ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n {requiredPermission ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
    \r\n
    \r\n
    \r\n {pageCount}\r\n
    \r\n {requiredPermission ? (\r\n <>\r\n \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nConversionTrackingFooter.defaultProps = {\r\n setPageNumber: _.noop,\r\n router: {\r\n navigateToRoute: _.noop,\r\n },\r\n instrumentationLog: {\r\n ManageConversionsClicked: _.noop,\r\n },\r\n totalPageCount: 1,\r\n};\r\nConversionTrackingFooter.propTypes = {\r\n newI18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n pageNumber: PropTypes.number.isRequired,\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({\r\n OverviewPageFluentV2: PropTypes.bool,\r\n OverviewPageFluent2: PropTypes.bool,\r\n }),\r\n }).isRequired,\r\n setPageNumber: PropTypes.func,\r\n router: PropTypes.shape({\r\n navigateToRoute: PropTypes.func,\r\n }),\r\n instrumentationLog: PropTypes.shape({\r\n ManageConversionsClicked: PropTypes.func,\r\n }),\r\n totalPageCount: PropTypes.number,\r\n};\r\n\r\nexport default ConversionTrackingFooter;\r\n","/* eslint-disable jsx-a11y/no-static-element-interactions */\r\n/* eslint-disable jsx-a11y/click-events-have-key-events */\r\n/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useState, useEffect, useCallback, useRef, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nfunction useOutsideAlerter(ref, setShowDropDown) {\r\n useEffect(() => {\r\n function handleClickOutside(event) {\r\n if (ref.current && !ref.current.contains(event.target)) {\r\n setShowDropDown(false);\r\n }\r\n }\r\n // Bind the event listener\r\n document.addEventListener('click', handleClickOutside);\r\n return () => {\r\n // Unbind the event listener on clean up\r\n document.removeEventListener('click', handleClickOutside);\r\n };\r\n }, [ref, setShowDropDown]);\r\n}\r\n\r\n\r\nfunction GridMetricPicker(props) {\r\n const {\r\n metrics,\r\n newI18n,\r\n updateMetric,\r\n } = props;\r\n\r\n const [showDropDown, setShowDropDown] = useState(false);\r\n const [selectedMetric, setSelectedMetric] = useState(metrics[0]);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const selectedMetricText = useMemo(() => newI18n.getString(selectedMetric.i18nKey), [selectedMetric.i18nKey]);\r\n\r\n const selectNewMetric = useCallback((metric) => {\r\n if (updateMetric) {\r\n updateMetric(metric.key);\r\n }\r\n setShowDropDown(false);\r\n setSelectedMetric(metric);\r\n }, [updateMetric]);\r\n\r\n\r\n const listItems = useMemo(() => metrics.map(metric => (\r\n
  • \r\n { selectNewMetric(metric); }}>\r\n {newI18n.getString(metric.i18nKey)}\r\n \r\n
  • \r\n )), [metrics, newI18n, selectNewMetric]);\r\n\r\n\r\n const ref = useRef(null);\r\n useOutsideAlerter(ref, setShowDropDown);\r\n\r\n return (\r\n
    \r\n
    \r\n { setShowDropDown(!showDropDown); }}\r\n >\r\n
    \r\n {selectedMetricText}\r\n
    \r\n \r\n
    \r\n {showDropDown &&
      {listItems}
    }\r\n
    \r\n
    \r\n );\r\n}\r\n\r\nGridMetricPicker.defaultProps = {\r\n updateMetric: undefined,\r\n};\r\nGridMetricPicker.propTypes = {\r\n metrics: PropTypes.arrayOf(PropTypes.shape({\r\n key: PropTypes.string.isRequired,\r\n i18nKey: PropTypes.string.isRequired,\r\n })).isRequired,\r\n updateMetric: PropTypes.func,\r\n newI18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n};\r\n\r\nexport default GridMetricPicker;\r\n","import React, { useState, useCallback, useMemo } from 'react';\r\nimport { Dropdown } from '@fluentui/react/lib/Dropdown';\r\nimport PropTypes from 'prop-types';\r\n\r\nconst dropdownStyles = {\r\n dropdown: {\r\n width: 120,\r\n border: 'none',\r\n boxShadow: 'none',\r\n outline: 'none',\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 border: 'none',\r\n boxShadow: 'none',\r\n outline: 'none',\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 root: {\r\n border: 'none',\r\n boxShadow: 'none',\r\n outline: 'none',\r\n },\r\n callout: {\r\n border: 'none',\r\n boxShadow: 'none',\r\n outline: 'none',\r\n },\r\n caretDown: {\r\n border: 'none',\r\n boxShadow: 'none',\r\n outline: 'none',\r\n },\r\n};\r\n\r\nfunction MetricPicker(props) {\r\n const { metrics, newI18n, updateMetric } = props;\r\n\r\n const [selectedMetric, setSelectedMetric] = useState(metrics[0]);\r\n\r\n const options = useMemo(() => metrics.map(metric => ({\r\n key: metric.key,\r\n text: newI18n.getString(metric.i18nKey),\r\n })), [metrics, newI18n]);\r\n\r\n const handleChange = useCallback((event, option) => {\r\n const metric = metrics.find(m => m.key === option.key);\r\n if (updateMetric && metric) {\r\n updateMetric(metric.key);\r\n }\r\n setSelectedMetric(metric);\r\n }, [metrics, updateMetric]);\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nMetricPicker.defaultProps = {\r\n updateMetric: undefined,\r\n};\r\n\r\nMetricPicker.propTypes = {\r\n metrics: PropTypes.arrayOf(PropTypes.shape({\r\n key: PropTypes.string.isRequired,\r\n i18nKey: PropTypes.string.isRequired,\r\n })).isRequired,\r\n updateMetric: PropTypes.func,\r\n newI18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n};\r\n\r\nexport default MetricPicker;\r\n","\r\nimport React, { useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {\r\n getComparisonDateRange,\r\n getPopDescription,\r\n} from '@bingads-webui-campaign/overview-cards-common';\r\nimport { HelpButton } from '@bingads-webui-react/help-popup';\r\nimport GridMetricPicker from './grid-metric-picker';\r\nimport GridPicker from './grid-metric-picker-fluent';\r\n\r\nfunction GridHeader(props) {\r\n const {\r\n dateRange,\r\n i18n,\r\n permissions,\r\n } = props;\r\n\r\n const comparisonDateRange = useMemo(\r\n () =>\r\n getComparisonDateRange(dateRange),\r\n [dateRange]\r\n );\r\n\r\n const popDescription = useMemo(\r\n () =>\r\n getPopDescription(i18n, comparisonDateRange),\r\n [i18n, comparisonDateRange]\r\n );\r\n\r\n const requiredPermission = permissions.dynamic.OverviewPageFluentV2 || permissions.dynamic.OverviewPageFluent2;\r\n\r\n return (\r\n
    \r\n
    \r\n {popDescription}\r\n \r\n
    \r\n\r\n {requiredPermission ? : }\r\n
    \r\n );\r\n}\r\n\r\nGridHeader.defaultProps = {\r\n};\r\nGridHeader.propTypes = {\r\n dateRange: PropTypes.shape({\r\n RangeEndDate: PropTypes.string,\r\n RangeStartDate: PropTypes.string,\r\n }).isRequired,\r\n i18n: PropTypes.shape({\r\n }).isRequired,\r\n newI18n: PropTypes.shape({\r\n }).isRequired,\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({\r\n OverviewPageFluentV2: PropTypes.bool,\r\n OverviewPageFluent2: PropTypes.bool,\r\n }),\r\n }).isRequired,\r\n};\r\n\r\nexport default GridHeader;\r\n","import _ from 'underscore';\r\nimport React, { useState, useEffect, useCallback, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {\r\n coerceStatus,\r\n} from '@bingads-webui-campaign/overview-cards-common';\r\nimport { defaultMetrics } from '../common/metrics';\r\nimport ConversionTrackingGrid from './react-grid/react-grid';\r\nimport StatusOverview from './conversion-error-overview/status-overview';\r\nimport ConversionTrackingFooter from './conversion-error-overview/footer';\r\nimport GridHeader from './react-grid/grid-header';\r\nimport { GoalCategory } from '../common/strings';\r\n\r\nfunction processGridData({\r\n metric,\r\n data,\r\n entitySet,\r\n deps,\r\n newI18n,\r\n}) {\r\n const {\r\n metricFormatter,\r\n i18n,\r\n instrumentation,\r\n constants,\r\n } = deps;\r\n\r\n if (data === undefined || data === null) {\r\n return undefined;\r\n } else if (_.size(data) === 0) {\r\n return [];\r\n }\r\n\r\n _.each(data, (entity) => {\r\n if (!entity.PerformanceMetricsChange) {\r\n instrumentation.logMessage([constants.LOGCATEGORY.ERROR], constants.LOGLEVEL.INFO, 'conversion-tracking-card', JSON.stringify(entity));\r\n }\r\n });\r\n\r\n const maxChange = Math.abs(_.max(data, ({\r\n PerformanceMetricsChange: { [metric]: value },\r\n }) => Math.abs(value)).PerformanceMetricsChange[metric]);\r\n\r\n return _.map(data, (entity) => {\r\n const formattedPeriodMetrics = metricFormatter.formatMetric(\r\n metric,\r\n entity.PeriodPerformanceMetrics[metric],\r\n { currency: entity.Currency }\r\n );\r\n const formattedMetrics = metricFormatter.formatMetric(\r\n metric,\r\n entity.PerformanceMetrics[metric],\r\n { currency: entity.Currency }\r\n );\r\n const value = entity.PerformanceMetricsChange[metric];\r\n let declineBar = 0;\r\n let declineSpace = 100;\r\n let increaseBar = 0;\r\n let increaseSpace = 100;\r\n\r\n if (maxChange !== 0) {\r\n if (value < 0) {\r\n declineBar = Math.ceil(-(value * 100) / maxChange);\r\n declineSpace = 100 - declineBar;\r\n } else {\r\n increaseBar = Math.ceil((value * 100) / maxChange);\r\n increaseSpace = 100 - increaseBar;\r\n }\r\n }\r\n\r\n const typeName = entitySet.type.elementType.shortName;\r\n const i18nString = GoalCategory[entity.Id] || entity.Id;\r\n return {\r\n name: newI18n.getString(i18nString),\r\n category: entity.Id,\r\n status: coerceStatus(entity.Status, entity.AccountInactiveReasons),\r\n value,\r\n formattedValue: metricFormatter.formatMetricWithSign(\r\n metric,\r\n entity.PerformanceMetricsChange[metric],\r\n { currency: entity.Currency }\r\n ),\r\n formattedPercentageValue: metricFormatter\r\n .formatChangePercentageWithSign(entity.PerformanceMetricsChangePercentage[metric]),\r\n fromTo: i18n.getString('Dashboard_Cards_FromTo', { fromValue: formattedPeriodMetrics, toValue: formattedMetrics }),\r\n campaignType: entity.CampaignType,\r\n typeName,\r\n formattedMetrics,\r\n formattedPeriodMetrics,\r\n declineBar,\r\n declineSpace,\r\n increaseBar,\r\n increaseSpace,\r\n rawStatus: entity.Status,\r\n };\r\n });\r\n}\r\n\r\n\r\nfunction ConversionTrackingState(props) {\r\n const {\r\n metric,\r\n categoryResults,\r\n statusSummaries,\r\n noConversionGoalsWithRevenue,\r\n dateRange,\r\n\r\n updateCurrentMenuItems,\r\n updateMetric,\r\n\r\n deps,\r\n entitySet,\r\n i18n,\r\n newI18n,\r\n permissions,\r\n instrumentationLog,\r\n TrackingTypeFilterStore,\r\n GoalCategoryFilterStore,\r\n } = props;\r\n\r\n const processedResults = useMemo(() => processGridData({\r\n deps,\r\n metric,\r\n data: categoryResults,\r\n entitySet,\r\n newI18n,\r\n }), [deps, metric, categoryResults, entitySet, newI18n]);\r\n\r\n const totalPageCount = useMemo(() => {\r\n if (_.size(statusSummaries) === 0) {\r\n return 1;\r\n }\r\n return 2;\r\n }, [statusSummaries]);\r\n\r\n const [pageNumber, setPageNumber] = useState(totalPageCount === 1 ? 1 : 0);\r\n\r\n useEffect(() => {\r\n if (pageNumber === 0) {\r\n updateCurrentMenuItems(false);\r\n } else {\r\n updateCurrentMenuItems(true);\r\n }\r\n }, [pageNumber, updateCurrentMenuItems]);\r\n\r\n const renderContent = useCallback(() => {\r\n if (pageNumber === 0) {\r\n return (\r\n \r\n );\r\n }\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n }, [GoalCategoryFilterStore, TrackingTypeFilterStore, dateRange, deps, i18n, instrumentationLog, metric, newI18n, noConversionGoalsWithRevenue, pageNumber, permissions, processedResults, statusSummaries, updateMetric]);\r\n\r\n return (\r\n
    \r\n {renderContent()}\r\n \r\n
    \r\n );\r\n}\r\n\r\nConversionTrackingState.defaultProps = {\r\n updateCurrentMenuItems: _.noop,\r\n instrumentationLog: {\r\n SetUpConversionTracking: _.noop,\r\n CouponIsShown: _.noop,\r\n NoCoupon: _.noop,\r\n ManageConversionsClick: _.noop,\r\n SeeAllClicked: _.noop,\r\n Error: _.noop,\r\n },\r\n\r\n updateMetric: _.noop,\r\n categoryResults: [],\r\n statusSummaries: [],\r\n noConversionGoalsWithRevenue: false,\r\n dateRange: {},\r\n TrackingTypeFilterStore: _.noop,\r\n GoalCategoryFilterStore: _.noop,\r\n\r\n};\r\nConversionTrackingState.propTypes = {\r\n metric: PropTypes.string.isRequired,\r\n categoryResults: PropTypes.arrayOf(PropTypes.shape({\r\n })),\r\n statusSummaries: PropTypes.arrayOf(PropTypes.shape({\r\n GoalCount: PropTypes.number,\r\n GoalNames: PropTypes.arrayOf(PropTypes.string),\r\n GoalTrackingStatus: PropTypes.string,\r\n })),\r\n noConversionGoalsWithRevenue: PropTypes.bool,\r\n\r\n dateRange: PropTypes.shape({\r\n RangeStartDate: PropTypes.string.isRequired,\r\n RangeEndDate: PropTypes.string.isRequired,\r\n }),\r\n updateCurrentMenuItems: PropTypes.func,\r\n\r\n deps: PropTypes.shape({\r\n metricFormatter: PropTypes.shape({\r\n formatMetric: PropTypes.func.isRequired,\r\n formatMetricWithSign: PropTypes.func.isRequired,\r\n formatChangePercentageWithSign: PropTypes.func.isRequired,\r\n }).isRequired,\r\n legacyRouter: PropTypes.shape({\r\n navigateToRoute: PropTypes.func.isRequired,\r\n }).isRequired,\r\n pageContext: PropTypes.shape({\r\n accountId: PropTypes.string,\r\n adgroupId: PropTypes.string,\r\n campaignId: PropTypes.string,\r\n }).isRequired,\r\n }).isRequired,\r\n\r\n\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n newI18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n permissions: PropTypes.shape({}).isRequired,\r\n\r\n instrumentationLog: PropTypes.shape({\r\n SetUpConversionTracking: PropTypes.func,\r\n CouponIsShown: PropTypes.func,\r\n NoCoupon: PropTypes.func,\r\n ManageConversionsClick: PropTypes.func,\r\n SeeAllClicked: PropTypes.func,\r\n Error: PropTypes.func,\r\n }),\r\n\r\n updateMetric: PropTypes.func,\r\n TrackingTypeFilterStore: PropTypes.func,\r\n GoalCategoryFilterStore: PropTypes.func,\r\n entitySet: PropTypes.shape({}).isRequired,\r\n};\r\n\r\nexport default ConversionTrackingState;\r\n","import _ from 'underscore';\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {\r\n ConversionFilterOption,\r\n conversionDefaultOptions,\r\n} from '@bingads-webui-campaign/overview-cards-common';\r\nimport { InstrumentationLog } from '../common/instrumentation';\r\nimport EmptyState from './empty-state';\r\nimport ConversionTrackingState from './conversion-tracking-state';\r\nimport { StringsMapping } from '../common/strings';\r\n\r\nclass ConversionTrackingCard extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n const {\r\n metric,\r\n selectedMenuItem,\r\n dateRange,\r\n fetch, // fetch for conversion tracking data\r\n fetchSingleTile,\r\n\r\n i18n,\r\n newI18n,\r\n deps,\r\n entitySet,\r\n permissions,\r\n\r\n triggerChangeMenuItem,\r\n triggerChangeMetric,\r\n TrackingTypeFilterStore,\r\n GoalCategoryFilterStore,\r\n\r\n blockCard,\r\n willFetchData,\r\n renderedWithData,\r\n unblockCard,\r\n } = props;\r\n\r\n this.fetch = fetch;\r\n this.state = {\r\n dataLoaded: false,\r\n dateRange,\r\n metric: metric || conversionDefaultOptions.metric, // grid data type\r\n selectedMenuItem: selectedMenuItem || conversionDefaultOptions.selectedMenuItem, // tile dropdown\r\n data: {},\r\n };\r\n\r\n this.i18n = i18n;\r\n this.newI18n = newI18n;\r\n this.deps = deps;\r\n this.instrumentationLog = InstrumentationLog({\r\n instrumentation: deps.instrumentation,\r\n constants: deps.constants,\r\n });\r\n\r\n this.permissions = permissions;\r\n this.entitySet = entitySet;\r\n this.triggerChangeMenuItem = triggerChangeMenuItem;\r\n this.triggerChangeMetric = triggerChangeMetric;\r\n\r\n this.defaultMenuItems = [{\r\n displayText: this.newI18n.getString(StringsMapping.All_Change),\r\n action: ConversionFilterOption.AllChanges,\r\n }, {\r\n displayText: this.newI18n.getString(StringsMapping.Top_Gainers),\r\n action: ConversionFilterOption.TopGainers,\r\n }, {\r\n displayText: this.newI18n.getString(StringsMapping.Top_Decliners),\r\n action: ConversionFilterOption.TopDecliners,\r\n }];\r\n\r\n this.currentMenuItems = [];\r\n\r\n this.blockCard = blockCard;\r\n this.willFetchData = willFetchData;\r\n this.renderedWithData = renderedWithData;\r\n this.unblockCard = unblockCard;\r\n this.TrackingTypeFilterStore = TrackingTypeFilterStore;\r\n this.GoalCategoryFilterStore = GoalCategoryFilterStore;\r\n this.fetchSingleTile = fetchSingleTile;\r\n }\r\n\r\n componentDidMount() {\r\n this.fetchTileData(this.fetchSingleTile);\r\n }\r\n\r\n\r\n componentDidUpdate(prevProps, prevState) {\r\n if (this.isDataFetchRequired(prevState)) {\r\n const fetchSingleTile = this.isFetchSingleTile(prevState);\r\n this.fetchTileData(fetchSingleTile);\r\n }\r\n }\r\n\r\n getMenuItems = () => this.currentMenuItems;\r\n\r\n isDataFetchRequired = (prevState) => {\r\n const {\r\n dateRange: prevDateRange,\r\n selectedMenuItem: prevMenuItem,\r\n metric: prevMetric,\r\n } = prevState;\r\n\r\n const {\r\n dateRange,\r\n selectedMenuItem,\r\n metric,\r\n } = this.state;\r\n\r\n if (metric === prevMetric && selectedMenuItem === prevMenuItem && _.isEqual(dateRange, prevDateRange)) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n isFetchSingleTile = (prevState) => {\r\n const {\r\n dateRange: prevDateRange,\r\n } = prevState;\r\n\r\n const {\r\n dateRange,\r\n } = this.state;\r\n\r\n if (!_.isEqual(dateRange, prevDateRange)) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n updateCurrentMenuItems = (isMenuItemNeeded) => {\r\n if (isMenuItemNeeded) {\r\n const { selectedMenuItem } = this.state;\r\n this.currentMenuItems = this.defaultMenuItems;\r\n _.each(this.currentMenuItems, (item) => {\r\n if (item.action === selectedMenuItem) {\r\n // eslint-disable-next-line no-param-reassign\r\n item.preset = true;\r\n } else {\r\n // eslint-disable-next-line no-param-reassign\r\n item.preset = false;\r\n }\r\n });\r\n this.triggerChangeMenuItem(this.currentMenuItems);\r\n } else {\r\n this.currentMenuItems = [];\r\n this.triggerChangeMenuItem(this.currentMenuItems);\r\n }\r\n };\r\n\r\n fetchTileData = (fetchSingleTile) => {\r\n const {\r\n dateRange,\r\n selectedMenuItem,\r\n metric,\r\n } = this.state;\r\n\r\n if (!dateRange) { return; }\r\n if (!this.fetch) { return; }\r\n\r\n this.blockCard();\r\n this.willFetchData();\r\n\r\n this.fetch({\r\n dateRange,\r\n metric,\r\n selectedMenuItem,\r\n fetchSingleTile,\r\n }).then((data) => {\r\n if (data) {\r\n this.setState({\r\n dataLoaded: true,\r\n data,\r\n });\r\n }\r\n }).finally(() => {\r\n this.renderedWithData();\r\n this.unblockCard();\r\n });\r\n };\r\n\r\n handleUpdate = ({ dateRange, metric, selectedMenuItem }) => {\r\n if (dateRange) {\r\n this.setState({ dateRange });\r\n } else if (metric) {\r\n this.setState({ metric });\r\n } else if (selectedMenuItem) {\r\n this.setState({ selectedMenuItem });\r\n this.updateCurrentMenuItems(true);\r\n }\r\n };\r\n\r\n render() {\r\n const { dataLoaded } = this.state;\r\n if (!dataLoaded) {\r\n return (
    );\r\n }\r\n\r\n const {\r\n data: {\r\n ConversionGoalCategoryResults,\r\n ConversionGoalTrackingStatusSummaries,\r\n NoConversionGoalsExist,\r\n NoConversionGoalsWithRevenue,\r\n },\r\n } = this.state;\r\n\r\n const {\r\n newI18n,\r\n i18n,\r\n permissions,\r\n deps,\r\n instrumentationLog,\r\n } = this;\r\n\r\n if (NoConversionGoalsExist) {\r\n this.updateCurrentMenuItems(false);\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n const {\r\n dateRange,\r\n metric,\r\n selectedMenuItem,\r\n } = this.state;\r\n\r\n const {\r\n entitySet,\r\n updateCurrentMenuItems,\r\n TrackingTypeFilterStore,\r\n GoalCategoryFilterStore,\r\n } = this;\r\n\r\n return (\r\n { this.handleUpdate({ metric: newMetric }); }}\r\n\r\n deps={deps}\r\n entitySet={entitySet}\r\n i18n={i18n}\r\n newI18n={newI18n}\r\n permissions={permissions}\r\n instrumentationLog={instrumentationLog}\r\n TrackingTypeFilterStore={TrackingTypeFilterStore}\r\n GoalCategoryFilterStore={GoalCategoryFilterStore}\r\n />\r\n );\r\n }\r\n}\r\n\r\nConversionTrackingCard.defaultProps = {\r\n metric: conversionDefaultOptions.metric,\r\n selectedMenuItem: conversionDefaultOptions.selectedMenuItem,\r\n dateRange: {},\r\n triggerChangeMenuItem: _.noop,\r\n blockCard: _.noop,\r\n willFetchData: _.noop,\r\n renderedWithData: _.noop,\r\n unblockCard: _.noop,\r\n triggerChangeMetric: _.noop,\r\n fetch: _.noop,\r\n TrackingTypeFilterStore: _.noop,\r\n GoalCategoryFilterStore: _.noop,\r\n fetchSingleTile: false,\r\n};\r\n\r\nConversionTrackingCard.propTypes = {\r\n metric: PropTypes.string,\r\n selectedMenuItem: PropTypes.string,\r\n fetchSingleTile: PropTypes.bool,\r\n dateRange: PropTypes.shape({\r\n RangeStartDate: PropTypes.string,\r\n RangeEndDate: PropTypes.string,\r\n RangeId: PropTypes.number,\r\n Rangelcid: PropTypes.number,\r\n compared: PropTypes.bool,\r\n start: PropTypes.objectOf(Date),\r\n end: PropTypes.objectOf(Date),\r\n grain: PropTypes.number,\r\n }),\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n deps: PropTypes.shape({\r\n constants: PropTypes.shape({}).isRequired,\r\n instrumentation: PropTypes.shape({}).isRequired,\r\n }).isRequired,\r\n entitySet: PropTypes.shape({}).isRequired,\r\n permissions: PropTypes.shape({}).isRequired,\r\n triggerChangeMenuItem: PropTypes.func,\r\n blockCard: PropTypes.func,\r\n willFetchData: PropTypes.func,\r\n renderedWithData: PropTypes.func,\r\n unblockCard: PropTypes.func,\r\n newI18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n triggerChangeMetric: PropTypes.func,\r\n fetch: PropTypes.func,\r\n TrackingTypeFilterStore: PropTypes.func,\r\n GoalCategoryFilterStore: PropTypes.func,\r\n};\r\n\r\nexport default ConversionTrackingCard;\r\n","export const InstrumentationLog = ({ instrumentation, constants }) => ({\r\n SetUpConversionClicked: (hasCoupons) => {\r\n instrumentation.logMessage([constants.LOGCATEGORY.TRACE], constants.LOGLEVEL.INFO, 'conversion-tracking-card', `Set up conversions is clicked ${hasCoupons ? 'with coupons' : 'without coupons'}`);\r\n },\r\n CouponIsShown: () => {\r\n instrumentation.logMessage([constants.LOGCATEGORY.TRACE], constants.LOGLEVEL.INFO, 'conversion-tracking-card', 'Coupon is shown - setup page');\r\n },\r\n NoCoupon: () => {\r\n instrumentation.logMessage([constants.LOGCATEGORY.TRACE], constants.LOGLEVEL.INFO, 'conversion-tracking-card', 'No Coupon - setup page');\r\n },\r\n ManageConversionsClicked: () => {\r\n instrumentation.logMessage([constants.LOGCATEGORY.TRACE], constants.LOGLEVEL.INFO, 'conversion-tracking-card', 'Manage conversions is clicked');\r\n },\r\n SeeAllClicked: (errorType) => {\r\n instrumentation.logMessage([constants.LOGCATEGORY.TRACE], constants.LOGLEVEL.INFO, 'conversion-tracking-card', `See all is clicked for type ${errorType}`);\r\n },\r\n GridNameClicked: (category) => {\r\n instrumentation.logMessage([constants.LOGCATEGORY.TRACE], constants.LOGLEVEL.INFO, 'conversion-tracking-card', `Grid name is clicked for type ${category}`);\r\n },\r\n Error: (response) => {\r\n instrumentation.logMessage([constants.LOGCATEGORY.ERROR], constants.LOGLEVEL.INFO, 'conversion-tracking-card-error', response);\r\n },\r\n});\r\n","/* eslint-disable jsx-a11y/anchor-has-content */\r\n/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport _ from 'underscore';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BaseCard } from '@bingads-webui-campaign/overview-base-card';\r\nimport { fetchConversionTracking, getConversionGoalsFilterStore } from '@bingads-webui-campaign/overview-cards-common';\r\nimport { HelpLink } from '@bingads-webui-react/help-link';\r\nimport ConversionTrackingCardReact from './conversion-tracking-card-react/conversion-tracking-card';\r\n\r\nconst layoutSize = {\r\n small: 0,\r\n large: 1,\r\n};\r\nconst layoutBreakPoint = 800;\r\n\r\nfunction getLayoutSize() {\r\n if (this.$el.closest('.card-holder__wrapper').outerWidth() < layoutBreakPoint) {\r\n return layoutSize.small;\r\n }\r\n return layoutSize.large;\r\n}\r\n\r\nconst conversionTileFetch = ({\r\n entitySet,\r\n filter,\r\n jsdata,\r\n getCardsConfig,\r\n dateUtil,\r\n permissions,\r\n disableCache,\r\n cacheManager,\r\n accountsMode,\r\n typeId,\r\n}) => {\r\n const fetch = ({\r\n dateRange,\r\n metric,\r\n selectedMenuItem,\r\n fetchSingleTile = false,\r\n }) => fetchConversionTracking({\r\n dateRange,\r\n selectedMenuItem,\r\n metric,\r\n\r\n entitySet,\r\n filter,\r\n jsdata,\r\n getCardsConfig,\r\n dateUtil,\r\n fetchSingleTile,\r\n permissions,\r\n disableCache,\r\n cacheManager,\r\n accountsMode,\r\n dfmCacheKey: typeId,\r\n });\r\n\r\n return fetch;\r\n};\r\n\r\nexport class ConversionTrackingCard extends BaseCard {\r\n get className() {\r\n return 'conversion-tracking-card';\r\n }\r\n\r\n get menuItems() {\r\n if (this.viewRef.current) {\r\n const items = this.viewRef.current.getMenuItems();\r\n if (_.isEmpty(items)) {\r\n return null;\r\n }\r\n return items;\r\n }\r\n return null;\r\n }\r\n\r\n onMenuAction(menuItem) {\r\n if (this.viewRef.current) {\r\n const { selectedMenuItem } = this.viewRef.current.state;\r\n if (selectedMenuItem === menuItem) {\r\n return;\r\n }\r\n this.viewRef.current.handleUpdate({\r\n selectedMenuItem: menuItem,\r\n });\r\n }\r\n }\r\n\r\n getCardPreference() {\r\n if (this.viewRef.current) {\r\n const { selectedMenuItem, metric } = this.getState();\r\n\r\n return {\r\n metric,\r\n selectedMenuItem,\r\n };\r\n }\r\n return {};\r\n }\r\n\r\n initialize(props) {\r\n const {\r\n // entitySet,\r\n // metric,\r\n // selectedMenuItem,\r\n // dateRange,\r\n // filter,\r\n perfMarker,\r\n name,\r\n sharedOptions,\r\n deps,\r\n // accountsMode,\r\n // scope,\r\n // dismissLastFluctuation = false,\r\n // typeId,\r\n // newI18n,\r\n preferenceService,\r\n } = props;\r\n\r\n const {\r\n i18n,\r\n jsdata,\r\n dateUtil,\r\n cacheManager,\r\n config,\r\n } = deps;\r\n\r\n const permissions = config && config.get('Permissions');\r\n const { getCardsConfig } = sharedOptions;\r\n this.initPerfMarker({ perfMarker, name });\r\n this.viewRef = React.createRef();\r\n const conversionGoalsFilterStore = getConversionGoalsFilterStore({ preferenceService });\r\n\r\n this.view = (\r\n \r\n \r\n {\r\n this.trigger('change:menuItems', {\r\n value: menuItems,\r\n options: { replace: true },\r\n });\r\n }}\r\n triggerChangeMetric={(newMetric) => {\r\n this.trigger('pick', {\r\n metric: newMetric,\r\n });\r\n }}\r\n triggerPreferenceChange={() => {\r\n this.trigger('storeCardPreference', this.getCardPreference());\r\n }}\r\n blockCard={() => {\r\n this.blockCard();\r\n }}\r\n willFetchData={() => {\r\n this.willFetchData();\r\n }}\r\n renderedWithData={() => {\r\n this.renderedWithData();\r\n }}\r\n unblockCard={() => {\r\n this.unblockCard();\r\n }}\r\n TrackingTypeFilterStore={(errorType) => {\r\n if (errorType) {\r\n const newErrorTypeFilter = {\r\n TrackingStatus: {\r\n $in: [`Enum.GoalTrackingStatus'${errorType}'`],\r\n },\r\n };\r\n\r\n conversionGoalsFilterStore.save({ query: newErrorTypeFilter });\r\n }\r\n }}\r\n GoalCategoryFilterStore={(category) => {\r\n if (category) {\r\n const newCategoryFilter = {\r\n GoalCategory: {\r\n $in: [`Enum.GoalCategory'${category}'`],\r\n },\r\n };\r\n\r\n conversionGoalsFilterStore.save({ query: newCategoryFilter });\r\n }\r\n }}\r\n />\r\n \r\n );\r\n\r\n this.onResize(() => {\r\n this.relayout();\r\n });\r\n }\r\n\r\n relayout() {\r\n const newLayoutSize = getLayoutSize.call(this);\r\n\r\n if (this.currentLayoutSize === newLayoutSize) {\r\n return;\r\n }\r\n\r\n if (newLayoutSize === layoutSize.small) {\r\n this.$el.addClass('small_layout');\r\n } else {\r\n this.$el.removeClass('small_layout');\r\n }\r\n\r\n this.currentLayoutSize = newLayoutSize;\r\n }\r\n\r\n setState(state) {\r\n if (this.viewRef.current) {\r\n this.viewRef.current.handleUpdate(state);\r\n }\r\n return this;\r\n }\r\n\r\n renderTrunk() {\r\n ReactDOM.render(this.view, this.el);\r\n _.defer(() => {\r\n this.relayout();\r\n });\r\n }\r\n\r\n remove() {\r\n ReactDOM.unmountComponentAtNode(this.el);\r\n return super.remove();\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport React, { useEffect, useCallback } from 'react';\r\nimport classNames from 'classnames';\r\nimport { makeStyles } from '@fluentui/react-components';\r\nimport PropTypes from 'prop-types';\r\nimport { fetchConversionTracking, getConversionGoalsFilterStore } from '@bingads-webui-campaign/overview-cards-common';\r\nimport { withDelayedStyles } from '@bingads-webui-campaign-react/common-utils';\r\nimport { getConversionTrackingCardStyle, metricPickerFluentV2Style } from '@bingads-webui-campaign-react/overview-card-styles';\r\nimport { useHeaderStateContext } from '@bingads-webui-campaign-react/overview-card';\r\n\r\nimport ConversionTrackingCardReact from './conversion-tracking-card-react/conversion-tracking-card';\r\n\r\n// Most of the content styles are from existing conversion tracking card\r\nconst getDefaultStyles = (_, { palette = {} }) => ({\r\n '@global': Object.assign(\r\n getConversionTrackingCardStyle(palette),\r\n metricPickerFluentV2Style\r\n ),\r\n});\r\n\r\nexport const useStyles = makeStyles({\r\n cardContent: {\r\n // to make sure empty state flex container can take full height from parent\r\n // flex element can take 100% height from parent only if parent has fixed height\r\n height: '307px',\r\n '& .conversion-tracking-state': {\r\n // to make the container height fixed with 377px, this is from Figma.\r\n height: '307px',\r\n\r\n '& .carousel-footer': {\r\n paddingBottom: '0px !important',\r\n },\r\n },\r\n\r\n '& .conversion-empty-state': {\r\n paddingBottom: '0px !important',\r\n },\r\n\r\n // TODO: [yaoyao] add shimmer for loading status\r\n // https://msasg.visualstudio.com/Bing_Ads/_workitems/edit/7173186\r\n '& .conversion-tracking-card-data-loading': {\r\n height: '307px',\r\n },\r\n },\r\n smallSizeCard: {\r\n '& .pop-range': {\r\n display: 'none',\r\n },\r\n },\r\n});\r\n\r\nconst conversionTileFetch = ({\r\n entitySet,\r\n filter,\r\n campaignType,\r\n jsdata,\r\n getCardsConfig,\r\n dateUtil,\r\n permissions,\r\n disableCache,\r\n cacheManager,\r\n // 1 for expert mode, we don't expect to have smart mode account anymore\r\n accountsMode = 1,\r\n typeId,\r\n}) => {\r\n const fetch = ({\r\n dateRange,\r\n metric,\r\n selectedMenuItem,\r\n fetchSingleTile = false,\r\n }) => fetchConversionTracking({\r\n dateRange,\r\n selectedMenuItem,\r\n metric,\r\n entitySet,\r\n filter,\r\n campaignType,\r\n jsdata,\r\n getCardsConfig,\r\n dateUtil,\r\n fetchSingleTile,\r\n permissions,\r\n disableCache,\r\n cacheManager,\r\n accountsMode,\r\n dfmCacheKey: typeId,\r\n });\r\n\r\n return fetch;\r\n};\r\n\r\nfunction ConversionTrackingCardFluentInternal({\r\n getCardsConfig,\r\n i18n,\r\n permissions,\r\n preferenceService,\r\n deps,\r\n jsdata,\r\n dateUtil,\r\n dateRange,\r\n filter,\r\n campaignType,\r\n constructOptions,\r\n cacheManager,\r\n legacyI18n,\r\n cardTypeId,\r\n perfMarkerUtils,\r\n responsiveSize,\r\n}) {\r\n const conversionGoalsFilterStore = getConversionGoalsFilterStore({ preferenceService });\r\n const {\r\n entitySet,\r\n } = constructOptions();\r\n const classes = useStyles();\r\n const headerState = useHeaderStateContext();\r\n const viewRef = React.createRef();\r\n const {\r\n willFetchData,\r\n willRender,\r\n done,\r\n } = perfMarkerUtils;\r\n // For size larger than l, we split into columns, so we don't show range column\r\n // For size smaller than l, we don't have enough space to show range column\r\n const hideRangeColumn = responsiveSize !== 'l';\r\n\r\n useEffect(() => {\r\n if (viewRef.current && headerState && headerState.selectedItemValue) {\r\n viewRef.current.handleUpdate({\r\n selectedMenuItem: headerState.selectedItemValue,\r\n });\r\n }\r\n }, [headerState, viewRef]);\r\n\r\n useEffect(() => {\r\n if (viewRef.current && dateRange) {\r\n viewRef.current.handleUpdate({\r\n dateRange,\r\n });\r\n }\r\n }, [dateRange, viewRef]);\r\n\r\n const triggerChangeMenuItem = useCallback((menuItem) => {\r\n if (headerState && _.isFunction(headerState.setHidden)) {\r\n headerState.setHidden(!(menuItem && menuItem.length));\r\n }\r\n }, [headerState]);\r\n\r\n if (!headerState) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n {\r\n willFetchData();\r\n }}\r\n renderedWithData={() => {\r\n willRender();\r\n done();\r\n }}\r\n TrackingTypeFilterStore={(errorType) => {\r\n if (errorType) {\r\n const newErrorTypeFilter = {\r\n TrackingStatus: {\r\n $in: [`Enum.GoalTrackingStatus'${errorType}'`],\r\n },\r\n };\r\n\r\n conversionGoalsFilterStore.save({ query: newErrorTypeFilter });\r\n }\r\n }}\r\n GoalCategoryFilterStore={(category) => {\r\n if (category) {\r\n const newCategoryFilter = {\r\n GoalCategory: {\r\n $in: [`Enum.GoalCategory'${category}'`],\r\n },\r\n };\r\n\r\n conversionGoalsFilterStore.save({ query: newCategoryFilter });\r\n }\r\n }}\r\n />\r\n
    \r\n );\r\n}\r\n\r\nConversionTrackingCardFluentInternal.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n perfMarkerUtils: PropTypes.shape({\r\n willFetchData: PropTypes.func.isRequired,\r\n willRender: PropTypes.func.isRequired,\r\n done: PropTypes.func.isRequired,\r\n }).isRequired,\r\n getCardsConfig: PropTypes.func.isRequired,\r\n permissions: PropTypes.shape({}).isRequired,\r\n preferenceService: PropTypes.shape({}).isRequired,\r\n deps: PropTypes.shape({\r\n constants: PropTypes.shape({}).isRequired,\r\n instrumentation: PropTypes.shape({}).isRequired,\r\n }).isRequired,\r\n jsdata: PropTypes.shape({}).isRequired,\r\n dateUtil: PropTypes.shape({}).isRequired,\r\n dateRange: PropTypes.shape({\r\n RangeStartDate: PropTypes.string,\r\n RangeEndDate: PropTypes.string,\r\n RangeId: PropTypes.number,\r\n Rangelcid: PropTypes.number,\r\n compared: PropTypes.shape({}),\r\n start: PropTypes.objectOf(Date),\r\n end: PropTypes.objectOf(Date),\r\n grain: PropTypes.number,\r\n }).isRequired,\r\n filter: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\r\n campaignType: PropTypes.oneOfType([\r\n PropTypes.number,\r\n PropTypes.string,\r\n ]).isRequired,\r\n constructOptions: PropTypes.func.isRequired,\r\n cacheManager: PropTypes.shape({}).isRequired,\r\n legacyI18n: PropTypes.shape({}).isRequired,\r\n cardTypeId: PropTypes.string.isRequired,\r\n responsiveSize: PropTypes.string.isRequired,\r\n};\r\n\r\nexport const ConversionTrackingCardFluent = withDelayedStyles(ConversionTrackingCardFluentInternal, getDefaultStyles);\r\n","import _ from 'underscore';\r\nimport { MetricPicker } from '@bingads-webui-campaign/overview-metric-picker';\r\nimport { DeterministicView, helpers } from '@bingads-webui/deterministic-view';\r\nimport template from './template-v2.pug';\r\nimport metricPickerButtonTemplate from './metric-picker-button-template.pug';\r\n\r\nexport default class DeviceMetricView extends DeterministicView {\r\n constructor(options) {\r\n super(_.extend({}, options, { renderInSync: true }));\r\n }\r\n\r\n initialize({\r\n metricFormatter,\r\n s$i18n,\r\n i18n,\r\n deps,\r\n }) {\r\n this.metricFormatter = metricFormatter;\r\n this.s$i18n = s$i18n;\r\n this.i18n = i18n;\r\n this.deps = deps;\r\n }\r\n\r\n get className() {\r\n return 'device-metric';\r\n }\r\n\r\n get template() {\r\n return template;\r\n }\r\n\r\n setState({\r\n metric,\r\n metrics,\r\n hideCurrency,\r\n } = {}) {\r\n helpers.updateView(helpers.ensureChildView(this, 'metric-picker', MetricPicker, {\r\n metric,\r\n metrics,\r\n buttonTemplate: metricPickerButtonTemplate,\r\n metricFormatter: this.metricFormatter,\r\n s$i18n: this.s$i18n,\r\n i18n: this.i18n,\r\n deps: this.deps,\r\n }, {\r\n pick: ({ metric: picked }) => {\r\n super.setState({ metric: picked });\r\n this.trigger('pick', { metric: picked });\r\n },\r\n }), {\r\n metric,\r\n metrics,\r\n hideCurrency,\r\n });\r\n\r\n return super.setState({\r\n metric,\r\n });\r\n }\r\n\r\n renderTrunk() {\r\n this.$el.html(this.template());\r\n return this;\r\n }\r\n}\r\n","import { isXandrVideoAdsCampaign } from '@bingads-webui-campaign-react/constants';\r\n\r\nexport const getDeviceOrder = ({\r\n permissions,\r\n navigationLevel,\r\n currentCampaign,\r\n}) => {\r\n const order = ['Computer', 'Tablet', 'SmartPhone'];\r\n\r\n if (permissions.dynamic.XandrVideoCampaigns &&\r\n (navigationLevel !== 'campaign' ||\r\n (currentCampaign && isXandrVideoAdsCampaign(currentCampaign.CampaignSubType)))\r\n ) {\r\n order.push('ConnectedTV');\r\n }\r\n return order;\r\n};\r\n","import _ from 'underscore';\r\nimport $ from 'jquery';\r\nimport { BaseCard } from '@bingads-webui-campaign/overview-base-card';\r\nimport { helpers } from '@bingads-webui/deterministic-view';\r\nimport { getFilteredTotalsMetrics, fetchAggregatedData, allMetrics, patchMetrics } from '@bingads-webui-campaign/overview-cards-common';\r\nimport SingleMetric from './metric/index';\r\nimport template from './template.pug';\r\nimport { getDeviceOrder } from './order';\r\n\r\nconst defaultMetrics = ['Clicks', 'Impressions', 'Spend'];\r\nconst layoutSize = {\r\n small: 0,\r\n large: 1,\r\n};\r\nconst graphLayoutBreakPoint = 100;\r\nconst smallLayoutBreakPoint = 585;\r\n\r\n/* @this DeviceCard */\r\nfunction getGraphLayoutSize() {\r\n if (this.$('.device-graph-legend-container').outerWidth() < graphLayoutBreakPoint) {\r\n return layoutSize.small;\r\n }\r\n return layoutSize.large;\r\n}\r\n\r\n/* @this TipsCard */\r\nfunction getLayoutSize() {\r\n if (this.$el.closest('.card-holder__wrapper').outerWidth() < smallLayoutBreakPoint) {\r\n return layoutSize.small;\r\n }\r\n return layoutSize.large;\r\n}\r\n\r\n/* @this DeviceCard */\r\nfunction reLayoutGraph() {\r\n const newLayoutSize = getGraphLayoutSize.call(this);\r\n\r\n if (this.currentGraphLayoutSize === newLayoutSize) {\r\n return;\r\n }\r\n\r\n if (newLayoutSize === layoutSize.small) {\r\n this.$('.device-graph-legend-container').addClass('small_graph');\r\n } else {\r\n this.$('.device-graph-legend-container').removeClass('small_graph');\r\n }\r\n\r\n this.currentGraphLayoutSize = newLayoutSize;\r\n}\r\n\r\nfunction isAggregatedMetric(metric) {\r\n return _.indexOf(['CTR', 'ConversionRate', 'RevenueOnAdSpend', 'AverageCPC', 'AveragePosition'], metric) !== -1;\r\n}\r\n\r\n/* @this DeviceCard */\r\nfunction reLayout() {\r\n reLayoutGraph.call(this);\r\n\r\n const newLayoutSize = getLayoutSize.call(this);\r\n\r\n if (newLayoutSize === this.currentLayoutSize) {\r\n return;\r\n }\r\n\r\n if (newLayoutSize === layoutSize.small) {\r\n this.$el.addClass('small_layout');\r\n } else {\r\n this.$el.removeClass('small_layout');\r\n }\r\n\r\n this.currentLayoutSize = newLayoutSize;\r\n}\r\n\r\n/* @this DeviceCard */\r\nfunction updateView() {\r\n const currentMetrics = this.getState().metrics;\r\n const { i18n } = this.deps;\r\n\r\n this.children = [];\r\n _.each(currentMetrics, (metric, index) => {\r\n const child = helpers.ensureChildView(this, String(index), SingleMetric, {\r\n metricFormatter: this.deps.metricFormatter,\r\n s$i18n: this.deps.s$i18n,\r\n i18n,\r\n }, {\r\n pick: ({ metric: picked }) => {\r\n const metricsWhenPick = _.clone(this.getState().metrics);\r\n\r\n metricsWhenPick[index] = picked;\r\n\r\n const { instrumentation, constants } = this.deps;\r\n\r\n instrumentation.logMessage(\r\n [constants.LOGCATEGORY.TRACE],\r\n constants.LOGLEVEL.INFO,\r\n 'device-card',\r\n `${this.navigationLevel} level new metric picked.`\r\n );\r\n helpers.updateView(this, {\r\n metrics: metricsWhenPick,\r\n });\r\n this.trigger('storeCardPreference', { metrics: metricsWhenPick });\r\n const actionButton = this.$('.view-all-clickLink');\r\n if (actionButton.length > 0) {\r\n actionButton.focus();\r\n }\r\n },\r\n });\r\n\r\n this.children.push(child);\r\n\r\n helpers.updateView(child, {\r\n metric,\r\n segmentedPerformanceMetrics: this.performanceMetrics.SegmentedData,\r\n metrics: _.difference(allMetrics(this.permissions), currentMetrics),\r\n hideCurrency: this.hideCurrency,\r\n });\r\n });\r\n\r\n const { dateRange } = this.getState();\r\n\r\n if (!dateRange) {\r\n return;\r\n }\r\n\r\n const formatOption = {\r\n hideCurrency: this.hideCurrency,\r\n };\r\n\r\n this.data = _.map(getDeviceOrder({\r\n permissions: this.permissions,\r\n navigationLevel: this.navigationLevel,\r\n currentCampaign: this.currentCampaign,\r\n }), (deviceType) => {\r\n const { Data: segmentedData } = _.find(\r\n this.performanceMetrics.SegmentedData,\r\n ({ Key }) => Key[0].StringValue === deviceType\r\n ) || { Data: {} };\r\n\r\n let segmentedPeriodData = {};\r\n let segmentedChangePercentageData = {};\r\n\r\n if (dateRange.compared) {\r\n const { Data: periodData } = _.find(\r\n this.periodPerformanceMetrics.SegmentedData,\r\n ({ Key }) => Key[0].StringValue === deviceType\r\n ) || { Data: {} };\r\n\r\n segmentedPeriodData = periodData;\r\n\r\n const { Data: changePercentageData } = _.find(\r\n this.performanceMetricsChangePercentage.SegmentedData,\r\n ({ Key }) => Key[0].StringValue === deviceType\r\n ) || { Data: {} };\r\n\r\n segmentedChangePercentageData = changePercentageData;\r\n }\r\n\r\n const formattedData = {};\r\n const formattedPeriodData = {};\r\n\r\n _.each(currentMetrics, (metric) => {\r\n const { metricFormatter } = this.deps;\r\n const value = segmentedData[metric] || 0;\r\n let flexValue = 0;\r\n\r\n if (!isAggregatedMetric(metric) && this.performanceMetrics[metric]) {\r\n flexValue = Math.round((value * 10000) / this.performanceMetrics[metric]);\r\n }\r\n\r\n const formattedSegment = metricFormatter.formatMetric(metric, value, formatOption);\r\n const formattedHoverValue = isAggregatedMetric(metric) ? formattedSegment :\r\n `${formattedSegment} (${i18n.getString(\r\n 'Dashboard_DeviceCard_Percentage_Total',\r\n {\r\n percentage: i18n.formatPercent(flexValue / 10000, {\r\n maximumFractionDigits: 2,\r\n minimumFractionDigits: 2,\r\n }),\r\n }\r\n )})`;\r\n\r\n formattedData[metric] = {};\r\n _.extend(formattedData[metric], {\r\n metric,\r\n value,\r\n formattedSegment,\r\n flexValue: !value ? 0 : Math.max(flexValue, 1),\r\n formattedHoverValue,\r\n });\r\n\r\n if (dateRange.compared) {\r\n const periodValue = segmentedPeriodData[metric] || 0;\r\n let periodFlexValue = 0;\r\n\r\n if (!isAggregatedMetric(metric) && this.periodPerformanceMetrics[metric]) {\r\n periodFlexValue = Math.round((periodValue * 10000) / this.periodPerformanceMetrics[metric]);\r\n }\r\n\r\n const formattedPeriodSegment = metricFormatter.formatMetric(\r\n metric,\r\n periodValue,\r\n formatOption\r\n );\r\n\r\n const formattedPeriodHoverValue = isAggregatedMetric(metric) ? formattedPeriodSegment :\r\n `${formattedPeriodSegment} (${i18n.getString(\r\n 'Dashboard_DeviceCard_Percentage_Total',\r\n {\r\n percentage: i18n.formatPercent(periodFlexValue / 10000, {\r\n maximumFractionDigits: 2,\r\n minimumFractionDigits: 2,\r\n }),\r\n }\r\n )})`;\r\n\r\n formattedPeriodData[metric] = {};\r\n _.extend(formattedPeriodData[metric], {\r\n metric,\r\n value: periodValue,\r\n changePercentage: segmentedChangePercentageData[metric],\r\n formattedChangePercentage: `(${metricFormatter.formatChangePercentageWithSign(segmentedChangePercentageData[metric] || 0)})`,\r\n formattedChange: metricFormatter.formatMetricWithSign(metric, value - periodValue),\r\n formattedSegment: formattedPeriodSegment,\r\n flexValue: !periodValue ? 0 : Math.max(periodFlexValue, 1),\r\n formattedHoverValue: formattedPeriodHoverValue,\r\n });\r\n }\r\n });\r\n const returnValue = { formattedData };\r\n\r\n if (dateRange.compared) {\r\n _.extend(returnValue, { formattedPeriodData });\r\n }\r\n return returnValue;\r\n });\r\n\r\n const formattedDateRange = `${i18n.formatDate(dateRange.start)} - ${i18n.formatDate(dateRange.end)}`;\r\n const formattedPeriodDateRange = dateRange.compared ? `${dateRange.compared.formattedStart} - ${dateRange.compared.formattedEnd}` : null;\r\n\r\n _.extend(this.data, {\r\n formattedDateRange,\r\n formattedPeriodDateRange,\r\n });\r\n this.loaded = true;\r\n this.render();\r\n}\r\n\r\n/* @this DeviceCard */\r\nfunction loadData() {\r\n const {\r\n dateRange,\r\n filter,\r\n } = this.getState();\r\n const { instrumentation, constants, config } = this.deps;\r\n\r\n this.blockCard();\r\n this.willFetchData();\r\n fetchAggregatedData({\r\n entitySet: this.entitySet,\r\n dateRange,\r\n filter,\r\n jsdata: this.deps.jsdata,\r\n dateUtil: this.deps.dateUtil,\r\n navigationLevel: this.navigationLevel,\r\n getCardsConfig: this.sharedOptions.getCardsConfig,\r\n fetchSingleTile: this.fetchSingleTile,\r\n isDevice: true,\r\n permissions: config && config.get('Permissions'),\r\n dfmCacheKey: `${this.typeId}-aggregated-data`,\r\n }).finally(() => {\r\n this.unblockCard();\r\n }).then((data) => {\r\n this.hasError = false;\r\n if (this.removed) {\r\n return;\r\n }\r\n\r\n if (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 this.hasError = true;\r\n updateView.call(this);\r\n instrumentation.logMessage([constants.LOGCATEGORY.TRACE], constants.LOGLEVEL.INFO, 'device-card', JSON.stringify(data));\r\n return;\r\n }\r\n\r\n if (!data.raw && !data.DeviceSegmentedPerformanceData) {\r\n this.hasError = true;\r\n updateView.call(this);\r\n instrumentation.logMessage([constants.LOGCATEGORY.ERROR], constants.LOGLEVEL.INFO, 'device-card', JSON.stringify(data));\r\n return;\r\n }\r\n\r\n this.hideCurrency = data.AccountsHaveDifferentCurrencies;\r\n this.dataFetched = true;\r\n this.performanceMetrics = getFilteredTotalsMetrics({\r\n data,\r\n metric: 'PerformanceMetrics',\r\n }) || {};\r\n\r\n _.defaults(this.performanceMetrics, { SegmentedData: {} });\r\n\r\n if (dateRange.compared) {\r\n this.performanceMetricsChangePercentage = getFilteredTotalsMetrics({\r\n data,\r\n metric: 'PerformanceMetricsChangePercentage',\r\n }) || {};\r\n\r\n _.defaults(this.performanceMetricsChangePercentage, { SegmentedData: {} });\r\n\r\n this.periodPerformanceMetrics = getFilteredTotalsMetrics({\r\n data,\r\n metric: 'PeriodPerformanceMetrics',\r\n }) || {};\r\n\r\n _.defaults(this.periodPerformanceMetrics, { SegmentedData: {} });\r\n }\r\n\r\n this.hasError = false;\r\n updateView.call(this);\r\n }).catch((response) => {\r\n this.dataFetched = true;\r\n // no need to log ajax error here.\r\n if (response.status === undefined) {\r\n instrumentation.logMessage([constants.LOGCATEGORY.ERROR], constants.LOGLEVEL.INFO, 'device-card', response.stack);\r\n }\r\n this.loaded = true;\r\n this.hasError = true;\r\n this.renderTrunk();\r\n });\r\n}\r\n\r\n/* @this DeviceCard */\r\nfunction navigateToDevicesSetting() {\r\n if (this.navigationLevel === 'account') {\r\n this.deps.legacyRouter.navigateToRoute('campaign_settings', {\r\n setting: 'devices',\r\n });\r\n } else {\r\n const campaignId = this.deps.state.get('campaign_id');\r\n\r\n this.deps.legacyRouter.navigateToRoute('campaign_edit_settings', {\r\n // eslint-disable-next-line camelcase\r\n campaign_id: campaignId,\r\n setting: 'devices',\r\n });\r\n }\r\n}\r\n\r\nexport class DeviceCard extends BaseCard {\r\n className() {\r\n return 'device-card';\r\n }\r\n\r\n initialize({\r\n entitySet,\r\n metrics,\r\n navigationLevel,\r\n dateRange,\r\n perfMarker,\r\n name,\r\n deps,\r\n sharedOptions,\r\n filter,\r\n fetchSingleTile = false,\r\n preexecuteFlag = false,\r\n typeId,\r\n }) {\r\n this.initPerfMarker({ perfMarker, name });\r\n this.performanceMetrics = { SegmentedData: {} };\r\n this.performanceMetricsChangePercentage = { SegmentedData: {} };\r\n this.periodPerformanceMetrics = { SegmentedData: {} };\r\n this.entitySet = entitySet;\r\n this.navigationLevel = navigationLevel;\r\n this.sharedOptions = sharedOptions;\r\n this.fetchSingleTile = fetchSingleTile;\r\n this.deps = deps;\r\n this.typeId = typeId;\r\n\r\n const { config } = this.deps;\r\n this.permissions = config && config.get('Permissions');\r\n this.currentCampaign = config && config.get('CurrentCampaign');\r\n let selectedMetrics;\r\n\r\n if (metrics) {\r\n const patchedMetrics = patchMetrics({ permissions: this.permissions, metrics });\r\n const availableMetrics = allMetrics(this.permissions);\r\n\r\n selectedMetrics = _.intersection(patchedMetrics, availableMetrics);\r\n\r\n if (_.size(selectedMetrics) < _.size(defaultMetrics)) {\r\n selectedMetrics = _.chain(selectedMetrics)\r\n .union(defaultMetrics)\r\n .uniq()\r\n .first(_.size(defaultMetrics))\r\n .value();\r\n\r\n _.defer(() => {\r\n this.trigger('storeCardPreference', { metrics: selectedMetrics });\r\n });\r\n }\r\n } else {\r\n selectedMetrics = defaultMetrics;\r\n }\r\n\r\n this.setState({\r\n metrics: selectedMetrics,\r\n dateRange,\r\n filter,\r\n });\r\n\r\n const loadDataFunc = preexecuteFlag ? () => {\r\n this.dataFetched = true;\r\n } : loadData;\r\n\r\n loadDataFunc.call(this);\r\n\r\n this.listenTo(this.model, 'change:dateRange', () => {\r\n this.fetchSingleTile = false;\r\n loadDataFunc.call(this);\r\n });\r\n\r\n this.listenTo(this.model, 'change:filter', () => {\r\n this.fetchSingleTile = false;\r\n loadDataFunc.call(this);\r\n });\r\n\r\n this.listenTo(this.model, 'change:metrics', () => {\r\n updateView.call(this);\r\n });\r\n\r\n this.onResize(() => {\r\n reLayout.call(this);\r\n });\r\n\r\n this.on('removed', () => {\r\n this.removed = true;\r\n });\r\n }\r\n\r\n get events() {\r\n return {\r\n 'mouseenter .device-grid-bar': this.showPopup,\r\n 'mouseleave .device-grid-bar': this.hidePopup,\r\n 'click .view-all-clickLink': navigateToDevicesSetting.bind(this),\r\n };\r\n }\r\n\r\n showPopup(event) {\r\n const $target = $(event.currentTarget);\r\n const type = $target.data('type');\r\n\r\n $target.closest('.graph-area').addClass(`show-${type}-hover`);\r\n }\r\n\r\n hidePopup(event) {\r\n const $target = $(event.currentTarget);\r\n const type = $target.data('type');\r\n\r\n $target.closest('.graph-area').removeClass(`show-${type}-hover`);\r\n }\r\n\r\n renderTrunk() {\r\n if (this.dataFetched) {\r\n this.willRenderWithData();\r\n }\r\n this.currentLayoutSize = undefined;\r\n this.currentGraphLayoutSize = undefined;\r\n super.renderTrunk();\r\n if (this.dataFetched) {\r\n this.renderedWithData();\r\n _.defer(() => {\r\n reLayout.call(this);\r\n });\r\n }\r\n }\r\n\r\n get template() {\r\n const { metrics } = this.getState();\r\n const { data } = this;\r\n const { i18n, s$i18n } = this.deps;\r\n\r\n return () => template({\r\n isSmartShoppingCampaign: this.isSmartShoppingCampaign(),\r\n s$i18n,\r\n order: getDeviceOrder({\r\n permissions: this.permissions,\r\n navigationLevel: this.navigationLevel,\r\n currentCampaign: this.currentCampaign,\r\n }),\r\n metrics,\r\n data,\r\n loaded: this.loaded,\r\n hasError: this.hasError,\r\n i18n,\r\n isAggregatedMetric,\r\n navigationLevel: this.navigationLevel,\r\n });\r\n }\r\n\r\n setState(newState) {\r\n if (newState.metrics && (_.size(newState.metrics) > _.size(defaultMetrics))) {\r\n // Customer might have erroneous preference due to bug that is fixed.\r\n // Reset to default.\r\n // eslint-disable-next-line no-param-reassign\r\n newState.metrics = defaultMetrics;\r\n this.trigger('storeCardPreference', { metrics: newState.metrics });\r\n }\r\n\r\n super.setState(newState);\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport $ from 'jquery';\r\nimport 'bootstrap';\r\nimport Promise from 'bluebird';\r\nimport { DeterministicView, helpers } from '@bingads-webui/deterministic-view';\r\nimport { a11yPlugin } from '@bingads-webui/projection-grid-a11y';\r\nimport pgrid from 'projection-grid';\r\nimport { performanceLogPlugin } from '@bingads-webui-campaign/pgrid-performance-log';\r\nimport { placeholderPlugin } from '@bingads-webui/projection-grid-placeholder';\r\nimport { withUiBlock } from '@bingads-webui/uiblocker';\r\nimport { Constants } from '@bingads-webui-clientcenter/entity-utils';\r\nimport { keyCode } from '@bingads-webui/keycode';\r\nimport {\r\n changeEvents,\r\n entityHash,\r\n getEntityIds,\r\n navigateToEntity,\r\n coerceStatus,\r\n gridCardConfig,\r\n allMetrics as metrics,\r\n gridNameTemplate as nameTemplate,\r\n fetchEntityGridCombined,\r\n fetchGridData,\r\n processGridTileOptions,\r\n patchMetrics, patchMetric,\r\n} from '@bingads-webui-campaign/overview-cards-common';\r\nimport coverTemplate from './cover-template.pug';\r\nimport placeholderTemplate from './placeholder-template.pug';\r\nimport template from './content-template.pug';\r\nimport performanceMetricHeaderTemplate from './performance-metric-header-template.pug';\r\nimport performanceMetricTemplate from './performance-metric-template.pug';\r\n\r\nlet formatMetric;\r\nlet formatMetricWithSign;\r\nlet formatChangePercentageWithSign;\r\n\r\nfunction order(body) {\r\n return _.defaults({ body }, {\r\n PerformanceMetrics: {\r\n sup: 'PerformanceMetricsChangePercentage',\r\n sub: 'PerformanceMetricsChange',\r\n },\r\n PerformanceMetricsChange: {\r\n sup: 'PerformanceMetrics',\r\n sub: 'PerformanceMetricsChangePercentage',\r\n },\r\n PerformanceMetricsChangePercentage: {\r\n sup: 'PerformanceMetrics',\r\n sub: 'PerformanceMetricsChange',\r\n },\r\n }[body]);\r\n}\r\n\r\nfunction metricColumnProperty({\r\n PerformanceMetrics = {},\r\n PerformanceMetricsChange = {},\r\n PerformanceMetricsChangePercentage = {},\r\n Currency,\r\n} = {}, metric) {\r\n return {\r\n PerformanceMetrics: PerformanceMetrics[metric],\r\n PerformanceMetricsChange: PerformanceMetricsChange[metric],\r\n PerformanceMetricsChangePercentage: PerformanceMetricsChangePercentage[metric],\r\n Currency,\r\n };\r\n}\r\n\r\nfunction formatCell(value, metric) {\r\n return {\r\n PerformanceMetrics: formatMetric(\r\n metric,\r\n value.PerformanceMetrics,\r\n { currency: value.Currency }\r\n ),\r\n PerformanceMetricsChange: formatMetricWithSign(\r\n metric,\r\n value.PerformanceMetricsChange,\r\n { currency: value.Currency }\r\n ),\r\n PerformanceMetricsChangePercentage:\r\n formatChangePercentageWithSign(value.PerformanceMetricsChangePercentage),\r\n };\r\n}\r\n\r\n/* @this GridCard */\r\nfunction metricColumnTemplate({ value }, metric) {\r\n return performanceMetricTemplate({\r\n value: formatCell(value, metric),\r\n order: order(this.getState().body),\r\n showExtra: this.gridView.get('sortableHeader').name === metric && this.getState().dateRange.compared && this.typeName !== 'SearchTerm',\r\n });\r\n}\r\n\r\nconst sortableMapping = {\r\n PerformanceMetrics: 'PerformanceMetrics',\r\n PerformanceMetricsChange: 'PoPPerformanceMetricsChange',\r\n PerformanceMetricsChangePercentage: 'PoPPerformanceMetricsChangePercentage',\r\n};\r\n\r\nconst titleMapping = {\r\n Keyword: 'EntityType_Keyword_Plural',\r\n SearchTerm: 'Search_Terms',\r\n Campaign: 'EntityType_Campaign_Plural',\r\n Account: 'Dashboard_TopAccounts_Card_Title',\r\n AdGroup: 'EntityType_AdGroup_Plural',\r\n};\r\n\r\nconst columnHeaderMapping = {\r\n Keyword: 'EntityType_Keyword_Singular',\r\n SearchTerm: 'ColumnName_SearchTerm',\r\n Campaign: 'EntityType_Campaign_Singular',\r\n Account: 'Entity_Account',\r\n AdGroup: 'EntityType_AdGroup_Singular',\r\n};\r\n\r\n/* @this GridCard */\r\nfunction sortableAttribute(metric) {\r\n return `${sortableMapping[this.getState().body]}/${metric}`;\r\n}\r\n\r\n/* @this GridCard */\r\nfunction metricColumn(metric) {\r\n return this.bingadsGridColumn({\r\n name: metric,\r\n title: this.s$i18n.property('PerformanceMetrics', metric),\r\n property: entity => metricColumnProperty(entity, metric),\r\n sortable: {\r\n key: sortableAttribute.call(this, metric),\r\n direction: -1,\r\n },\r\n colClasses: () =>\r\n (this.gridView.get('sortableHeader').name === metric ? ['performance-metric-col-sorting'] : ['performance-metric-col-non-sorting']),\r\n bodyClasses: () =>\r\n (this.gridView.get('sortableHeader').name === metric ? ['performance-metric-td-sorting'] : []),\r\n headClasses: () =>\r\n (this.gridView.get('sortableHeader').name === metric ? ['performance-metric-th-sorting'] : []),\r\n html: performanceMetricHeaderTemplate({\r\n metric,\r\n s$i18n: this.s$i18n,\r\n i18n: this.i18n,\r\n }),\r\n template: ({ value }) => metricColumnTemplate.call(this, { value }, metric),\r\n });\r\n}\r\n\r\n/* @this GridCard */\r\nfunction nameColumn() {\r\n return this.bingadsGridColumn({\r\n name: 'Name',\r\n title: this.i18n.getString(columnHeaderMapping[this.typeName]),\r\n property: ({\r\n Id,\r\n Name,\r\n Text,\r\n Status,\r\n AdGroup,\r\n Campaign,\r\n MatchType,\r\n DeliveredMatchType,\r\n CampaignType,\r\n Keyword,\r\n Added,\r\n SearchTermStatus,\r\n ExperimentId,\r\n AccountInactiveReasons,\r\n }) => {\r\n let nameText = Text;\r\n\r\n if (this.typeName === 'Keyword') {\r\n nameText = Text;\r\n if (MatchType === 'Phrase') {\r\n nameText = `\"${nameText}\"`;\r\n } else if (MatchType === 'Exact') {\r\n nameText = `[${nameText}]`;\r\n }\r\n } else if (this.typeName === 'SearchTerm') {\r\n nameText = Text;\r\n } else {\r\n nameText = Name;\r\n }\r\n let isExperiment;\r\n\r\n if (this.typeName === 'Campaign') {\r\n isExperiment = !!ExperimentId;\r\n } else if (this.typeName !== 'Account') {\r\n isExperiment = !!Campaign.ExperimentId;\r\n }\r\n\r\n return {\r\n Name: nameText,\r\n keywordText: Text,\r\n Status: coerceStatus(Status, AccountInactiveReasons),\r\n hash: entityHash({\r\n id: Id,\r\n typeName: this.typeName,\r\n entitySet: this.entitySet,\r\n navigationLevel: this.navigationLevel,\r\n adGroup: AdGroup,\r\n campaign: Campaign,\r\n pageContext: this.pageContext,\r\n legacyRouter: this.legacyRouter,\r\n isSmartCampaign: CampaignType === 'Smart',\r\n status: Status,\r\n }),\r\n rawStatus: Status,\r\n typeName: this.typeName,\r\n ids: getEntityIds({\r\n id: Id,\r\n typeName: this.typeName,\r\n entitySet: this.entitySet,\r\n adGroup: AdGroup,\r\n campaign: Campaign,\r\n }),\r\n AdGroup: AdGroup || {},\r\n Campaign: Campaign || {},\r\n MatchType: MatchType || DeliveredMatchType,\r\n navigationLevel: this.navigationLevel,\r\n i18n: this.i18n,\r\n AccountActivityStatus: Constants.AccountActivityStatus,\r\n added: Added,\r\n campaignType: CampaignType,\r\n matchingKeyword: Keyword ? Keyword.Text : null,\r\n searchTermStatus: SearchTermStatus,\r\n isExperiment,\r\n };\r\n },\r\n template: nameTemplate,\r\n });\r\n}\r\n\r\n/* @this GridCard */\r\nfunction metricColumns() {\r\n return _.object(_.map(metrics(this.config && this.config.get('Permissions'), this.accountsMode), metric => [metric, metricColumn.call(this, metric)]));\r\n}\r\n\r\n/* @this GridCard */\r\nfunction removeDropdown() {\r\n if (this.dropdown) {\r\n this.dropdown.$el.closest('.grid-card-header').find('button').attr('aria-expanded', false);\r\n this.dropdown.remove();\r\n this.dropdown = null;\r\n }\r\n\r\n if (this.onClickDocument) {\r\n $(document).off('click', this.onClickDocument);\r\n this.onClickDocument = null;\r\n }\r\n}\r\n\r\n/* @this GridCardContent */\r\nfunction updatePopupPosition(evt) {\r\n const $target = $(evt.currentTarget);\r\n const hoverContent = $target.find('.hover-content');\r\n\r\n if (hoverContent.attr('style')) {\r\n hoverContent.attr('style', '');\r\n }\r\n\r\n const $viewport = $target.closest('.viewport');\r\n const scrollTop = $viewport.scrollTop();\r\n\r\n if (scrollTop <= 0) {\r\n return;\r\n }\r\n\r\n if ($target.offset().top - $viewport.offset().top > 100) {\r\n hoverContent.css('bottom', `${scrollTop + 35}px`);\r\n hoverContent.css('top', 'auto');\r\n } else {\r\n hoverContent.css('top', `${5 - scrollTop}px`);\r\n hoverContent.css('bottom', 'auto');\r\n }\r\n}\r\n\r\n\r\nfunction showPopup(evt) {\r\n updatePopupPosition(evt);\r\n const $target = $(evt.currentTarget);\r\n const $popup = $target.find('.grid-cell--Name__hover-container');\r\n $popup.css({ display: 'block' });\r\n}\r\n\r\nfunction hidePopup(evt) {\r\n const $target = $(evt.currentTarget);\r\n const $popup = $target.find('.grid-cell--Name__hover-container');\r\n $popup.css({ display: 'none' });\r\n}\r\n\r\n\r\n/* @this GridCardContent */\r\nfunction getAllColumns() {\r\n const allMetricColumns = metricColumns.call(this);\r\n\r\n return [nameColumn.call(this), ..._.map(\r\n this.getState().columns,\r\n metric => allMetricColumns[metric]\r\n )];\r\n}\r\n\r\n/* @this GridCardContent */\r\nfunction refetch() {\r\n this.gridView.refresh(true);\r\n}\r\n\r\n/* @this GridCardContent */\r\nfunction updateGridBody() {\r\n const sortableHeader = this.gridView.get('sortableHeader') || {};\r\n const {\r\n orderby,\r\n direction,\r\n directionIndex,\r\n } = this.getState();\r\n const newSortableHeader = sortableHeader.name ? sortableHeader : {\r\n name: orderby,\r\n directionIndex,\r\n };\r\n\r\n this.gridView.patch({\r\n columns: getAllColumns.call(this),\r\n query: {\r\n orderby: [{\r\n key: sortableAttribute.call(this, newSortableHeader.name),\r\n direction,\r\n }],\r\n },\r\n sortableHeader: newSortableHeader,\r\n });\r\n\r\n refetch.call(this);\r\n}\r\n\r\n/* @this GridCardContent */\r\nfunction updateGridColumn() {\r\n const {\r\n columns,\r\n orderby,\r\n direction,\r\n directionIndex,\r\n } = this.getState();\r\n\r\n if (!_.contains(columns, orderby)) {\r\n helpers.updateView(this, {\r\n orderby: _.first(columns),\r\n });\r\n }\r\n\r\n const sortableHeader = this.gridView.get('sortableHeader') || {};\r\n const newSortableHeader = _.contains(columns, sortableHeader.name) ? sortableHeader : {\r\n name: this.getState().orderby,\r\n directionIndex,\r\n };\r\n\r\n this.gridView.patch({\r\n columns: getAllColumns.call(this),\r\n query: {\r\n orderby: [{\r\n key: sortableAttribute.call(this, newSortableHeader.name),\r\n direction,\r\n }],\r\n },\r\n sortableHeader: newSortableHeader,\r\n });\r\n refetch.call(this);\r\n this.trigger('gridOptionChange');\r\n}\r\n\r\n/* @this GridCardContent */\r\nfunction onGridSortableHeaderChange(changes) {\r\n const newOderBy = _.result(changes.query, 'orderby') || _.result(this.gridView.get('query'), 'orderby');\r\n const newDirection = newOderBy[0].direction;\r\n const newOderByColumn = changes.sortableHeader.name;\r\n const newDirectionIndex = changes.sortableHeader.directionIndex;\r\n const { orderby, direction, directionIndex } = this.getState();\r\n\r\n if (orderby !== newOderByColumn ||\r\n direction !== newDirection ||\r\n directionIndex !== newDirectionIndex) {\r\n this.setState({\r\n orderby: newOderByColumn,\r\n direction: newDirection,\r\n directionIndex: newDirectionIndex,\r\n fetchSingleTile: true,\r\n });\r\n this.instrumentation.logMessage(\r\n [this.constants.LOGCATEGORY.TRACE],\r\n this.constants.LOGLEVEL.INFO,\r\n 'grid-card',\r\n `${this.navigationLevel} level ${this.typeName} type new sort order picked.`\r\n );\r\n this.trigger('gridOptionChange');\r\n }\r\n}\r\n\r\nclass CombinedCallEntity {\r\n constructor({\r\n entitySet,\r\n getParentState,\r\n dateUtil,\r\n jsdata,\r\n getCardsConfig,\r\n permissions,\r\n accountsMode,\r\n }) {\r\n this.entitySet = entitySet;\r\n this.getParentState = getParentState;\r\n this.dateUtil = dateUtil;\r\n this.jsdata = jsdata;\r\n this.getCardsConfig = getCardsConfig;\r\n this.permissions = permissions;\r\n this.accountsMode = accountsMode;\r\n }\r\n\r\n findAll({ orderBy }) {\r\n const { dateRange, fetchSingleTile, filter } = this.getParentState();\r\n return fetchEntityGridCombined({\r\n entitySet: this.entitySet,\r\n dateRange,\r\n comparisonDateRange: dateRange.compared,\r\n orderBy,\r\n jsdata: this.jsdata,\r\n dateUtil: this.dateUtil,\r\n getCardsConfig: this.getCardsConfig,\r\n fetchSingleTile,\r\n filter,\r\n permissions: this.permissions,\r\n accountsMode: this.accountsMode,\r\n });\r\n }\r\n}\r\n\r\nclass GridDataEntity {\r\n constructor({\r\n entitySet,\r\n getParentState,\r\n dateUtil,\r\n jsdata,\r\n permissions,\r\n typeId,\r\n }) {\r\n this.entitySet = entitySet;\r\n this.getParentState = getParentState;\r\n this.dateUtil = dateUtil;\r\n this.jsdata = jsdata;\r\n this.permissions = permissions;\r\n this.typeId = typeId;\r\n }\r\n\r\n findAll() {\r\n const {\r\n dateRange,\r\n orderby,\r\n direction,\r\n selectedMenuItem,\r\n filter,\r\n columns,\r\n } = this.getParentState();\r\n return fetchGridData({\r\n entitySet: this.entitySet,\r\n dateRange,\r\n options: {\r\n orderby,\r\n direction,\r\n selectedMenuItem,\r\n columns,\r\n },\r\n filter,\r\n jsdata: this.jsdata,\r\n dateUtil: this.dateUtil,\r\n permissions: this.permissions,\r\n dfmCacheKey: this.typeId,\r\n });\r\n }\r\n}\r\n\r\nclass DummyDataSource {\r\n findAll() {\r\n const data = [];\r\n data.totalCount = 0;\r\n return Promise.resolve(data);\r\n }\r\n}\r\n\r\nexport default class GridCardContent extends DeterministicView {\r\n constructor(options) {\r\n super(_.extend({}, options, { renderInSync: true }));\r\n }\r\n\r\n initialize({\r\n entitySet,\r\n navigationLevel,\r\n parent,\r\n selectedMenuItem,\r\n columns,\r\n orderby,\r\n direction,\r\n directionIndex,\r\n dateRange,\r\n filter,\r\n getCardsConfig,\r\n fetchSingleTile = false,\r\n preexecuteFlag = false,\r\n accountsMode,\r\n deps,\r\n }) {\r\n this.parent = parent;\r\n this.entitySet = entitySet;\r\n this.typeName = entitySet.type.elementType.shortName;\r\n this.navigationLevel = navigationLevel;\r\n this.accountsMode = accountsMode;\r\n this.config = deps.config;\r\n this.i18n = deps.i18n;\r\n this.s$i18n = deps.s$i18n;\r\n this.pageContext = deps.pageContext;\r\n this.legacyRouter = deps.legacyRouter;\r\n this.createEditableFilterStorage = deps.createEditableFilterStorage;\r\n this.instrumentation = deps.instrumentation;\r\n this.constants = deps.constants;\r\n this.bingadsGridColumn = deps.bingadsGridColumn;\r\n this.metricFormatter = deps.metricFormatter;\r\n // eslint-disable-next-line prefer-destructuring\r\n formatMetric = deps.metricFormatter.formatMetric;\r\n // eslint-disable-next-line prefer-destructuring\r\n formatMetricWithSign = deps.metricFormatter.formatMetricWithSign;\r\n // eslint-disable-next-line prefer-destructuring\r\n formatChangePercentageWithSign = deps.metricFormatter.formatChangePercentageWithSign;\r\n\r\n const permissions = this.config && this.config.get('Permissions');\r\n const tileOptions = _.defaults({\r\n body: selectedMenuItem,\r\n columns,\r\n orderby,\r\n direction,\r\n directionIndex,\r\n dateRange,\r\n filter,\r\n fetchSingleTile,\r\n }, gridCardConfig.defaultOptions);\r\n\r\n tileOptions.columns = tileOptions.columns &&\r\n patchMetrics({ permissions, metrics: tileOptions.columns, accountsMode });\r\n tileOptions.orderby = tileOptions.orderby &&\r\n patchMetric({ permissions, metric: tileOptions.orderby, accountsMode });\r\n\r\n const initialState = processGridTileOptions({\r\n options: tileOptions,\r\n permissions,\r\n accountsMode,\r\n });\r\n\r\n this.setState(initialState);\r\n if (!_.isEqual(tileOptions, initialState)) {\r\n _.defer(() => this.trigger('gridOptionChange'));\r\n }\r\n\r\n const gridFactory = pgrid.factory({ vnext: true });\r\n\r\n gridFactory\r\n .use(a11yPlugin)\r\n .use(placeholderPlugin)\r\n .use(performanceLogPlugin);\r\n\r\n const {\r\n gridView,\r\n } = gridFactory\r\n .create({\r\n name: `OverviewTop${this.typeName}`,\r\n tableClasses: ['table'],\r\n tableAttributes: { 'aria-label': this.i18n.getString(titleMapping[this.typeName]) },\r\n dataSource: {\r\n type: 'jsdata',\r\n // eslint-disable-next-line no-nested-ternary\r\n entity: preexecuteFlag ? new DummyDataSource() : ((this.typeName === 'Account' ||\r\n (this.typeName === 'Campaign')) ?\r\n new CombinedCallEntity({\r\n entitySet,\r\n getParentState: this.getState.bind(this),\r\n dateUtil: deps.dateUtil,\r\n jsdata: deps.jsdata,\r\n getCardsConfig,\r\n permissions,\r\n accountsMode: this.accountsMode,\r\n }) : new GridDataEntity({\r\n entitySet,\r\n getParentState: this.getState.bind(this),\r\n dateUtil: deps.dateUtil,\r\n jsdata: deps.jsdata,\r\n permissions,\r\n typeId: this.options.typeId,\r\n })),\r\n },\r\n columns: getAllColumns.call(this),\r\n plugins: {\r\n a11y: { i18n: this.i18n },\r\n performanceLog: {\r\n appConfig: deps.config,\r\n logger: deps.instrumentation,\r\n },\r\n placeholder: {\r\n viewRoot: this.parent.el,\r\n container: '.no-data',\r\n template: placeholderTemplate,\r\n templateOptions: {\r\n i18n: this.i18n,\r\n },\r\n },\r\n },\r\n events: {\r\n 'click .metric-picker__button--caret': (e) => {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n // Event propagation is stopped above.\r\n // Click on header to bubble up event to window without side effect.\r\n this.$('.header').click();\r\n const $metricPicker = this.$(e.currentTarget).closest('.metric-picker');\r\n const currentMetric = $metricPicker[0].dataset.metric;\r\n const isDropdownOpenfortheColumn = this.dropdown && $metricPicker.closest('.grid-card-header')[0].contains(this.dropdown.el);\r\n\r\n removeDropdown.call(this);\r\n\r\n if (!isDropdownOpenfortheColumn) {\r\n const currentColumns = this.gridView.get('columns');\r\n\r\n import(/* webpackMode: 'eager' */ '@bingads-webui-campaign/overview-metric-picker').then(({ MetricPicker }) => {\r\n import(/* webpackMode: 'eager' */ './metric-picker-template.pug').then(({ default: metricPickerTemplate }) => {\r\n import(/* webpackMode: 'eager' */ './dropdown-template.pug').then(({ default: dropdownMenuTemplate }) => {\r\n this.dropdown = new MetricPicker({\r\n buttonTemplate: () => null,\r\n template: metricPickerTemplate,\r\n dropdownMenuTemplate,\r\n metricFormatter: this.metricFormatter,\r\n s$i18n: this.s$i18n,\r\n i18n: this.i18n,\r\n accountsMode: this.accountsMode,\r\n deps,\r\n }).setState({\r\n current: currentMetric,\r\n metrics: _.difference(\r\n metrics(permissions, this.accountsMode),\r\n _.map(currentColumns, col => col.name)\r\n ),\r\n });\r\n\r\n this.dropdown.on('pick', ({ metric }) => {\r\n const stateColumns = _.clone(this.getState().columns);\r\n const index = _.findIndex(stateColumns, col => col === currentMetric);\r\n\r\n this.instrumentation.logMessage(\r\n [this.constants.LOGCATEGORY.TRACE],\r\n this.constants.LOGLEVEL.INFO,\r\n 'grid-card',\r\n `${this.navigationLevel} level ${this.typeName} type new metric picked.`\r\n );\r\n stateColumns[index] = metric;\r\n helpers.updateView(this, {\r\n columns: stateColumns,\r\n });\r\n });\r\n\r\n $metricPicker.closest('.grid-card-header').append(this.dropdown.el);\r\n $metricPicker.find('button').attr('aria-expanded', true);\r\n\r\n this.onClickDocument = (event) => {\r\n if (this.dropdown && !this.dropdown.el.contains(event.target)) {\r\n removeDropdown.call(this);\r\n }\r\n };\r\n $(document).on('click', this.onClickDocument);\r\n });\r\n });\r\n });\r\n }\r\n },\r\n },\r\n scrolling: {\r\n virtualized: false,\r\n header: {\r\n type: 'fixed',\r\n attributes: { 'aria-label': this.i18n.getString('{{tableName}} table header', { tableName: this.i18n.getString(titleMapping[this.typeName]) }) },\r\n },\r\n },\r\n });\r\n\r\n this.gridView = gridView;\r\n updateGridColumn.call(this);\r\n\r\n this.listenTo(this.model, changeEvents('dateRange', 'filter'), () => {\r\n this.setState({ fetchSingleTile: false });\r\n refetch.call(this);\r\n });\r\n\r\n this.listenTo(this.model, changeEvents('body'), () => {\r\n this.setState({ fetchSingleTile: true });\r\n updateGridBody.call(this);\r\n });\r\n\r\n this.listenTo(this.model, changeEvents('columns'), () => {\r\n this.setState({ fetchSingleTile: true });\r\n updateGridColumn.call(this);\r\n });\r\n\r\n this.gridView.on('willUpdate', (changes) => {\r\n if (_.has(changes, 'sortableHeader')) {\r\n onGridSortableHeaderChange.call(this, changes);\r\n }\r\n });\r\n\r\n this.gridView.on('didUpdate', () => {\r\n this.setupScrollBarCover();\r\n });\r\n\r\n this.gridView.on('didRedraw', () => {\r\n this.$('.viewport').scrollTop(0);\r\n this.setupScrollBarCover();\r\n const headerOption = this.$('.column-header.clickable');\r\n const firstRow = this.$('.viewport tr:not(.top-filler):first a');\r\n if (firstRow.length > 0) {\r\n firstRow.focus();\r\n } else if (headerOption.length > 0) {\r\n headerOption.get(0).focus();\r\n }\r\n });\r\n\r\n this.gridView.once('didReload', () => {\r\n this.parent.willRenderWithData();\r\n this.dataFetched = true;\r\n this.gridView.once('didRedraw', () => {\r\n this.parent.renderedWithData();\r\n });\r\n });\r\n\r\n this.gridView.once('willReload', () => {\r\n this.parent.willFetchData();\r\n });\r\n\r\n this.gridView.on('willReload', () => {\r\n if (!this.unblock && !this.parent.unblock) {\r\n this.unblock = withUiBlock(this.$el.parent(), this.i18n.getString('Loading'));\r\n }\r\n });\r\n\r\n this.gridView.on('didReload', () => {\r\n if (this.unblock) {\r\n this.unblock();\r\n this.unblock = null;\r\n }\r\n this.parent.unblockCard();\r\n });\r\n }\r\n\r\n get className() {\r\n return 'grid-content';\r\n }\r\n\r\n get events() {\r\n return {\r\n 'click .grid-cell--Name a': event => navigateToEntity({\r\n event,\r\n pageContext: this.pageContext,\r\n legacyRouter: this.legacyRouter,\r\n createEditableFilterStorage: this.createEditableFilterStorage,\r\n cardType: 'grid-card',\r\n instrumentation: this.instrumentation,\r\n constants: this.constants,\r\n }),\r\n 'mouseenter .grid-cell.grid-cell--Name': showPopup,\r\n 'mouseleave .grid-cell.grid-cell--Name': hidePopup,\r\n 'focus .grid-cell.grid-cell--Name': showPopup,\r\n 'blur .grid-cell.grid-cell--Name': hidePopup,\r\n 'keyup .grid-cell.grid-cell--Name': (event) => {\r\n if (event.keyCode === keyCode.Escape) {\r\n hidePopup.call(this, event);\r\n }\r\n },\r\n };\r\n }\r\n\r\n setupScrollBarCover() {\r\n if (!this.dataFetched) {\r\n return;\r\n }\r\n // If have a scroll bar, cover it per design.\r\n // Scroll bar will only be shown on hover.\r\n const viewport = this.gridView.$('.viewport');\r\n const viewportWidth = viewport.width();\r\n const table = $('table', viewport);\r\n const tableWidth = table.width();\r\n\r\n if (viewportWidth && tableWidth && (viewportWidth > tableWidth)) {\r\n // we have a scroll bar.\r\n const scrollBarWidth = viewportWidth - tableWidth;\r\n const scrollBarHeight = viewport.height();\r\n\r\n if (this.$('.scroll-bar-cover').length === 0) {\r\n // If we don't have a cover, create one.\r\n viewport.append(coverTemplate());\r\n }\r\n\r\n $('.scroll-bar-cover', this.$el.closest('.grid-card')).css({\r\n width: scrollBarWidth,\r\n height: scrollBarHeight,\r\n });\r\n\r\n // expand the viewport area to accommodate the scroll bar.\r\n const expand = Math.min(scrollBarWidth, 16);\r\n\r\n viewport.css({ marginRight: -expand });\r\n } else if (this.$('.scroll-bar-cover').length > 0) {\r\n // remove the scroll bar related change\r\n this.$('.scroll-bar-cover').remove();\r\n viewport.css({ marginRight: 0 });\r\n }\r\n }\r\n\r\n get template() {\r\n return template;\r\n }\r\n\r\n renderTrunk() {\r\n super.renderTrunk();\r\n this.gridView.render();\r\n this.$el.prepend(this.gridView.el);\r\n return this;\r\n }\r\n\r\n remove() {\r\n removeDropdown.call(this);\r\n this.gridView.remove();\r\n\r\n if (this.unblock) {\r\n this.unblock();\r\n }\r\n super.remove();\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport $ from 'jquery';\r\nimport { BaseCard } from '@bingads-webui-campaign/overview-base-card';\r\nimport { helpers } from '@bingads-webui/deterministic-view';\r\nimport { gridCardConfig, changeEvents, AccountsMode } from '@bingads-webui-campaign/overview-cards-common';\r\nimport Content from './content';\r\nimport template from './template.pug';\r\n\r\nlet i18n;\r\n\r\nfunction getMenuItems() {\r\n // Can be shared by multiple tiles on the same page.\r\n // create a new copy every time.\r\n const items = [];\r\n\r\n items.push({\r\n displayText: i18n.getString('Dashboard_GridCard_ToolbarDropdown_Value'),\r\n action: 'PerformanceMetrics',\r\n });\r\n\r\n items.push({\r\n displayText: i18n.getString('Dashboard_GridCard_ToolbarDropdown_Change'),\r\n action: 'PerformanceMetricsChange',\r\n });\r\n\r\n items.push({\r\n displayText: i18n.getString('Dashboard_GridCard_ToolbarDropdown_ChangePercentage'),\r\n action: 'PerformanceMetricsChangePercentage',\r\n });\r\n\r\n return items;\r\n}\r\n\r\n/* @this GridCard */\r\nfunction getCardPreference() {\r\n const {\r\n columns,\r\n orderby,\r\n direction,\r\n directionIndex,\r\n } = this.child.getState();\r\n\r\n const { selectedMenuItem } = this.getState();\r\n\r\n return {\r\n columns,\r\n orderby,\r\n direction,\r\n directionIndex,\r\n selectedMenuItem,\r\n };\r\n}\r\n\r\n/* @this GridCard */\r\nfunction navigate({\r\n accountLevelRout,\r\n campaignLevelRout,\r\n}) {\r\n if (this.navigationLevel === 'account') {\r\n this.deps.legacyRouter.navigateToRoute(accountLevelRout);\r\n } else if (this.navigationLevel === 'customer') {\r\n this.deps.legacyRouter.navigateToRoute('accounts_performance', { accountMode: this.accountsMode });\r\n } else {\r\n const campaignId = this.deps.state.get('campaign_id');\r\n\r\n // eslint-disable-next-line camelcase\r\n this.deps.legacyRouter.navigateToRoute(campaignLevelRout, { campaign_id: campaignId });\r\n }\r\n}\r\n\r\n/* @this GridCard */\r\nfunction navigateToMainGrid() {\r\n let accountLevelRout;\r\n let campaignLevelRout;\r\n\r\n // For now we only support this for search term and keyword.\r\n // Neither of them are enabled in prod.\r\n // We might want to do this for all types.\r\n switch (this.typeName) {\r\n case 'SearchTerm':\r\n accountLevelRout = 'keyword_search_term';\r\n campaignLevelRout = 'campaign_keyword_search_term';\r\n break;\r\n case 'Keyword':\r\n accountLevelRout = 'keyword';\r\n campaignLevelRout = 'campaign_keyword';\r\n break;\r\n case 'Campaign':\r\n accountLevelRout = 'campaign';\r\n break;\r\n case 'AdGroup':\r\n accountLevelRout = 'adgroup';\r\n campaignLevelRout = 'campaign_adgroup';\r\n break;\r\n default:\r\n }\r\n\r\n const {\r\n instrumentation, constants,\r\n } = this.deps;\r\n\r\n instrumentation.logMessage(\r\n [constants.LOGCATEGORY.TRACE],\r\n constants.LOGLEVEL.INFO,\r\n 'grid-card',\r\n `${this.navigationLevel} level ${this.typeName} type view all clicked`\r\n );\r\n navigate.call(this, {\r\n accountLevelRout,\r\n campaignLevelRout,\r\n });\r\n}\r\n\r\nfunction getSearchTermDetail(target) {\r\n const $link = $(target).closest('.grid-cell--Name').find('a[data-type=SearchTerm]');\r\n const campaignId = $link.data('campaignid');\r\n const adGroupId = $link.data('adgroupid');\r\n const text = $link.data('text').toString();\r\n const navigationLevel = $link.data('navigationlevel');\r\n const campaignName = $link.data('campaignname');\r\n const adGroupName = $link.data('adgoupname');\r\n const matchType = $link.data('matchtype');\r\n\r\n return {\r\n campaignId,\r\n adGroupId,\r\n text,\r\n navigationLevel,\r\n campaignName,\r\n adGroupName,\r\n matchType,\r\n };\r\n}\r\n\r\n/* @this GridCard */\r\nfunction setupMenuItems() {\r\n const { dateRange } = this.getState();\r\n\r\n if (dateRange && dateRange.compared && this.typeName !== 'SearchTerm') {\r\n const { selectedMenuItem } = this.getState();\r\n const items = getMenuItems();\r\n\r\n _.each(items, (item) => {\r\n if (item.action === selectedMenuItem) {\r\n item.preset = true; // eslint-disable-line no-param-reassign\r\n } else {\r\n item.preset = false; // eslint-disable-line no-param-reassign\r\n }\r\n });\r\n\r\n this.setState({\r\n menuItems: items,\r\n });\r\n } else {\r\n this.setState({\r\n menuItems: null,\r\n });\r\n this.onMenuAction(gridCardConfig.defaultOptions.selectedMenuItem);\r\n }\r\n}\r\n\r\nexport class GridCard extends BaseCard {\r\n get className() {\r\n return 'grid-card';\r\n }\r\n\r\n get template() {\r\n return () => template({\r\n i18n,\r\n buttonText: this.buttonText,\r\n typeName: this.typeName,\r\n isCustomerLevel: this.navigationLevel === 'customer',\r\n });\r\n }\r\n\r\n get menuItems() {\r\n return this.getState().menuItems;\r\n }\r\n\r\n onMenuAction(body) {\r\n helpers.updateView(this.child, _.defaults({\r\n body,\r\n }, this.getState()));\r\n\r\n if (this.menuItems) {\r\n const { selectedMenuItem } = this.getState();\r\n\r\n if (body === selectedMenuItem) {\r\n return;\r\n }\r\n\r\n this.setState({\r\n selectedMenuItem: body,\r\n });\r\n\r\n this.trigger('storeCardPreference', getCardPreference.call(this));\r\n\r\n const {\r\n instrumentation, constants,\r\n } = this.deps;\r\n\r\n instrumentation.logMessage(\r\n [constants.LOGCATEGORY.TRACE],\r\n constants.LOGLEVEL.INFO,\r\n 'grid-card',\r\n `${this.navigationLevel} level ${this.typeName} type new pop type picked.`\r\n );\r\n _.defer(() => {\r\n // If the menu is open close it.\r\n this.$el.closest('.card-holder').find('.multilevel-dropdown.open').click();\r\n });\r\n }\r\n }\r\n\r\n initialize({\r\n entitySet,\r\n navigationLevel,\r\n columns,\r\n orderby,\r\n direction,\r\n directionIndex,\r\n selectedMenuItem,\r\n dateRange,\r\n filter,\r\n sharedOptions,\r\n fetchSingleTile = false,\r\n preexecuteFlag = false,\r\n deps,\r\n accountsMode = AccountsMode.Expert,\r\n }) {\r\n this.typeName = entitySet.type.elementType.shortName;\r\n this.navigationLevel = navigationLevel;\r\n this.accountsMode = accountsMode;\r\n this.deps = deps;\r\n i18n = this.deps.i18n; // eslint-disable-line\r\n\r\n const isSmartShoppingCampaign = this.isSmartShoppingCampaign();\r\n switch (this.typeName) {\r\n case 'SearchTerm':\r\n this.buttonText = !isSmartShoppingCampaign ? i18n.getString('Dashboard_TopSearchTerms_View_All') : null;\r\n break;\r\n case 'Keyword':\r\n this.buttonText = !isSmartShoppingCampaign ? i18n.getString('Dashboard_TopKeywords_View_All') : null;\r\n break;\r\n case 'Campaign':\r\n this.buttonText = i18n.getString('Dashboard_TopCampaigns_View_All');\r\n break;\r\n case 'AdGroup':\r\n this.buttonText = i18n.getString('Dashboard_TopAdGroups_View_All');\r\n break;\r\n case 'Account':\r\n this.buttonText = i18n.getString('Dashboard_TopAccounts_View_All');\r\n break;\r\n default:\r\n this.buttonText = undefined;\r\n }\r\n\r\n let adjustedMenuItem = selectedMenuItem;\r\n\r\n if (!dateRange.compared || this.typeName === 'SearchTerm') {\r\n adjustedMenuItem = gridCardConfig.defaultOptions.selectedMenuItem;\r\n }\r\n\r\n this.setState(_.defaults({\r\n selectedMenuItem: adjustedMenuItem,\r\n dateRange,\r\n }, {\r\n selectedMenuItem: gridCardConfig.defaultOptions.selectedMenuItem,\r\n }));\r\n\r\n this.child = new Content(_.extend({\r\n entitySet,\r\n navigationLevel,\r\n parent: this,\r\n columns,\r\n orderby,\r\n direction,\r\n directionIndex,\r\n dateRange,\r\n filter,\r\n fetchSingleTile,\r\n preexecuteFlag,\r\n accountsMode,\r\n getCardsConfig: sharedOptions.getCardsConfig,\r\n deps: this.deps,\r\n typeId: this.options.typeId,\r\n }, _.pick(this.getState(), 'selectedMenuItem')));\r\n\r\n this.setChild('content', this.child);\r\n\r\n setupMenuItems.call(this);\r\n helpers.updateView(this.child, this.getState());\r\n\r\n this.listenTo(this.model, changeEvents('dateRange', 'filter'), () => {\r\n helpers.updateView(this.child, this.getState());\r\n });\r\n\r\n this.listenTo(this.model, changeEvents('size'), () => {\r\n if (this.addKeywordView && this.$el.closest('.dashboard').find(`.${this.addKeywordView.className}`).length > 0) {\r\n this.addKeywordView.updatePosition();\r\n }\r\n this.child.setupScrollBarCover();\r\n });\r\n\r\n this.on('rendered', () => {\r\n this.child.setupScrollBarCover();\r\n });\r\n\r\n this.listenTo(this.model, changeEvents('dateRange'), () => {\r\n setupMenuItems.call(this);\r\n });\r\n\r\n this.listenTo(this.model, changeEvents('menuItems'), () => {\r\n this.trigger('change:menuItems', {\r\n value: this.getState().menuItems,\r\n options: { replace: true },\r\n });\r\n });\r\n\r\n this.onResize(() => {\r\n this.child.setupScrollBarCover();\r\n });\r\n\r\n this.child.on('gridOptionChange', () => this.trigger('storeCardPreference', getCardPreference.call(this)));\r\n }\r\n\r\n reloadGrid() {\r\n this.child.gridView.refresh(true);\r\n }\r\n\r\n get events() {\r\n return {\r\n 'click .view-all-clickLink': () => navigateToMainGrid.call(this),\r\n 'click button.add': this.addAsKeyword,\r\n 'click button.exclude': this.addAsNegativeKeyword,\r\n };\r\n }\r\n\r\n addAsKeyword(event) {\r\n /* eslint-disable global-require */\r\n import(/* webpackMode: 'eager' */'./search-term-operations/add-keyword').then(({ AddKeywordView }) => {\r\n this.addKeywordView = new AddKeywordView(_.extend(getSearchTermDetail(event.currentTarget), {\r\n gridCard: this,\r\n addAsNegativeKeyword: false,\r\n reloadGrid: () => this.reloadGrid(),\r\n deps: this.deps,\r\n })).render();\r\n\r\n $(event.currentTarget).closest('.dashboard').append(this.addKeywordView.$el);\r\n });\r\n }\r\n\r\n addAsNegativeKeyword(event) {\r\n /* eslint-disable global-require */\r\n import(/* webpackMode: 'eager' */'./search-term-operations/add-keyword').then(({ AddKeywordView }) => {\r\n this.addKeywordView = new AddKeywordView(_.extend(getSearchTermDetail(event.currentTarget), {\r\n gridCard: this,\r\n addAsNegativeKeyword: true,\r\n reloadGrid: () => this.reloadGrid(),\r\n deps: this.deps,\r\n })).render();\r\n\r\n $(event.currentTarget).closest('.dashboard').append(this.addKeywordView.$el);\r\n });\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport $ from 'jquery';\r\nimport { DeterministicView, helpers } from '@bingads-webui/deterministic-view';\r\nimport { withUiBlock } from '@bingads-webui/uiblocker';\r\nimport {\r\n createCampaignAdGroupSelector,\r\n} from '@bingads-webui-campaign-react/campaign-adgroup-selector-control';\r\nimport { DeterministicWrapperView } from '@bingads-webui/deterministic-wrapper-view';\r\n\r\nimport template from './add-keyword-template.pug';\r\n\r\nconst { ensureChildView } = helpers;\r\n\r\nclass CampaignAdgroupSelectorVnext extends DeterministicWrapperView {\r\n viewFactory({\r\n level,\r\n scope,\r\n campaignId,\r\n selectedCampaign,\r\n selectedAdGroup,\r\n jsData,\r\n i18n,\r\n edmCampaign,\r\n }) {\r\n this.campaignAdgroupSelector = createCampaignAdGroupSelector({\r\n jsData,\r\n edmCampaign,\r\n scope,\r\n level,\r\n campaignId,\r\n i18n,\r\n selectedCampaign,\r\n selectedAdGroup,\r\n parentView: this,\r\n });\r\n return this.campaignAdgroupSelector;\r\n }\r\n}\r\n\r\n/* @this AddKeywordView */\r\nfunction setPosition() {\r\n const position = this.gridCard.$('.viewport').offset();\r\n\r\n if (!position) {\r\n return;\r\n }\r\n\r\n const offset = this.addAsNegativeKeyword ? 150 : 50;\r\n const top = position.top - offset - $(window).scrollTop();\r\n const left = position.left - $(window).scrollLeft();\r\n\r\n this.$el.css({\r\n top,\r\n left,\r\n });\r\n}\r\n\r\n/* @this AddKeywordView */\r\nfunction updateSelectorPosition() {\r\n // Update position of campaign adgroup popup,\r\n // so that it's in view.\r\n const $selector = this.$('.ba-campaign-adgroup-selector .dropdown-menu, .ba-campaign-selector .dropdown-menu, .ba-campaign-selector .dropdown-menu');\r\n const $pageContainer = $('.overview-page');\r\n\r\n $selector.css({ top: 'auto', left: 'auto' });\r\n const { top, left } = $selector.offset();\r\n const { top: parentTop, left: parentLeft } = $selector.offsetParent().offset();\r\n const { top: pageContainerTop, left: pageContainerLeft } = $pageContainer.offset();\r\n const pageContainerHeight = $pageContainer.height();\r\n const pageContainerWidth = $pageContainer.width();\r\n const { selectionLevel } = this.getState();\r\n const selectingCampaignAndAdGroup = selectionLevel === 'adGroupLevel' && this.navigationLevel === 'account';\r\n const selectorSize = selectingCampaignAndAdGroup ?\r\n { height: 450, width: 620 } : { height: 450, width: 320 };\r\n\r\n const offset = { top: 'auto', left: 'auto' };\r\n\r\n if ((top - pageContainerTop) + selectorSize.height > pageContainerHeight) {\r\n offset.top = Math.max(\r\n (pageContainerHeight + pageContainerTop) - selectorSize.height - parentTop,\r\n pageContainerTop - parentTop\r\n );\r\n }\r\n\r\n if ((left - pageContainerLeft) + selectorSize.width > pageContainerWidth) {\r\n offset.left = Math.max(\r\n (pageContainerWidth + pageContainerLeft) - selectorSize.width - parentLeft,\r\n pageContainerLeft - parentLeft\r\n );\r\n }\r\n\r\n if (offset.top !== 'auto' || offset.left !== 'auto') {\r\n $selector.css(offset);\r\n }\r\n}\r\n\r\n/* @this AddKeywordView */\r\nfunction clearError() {\r\n const { errMsg } = this.getState();\r\n\r\n if (errMsg) {\r\n this.setState({ errMsg: null });\r\n }\r\n}\r\n\r\n/* @this AddKeywordView */\r\nfunction setupSelectorView() {\r\n const { selectionLevel, adGroupName, campaignName } = this.getState();\r\n const state = {\r\n scope: this.navigationLevel,\r\n level: selectionLevel,\r\n campaignId: this.campaignId,\r\n i18n: this.deps.i18n,\r\n selectedCampaign: {\r\n name: campaignName,\r\n Id: this.campaignId,\r\n },\r\n selectedAdGroup: {\r\n name: adGroupName,\r\n campaignName,\r\n },\r\n jsData: this.deps.jsdata,\r\n edmCampaign: this.deps.edmCampaign,\r\n };\r\n\r\n if (this.getChild('selector')) {\r\n this.detachChild('selector').remove();\r\n }\r\n\r\n const childView = ensureChildView(\r\n this,\r\n 'selector',\r\n CampaignAdgroupSelectorVnext,\r\n state,\r\n {\r\n campaignSelected(newCampaign) {\r\n const { level = selectionLevel } = this.getState();\r\n\r\n if (level === 'campaignLevel') {\r\n this.campaignId = newCampaign.Id;\r\n\r\n this.setState({\r\n campaignName: newCampaign.Name,\r\n });\r\n clearError.call(this);\r\n }\r\n },\r\n adgroupSelected(newAdGroup) {\r\n this.campaignId = newAdGroup.campaignId;\r\n this.adGroupId = newAdGroup.Id;\r\n this.setState({\r\n adGroupName: newAdGroup.Name,\r\n campaignName: newAdGroup.campaignName,\r\n });\r\n clearError.call(this);\r\n },\r\n }\r\n );\r\n\r\n childView.once('rendered', () => {\r\n window.addEventListener('click', this.windowClickHandler);\r\n window.addEventListener('scroll', this.windowScrollHandler);\r\n window.addEventListener('resize', this.windowResizeHandler);\r\n $('.overview-page').parent().scroll(this.windowScrollHandler);\r\n updateSelectorPosition.call(this);\r\n });\r\n}\r\n\r\n/* @this AddKeywordView */\r\nfunction errorHandler(response) {\r\n if (response && response.errors) {\r\n let errors;\r\n\r\n if (this.addAsNegativeKeyword) {\r\n errors = this.deps.i18nErrors.getODataErrors(response.errors);\r\n } else {\r\n errors = this.deps.i18nErrors.getBulkApiErrors(response.errors);\r\n }\r\n\r\n if (errors && errors[0] && errors[0].message) {\r\n this.setState({\r\n errMsg: errors[0].message,\r\n });\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport class AddKeywordView extends DeterministicView {\r\n get className() {\r\n return 'add-keyword-container';\r\n }\r\n\r\n get template() {\r\n const {\r\n adGroupName,\r\n campaignName,\r\n selectionLevel,\r\n errMsg,\r\n isEmpty,\r\n } = this.getState();\r\n\r\n return () => template({\r\n i18n: this.deps.i18n,\r\n text: this.text,\r\n matchType: this.matchType,\r\n navigationLevel: this.navigationLevel,\r\n addAsNegativeKeyword: this.addAsNegativeKeyword,\r\n adGroupName,\r\n campaignName,\r\n selectionLevel,\r\n appendLearnMoreLink: this.deps.appendLearnMoreLink,\r\n errMsg,\r\n isEmpty,\r\n });\r\n }\r\n\r\n initialize({\r\n campaignId,\r\n adGroupId,\r\n text,\r\n navigationLevel,\r\n campaignName,\r\n adGroupName,\r\n gridCard,\r\n addAsNegativeKeyword,\r\n matchType,\r\n reloadGrid,\r\n deps,\r\n }) {\r\n this.campaignId = campaignId;\r\n this.adGroupId = adGroupId;\r\n this.text = text;\r\n this.reloadGrid = reloadGrid;\r\n this.deps = deps;\r\n\r\n if (addAsNegativeKeyword && matchType === 'Broad') {\r\n // Negative keyword do not have 'Broad' match, while delivery match type is 'Broad'.\r\n // Set default negative keyword match type as 'Exact'.\r\n this.matchType = 'Exact';\r\n } else if (!addAsNegativeKeyword && matchType === 'Exact') {\r\n // The delivery match type is 'Broad'. So the keyword already exist with 'Exact' match.\r\n // Set default new keyword match type as 'Broad'.\r\n this.matchType = 'Broad';\r\n } else {\r\n this.matchType = matchType;\r\n }\r\n\r\n this.navigationLevel = navigationLevel;\r\n this.gridCard = gridCard;\r\n this.addAsNegativeKeyword = addAsNegativeKeyword;\r\n gridCard.trigger('clearDragAndDrop');\r\n this.windowClickHandler = event => this.hideOnClickOutSide(event);\r\n this.windowScrollHandler = _.throttle(() => {\r\n this.updatePosition();\r\n }, 10);\r\n\r\n this.windowResizeHandler = _.throttle(() => {\r\n this.updatePosition();\r\n }, 10);\r\n this.scopeContext = this.deps.scopeService.getScope();\r\n\r\n setPosition.call(this);\r\n this.setState({\r\n adGroupName,\r\n campaignName,\r\n selectionLevel: 'adGroupLevel',\r\n isEmpty: false,\r\n });\r\n\r\n setupSelectorView.call(this);\r\n }\r\n\r\n onSuccess() {\r\n this.reloadGrid();\r\n this.remove();\r\n }\r\n\r\n onError(response) {\r\n if (!errorHandler.call(this, response)) {\r\n this.remove();\r\n }\r\n }\r\n\r\n cancel() {\r\n this.remove();\r\n }\r\n\r\n apply() {\r\n if (this.addAsNegativeKeyword) {\r\n const { selectionLevel } = this.getState();\r\n const negativeKeyword = {\r\n NegativeKeywords: [{\r\n Text: this.text,\r\n EntityType: selectionLevel === 'adGroupLevel' ? 'AdGroup' : 'Campaign',\r\n CampaignId: this.campaignId,\r\n AdGroupId: this.adGroupId,\r\n MatchType: this.matchType,\r\n }],\r\n };\r\n const campaignEntity = this.deps.edmCampaign.currentAccount.Campaigns\r\n .$withKey(this.campaignId);\r\n let entitySet;\r\n\r\n if (selectionLevel === 'adGroupLevel') {\r\n entitySet = campaignEntity.AdGroups.$withKey(this.adGroupId);\r\n } else {\r\n entitySet = campaignEntity;\r\n }\r\n\r\n this.deps.jsdata.NegativeKeyword.create(negativeKeyword, {\r\n entitySet: entitySet.NegativeKeywords['Default.PostNegativeKeywords'],\r\n }).finally(document.documentElement.contains(this.el) ?\r\n withUiBlock(this.el) :\r\n _.noop).then(() => this.onSuccess()).catch(response => this.onError(response));\r\n } else {\r\n const { adGroupName } = this.getState();\r\n const keywordData = {\r\n Campaign: { Id: this.campaignId },\r\n Name: adGroupName,\r\n Id: this.adGroupId,\r\n Keywords: [{\r\n Text: this.text,\r\n MatchType: this.matchType,\r\n Bid: {},\r\n AdGroup: { Id: this.adGroupId },\r\n }],\r\n };\r\n\r\n this.deps.jsdata.AdGroup\r\n .update(keywordData.Id, keywordData, { adapter: 'bulk' })\r\n .finally(document.documentElement.contains(this.el) ?\r\n withUiBlock(this.el) :\r\n _.noop).then(() => this.onSuccess()).catch(response => this.onError(response));\r\n }\r\n }\r\n\r\n updatePosition() {\r\n setPosition.call(this);\r\n updateSelectorPosition.call(this);\r\n }\r\n\r\n toggleSelector() {\r\n if (this.$('.popover.row.fade.bottom:visible').length === 0) {\r\n _.defer(() => {\r\n this.$('div.form-control.dropDownSelect.k-button.clickable').click();\r\n });\r\n }\r\n }\r\n\r\n updateEntityLevel(event) {\r\n const selected = this.$('input[type=\"radio\"][name=\"entityLevel\"]:checked');\r\n\r\n if (selected.length > 0) {\r\n const { selectionLevel } = this.getState();\r\n const value = selected.val();\r\n\r\n if (selectionLevel !== value) {\r\n this.setState({\r\n selectionLevel: value,\r\n });\r\n setupSelectorView.call(this);\r\n clearError.call(this);\r\n }\r\n }\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n\r\n keywordTextChange() {\r\n this.text = this.$('input.keyword-text__value').val();\r\n clearError.call(this);\r\n this.setState({\r\n isEmpty: !this.text,\r\n });\r\n }\r\n\r\n matchTypeChange() {\r\n this.matchType = this.$('select.match-type__value').val();\r\n clearError.call(this);\r\n }\r\n\r\n get events() {\r\n return {\r\n 'click button.cancel': this.cancel,\r\n 'click button.apply': this.apply,\r\n 'click .selected-entity-names': this.toggleSelector,\r\n 'click input[type=\"radio\"][name=\"entityLevel\"]': this.updateEntityLevel,\r\n 'input input.keyword-text__value': this.keywordTextChange,\r\n 'change select.match-type__value': this.matchTypeChange,\r\n 'click .ba-campaign-adgroup-selector, .ba-campaign-selector, .ba-campaign-selector': () => _.defer(updateSelectorPosition.bind(this)),\r\n };\r\n }\r\n\r\n remove() {\r\n this.gridCard.trigger('setupDragAndDrop');\r\n window.removeEventListener('click', this.windowClickHandler);\r\n window.removeEventListener('scroll', this.windowScrollHandler);\r\n window.removeEventListener('resize', this.windowResizeHandler);\r\n super.remove();\r\n }\r\n\r\n hideOnClickOutSide(event) {\r\n if (!this.el.contains(event.target)) {\r\n this.remove();\r\n }\r\n }\r\n}\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport Backbone from 'backbone';\r\nimport { TooltipHost } from '@bingads-webui-react/fabric-control';\r\nimport { Glyphicon } from '@bingads-webui-react/primitive-unthemed';\r\nimport { DeterministicViewForBackBoneView } from '@bingads-webui/deterministic-wrapper-view';\r\n\r\n// eslint-disable-next-line react/prop-types\r\nexport const MetricToolTip = ({ content }) => (\r\n \r\n \r\n \r\n);\r\n\r\nexport class MetricToolTipBackBoneView extends Backbone.View {\r\n initialize({ content }) {\r\n this.content = content;\r\n }\r\n\r\n render() {\r\n ReactDOM.render(\r\n (),\r\n this.el\r\n );\r\n return this;\r\n }\r\n\r\n remove() {\r\n ReactDOM.unmountComponentAtNode(this.el);\r\n return super.remove();\r\n }\r\n}\r\n\r\nexport function getDeterministicTooltipView(content) {\r\n return new DeterministicViewForBackBoneView({\r\n view: new MetricToolTipBackBoneView({ content }),\r\n });\r\n}\r\n","import _ from 'underscore';\r\nimport 'bootstrap';\r\nimport { DeterministicView } from '@bingads-webui/deterministic-view';\r\nimport { allMetrics as defaultMetrics } from '@bingads-webui-campaign/overview-cards-common';\r\nimport defaultTemplate from './template.pug';\r\nimport defaultButtonTemplate from './button-template.pug';\r\nimport defaultDropdownMenuTemplate from './dropdown-menu-template.pug';\r\nimport { getDeterministicTooltipView } from './info-tooltip';\r\n\r\nexport class MetricPicker extends DeterministicView {\r\n constructor(options) {\r\n super(_.extend({}, options, { renderInSync: true }));\r\n }\r\n\r\n initialize({\r\n template = defaultTemplate,\r\n buttonTemplate = defaultButtonTemplate,\r\n buttonTemplateParams = {},\r\n dropdownMenuTemplate = defaultDropdownMenuTemplate,\r\n metric,\r\n metrics,\r\n leftAlign,\r\n metricFormatter,\r\n s$i18n,\r\n i18n,\r\n accountsMode,\r\n deps,\r\n } = {}) {\r\n this.template = template;\r\n this.buttonTemplate = buttonTemplate;\r\n this.buttonTemplateParams = buttonTemplateParams;\r\n this.dropdownMenuTemplate = dropdownMenuTemplate;\r\n this.leftAlign = leftAlign;\r\n this.metricFormatter = metricFormatter;\r\n this.s$i18n = s$i18n;\r\n this.i18n = i18n;\r\n this.accountsMode = accountsMode;\r\n this.deps = deps || {};\r\n this.setState({\r\n metric,\r\n metrics,\r\n });\r\n }\r\n\r\n get events() {\r\n return {\r\n 'click .metric-picker': (e) => {\r\n // if the event was triggered from dropdown menu, ignore it\r\n if (e.target.classList.contains('dropdown-menu')) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n return;\r\n }\r\n const toggleEl = this.$('.dropdown-toggle')[0];\r\n\r\n if (toggleEl === e.target || toggleEl.contains(e.target)) {\r\n return;\r\n }\r\n\r\n this.trigger('pick', {\r\n metric: this.getState().metric,\r\n });\r\n },\r\n 'click .dropdown-menu li': (e) => {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n const { metric } = e.currentTarget.dataset;\r\n\r\n this.setState({\r\n metric,\r\n });\r\n\r\n this.trigger('pick', {\r\n metric: this.getState().metric,\r\n });\r\n\r\n this.SetUpContentForGlobalA11yAnnounceArea(metric);\r\n },\r\n };\r\n }\r\n\r\n renderTrunk() {\r\n const {\r\n performanceMetric = '',\r\n metric,\r\n metrics = defaultMetrics(this.deps.config && this.deps.config.get('Permissions'), this.accountsMode),\r\n hideCurrency,\r\n } = this.getState();\r\n\r\n this.$el.html(this.template({\r\n metric,\r\n }));\r\n\r\n const metricValue = metric ? this.metricFormatter.formatMetric(\r\n metric,\r\n performanceMetric || 0,\r\n { hideCurrency }\r\n ) : '';\r\n const addInfo = metricValue === '-';\r\n\r\n if (addInfo) {\r\n const tooltipView = getDeterministicTooltipView(this.i18n.getString('Dashboard_CurrencyMetric_Info_Tooltip'));\r\n\r\n this.setChild('info-tooltip', tooltipView);\r\n }\r\n\r\n this.$('.metric-picker').append(this.buttonTemplate({\r\n s$i18n: this.s$i18n,\r\n metricValue,\r\n metric,\r\n performanceMetric,\r\n i18n: this.i18n,\r\n addInfo,\r\n ...this.buttonTemplateParams,\r\n }));\r\n\r\n this.$('.metric-picker').append(this.dropdownMenuTemplate({\r\n s$i18n: this.s$i18n,\r\n metrics,\r\n leftAlign: this.leftAlign,\r\n }));\r\n\r\n return this;\r\n }\r\n\r\n SetUpContentForGlobalA11yAnnounceArea(metricName) {\r\n const a11yAnnounceArea = document.querySelector('#a11yAnnounceArea');\r\n if (a11yAnnounceArea) {\r\n a11yAnnounceArea.textContent = this.i18n.getString('Dashboard_Graph_MetricsName_Updated_A11y_Info').replace('{{metricsName}}', this.s$i18n.property('PerformanceMetrics', metricName));\r\n setTimeout(() => {\r\n a11yAnnounceArea.textContent = '';\r\n }, 0);\r\n }\r\n }\r\n}\r\n","export { CardState } from './src/dashboard/card-state';\r\n\r\nexport { getViewportCardCount } from './src/dashboard/util';\r\n\r\nexport { DateFilterState } from './src/dashboard/datefilter-state';\r\n\r\nexport const overviewPanel = () => import(/* webpackMode: 'eager' */ './src/index');\r\n","function getDefaultConfig() {\r\n return {\r\n defaultName: 'default',\r\n defaultDragAndDrop: true,\r\n defaultDebug: false,\r\n defaultDragHandlerSelector: '.card-holder__toolbar, .card-holder__title, .card-holder__menu-container',\r\n layoutOptions: {\r\n small: {\r\n breakpoint: 0,\r\n minCardSize: 12,\r\n maxCardSize: 12,\r\n defaultHeight: 368,\r\n },\r\n medium: {\r\n breakpoint: 1046,\r\n minCardSize: 6,\r\n maxCardSize: 12,\r\n defaultHeight: 368,\r\n },\r\n large: {\r\n breakpoint: 1400,\r\n minCardSize: 4,\r\n maxCardSize: 12,\r\n defaultHeight: 368,\r\n },\r\n },\r\n toolbar: {\r\n ids: {\r\n addCardButton: 'btn-add-card',\r\n },\r\n items: [\r\n {\r\n type: 'button',\r\n id: 'btn-add-card',\r\n classes: ['btn', 'btn-default'],\r\n textKey: 'Dashboard_AddCard',\r\n },\r\n ],\r\n },\r\n };\r\n}\r\n\r\nfunction getWelcomeConfig() {\r\n return {\r\n defaultName: 'welcome',\r\n defaultDragAndDrop: false,\r\n defaultDebug: false,\r\n layoutOptions: {\r\n small: {\r\n breakpoint: 0,\r\n minCardSize: 12,\r\n maxCardSize: 12,\r\n defaultHeight: 368,\r\n },\r\n medium: {\r\n breakpoint: 1046,\r\n minCardSize: 6,\r\n maxCardSize: 12,\r\n defaultHeight: 368,\r\n },\r\n },\r\n };\r\n}\r\n\r\nexport const dashboardConfig = {\r\n getDefaultConfig() {\r\n return getDefaultConfig();\r\n },\r\n getWelcomeConfig() {\r\n return getWelcomeConfig();\r\n },\r\n};\r\n","import ko from 'knockout';\r\nimport _ from 'underscore';\r\nimport { keyCode } from '@bingads-webui/keycode';\r\n\r\nexport class AddCardViewModel {\r\n constructor({\r\n allAvailableCards,\r\n selectedCards,\r\n i18n,\r\n updateFocusedIndex,\r\n }) {\r\n this.selectedCards = selectedCards;\r\n this.i18n = i18n;\r\n const getFirstFocusableIndex = (cards) => {\r\n const firstSelectedIndex = _.findIndex(\r\n cards,\r\n card => card.selected()\r\n );\r\n return firstSelectedIndex === -1 ? 0 : firstSelectedIndex;\r\n };\r\n\r\n // construct the observables\r\n _.each(allAvailableCards, (card) => {\r\n _.extend(card, {\r\n selected: ko.observable(_.findIndex(\r\n selectedCards,\r\n selected => selected === card.typeId\r\n ) !== -1),\r\n });\r\n\r\n _.extend(card, {\r\n appliedClass: ko.pureComputed(() => {\r\n if (card.selected()) {\r\n return `add-card__thumbnail-${card.cssKey} add-card__thumbnail-${card.cssKey}--selected`;\r\n }\r\n return `add-card__thumbnail-${card.cssKey}`;\r\n }, card),\r\n });\r\n });\r\n\r\n this.firstFocusedIndex = ko.observable(getFirstFocusableIndex(allAvailableCards));\r\n\r\n this.allCards = ko.observableArray(allAvailableCards);\r\n\r\n this.cardsToAdd = ko.pureComputed(() => _.chain(this.allCards())\r\n .filter(card => card.selected() === true)\r\n .pluck('typeId')\r\n .difference(this.selectedCards)\r\n .value());\r\n\r\n this.cardsToDelete = ko.pureComputed(() => _.chain(this.allCards())\r\n .filter(card => card.selected() !== true)\r\n .pluck('typeId')\r\n .intersection(this.selectedCards)\r\n .value());\r\n\r\n this.selectedTilesNumber = ko.pureComputed(() => {\r\n const selectedGroup = _.countBy(this.allCards(), c => (c.selected() === true ? 'selected' : 'unselected'));\r\n\r\n return selectedGroup.selected || 0;\r\n }, this);\r\n\r\n // Simple click callback, only for toggle state\r\n this.onThumbnailClicked = (card) => {\r\n card.selected(!card.selected());\r\n this.firstFocusedIndex(getFirstFocusableIndex(allAvailableCards));\r\n };\r\n\r\n this.onKeyPress = (card, event) => {\r\n if (event.keyCode === keyCode.Space) {\r\n card.selected(!card.selected());\r\n this.firstFocusedIndex(getFirstFocusableIndex(allAvailableCards));\r\n event.preventDefault();\r\n }\r\n };\r\n\r\n this.onFocus = (card) => {\r\n const index = allAvailableCards.indexOf(card);\r\n updateFocusedIndex(index);\r\n };\r\n }\r\n}\r\n","import Backbone from 'backbone';\r\nimport ko from 'knockout';\r\nimport _ from 'underscore';\r\nimport { keyCode } from '@bingads-webui/keycode';\r\nimport edm from '@bingads-webui-component-legacy/edm-campaign/index';\r\nimport config from '@bingads-webui-component-legacy/config/index';\r\n\r\nimport templateVNext from './template-vnext.pug';\r\nimport { AddCardViewModel } from './viewmodel';\r\n\r\nconst i18n = window.globalLegacyI18n.get('component/i18n/loader!campaignui/feature/dashboard-page');\r\nconst permissions = config.get('Permissions') || {};\r\n\r\n/* @this AddCardView */\r\nfunction saveAddCard() {\r\n this.trigger('apply', {\r\n idsToAdd: this.viewModel.cardsToAdd(),\r\n idsToDelete: this.viewModel.cardsToDelete(),\r\n });\r\n}\r\n\r\n/* @this AddCardView */\r\nfunction cancelAddCard() {\r\n this.trigger('cancel');\r\n}\r\n\r\n/* @this GetNextFocusedIndex */\r\nfunction getNextFocusedItemIndex(numOfCards, previousIndex, isNext) {\r\n const maxIndex = numOfCards - 1;\r\n\r\n let newIndex;\r\n\r\n if (previousIndex < 0) {\r\n newIndex = 0;\r\n } else if (previousIndex > maxIndex) {\r\n newIndex = maxIndex;\r\n } else if (isNext && previousIndex === maxIndex) {\r\n newIndex = 0;\r\n } else if (!isNext && previousIndex === 0) {\r\n newIndex = maxIndex;\r\n } else {\r\n newIndex = isNext ? previousIndex + 1 : previousIndex - 1;\r\n }\r\n\r\n return newIndex;\r\n}\r\n\r\n/* @this GetAllCardElements */\r\nfunction getAllAvailableCardElements() {\r\n return this.$('.add-card__card-box');\r\n}\r\n\r\n/* @this AddCardKeyDown */\r\nfunction onKeyDown(event) {\r\n const allAvailableCardElements = getAllAvailableCardElements.call(this);\r\n const numOfCards = allAvailableCardElements.length;\r\n if (numOfCards === 0) {\r\n return;\r\n }\r\n if (event.keyCode === keyCode.ArrowDown) {\r\n this.focusedIndex = getNextFocusedItemIndex(numOfCards, this.focusedIndex, true);\r\n event.preventDefault();\r\n } else if (event.keyCode === keyCode.ArrowUp) {\r\n this.focusedIndex = getNextFocusedItemIndex(numOfCards, this.focusedIndex, false);\r\n event.preventDefault();\r\n } else if (event.keyCode === keyCode.Home) {\r\n this.focusedIndex = 0;\r\n } else if (event.keyCode === keyCode.End) {\r\n this.focusedIndex = numOfCards - 1;\r\n }\r\n const cardElement = allAvailableCardElements[this.focusedIndex];\r\n cardElement.focus();\r\n}\r\n\r\nexport class AddCardView extends Backbone.View {\r\n initialize({\r\n selectedCards = [],\r\n navigationLevel,\r\n accountsMode,\r\n newCardsConfig = null,\r\n campaignType,\r\n newI18n,\r\n }) {\r\n this.navigationLevel = navigationLevel;\r\n this.campaignType = campaignType;\r\n const cardsConfig = newCardsConfig({\r\n permissions,\r\n edm,\r\n accountsMode,\r\n });\r\n this.focusedIndex = -1;\r\n const updateFocusedIndex = (index) => {\r\n this.focusedIndex = index;\r\n };\r\n this.newI18n = newI18n;\r\n\r\n this.viewModel = new AddCardViewModel({\r\n allAvailableCards: _.chain(cardsConfig).filter(conf => cardsConfig.isValidForNavigationLevel(\r\n conf,\r\n this.navigationLevel,\r\n this.campaignType\r\n )).map((conf) => {\r\n const useNewI18n = conf.useNewI18n || false;\r\n return ({\r\n typeId: conf.typeId,\r\n name: conf.name,\r\n addCardTitle: useNewI18n ? newI18n.getString(conf.addCardTitleKey) : i18n.getString(conf.addCardTitleKey),\r\n cssKey: conf.cssKey,\r\n desc: useNewI18n ? newI18n.getString(conf.descKey) : i18n.getString(conf.descKey),\r\n });\r\n }).value(),\r\n selectedCards,\r\n i18n,\r\n newI18n,\r\n updateFocusedIndex,\r\n });\r\n }\r\n\r\n events() {\r\n return {\r\n 'click .save': saveAddCard,\r\n 'click .cancel': cancelAddCard,\r\n 'keydown .add-card__card-box': onKeyDown,\r\n };\r\n }\r\n\r\n render() {\r\n this.$el.html(templateVNext({\r\n i18n,\r\n }));\r\n ko.applyBindings(this.viewModel, this.el);\r\n\r\n return this;\r\n }\r\n\r\n show() {\r\n this.$el.show();\r\n }\r\n\r\n hide() {\r\n this.$el.hide();\r\n }\r\n\r\n remove() {\r\n super.remove();\r\n }\r\n}\r\n","/* eslint-disable import/no-unresolved */\r\n/* eslint-disable import/extensions */\r\nimport Promise from 'bluebird';\r\nimport eventDispatcher from '@bingads-webui-component-legacy/event-dispatcher/index';\r\n\r\nexport const welcomeCardConfig = [\r\n {\r\n // Welcome Tips Card\r\n validFor: ['account'],\r\n typeId: 'CardType-WelcomeTips',\r\n name: 'WelcomeTipsCard',\r\n cssKey: 'tips-and-opportunities',\r\n titleKey: 'Dashboard_Tips_Card_Title',\r\n contentType: 'WelcomeTipsCard',\r\n sizeOption: {\r\n small: {\r\n width: 12,\r\n supportedWidth: [12],\r\n },\r\n medium: {\r\n width: 6,\r\n supportedWidth: [6],\r\n },\r\n },\r\n },\r\n];\r\n\r\nwelcomeCardConfig.getContentConstructor = ({\r\n contentType,\r\n constants,\r\n instrumentation,\r\n}) => new Promise((resolve) => {\r\n const i18n = window.globalLegacyI18n.get('@bingads-webui/i18n-amd-loader!campaignui/feature/dashboard-cards');\r\n const deps = {\r\n i18n,\r\n eventDispatcher,\r\n };\r\n\r\n switch (contentType) {\r\n case 'WelcomeTipsCard':\r\n import(/* webpackMode: 'eager' */ '@bingads-webui-campaign-legacy/dashboard-cards/welcome-tips-card/index').then((contentConstructor) => {\r\n resolve({\r\n contentConstructor: contentConstructor.default,\r\n deps,\r\n });\r\n });\r\n break;\r\n default:\r\n resolve();\r\n instrumentation.logMessage(\r\n [constants.LOGCATEGORY.ERROR],\r\n constants.LOGLEVEL.INFO,\r\n 'dashboard/dashboard-view',\r\n `Unknown card content: ${contentType}`\r\n );\r\n }\r\n});\r\n","import Backbone from 'backbone';\r\nimport Promise from 'bluebird';\r\nimport $ from 'jquery';\r\nimport _ from 'underscore';\r\nimport { AccountsMode } from '@bingads-webui-campaign/overview-cards-common';\r\nimport { CampaignType as AccountLevelCampaignType } from '@bingads-webui-campaign/campaign-ui-common';\r\n\r\nimport { dashboardConfig } from '../config/dashboard-config';\r\nimport { welcomeCardConfig } from '../config/welcome-card-config';\r\nimport { getQuickInstrumentation } from '../instrumentation/log-helper';\r\n\r\nconst CampaignLevelCampaignType = _.mapObject(AccountLevelCampaignType, (val, key) => key);\r\n\r\nfunction uri() {\r\n const api = 'Customers(:advertisercustomer_id)/Accounts(:account_id)/Default.AlertInformation';\r\n const odataParam = '$select=HasBIData,HasCampaigns,HasOtherAccounts';\r\n\r\n return `${api}?${odataParam}`;\r\n}\r\n\r\nexport class CardState extends Backbone.Model {\r\n initialize({\r\n navigationLevel,\r\n permissions,\r\n edm,\r\n pageContext,\r\n odata,\r\n preferences,\r\n instrumentationSettings,\r\n instrumentation,\r\n constants,\r\n newCardsConfig = null,\r\n welcomeCardsConfig,\r\n accountsMode = AccountsMode.Expert,\r\n campaignType,\r\n isPrefetch = false,\r\n }) {\r\n this.isPrefetch = isPrefetch;\r\n if (navigationLevel === 'customer') {\r\n // eslint-disable-next-line no-param-reassign\r\n edm.customerIdType.useAdvertiserCustomerId = false;\r\n }\r\n this.set({\r\n name: 'default',\r\n navigationLevel,\r\n });\r\n this.campaignType = campaignType;\r\n this.pageContext = pageContext;\r\n this.odata = odata;\r\n this.newCardsConfig = newCardsConfig;\r\n this.welcomeCardsConfig = welcomeCardsConfig;\r\n this.preferences = preferences;\r\n this.accountsMode = accountsMode;\r\n // Get the ID based on the name and navigation level before anything else.\r\n this.p$Initialized = preferences.initialize().then(() => {\r\n this.fetchDashboardId();\r\n });\r\n\r\n this.cardsConfig = newCardsConfig({\r\n permissions,\r\n edm,\r\n accountsMode,\r\n });\r\n\r\n this.quickInstrumentation = this.isPrefetch ? _.noop :\r\n getQuickInstrumentation({\r\n instrumentationSettings,\r\n instrumentation,\r\n constants,\r\n });\r\n }\r\n\r\n fetchDashboardId() {\r\n const name = this.get('name');\r\n\r\n if (this.accountsMode === AccountsMode.Smart) {\r\n this.set('dashboardId', `${name}-${this.navigationLevel}-smart`);\r\n } else if (this.campaignType === CampaignLevelCampaignType.Hotel || this.campaignType === AccountLevelCampaignType.Hotel) {\r\n this.set('dashboardId', `${name}-${this.navigationLevel}-hotel`);\r\n } else if (this.campaignType === CampaignLevelCampaignType.PerformanceMax || this.campaignType === AccountLevelCampaignType.PerformanceMax) {\r\n this.set('dashboardId', `${name}-${this.navigationLevel}-performancemax`);\r\n } else if (this.campaignType === CampaignLevelCampaignType.App || this.campaignType === AccountLevelCampaignType.App) {\r\n this.set('dashboardId', `${name}-${this.navigationLevel}-app`);\r\n } else {\r\n this.set('dashboardId', `${name}-${this.navigationLevel}`);\r\n }\r\n }\r\n\r\n loadDashboardState() {\r\n // get all dashboard preference\r\n this.prefs = this.getDashBoardPreferences();\r\n if (this.prefs && _.has(this.prefs.Data, this.dashboardId) && _.has(this.prefs.Data[this.dashboardId], 'options')) {\r\n this.set('options', _.extend(_.omit(this.prefs.Data[this.dashboardId].options, ['reOrderedForV2', 'showWelcomeTips', 'reOrderedForABCTest']), this.options));\r\n }\r\n\r\n const userWelcomePref = this.preferences.findByNameAtUserLevel(this.get('userWelcomePrefName'));\r\n const doneWithWelcomeTips = userWelcomePref ? userWelcomePref.Data : false;\r\n const doNotShowWelcomeTips = this.dashboardId !== 'default-account' || doneWithWelcomeTips === true;\r\n const welcomeStatus = new Promise((resolve) => {\r\n if (doNotShowWelcomeTips) {\r\n resolve({ showWelcomeTips: false });\r\n } else if (this.pageContext.WelcomeStatus &&\r\n !this.pageContext.WelcomeStatus.doneInitialLoad) {\r\n resolve({\r\n showWelcomeTips: this.pageContext.WelcomeStatus.ShowWelcomeTips,\r\n createdCampaign: this.pageContext.WelcomeStatus.HasCampaigns,\r\n skippedBothAtAccountCreation: this.options.skippedBothAtAccountCreation,\r\n skippedNoneAtAccountCreation: this.options.skippedNoneAtAccountCreation,\r\n });\r\n this.pageContext.WelcomeStatus.doneInitialLoad = true;\r\n } else {\r\n this.odata.get(uri()).then((data) => {\r\n if (data.HasBIData || data.HasOtherAccounts) {\r\n resolve({ showWelcomeTips: false });\r\n } else {\r\n resolve({\r\n showWelcomeTips: true,\r\n createdCampaign: data.HasCampaigns,\r\n skippedBothAtAccountCreation: this.options.skippedBothAtAccountCreation,\r\n skippedNoneAtAccountCreation: this.options.skippedNoneAtAccountCreation,\r\n });\r\n }\r\n }).catch(() => {\r\n resolve({ showWelcomeTips: false });\r\n });\r\n }\r\n });\r\n\r\n return welcomeStatus.then((status) => {\r\n if (status.showWelcomeTips) {\r\n this.showWelcomeTips = true;\r\n this.loadWelcomeTips();\r\n this.welcomeAttr = _.clone(this.welcomeCardsConfig[0]);\r\n this.welcomeAttr.constructOptions = status;\r\n this.config = dashboardConfig.getWelcomeConfig();\r\n this.config.getContentConstructor = this.welcomeCardsConfig.getContentConstructor;\r\n // for the users we show welcome tips, set overview tab as default.\r\n this.preferences.set({\r\n Name: this.get('OverviewAsDefaultPrefName'),\r\n Data: true,\r\n });\r\n } else {\r\n this.showWelcomeTips = false;\r\n if (!doNotShowWelcomeTips) {\r\n // status changed. We will not show welcome tips for this user anymore.\r\n // option clean up\r\n const newOptions = _.omit(this.options, ['skippedBothAtAccountCreation', 'doneWithWelcomeTips', 'skippedNoneAtAccountCreation']);\r\n\r\n this.set('options', newOptions);\r\n _.defer(() => this.save({ newOptions }));\r\n this.quickInstrumentation('LoadOverviewPage', 'No welcomeTips for this user anymore.');\r\n this.preferences.setAtUserLevel({\r\n Name: this.get('userWelcomePrefName'),\r\n Data: true,\r\n });\r\n }\r\n this.config = dashboardConfig.getDefaultConfig();\r\n this.config.getContentConstructor = this.cardsConfig.getContentConstructor;\r\n this.loadDashBoardCards();\r\n }\r\n });\r\n }\r\n\r\n loadWelcomeTips() {\r\n this.set('cards', _.map(welcomeCardConfig, card => ({\r\n id: card.typeId,\r\n sizeOption: card.sizeOption,\r\n })));\r\n }\r\n\r\n loadDashBoardCards() {\r\n if (this.prefs && _.has(this.prefs.Data, this.dashboardId) && _.has(this.prefs.Data[this.dashboardId], 'cards')) {\r\n const cardGroup = _.groupBy(\r\n this.cardsConfig,\r\n cardConfig => this.getCardCategory(cardConfig)\r\n );\r\n\r\n let availableCards = cardGroup.defaultIn;\r\n let cards;\r\n let savePreference = false;\r\n\r\n if (_.size(cardGroup.defaultOut) !== 0) {\r\n availableCards = availableCards.concat(cardGroup.defaultOut);\r\n }\r\n\r\n // See if we have any retired cards:\r\n // cards that in the user's preference but not available anymore.\r\n const retiredCards = _.difference(_.map(this.prefs.Data[this.dashboardId].cards, card =>\r\n card.id), _.map(availableCards, card =>\r\n card.typeId));\r\n\r\n if (_.size(retiredCards) !== 0) {\r\n this.quickInstrumentation('RemoveRetiredTilesFromOverview');\r\n }\r\n // Filter out retired cards from preference.\r\n this.prefs.Data[this.dashboardId].cards = _.filter(\r\n this.prefs.Data[this.dashboardId].cards,\r\n card => !_.contains(retiredCards, card.id)\r\n );\r\n // Filter out hidden cards.\r\n cards = _.filter(this.prefs.Data[this.dashboardId].cards, card => !card.hidden);\r\n\r\n // Check for cards that are not in users preference -- new cards for the user.\r\n const newDefaultInCards = _.difference(_.map(cardGroup.defaultIn, card =>\r\n card.typeId), _.map(this.prefs.Data[this.dashboardId].cards, card =>\r\n card.id));\r\n\r\n const newDefaultOutCards = _.difference(_.map(cardGroup.defaultOut, card =>\r\n card.typeId), _.map(this.prefs.Data[this.dashboardId].cards, card =>\r\n card.id));\r\n\r\n if (_.size(newDefaultOutCards) !== 0) {\r\n this.set('newDefaultOutCardsAvailable', true);\r\n this.quickInstrumentation('AddNewTilesToOverview', `Adding new default out cards: ${newDefaultOutCards.join(', ')}`);\r\n }\r\n // Add new default-in cards to the collection.\r\n if (_.size(newDefaultInCards) !== 0) {\r\n const newCardConfig = _.chain(cardGroup.defaultIn)\r\n .filter(card => _.indexOf(newDefaultInCards, card.typeId) !== -1)\r\n .map(card => ({\r\n id: card.typeId,\r\n sizeOption: card.sizeOption,\r\n })).value();\r\n\r\n cards = cards.concat(newCardConfig);\r\n this.set('newDefaultInCards', newDefaultInCards);\r\n this.quickInstrumentation('AddNewTilesToOverview', `Adding new default in cards: ${newDefaultInCards.join(', ')}`);\r\n }\r\n\r\n _.each(cards, (card) => {\r\n if (card.sizeOption) {\r\n // If user does not have pref for some size due to new size options. use the one in config\r\n if (_.size(this.config.layoutOptions) !== _.size(card.sizeOption)) {\r\n const cardConfig = _.find(this.cardsConfig, item => item.typeId === card.id);\r\n\r\n _.each(_.keys(cardConfig.sizeOption), (key) => {\r\n if (!card.sizeOption[key]) {\r\n // eslint-disable-next-line no-param-reassign\r\n card.sizeOption[key] = { width: cardConfig.sizeOption[key].width };\r\n savePreference = true;\r\n }\r\n });\r\n }\r\n } else {\r\n // Some old preferences might not contain sizeOptions. Add it if it's missing.\r\n const cardConfig = _.find(this.cardsConfig, item => item.typeId === card.id);\r\n\r\n // eslint-disable-next-line no-param-reassign\r\n card.sizeOption = cardConfig.sizeOption;\r\n savePreference = true;\r\n }\r\n });\r\n\r\n // Update preference if its modified due to new cards or retirement.\r\n savePreference = savePreference ||\r\n _.size(retiredCards) !== 0 ||\r\n _.size(newDefaultInCards) !== 0;\r\n\r\n this.set('cards', cards);\r\n if (savePreference) {\r\n _.defer(() => this.save({\r\n newCards: cards,\r\n newOptions: this.options,\r\n }));\r\n }\r\n } else {\r\n this.quickInstrumentation('FirstUse');\r\n // Add all the default-in cards.\r\n const cardGroup = _.groupBy(\r\n this.cardsConfig,\r\n cardConfig => this.getCardCategory(cardConfig)\r\n );\r\n\r\n const defaultCards = _.map(cardGroup.defaultIn, card => ({\r\n id: card.typeId,\r\n sizeOption: card.sizeOption,\r\n }));\r\n\r\n this.set('cards', defaultCards);\r\n\r\n let newOptions;\r\n\r\n _.defer(() => this.save({\r\n newCards: defaultCards,\r\n newOptions,\r\n }));\r\n }\r\n }\r\n\r\n sync() {\r\n return this.p$Initialized.then(() => this.loadDashboardState());\r\n }\r\n\r\n save({\r\n newCards,\r\n newOptions,\r\n }) {\r\n if (this.isPrefetch || (_.isUndefined(newCards) && _.isUndefined(newOptions))) {\r\n return;\r\n }\r\n\r\n let cards;\r\n\r\n // Do not save card specific prefs for welcome tips.\r\n if (!this.showWelcomeTips) {\r\n if (newCards) {\r\n cards = newCards;\r\n } else {\r\n ({ cards } = this);\r\n }\r\n\r\n if (cards && this.prefs && _.has(this.prefs.Data, this.dashboardId) && _.has(this.prefs.Data[this.dashboardId], 'cards')) {\r\n const hiddenCards = _.difference(\r\n _.map(this.prefs.Data[this.dashboardId].cards, card => card.id),\r\n _.map(cards, card => card.id)\r\n );\r\n\r\n this.set('cards', cards);\r\n if (_.size(hiddenCards) !== 0) {\r\n cards = cards.concat(_.map(hiddenCards, card => ({ id: card, hidden: true })));\r\n }\r\n }\r\n }\r\n\r\n const options = _.extend({}, this.options, newOptions);\r\n\r\n if (!_.isUndefined(options)) {\r\n this.set('options', options);\r\n }\r\n\r\n let data = {};\r\n\r\n if (this.prefs) {\r\n data = _.extend(data, this.prefs.Data);\r\n }\r\n\r\n data = _.extend(data, {\r\n [this.dashboardId]: {\r\n cards,\r\n options,\r\n },\r\n });\r\n\r\n const preference = {\r\n Data: data,\r\n };\r\n\r\n this.setDashBoardPreferences(preference);\r\n\r\n if (this.prefs) {\r\n this.prefs.Data = data;\r\n } else {\r\n this.prefs = preference;\r\n }\r\n }\r\n\r\n getCardAttrByTypeId(id) {\r\n let card;\r\n\r\n if (this.showWelcomeTips) {\r\n card = this.welcomeAttr;\r\n } else {\r\n card = _.find(this.cardsConfig, conf => conf.typeId === id &&\r\n this.cardsConfig.isValidForNavigationLevel(conf, this.navigationLevel, this.campaignType));\r\n }\r\n\r\n if (_.isUndefined(card)) {\r\n return null;\r\n }\r\n const attribute = {};\r\n\r\n // create a deep copy before return\r\n $.extend(true, attribute, _.pick(\r\n card,\r\n ['titleKey', 'addCardTitleKey', 'name', 'contentType', 'constructOptions', 'sizeOption', 'preDefinedMenuItems', 'useNewI18n']\r\n ));\r\n\r\n // If we have size options stored in preference, over write with preference.\r\n const cardPref = _.find(this.cards, item => item.id === id);\r\n\r\n if (cardPref && cardPref.sizeOption) {\r\n _.each(cardPref.sizeOption, (value, key) => {\r\n if (attribute.sizeOption[key]) {\r\n attribute.sizeOption[key].width = value.width;\r\n }\r\n });\r\n }\r\n\r\n return attribute;\r\n }\r\n\r\n getCardCategory(cardConfig) {\r\n if (!this.cardsConfig.isValidForNavigationLevel(\r\n cardConfig,\r\n this.navigationLevel,\r\n this.campaignType\r\n )) {\r\n return 'notEnabledOrValidForNavigationLevel';\r\n } else if (cardConfig.defaultIn) {\r\n return 'defaultIn';\r\n }\r\n return 'defaultOut';\r\n }\r\n\r\n getDashBoardPreferences() {\r\n if (this.navigationLevel === 'customer') {\r\n return this.preferences.findByNameAtUserLevel(this.get('accountsDashboardPrefName'));\r\n }\r\n\r\n return this.preferences.findByNameAtAccountLevel(this.get('dashboardPrefName'));\r\n }\r\n\r\n setDashBoardPreferences(preference) {\r\n if (this.navigationLevel === 'customer') {\r\n this.preferences.setAtUserLevel(_.extend({}, preference, { Name: this.get('accountsDashboardPrefName') }));\r\n } else {\r\n this.preferences.setAtAccountLevel(_.extend({}, preference, { Name: this.get('dashboardPrefName') }));\r\n }\r\n }\r\n\r\n // Getters for the caller's convenience\r\n get cards() {\r\n return this.get('cards');\r\n }\r\n\r\n get options() {\r\n return this.get('options');\r\n }\r\n\r\n get dashboardId() {\r\n return this.get('dashboardId');\r\n }\r\n\r\n get navigationLevel() {\r\n return this.get('navigationLevel');\r\n }\r\n\r\n get newDefaultOutCardsAvailable() {\r\n return this.get('newDefaultOutCardsAvailable');\r\n }\r\n\r\n get newDefaultInCards() {\r\n return this.get('newDefaultInCards');\r\n }\r\n\r\n get defaults() {\r\n return {\r\n dashboardPrefName: 'dashboard/preferences',\r\n accountsDashboardPrefName: 'accountsDashboard/preferences',\r\n userWelcomePrefName: 'doneWithWelcomeTips',\r\n OverviewAsDefaultPrefName: 'OverviewAsDefaultTab',\r\n name: '',\r\n navigationLevel: 'account',\r\n dashboardId: 0,\r\n cards: [],\r\n options: {},\r\n newDefaultOutCardsAvailable: false,\r\n };\r\n }\r\n}\r\n","import Backbone from 'backbone';\r\nimport Promise from 'bluebird';\r\nimport _ from 'underscore';\r\nimport { dateRangeEquals } from '@bingads-webui-universal/primitive-utilities';\r\n\r\n// A wrapper to 'component/state/index'\r\nexport class DateFilterState {\r\n constructor({\r\n simpleFormat = false,\r\n state,\r\n // Note: configure which date picker to connect to, for now\r\n // all the campaign ui features use the global one.\r\n } = {}) {\r\n this.state = state;\r\n _.extend(this, Backbone.Events);\r\n this.previousRange = null;\r\n\r\n this.simpleFormat = simpleFormat;\r\n\r\n if (window.App && window.App.views && window.App.views.Summary) {\r\n window.App.views.Summary.bindDateFilterChangeHandler((e, filter) => {\r\n let dateRange;\r\n\r\n if (this.simpleFormat === true) {\r\n dateRange = _.pick(filter, 'start', 'end', 'grain');\r\n } else {\r\n dateRange = filter;\r\n }\r\n\r\n if (!dateRangeEquals(_.omit(this.previousRange, 'key'), _.omit(dateRange, 'key'))) {\r\n // Raise event and send data out.\r\n this.trigger('changed', { dateRange });\r\n this.previousRange = dateRange;\r\n }\r\n });\r\n }\r\n }\r\n\r\n get p$State() {\r\n return this.state.getPromise('$daterange').then((dateRange) => {\r\n if (!this.previousRange) {\r\n this.previousRange = dateRange;\r\n }\r\n if (this.simpleFormat === true) {\r\n const newRange = _.pick(dateRange, 'start', 'end', 'grain');\r\n\r\n return Promise.resolve(newRange);\r\n }\r\n return Promise.resolve(dateRange);\r\n });\r\n }\r\n}\r\n","import _ from 'underscore';\r\n\r\nconst leftOffsetUINext = 392;\r\nconst leftOffsetMccUINext = 164;\r\nconst dashboardTopUINext = 205;\r\nconst cardMargin = 16;\r\nconst subPageMarginsForUINext = 30;\r\n\r\nexport const newUIWidthPaddingsAndOffSet = 35;\r\n\r\nexport function getViewportCardCount({\r\n config,\r\n cards,\r\n constants,\r\n instrumentation,\r\n isMccLevel,\r\n}) {\r\n // Only one tile available for welcome tips\r\n if (config.defaultName === 'welcome') {\r\n return 1;\r\n }\r\n\r\n const topOffset = dashboardTopUINext;\r\n const leftOffset = isMccLevel ? leftOffsetMccUINext : leftOffsetUINext;\r\n const bottomOffset = 0;\r\n const subPageMargins = subPageMarginsForUINext;\r\n\r\n const availableWidth = window.innerWidth - leftOffset - subPageMargins -\r\n newUIWidthPaddingsAndOffSet;\r\n\r\n // From the error logs we have rare cases where users window.innerWidth returns 0.\r\n // In that case, only preload one tile.\r\n if (availableWidth <= 0) {\r\n return 1;\r\n }\r\n\r\n const layoutOption = _.chain(config.layoutOptions)\r\n .filter(option => option.breakpoint < availableWidth)\r\n .max(option => option.breakpoint)\r\n .value();\r\n const optionKey = _.findKey(config.layoutOptions, option => _.isEqual(option, layoutOption));\r\n const initialRowCount = Math.round((window.innerHeight - topOffset - bottomOffset) /\r\n (layoutOption.defaultHeight + cardMargin));\r\n const rowSize = layoutOption.maxCardSize;\r\n let remainingRowCount = initialRowCount;\r\n let currentRowRemainingSpace = rowSize;\r\n\r\n if (remainingRowCount === 0) {\r\n return 0;\r\n }\r\n\r\n // We have cards with different sizes.\r\n // count how many we can fit in based on space and card size.\r\n try {\r\n for (let index = 0; index < cards.length; index += 1) {\r\n const cardSize = cards[index].sizeOption[optionKey].width;\r\n\r\n if (currentRowRemainingSpace < cardSize) {\r\n remainingRowCount -= 1;\r\n if (remainingRowCount === 0) {\r\n return index;\r\n }\r\n currentRowRemainingSpace = rowSize - cardSize;\r\n } else {\r\n currentRowRemainingSpace -= cardSize;\r\n }\r\n }\r\n } catch (ex) {\r\n const state = {\r\n leftOffset,\r\n innerWidth: window.innerWidth,\r\n initialRowCount,\r\n remainingRowCount,\r\n layoutOptions: config.layoutOptions,\r\n layoutOption,\r\n optionKey,\r\n cards,\r\n };\r\n\r\n instrumentation.logMessage([constants.LOGCATEGORY.ERROR], constants.LOGLEVEL.INFO, 'dashboard/util', `${ex.stack}, ${JSON.stringify(state)}`);\r\n return cards.length;\r\n }\r\n\r\n return cards.length;\r\n}\r\n","export const i18nMappings = [{\r\n CardHolder_Toolbar_Close: _TL_('Hide tile'),\r\n CardHolder_Toolbar_Add: _TL_('Add or remove overview tiles'),\r\n CardHolder_Toolbar_Refresh: _TL_('Refresh'),\r\n CardHolder_Toolbar_Hide: _TL_('Hide tile'),\r\n CardHolder_Toolbar_Help: _TL_('Help'),\r\n CardHolder_Toolbar_Enlarge: _TL_('Enlarge'),\r\n CardHolder_Toolbar_Shrink: _TL_('Shrink'),\r\n CardHolder_Toolbar_SmallSize: _TL_('Tile size: small'),\r\n CardHolder_Toolbar_MediumSize: _TL_('Tile size: medium'),\r\n CardHolder_Toolbar_LargeSize: _TL_('Tile size: large'),\r\n CardHolder_Toolbar_Toggle: _TL_('Toggle'),\r\n Loading: _TL_('Loading...'),\r\n 'More options for {{item}}': _TL_('More options for {{item}}'),\r\n}];\r\n","import Backbone from 'backbone';\r\nimport Promise from 'bluebird';\r\nimport $ from 'jquery';\r\nimport _ from 'underscore';\r\nimport { CardPanel } from '@bingads-webui/card-panel';\r\nimport { PageReady } from '@bingads-webui/page-ready';\r\nimport { ToolbarView } from '@bingads-webui/toolbar';\r\nimport { fetchMCCOverview } from '@bingads-webui-campaign/overview-cards-common';\r\nimport { dismissPopupIfExist } from '@bingads-webui-campaign/fluctuation-common';\r\nimport edm from '@bingads-webui-component-legacy/edm-campaign/index';\r\nimport config from '@bingads-webui-component-legacy/config/index';\r\nimport constants from '@bingads-webui-static-legacy/instrumentation/constants';\r\nimport instrumentation from '@bingads-webui-static-legacy/instrumentation/index';\r\nimport pageContext from '@bingads-webui-static-legacy/page-context';\r\nimport odata from '@bingads-webui-component-legacy/http/channel/odata';\r\nimport preference from '@bingads-webui-component-legacy/preference/service/index';\r\nimport { appendLearnMoreLink } from '@bingads-webui-component-legacy/help/index';\r\nimport state from '@bingads-webui-component-legacy/state/index';\r\nimport wunderbarState from '@bingads-webui-static-legacy/wunderbar/controls/wunderbar-state';\r\nimport instrumentationSettings from '@bingads-webui-static-legacy/instrumentation/campaignSchemaAndSetting';\r\nimport jsdata from '@bingads-webui-component-legacy/js-data-campaign/index';\r\nimport dateUtil from '@bingads-webui-component-legacy/humanize/date';\r\nimport legacyRouter from '@bingads-webui-component-legacy/legacy-router/index';\r\nimport logger from '@bingads-webui-campaign-legacy/instrumentation/index';\r\nimport azureUrlRewrite from '@bingads-webui-static-legacy/app/component/azureUrlRewrite';\r\nimport cacheManager from '@bingads-webui-campaign-legacy/cache-manager/index';\r\nimport eventDispatcher from '@bingads-webui-component-legacy/event-dispatcher/index';\r\nimport { buildLegacyI18n } from '@bingads-webui/build-legacy-i18n';\r\n\r\nimport { getQuickInstrumentation } from '../instrumentation/log-helper';\r\nimport { CardState } from './card-state';\r\nimport template from './dashboard-template.pug';\r\nimport { DateFilterState } from './datefilter-state';\r\nimport footerTemplate from './footer-template.pug';\r\nimport newFeatureTemplate from './new-feature-template.pug';\r\nimport newTileBannerTemplate from './new-tile-banner-template.pug';\r\nimport tooManyAccountTemplate from './too-many-accounts-warning.pug';\r\nimport { getViewportCardCount, newUIWidthPaddingsAndOffSet } from './util';\r\nimport { i18nMappings } from './i18nMappings';\r\n\r\n\r\nconst i18n = window.globalLegacyI18n.get('component/i18n/loader!campaignui/feature/dashboard-page');\r\nconst i18nGlobal = window.globalLegacyI18n.get('component/i18n/loader!legacy/global');\r\nconst preferences = preference;\r\nconst localInstrumentation = logger;\r\n\r\nconst permissions = config.get('Permissions') || {};\r\nconst quickInstrumentation = getQuickInstrumentation({\r\n instrumentationSettings,\r\n instrumentation,\r\n constants,\r\n});\r\n\r\n/* @this Dashboard */\r\nfunction saveSelectedCardsState() {\r\n const orders = _.map(this.cardPanel.cardsOrder, (id) => {\r\n const option = { id: this.cardMaps[id].typeId };\r\n\r\n if (this.cardMaps[id].sizeOption) {\r\n _.extend(option, { sizeOption: this.cardMaps[id].sizeOption });\r\n }\r\n\r\n if (this.cardMaps[id].options) {\r\n _.extend(option, { options: this.cardMaps[id].options });\r\n }\r\n return option;\r\n });\r\n\r\n this.cardState.save({\r\n newCards: orders,\r\n });\r\n}\r\n\r\n/* @this Dashboard */\r\nfunction contentReady(id) {\r\n if (!_.isEmpty(this.remainingViewportCards)) {\r\n this.remainingViewportCards = _.reject(this.remainingViewportCards, card => card === id);\r\n\r\n if (_.isEmpty(this.remainingViewportCards)) {\r\n this.perfMarker.done({ ViewportCardCount: this.viewportCardsCount });\r\n PageReady.pageIsReady(this.pageName);\r\n }\r\n }\r\n}\r\n\r\n/* @this Dashboard */\r\nfunction createCardContentInstance(contentConstructor, attributes) {\r\n let content;\r\n const { name, constructOptions } = attributes;\r\n const otherOptions = _.extend(_.omit(attributes, 'constructOptions', 'name'), {\r\n preexecuteFlag: this.preexecuteFlag,\r\n accountsMode: this.accountsMode,\r\n });\r\n\r\n if (_.isFunction(constructOptions)) {\r\n const cardCreationOptions = constructOptions.call(this, {\r\n navigationLevel: this.navigationLevel,\r\n campaignType: this.campaignType,\r\n });\r\n\r\n // eslint-disable-next-line new-cap\r\n content = new contentConstructor(_.extend(\r\n otherOptions,\r\n { name: `${this.navigationLevel}-${name}`, perfMarker: this.perfMarker }, cardCreationOptions.constructOptions\r\n ));\r\n } else {\r\n // eslint-disable-next-line new-cap\r\n content = new contentConstructor(_.extend(otherOptions, { name: `${this.navigationLevel}-${name}`, perfMarker: this.perfMarker }, constructOptions))\r\n .setState();\r\n }\r\n\r\n content.on('storeCardPreference', (cardOptions = {}) => {\r\n const currentCard = _.find(this.cardMaps, card => card.content === content);\r\n\r\n if (currentCard) {\r\n currentCard.options = cardOptions;\r\n _.defer(saveSelectedCardsState.bind(this));\r\n }\r\n });\r\n\r\n content.on('saveDashBoardOptions', (newOptions) => {\r\n _.defer(() => {\r\n this.cardState.save({ newOptions });\r\n });\r\n });\r\n\r\n content.on('clearDragAndDrop', () => this.cardPanel.clearDragAndDrop());\r\n content.on('setupDragAndDrop', () => this.cardPanel.setupDragAndDrop());\r\n content.on('cardReady', id => contentReady.call(this, id));\r\n\r\n return content;\r\n}\r\n\r\n/* @this Dashboard */\r\nfunction scrollToAddCardView() {\r\n _.defer(() => {\r\n if (this.addCardView &&\r\n this.addCardView.$el &&\r\n this.addCardView.$el[0].getBoundingClientRect().y < 0) {\r\n this.$el.closest('html').animate({ scrollTop: 0 });\r\n }\r\n });\r\n}\r\n\r\n/* @this Dashboard */\r\nfunction showAddCardView({ fromTile = false }) {\r\n eventDispatcher.trigger('overview_loaded');\r\n\r\n if (this.addCardView) {\r\n if (fromTile) {\r\n scrollToAddCardView.call(this);\r\n }\r\n } else {\r\n import(/* webpackMode: 'eager' */'@bingads-webui-campaign-react/panel-decorator').then(({ panelDecorator }) => {\r\n import(/* webpackMode: 'eager' */'./add-card/index').then(({ AddCardView }) => {\r\n const AddCardPanel = panelDecorator(AddCardView, {\r\n width: 940,\r\n panelClassName: 'overview-add-card-panel',\r\n i18n,\r\n panelReadyAriaLabel: i18n.getString('Dashboard add card side panel opened'),\r\n });\r\n const closeAddCardPanel = () => {\r\n this.addCardView.remove();\r\n this.addCardView = null;\r\n };\r\n\r\n this.addCardView = new AddCardPanel({\r\n title: i18n.getString('Dashboard_AddCard'),\r\n selectedCards: _.pluck(this.cardMaps, 'typeId'),\r\n accountsMode: this.accountsMode,\r\n newCardsConfig: this.getCardsConfig,\r\n navigationLevel: this.navigationLevel,\r\n campaignType: this.campaignType,\r\n eventsToActions: [{\r\n event: 'cancel',\r\n action: closeAddCardPanel,\r\n }, {\r\n event: 'apply',\r\n action: ({\r\n idsToAdd,\r\n idsToDelete,\r\n }) => {\r\n this.addCardView.remove();\r\n this.addCardView = null;\r\n\r\n this.addCard(idsToAdd);\r\n this.deleteCard(idsToDelete);\r\n\r\n if (!_.isEmpty(idsToAdd)) {\r\n quickInstrumentation('AddTileToOverviewFromPanel');\r\n }\r\n },\r\n }],\r\n onClose: closeAddCardPanel,\r\n newI18n: this.newI18n,\r\n });\r\n\r\n this.addCardView.render();\r\n });\r\n });\r\n }\r\n}\r\n\r\n/* @this Dashboard */\r\nfunction setUpAgents() {\r\n // Setup date filter service\r\n if (this.dateFilterState) {\r\n this.dateFilter = this.dateFilterState;\r\n } else {\r\n this.dateFilter = new DateFilterState({ state });\r\n }\r\n\r\n this.dateFilter.on('changed', this.onDateFilterStateChanged, this);\r\n\r\n if (this.filterAgent) {\r\n this.filterAgent.on('changed', this.onFilterStateChanged, this);\r\n }\r\n}\r\n\r\n/* @this Dashboard */\r\nfunction updateCardContent({\r\n card,\r\n isInViewPort,\r\n fetchSingleTile = false,\r\n currentCampaign,\r\n onMounted = null,\r\n}) {\r\n const {\r\n name,\r\n contentType,\r\n constructOptions,\r\n } = this.cardState.getCardAttrByTypeId(card.id);\r\n\r\n this.config.getContentConstructor({\r\n contentType,\r\n constants,\r\n instrumentation,\r\n state,\r\n config,\r\n pageContext,\r\n onMounted,\r\n edmCampaign: edm,\r\n }).then(({ contentConstructor, deps }) => {\r\n if (!contentConstructor || this.removed) {\r\n return;\r\n }\r\n\r\n const cardId = _.findKey(this.cardMaps, item => item.typeId === card.id);\r\n const content = createCardContentInstance.call(this, contentConstructor, _.extend({\r\n name,\r\n constructOptions,\r\n fetchSingleTile,\r\n typeId: card.id,\r\n isInViewPort,\r\n container: this.cardPanel.cards[cardId].getContentContainer(),\r\n deps: {\r\n ...deps,\r\n azure: azureUrlRewrite,\r\n localInstrumentation,\r\n cacheManager,\r\n },\r\n sharedOptions: {\r\n getCardsConfig: () => this.cardState.cards,\r\n },\r\n currentCampaign,\r\n scope: this.scope,\r\n newI18n: this.newI18n,\r\n preferenceService: this.preferenceService,\r\n }, this.savedStates, card.options));\r\n\r\n this.cardMaps[cardId].content = content;\r\n this.cardPanel.updateContent(cardId, content);\r\n });\r\n}\r\n\r\nexport class Dashboard extends Backbone.View {\r\n initialize({\r\n perfMarker,\r\n dateFilterState,\r\n filterAgent,\r\n currentCampaign,\r\n newCardsConfig,\r\n welcomeCardsConfig,\r\n pageName,\r\n onMounted,\r\n scope,\r\n accountsMode,\r\n newI18n,\r\n preexecuteFlag = false,\r\n preferenceService,\r\n }) {\r\n this.preferenceService = preferenceService;\r\n this.currentCampaign = currentCampaign;\r\n this.perfMarker = perfMarker;\r\n if (state.get('campaign_id')) {\r\n this.navigationLevel = 'campaign';\r\n } else if (state.get('account_id')) {\r\n this.navigationLevel = 'account';\r\n } else {\r\n this.navigationLevel = 'customer';\r\n }\r\n this.dateFilterState = dateFilterState;\r\n this.filterAgent = filterAgent;\r\n this.pageName = pageName;\r\n this.onMounted = onMounted;\r\n this.scope = scope;\r\n this.newI18n = newI18n;\r\n this.legacyI18n = buildLegacyI18n(this.newI18n, i18nMappings);\r\n this.accountsMode = accountsMode;\r\n this.getCardsConfig = newCardsConfig;\r\n\r\n // Setup card state manager\r\n this.cardState = new CardState({\r\n navigationLevel: this.navigationLevel,\r\n pageContext,\r\n odata,\r\n edm,\r\n preferences,\r\n permissions,\r\n instrumentationSettings,\r\n instrumentation,\r\n constants,\r\n newCardsConfig,\r\n welcomeCardsConfig,\r\n accountsMode,\r\n campaignType: this.campaignType,\r\n });\r\n\r\n // Initial load of the card state (from preference)\r\n this.p$CardState = this.cardState.fetch().then(() => {\r\n // Remember the dashboard ID assigned by CardState\r\n this.dashboardId = this.cardState.get('dashboardId');\r\n });\r\n\r\n // Use this array as a state queue\r\n this.state = [];\r\n this.savedStates = {};\r\n this.dispatched = false;\r\n\r\n this.preexecuteFlag = preexecuteFlag;\r\n }\r\n\r\n get campaignType() {\r\n let campaignType = this.filterAgent && this.filterAgent.campaignType;\r\n if (this.currentCampaign) {\r\n campaignType = _.chain(this.currentCampaign).result('CampaignType').value();\r\n }\r\n return campaignType;\r\n }\r\n\r\n get className() {\r\n return 'dashboard';\r\n }\r\n\r\n get events() {\r\n return {\r\n 'click .dashboard__new-tile-banner a.show-new-tile': this.showNewTile,\r\n 'click .dashboard__new-tile-banner .msg-dismiss-button': this.hideNewTileBannerClicked,\r\n 'click .mcc_too_many-accounts a': this.gotoManagementTab,\r\n };\r\n }\r\n\r\n onDateFilterStateChanged({ dateRange }) {\r\n // Dispatch the new dateRange state to children cards.\r\n this.state.push({ dateRange });\r\n this.dispatchStateAsync();\r\n }\r\n\r\n onFilterStateChanged({ filter, campaignType }) {\r\n this.state.push({ filter, campaignType });\r\n this.dispatchStateAsync();\r\n }\r\n\r\n saveInitialState(initialState) {\r\n this.savedStates = initialState;\r\n }\r\n\r\n dispatchStateAsync() {\r\n // Only async dispatch one time until the sync dispatchment finishes\r\n if (!this.dispatched) {\r\n _.defer(() => {\r\n this.dispatchState();\r\n this.dispatched = false;\r\n });\r\n this.dispatched = true;\r\n }\r\n }\r\n\r\n dispatchState() {\r\n if (this.state.length === 0) {\r\n return;\r\n }\r\n\r\n // Merge the state queue\r\n const states = _.reduce(\r\n this.state,\r\n (memo, item) => _.extend(memo, item)\r\n );\r\n\r\n // dispatch all states to cards\r\n _.each(this.cardMaps, (card) => {\r\n if (card.content) {\r\n card.content.updateState(states);\r\n }\r\n });\r\n\r\n // Save all the states for being used as initial states while adding new cards.\r\n this.savedStates = _.extend(this.savedStates, states);\r\n\r\n // Also add a log\r\n quickInstrumentation(\r\n 'OverviewPageLoadData',\r\n `WithFilter: ${!_.isEmpty(this.savedStates.filter) && !_.isEmpty(this.savedStates.filter.query)}; WithPoP: ${!_.isEmpty(this.savedStates.dateRange) && !_.isEmpty(this.savedStates.dateRange.compared)}`\r\n );\r\n\r\n // Clear the queue\r\n this.state.length = 0;\r\n }\r\n\r\n setupToolbar() {\r\n if (this.config.toolbar) {\r\n // Toolbar could be dynamically created and removed based on current context\r\n if (this.toolbar) {\r\n this.toolbar.remove();\r\n }\r\n\r\n const toolbarItems = _.map(this.config.toolbar.items, item => _.extend(item, {\r\n text: i18n.getString(item.textKey),\r\n }));\r\n\r\n this.toolbar = new ToolbarView({\r\n toolbarId: _.uniqueId('dashboard-toolbar-'),\r\n items: toolbarItems,\r\n }).render();\r\n\r\n // Setup the 'add card' button\r\n this.toolbar.update({\r\n id: this.config.toolbar.ids.addCardButton,\r\n onClick: showAddCardView.bind(this),\r\n iconLeft: ['glyphicon', 'toolbar-icon', 'toolbar-icon-left', 'glyphicon-plus'],\r\n });\r\n\r\n this.$('.dashboard__toolbar').append(this.toolbar.el);\r\n }\r\n }\r\n\r\n setupCardPanel() {\r\n // CardState is already ready.\r\n this.cardAttrsArray = _.map(this.cardState.cards, (card) => {\r\n const {\r\n titleKey,\r\n sizeOption,\r\n preDefinedMenuItems,\r\n useNewI18n,\r\n } = this.cardState.getCardAttrByTypeId(card.id);\r\n let title = '';\r\n if (titleKey) {\r\n title = useNewI18n ? this.newI18n.getString(titleKey) : i18n.getString(titleKey);\r\n }\r\n return {\r\n typeId: card.id,\r\n title,\r\n sizeOption,\r\n options: card.options,\r\n preDefinedMenuItems,\r\n };\r\n });\r\n this.cardPanel = new CardPanel({\r\n config: _.defaults({\r\n dragAndDrop: this.config.defaultDragAndDrop,\r\n debug: this.config.defaultDebug,\r\n dragHandlerSelector: this.config.defaultDragHandlerSelector,\r\n }),\r\n i18n: this.legacyI18n,\r\n layoutOptions: this.config.layoutOptions,\r\n initialWidth: $('.overview-page').innerWidth() - newUIWidthPaddingsAndOffSet,\r\n }).render();\r\n\r\n // Add initial cards to the panel\r\n const orders = this.cardPanel.add(_.map(this.cardAttrsArray, attr => _.chain(attr).pick(['title', 'content', 'sizeOption']).extend({ showMenuIcon: _.size(attr.preDefinedMenuItems) > 0 }).value()), { silent: true });\r\n\r\n // Save the initial order information\r\n this.cardMaps = {};\r\n _.map(orders, (id, index) => {\r\n this.cardMaps[id] = this.cardAttrsArray[index];\r\n }, this);\r\n\r\n // Check how many cards fits in the viewport\r\n this.viewportCardsCount = getViewportCardCount({\r\n config: this.config,\r\n cards: this.cardState.cards,\r\n wunderbarState,\r\n instrumentation,\r\n constants,\r\n isMccLevel: false,\r\n });\r\n this.remainingViewportCards = _.chain(this.cardState.cards)\r\n .first(this.viewportCardsCount)\r\n .pluck('id')\r\n .value();\r\n\r\n if (_.isEmpty(this.remainingViewportCards)) {\r\n this.perfMarker.done({ ViewportCardCount: this.viewportCardsCount });\r\n PageReady.pageIsReady(this.pageName);\r\n }\r\n\r\n if (this.config.defaultName !== 'welcome') {\r\n this.setupFooter();\r\n }\r\n\r\n // Hook the card-panel events\r\n this.cardPanel.on('card-orderchanged', () => {\r\n const originalOrder = _.pluck(this.cardState.cards, 'id');\r\n const newOrder = _.map(this.cardPanel.cardsOrder, id => this.cardMaps[id].typeId);\r\n\r\n quickInstrumentation('ReorderTile', `Original order: ${originalOrder.join(', ')}. New order: ${newOrder.join(', ')}.`);\r\n _.defer(saveSelectedCardsState.bind(this));\r\n this.hideNewTileBanner();\r\n });\r\n\r\n this.cardPanel.on('add-requested', () => {\r\n showAddCardView.call(this, { fromTile: true });\r\n }, this);\r\n\r\n this.cardPanel.on('card-added', (e) => {\r\n const typeIds = _.map(\r\n e.ids,\r\n id => (_.has(this.cardMaps, id) ? this.cardMaps[id].typeId : null)\r\n );\r\n\r\n quickInstrumentation('AddTileToOverview', _.compact(typeIds));\r\n\r\n // Note: do nothing here, adding card is only triggered from dashboard, no need to\r\n // update cardMaps. Save the new card order to preference.\r\n _.defer(saveSelectedCardsState.bind(this));\r\n\r\n this.hideNewTileBanner();\r\n }, this);\r\n\r\n this.cardPanel.on('card-resized', (e) => {\r\n quickInstrumentation('ResizeTile');\r\n\r\n // Card size option should be saved as user preference\r\n if (_.has(this.cardMaps, e.id)) {\r\n this.cardMaps[e.id].sizeOption = this.cardMaps[e.id].sizeOption || {};\r\n this.cardMaps[e.id].sizeOption[e.key] = this.cardMaps[e.id].sizeOption[e.key] || {};\r\n this.cardMaps[e.id].sizeOption[e.key].width = e.width;\r\n\r\n _.defer(saveSelectedCardsState.bind(this));\r\n }\r\n }, this);\r\n\r\n this.cardPanel.on('card-deleted', (e) => {\r\n const typeIds = _.map(e.ids, (id) => {\r\n let typeId = _.has(this.cardMaps, id) ? this.cardMaps[id].typeId : null;\r\n\r\n if (typeId === 'CardType-Tips') {\r\n if (this.navigationLevel === 'account') {\r\n typeId = 'CardType-Tips-And-Recommendations';\r\n } else {\r\n typeId = 'CardType-Recommendations';\r\n }\r\n }\r\n\r\n return typeId;\r\n });\r\n\r\n quickInstrumentation('RemoveTileFromOverview', _.compact(typeIds));\r\n // Card deletion could be triggered from card holder toolbar.\r\n // Remove the entry from local cardMaps first\r\n\r\n _.each(e.ids, (id) => {\r\n if (_.has(this.cardMaps, id)) {\r\n delete this.cardMaps[id];\r\n }\r\n }, this);\r\n\r\n // Save the new card order\r\n _.defer(saveSelectedCardsState.bind(this));\r\n this.hideNewTileBanner();\r\n }, this);\r\n\r\n this.$('.dashboard__card-panel').append(this.cardPanel.$el);\r\n _.defer(() => {\r\n this.cardPanel.trigger('attached');\r\n });\r\n\r\n // Load cards in the viewport.\r\n _.each(_.first(this.cardState.cards, this.viewportCardsCount), (card) => {\r\n updateCardContent.call(this, {\r\n card,\r\n onMounted: this.onMounted,\r\n isInViewPort: true,\r\n currentCampaign: this.currentCampaign,\r\n });\r\n });\r\n\r\n // Function to load cards outside the initial viewport\r\n const loadCardsOutSizeViewPort = _.once(() => {\r\n if (this.removed) {\r\n return;\r\n }\r\n\r\n _.each(\r\n _.last(this.cardState.cards, this.cardState.cards.length - this.viewportCardsCount),\r\n (card) => {\r\n updateCardContent.call(this, {\r\n card,\r\n isInViewPort: false,\r\n currentCampaign: this.currentCampaign,\r\n });\r\n }\r\n );\r\n });\r\n\r\n const dismissOverviewFluctuationPopup = () => dismissPopupIfExist(document.getElementsByClassName('mcc-perf-fluctuation-placeholder'));\r\n PageReady.afterPageReady().then(() => {\r\n if (!this.removed) {\r\n loadCardsOutSizeViewPort.call(this);\r\n _.each(_.keys(this.cardMaps), (key) => {\r\n this.cardPanel.updatePreDefinedMenuItems(key, this.cardMaps[key].preDefinedMenuItems);\r\n });\r\n\r\n const windowScrollLayout = document.querySelector('.app-content-body');\r\n const topChangeCardScrollLayout = document.querySelector('.top-change-grid-container');\r\n\r\n if (windowScrollLayout) {\r\n windowScrollLayout.parentNode.addEventListener('scroll', dismissOverviewFluctuationPopup);\r\n }\r\n\r\n if (topChangeCardScrollLayout) {\r\n topChangeCardScrollLayout.addEventListener('scroll', dismissOverviewFluctuationPopup);\r\n }\r\n }\r\n });\r\n\r\n this.windowEventHandler = () => {\r\n loadCardsOutSizeViewPort.bind(this)();\r\n dismissOverviewFluctuationPopup();\r\n };\r\n window.addEventListener('scroll', this.windowEventHandler);\r\n window.addEventListener('resize', this.windowEventHandler);\r\n $('.overview-page').parent().on('scroll', loadCardsOutSizeViewPort.bind(this));\r\n }\r\n\r\n addCard(typeIds) {\r\n if (!_.isArray(typeIds) || typeIds.length === 0) {\r\n return;\r\n }\r\n\r\n const cardAttrs = _.map(typeIds, (typeId) => {\r\n const {\r\n titleKey,\r\n sizeOption,\r\n preDefinedMenuItems,\r\n } = this.cardState.getCardAttrByTypeId(typeId);\r\n\r\n return {\r\n title: titleKey ? i18n.getString(titleKey) : '',\r\n sizeOption,\r\n preDefinedMenuItems,\r\n };\r\n });\r\n\r\n const cardIds = this.cardPanel.add(cardAttrs);\r\n\r\n _.each(cardIds, (cardId, index) => {\r\n // Keep the card attrs in the map.\r\n this.cardMaps[cardId] = _.extend({}, {\r\n typeId: typeIds[index],\r\n title: cardAttrs[index].title,\r\n sizeOption: cardAttrs[index].sizeOption,\r\n preDefinedMenuItems: cardAttrs[index].preDefinedMenuItems,\r\n });\r\n });\r\n\r\n _.each(typeIds, (typeId) => {\r\n updateCardContent.call(this, {\r\n card: { id: typeId },\r\n isInViewPort: false,\r\n fetchSingleTile: true,\r\n currentCampaign: this.currentCampaign,\r\n });\r\n });\r\n }\r\n\r\n deleteCard(typeIds) {\r\n if (!_.isArray(typeIds) || typeIds.length === 0) {\r\n return;\r\n }\r\n\r\n const cardIds = _.map(\r\n typeIds,\r\n typeId => _.findKey(this.cardMaps, item => item.typeId === typeId)\r\n );\r\n\r\n // card panel will remove the card content view and raise 'card-deleted' event back when done\r\n this.cardPanel.delete(cardIds);\r\n PageReady.pageIsReady(this.pageName);\r\n }\r\n\r\n setupNewTileNotice() {\r\n if (this.cardState.newDefaultOutCardsAvailable) {\r\n this.$(`#${this.config.toolbar.ids.addCardButton}`).append(newFeatureTemplate({ i18n }));\r\n quickInstrumentation('AddNewTilesToOverview', 'New! icon shown in Add Tiles button for new default out cards');\r\n }\r\n if (this.cardState.newDefaultInCards) {\r\n let newTileDesc;\r\n\r\n if (this.cardState.newDefaultInCards.length > 2) {\r\n newTileDesc = i18n.getString('Dashboard_NewTiles', this.cardState.newDefaultInCards.length);\r\n } else if (this.cardState.newDefaultInCards.length === 2) {\r\n const { addCardTitleKey: title1Key } =\r\n this.cardState.getCardAttrByTypeId(this.cardState.newDefaultInCards[0]);\r\n const { addCardTitleKey: title2Key } =\r\n this.cardState.getCardAttrByTypeId(this.cardState.newDefaultInCards[1]);\r\n\r\n newTileDesc = i18n.getString('Dashboard_Two_Tiles', i18n.getString(title1Key), i18n.getString(title2Key));\r\n } else if (this.cardState.newDefaultInCards.length === 1) {\r\n const { addCardTitleKey: titleKey } =\r\n this.cardState.getCardAttrByTypeId(this.cardState.newDefaultInCards[0]);\r\n\r\n newTileDesc = i18n.getString('Dashboard_Tile', i18n.getString(titleKey));\r\n }\r\n\r\n const newTileMsg = i18n.getString('Dashboard_NewTileMsg', newTileDesc);\r\n const newTileBannerContainer = this.$('.dashboard__new-tile-banner');\r\n\r\n newTileBannerContainer.html(newTileBannerTemplate({\r\n i18n,\r\n newTileMsg,\r\n }));\r\n\r\n this.newTileId = _.last(this.cardState.newDefaultInCards);\r\n quickInstrumentation('AddNewTilesToOverview', `Show new tile banner for ${this.cardState.newDefaultInCards.join(', ')}`);\r\n }\r\n }\r\n\r\n setupFooter() {\r\n const timeZoneId = config.get('AccountTimeZone');\r\n const footerContainer = this.$('.summarypage-bifreshtime');\r\n const accountTimeZoneText = i18nGlobal.getString(`TimeZoneId_${timeZoneId}`);\r\n\r\n footerContainer.html(footerTemplate({\r\n i18n,\r\n accountTimeZoneText,\r\n appendLearnMoreLink,\r\n }));\r\n }\r\n\r\n setupTooManyAccountsWarning(dateRange) {\r\n if (this.navigationLevel !== 'customer') {\r\n return;\r\n }\r\n\r\n let tiles;\r\n\r\n if (_.isEmpty(this.cardState.cards)) {\r\n // Corner case if the user removed call tiles.\r\n // If theres no tiles. Add one to get MT response.\r\n tiles = ['Device'];\r\n }\r\n\r\n fetchMCCOverview({\r\n entitySet: edm.currentCustomer.Accounts,\r\n dateRange,\r\n jsdata,\r\n dateUtil,\r\n tiles,\r\n getCardsConfig: () => this.cardState.cards,\r\n instrumentation,\r\n constants,\r\n permissions,\r\n accountsMode: this.accountsMode,\r\n }).then((res) => {\r\n let showTooMuchDataError = false;\r\n if (_.some(res.errors, error => error.Code === 'TooMuchDataToDownload')) {\r\n showTooMuchDataError = true;\r\n }\r\n\r\n if (showTooMuchDataError) {\r\n this.$('.dashboard__new-tile-banner').html('');\r\n this.$('.dashboard__toolbar').html('');\r\n this.$('.dashboard__card-panel').html('');\r\n\r\n const warningContainer = this.$('.mcc_too_many-accounts');\r\n const managementLink = legacyRouter.getRouteUrl('accounts_management');\r\n const linkContent = `${i18n.getString('Dashboard_ManagementTab')}`;\r\n const warning = i18n.getString('Dashboard_TooManyAccounts', linkContent);\r\n\r\n warningContainer.append(tooManyAccountTemplate({ warning }));\r\n PageReady.pageIsReady(this.pageName);\r\n }\r\n });\r\n }\r\n\r\n render() {\r\n this.$el.html(template({}));\r\n\r\n _.delay(() => {\r\n if (!this.removed) {\r\n quickInstrumentation('QualifiedVisitOverviewPageFromCampaign', `QualifiedOverviewPageVisit: ${this.navigationLevel}`);\r\n }\r\n }, 5000);\r\n\r\n this.p$CardState.then(() => {\r\n this.config = this.cardState.config;\r\n\r\n // Setup toolbar\r\n this.setupToolbar();\r\n\r\n if (this.config.defaultName === 'welcome') {\r\n this.setupCardPanel();\r\n // no dragNdrop for welcome tips, which only has one tile, without add/remove.\r\n this.cardPanel.$('.card-holder__toolbar').css('cursor', 'default');\r\n } else {\r\n setUpAgents.call(this);\r\n\r\n // Setup card-panel\r\n this.p$ReadyState = Promise.all([\r\n this.dateFilter.p$State,\r\n ]).spread((dateRange) => {\r\n this.saveInitialState({\r\n dateRange,\r\n filter: this.filterAgent ? this.filterAgent.filter : undefined,\r\n campaignType: this.filterAgent ? this.filterAgent.campaignType : undefined,\r\n });\r\n this.setupCardPanel();\r\n this.setupNewTileNotice();\r\n if (!this.preexecuteFlag) {\r\n this.setupTooManyAccountsWarning(dateRange);\r\n }\r\n });\r\n }\r\n });\r\n\r\n return this;\r\n }\r\n\r\n showNewTile() {\r\n _.find(this.cardMaps, card => card.typeId === this.newTileId).content.el.scrollIntoView({ behavior: 'smooth' });\r\n quickInstrumentation('AddNewTilesToOverview', 'The show me button clicked in new tiles banner');\r\n }\r\n\r\n hideNewTileBanner() {\r\n this.$('.dashboard__new-tile-banner').hide();\r\n }\r\n\r\n hideNewTileBannerClicked() {\r\n this.hideNewTileBanner();\r\n quickInstrumentation('AddNewTilesToOverview', 'The hide banner button clicked in new tiles banner');\r\n }\r\n\r\n gotoManagementTab(event) {\r\n if (event && (event.button !== 0 ||\r\n event.ctrlKey ||\r\n event.shiftKey ||\r\n event.altKey ||\r\n event.metaKey)) {\r\n return true;\r\n }\r\n\r\n legacyRouter.navigateToRoute('accounts_management');\r\n return false;\r\n }\r\n\r\n remove() {\r\n if (this.toolbar) {\r\n this.toolbar.remove();\r\n }\r\n\r\n if (this.addCardView) {\r\n this.addCardView.remove();\r\n }\r\n\r\n if (this.cardPanel) {\r\n this.cardPanel.remove();\r\n }\r\n\r\n if (this.windowEventHandler) {\r\n window.removeEventListener('scroll', this.windowEventHandler);\r\n window.removeEventListener('resize', this.windowEventHandler);\r\n }\r\n\r\n this.removed = true;\r\n\r\n super.remove();\r\n }\r\n}\r\n","import Backbone from 'backbone';\r\nimport { dashboardConfig } from '../config/dashboard-config';\r\nimport { Dashboard } from '../dashboard/dashboard-view';\r\nimport template from './dashboard-page-template.pug';\r\n\r\nexport class DashboardPage extends Backbone.View {\r\n initialize({\r\n perfMarker,\r\n dateFilterState,\r\n filterAgent,\r\n currentCampaign,\r\n newCardsConfig = null,\r\n welcomeCardsConfig,\r\n pageName,\r\n onMounted = null,\r\n scope,\r\n accountsMode,\r\n newI18n,\r\n preexecuteFlag = false,\r\n preferenceService,\r\n }) {\r\n this.perfMarker = perfMarker;\r\n this.dateFilterState = dateFilterState;\r\n this.filterAgent = filterAgent;\r\n this.currentCampaign = currentCampaign;\r\n this.pageName = pageName;\r\n this.perfMarker.willInit();\r\n this.newCardsConfig = newCardsConfig;\r\n this.welcomeCardsConfig = welcomeCardsConfig;\r\n this.onMounted = onMounted;\r\n this.scope = scope;\r\n this.preexecuteFlag = preexecuteFlag;\r\n this.accountsMode = accountsMode;\r\n this.newI18n = newI18n;\r\n this.preferenceService = preferenceService;\r\n this.createDashboard();\r\n }\r\n\r\n createDashboard() {\r\n this.dashboard = new Dashboard({\r\n name: dashboardConfig.defaultName,\r\n perfMarker: this.perfMarker,\r\n dateFilterState: this.dateFilterState,\r\n filterAgent: this.filterAgent,\r\n currentCampaign: this.currentCampaign,\r\n newCardsConfig: this.newCardsConfig,\r\n welcomeCardsConfig: this.welcomeCardsConfig,\r\n pageName: this.pageName,\r\n onMounted: this.onMounted,\r\n scope: this.scope,\r\n accountsMode: this.accountsMode,\r\n newI18n: this.newI18n,\r\n preexecuteFlag: this.preexecuteFlag,\r\n preferenceService: this.preferenceService,\r\n });\r\n }\r\n\r\n recreateView() {\r\n if (!this.isRemoved) {\r\n this.dashboard.remove();\r\n this.createDashboard();\r\n this.$el.html(template());\r\n\r\n this.$el.append(this.dashboard.$el);\r\n this.dashboard.render();\r\n }\r\n }\r\n\r\n updateScope() {\r\n this.recreateView();\r\n }\r\n\r\n updateMode({ accountsMode }) {\r\n this.accountsMode = accountsMode;\r\n this.recreateView();\r\n }\r\n\r\n render() {\r\n this.perfMarker.willRender();\r\n\r\n\r\n this.$el.html(template());\r\n\r\n this.$el.append(this.dashboard.$el);\r\n this.dashboard.render();\r\n\r\n return this;\r\n }\r\n\r\n remove() {\r\n this.dashboard.remove();\r\n this.$el.remove();\r\n this.isRemoved = true;\r\n }\r\n}\r\n","import _ from 'underscore';\r\n\r\nexport function getQuickInstrumentation({\r\n instrumentationSettings,\r\n constants,\r\n instrumentation,\r\n}) {\r\n const localScenarioMap = {\r\n LoadOverviewPage: {\r\n scenario: instrumentationSettings.SCENARIONAME.LoadOverviewPage,\r\n activity: instrumentationSettings.ACTIVITYNAME.LoadOverviewPage,\r\n },\r\n QualifiedVisitOverviewPageFromCampaign: {\r\n scenario: instrumentationSettings.SCENARIONAME.QualifiedVisitOverviewPageFromCampaign,\r\n activity: instrumentationSettings.ACTIVITYNAME.QualifiedVisitOverviewPageFromCampaign,\r\n },\r\n SetOverviewPageAsDefault: {\r\n scenario: instrumentationSettings.SCENARIONAME.SetOverviewPageAsDefault,\r\n activity: instrumentationSettings.ACTIVITYNAME.SetOverviewPageAsDefault,\r\n },\r\n AddTileToOverview: {\r\n scenario: instrumentationSettings.SCENARIONAME.AddTileToOverview,\r\n activity: instrumentationSettings.ACTIVITYNAME.AddTileToOverview,\r\n },\r\n AddTileToOverviewFromPanel: {\r\n scenario: instrumentationSettings.SCENARIONAME.AddTileToOverviewFromPanel,\r\n activity: instrumentationSettings.ACTIVITYNAME.AddTileToOverviewFromPanel,\r\n },\r\n RemoveTileFromOverview: {\r\n scenario: instrumentationSettings.SCENARIONAME.RemoveTileFromOverview,\r\n activity: instrumentationSettings.ACTIVITYNAME.RemoveTileFromOverview,\r\n },\r\n ReorderTile: {\r\n scenario: instrumentationSettings.SCENARIONAME.ReorderTile,\r\n activity: instrumentationSettings.ACTIVITYNAME.ReorderTile,\r\n },\r\n ResizeTile: {\r\n scenario: instrumentationSettings.SCENARIONAME.ResizeTile,\r\n activity: instrumentationSettings.ACTIVITYNAME.ResizeTile,\r\n },\r\n FirstUse: {\r\n scenario: instrumentationSettings.SCENARIONAME.FirstUse,\r\n activity: instrumentationSettings.ACTIVITYNAME.FirstUse,\r\n },\r\n RemoveRetiredTilesFromOverview: {\r\n scenario: instrumentationSettings.SCENARIONAME.RemoveRetiredTilesFromOverview,\r\n activity: instrumentationSettings.ACTIVITYNAME.RemoveRetiredTilesFromOverview,\r\n },\r\n AddNewTilesToOverview: {\r\n scenario: instrumentationSettings.SCENARIONAME.AddNewTilesToOverview,\r\n activity: instrumentationSettings.ACTIVITYNAME.AddNewTilesToOverview,\r\n },\r\n OverviewPageLoadData: {\r\n scenario: instrumentationSettings.SCENARIONAME.OverviewPageLoadData,\r\n activity: instrumentationSettings.ACTIVITYNAME.OverviewPageLoadData,\r\n },\r\n };\r\n\r\n return function quickInstrumentation(name, msgs = []) {\r\n instrumentation.startScenario(localScenarioMap[name].scenario);\r\n instrumentation.startActivity(localScenarioMap[name].activity);\r\n if (_.isArray(msgs)) {\r\n if (_.size(msgs) > 0) {\r\n _.each(msgs, msg => instrumentation.logMessage([constants.LOGCATEGORY.TRACE], constants.LOGLEVEL.INFO, 'overview', msg));\r\n }\r\n } else if (msgs) {\r\n instrumentation.logMessage([constants.LOGCATEGORY.TRACE], constants.LOGLEVEL.INFO, 'overview', msgs);\r\n }\r\n };\r\n}\r\n","\r\nconst i18n = window.globalLegacyI18n.get('@bingads-webui/i18n-amd-loader!campaignui/feature/dashboard-cards');\r\n\r\nexport const tipNames = {\r\n importHelp: 'importHelp',\r\n importVideo: 'importVideo',\r\n broadMatchVideo: 'broadMatchVideo',\r\n extaVideo: 'extaVideo',\r\n extaHelp1: 'extaHelp1',\r\n extaHelp2: 'extaHelp2',\r\n sitelinksMktg: 'sitelinksMktg',\r\n sitelinksHelp: 'sitelinksHelp',\r\n calloutsMktg: 'calloutsMktg',\r\n calloutsHelp: 'calloutsHelp',\r\n structSnipHelp: 'structSnipHelp',\r\n structSnipMktg: 'structSnipMktg',\r\n dsa: 'dsa',\r\n conversionTrackingVideo: 'conversionTrackingVideo',\r\n remarketingTour: 'remarketingTour',\r\n remarketingHelp1: 'remarketingHelp1',\r\n remarketingVideo: 'remarketingVideo',\r\n remarketingHelp2: 'remarketingHelp2',\r\n autoBidHelp: 'autoBidHelp',\r\n autoBidMktg: 'autoBidMktg',\r\n sharedBudgetsHelp: 'sharedBudgetsHelp',\r\n callMktg: 'callMktg',\r\n callHelp: 'callHelp',\r\n reviewsMktg: 'reviewsMktg',\r\n reviewsHelp: 'reviewsHelp',\r\n kWMatchTypeHelp: 'kWMatchTypeHelp',\r\n kWMatchTypeMktg: 'kWMatchTypeMktg',\r\n negKWHelp1: 'negKWHelp1',\r\n negKWHelp2: 'negKWHelp2',\r\n broadMatchHelp: 'broadMatchHelp',\r\n ScheduledImportHelp: 'ScheduledImportHelp',\r\n ReImportRSACampaigns: 'ReImportRSACampaigns',\r\n IncludeRSACampaigns: 'IncludeRSACampaigns',\r\n IncludeMultiAccountGoogleImport: 'IncludeMultiAccountGoogleImport',\r\n ProvideStoreToImportShoppingCampaign: 'ProvideStoreToImportShoppingCampaign',\r\n SelectAdCusFeedToImportEXTA: 'SelectAdCusFeedToImportEXTA',\r\n FacebookImport: 'FacebookImport',\r\n UETCombineClarity: 'UETCombineClarity',\r\n};\r\n\r\nexport const tipsConfig = {\r\n 101: {\r\n tipName: tipNames.importHelp,\r\n title: i18n.getString('Dashboard_TipCard_Import_Help_Title'),\r\n description: i18n.getString('Dashboard_TipCard_Import_Help_Desc'),\r\n helpLink: 'app54577',\r\n helpType: 'side_pane',\r\n imgClass: 'import_tip_img',\r\n isImportRelatedTip: true,\r\n },\r\n 102: {\r\n tipName: tipNames.importVideo,\r\n title: i18n.getString('Dashboard_TipCard_Import_Video_Title'),\r\n description: i18n.getString('Dashboard_TipCard_Import_Video_Desc'),\r\n helpLink: '1xyCD6fbf70',\r\n helpType: 'video',\r\n imgClass: 'import_tip_img',\r\n isImportRelatedTip: true,\r\n },\r\n 202: {\r\n tipName: tipNames.broadMatchVideo,\r\n title: i18n.getString('Dashboard_TipCard_BroadMatch_Video_Title'),\r\n description: i18n.getString('Dashboard_TipCard_BroadMatch_Video_Desc'),\r\n helpLink: 'rYoAn-lZdJs',\r\n helpType: 'video',\r\n imgClass: 'broadMatch_tip_img',\r\n },\r\n // video no longer available on youtube\r\n /*\r\n 301: {\r\n tipName: tipNames.extaVideo,\r\n title: i18n.getString('Dashboard_TipCard_EXTA_Video_Title'),\r\n description: i18n.getString('Dashboard_TipCard_EXTA_Video_Desc'),\r\n helpLink: 'YJCaOCLfWms',\r\n helpType: 'video',\r\n imgClass: 'exta_tip_img',\r\n },\r\n */\r\n 302: {\r\n tipName: tipNames.extaHelp1,\r\n title: i18n.getString('Dashboard_TipCard_EXTA_Help1_Title'),\r\n description: i18n.getString('Dashboard_TipCard_EXTA_Help1_Desc'),\r\n helpLink: 'app54589',\r\n helpType: 'side_pane',\r\n imgClass: 'exta_tip_img',\r\n },\r\n 303: {\r\n tipName: tipNames.extaHelp2,\r\n title: i18n.getString('Dashboard_TipCard_EXTA_Help2_Title'),\r\n description: i18n.getString('Dashboard_TipCard_EXTA_Help2_Desc'),\r\n helpLink: 'app54589',\r\n helpType: 'side_pane',\r\n imgClass: 'exta_tip_img',\r\n },\r\n 401: {\r\n tipName: tipNames.sitelinksMktg,\r\n title: i18n.getString('Dashboard_TipCard_Sitelinks_Mktg_Title'),\r\n description: i18n.getString('Dashboard_TipCard_Sitelinks_Mktg_Desc'),\r\n helpLink: 'https://advertise.bingads.microsoft.com/en-us/solutions/ad-extensions/sitelink-extensions',\r\n helpType: 'new_page',\r\n imgClass: 'sitelinks_tip_img',\r\n },\r\n 402: {\r\n tipName: tipNames.sitelinksHelp,\r\n title: i18n.getString('Dashboard_TipCard_Sitelinks_Help_Title'),\r\n description: i18n.getString('Dashboard_TipCard_Sitelinks_Help_Desc'),\r\n helpLink: 'app54652',\r\n helpType: 'side_pane',\r\n imgClass: 'sitelinks_tip_img',\r\n },\r\n 501: {\r\n tipName: tipNames.calloutsMktg,\r\n title: i18n.getString('Dashboard_TipCard_Callouts_Mktg_Title'),\r\n description: i18n.getString('Dashboard_TipCard_Callouts_Mktg_Desc'),\r\n helpLink: 'https://advertise.bingads.microsoft.com/en-us/solutions/ad-extensions/callout-extensions',\r\n helpType: 'new_page',\r\n imgClass: 'callouts_tip_img',\r\n },\r\n 502: {\r\n tipName: tipNames.calloutsHelp,\r\n title: i18n.getString('Dashboard_TipCard_Callouts_Help_Title'),\r\n description: i18n.getString('Dashboard_TipCard_Callouts_Help_Desc'),\r\n helpLink: 'app54575',\r\n helpType: 'side_pane',\r\n imgClass: 'callouts_tip_img',\r\n },\r\n 601: {\r\n tipName: tipNames.structSnipHelp,\r\n title: i18n.getString('Dashboard_TipCard_StructSnip_Help_Title'),\r\n description: i18n.getString('Dashboard_TipCard_StructSnip_Help_Desc'),\r\n helpLink: 'app54578',\r\n helpType: 'side_pane',\r\n imgClass: 'structSnip_tip_img',\r\n },\r\n 602: {\r\n tipName: tipNames.structSnipMktg,\r\n title: i18n.getString('Dashboard_TipCard_StructSnip_Mktg_Title'),\r\n description: i18n.getString('Dashboard_TipCard_StructSnip_Mktg_Desc'),\r\n helpLink: 'https://advertise.bingads.microsoft.com/en-us/blog/post/september-2016/new!-easily-highlight-your-products-and-services-with-structured-snippets',\r\n helpType: 'new_page',\r\n imgClass: 'structSnip_tip_img',\r\n },\r\n 701: {\r\n tipName: tipNames.dsa,\r\n title: i18n.getString('Dashboard_TipCard_DSA_Help_Title'),\r\n description: i18n.getString('Dashboard_TipCard_DSA_Help_Desc'),\r\n helpLink: 'app54588',\r\n helpType: 'side_pane',\r\n imgClass: 'dsa_tip_img',\r\n },\r\n 801: {\r\n tipName: tipNames.conversionTrackingVideo,\r\n title: i18n.getString('Dashboard_TipCard_ConversionTracking_Video_Title'),\r\n description: i18n.getString('Dashboard_TipCard_ConversionTracking_Video_Desc'),\r\n helpLink: 'IQbuhowpV3c',\r\n helpType: 'video',\r\n imgClass: 'conversionTracking_tip_img',\r\n },\r\n 901: {\r\n tipName: tipNames.remarketingTour,\r\n title: i18n.getString('Dashboard_TipCard_Remarketing_Tour_Title'),\r\n description: i18n.getString('Dashboard_TipCard_Remarketing_Tour_Desc'),\r\n helpLink: 144778,\r\n helpType: 'tour',\r\n imgClass: 'remarketing_tip_img',\r\n },\r\n 902: {\r\n tipName: tipNames.remarketingHelp1,\r\n title: i18n.getString('Dashboard_TipCard_Remarketing_Help1_Title'),\r\n description: i18n.getString('Dashboard_TipCard_Remarketing_Help1_Desc'),\r\n helpLink: 'app54581',\r\n helpType: 'side_pane',\r\n imgClass: 'remarketing_tip_img',\r\n },\r\n 903: {\r\n tipName: tipNames.remarketingVideo,\r\n title: i18n.getString('Dashboard_TipCard_Remarketing_Video_Title'),\r\n description: i18n.getString('Dashboard_TipCard_Remarketing_Video_Desc'),\r\n helpLink: 'PZZvA-X04-8',\r\n helpType: 'video',\r\n imgClass: 'remarketing_tip_img',\r\n },\r\n 904: {\r\n tipName: tipNames.remarketingHelp2,\r\n title: i18n.getString('Dashboard_TipCard_Remarketing_Help2_Title'),\r\n description: i18n.getString('Dashboard_TipCard_Remarketing_Help2_Desc'),\r\n helpLink: 'app54582',\r\n helpType: 'side_pane',\r\n imgClass: 'remarketing_tip_img',\r\n },\r\n 1001: {\r\n tipName: tipNames.autoBidHelp,\r\n title: i18n.getString('Dashboard_TipCard_AutoBid_Help_Title'),\r\n description: i18n.getString('Dashboard_TipCard_AutoBid_Help_Desc'),\r\n helpLink: 'app54580',\r\n helpType: 'side_pane',\r\n imgClass: 'autoBid_tip_img',\r\n },\r\n 1002: {\r\n tipName: tipNames.autoBidMktg,\r\n title: i18n.getString('Dashboard_TipCard_AutoBid_Mktg_Title'),\r\n description: i18n.getString('Dashboard_TipCard_AutoBid_Mktg_Desc'),\r\n helpLink: 'https://advertise.bingads.microsoft.com/en-us/blog/post/august-2016/get-more-conversions-with-the-new-enhanced-cpc-bid-strategy',\r\n helpType: 'new_page',\r\n imgClass: 'autoBid_tip_img',\r\n },\r\n 1101: {\r\n tipName: tipNames.sharedBudgetsHelp,\r\n title: i18n.getString('Dashboard_TipCard_SharedBudgets_Help_Title'),\r\n description: i18n.getString('Dashboard_TipCard_SharedBudgets_Help_Desc'),\r\n helpLink: 'app54584',\r\n helpType: 'side_pane',\r\n imgClass: 'sharedBudgets_tip_img',\r\n },\r\n 1201: {\r\n tipName: tipNames.callMktg,\r\n title: i18n.getString('Dashboard_TipCard_Call_Mktg_Title'),\r\n description: i18n.getString('Dashboard_TipCard_Call_Mktg_Desc'),\r\n helpLink: 'https://advertise.bingads.microsoft.com/en-us/solutions/ad-extensions/call-extensions',\r\n helpType: 'new_page',\r\n imgClass: 'call_tip_img',\r\n },\r\n 1202: {\r\n tipName: tipNames.callHelp,\r\n title: i18n.getString('Dashboard_TipCard_Call_Help_Title'),\r\n description: i18n.getString('Dashboard_TipCard_Call_Help_Desc'),\r\n helpLink: 'app54576',\r\n helpType: 'side_pane',\r\n imgClass: 'call_tip_img',\r\n },\r\n 1301: {\r\n tipName: tipNames.reviewsMktg,\r\n title: i18n.getString('Dashboard_TipCard_Reviews_Mktg_Title'),\r\n description: i18n.getString('Dashboard_TipCard_Reviews_Mktg_Desc'),\r\n helpLink: 'https://advertise.bingads.microsoft.com/en-us/solutions/ad-extensions/review-extensions',\r\n helpType: 'new_page',\r\n imgClass: 'reviews_tip_img',\r\n },\r\n 1302: {\r\n tipName: tipNames.reviewsHelp,\r\n title: i18n.getString('Dashboard_TipCard_Reviews_Help_Title'),\r\n description: i18n.getString('Dashboard_TipCard_Reviews_Help_Desc'),\r\n helpLink: 'app54579',\r\n helpType: 'side_pane',\r\n imgClass: 'reviews_tip_img',\r\n },\r\n 1401: {\r\n tipName: tipNames.kWMatchTypeHelp,\r\n title: i18n.getString('Dashboard_TipCard_KWMatchType_Help_Title'),\r\n description: i18n.getString('Dashboard_TipCard_KWMatchType_Help_Desc'),\r\n helpLink: 'app54583',\r\n helpType: 'side_pane',\r\n imgClass: 'kWMatchType_tip_img',\r\n },\r\n 1402: {\r\n tipName: tipNames.kWMatchTypeMktg,\r\n title: i18n.getString('Dashboard_TipCard_KWMatchType_Mktg_Title'),\r\n description: i18n.getString('Dashboard_TipCard_KWMatchType_Mktg_Desc'),\r\n helpLink: 'https://advertise.bingads.microsoft.com/en-us/resources/training/keyword-match-options',\r\n helpType: 'new_page',\r\n imgClass: 'kWMatchType_tip_img',\r\n },\r\n 1501: {\r\n tipName: tipNames.negKWHelp1,\r\n title: i18n.getString('Dashboard_TipCard_NegKW_Help1_Title'),\r\n description: i18n.getString('Dashboard_TipCard_NegKW_Help1_Desc'),\r\n helpLink: 'app54586',\r\n helpType: 'side_pane',\r\n imgClass: 'negKW_tip_img',\r\n },\r\n 1502: {\r\n tipName: tipNames.negKWHelp2,\r\n title: i18n.getString('Dashboard_TipCard_NegKW_Help2_Title'),\r\n description: i18n.getString('Dashboard_TipCard_NegKW_Help2_Desc'),\r\n helpLink: 'app54587',\r\n helpType: 'side_pane',\r\n imgClass: 'negKW_tip_img',\r\n },\r\n 1601: {\r\n tipName: tipNames.broadMatchHelp,\r\n title: i18n.getString('Dashboard_TipCard_BroadMatch_Help_Title'),\r\n description: i18n.getString('Dashboard_TipCard_BroadMatch_Help_Desc'),\r\n helpLink: 'app54583',\r\n helpType: 'side_pane',\r\n imgClass: 'broadMatch_tip_img',\r\n },\r\n 1701: {\r\n tipName: tipNames.ScheduledImportHelp,\r\n title: i18n.getString('Dashboard_TipCard_ScheduledImport_Help_Title'),\r\n description: i18n.getString('Dashboard_TipCard_ScheduledImport_Help_Desc'),\r\n helpLink: 'app54497',\r\n helpType: 'side_pane',\r\n imgClass: 'import_tip_img',\r\n isImportRelatedTip: true,\r\n },\r\n 1801: {\r\n tipName: tipNames.ReImportRSACampaigns,\r\n title: i18n.getString('Dashboard_TipCard_RSA_Import_Help1_Title'),\r\n description: i18n.getString('Dashboard_TipCard_RSA_Import_Help1_Desc'),\r\n helpLink: 'app54667',\r\n helpType: 'side_pane',\r\n imgClass: 'import_tip_img',\r\n isImportRelatedTip: true,\r\n },\r\n 1901: {\r\n tipName: tipNames.IncludeRSACampaigns,\r\n title: i18n.getString('Dashboard_TipCard_RSA_Import_Help2_Title'),\r\n description: i18n.getString('Dashboard_TipCard_RSA_Import_Help2_Desc'),\r\n helpLink: 'app54667',\r\n helpType: 'side_pane',\r\n imgClass: 'import_tip_img',\r\n isImportRelatedTip: true,\r\n },\r\n 2001: {\r\n tipName: tipNames.IncludeMultiAccountGoogleImport,\r\n title: i18n.getString('Dashboard_TipCard_Multi_Account_Import_Help1_Title'),\r\n description: i18n.getString('Dashboard_TipCard_Multi_Account_Import_Help1_Desc'),\r\n helpLink: 'app54577',\r\n helpType: 'side_pane',\r\n imgClass: 'import_tip_img',\r\n isImportRelatedTip: true,\r\n },\r\n 2101: {\r\n tipName: tipNames.ProvideStoreToImportShoppingCampaign,\r\n title: i18n.getString('Dashboard_TipCard_Provide_Store_To_Import_Shopping_Campaign_Help_Title'),\r\n description: i18n.getString('Dashboard_TipCard_Provide_Store_To_Import_Shopping_Campaign_Help_Desc'),\r\n helpLink: 'app51001',\r\n helpType: 'side_pane',\r\n imgClass: 'import_tip_img',\r\n isImportRelatedTip: true,\r\n },\r\n 2201: {\r\n tipName: tipNames.SelectAdCusFeedToImportEXTA,\r\n title: i18n.getString('Dashboard_TipCard_Select_AdCusFeed_To_Import_EXTA_Help_Title'),\r\n description: i18n.getString('Dashboard_TipCard_Select_AdCusFeed_To_Import_EXTA_Help_Desc'),\r\n helpLink: 'app54730',\r\n helpType: 'side_pane',\r\n imgClass: 'import_tip_img',\r\n isImportRelatedTip: true,\r\n },\r\n 2301: {\r\n tipName: tipNames.FacebookImport,\r\n title: i18n.getString('Dashboard_TipCard_FB_Import_Help_Title'),\r\n description: i18n.getString('Dashboard_TipCard_FB_Import_Help_Desc'),\r\n helpLink: 'app54769',\r\n helpType: 'side_pane',\r\n imgClass: 'import_tip_img',\r\n isImportRelatedTip: true,\r\n },\r\n 2401: {\r\n tipName: tipNames.UETCombineClarity,\r\n title: i18n.getString('Dashboard_TipCard_UETCombineClarity_Help_Title'),\r\n description: i18n.getString('Dashboard_TipCard_UETCombineClarity_Help_Desc'),\r\n helpLink: 'https://help.ads-int.microsoft.com/#apex/3/en/60110/-1/en/#ext:Default',\r\n helpType: 'new_page',\r\n imgClass: 'conversionTracking_tip_img',\r\n },\r\n};\r\n","import _ from 'underscore';\r\nimport { DeterministicView } from '@bingads-webui/deterministic-view';\r\nimport {\r\n entityHash,\r\n navigateToEntity,\r\n getEntityIds,\r\n coerceStatus,\r\n topChangesGridTemplate,\r\n getInsightsMetric,\r\n} from '@bingads-webui-campaign/overview-cards-common';\r\nimport { Constants } from '@bingads-webui-clientcenter/entity-utils';\r\nimport { createElementBasedFluctuationPopupFactory } from '@bingads-webui-campaign-react/fluctuation-popup';\r\n\r\n/* @this TopChangeGrid */\r\nfunction processGridData({\r\n metric,\r\n data,\r\n entitySet,\r\n}) {\r\n const {\r\n pageContext,\r\n legacyRouter,\r\n metricFormatter,\r\n i18n,\r\n instrumentation,\r\n constants,\r\n } = this.deps;\r\n\r\n\r\n if (data === undefined || data === null) {\r\n return undefined;\r\n } else if (_.size(data) === 0) {\r\n return [];\r\n }\r\n\r\n _.each(data, (entity) => {\r\n if (!entity.PerformanceMetricsChange) {\r\n instrumentation.logMessage([constants.LOGCATEGORY.ERROR], constants.LOGLEVEL.INFO, 'top-changes-card', JSON.stringify(entity));\r\n }\r\n });\r\n\r\n const maxChange = Math.abs(_.max(data, ({\r\n PerformanceMetricsChange: { [metric]: value },\r\n }) => Math.abs(value)).PerformanceMetricsChange[metric]);\r\n\r\n return _.map(data, (entity) => {\r\n const formattedPeriodMetrics = metricFormatter.formatMetric(\r\n metric,\r\n entity.PeriodPerformanceMetrics[metric],\r\n { currency: entity.Currency }\r\n );\r\n const formattedMetrics = metricFormatter.formatMetric(\r\n metric,\r\n entity.PerformanceMetrics[metric],\r\n { currency: entity.Currency }\r\n );\r\n const value = entity.PerformanceMetricsChange[metric];\r\n let declineBar = 0;\r\n let declineSpace = 100;\r\n let increaseBar = 0;\r\n let increaseSpace = 100;\r\n\r\n if (maxChange !== 0) {\r\n if (value < 0) {\r\n declineBar = Math.ceil(-(value * 100) / maxChange);\r\n declineSpace = 100 - declineBar;\r\n } else {\r\n increaseBar = Math.ceil((value * 100) / maxChange);\r\n increaseSpace = 100 - increaseBar;\r\n }\r\n }\r\n\r\n const typeName = entitySet.type.elementType.shortName;\r\n const { campaignId, adgroupId, accountId } = getEntityIds({\r\n typeName,\r\n id: entity.Id,\r\n entitySet,\r\n });\r\n\r\n let isExperiment;\r\n\r\n if (typeName === 'Campaign') {\r\n isExperiment = !!entity.ExperimentId;\r\n } else if (typeName === 'AdGroup') {\r\n isExperiment = !!entity.Campaign.ExperimentId;\r\n }\r\n\r\n const fluctuationTypeIds = getInsightsMetric(entity.AvailableInsightTypeIds, metric);\r\n\r\n return {\r\n name: entity.Name,\r\n status: coerceStatus(entity.Status, entity.AccountInactiveReasons),\r\n value,\r\n formattedValue: metricFormatter.formatMetricWithSign(\r\n metric,\r\n entity.PerformanceMetricsChange[metric],\r\n { currency: entity.Currency }\r\n ),\r\n formattedPercentageValue: metricFormatter\r\n .formatChangePercentageWithSign(entity.PerformanceMetricsChangePercentage[metric]),\r\n fromTo: i18n.getString('Dashboard_Cards_FromTo', { fromValue: formattedPeriodMetrics, toValue: formattedMetrics }),\r\n hash: entityHash({\r\n typeName,\r\n id: entity.Id,\r\n isSmartCampaign: entity.CampaignType && entity.CampaignType === 'Smart',\r\n entitySet,\r\n pageContext,\r\n legacyRouter,\r\n status: entity.Status,\r\n }),\r\n campaignType: entity.CampaignType,\r\n campaignId,\r\n adgroupId,\r\n accountId,\r\n typeName,\r\n formattedMetrics,\r\n formattedPeriodMetrics,\r\n declineBar,\r\n declineSpace,\r\n increaseBar,\r\n increaseSpace,\r\n isExperiment,\r\n rawStatus: entity.Status,\r\n fluctuationTypeIds,\r\n };\r\n });\r\n}\r\n\r\nexport default class TopChangeGrid extends DeterministicView {\r\n constructor(options) {\r\n super(_.extend({}, options, { renderInSync: true }));\r\n }\r\n\r\n initialize({\r\n deps,\r\n perfMarker,\r\n }) {\r\n this.deps = deps;\r\n this.perfMarker = perfMarker;\r\n }\r\n\r\n get className() {\r\n return 'top-change-grid-container';\r\n }\r\n\r\n get events() {\r\n const { pageContext, legacyRouter, createEditableFilterStorage } = this.deps;\r\n\r\n return {\r\n 'click .top-change-entity-name a': event => navigateToEntity({\r\n event,\r\n pageContext,\r\n legacyRouter,\r\n createEditableFilterStorage,\r\n cardType: 'top-changes-card',\r\n instrumentation: this.deps.instrumentation,\r\n constants: this.deps.constants,\r\n }),\r\n 'click .mcc-perf-fluctuation-bulb': event => this.showFluctuationPopup(event),\r\n 'keypress .mcc-perf-fluctuation-bulb': event => this.showFluctuationPopup(event),\r\n };\r\n }\r\n\r\n showFluctuationPopup(e) {\r\n const triggerButton = e.currentTarget;\r\n const placeholder = e.currentTarget.nextSibling;\r\n const dataSet = e.currentTarget.dataset;\r\n const {\r\n fluxtypeids = [], metricname, metrictext, cmid, aid,\r\n } = dataSet || {};\r\n const { dateRange } = this.getState();\r\n const selectedAccount = aid ? { CurrentAccount: { Id: Number(aid) || 0 } } : {};\r\n const selectedCampaign = cmid ? { CurrentCampaign: { Id: Number(cmid) || 0 } } : {};\r\n const pageContextWithMetricRowInfo = {\r\n ...this.deps.pageContext,\r\n ...selectedAccount,\r\n ...selectedCampaign,\r\n ...this.deps.context,\r\n };\r\n\r\n if (placeholder.className === 'mcc-perf-fluctuation-placeholder') {\r\n createElementBasedFluctuationPopupFactory({\r\n triggerButton,\r\n deps: {\r\n ...this.deps,\r\n // campaignui/feature/instrumentation/index\r\n instrumentation: this.deps.localInstrumentation,\r\n // TODO: update imagePath with newest resource URL\r\n imagePath: 'https://RESOURCES.UI.BINGADS.MICROSOFT.COM/AdvertiserUI/V2018.1030.2248.41/Application/Images/fluctuation-bulb.png',\r\n token: this.deps.pageContext.Token,\r\n context: pageContextWithMetricRowInfo,\r\n appConfig: this.deps.config,\r\n },\r\n metrics: [{\r\n name: metricname,\r\n value: metrictext,\r\n }],\r\n canViewAllInsights: true,\r\n asyncLoadFluctuationConfig: {\r\n dateRange: {\r\n startDate: dateRange.start,\r\n endDate: dateRange.end,\r\n },\r\n fluctuationTypeIds: JSON.parse(fluxtypeids) || [],\r\n },\r\n fromScenario: cmid ? 'CampaignsOverview' : 'AccountsOverview',\r\n onFlucDismiss: ({ isLastFluc }) => {\r\n if (isLastFluc) {\r\n DeterministicView.getParent(this).setState({ dismissLastFluctuation: true });\r\n }\r\n },\r\n onDismiss: () => {\r\n if (triggerButton) {\r\n triggerButton.focus();\r\n }\r\n },\r\n perfMarker: this.perfMarker,\r\n }, placeholder);\r\n }\r\n }\r\n\r\n template() {\r\n const {\r\n metric,\r\n data,\r\n entitySet,\r\n currentDateRangeText,\r\n comparisonDateRangeText,\r\n hasError,\r\n loaded,\r\n } = this.getState();\r\n\r\n let gridData;\r\n\r\n if (!hasError) {\r\n gridData = processGridData.call(this, {\r\n metric,\r\n data: _.compact(data),\r\n entitySet,\r\n });\r\n }\r\n\r\n return () => topChangesGridTemplate({\r\n hasError,\r\n loaded,\r\n gridData,\r\n i18n: this.deps.i18n,\r\n metricName: metric ? this.deps.s$i18n.property('PerformanceMetrics', metric) : '',\r\n currentDateRangeText,\r\n comparisonDateRangeText,\r\n AccountActivityStatus: Constants.AccountActivityStatus,\r\n });\r\n }\r\n\r\n renderTrunk() {\r\n const { loaded } = this.getState();\r\n const parent = DeterministicView.getParent(this);\r\n\r\n if (loaded) {\r\n parent.willRenderWithData();\r\n }\r\n super.renderTrunk();\r\n if (loaded) {\r\n parent.renderedWithData();\r\n }\r\n }\r\n}\r\n","import _ from 'underscore';\r\n\r\nimport { BaseCard } from '@bingads-webui-campaign/overview-base-card';\r\nimport { helpers } from '@bingads-webui/deterministic-view';\r\nimport {\r\n TopChangesFilterOption,\r\n getComparisonDateRange,\r\n fetchTopChanges,\r\n topChangesDefaultOptions,\r\n changeEvents,\r\n allMetrics,\r\n isInsightsMetric,\r\n processTopChangesMetric,\r\n AccountsMode,\r\n patchMetric,\r\n getPopDescription,\r\n} from '@bingads-webui-campaign/overview-cards-common';\r\nimport { MetricPicker } from '@bingads-webui-campaign/overview-metric-picker';\r\nimport TopChangeGrid from './content';\r\nimport metricPickerButtonTemplate from './metric-picker-button-template.pug';\r\nimport template from './template.pug';\r\n\r\nlet i18n;\r\nlet items;\r\nconst layoutBreakPoint = 800;\r\n\r\nfunction getItems() {\r\n if (!items) {\r\n items = [{\r\n displayText: i18n.getString('Dashboard_TopChanges_ToolbarDropdown_All_Changes'),\r\n action: TopChangesFilterOption.AllChanges,\r\n }, {\r\n displayText: i18n.getString('Dashboard_TopChanges_ToolbarDropdown_Top_Gainers'),\r\n action: TopChangesFilterOption.TopGainers,\r\n }, {\r\n displayText: i18n.getString('Dashboard_TopChanges_ToolbarDropdown_Top_Decliners'),\r\n action: TopChangesFilterOption.TopDecliners,\r\n }];\r\n\r\n if (this.accountsMode !== AccountsMode.Smart) {\r\n items.push({\r\n displayText: i18n.getString('Dashboard_TopChanges_ToolbarDropdown_Insights'),\r\n action: TopChangesFilterOption.Insights,\r\n });\r\n }\r\n }\r\n\r\n return items;\r\n}\r\n\r\nconst layoutSize = {\r\n small: 0,\r\n large: 1,\r\n};\r\n\r\n/* @this TopChanges */\r\nfunction getLayoutSize() {\r\n if (this.$el.closest('.card-holder__wrapper').outerWidth() < layoutBreakPoint) {\r\n return layoutSize.small;\r\n }\r\n return layoutSize.large;\r\n}\r\n\r\n/* @this TopChanges */\r\nfunction reLayout() {\r\n const newLayoutSize = getLayoutSize.call(this);\r\n\r\n if (this.currentLayoutSize === newLayoutSize) {\r\n return;\r\n }\r\n\r\n if (newLayoutSize === layoutSize.small) {\r\n this.$el.addClass('small_layout');\r\n } else {\r\n this.$el.removeClass('small_layout');\r\n }\r\n\r\n this.currentLayoutSize = newLayoutSize;\r\n}\r\n\r\n/* @this TopChanges */\r\nfunction getCardPreference() {\r\n const { selectedMenuItem, metric } = this.getState();\r\n\r\n return {\r\n metric,\r\n selectedMenuItem,\r\n };\r\n}\r\n\r\n/* @this TopChange */\r\nfunction loadErrorMsg() {\r\n helpers.updateView(this.getChild('grid-content'), {\r\n hasError: true,\r\n loaded: true,\r\n });\r\n}\r\n\r\n/* @this TopChange */\r\nfunction updateData() {\r\n const {\r\n dateRange,\r\n selectedMenuItem,\r\n metric,\r\n filter,\r\n permissions,\r\n dismissLastFluctuation,\r\n } = this.getState();\r\n\r\n if (!dateRange) {\r\n return;\r\n }\r\n\r\n const comparisonDateRange = getComparisonDateRange(dateRange);\r\n const startDate = i18n.formatDate(dateRange.start);\r\n const endDate = i18n.formatDate(dateRange.end);\r\n const comparisonStartDate = i18n.formatDate(comparisonDateRange.start);\r\n const comparisonEndDate = i18n.formatDate(comparisonDateRange.end);\r\n let currentDateRangeText;\r\n let comparisonDateRangeText;\r\n\r\n this.popText = getPopDescription(i18n, comparisonDateRange);\r\n this.popTextAriaLabel = (i18n.getString('Click to learn more about {{item}}') || '').replace('{{item}}', this.popText);\r\n if (startDate === endDate) {\r\n currentDateRangeText = startDate;\r\n comparisonDateRangeText = comparisonStartDate;\r\n } else {\r\n currentDateRangeText = `${startDate} - ${endDate}`;\r\n comparisonDateRangeText = `${comparisonStartDate} - ${comparisonEndDate}`;\r\n }\r\n\r\n const {\r\n instrumentation, constants, jsdata, dateUtil, cacheManager,\r\n } = this.deps;\r\n\r\n this.blockCard();\r\n this.willFetchData();\r\n\r\n fetchTopChanges({\r\n entitySet: this.entitySet,\r\n dateRange,\r\n filter,\r\n comparisonDateRange,\r\n selectedMenuItem,\r\n metric,\r\n jsdata,\r\n getCardsConfig: this.getCardsConfig,\r\n dateUtil,\r\n fetchSingleTile: this.fetchSingleTile,\r\n isDevice: true,\r\n permissions,\r\n disableCache: dismissLastFluctuation,\r\n cacheManager,\r\n accountsMode: this.accountsMode,\r\n dfmCacheKey: this.typeId,\r\n }).finally(() => {\r\n this.unblockCard();\r\n this.setState({ dismissLastFluctuation: false });\r\n const firstRow = this.$('.top-change-grid .top-change-entity-name.top-change-grid-row-1 a');\r\n if (firstRow.length > 0) {\r\n firstRow.focus();\r\n } else {\r\n this.$('.view-all-clickLink').focus();\r\n }\r\n }).then((data) => {\r\n if (this.removed) {\r\n return;\r\n }\r\n\r\n if (!data || (data.status !== null && data.status !== undefined)) {\r\n loadErrorMsg.call(this);\r\n // If we have error status. Those are already logged in ajax stub.\r\n // Add a trace log.\r\n instrumentation.logMessage([constants.LOGCATEGORY.TRACE], constants.LOGLEVEL.INFO, 'top-changes-card', JSON.stringify(data));\r\n return;\r\n }\r\n\r\n let dataError = false;\r\n\r\n _.each(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 instrumentation.logMessage(\r\n [constants.LOGCATEGORY.TRACE], constants.LOGLEVEL.INFO, 'top-changes-card',\r\n `Fluctuations Rendered. FromScenario: ${fromScenario}, FilterOption: ${selectedMenuItem}, Metric: ${metric}, TypeIds: ${entity.AvailableInsightTypeIds.toString()}, id: ${entity.Id}}.`\r\n );\r\n }\r\n });\r\n\r\n if (dataError) {\r\n loadErrorMsg.call(this);\r\n instrumentation.logMessage([constants.LOGCATEGORY.ERROR], constants.LOGLEVEL.INFO, 'top-changes-card', JSON.stringify(data));\r\n return;\r\n }\r\n\r\n let gridData = data;\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 helpers.updateView(this.getChild('grid-content'), {\r\n loaded: true,\r\n hasError: false,\r\n data: gridData,\r\n metric,\r\n entitySet: this.entitySet,\r\n currentDateRangeText,\r\n comparisonDateRangeText,\r\n dateRange,\r\n });\r\n }).catch((response) => {\r\n // no need to log ajax error here.\r\n if (response.status === undefined) {\r\n instrumentation.logMessage([constants.LOGCATEGORY.ERROR], constants.LOGLEVEL.INFO, 'top-changes-card', response.stack);\r\n }\r\n loadErrorMsg.call(this);\r\n });\r\n}\r\n\r\n/* @this TopChange */\r\nfunction updateMetricPicker() {\r\n const { metric, permissions } = this.getState();\r\n\r\n helpers.updateView(this.metricPickerChild, {\r\n metric,\r\n metrics: _.difference(allMetrics(permissions, this.accountsMode), [metric]),\r\n });\r\n}\r\n\r\n/* @this TopChange */\r\nfunction navigateToEntityGrid() {\r\n const {\r\n legacyRouter,\r\n state,\r\n instrumentation,\r\n constants,\r\n } = this.deps;\r\n\r\n instrumentation.logMessage(\r\n [constants.LOGCATEGORY.TRACE],\r\n constants.LOGLEVEL.INFO,\r\n 'top-changes-card',\r\n `${this.navigationLevel} level view all clicked`\r\n );\r\n\r\n if (this.navigationLevel === 'account') {\r\n legacyRouter.navigateToRoute('campaign');\r\n } else if (this.navigationLevel === 'customer') {\r\n legacyRouter.navigateToRoute('accounts_performance', { accountMode: this.accountsMode });\r\n } else {\r\n legacyRouter.navigateToRoute('campaign_adgroup', {\r\n // eslint-disable-next-line camelcase\r\n campaign_id: state.get('campaign_id'),\r\n });\r\n }\r\n}\r\n\r\n/* @this TopChange */\r\nfunction updatePopupPosition(evt) {\r\n const $target = this.$(evt.currentTarget);\r\n const hoverContent = $target.find('.hover-content');\r\n\r\n if (hoverContent.attr('style')) {\r\n hoverContent.attr('style', '');\r\n }\r\n\r\n const $viewport = $target.closest('.top-change-grid-container');\r\n const scrollTop = $viewport.scrollTop();\r\n\r\n if (scrollTop <= 0) {\r\n return;\r\n }\r\n\r\n if ($target.offset().top - $viewport.offset().top > 50) {\r\n hoverContent.css({\r\n top: 'auto',\r\n bottom: `${scrollTop}px`,\r\n });\r\n } else {\r\n hoverContent.css({\r\n top: `${50 - scrollTop}px`,\r\n bottom: 'auto',\r\n });\r\n }\r\n}\r\n\r\n/* @this TopChange */\r\nfunction setupScrollBarCover() {\r\n const viewport = this.$('.top-change-grid-container');\r\n const viewportWidth = viewport.width();\r\n const grid = this.$('.top-change-grid');\r\n const gridWidth = grid.width();\r\n\r\n if (viewportWidth && gridWidth && (viewportWidth > gridWidth)) {\r\n const scrollBarWidth = viewportWidth - gridWidth;\r\n const scrollBarHeight = viewport.height();\r\n\r\n this.$('.scroll-bar-cover', this.$el.closest('.grid-card')).css({\r\n width: scrollBarWidth,\r\n height: scrollBarHeight,\r\n });\r\n\r\n const expand = Math.min(scrollBarWidth, 16);\r\n\r\n viewport.css({ marginRight: -expand });\r\n }\r\n}\r\n\r\nexport class TopChangesCard extends BaseCard {\r\n get className() {\r\n return 'top-changes-card';\r\n }\r\n\r\n get template() {\r\n return () => template({\r\n popText: this.popText,\r\n buttonText: this.buttonText,\r\n isCustomerLevel: this.navigationLevel === 'customer',\r\n popTextAriaLabel: this.popTextAriaLabel,\r\n });\r\n }\r\n\r\n get menuItems() {\r\n const { selectedMenuItem } = this.getState();\r\n\r\n _.each(getItems.call(this), (item) => {\r\n if (item.action === selectedMenuItem) {\r\n // eslint-disable-next-line no-param-reassign\r\n item.preset = true;\r\n } else {\r\n // eslint-disable-next-line no-param-reassign\r\n item.preset = false;\r\n }\r\n });\r\n\r\n return items;\r\n }\r\n\r\n onMenuAction(menuItem) {\r\n const { selectedMenuItem } = this.getState();\r\n\r\n if (selectedMenuItem === menuItem) {\r\n return;\r\n }\r\n\r\n const {\r\n instrumentation, constants,\r\n } = this.deps;\r\n\r\n instrumentation.logMessage(\r\n [constants.LOGCATEGORY.TRACE],\r\n constants.LOGLEVEL.INFO,\r\n 'top-changes-card',\r\n `${this.navigationLevel} level new pop type picked.`\r\n );\r\n\r\n this.setState({\r\n selectedMenuItem: menuItem,\r\n });\r\n }\r\n\r\n initialize({\r\n entitySet,\r\n metric,\r\n selectedMenuItem,\r\n dateRange,\r\n filter,\r\n navigationLevel,\r\n perfMarker,\r\n name,\r\n sharedOptions,\r\n deps,\r\n fetchSingleTile = false,\r\n preexecuteFlag = false,\r\n accountsMode,\r\n scope,\r\n dismissLastFluctuation = false,\r\n typeId,\r\n }) {\r\n this.getCardsConfig = sharedOptions.getCardsConfig;\r\n this.fetchSingleTile = fetchSingleTile;\r\n this.accountsMode = accountsMode;\r\n this.deps = deps;\r\n this.typeId = typeId;\r\n this.initPerfMarker({ perfMarker, name });\r\n // eslint-disable-next-line prefer-destructuring\r\n i18n = deps.i18n;\r\n this.setChild('grid-content', new TopChangeGrid({\r\n deps: {\r\n ...deps,\r\n context: {\r\n ...deps.context,\r\n scope,\r\n },\r\n },\r\n perfMarker: this.perfMarker,\r\n }));\r\n\r\n const permissions = deps.config && deps.config.get('Permissions');\r\n const initialState = _.defaults({\r\n metric,\r\n selectedMenuItem,\r\n dateRange,\r\n filter,\r\n permissions,\r\n dismissLastFluctuation,\r\n }, topChangesDefaultOptions);\r\n\r\n const patchedMetric = patchMetric({\r\n permissions,\r\n metric: initialState.metric,\r\n accountsMode,\r\n });\r\n const metricProcessed = processTopChangesMetric({\r\n metric: patchedMetric,\r\n permissions,\r\n accountsMode,\r\n });\r\n\r\n if (metricProcessed !== initialState.metric) {\r\n _.extend(initialState, { metric: metricProcessed });\r\n\r\n this.setState(initialState);\r\n _.defer(() => {\r\n this.trigger('storeCardPreference', getCardPreference.call(this));\r\n });\r\n } else {\r\n this.setState(initialState);\r\n }\r\n\r\n this.entitySet = entitySet;\r\n const { metric: initialMetric } = this.getState();\r\n\r\n this.metricPickerChild = helpers.ensureChildView(this, 'metric-picker', MetricPicker, {\r\n buttonTemplate: metricPickerButtonTemplate,\r\n metric: initialMetric,\r\n metrics: _.difference(allMetrics(permissions, this.accountsMode), [initialMetric]),\r\n metricFormatter: this.deps.metricFormatter,\r\n s$i18n: this.deps.s$i18n,\r\n i18n,\r\n accountsMode,\r\n deps,\r\n }, {\r\n pick: ({ metric: newMetric }) => {\r\n const {\r\n instrumentation, constants,\r\n } = this.deps;\r\n\r\n instrumentation.logMessage(\r\n [constants.LOGCATEGORY.TRACE],\r\n constants.LOGLEVEL.INFO,\r\n 'top-changes-card',\r\n `${this.navigationLevel} level new metric picked.`\r\n );\r\n this.setState({ metric: newMetric });\r\n updateMetricPicker.call(this);\r\n },\r\n });\r\n this.navigationLevel = navigationLevel;\r\n\r\n switch (navigationLevel) {\r\n case 'account':\r\n this.buttonText = i18n.getString('Dashboard_TopCampaigns_View_All');\r\n break;\r\n case 'customer':\r\n this.buttonText = i18n.getString('Dashboard_TopAccounts_View_All');\r\n break;\r\n case 'campaign':\r\n this.buttonText = i18n.getString('Dashboard_TopAdGroups_View_All');\r\n break;\r\n default:\r\n }\r\n\r\n const updateDataFunc = preexecuteFlag ? () => {\r\n helpers.updateView(this.getChild('grid-content'), {\r\n loaded: true,\r\n });\r\n } : updateData;\r\n const comparisonDateRange = getComparisonDateRange(dateRange);\r\n\r\n this.popText = getPopDescription(i18n, comparisonDateRange);\r\n this.popTextAriaLabel = (i18n.getString('Click to learn more about {{item}}') || '').replace('{{item}}', this.popText);\r\n updateMetricPicker.call(this);\r\n updateDataFunc.call(this);\r\n\r\n this.listenTo(this.model, changeEvents('dateRange', 'filter'), () => {\r\n this.fetchSingleTile = false;\r\n updateDataFunc.call(this);\r\n });\r\n\r\n this.listenTo(this.model, changeEvents('selectedMenuItem', 'metric'), () => {\r\n this.fetchSingleTile = true;\r\n updateDataFunc.call(this);\r\n });\r\n\r\n this.listenTo(this.model, changeEvents('dismissLastFluctuation'), () => {\r\n this.fetchSingleTile = true;\r\n updateData.call(this);\r\n });\r\n\r\n this.listenTo(this.model, changeEvents('metric'), () => {\r\n updateMetricPicker.call(this);\r\n });\r\n\r\n this.listenTo(this.model, changeEvents('selectedMenuItem'), () => {\r\n this.trigger('change:menuItems', {\r\n value: this.menuItems,\r\n options: { replace: true },\r\n });\r\n });\r\n\r\n this.listenTo(this.model, changeEvents('selectedMenuItem', 'metric'), () => {\r\n this.trigger('storeCardPreference', getCardPreference.call(this));\r\n });\r\n\r\n this.onResize(() => {\r\n reLayout.call(this);\r\n setupScrollBarCover.call(this);\r\n });\r\n\r\n this.on('removed', () => {\r\n this.removed = true;\r\n });\r\n\r\n this.listenTo(this.model, changeEvents('size'), () => {\r\n setupScrollBarCover.call(this);\r\n });\r\n\r\n this.getChild('grid-content').on('rendered', () => {\r\n if (this.deps.onMounted) {\r\n this.deps.onMounted.schedule(() => setupScrollBarCover.call(this));\r\n } else {\r\n setupScrollBarCover.call(this);\r\n }\r\n });\r\n }\r\n\r\n get events() {\r\n return {\r\n 'mouseover .graph-hover-target,.pop-hover-target': updatePopupPosition.bind(this),\r\n 'click .view-all-clickLink': navigateToEntityGrid.bind(this),\r\n };\r\n }\r\n\r\n renderTrunk() {\r\n this.currentLayoutSize = undefined;\r\n super.renderTrunk();\r\n _.defer(() => {\r\n reLayout.call(this);\r\n });\r\n }\r\n}\r\n","import _ from 'underscore';\r\n\r\nconst invalidShoppingCampaignSubTypes = permissions => _.compact([\r\n !permissions.IsPersonalizedOffersV3Enabled && 'ShoppingSmartAds',\r\n 'ShoppingSponsoredProductAd',\r\n 'ShoppingCoOperative',\r\n 'AudienceDynamicFeedBased',\r\n]).map(subtype => subtype.toLowerCase());\r\n\r\nexport function isShowCoupon({ CampaignType, CampaignSubType }, permissions) {\r\n if (CampaignType == null) {\r\n return false;\r\n }\r\n if (CampaignSubType == null) {\r\n CampaignSubType = ''; // eslint-disable-line\r\n }\r\n\r\n switch (CampaignType.toLowerCase()) {\r\n case 'shopping': {\r\n // available only for standard search shopping\r\n return !_\r\n .contains(invalidShoppingCampaignSubTypes(permissions), CampaignSubType.toLowerCase());\r\n }\r\n default:\r\n return false;\r\n }\r\n}\r\n\r\nexport function isPersonalizedOfferAvailable(\r\n permissions,\r\n campaignType = '',\r\n campaignSubType = ''\r\n) {\r\n if (_.result(permissions, ['IsPersonalizedOffersV4Enabled'], false)) {\r\n return false;\r\n }\r\n\r\n if (!_.result(permissions, ['IsPersonalizedOffersEnabled'], false)) {\r\n return false;\r\n }\r\n\r\n if (campaignSubType == null) {\r\n campaignSubType = ''; // eslint-disable-line\r\n }\r\n\r\n switch (campaignType.toLowerCase()) {\r\n case 'default':\r\n case 'search':\r\n case 'dynamicsearchad':\r\n return true;\r\n case 'shopping': {\r\n // available only for standard search shopping\r\n return !_\r\n .contains(invalidShoppingCampaignSubTypes(permissions), campaignSubType.toLowerCase());\r\n }\r\n case 'audience':\r\n return campaignSubType.toLowerCase() === 'audiencefeedbased'; // the only validated sub type for audience campaign\r\n default:\r\n return false;\r\n }\r\n}\r\n\r\nexport function shouldSupportCashbackSettings(campaign, permissions) {\r\n if (_.result(permissions, ['IsPersonalizedOffersV4Enabled'], false)) {\r\n return false;\r\n }\r\n\r\n return _.chain(campaign)\r\n .result('CampaignCashback')\r\n .result('MonthlyBudget', 0)\r\n .value() > 0 ||\r\n _.chain(campaign) // MT should return this flag only if V3 is supported\r\n .result('CampaignCashback')\r\n .result('PersonalizedOffersEnabled')\r\n .value() === true;\r\n}\r\n\r\nexport function isCashbackPercentEmpty(value) {\r\n return value == null || value === '' || +value === -1;\r\n}\r\n\r\nexport function getParentLevelCashbackScope({\r\n currentCampaign,\r\n}) {\r\n const campaignCashbackScope = _.chain(currentCampaign)\r\n .result('CampaignCashback')\r\n .result('Scope')\r\n .value() || 'None';\r\n\r\n return campaignCashbackScope;\r\n}\r\n\r\nexport function getParentLevelCashbackPercent({\r\n currentAdGroup,\r\n currentCampaign,\r\n}) {\r\n const adGroupCashbackPercent = _.chain(currentAdGroup)\r\n .result('AdGroupCashback')\r\n .result('Percent')\r\n .value();\r\n const campaignCashbackPercent = _.chain(currentCampaign)\r\n .result('CampaignCashback')\r\n .result('Percent')\r\n .value();\r\n\r\n if (adGroupCashbackPercent != null && adGroupCashbackPercent !== -1) {\r\n return { value: adGroupCashbackPercent, level: 'AdGroup' };\r\n }\r\n return { value: campaignCashbackPercent, level: 'Campaign' };\r\n}\r\n\r\nexport function getParentLevelCoupon({\r\n currentCampaign,\r\n}) {\r\n const campaignCoupon = _.chain(currentCampaign)\r\n .result('CampaignCashback')\r\n .result('CouponsEnabled')\r\n .value() || 'None';\r\n\r\n return campaignCoupon;\r\n}\r\n\r\nexport function getCashbackInheritOptions({\r\n CashbackPercent, readonly, viewContext, i18n,\r\n}) {\r\n let cashbackInheritInfo;\r\n let inheritCashbackPercent;\r\n if (!readonly) {\r\n cashbackInheritInfo = getParentLevelCashbackPercent(viewContext);\r\n inheritCashbackPercent = (cashbackInheritInfo.value == null || cashbackInheritInfo.value === -1)\r\n ? '-' : +cashbackInheritInfo.value;\r\n } else {\r\n cashbackInheritInfo = getParentLevelCashbackPercent({\r\n currentCampaign: viewContext.currentCampaign,\r\n });\r\n inheritCashbackPercent = (cashbackInheritInfo.value == null || cashbackInheritInfo.value === -1)\r\n ? '-' : +cashbackInheritInfo.value;\r\n }\r\n const cashbackOptions = [\r\n {\r\n text: i18n.getString(`CashbackOption_InheritFrom${cashbackInheritInfo.level}`),\r\n value: 'inherit',\r\n },\r\n {\r\n text: i18n.getString('CashbackOption_OverrideTo'),\r\n value: 'override',\r\n },\r\n {\r\n text: i18n.getString('CashbackOption_NoCashback'),\r\n value: 'noCashback',\r\n },\r\n ];\r\n\r\n let selectedOption;\r\n if (CashbackPercent === '' || CashbackPercent == null || +CashbackPercent === -1) {\r\n selectedOption = 'inherit';\r\n } else if (+CashbackPercent === 0) {\r\n selectedOption = 'noCashback';\r\n } else {\r\n selectedOption = 'override';\r\n }\r\n\r\n return {\r\n options: cashbackOptions,\r\n selected: selectedOption,\r\n inheritValue: inheritCashbackPercent,\r\n };\r\n}\r\n\r\nexport function isCashbackPercentValid(val, decimal, allowEmptyCashbackPercent = true) {\r\n if (val == null || val === '') {\r\n if (allowEmptyCashbackPercent) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n const isValidNumber = typeof val === 'number' ? true : decimal.isValid(val);\r\n if (isValidNumber) {\r\n const number = decimal.fromLocalToFloat(val);\r\n return number >= 0 && number <= 50;\r\n }\r\n return false;\r\n}\r\n\r\nexport const getCashbackPercentValidationError = (\r\n val,\r\n i18n,\r\n decimal,\r\n allowEmptyCashbackPercent = true\r\n) => {\r\n let validationError = '';\r\n const isValidNumber = typeof val === 'number' ? true : decimal.isValid(val);\r\n\r\n if (!allowEmptyCashbackPercent && (val === '' || val == null)) {\r\n validationError = i18n.getString('Validation_NotEmpty_Required_Field');\r\n } else if (!isValidNumber) {\r\n validationError = i18n.getString('Audience_Campaign_Settings_Bid_Invalid');\r\n } else {\r\n const number = decimal.fromLocalToFloat(val);\r\n if (number < 0 || number > 50) {\r\n validationError = i18n.getString('Audience_Campaign_Settings_Bid_Validation')\r\n .replace('{{min}}', 0).replace('{{max}}', 50);\r\n }\r\n }\r\n\r\n return validationError;\r\n};\r\n\r\nexport const getRealCashbackPercentValue = (val, decimal) => {\r\n if (isCashbackPercentEmpty(val)) {\r\n return -1;\r\n }\r\n\r\n if (typeof val === 'number') {\r\n return val;\r\n }\r\n\r\n return decimal.fromLocalToFloat(val);\r\n};\r\n\r\nexport const shouldPersonalizedOffersReadOnly = (isAfterSave, biddingStrategyView) => {\r\n if (!isAfterSave) return false;\r\n if (biddingStrategyView) {\r\n const BiddingScheme = biddingStrategyView.getValues();\r\n return BiddingScheme.Type === 'CostPerSale';\r\n }\r\n return false;\r\n};\r\n\r\nexport const getBidStrategyByCampaignTypeWhenPersonalizedOffersEnabled = ({\r\n campaignType = 'default',\r\n i18n,\r\n isAfterSave,\r\n Permissions,\r\n selectedBidStrategy,\r\n}) => {\r\n if (campaignType.toLowerCase() === 'audience') {\r\n return {\r\n targetBidStrategy: 'ManualCpc',\r\n bidStrategyOptions: [],\r\n };\r\n }\r\n\r\n const isSearchCampaign = campaignType.toLowerCase() === 'search' || campaignType.toLowerCase() === 'default';\r\n const commonBidStrategy = {\r\n Value: isSearchCampaign ? 'MaxConversions' : 'MaxConversionValue',\r\n Text: i18n.getString(isSearchCampaign ? 'BidStrategy_Option_MaximizeConversions' : 'BidStrategy_Option_MaxConversionValue'),\r\n };\r\n const costPerSaleBidStrategy = {\r\n Value: 'CostPerSale',\r\n Text: i18n.getString('BidStrategy_Option_CostPerSale'),\r\n };\r\n const bidStrategyOptions = [];\r\n if (isAfterSave) {\r\n if (selectedBidStrategy === 'CostPerSale') {\r\n bidStrategyOptions.push(costPerSaleBidStrategy);\r\n } else {\r\n bidStrategyOptions.push(commonBidStrategy);\r\n }\r\n } else {\r\n bidStrategyOptions.push(commonBidStrategy);\r\n if (Permissions && Permissions.IsCostPerSaleEnabled && !isSearchCampaign) {\r\n bidStrategyOptions.push(costPerSaleBidStrategy);\r\n }\r\n }\r\n const targetBidStrategy = bidStrategyOptions[0].Value;\r\n\r\n return { targetBidStrategy, bidStrategyOptions };\r\n};\r\n\r\nexport const logCampaignPersonalizedOffers = (shouldLog, log, campaign, message) => {\r\n if (shouldLog) {\r\n const campaignCashback = _.chain(campaign).result('CampaignCashback');\r\n const CashbackPercent = campaignCashback\r\n .result('Percent')\r\n .value() || _.chain(campaign)\r\n .result('CashbackPercent')\r\n .value();\r\n const CouponsEnabled = campaignCashback\r\n .result('CouponsEnabled')\r\n .value() || _.chain(campaign)\r\n .result('CouponsEnabled')\r\n .value();\r\n const PersonalizedOffersEnabled = campaignCashback\r\n .result('PersonalizedOffersEnabled')\r\n .value() || _.chain(campaign)\r\n .result('PersonalizedOffersEnabled')\r\n .value() || campaignCashback\r\n .result('MonthlyBudget', 0)\r\n .value() > 0 || _.chain(campaign)\r\n .result('CashbackMonthlyBudget', 0)\r\n .value() > 0;\r\n\r\n if (CashbackPercent != null && CashbackPercent > 0) {\r\n log(`${message || ''}CashbackEnabled`);\r\n }\r\n\r\n if (CouponsEnabled != null && CouponsEnabled === 'Enabled') {\r\n log(`${message || ''}CouponsEnabled`);\r\n }\r\n\r\n if (PersonalizedOffersEnabled != null && PersonalizedOffersEnabled) {\r\n log(`${message || ''}PersonalizedOffersEnabled`);\r\n }\r\n }\r\n};\r\n\r\nexport const logAdGroupPersonalizedOffers = (shouldLog, log, adgroup, message) => {\r\n if (shouldLog) {\r\n const adgroupCashback = _.chain(adgroup).result('AdGroupCashback');\r\n const CashbackPercent = adgroupCashback\r\n .result('Percent')\r\n .value() || _.chain(adgroup)\r\n .result('CashbackPercent')\r\n .value();\r\n const CouponsEnabled = adgroupCashback\r\n .result('CouponsEnabled')\r\n .value() || _.chain(adgroup)\r\n .result('CouponsEnabled')\r\n .value();\r\n\r\n if (CashbackPercent != null) {\r\n if (CashbackPercent > 0) {\r\n log(`${message || ''}CashbackEnabled.Override`);\r\n } else if (CashbackPercent === -1) {\r\n log(`${message || ''}CashbackEnabled.Inherited`);\r\n } else {\r\n log(`${message || ''}CashbackEnabled.NoCashback`);\r\n }\r\n }\r\n\r\n if (CouponsEnabled != null) {\r\n if (CouponsEnabled === 'Enabled') {\r\n log(`${message || ''}CouponsEnabled.Enabled`);\r\n } else if (CouponsEnabled === 'None') {\r\n log(`${message || ''}CouponsEnabled.Inherited`);\r\n } else {\r\n log(`${message || ''}CouponsEnabled.Disabled`);\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport function setBidStrategyForPersonalizedOffers(isEnabled) {\r\n if (this.biddingStrategyView) {\r\n this.biddingStrategyView.setPersonalizedOffersOptionsAndValue({\r\n enabled: isEnabled,\r\n });\r\n }\r\n}\r\n\r\nexport function setupCommonCashbackObserver(target) {\r\n const setBidStrategy = setBidStrategyForPersonalizedOffers.bind(target);\r\n target.cashbackSettingsView.viewModel.isEnablePersonalizedOffersChecked.subscribe((checked) => {\r\n setBidStrategy(checked);\r\n });\r\n}\r\n","import _ from 'underscore';\r\nimport { aggregatedRowsPlugin } from '@bingads-webui/projection-grid-aggregated-rows';\r\n\r\nconst maxRowsBeforeShowOverallTotalsOnTop = 10;\r\n\r\nconst getRawConfig = (i18n, permissions, {\r\n showSearchRow = true,\r\n showAudienceRow = true,\r\n showNativeRow = true,\r\n showDeletedRow = true,\r\n showPmaxRow = false,\r\n showLinkedInRow = false,\r\n} = {}) => [{\r\n type: 'filtered',\r\n dataKey: '@ns.filtered.totals',\r\n number: '@odata.count',\r\n}, {\r\n type: 'waterfallFilter',\r\n dataKey: '@ns.filtered.totals',\r\n number: '@odata.count',\r\n}, {\r\n type: 'search',\r\n dataKey: '@ns.search.non.deleted.totals',\r\n text: i18n.getString('Summary_SearchTotal'),\r\n helpId: 'pop_BA_CampaignGrids_SearchTotal',\r\n ignore: !showSearchRow,\r\n}, {\r\n type: 'audience',\r\n dataKey: '@ns.audience.non.deleted.totals',\r\n text: i18n.getString('Summary_AudienceTotal'),\r\n helpId: 'pop_BA_CampaignGrids_AudienceTotal',\r\n ignore: !showAudienceRow || !(permissions.IsAIMCampaignEnabled ||\r\n (permissions.IsNativeAdsAllowed && permissions.IsNativeAdsRebrandingEnabled)),\r\n}, {\r\n type: 'pmax',\r\n dataKey: '@ns.pmax.non.deleted.totals',\r\n text: i18n.getString('Summary_PMaxTotal'),\r\n // helpId: 'pop_BA_CampaignGrids_PMaxTotal', // TODO: waiting for help id\r\n ignore: !showPmaxRow || !(permissions.dynamic.PerformanceMaxCampaigns && permissions.dynamic.PerformanceMaxCampaignsPhaseTwoCrossNetwork),\r\n}, {\r\n type: 'native',\r\n dataKey: '@ns.native.non.deleted.totals',\r\n text: i18n.getString('Summary_NativeTotal'),\r\n ignore: !showNativeRow || !permissions.IsNativeAdsAllowed\r\n || permissions.IsNativeAdsRebrandingEnabled,\r\n}, {\r\n type: 'linkedin',\r\n dataKey: '@ns.linkedin.non.deleted.totals',\r\n text: i18n.getString('Summary_LinkedInTotal'),\r\n helpId: 'pop_BA_LinkedIn_AdsTotal',\r\n ignore: !showLinkedInRow || !_.get(permissions, 'dynamic.LinkedInCampaigns', false),\r\n}, {\r\n type: 'deleted',\r\n dataKey: '@ns.deleted.totals',\r\n text: i18n.getString('Summary_DeletedTotal'),\r\n helpId: 'pop_BA_CampaignGrids_DeletedTotal',\r\n ignore: !showDeletedRow,\r\n}, {\r\n type: 'unknownDevices',\r\n dataKey: '@ns.unknown.totals',\r\n}, {\r\n type: 'other',\r\n dataKey: '@ns.other.totals',\r\n}, {\r\n type: 'overall',\r\n dataKey: '@ns.unfiltered.totals',\r\n number: '@ns.unfiltered.count',\r\n}];\r\n\r\nfunction getTotalRow(rawData, {\r\n type, dataKey, text, helpId, ignore,\r\n}) {\r\n const data = rawData && rawData[dataKey];\r\n if (_.isUndefined(text)) {\r\n return null;\r\n }\r\n\r\n return !ignore ? {\r\n item: _.defaults({\r\n $total: { type, text, helpId },\r\n }, data),\r\n classes: `${type}-total-row`,\r\n type: `${type}-total-row`,\r\n } : null;\r\n}\r\n\r\nfunction cookRawConfig(config, rawData = {}, keys, i18n, helpIds) {\r\n return _.map(config, (cfg) => {\r\n const i18nKey = `${cfg.type}I18nKey`;\r\n const helpIdKey = `${cfg.type}HelpId`;\r\n if (cfg.number) {\r\n return _.defaults({\r\n text: (keys[i18nKey] && rawData[cfg.number] !== undefined) ? i18n.getString(keys[i18nKey], {\r\n number: i18n.formatDecimalToInteger(rawData[cfg.number]),\r\n }) : null,\r\n helpId: helpIds ? helpIds[helpIdKey] : cfg.helpId,\r\n }, cfg);\r\n }\r\n\r\n return _.has(keys, i18nKey)\r\n ? _.defaults({\r\n text: i18n.getString(keys[i18nKey]),\r\n helpId: helpIds ? helpIds[helpIdKey] : cfg.helpId,\r\n }, cfg)\r\n : cfg;\r\n });\r\n}\r\n\r\nfunction hasOnlyDataSourceFilters(filterService) {\r\n if (filterService &&\r\n _.isFunction(filterService.getCombinedFilter) &&\r\n _.isFunction(filterService.getDataSourceFilter)) {\r\n const combinedFilter = filterService.getCombinedFilter();\r\n const dataSourceFilter = _.result(filterService.getDataSourceFilter(), 'value', {});\r\n\r\n // All filter entities are data source filters\r\n if (!_.isNull(combinedFilter) && _.isEqual(combinedFilter.query, dataSourceFilter.query)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n// {query: {Status: {$in: null}}} means no quick filter applied. We need to get rid of it.\r\n// TODO: This is a tempory solution, Siming to remove this type of filter.\r\nfunction isEmptyFilter(combinedFilter) {\r\n if (!combinedFilter\r\n || !combinedFilter.depth\r\n || combinedFilter.depth === 0) {\r\n return true;\r\n }\r\n\r\n if (combinedFilter.depth === 1) {\r\n if (!combinedFilter.query) {\r\n return true;\r\n }\r\n\r\n if (!combinedFilter.query.Status\r\n || !_.isEmpty(combinedFilter.query.Status.$in)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport function aggregatedRowsPluginBuilder({\r\n keys,\r\n i18n,\r\n helpIds,\r\n permissions,\r\n filterService,\r\n customConfig,\r\n processBuilderConfig = cfg => cfg,\r\n processPluginConfig = cfg => cfg,\r\n}) {\r\n const rawConfig = processBuilderConfig(getRawConfig(i18n, permissions, customConfig));\r\n const getUIFilters = () => {\r\n if (hasOnlyDataSourceFilters(filterService)) {\r\n return null; // We do not show data source filter entities on UI\r\n }\r\n\r\n if (filterService && _.isFunction(filterService.getCombinedFilter)) {\r\n const combinedFilter = filterService.getCombinedFilter();\r\n return isEmptyFilter(combinedFilter) ? null : combinedFilter.query;\r\n }\r\n\r\n return null;\r\n };\r\n\r\n // we show waterfall filter when waterfall filter is the only filter applied\r\n const showWaterFallFilterTotal = () => {\r\n if (!filterService) {\r\n return false;\r\n }\r\n\r\n const qFilter = filterService.getQuickFilter();\r\n\r\n // if there is any other type of filter, we should not show waterfall filter total.\r\n const combinedFilter = filterService.getCombinedFilter();\r\n\r\n return !_.isNull(qFilter) && !_.isNull(combinedFilter)\r\n && !_.isEmpty(qFilter.value.query) && _.isEqual(\r\n qFilter.value.query,\r\n combinedFilter ? combinedFilter.query : null\r\n );\r\n };\r\n\r\n return aggregatedRowsPlugin(processPluginConfig({\r\n top: {\r\n getRows: (items, { view }) => {\r\n const { rawData } = view.dataSource;\r\n\r\n if (!rawData ||\r\n !_.isArray(rawData.value) ||\r\n rawData.value.length <= maxRowsBeforeShowOverallTotalsOnTop) {\r\n return null;\r\n }\r\n\r\n let type = 'overall';\r\n\r\n if (!_.isEmpty(getUIFilters())) {\r\n if (showWaterFallFilterTotal()) {\r\n type = 'waterfallFilter';\r\n } else {\r\n type = 'filtered';\r\n }\r\n }\r\n\r\n const topConfig = _.find(rawConfig, cfg => cfg.type === type);\r\n if (topConfig != null) {\r\n const cookedConfig = cookRawConfig([topConfig], rawData, keys, i18n, helpIds);\r\n\r\n return [getTotalRow(rawData, cookedConfig[0])];\r\n }\r\n return null;\r\n },\r\n appendToHeader: true,\r\n },\r\n bottom: {\r\n getRows: (items, { view }) => {\r\n const { rawData } = view.dataSource;\r\n if (_.isUndefined(rawData)) {\r\n return null;\r\n }\r\n let cookedConfig = cookRawConfig(rawConfig, rawData, keys, i18n, helpIds);\r\n\r\n if (!showWaterFallFilterTotal()) {\r\n cookedConfig = _.reject(cookedConfig, config => config.type === 'waterfallFilter');\r\n }\r\n\r\n if ((filterService && _.isEmpty(getUIFilters())) || showWaterFallFilterTotal()) {\r\n cookedConfig = _.reject(cookedConfig, config => config.type === 'filtered');\r\n }\r\n\r\n return _.chain(cookedConfig)\r\n .map(config => getTotalRow(rawData, config))\r\n .compact()\r\n .value();\r\n },\r\n },\r\n }));\r\n}\r\n","/* eslint-disable no-param-reassign */\r\nimport _ from 'underscore';\r\nimport pgrid from 'projection-grid';\r\n\r\nimport { merge } from '@bingads-webui-universal/primitive-utilities';\r\n\r\nfunction visit(node, graph, permVisited, tempVisited, sortedList) {\r\n if (permVisited[node]) {\r\n return;\r\n }\r\n\r\n if (tempVisited[node]) {\r\n throw new Error(`Circular plugin dependency detected: ${node}`);\r\n }\r\n\r\n tempVisited[node] = true;\r\n _.each(graph[node], dep => visit(dep, graph, permVisited, tempVisited, sortedList));\r\n tempVisited[node] = false;\r\n permVisited[node] = true;\r\n sortedList.unshift(node);\r\n}\r\n\r\nfunction topoSort(graph) {\r\n const permVisited = {};\r\n const tempVisited = {};\r\n const notVisited = _.keys(graph);\r\n const sortedList = [];\r\n\r\n while (notVisited.length > 0) {\r\n const currNode = notVisited.pop();\r\n visit(currNode, graph, permVisited, tempVisited, sortedList);\r\n }\r\n\r\n return sortedList;\r\n}\r\n\r\nfunction generateDepGraph(map) {\r\n const graph = {};\r\n\r\n _.map(_.uniq(_.flatten(_.values(map))), (dep) => {\r\n graph[dep] = [];\r\n });\r\n\r\n _.each(map, (deps, name) => {\r\n _.each(deps, (dep) => {\r\n graph[dep].push(name);\r\n });\r\n });\r\n\r\n return graph;\r\n}\r\n\r\nfunction processDeps(map) {\r\n return _.mapObject(map, deps => _.without(deps, 'gridView', 'config', 'dataSource'));\r\n}\r\n\r\nfunction getOrderToInitializePlugin(nameToDepsMap) {\r\n const sortedList = topoSort(generateDepGraph(processDeps(nameToDepsMap)));\r\n\r\n return sortedList.concat(_.difference(_.keys(nameToDepsMap), sortedList));\r\n}\r\n\r\nfunction generatePluginNameMaps(plugins) {\r\n const nameToPluginRefMap = {};\r\n const nameToDepsMap = {};\r\n const softDependenciesMap = {};\r\n _.each(plugins, ({ plugin }) => plugin((name, deps) => {\r\n nameToDepsMap[name] = deps;\r\n nameToPluginRefMap[name] = plugin;\r\n if (_.isArray(plugin.softDependencies)) {\r\n softDependenciesMap[name] = plugin.softDependencies;\r\n }\r\n }));\r\n\r\n // softDependencies is not required dependency.\r\n // PluginA or PluginB doesn't depend each other. Grid can use the PluginA or PluginB directly.\r\n // But, if grid use them together, sometimes, we must use one firstly, use another one secondly.\r\n // An example is SegmentPlugin, and AggregatedRowPlugin, must use AggregatedRowPlugin fristly.\r\n _.each(softDependenciesMap, (softDependencies, name) => {\r\n _.each(softDependencies, (softDependency) => {\r\n if (_.has(nameToDepsMap, softDependency)) {\r\n nameToDepsMap[name].push(softDependency);\r\n }\r\n });\r\n });\r\n\r\n return {\r\n nameToPluginRefMap,\r\n nameToDepsMap,\r\n };\r\n}\r\n\r\nfunction addPluginConfigToGridConfig(gridConfig, plugins, preferenceConfig) {\r\n gridConfig.plugins = {};\r\n\r\n _.each(plugins, ({ plugin, config }) => {\r\n if (config) {\r\n plugin((name) => {\r\n if (name === 'performance-log') {\r\n gridConfig.plugins.performanceLog = config;\r\n } else {\r\n gridConfig.plugins[name] = config;\r\n }\r\n });\r\n }\r\n });\r\n\r\n // merge here as preferenceConfig contains modifications for both gridConfig and plugin config\r\n merge(gridConfig, preferenceConfig);\r\n\r\n return gridConfig;\r\n}\r\n\r\nexport function pgridFactory({ plugins = [], gridConfig, preferenceConfig }, grid = pgrid) {\r\n const { nameToPluginRefMap, nameToDepsMap } = generatePluginNameMaps(plugins);\r\n // add customDepsMap to allow customize for the depsMap to solve below scenario\r\n // Plugin A depend on Plugin B when Plugin B exist.\r\n // In this scenario, we couldn't add plugin B in plugin A's dependency directly\r\n // as plugin B is not required by plugin A\r\n if (gridConfig && _.isFunction(gridConfig.customDepsMap)) {\r\n gridConfig.customDepsMap(nameToDepsMap);\r\n }\r\n const sortedOrder = getOrderToInitializePlugin(nameToDepsMap);\r\n\r\n let gridFactory = grid.factory({ vnext: true });\r\n\r\n _.each(sortedOrder, (pluginName) => {\r\n gridFactory = gridFactory.use(nameToPluginRefMap[pluginName]);\r\n });\r\n\r\n return gridFactory.create(addPluginConfigToGridConfig(gridConfig, plugins, preferenceConfig));\r\n}\r\n","import pgrid from 'projection-grid';\r\nimport _ from 'underscore';\r\nimport { PageReady } from '@bingads-webui/page-ready';\r\n\r\nconst { version } = pgrid;\r\n\r\n// Only log the navigation timing info for first grid data load for Grid performance measurement\r\n// during page load.\r\nlet isInitialGridDataLoad = true;\r\nlet isPageReadyFulfilled = false;\r\n\r\nfunction logMessage({ api, message, logger }) {\r\n logger.logMessage(['ClientPerf'], {\r\n name: 'Info',\r\n value: 0,\r\n }, api, message);\r\n}\r\n\r\nPageReady.afterPageReady().then(() => {\r\n isPageReadyFulfilled = true;\r\n});\r\n\r\nfunction logPerformanceInfo({\r\n name,\r\n gridView,\r\n virtualized,\r\n logNavTiming = false,\r\n track,\r\n logger,\r\n appConfig,\r\n}) {\r\n const timeStarted = performance.now();\r\n const activeTimeBeforeStarted = _.result(performance, 'activeTime', NaN);\r\n const { id } = track;\r\n\r\n logger.logConsoleStamp(`Grid Start: ${name} - ${timeStarted}`);\r\n\r\n gridView.once('didReload', (isSuccess) => {\r\n if (isSuccess && id === track.id) {\r\n const timeFetched = performance.now();\r\n const activeTimeBeforeFetched = _.result(performance, 'activeTime', NaN);\r\n\r\n logger.logConsoleStamp(`Grid Data Fetched: ${name} - ${timeFetched}`);\r\n\r\n gridView.once('didRedraw', () => {\r\n if (id === track.id) {\r\n // In case the document is hidden, the redraw could be delayed by browser optimization.\r\n // Drop the log in this case.\r\n const timeRendered = performance.now();\r\n const activeTimeBeforeRendered = _.result(performance, 'activeTime', NaN);\r\n\r\n logger.logConsoleStamp(`Grid Rendered: ${name} - ${timeRendered}`);\r\n\r\n const landingPageUrl = appConfig.get('LandingPageUrl') || '';\r\n\r\n logMessage({\r\n api: name,\r\n message: JSON.stringify(_.defaults({\r\n Version: `projection-grid@${version}`,\r\n GridName: name,\r\n IsPageReadyFulfilled: isPageReadyFulfilled,\r\n IsVirtualized: virtualized,\r\n TotalRows: gridView.countRows,\r\n TotalServerSideRows: gridView.totalCountRows,\r\n // For the visible rows, do not count the tr.top-filler and tr.bottom-filler\r\n TotalVisibleRows: gridView.$('tbody > tr:visible').length - 2,\r\n TotalColumns: gridView.$('table').last().find('colgroup > col').length,\r\n DataFetchStartTime: timeStarted,\r\n DataFetchStartActiveTime: activeTimeBeforeStarted,\r\n DataFetchingTime: timeFetched - timeStarted,\r\n DataFetchingActiveTime: activeTimeBeforeFetched - activeTimeBeforeStarted,\r\n GridRenderingTime: timeRendered - timeFetched,\r\n GridRenderingActiveTime: activeTimeBeforeRendered - activeTimeBeforeFetched,\r\n }, logNavTiming ? { // Add navigation timing info to indicate this is first Grid load\r\n PageNavStartTime: performance.timing.navigationStart,\r\n PageFetchStartTime: performance.timing.fetchStart,\r\n LandingPageUrl: landingPageUrl,\r\n } : {})),\r\n logger,\r\n });\r\n }\r\n });\r\n }\r\n });\r\n}\r\n\r\nexport const performanceLogPlugin = definePlugin => definePlugin('performance-log', [\r\n 'config',\r\n 'gridView',\r\n], ({\r\n scrolling: {\r\n virtualized = false,\r\n } = {},\r\n name,\r\n plugins,\r\n}, gridView) => {\r\n const track = {};\r\n const { appConfig, logger } = plugins.performanceLog;\r\n\r\n gridView.on('willReload', () => {\r\n track.id = _.uniqueId('log-track-');\r\n\r\n logPerformanceInfo({\r\n name,\r\n virtualized,\r\n gridView,\r\n logNavTiming: isInitialGridDataLoad,\r\n track,\r\n appConfig,\r\n logger,\r\n });\r\n\r\n isInitialGridDataLoad = false;\r\n });\r\n});\r\n","import pgrid from 'projection-grid';\r\nimport _ from 'underscore';\r\nimport { PageReady } from '@bingads-webui/page-ready';\r\n\r\nconst { version } = pgrid;\r\n\r\n// Only log the navigation timing info for first grid data load for Grid performance measurement\r\n// during page load.\r\nlet isInitialGridDataLoad = true;\r\nlet isPageReadyFulfilled = false;\r\n\r\nPageReady.afterPageReady().then(() => {\r\n isPageReadyFulfilled = true;\r\n});\r\n\r\nfunction logPerformanceInfo({\r\n name,\r\n gridView,\r\n virtualized,\r\n logNavTiming = false,\r\n track,\r\n marker,\r\n appConfig,\r\n parentMarker,\r\n}) {\r\n const { id } = track;\r\n marker.willFetchData();\r\n if (parentMarker) {\r\n parentMarker.willFetchData();\r\n }\r\n\r\n gridView.once('didReload', (isSuccess) => {\r\n if (isSuccess && id === track.id) {\r\n marker.willRender();\r\n if (parentMarker) {\r\n parentMarker.willRender();\r\n }\r\n\r\n gridView.once('didRedraw', () => {\r\n if (id === track.id) {\r\n marker.done(JSON.stringify(_.defaults({\r\n Version: `projection-grid@${version}`,\r\n GridName: name,\r\n IsPageReadyFulfilled: isPageReadyFulfilled,\r\n IsVirtualized: virtualized,\r\n TotalRows: gridView.countRows,\r\n TotalServerSideRows: gridView.totalCountRows,\r\n // For the visible rows, do not count the tr.top-filler and tr.bottom-filler\r\n TotalVisibleRows: gridView.$('tbody > tr:visible').length - 2,\r\n TotalColumns: gridView.$('table').last().find('colgroup > col').length,\r\n }, logNavTiming ? { // Add navigation timing info to indicate this is first Grid load\r\n PageNavStartTime: performance.timing.navigationStart,\r\n PageFetchStartTime: performance.timing.fetchStart,\r\n LandingPageUrl: appConfig.get('LandingPageUrl') || '',\r\n } : {})));\r\n }\r\n });\r\n }\r\n });\r\n}\r\n\r\nexport const perfMarkerPlugin = definePlugin => definePlugin('perfMarker', [\r\n 'config',\r\n 'gridView',\r\n], ({\r\n scrolling: {\r\n virtualized = false,\r\n } = {},\r\n name,\r\n plugins,\r\n} = {}, gridView) => {\r\n const track = {};\r\n const { appConfig, marker, gridMarker } = plugins.perfMarker;\r\n\r\n if (!marker && !gridMarker) {\r\n return;\r\n }\r\n\r\n let pgridMarker = null;\r\n\r\n // If grid has passed a marker then use it.\r\n // Grid component has to call 'willInit'.\r\n if (gridMarker) {\r\n pgridMarker = gridMarker;\r\n } else {\r\n pgridMarker = marker.createChild(`pgrid-${name}-load`);\r\n pgridMarker.willInit();\r\n }\r\n\r\n gridView.on('willReload', () => {\r\n track.id = _.uniqueId('log-track-');\r\n\r\n // If grid marker is already marked done\r\n // then it means this grid load is from some action on grid\r\n // actions like, sort, filter, column selection etc.\r\n // Create a new marker under parent in that case to capture user action.\r\n if (pgridMarker && pgridMarker.isDone === true && pgridMarker.parentMarker) {\r\n pgridMarker = pgridMarker.parentMarker.createChild(`pgrid-${name}-action`);\r\n pgridMarker.willInit();\r\n }\r\n\r\n logPerformanceInfo({\r\n name,\r\n virtualized,\r\n gridView,\r\n logNavTiming: isInitialGridDataLoad,\r\n track,\r\n appConfig,\r\n marker: pgridMarker,\r\n parentMarker: pgridMarker.parentMarker,\r\n });\r\n\r\n isInitialGridDataLoad = false;\r\n });\r\n});\r\n","import _ from 'underscore';\r\nimport appConfig from '@bingads-webui-component-legacy/config/index';\r\nimport {\r\n generateBaseBIColumns,\r\n getListOfRawBIColumns,\r\n RSAAdCustomizerAttributesColumn,\r\n} from '@bingads-webui-campaign-legacy/campaigns-tab-campaigns/grid/columns-config-base';\r\n\r\nconst Permissions = appConfig.get('Permissions');\r\nconst isPortfolioBidStrategyEnabled = _.result(Permissions.dynamic, 'PortfolioBidStrategy');\r\nconst isBroadOnlyEnabled = _.result(Permissions.dynamic, 'BroadOnly');\r\nconst isPredictiveMatchingEnabled = _.result(Permissions.dynamic, 'PredictiveMatching');\r\n\r\nconst {\r\n IsAvgPositionDeprecationPhase1Enabled,\r\n IsExperimentsEnabled: showExperiment,\r\n} = Permissions;\r\n\r\nexport const KeywordStatusColumn = {\r\n name: 'Status',\r\n property: _.compact([\r\n 'Status',\r\n showExperiment && 'Campaign/ExperimentId',\r\n ]),\r\n};\r\n\r\nexport const KeywordColumn = {\r\n name: 'Keyword',\r\n property: ['Text', 'Id', 'Labels', 'AdGroup/Id', 'Campaign/Id', 'RSAAdCustomizerAttributes'],\r\n};\r\n\r\nexport const CampaignColumn = {\r\n name: 'Campaign',\r\n property: _.compact([\r\n 'Campaign/Name',\r\n 'Campaign/Id',\r\n showExperiment && 'Campaign/BaseCampaignName',\r\n ]),\r\n};\r\nexport const AdGroupColumn = {\r\n name: 'AdGroup',\r\n property: ['AdGroup/Name', 'AdGroup/Id'],\r\n};\r\n\r\nexport const BidStrategyNameColumn = {\r\n name: 'BidStrategyName',\r\n property: 'Campaign/BidStrategyName',\r\n};\r\n\r\nexport const BidStrategyTypeColumn = {\r\n name: 'BidStrategyType',\r\n property: 'DisplayBiddingStrategyType',\r\n};\r\n\r\nexport const BidColumn = {\r\n name: 'Bid',\r\n property: ['Bid/Amount', // currently require this will return whole bid object\r\n 'IsBidLandscapeAvailable',\r\n 'Campaign/CampaignType',\r\n 'AdGroup/PricingModel',\r\n 'DisplayBiddingStrategyType',\r\n 'Campaign/Id',\r\n 'AdGroup/Id'],\r\n};\r\n\r\nexport const MatchTypeColumn = {\r\n name: 'MatchType',\r\n property: _.compact([\r\n 'MatchType',\r\n (isBroadOnlyEnabled || isPredictiveMatchingEnabled) && 'Campaign/IsBroadMatchOnlyCampaign',\r\n ]),\r\n};\r\nexport const DeliveryColumn = {\r\n name: 'Delivery',\r\n property: ['DeliveryStatus',\r\n 'DeliveryStatusDetails',\r\n 'QualityScore',\r\n 'NegativeKeywordConflictDetails',\r\n 'BidBelowFirstPageDetail',\r\n 'BidEstimate',\r\n 'Id'],\r\n};\r\n\r\nexport const QualityScoreColumn = {\r\n name: 'QualityScore',\r\n property: 'QualityScore',\r\n};\r\n\r\nexport const LandingPageColumn = {\r\n name: 'LandingPage',\r\n property: ['DestinationUrl', 'FinalUrls', 'MobileFinalUrls'],\r\n};\r\n\r\nexport const CustomParametersColumn = {\r\n name: 'CustomParameters',\r\n property: 'UrlCustomParameters',\r\n};\r\n\r\nexport const TrackingTemplateColumn = {\r\n name: 'TrackingTemplate',\r\n property: 'TrackingUrlTemplate',\r\n};\r\n\r\nexport const FinalUrlSuffixColumn = {\r\n name: 'FinalUrlSuffix',\r\n property: 'FinalUrlSuffix',\r\n};\r\n\r\nexport const Param1Column = {\r\n name: 'Param1',\r\n property: 'Param1',\r\n};\r\n\r\nexport const Param2Column = {\r\n name: 'Param2',\r\n property: 'Param2',\r\n};\r\n\r\nexport const Param3Column = {\r\n name: 'Param3',\r\n property: 'Param3',\r\n};\r\n\r\nexport const FirstPageBidEstimationColumn = {\r\n name: 'FirstPageBidEstimation',\r\n property: 'BidEstimate/FirstPageBidEstimation',\r\n};\r\n\r\nexport const MainlineBidEstimationColumn = {\r\n name: 'MainlineBidEstimation',\r\n property: 'BidEstimate/MainlineBidEstimation',\r\n};\r\n\r\nexport const BestPositionBidEstimationColumn = {\r\n name: 'BestPositionBidEstimation',\r\n property: 'BidEstimate/BestPositionBidEstimation',\r\n};\r\n\r\nexport const KeywordIdColumn = {\r\n name: 'KeywordId',\r\n property: 'Id',\r\n};\r\n\r\nexport const LabelsColumn = {\r\n name: 'Labels',\r\n property: 'Labels',\r\n};\r\n\r\nexport const getLockedColumns = ({ scope }) => {\r\n const { campaignId, adGroupId } = scope;\r\n const baseLockedColumns = _.compact([\r\n 'Status',\r\n 'Keyword',\r\n !campaignId && 'Campaign',\r\n !adGroupId && 'AdGroup',\r\n 'MatchType',\r\n ]);\r\n return baseLockedColumns;\r\n};\r\n\r\nexport const getSelectedColumns = ({ scope }) => {\r\n const { campaignId, adGroupId } = scope;\r\n const baseSelectedColumns = _.compact([\r\n KeywordStatusColumn,\r\n KeywordColumn,\r\n !campaignId && CampaignColumn,\r\n !adGroupId && AdGroupColumn,\r\n isPortfolioBidStrategyEnabled && BidStrategyNameColumn,\r\n BidStrategyTypeColumn,\r\n DeliveryColumn,\r\n BidColumn,\r\n MatchTypeColumn,\r\n LabelsColumn,\r\n RSAAdCustomizerAttributesColumn,\r\n 'Clicks',\r\n 'Impressions',\r\n 'CTR',\r\n 'AverageCPC',\r\n 'Spend',\r\n 'AveragePosition',\r\n IsAvgPositionDeprecationPhase1Enabled && 'TopImpressionRate',\r\n IsAvgPositionDeprecationPhase1Enabled && 'AbsoluteTopImpressionRate',\r\n ]);\r\n return baseSelectedColumns;\r\n};\r\n\r\nexport function getColumnsMap({ gridName }) {\r\n const baseColumns = [\r\n KeywordStatusColumn,\r\n KeywordColumn,\r\n CampaignColumn,\r\n AdGroupColumn,\r\n BidStrategyNameColumn,\r\n BidStrategyTypeColumn,\r\n BidColumn,\r\n MatchTypeColumn,\r\n DeliveryColumn,\r\n QualityScoreColumn,\r\n LandingPageColumn,\r\n CustomParametersColumn,\r\n TrackingTemplateColumn,\r\n FinalUrlSuffixColumn,\r\n Param1Column,\r\n Param2Column,\r\n Param3Column,\r\n FirstPageBidEstimationColumn,\r\n MainlineBidEstimationColumn,\r\n BestPositionBidEstimationColumn,\r\n KeywordIdColumn,\r\n LabelsColumn,\r\n RSAAdCustomizerAttributesColumn,\r\n ];\r\n const baseRawBIColumns = generateBaseBIColumns(getListOfRawBIColumns(gridName));\r\n const columns = [...baseColumns, ...baseRawBIColumns];\r\n return _.object(_.map(columns, column => [column.name, column.property]));\r\n}\r\n","import _ from 'underscore';\r\nimport { getCommonFilterConfig } from '@bingads-webui-campaign/common-grid-config';\r\nimport { getLocalizedEditorialRejectionReasons } from '@bingads-webui-campaign/url-filter-metadata';\r\n\r\nconst mockI18n = {\r\n get: _.identity,\r\n getString: _.identity,\r\n type: _.identity,\r\n enum: _.identity,\r\n value: _.identity,\r\n enumMappedString: _.identity,\r\n enumDescription: _.identity,\r\n valueDescription: _.identity,\r\n parseInt: _.identity,\r\n property: _.identity,\r\n};\r\nconst i18nCache = {\r\n i18n: mockI18n,\r\n newI18n: mockI18n,\r\n legacyGlobalI18n: mockI18n,\r\n schemaI18nCampaign: mockI18n,\r\n};\r\n\r\n\r\nexport function getFilterConfig({\r\n jsdata,\r\n appConfig,\r\n entitySchema,\r\n cachedEntitySchema,\r\n ...restParams\r\n}) {\r\n // Cache i18n data, so that the DFM call can also access the correct i18n data\r\n _.mapObject(i18nCache, (val, key) => {\r\n if (restParams[key]) {\r\n i18nCache[key] = restParams[key];\r\n }\r\n });\r\n const filterConfig = getCommonFilterConfig({\r\n ...i18nCache,\r\n ...restParams,\r\n editor: {},\r\n entitySchema,\r\n cachedEntitySchema,\r\n searchbox: {\r\n placeholder: i18nCache.i18n.getString('Schema_Keyword_Property_Text'),\r\n searchProperty: 'Text',\r\n searchOperator: '$contains',\r\n maxLength: entitySchema.properties.Text.maxLength,\r\n },\r\n featureName: 'KeywordGrid',\r\n jsdata,\r\n globalConfig: appConfig,\r\n enableCampaignWaterfall: true,\r\n enableEditorialRejectionFilter: true,\r\n enableAdGroupWaterfall: true,\r\n selector: [{\r\n items: [\r\n {\r\n text: i18nCache.i18n.getString('AllKeyword'),\r\n value: null,\r\n },\r\n {\r\n text: i18nCache.i18n.getString('AllEnabledKeyword'),\r\n value: [\"Enum.OrderItemStatus'Active'\"],\r\n },\r\n ],\r\n property: 'Status',\r\n removable: false,\r\n defaultValue: null,\r\n }],\r\n });\r\n if (i18nCache.newI18n) {\r\n // update schema for rejection reasons\r\n const editorialRejectionFlagId = filterConfig.entitySchema.properties.EditorialRejectionFlagId;\r\n if (editorialRejectionFlagId && !editorialRejectionFlagId.localized) {\r\n editorialRejectionFlagId.localized = getLocalizedEditorialRejectionReasons(i18nCache.newI18n);\r\n editorialRejectionFlagId.type = 'string';\r\n }\r\n }\r\n return filterConfig;\r\n}\r\n","import _ from 'underscore';\r\nimport Promise from 'bluebird';\r\nimport edm from '@bingads-webui-component-legacy/edm-campaign/index';\r\nimport state from '@bingads-webui-component-legacy/state/index';\r\nimport jsdata from '@bingads-webui-component-legacy/js-data-campaign/index';\r\nimport dateUtil from '@bingads-webui-component-legacy/humanize/date';\r\nimport appConfig from '@bingads-webui-component-legacy/config/index';\r\nimport pageContext from '@bingads-webui-static-legacy/page-context';\r\nimport cacheService from '@bingads-webui-static-legacy/cache-service';\r\nimport sessionStore from '@bingads-webui-component-legacy/js-data-storage/session-storage';\r\nimport dataContextManager from '@bingads-webui-static-legacy/summary/SummaryDataContextManager';\r\nimport legacyPreferenceService from '@bingads-webui-component-legacy/preference/service/index';\r\nimport * as preferenceStoreFactory from '@bingads-webui-component-legacy/bingads-grid/service/filter-preferences';\r\nimport * as SegmentationPreference from '@bingads-webui-component-legacy/bingads-grid/service/segmentation-preferences';\r\nimport * as customColumnPreference from '@bingads-webui-component-legacy/bingads-grid/service/custom-column-preferences';\r\nimport * as ColumnChooserPreference from '@bingads-webui-component-legacy/bingads-grid/service/column-chooser-preferences';\r\nimport { Keyword } from '@bingads-webui-campaign/campaign-ui-schemas';\r\nimport { fetchSortInfo } from '@bingads-webui-component-legacy/bingads-grid/service/fetch-sortinfo';\r\nimport { FilterService } from '@bingads-webui/filter-service';\r\nimport { getGridDataParams } from '@bingads-webui-campaign/summary-grid-helper';\r\nimport { fetchPaginationConfig } from '@bingads-webui-component-legacy/bingads-grid/service/fetch-pagination';\r\nimport { getColumnsConversionMap } from '@bingads-webui-campaign/column-conversions';\r\nimport { ChartDataAdapter } from '@bingads-webui-campaign-react/inline-chart';\r\nimport { InlineChartPreferences } from '@bingads-webui-campaign/inline-chart-preferences';\r\nimport { store, adapter } from '@bingads-webui-component-legacy/bingads-grid/service/grid-preferences';\r\nimport { DataSourceStore } from '@bingads-webui-campaign/data-source-store';\r\nimport { getFilterConfig } from './filter-config';\r\nimport { getColumnsMap, getSelectedColumns, getLockedColumns } from './columns-config';\r\n\r\nconst mockI18n = {\r\n getString: _.identity,\r\n};\r\nconst gridName = 'summary_tab_keyword';\r\nconst CurrentTabId = 'Keywords';\r\nconst refreshCampaignCache = 'x-ms-refreshcampaigncache';\r\nconst isOdataActionSource = true;\r\nexport function getDataSourceConfig({\r\n gridNameSource,\r\n scope,\r\n logActivity,\r\n preferenceService,\r\n ...restParams\r\n}) {\r\n const Permissions = appConfig.get('Permissions');\r\n const { dynamic = {} } = Permissions;\r\n const {\r\n ColumnConversion: IsColumnConversionEnabled,\r\n KeywordsCombineGridAndChartOdataCallEnabled,\r\n } = dynamic;\r\n\r\n const initialQuery = isOdataActionSource ? {\r\n query: {\r\n nullifynotapplybidamounts: true,\r\n },\r\n gridDataParameters: getGridDataParams(appConfig),\r\n } : {};\r\n\r\n const scopeAdapter = _.extend({\r\n customerId: scope.values.cid,\r\n accountId: scope.values.aid,\r\n campaignId: scope.values.campaignId,\r\n adGroupId: scope.values.adGroupId,\r\n }, scope);\r\n\r\n if (scopeAdapter.adGroupId) {\r\n state.set('campaign_id', scopeAdapter.campaignId);\r\n state.set('adgroup_id', scopeAdapter.adGroupId);\r\n } else if (scopeAdapter.campaignId) {\r\n state.set('campaign_id', scopeAdapter.campaignId);\r\n state.unset('adgroup_id');\r\n } else {\r\n state.unset('campaign_id');\r\n state.unset('adgroup_id');\r\n }\r\n\r\n let edmEntity = edm.currentAccount;\r\n if (scopeAdapter.adGroupId) {\r\n edmEntity = edm.currentAdGroup;\r\n } else if (scopeAdapter.campaignId) {\r\n edmEntity = edm.currentCampaign;\r\n }\r\n\r\n const entitySet = edmEntity.Keywords['Default.GridData'];\r\n\r\n const { KeywordsFilterImprovementEnabled } = Permissions.dynamic;\r\n let existingDataSource;\r\n let filterService;\r\n let dataSource = {\r\n type: 'jsdata',\r\n entity: jsdata.Keyword,\r\n primaryKey: 'Id',\r\n query: {},\r\n options: {\r\n entitySet: edmEntity.Keywords,\r\n cacheResponse: false,\r\n useDfmCache: false,\r\n headers: {\r\n [refreshCampaignCache]: true,\r\n },\r\n },\r\n };\r\n\r\n if (gridNameSource && KeywordsFilterImprovementEnabled) {\r\n existingDataSource = DataSourceStore.get(gridNameSource);\r\n\r\n if (existingDataSource) {\r\n // eslint-disable-next-line prefer-destructuring\r\n dataSource = existingDataSource.dataSource;\r\n // eslint-disable-next-line prefer-destructuring\r\n filterService = existingDataSource.filterService;\r\n }\r\n }\r\n if (!gridNameSource || !KeywordsFilterImprovementEnabled || !existingDataSource) {\r\n const filterConfig = getFilterConfig({\r\n ...restParams,\r\n edm,\r\n scope,\r\n jsdata,\r\n appConfig,\r\n cacheService,\r\n entitySchema: Keyword,\r\n sessionStore,\r\n customColumnPreference,\r\n preferenceService,\r\n preferenceStoreFactory: preferenceStoreFactory.getFilters,\r\n dataContextManager,\r\n });\r\n\r\n filterService = new FilterService(filterConfig);\r\n }\r\n\r\n return {\r\n existingDataSource,\r\n dataSource,\r\n filterService,\r\n queryBuilder: {\r\n decorators: _.compact([\r\n {\r\n name: 'columnChooser',\r\n columnsMap: getColumnsMap({ gridName, scope: scopeAdapter }),\r\n defaultColumns: getSelectedColumns({ gridName, scope: scopeAdapter }),\r\n lockedColumns: getLockedColumns({ gridName, scope: scopeAdapter }),\r\n addPoPColumnsOnComparisonEnabled: true,\r\n customColumnsEnabled: Permissions.IsCustomColumnsInCampaignsSupported,\r\n IsAvgPositionDeprecationPhase2Enabled: Permissions.IsAvgPositionDeprecationPhase2Enabled,\r\n comparisonPoPColumns: [\r\n 'PeriodPerformanceMetrics',\r\n 'PerformanceMetricsChange',\r\n 'PerformanceMetricsChangePercentage',\r\n ],\r\n },\r\n { name: 'dateFilter' },\r\n { name: 'segment' },\r\n { name: 'pagination', defaultPageSize: 50 },\r\n { name: 'sorting' },\r\n { name: 'filter', filterService },\r\n { name: 'gridDataParameters', entitySet },\r\n KeywordsCombineGridAndChartOdataCallEnabled && {\r\n name: 'chartDataParameters',\r\n entitySet,\r\n pageState: state,\r\n pageContext: { ...pageContext, CurrentTabId }, // At this point pageContext.CurrentTabId is still undefined, so we manually set the pageContext.CurrentTabId to 'Keywords'\r\n chartDataAdapter: new ChartDataAdapter({ i18n: mockI18n, permissions: Permissions }),\r\n inlineChartPreference: new InlineChartPreferences(\r\n store,\r\n appConfig,\r\n adapter,\r\n legacyPreferenceService.initialize().then(() => Promise.promisifyAll(legacyPreferenceService))\r\n ),\r\n },\r\n ]),\r\n commonConfig: {\r\n featureName: gridName,\r\n isOdataActionSource,\r\n appConfig,\r\n appState: state,\r\n deps: {\r\n dateUtil,\r\n state,\r\n ColumnChooserPreference,\r\n CustomColumnPreference: customColumnPreference,\r\n SegmentationPreference,\r\n fetchPaginationConfig,\r\n fetchSortInfo,\r\n },\r\n IsColumnConversionEnabled,\r\n ...IsColumnConversionEnabled ? {\r\n columnConversions: getColumnsConversionMap(gridName, Permissions),\r\n } : {},\r\n },\r\n logActivity,\r\n initialQuery,\r\n },\r\n };\r\n}\r\n","import jsdata from '@bingads-webui-component-legacy/js-data-campaign/index';\r\nimport logger from '@bingads-webui-static-legacy/instrumentation/index';\r\nimport appConfig from '@bingads-webui-component-legacy/config/index';\r\nimport { connect } from '@bingads-webui-campaign/dqb-grid-datasource-connector';\r\nimport { DataSourceStore } from '@bingads-webui-campaign/data-source-store';\r\nimport { QueryBuilderFactory } from '@bingads-webui-campaign/query-builder';\r\nimport { QueryErrorFactory } from '@bingads-webui-campaign/dqb-grid-datasource-error-handler';\r\nimport { getDataSourceConfig } from './data-fetch-config';\r\n\r\nexport function getDataSource({\r\n gridName,\r\n ...restParams\r\n}) {\r\n // DFM call doesn't pass gridName, while grid call passes gridName\r\n // Thus, the DFM call will create a new dataSource, but the grid call will read the cache\r\n const Permissions = appConfig.get('Permissions');\r\n const { dynamic } = Permissions;\r\n const { KeywordsFilterImprovementEnabled } = dynamic;\r\n if (gridName && !KeywordsFilterImprovementEnabled) {\r\n const existingDataSource = DataSourceStore.get(gridName);\r\n if (existingDataSource) {\r\n return existingDataSource;\r\n }\r\n }\r\n\r\n const { KeywordsCombineGridAndChartOdataCallEnabled } = dynamic;\r\n const dataFetchConfig = getDataSourceConfig({\r\n gridNameSource: gridName,\r\n ...restParams,\r\n });\r\n if (dataFetchConfig.existingDataSource) {\r\n return dataFetchConfig.existingDataSource;\r\n }\r\n const { featureName } = dataFetchConfig.queryBuilder.commonConfig;\r\n const queryBuilder = QueryBuilderFactory.make(dataFetchConfig.queryBuilder);\r\n const queryErrors = QueryErrorFactory.make(dataFetchConfig.dataSource);\r\n const dataSource = connect(\r\n dataFetchConfig.dataSource,\r\n queryBuilder,\r\n featureName,\r\n logger,\r\n false,\r\n KeywordsCombineGridAndChartOdataCallEnabled\r\n );\r\n dataSource.queryErrors = queryErrors;\r\n dataSource.entity = jsdata.Keywords;\r\n const { filterService } = dataFetchConfig;\r\n\r\n if (!KeywordsFilterImprovementEnabled) {\r\n DataSourceStore.set(featureName, dataSource);\r\n } else {\r\n const cacheableObjects = {\r\n dataSource,\r\n filterService,\r\n };\r\n\r\n DataSourceStore.set(featureName, cacheableObjects);\r\n }\r\n return { dataSource, filterService };\r\n}\r\n","import _ from 'underscore';\r\nimport Promise from 'bluebird';\r\n\r\nexport class PreferencesSubadapter {\r\n constructor({\r\n preferenceService,\r\n Resource = null,\r\n prefix = '',\r\n serialize = _.identity,\r\n deserialize = _.identity,\r\n }) {\r\n this.preferenceService = preferenceService;\r\n this.prefix = _.isString(prefix) ? () => prefix : prefix;\r\n this.serialize = serialize;\r\n this.deserialize = deserialize;\r\n if (_.some([\r\n this.prefix,\r\n this.serialize,\r\n this.deserialize,\r\n ], _.negate(_.isFunction))) {\r\n throw new Error('Invalid arguments');\r\n }\r\n this.Resource = Resource;\r\n }\r\n\r\n create(attrs) {\r\n const data = this.serialize(attrs);\r\n\r\n return this.preferenceService\r\n .then(preferences => preferences.set(data, null, null))\r\n .then(({ Id }) => _.defaults({ id: Id }, attrs));\r\n }\r\n\r\n find(id) {\r\n return this.preferenceService.then(preferences => preferences.find(id));\r\n }\r\n\r\n findAll(params) {\r\n const prefix = this.prefix(params);\r\n\r\n return this.preferenceService\r\n .then(preferences => preferences.findByPrefix(prefix))\r\n .map(this.deserialize);\r\n }\r\n\r\n update(id, attrs) {\r\n const entity = _.defaults({}, attrs, this.Resource.get(id));\r\n const data = this.serialize(entity);\r\n\r\n return this.preferenceService\r\n .then(preferences => preferences.set(data, id, null))\r\n .thenReturn(entity);\r\n }\r\n\r\n destroy(id) {\r\n return this.preferenceService.then(preferences => preferences.del(id, null));\r\n }\r\n\r\n destroyAll() {\r\n return Promise.reject(new Error('Not implemented'));\r\n }\r\n}\r\n\r\n","import _ from 'underscore';\r\nimport { FilterStorageType, removeQueryByColumnId } from '@bingads-webui/filter-commons';\r\nimport { appendPeriodOverPeriodProperties } from '@bingads-webui-campaign/common-grid-config';\r\nimport { isValidForFeature } from '@bingads-webui/custom-columns-shared-config';\r\n\r\nlet filterService;\r\nlet safeGetString;\r\nlet permissions;\r\n\r\nexport function initialize(config) {\r\n ({ filterService, safeGetString, permissions } = config);\r\n}\r\n\r\nexport const customColumnOperations = {\r\n add: 'add',\r\n edit: 'edit',\r\n remove: 'remove',\r\n};\r\n\r\nexport function updateFilterSchemaForCustomColumns(customColumnData, op) {\r\n const { entitySchema, odataOptions } = filterService;\r\n\r\n if (!entitySchema || !entitySchema.properties || !odataOptions || !odataOptions.fieldMap) {\r\n return;\r\n }\r\n\r\n const {\r\n id, name, columnFormat, expression,\r\n } = customColumnData;\r\n let { properties } = entitySchema;\r\n const { name: schemaName } = entitySchema;\r\n const { fieldMap } = odataOptions;\r\n const customColumnId = `CustomColumn${id}`;\r\n const performanceMetricsCustomColumnId = `PerformanceMetrics/${customColumnId}`;\r\n const popCustomColumnId = `PoP${customColumnId}`;\r\n const popCustomColumnChangeId = `PoP${customColumnId}Change`;\r\n const popCustomColumnChangePercentId = `PoP${customColumnId}ChangePercent`;\r\n const idList = [customColumnId, popCustomColumnId, popCustomColumnChangeId,\r\n popCustomColumnChangePercentId];\r\n\r\n if (op === customColumnOperations.add) {\r\n if (!properties[customColumnId]) {\r\n properties[customColumnId] = {\r\n filterable: true,\r\n format: columnFormat,\r\n id,\r\n isPercentValue: columnFormat === 'Percentage',\r\n name: performanceMetricsCustomColumnId,\r\n nullable: true,\r\n originalProperty: customColumnId,\r\n property: performanceMetricsCustomColumnId,\r\n required: true,\r\n title: name,\r\n type: 'number',\r\n isInvalidProperty: !isValidForFeature({\r\n schemaName,\r\n expression,\r\n permissions,\r\n }),\r\n };\r\n\r\n const tempEntitySchema = { properties: {} };\r\n tempEntitySchema.properties[customColumnId] = { ...properties[customColumnId] };\r\n appendPeriodOverPeriodProperties(tempEntitySchema);\r\n properties = _.defaults(properties, tempEntitySchema.properties);\r\n\r\n _.each(idList, (propertyId) => {\r\n fieldMap[propertyId] = properties[propertyId].property;\r\n });\r\n }\r\n } else if (op === customColumnOperations.edit) {\r\n let tempObject;\r\n\r\n if (properties[customColumnId]) {\r\n tempObject = properties[customColumnId];\r\n tempObject.title = name;\r\n tempObject.format = columnFormat;\r\n tempObject.isPercentValue = columnFormat === 'Percentage';\r\n tempObject.isInvalidProperty = !isValidForFeature({\r\n schemaName,\r\n expression,\r\n permissions,\r\n });\r\n }\r\n\r\n if (properties[popCustomColumnId]) {\r\n tempObject = properties[popCustomColumnId];\r\n tempObject.title = safeGetString('ColumnName_CustomColumn_Compare').replace('{0}', name);\r\n tempObject.format = columnFormat;\r\n tempObject.isPercentValue = columnFormat === 'Percentage';\r\n }\r\n\r\n if (properties[popCustomColumnChangeId]) {\r\n tempObject = properties[popCustomColumnChangeId];\r\n tempObject.title = safeGetString('ColumnName_CustomColumn_Change').replace('{0}', name);\r\n tempObject.format = columnFormat;\r\n tempObject.isPercentValue = columnFormat === 'Percentage';\r\n }\r\n\r\n if (properties[popCustomColumnChangePercentId]) {\r\n tempObject = properties[popCustomColumnChangePercentId];\r\n tempObject.title = safeGetString('ColumnName_CustomColumn_Change_Percentage').replace('{0}', name);\r\n }\r\n } else if (op === customColumnOperations.remove) {\r\n _.each(idList, (propertyId) => {\r\n if (properties[propertyId]) {\r\n delete properties[propertyId];\r\n }\r\n\r\n if (fieldMap[propertyId]) {\r\n delete fieldMap[propertyId];\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction removeAllQueriesInEditableFilter(editableFilter, columnId) {\r\n const changed = removeQueryByColumnId(editableFilter.query, columnId, true);\r\n\r\n if (changed) {\r\n const filterToSet = _.isEmpty(editableFilter.query) ? {} : editableFilter;\r\n\r\n filterService.setEditableFilter(filterToSet);\r\n }\r\n}\r\n\r\nfunction removeAllQueriesInSavedFilter(columnId) {\r\n filterService.getSavedFilters().then((savedFilters) => {\r\n _.each(savedFilters, (filter) => {\r\n const { query, name } = filter;\r\n const changed = removeQueryByColumnId(query, columnId, true);\r\n\r\n if (changed && _.isEmpty(query)) {\r\n filterService.deleteSavedFilter({\r\n name,\r\n }, FilterStorageType.EditableFilter);\r\n filterService.deleteSavedFilter({\r\n name,\r\n }, FilterStorageType.SelectableFilter);\r\n filterService.trigger('remove-saved-filter-name', name);\r\n } else if (changed) {\r\n const updateAppliedFilter = JSON.stringify(filterService.editableFilter.query)\r\n .indexOf(columnId) >= 0;\r\n\r\n filterService.addUpdateSavedFilter(\r\n query,\r\n name,\r\n FilterStorageType.EditableFilter,\r\n updateAppliedFilter\r\n );\r\n }\r\n });\r\n });\r\n}\r\n\r\nexport function cleanUpCustomColumnFilter(columnId) {\r\n const editableFilter = filterService.getEditableFilter();\r\n\r\n if (editableFilter) {\r\n removeAllQueriesInEditableFilter(editableFilter, columnId);\r\n }\r\n\r\n removeAllQueriesInSavedFilter(columnId);\r\n}\r\n","import Backbone from 'backbone';\r\nimport template from './prompt-text-view.pug';\r\n\r\nexport class TextView extends Backbone.View {\r\n initialize({\r\n texts,\r\n customClass = '',\r\n }) {\r\n this.texts = texts;\r\n this.customClass = customClass;\r\n }\r\n\r\n render() {\r\n this.$el.html(template({\r\n texts: this.texts,\r\n customClass: this.customClass,\r\n }));\r\n return this;\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport Backbone from 'backbone';\r\nimport $ from 'jquery';\r\nimport { startsWith } from 'underscore.string';\r\nimport Promise from 'bluebird';\r\nimport {\r\n customColumnGridKeyFromId,\r\n parseIdFromGridKey,\r\n getCustomColumnPreferenceName,\r\n ODATA_PREFIX,\r\n} from '@bingads-webui-universal/custom-column-utils';\r\nimport { Dialog } from '@bingads-webui/dialog';\r\nimport { ColumnChooser } from '@bingads-webui/column-chooser';\r\nimport { ColumnChooserEditablePicker } from '@bingads-webui/column-chooser-editable-picker';\r\nimport { CustomColumn } from '@bingads-webui/projection-grid-custom-column';\r\nimport { initializePop } from '@bingads-webui-campaign/common-grid-config';\r\nimport { isValidForFeature } from '@bingads-webui/custom-columns-shared-config';\r\nimport { notificationApi } from '@bingads-webui-react/notification-center';\r\nimport { buildColumnConversions } from '@bingads-webui-campaign/column-conversions';\r\nimport { normalizeConfig } from './config';\r\nimport { TextView } from './prompt-text-view';\r\nimport {\r\n initialize as initializeUpdateFilterForCustomColumn,\r\n customColumnOperations,\r\n updateFilterSchemaForCustomColumns,\r\n cleanUpCustomColumnFilter,\r\n} from './update-filter-for-custom-column';\r\n\r\nconst dropdownId = 'dropdown-column-chooser';\r\nconst saveListId = 'dropdown-radio-group-saved-columns';\r\n\r\nclass ColumnChooserAgent {\r\n constructor() {\r\n _.extend(this, Backbone.Events);\r\n this.recordRemoveEventName = 'saved-record-removed';\r\n this.recordSaveEventName = 'new-record-saved';\r\n this.recordChangeEventName = 'selected-record-changed';\r\n this.selectColumnsChangedEventName = 'selected-columns-changed';\r\n }\r\n\r\n triggerSelectedColumnsChangedEvent(names) {\r\n this.trigger(this.selectColumnsChangedEventName, names);\r\n }\r\n\r\n triggerSelectedRecordChangedEvent() {\r\n this.trigger(this.recordChangeEventName);\r\n }\r\n\r\n triggerRecordRemovedEvent() {\r\n this.trigger(this.recordRemoveEventName);\r\n }\r\n\r\n triggerRecordSavedEvent() {\r\n this.trigger(this.recordSaveEventName);\r\n }\r\n\r\n onSelectedRecordChanged(callback) {\r\n this.on(this.recordChangeEventName, callback);\r\n }\r\n\r\n onRecordRemoved(callback) {\r\n this.on(this.recordRemoveEventName, callback);\r\n }\r\n\r\n onRecordSaved(callback) {\r\n this.on(this.recordSaveEventName, callback);\r\n }\r\n\r\n onSelectedColumnsChanged(callback) {\r\n this.on(this.selectColumnsChangedEventName, callback);\r\n }\r\n}\r\n\r\nexport const columnChooserPlugin = definePlugin => definePlugin('columnChooser', [\r\n 'config',\r\n 'gridView',\r\n 'toolbar',\r\n], (config, gridView, toolbar) => {\r\n const columnChooserAgent = new ColumnChooserAgent();\r\n let columnChooser = null;\r\n let customColumnPanel = null;\r\n let customColumnService = null;\r\n let filterService = null;\r\n let entitySchemaName = null;\r\n let columnChooserEditablePicker = null;\r\n\r\n const permissions = config.config && _.isFunction(config.config.get) ? config.config.get('Permissions') : {};\r\n const { dynamic = {} } = permissions || {};\r\n const { ColumnConversion: IsColumnConversionEnabled } = dynamic;\r\n\r\n const pluginConfig = normalizeConfig(config);\r\n const {\r\n categories, customColumnConfig, columnProcessorBeforeSetRecord, enableRSAAdCustomizer,\r\n } = pluginConfig;\r\n const isCustomColumnEnabled = customColumnConfig && customColumnConfig.enabled;\r\n const safeGetString = key => (pluginConfig.i18n.getString(key) || key);\r\n const toolbarEditor = pluginConfig.toolbar ||\r\n toolbar.gridToolbarGroup.toolbarWithItem(dropdownId);\r\n const query = {\r\n project: 'CampaignUI',\r\n grid: config.name,\r\n };\r\n let adCustomizerAttributeColumns = [];\r\n let applyColumnConversions;\r\n if (IsColumnConversionEnabled) {\r\n ({ applyColumnConversions } = buildColumnConversions(pluginConfig.columnConversions));\r\n }\r\n\r\n if (isCustomColumnEnabled) {\r\n ({ filterService } = customColumnConfig);\r\n entitySchemaName = filterService.entitySchema.name;\r\n initializePop({ i18n: pluginConfig.i18n });\r\n initializeUpdateFilterForCustomColumn({ filterService, safeGetString, permissions });\r\n }\r\n\r\n function getSelectedColumns() {\r\n return _.map(gridView.get('columns'), _.property('name'));\r\n }\r\n\r\n function updateGridConfig() {\r\n const queryParams = gridView.get('query');\r\n const { entitySet } = queryParams.options;\r\n const action = entitySet.navigation.source;\r\n const existingGridDataParameters = entitySet.navigation.parameters.gridDataParameters || {};\r\n const gridDataParameters = _.defaults({\r\n CustomColumns: undefined,\r\n }, existingGridDataParameters);\r\n const parameters = _.defaults({ gridDataParameters }, entitySet.navigation.parameters);\r\n\r\n return _.defaults({\r\n options: _.defaults({\r\n entitySet: action.$call(parameters),\r\n }, queryParams.options),\r\n }, queryParams);\r\n }\r\n\r\n function setSelectedColumns(names) {\r\n const {\r\n columns,\r\n locked,\r\n patchQuery,\r\n mandatoryProperties,\r\n } = pluginConfig;\r\n const patch = {};\r\n let customColumns;\r\n\r\n if (isCustomColumnEnabled && customColumnService) {\r\n customColumns = customColumnService.getAll();\r\n\r\n _.each(customColumns, (columnInfo) => {\r\n columns[customColumnGridKeyFromId(columnInfo.id)] = new CustomColumn(_.defaults({\r\n i18n: pluginConfig.i18n,\r\n }, columnInfo)).toJSON();\r\n });\r\n }\r\n\r\n if (enableRSAAdCustomizer && permissions.IsRSAAdCustomizerEnabled) {\r\n _.each(adCustomizerAttributeColumns, (columnInfo) => {\r\n if (columnInfo && columnInfo.Id) {\r\n columns[`AdCustomizerAttributes${columnInfo.Id}`] =\r\n new pluginConfig.RSAAdCustomizerAttributeColumn(_.defaults({\r\n gridView,\r\n resource: pluginConfig.resource,\r\n i18n: pluginConfig.i18n,\r\n i18nErrors: pluginConfig.i18nErrors,\r\n gridType: entitySchemaName,\r\n permissions,\r\n }, columnInfo)).toJSON();\r\n }\r\n });\r\n }\r\n\r\n const validNames = _.chain(locked)\r\n .concat(names)\r\n .filter(name => _.has(columns, name))\r\n .uniq()\r\n .value();\r\n\r\n patch.columns = _.map(validNames, name => _.defaults({ name }, columns[name]));\r\n\r\n if (patchQuery && !config.isDataFetchManagerSource) {\r\n let select = _.chain(validNames).reduce((memo, name) => {\r\n const column = columns[name];\r\n const property = column && (column.property || column.name);\r\n const key = (_.isString(property) && property) ||\r\n (_.isObject(property) && property.key);\r\n\r\n if (_.isArray(key)) {\r\n Array.prototype.push.apply(memo, key);\r\n } else if (key) {\r\n memo.push(key);\r\n }\r\n\r\n return memo;\r\n }, []).union(mandatoryProperties).value();\r\n\r\n let patchCustomColumns = {};\r\n\r\n if (isCustomColumnEnabled && !_.isEmpty(customColumns)) {\r\n const selectedCustomColumnNames = _.filter(validNames, name =>\r\n startsWith(name, ODATA_PREFIX));\r\n const selectedCustomColumns = _.filter(customColumns, column =>\r\n _.contains(selectedCustomColumnNames, customColumnGridKeyFromId(column.id)));\r\n\r\n patchCustomColumns = updateGridConfig(selectedCustomColumns);\r\n }\r\n\r\n select = select.concat(config.customerHierarchyExtras || []);\r\n\r\n patch.query = _.defaults(\r\n { select },\r\n patchCustomColumns,\r\n patch.query || {}\r\n );\r\n }\r\n\r\n if (isCustomColumnEnabled && !_.isEmpty(customColumns)) {\r\n gridView.set(patch);\r\n } else {\r\n gridView.patch(patch);\r\n }\r\n\r\n if (config.isDataFetchManagerSource) {\r\n gridView.refresh(true);\r\n }\r\n\r\n gridView.trigger('columnChanged', { columnNames: validNames });\r\n\r\n // This is a workaround for the column alignment issue on IE & Edge\r\n // After redrawing the table with new column set, IE & Edge doesn't relayout\r\n // the table correctly. We need to detach and attach the table element after render.\r\n // we can remove this after Chromium-base Edge become the default version\r\n gridView.once('didRedraw', () => {\r\n const elTable = gridView.$('table, .table').get(-1);\r\n const $table = $(elTable);\r\n const $parent = $(elTable.parentElement);\r\n\r\n if (elTable) {\r\n $table.detach();\r\n $table.appendTo($parent);\r\n }\r\n });\r\n\r\n columnChooserAgent.triggerSelectedColumnsChangedEvent(names);\r\n }\r\n\r\n const dynamicCustomColumnsSetup = resolveSetup =>\r\n Promise.all([\r\n import(/* webpackMode: 'eager' */'@bingads-webui-campaign/custom-column-backbone-wrapper'),\r\n import(/* webpackMode: 'eager' */'@bingads-webui/custom-column-service-wrapper'),\r\n import(/* webpackMode: 'eager' */'@bingads-webui/page-ready'),\r\n ]).spread(({ CustomColumnBackboneWrapper }, { CustomColumnServiceWrapper }, { PageReady }) => {\r\n customColumnService = new CustomColumnServiceWrapper({\r\n name: getCustomColumnPreferenceName(config.name),\r\n CustomColumns: pluginConfig.CustomColumns,\r\n });\r\n\r\n // update preference store\r\n PageReady.afterPageReady().then(() => {\r\n customColumnService.updateCustomColumnPreferenceStore().then(({\r\n removedColumns,\r\n editedColumns,\r\n addedColumns,\r\n }) => {\r\n if (permissions.IsCustomColumnFilterSupported) {\r\n _.each(editedColumns, (editedColumn) => {\r\n updateFilterSchemaForCustomColumns(editedColumn, customColumnOperations.edit);\r\n });\r\n\r\n _.each(addedColumns, (addedColumn) => {\r\n updateFilterSchemaForCustomColumns(addedColumn, customColumnOperations.add);\r\n });\r\n\r\n _.each(removedColumns, ({ id: customColumnId }) => {\r\n const id = customColumnId.replace('CustomColumn', '');\r\n cleanUpCustomColumnFilter(customColumnId);\r\n updateFilterSchemaForCustomColumns({ id }, customColumnOperations.remove);\r\n });\r\n }\r\n }).catch((err) => {\r\n throw new Error(`dynamicCustomColumnsSetup: ${JSON.stringify(err)}}`);\r\n });\r\n });\r\n\r\n const openCustomColumnPanel = options => new Promise((resolvePanel, rejectPanel) => {\r\n const isEdit = _.has(options, 'key');\r\n let id;\r\n let initialName;\r\n let initialDescription;\r\n let initialColumnFormat;\r\n let initialExpression;\r\n\r\n let p$columnDetail;\r\n\r\n if (isEdit) {\r\n id = parseIdFromGridKey(options.key);\r\n p$columnDetail = customColumnService.getCustomColumnDetailFromMT(id)\r\n .then((detail) => {\r\n if (detail && !_.isEmpty(detail) && detail.id === id) {\r\n ({\r\n name: initialName,\r\n description: initialDescription,\r\n format: initialColumnFormat,\r\n expression: initialExpression,\r\n } = detail);\r\n }\r\n return true;\r\n }).catch((data) => {\r\n const { errors } = data;\r\n const error = _.first(errors);\r\n\r\n if (error && error.Code === 'EntityDoesNotExist') {\r\n customColumnService.updateCustomColumnPreferenceStore(true);\r\n notificationApi.showWarning(pluginConfig.i18n.getString('CustomColumn_DoesNotExist'));\r\n columnChooserEditablePicker.removeCustomColumnByKey(options.key);\r\n }\r\n return false;\r\n });\r\n } else {\r\n p$columnDetail = Promise.resolve(true);\r\n }\r\n\r\n p$columnDetail.then((open) => {\r\n if (!open) {\r\n return;\r\n }\r\n\r\n customColumnPanel = new CustomColumnBackboneWrapper({\r\n props: {\r\n i18n: _.defaults({ getString: safeGetString }, pluginConfig.i18n),\r\n id,\r\n initialName,\r\n initialDescription,\r\n initialColumnFormat,\r\n initialExpression,\r\n metricCategories: customColumnConfig.metricCategories,\r\n segmentCategories: customColumnConfig.segmentCategories,\r\n resolvePanel,\r\n customColumnService,\r\n isEdit,\r\n entitySchemaName,\r\n permissions,\r\n afterSave: (formData) => {\r\n try {\r\n if (isEdit && formData.id === undefined) {\r\n customColumnService.updateCustomColumnPreferenceStore(true);\r\n columnChooserEditablePicker.removeCustomColumnByKey(options.key);\r\n\r\n return;\r\n }\r\n\r\n if (permissions.IsCustomColumnFilterSupported) {\r\n updateFilterSchemaForCustomColumns(\r\n formData,\r\n isEdit ? customColumnOperations.edit : customColumnOperations.add\r\n );\r\n }\r\n\r\n if (isEdit) {\r\n const currentColumns = gridView.get('columns');\r\n const isSelectedColumn = _.findIndex(\r\n currentColumns,\r\n column => `PerformanceMetrics/CustomColumn${formData.id}` === column.name\r\n ) >= 0;\r\n\r\n if (isSelectedColumn) {\r\n gridView.refresh(true);\r\n }\r\n }\r\n } catch (e) {\r\n rejectPanel(_.result(formData, 'id', 'MISSING_ID'));\r\n }\r\n },\r\n },\r\n });\r\n\r\n customColumnPanel.render();\r\n });\r\n });\r\n\r\n pluginConfig.categories.push({\r\n name: safeGetString('ColumnChooser_CustomColumnsCategory'),\r\n optionListViewFactory: ({ categoryName }) => {\r\n columnChooserEditablePicker = new ColumnChooserEditablePicker({\r\n i18n: pluginConfig.i18n,\r\n categoryName,\r\n isReadOnlyUser: permissions.IsReadOnlyUser,\r\n options: _.map(customColumnService.getAll(), column => ({\r\n key: customColumnGridKeyFromId(column.id),\r\n name: column.name,\r\n isValid: isValidForFeature({\r\n schemaName: entitySchemaName,\r\n expression: column.expression,\r\n permissions,\r\n }),\r\n })),\r\n p$removeColumn: (columnId) => {\r\n try {\r\n customColumnService.remove(columnId);\r\n\r\n if (permissions.IsCustomColumnFilterSupported) {\r\n const customColumnId = columnId.split('/')[1];\r\n const id = customColumnId.replace('CustomColumn', '');\r\n cleanUpCustomColumnFilter(customColumnId);\r\n updateFilterSchemaForCustomColumns({ id }, customColumnOperations.remove);\r\n const currentColumns = gridView.get('columns');\r\n const filtered = _.chain(currentColumns)\r\n .filter(column => `PerformanceMetrics/CustomColumn${id}` !== column.name)\r\n .map(column => column.name)\r\n .value();\r\n\r\n if (_.size(filtered) < _.size(currentColumns)) {\r\n setSelectedColumns(filtered);\r\n }\r\n }\r\n } catch (e) {\r\n return Promise.reject(columnId);\r\n }\r\n\r\n return Promise.resolve(columnId);\r\n },\r\n p$editColumn: openCustomColumnPanel,\r\n p$createColumn: openCustomColumnPanel,\r\n });\r\n\r\n return columnChooserEditablePicker;\r\n },\r\n });\r\n\r\n resolveSetup();\r\n });\r\n\r\n const setupCustomColumns = () => (isCustomColumnEnabled ?\r\n new Promise(dynamicCustomColumnsSetup) :\r\n Promise.resolve());\r\n\r\n const setupAdCustomizerAttributesColumns =\r\n () => (enableRSAAdCustomizer && permissions.IsRSAAdCustomizerEnabled ?\r\n new Promise((resolve) => {\r\n pluginConfig.AdCustomizerAttribute\r\n .findAll({\r\n query: {\r\n $top: 100,\r\n $orderby: 'Name asc',\r\n },\r\n }).then((returnResult) => {\r\n adCustomizerAttributeColumns = returnResult;\r\n pluginConfig.categories.push({\r\n name: safeGetString('AdCustomizerAttributes'),\r\n options: _.map(returnResult, (item) => {\r\n const {\r\n Name,\r\n Datatype,\r\n Id,\r\n } = item || {};\r\n const dataTypeI18nKey = `RSAAdCustomizer_Attribute_${Datatype}`;\r\n return {\r\n name: `${Name} (${pluginConfig.i18n.getString(dataTypeI18nKey)})`,\r\n key: `AdCustomizerAttributes${Id}`,\r\n };\r\n }),\r\n });\r\n resolve();\r\n });\r\n }) :\r\n Promise.resolve());\r\n\r\n if (isCustomColumnEnabled) {\r\n gridView.on('didReload', () => {\r\n const { dataSource: { rawData } } = gridView;\r\n const customColumnResponseKey = '@ns.customcolumnerrorresponse';\r\n const customColumnErrors = rawData && rawData[customColumnResponseKey] ?\r\n rawData[customColumnResponseKey].CustomColumnErrors : [];\r\n\r\n if (_.isEmpty(customColumnErrors)) {\r\n return;\r\n }\r\n\r\n gridView.trigger('hasInvalidOrDeletedCustomColumns', customColumnErrors, true);\r\n });\r\n\r\n gridView.on('hasInvalidOrDeletedCustomColumns', (customColumnErrors, showFilterBar = false) => {\r\n customColumnService.updateCustomColumnPreferenceStore(true);\r\n\r\n const columnsToExclude = _.chain(customColumnErrors).map((item) => {\r\n if (item.ErrorCode === 'EntityDoesNotExist') {\r\n return { id: item.Id };\r\n }\r\n return null;\r\n }).compact().value();\r\n const columnsToInvalidate = _.chain(customColumnErrors).map((item) => {\r\n if (item.ErrorCode === 'EntityIsUnsupported' || item.ErrorCode === 'InternalError') {\r\n return { id: item.Id };\r\n }\r\n return null;\r\n }).compact().value();\r\n\r\n const currentColumns = gridView.get('columns');\r\n const filtered = _.chain(currentColumns)\r\n .filter(column => _.findIndex(customColumnErrors, excluded => `PerformanceMetrics/CustomColumn${excluded.Id}` === column.name) < 0)\r\n .map(column => column.name)\r\n .value();\r\n\r\n if (_.size(filtered) < _.size(currentColumns)) {\r\n setSelectedColumns(filtered);\r\n }\r\n\r\n filterService.trigger(\r\n 'have-invalid-or-removed-properties',\r\n {\r\n deletedProperties: _.map(columnsToExclude, ({ id }) => `CustomColumn${id}`),\r\n invalidProperties: _.map(columnsToInvalidate, ({ id }) => `CustomColumn${id}`),\r\n showFilterBar,\r\n }\r\n );\r\n });\r\n }\r\n\r\n function getSelection() {\r\n return _.first(pluginConfig.SelectedColumns.filter({ where: query }));\r\n }\r\n\r\n function getSelectedRecord() {\r\n return _.result(getSelection(), 'name', 'Custom');\r\n }\r\n\r\n function setSelectedRecord(name) {\r\n const selection = getSelection();\r\n\r\n if (selection) {\r\n return pluginConfig.SelectedColumns.update(selection.id, { name });\r\n }\r\n\r\n return pluginConfig.SelectedColumns.create(_.defaults({ name }, query));\r\n }\r\n\r\n function refreshMenu() {\r\n toolbarEditor.update({\r\n id: saveListId,\r\n items: _.reduce(pluginConfig.Columns.filter({ where: query }), (memo, { name }) => {\r\n if (name !== 'Custom') {\r\n memo.push({\r\n text: name,\r\n value: name,\r\n });\r\n }\r\n return memo;\r\n }, [{\r\n text: pluginConfig.i18n.getString('ColumnsMenu_Custom'),\r\n value: 'Custom',\r\n locked: true,\r\n }]),\r\n value: getSelectedRecord(),\r\n });\r\n }\r\n\r\n function getRecord(name) {\r\n return _.first(pluginConfig.Columns.filter({\r\n where: _.defaults({ name }, query),\r\n }));\r\n }\r\n\r\n function setRecord(name, _columns) {\r\n const record = getRecord(name);\r\n let columns = _columns;\r\n if (_.isFunction(columnProcessorBeforeSetRecord)) {\r\n columns = columnProcessorBeforeSetRecord(_columns, record && record.columns);\r\n }\r\n\r\n if (permissions.dynamic && permissions.dynamic.AppCampaignNewCampaignGridColumns && record) {\r\n // do not remove column names that are not in the grids available columns. This is to be able to have\r\n // different columns set for different global filter using same preference key\r\n const unavailableSavedColumns = _.difference(record.columns, Object.keys(pluginConfig.columns));\r\n columns = columns.concat(unavailableSavedColumns);\r\n }\r\n\r\n columns = _.unique(columns);\r\n\r\n let p$setRecord;\r\n if (record) {\r\n p$setRecord = pluginConfig.Columns.update(record.id, { columns });\r\n } else {\r\n p$setRecord = pluginConfig.Columns.create(_.defaults({ columns, name }, query));\r\n }\r\n p$setRecord.then(() => {\r\n columnChooserAgent.triggerRecordSavedEvent();\r\n });\r\n return p$setRecord;\r\n }\r\n\r\n function applyRecord(name) {\r\n const promises = [];\r\n const record = getRecord(name);\r\n\r\n if (record) {\r\n if (permissions.IsAvgPositionDeprecationPhase2Enabled &&\r\n (!pluginConfig.isHotelCenterGrid || permissions.IsAvgPositionDeprecationPhase3Enabled)) {\r\n let selectedColumns = record.columns;\r\n const hasAveragePosition = selectedColumns.includes('AveragePosition');\r\n if (hasAveragePosition) {\r\n const hasTopImpressionRate = selectedColumns.includes('TopImpressionRate');\r\n const hasAbsoluteTopImpressionRate = selectedColumns.includes('AbsoluteTopImpressionRate');\r\n selectedColumns = selectedColumns.filter(column => column !== 'AveragePosition');\r\n if (!hasTopImpressionRate) {\r\n selectedColumns.push('TopImpressionRate');\r\n }\r\n if (!hasAbsoluteTopImpressionRate) {\r\n selectedColumns.push('AbsoluteTopImpressionRate');\r\n }\r\n promises.push(setRecord(name, selectedColumns));\r\n }\r\n if (IsColumnConversionEnabled) {\r\n selectedColumns = applyColumnConversions(selectedColumns);\r\n }\r\n setSelectedColumns(selectedColumns);\r\n } else if (IsColumnConversionEnabled) {\r\n const selectedColumns = applyColumnConversions(record.columns);\r\n setSelectedColumns(selectedColumns);\r\n } else {\r\n setSelectedColumns(record.columns);\r\n }\r\n } else {\r\n setSelectedColumns(pluginConfig.selected);\r\n promises.push(setRecord(name, pluginConfig.selected));\r\n }\r\n\r\n if (name !== getSelectedRecord()) {\r\n promises.push(setSelectedRecord(name));\r\n }\r\n\r\n return Promise.all(promises)\r\n .tap(() => columnChooserAgent.triggerSelectedRecordChangedEvent())\r\n .thenReturn();\r\n }\r\n\r\n const legacyQuery = {};\r\n\r\n function legacyDataProcesser() {\r\n const promises = [];\r\n const legacySelected = pluginConfig.LegacySelectedColumns.filter({ where: legacyQuery });\r\n const legacyRecords = pluginConfig.LegacyColumns.filter({ where: legacyQuery });\r\n\r\n // deal with selected columnchooser preference in legacy grid\r\n if (legacySelected.length > 0) {\r\n promises.push(setSelectedRecord(legacySelected[0].name)\r\n .then(getSelectedRecord)\r\n .then(applyRecord)\r\n .then(refreshMenu));\r\n }\r\n\r\n // deal with columnchooser preference in legacy grid\r\n _.each(legacyRecords, (legacyRecord) => {\r\n // this id means the record is from gridName_selected, this is not what we want here.\r\n // this is a hack to fix the issue that legacy grid save custom record as gridName_custom\r\n // which break the naming convention\r\n if (legacyRecord.id === -1) {\r\n return;\r\n }\r\n\r\n const record = getRecord(legacyRecord.name);\r\n const columns = _.map(\r\n legacyRecord.columns,\r\n col => (pluginConfig.nameFromLegacy && pluginConfig.nameFromLegacy[col]) || col\r\n );\r\n\r\n if (record) {\r\n const update = pluginConfig.Columns\r\n .update(record.id, { columns });\r\n\r\n promises.push(update);\r\n } else {\r\n const creation = pluginConfig.Columns\r\n .create(_.defaults({\r\n columns,\r\n name: legacyRecord.name,\r\n }, query));\r\n\r\n promises.push(creation);\r\n }\r\n });\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n function legacyHandler() {\r\n if (config.legacyGridName && pluginConfig.LegacyGridFlag) {\r\n const legacyGridFlagQuery = {\r\n project: 'CampaignUI',\r\n grid: config.legacyGridName,\r\n };\r\n\r\n _.extend(legacyQuery, {\r\n project: 'CampaignUI',\r\n grid: config.legacyGridName,\r\n });\r\n\r\n pluginConfig.LegacyGridFlag.findAll({ where: legacyGridFlagQuery })\r\n .then((flags) => {\r\n const flag = _.first(flags);\r\n\r\n if (flag && flag.flagInfo && flag.flagInfo.isColumnChooserMigrated) {\r\n return Promise.resolve();\r\n }\r\n\r\n if (flag) {\r\n pluginConfig.LegacyGridFlag.update(\r\n flag.id,\r\n { flagInfo: _.extend({}, flag.flagInfo, { isColumnChooserMigrated: true }) }\r\n );\r\n } else {\r\n pluginConfig.LegacyGridFlag.create(_.defaults({\r\n flagInfo: {\r\n isColumnChooserMigrated: true,\r\n },\r\n }, legacyGridFlagQuery));\r\n }\r\n\r\n return Promise.all([\r\n pluginConfig.LegacyColumns.findAll({ where: legacyQuery }),\r\n pluginConfig.LegacySelectedColumns.findAll({ where: legacyQuery }),\r\n ]).then(legacyDataProcesser);\r\n });\r\n }\r\n\r\n return Promise.resolve();\r\n }\r\n\r\n function removeRecord(name) {\r\n const promises = [];\r\n const record = getRecord(name);\r\n\r\n if (record) {\r\n promises.push(pluginConfig.Columns.destroy(record.id));\r\n if (name === toolbarEditor.get(saveListId).value) {\r\n promises.push(applyRecord('Custom'));\r\n }\r\n } else {\r\n throw new Error(`remove record error, the record with name: ${name} does not exist.`);\r\n }\r\n\r\n return Promise.all(promises).tap(() => {\r\n columnChooserAgent.triggerRecordRemovedEvent();\r\n });\r\n }\r\n\r\n function applyColumns({\r\n selectedKeys,\r\n savedName,\r\n }) {\r\n const name = savedName || 'Custom';\r\n\r\n setSelectedColumns(selectedKeys);\r\n\r\n return Promise.all([\r\n setRecord(name, selectedKeys),\r\n setSelectedRecord(name),\r\n ]).then(refreshMenu);\r\n }\r\n\r\n function attemptRemoveRecord(name) {\r\n const dialog = new Dialog({\r\n backdrop: true,\r\n keyboard: true,\r\n showHeader: false,\r\n }).setContent(new TextView({\r\n texts: [\r\n pluginConfig.i18n.getString('ColumnChooser_PromptBeforeRemove').replace('{0}', name),\r\n ],\r\n customClass: 'delete-column',\r\n }))\r\n .setState({\r\n buttons: [{\r\n text: pluginConfig.i18n.getString('ColumnChooser_ConfirmRemove'),\r\n name: 'save',\r\n class: 'confirm-remove btn-primary',\r\n }, {\r\n text: pluginConfig.i18n.getString('ColumnChooser_ConfirmCancel'),\r\n name: 'cancel',\r\n class: 'cancel-remove',\r\n }],\r\n })\r\n .render();\r\n\r\n dialog.$el.appendTo(document.body);\r\n dialog.show();\r\n\r\n dialog.on('clickedButton', (button) => {\r\n dialog.remove();\r\n if (button === 'save') {\r\n removeRecord(name).then(refreshMenu);\r\n }\r\n });\r\n }\r\n\r\n function destroyColumnChooser() {\r\n if (columnChooser) {\r\n columnChooser.remove();\r\n columnChooser = null;\r\n }\r\n if (customColumnPanel) {\r\n customColumnPanel.remove();\r\n customColumnPanel = null;\r\n }\r\n }\r\n\r\n function createColumnChooser(options) {\r\n destroyColumnChooser();\r\n\r\n const selected = getSelectedColumns();\r\n\r\n columnChooser = new ColumnChooser({\r\n i18n: pluginConfig.i18n,\r\n instrumentation: options.instrumentation,\r\n withColumnsChangeAnnouncement: true,\r\n }).setState({\r\n categories,\r\n selected,\r\n customColumnConfig,\r\n });\r\n\r\n return columnChooser;\r\n }\r\n\r\n function p$canSaveColumns({ savedName }) {\r\n return new Promise((resolve) => {\r\n if (_.find(pluginConfig.Columns.filter({ where: query }), _.matcher({ name: savedName }))) {\r\n const dialog = new Dialog({\r\n backdrop: true,\r\n keyboard: true,\r\n showHeader: false,\r\n }).setContent(new TextView({\r\n texts: [\r\n // eslint-disable-next-line no-restricted-globals\r\n pluginConfig.i18n.getString('ColumnChooser_ColumnNameAlreadyExistsPrompt').replace('{0}', savedName).replace('{{name}}', savedName),\r\n pluginConfig.i18n.getString('ColumnChooser_IfReplaceColumnName'),\r\n ],\r\n }))\r\n .setState({\r\n buttons: [{\r\n text: pluginConfig.i18n.getString('ColumnChooser_ConfirmReplace'),\r\n name: 'replace',\r\n class: 'confirm-replace btn-primary',\r\n }, {\r\n text: pluginConfig.i18n.getString('ColumnChooser_CancelReplace'),\r\n name: 'cancel',\r\n class: 'cancel-replace',\r\n }],\r\n })\r\n .render();\r\n\r\n dialog.$el.appendTo(document.body);\r\n dialog.show();\r\n\r\n dialog.on('clickedButton', (button) => {\r\n resolve(button === 'replace');\r\n dialog.remove();\r\n });\r\n\r\n dialog.on('willClose', () => resolve(false));\r\n } else {\r\n resolve(true);\r\n }\r\n });\r\n }\r\n\r\n function restoreToolbar() {\r\n toolbarEditor.restoreToolbar();\r\n toolbar.gridToolbarGroup.showAllToolbars();\r\n destroyColumnChooser();\r\n\r\n if (pluginConfig.isForVNext) {\r\n toolbarEditor.overrideWith(null);\r\n }\r\n }\r\n\r\n function showColumnChooser(options) {\r\n createColumnChooser(options);\r\n\r\n toolbarEditor.overrideWith(columnChooser);\r\n toolbar.gridToolbarGroup.hideAllToolbars();\r\n\r\n columnChooser.on('hide', (result) => {\r\n if (result) {\r\n p$canSaveColumns(result)\r\n .then((canSave) => {\r\n if (canSave) {\r\n return applyColumns(result)\r\n .then(() => restoreToolbar())\r\n .then(() => gridView.refresh(config.isDataFetchManagerSource))\r\n .catch(_.noop);\r\n }\r\n\r\n return Promise.resolve();\r\n });\r\n } else {\r\n restoreToolbar();\r\n }\r\n });\r\n }\r\n\r\n toolbarEditor.update({\r\n iconLeftGlyphName: pluginConfig.customToolbarIcon || '',\r\n id: dropdownId,\r\n button: {\r\n text: pluginConfig.i18n.getString('ColumnChooser_Entry'),\r\n iconLeft: ['glyphicon', 'toolbar-icon', 'toolbar-icon-left', 'icon-columnchooser-normal'],\r\n iconRight: ['glyphicon', 'toolbar-icon', 'glyphicon-triangle-bottom'],\r\n },\r\n menu: {\r\n items: [{\r\n text: pluginConfig.i18n.getString('ColumnChooser_ModifyColumns'),\r\n onClick: (e, options = {}) => _.defer(() => { showColumnChooser(options); }),\r\n }, {\r\n type: 'dropdown-divider',\r\n }, {\r\n type: 'dropdown-radio-group',\r\n id: saveListId,\r\n title: pluginConfig.i18n.getString('ColumnChooser_ApplySavedColumns'),\r\n items: [],\r\n removeText: pluginConfig.i18n.getString('ColumnChooser_RemoveSavedColumns'),\r\n onSelect: applyRecord,\r\n onRemove: attemptRemoveRecord,\r\n refreshMenu,\r\n }],\r\n },\r\n });\r\n\r\n const promises = [\r\n pluginConfig.Columns.findAll({ where: query }),\r\n pluginConfig.SelectedColumns.findAll({ where: query }),\r\n ];\r\n\r\n if (isCustomColumnEnabled) {\r\n promises.push(pluginConfig.CustomColumns.findAll({\r\n where: {\r\n project: 'CampaignUI',\r\n grid: getCustomColumnPreferenceName(config.name),\r\n },\r\n }));\r\n }\r\n\r\n Promise.all(promises)\r\n .then(setupCustomColumns)\r\n .then(legacyHandler)\r\n .then(getSelectedRecord)\r\n .then(applyRecord)\r\n .then(refreshMenu);\r\n\r\n if (enableRSAAdCustomizer && permissions.IsRSAAdCustomizerEnabled) {\r\n setupAdCustomizerAttributesColumns()\r\n .then(getSelectedRecord)\r\n .then(applyRecord);\r\n }\r\n\r\n return {\r\n remove() {\r\n destroyColumnChooser();\r\n },\r\n setSelectedColumns,\r\n columnChooserAgent,\r\n refreshMenu,\r\n restoreToolbar,\r\n };\r\n});\r\n","import _ from 'underscore';\r\n\r\nexport function normalizeConfig(config) {\r\n const {\r\n columns = config.columns,\r\n customColumnConfig = { enabled: false, debugMode: false },\r\n categories,\r\n selected,\r\n mandatoryProperties = [],\r\n locked = [],\r\n patchQuery = false,\r\n toolbar,\r\n Columns,\r\n SelectedColumns,\r\n LegacyColumns,\r\n LegacySelectedColumns,\r\n CustomColumns,\r\n AdCustomizerAttribute,\r\n resource,\r\n LegacyGridFlag,\r\n nameFromLegacy,\r\n legacyGridName,\r\n i18n,\r\n i18nErrors,\r\n customToolbarIcon,\r\n isForVNext,\r\n isHotelCenterGrid,\r\n columnProcessorBeforeSetRecord,\r\n RSAAdCustomizerAttributeColumn,\r\n enableRSAAdCustomizer,\r\n columnConversions,\r\n } = _.result(config.plugins, 'columnChooser', {});\r\n\r\n return {\r\n columns: _.isArray(columns) ? _.indexBy(columns, 'name') : columns,\r\n customColumnConfig,\r\n selected,\r\n mandatoryProperties,\r\n categories,\r\n locked,\r\n patchQuery,\r\n toolbar,\r\n Columns,\r\n SelectedColumns,\r\n LegacyColumns,\r\n legacyGridName,\r\n LegacySelectedColumns,\r\n LegacyGridFlag,\r\n nameFromLegacy,\r\n CustomColumns,\r\n AdCustomizerAttribute,\r\n resource,\r\n i18n,\r\n i18nErrors,\r\n customToolbarIcon,\r\n isForVNext,\r\n isHotelCenterGrid,\r\n columnProcessorBeforeSetRecord,\r\n RSAAdCustomizerAttributeColumn,\r\n enableRSAAdCustomizer,\r\n columnConversions,\r\n };\r\n}\r\n","import _ from 'underscore';\r\nimport Backbone from 'backbone';\r\nimport kendo from '@bingads-webui/kendo/kendo.core';\r\nimport { dateRangeEquals } from '@bingads-webui-universal/primitive-utilities';\r\n\r\nconst formatDateInQuery = date => kendo.toString(date, 'M/d/yyyy');\r\nconst formatDateInEntitySet = date => kendo.toString(date, 'yyyy-MM-dd');\r\nconst parseDate = dateString => kendo.parseDate(dateString);\r\nconst defaultComparisonColumns = [\r\n 'PeriodPerformanceMetrics',\r\n 'PerformanceMetricsChange',\r\n 'PerformanceMetricsChangePercentage',\r\n 'PhonePeriodPerformanceMetrics',\r\n 'PhonePerformanceMetricsChange',\r\n 'PhonePerformanceMetricsChangePercentage',\r\n];\r\n\r\nfunction changeEntitySet(queryParams, dateRange, edm) {\r\n const { options } = queryParams;\r\n const entitySet = edm.root.identifyEntitySet(options.entitySet.toJSON());\r\n\r\n const action = entitySet.navigation.source;\r\n\r\n entitySet.navigation.parameters.gridDataParameters = _.extend(\r\n {},\r\n entitySet.navigation.parameters.gridDataParameters, {\r\n DateRange: {\r\n StartDate: formatDateInEntitySet(dateRange.start) ||\r\n formatDateInEntitySet(parseDate(dateRange.RangeStartDate)),\r\n EndDate: formatDateInEntitySet(dateRange.end) ||\r\n formatDateInEntitySet(parseDate(dateRange.RangeEndDate)),\r\n },\r\n ComparisonDateRange: dateRange.compared ? {\r\n StartDate: formatDateInEntitySet(dateRange.compared.start),\r\n EndDate: formatDateInEntitySet(dateRange.compared.end),\r\n } : undefined,\r\n }\r\n );\r\n\r\n return _.defaults({\r\n options: _.defaults({\r\n entitySet: action.$call(entitySet.navigation.parameters),\r\n }, options),\r\n }, queryParams);\r\n}\r\n\r\nfunction addDateRangeToQueryParams(queryParams, dateRange) {\r\n let query = _.defaults({\r\n startDate: formatDateInQuery(dateRange.start) ||\r\n formatDateInQuery(parseDate(dateRange.RangeStartDate)),\r\n endDate: formatDateInQuery(dateRange.end) ||\r\n formatDateInQuery(parseDate(dateRange.RangeEndDate)),\r\n }, queryParams.query);\r\n\r\n if (dateRange.compared) {\r\n query = _.defaults({\r\n comparisonStartDate: formatDateInQuery(dateRange.compared.start),\r\n comparisonEndDate: formatDateInQuery(dateRange.compared.end),\r\n }, query);\r\n } else {\r\n query = _.omit(query, 'comparisonStartDate', 'comparisonEndDate');\r\n }\r\n\r\n return _.defaults({\r\n query,\r\n }, queryParams);\r\n}\r\n\r\n\r\nexport const dateFilterPlugin = definePlugin => definePlugin('dateFilter', [\r\n 'config',\r\n 'gridView',\r\n 'dataSource',\r\n], (\r\n config,\r\n gridView,\r\n dataSource\r\n) => {\r\n const events = _.extend({}, Backbone.Events);\r\n const pluginConfig = _.result(config.plugins, 'dateFilter', {});\r\n const {\r\n edm,\r\n state,\r\n addDateChangeListener,\r\n comparisonColumns = defaultComparisonColumns,\r\n p$daterange = () => state.getPromise('$daterange'),\r\n } = pluginConfig;\r\n const originalQuery = dataSource.query;\r\n let currentDateRange;\r\n\r\n // The default date range for newly signed up\r\n // user is all time which is from three years\r\n // ago till now\r\n const date = new Date();\r\n date.setFullYear(date.getFullYear() - 3);\r\n const defaultDateRange = {\r\n compared: null,\r\n start: date,\r\n end: new Date(),\r\n grain: 22,\r\n key: 'allTime',\r\n name: 'AllTime',\r\n };\r\n\r\n p$daterange().then((dateRange) => {\r\n currentDateRange = dateRange || defaultDateRange;\r\n });\r\n\r\n dataSource.query = (params, ...rest) => // eslint-disable-line no-param-reassign\r\n p$daterange().then((dateRange) => {\r\n const dateRangeCopy = dateRange || defaultDateRange;\r\n // UI next does not have addDateChangeListener\r\n // when date change, we will go to this query, and we use this chance to trigger\r\n // date change event for other projections\r\n currentDateRange = dateRangeCopy;\r\n events.trigger('dateChange');\r\n\r\n if (!config.isDataFetchManagerSource) {\r\n let queryParams;\r\n\r\n if (pluginConfig.isOdataActionSource) {\r\n const changeEntitySetFn = pluginConfig.changeEntitySet || changeEntitySet;\r\n queryParams = _.defaults({\r\n select: dateRangeCopy.compared ?\r\n _.union(params.select, comparisonColumns) :\r\n _.difference(params.select, comparisonColumns),\r\n }, changeEntitySetFn(params, dateRangeCopy, edm));\r\n } else {\r\n queryParams = addDateRangeToQueryParams(params, dateRangeCopy);\r\n }\r\n\r\n gridView.set({ queryParams });\r\n\r\n return originalQuery.call(dataSource, queryParams, ...rest);\r\n }\r\n\r\n return originalQuery.call(dataSource, params, ...rest);\r\n });\r\n\r\n\r\n addDateChangeListener((e, newDateRange) => {\r\n if (dateRangeEquals(_.omit(currentDateRange, 'key'), _.omit(newDateRange, 'key'))) {\r\n return;\r\n }\r\n\r\n currentDateRange = newDateRange;\r\n\r\n gridView.refresh(true);\r\n\r\n events.trigger('dateChange');\r\n });\r\n\r\n return {\r\n events,\r\n getCurrentDateRange() {\r\n return currentDateRange;\r\n },\r\n p$getCurrentDateRange() {\r\n return p$daterange().then(dateRange => dateRange || defaultDateRange);\r\n },\r\n };\r\n});\r\n","import _ from 'underscore';\r\n\r\nexport const inlineDownloadGenericPlugin = definePlugin => definePlugin('inlineDownload', [\r\n 'config',\r\n 'gridView',\r\n 'toolbar',\r\n 'segment',\r\n], (config, gridView, toolbar, segment) => {\r\n const {\r\n DownloadView,\r\n button = 'button-download',\r\n schema,\r\n // DEPRECATED: use schema instead\r\n entity = schema ? schema.name : null,\r\n gridId,\r\n cusToolbarItem = {},\r\n disableOnEmpty = true,\r\n disableOnTooMuchData = true,\r\n i18n,\r\n downloadFormats,\r\n segmentationTypes,\r\n isFeedbackEnabled,\r\n\r\n p$daterange,\r\n } = config.plugins.inlineDownload;\r\n\r\n let { isAvailable } = config.plugins.inlineDownload;\r\n let downloadView = null;\r\n const toolbarEditor = config.plugins.inlineDownload.toolbar ||\r\n toolbar.gridToolbarGroup.toolbarWithItem(button);\r\n\r\n function createDownloadView(ReportRule) {\r\n const selectedColumns = gridView.get('columns');\r\n\r\n downloadView = new DownloadView({\r\n selectedColumns,\r\n\r\n downloadFormats,\r\n segmentationTypes: segmentationTypes || segment.getAvailableSegmentationTypes(),\r\n entity,\r\n gridId,\r\n totalRecordCount: gridView.getItemCount(),\r\n validateSegmentType: segment.validateSegmentType,\r\n isFeedbackEnabled,\r\n data: ReportRule,\r\n\r\n isForVNext: true,\r\n p$daterange,\r\n }).render();\r\n\r\n return downloadView;\r\n }\r\n\r\n function showDownloadView(ReportRule) {\r\n if (!downloadView) {\r\n createDownloadView(ReportRule);\r\n }\r\n\r\n toolbarEditor.overrideWith(downloadView);\r\n toolbar.gridToolbarGroup.hideAllToolbars();\r\n\r\n // Use 'once' instead 'on'\r\n // * The 'showToolbar' event should only be handled once, then the view\r\n // is destroyed.\r\n // * The current implementation of DownloadView.clear triggers 'showToolbar',\r\n // which would cause dead loop if we use 'on'\r\n downloadView.once('showToolbar', () => {\r\n toolbarEditor.restoreToolbar();\r\n toolbar.gridToolbarGroup.showAllToolbars();\r\n downloadView = null;\r\n\r\n toolbarEditor.overrideWith(null);\r\n });\r\n }\r\n\r\n toolbarEditor.update(_.defaults(cusToolbarItem, {\r\n id: button,\r\n classes: '',\r\n iconLeft: '',\r\n text: i18n.getString('InlineReportDownload_Download_Button'),\r\n disabled: !isAvailable,\r\n onClick: () => showDownloadView({\r\n SegmentationTypes: (() => {\r\n const segmentationType = segment.getSegmentType();\r\n\r\n return segmentationType ? [segmentationType] : [];\r\n })(),\r\n }),\r\n }));\r\n\r\n /*\r\n * in new ui, we only disable when there is too much data.\r\n * MT doesn't support download call and will throw exception.\r\n * The Check disableOnEmpty is to be compatible with old behavior.\r\n */\r\n if (disableOnEmpty && disableOnTooMuchData) {\r\n let isTooMuchDataInGrid = false;\r\n\r\n gridView.on('didReload', (succeeded, data = {}) => {\r\n if (!succeeded) {\r\n if (_.any(data.errors, err => err.Code === 'TooMuchDataToDownload')) {\r\n isTooMuchDataInGrid = true;\r\n }\r\n }\r\n });\r\n\r\n gridView.on('didUpdate', () => {\r\n if (isTooMuchDataInGrid) {\r\n toolbarEditor.set(button, {\r\n disabled: isTooMuchDataInGrid,\r\n });\r\n }\r\n });\r\n }\r\n\r\n function remove() {\r\n if (downloadView) {\r\n downloadView.remove();\r\n }\r\n }\r\n\r\n return {\r\n remove,\r\n getAvailability() {\r\n return isAvailable;\r\n },\r\n setAvailability(isAvailableNew) {\r\n isAvailable = isAvailableNew;\r\n\r\n toolbarEditor.update({\r\n id: button,\r\n disabled: !isAvailable,\r\n });\r\n },\r\n getDownloadView() {\r\n return downloadView;\r\n },\r\n showDownloadView,\r\n };\r\n});\r\n","import _ from 'underscore';\r\nimport { getGridFilter } from '@bingads-webui-campaign/inline-download-grids-metadata';\r\n\r\nexport const setFilterByReportEmailRule = ({\r\n appConfig,\r\n filterService,\r\n ReportEmailRule,\r\n}) => {\r\n const permissions = (appConfig && appConfig.get('permissions')) || {};\r\n const { dynamic: { ColumnConversion: IsColumnConversionEnabled } = {} } = permissions;\r\n\r\n if (!ReportEmailRule) {\r\n return filterService.p$Initialized;\r\n }\r\n\r\n let filter = null;\r\n\r\n if (ReportEmailRule.Filter) {\r\n filter = JSON.parse(ReportEmailRule.Filter);\r\n } else {\r\n filter = getGridFilter(ReportEmailRule.Entity, ReportEmailRule.Selection);\r\n }\r\n\r\n if (_.isEmpty(filter)) {\r\n filter = null;\r\n }\r\n\r\n const originalPromise = filterService.p$Initialized;\r\n\r\n return originalPromise\r\n .then(() => {\r\n if (filterService.p$Initialized !== originalPromise) {\r\n // refreshSource is called, need to wait for its completion\r\n return filterService.p$Initialized;\r\n }\r\n return null;\r\n })\r\n .then(() => {\r\n filterService.deserialize(\r\n JSON.stringify(filter),\r\n IsColumnConversionEnabled\r\n );\r\n return filterService.p$Initialized;\r\n });\r\n};\r\n","import Promise from 'bluebird';\r\nimport _ from 'underscore';\r\nimport URI from 'urijs';\r\nimport { getGridColumnsProperties } from '@bingads-webui-campaign/inline-download-grids-metadata';\r\nimport { setFilterByReportEmailRule } from './set-filter-by-report-email-rule';\r\nimport { inlineDownloadGenericPlugin } from './generic-plugin';\r\n\r\n/**\r\n * Will be called with the current grid's FilterEntity and should return additional query\r\n * parameters, that would normally be included into an OData grid data request when such filter\r\n * is used in a grid.\r\n * @callback CustomFilterQueryParamsCallback\r\n * @param {FilterEntity} - the filter entity representing the current filter\r\n * @returns {Object} - an object with key/value pairs representing the additional query parameters\r\n */\r\n\r\n/**\r\n * @typedef InlineDownloadConfig\r\n * @type {object}\r\n * @property {string} button - The id of the download button.\r\n * It must match the download button id defined in toolbar plugin.\r\n * @property {boolean} isAvailable - Whether the download feature is enabled\r\n * @property {string[]} [segmentationTypes=segment.getAvailableSegmentationTypes()]\r\n * - supported segmentation types, default to be segmentation types defined in segment plugin\r\n * @property {string} entity\r\n * @property {string} gridId\r\n * @property {I18nModel} i18n - i18n\r\n * @property {SchemaI18n} s$i18n - SchemaI18n to get corresponding localized texts for properties\r\n * When this property exists, it will supersede columns, customGridColumns\r\n * And correspond information needs to be added to\r\n * bingads-webui-campaign/inline-download-grids-metadata.\r\n * @property {Object.} columns -\r\n * DEPRECATED: The override column config.\r\n * add your column-property mapping into @bingads-webui-campaign/inline-download-grids-metadata\r\n * @property {function} customGridColumns - DEPRECATED\r\n * add your column-property mapping into @bingads-webui-campaign/inline-download-grids-metadata\r\n * @property {function} processReportRule - a hook before sending final ReportRule to OData server\r\n * add all custom data specific for your feature using this method\r\n * @property {CustomFilterQueryParamsCallback} [customFilterQueryParams] - The\r\n * callback that returns custom query parameters based on the current filter.\r\n * Note that for additional query parameter that don't depend on the current\r\n * filter it is recommended to inject them using a custom processReportRule.\r\n * See examples below.\r\n * @example Injecting custom query parameters\r\n * ```javascript\r\n * const customQueryParams = \"Test1=1&Test2=2\";\r\n * const processReportRule = ReportRule => {\r\n * ReportRule.Selection = ReportRule.Selection || {};\r\n * ReportRule.Selection.QueryString = ReportRule.Selection.QueryString || '';\r\n * ReportRule.Selection.QueryString = ReportRule.Selection.QueryString ?\r\n * `${ReportRule.Selection.QueryString}&${customQueryParams}` :\r\n * customQueryParams;\r\n * };\r\n *\r\n * const pluginsConfig = {\r\n * inlineDownload: {\r\n * // ...\r\n * processReportRule\r\n * // ...\r\n * }\r\n * };\r\n * ```\r\n * @example Injecting custom query parameters based on filter\r\n * ```javascript\r\n * const customFilterQueryParams = filterEntity => ({ Test1: 1, Test2: 2 });\r\n *\r\n * const pluginsConfig = {\r\n * inlineDownload: {\r\n * // ...\r\n * customFilterQueryParams\r\n * // ...\r\n * }\r\n * };\r\n * ```\r\n */\r\n\r\n/**\r\n * A hook to change default ReportRule created by this plugin\r\n * ReportRule is a sub-class of TaskItem, which creates a task to download files\r\n * @callback ProcessReportRule\r\n * @param {ReportRule} - the default ReportRule created by this plugin\r\n * @returns {ReportRule} - the changed ReportRule with data specific for your feature\r\n */\r\n\r\n/**\r\n * @deprecated\r\n * @typedef InlineDownloadColumns\r\n * @type {InlineDownloadColumnConfig|InlineDownloadColumnConfig[]}\r\n */\r\n\r\n/**\r\n * @deprecated\r\n * @typedef InlineDownloadColumnConfig\r\n * @type {object}\r\n * @property {string} property - The property path in form of 'foo/bar'.\r\n * @property {string} title - The localized column header string.\r\n */\r\n\r\nexport const inlineDownloadCampaignODataPlugin = definePlugin =>\r\n inlineDownloadGenericPlugin((pluginName, dependencies, callback) => {\r\n definePlugin(pluginName, dependencies, (config, gridView, toolbar, segment) => {\r\n const {\r\n DownloadView,\r\n schema,\r\n // TODO: remove these options\r\n columns = {},\r\n customGridColumns = null,\r\n // END TODO\r\n processReportRule,\r\n // this option will override columns, customGridColumns,\r\n // and finally replace them\r\n s$i18n,\r\n customDownloadService,\r\n ReportEmailRule,\r\n // TODO: [zhbliu] refactor to auto generate it then we can remove this param\r\n selection: rawSelection,\r\n // END TODO\r\n customFilterQueryParams = null,\r\n } = config.plugins.inlineDownload;\r\n const { config: appConfig } = config;\r\n const selection = rawSelection || _.result(ReportEmailRule, 'Selection');\r\n const { filterService } = config;\r\n\r\n class CampaignODataDownloadView extends DownloadView {\r\n initialize({\r\n selectedColumns,\r\n\r\n downloadFormats,\r\n segmentationTypes,\r\n entity,\r\n gridId,\r\n totalRecordCount,\r\n validateSegmentType,\r\n isFeedbackEnabled,\r\n data,\r\n\r\n p$daterange,\r\n }) {\r\n let localizedHeaders;\r\n let odataColumnNames;\r\n const currentFilter = filterService.getCombinedFilter();\r\n\r\n if (s$i18n) {\r\n const properties = getGridColumnsProperties(\r\n entity,\r\n _.map(selectedColumns, ({ name }) => name),\r\n selection\r\n );\r\n odataColumnNames = _.map(properties, property => (_.isArray(property) ? property.join('/') : property));\r\n localizedHeaders = _.map(properties, name => s$i18n.property(schema || entity, name));\r\n } else {\r\n const gridColumns = _.isFunction(customGridColumns) ?\r\n customGridColumns(selectedColumns) :\r\n selectedColumns;\r\n\r\n [localizedHeaders, odataColumnNames] = _.map([{\r\n key: 'title',\r\n getDefault(column) {\r\n return _.result(column, 'title', column.name);\r\n },\r\n }, {\r\n key: 'property',\r\n getDefault(column) {\r\n const property = column.property || column.name;\r\n\r\n return _.isString(property) ? property : property.key;\r\n },\r\n }], ({ key, getDefault }) => _.reduce(gridColumns, (memo, column) => {\r\n const { name } = column;\r\n const columnConfig = _.result(columns, name);\r\n const defaultValue = getDefault(column);\r\n\r\n if (_.isArray(columnConfig)) {\r\n _.each(columnConfig, col => memo.push(_.result(col, key, defaultValue)));\r\n } else if (_.isObject(columnConfig)) {\r\n memo.push(_.result(columnConfig, key, defaultValue));\r\n } else {\r\n memo.push(defaultValue);\r\n }\r\n\r\n return memo;\r\n }, []));\r\n }\r\n\r\n const filterString = currentFilter ? encodeURIComponent(currentFilter.odataV4({ ignoreCase: false })) : '';\r\n let filterUrlParam = filterString ? `$filter=${filterString}` : '';\r\n\r\n const filterCustomQueryParams = _.isFunction(customFilterQueryParams) ?\r\n customFilterQueryParams(currentFilter) : {};\r\n const additionalFilterUrlParams = URI.buildQuery(filterCustomQueryParams);\r\n if (additionalFilterUrlParams) {\r\n filterUrlParam = `${(filterUrlParam ? `${filterUrlParam}&` : '')}${additionalFilterUrlParams}`;\r\n }\r\n\r\n super.initialize({\r\n customDownloadService,\r\n downloadFormats,\r\n segmentationTypes,\r\n localizedHeaders,\r\n odataColumnNames,\r\n filterUrlParam,\r\n serializedFilter: filterService.serialize(),\r\n entity,\r\n gridId,\r\n totalRecordCount,\r\n processReportRule,\r\n validateSegmentType,\r\n isFeedbackEnabled,\r\n data,\r\n isForVNext: true,\r\n p$daterange,\r\n });\r\n }\r\n }\r\n\r\n const returns = callback(_.defaults({\r\n plugins: _.defaults({\r\n inlineDownload: _.defaults({\r\n DownloadView: CampaignODataDownloadView,\r\n }, config.plugins.inlineDownload),\r\n }, config.plugins),\r\n }, config), gridView, toolbar, segment);\r\n\r\n function createSimilarReportEmailRule(Rule) {\r\n Promise.all([\r\n setFilterByReportEmailRule({\r\n appConfig,\r\n filterService,\r\n ReportEmailRule: Rule,\r\n }),\r\n // Make sure grid is loaded then open inline download panel\r\n new Promise((resolve) => {\r\n gridView.once('didReload', () => {\r\n resolve();\r\n });\r\n }),\r\n ]).then(() => {\r\n returns.remove();\r\n returns.showDownloadView(Rule);\r\n });\r\n }\r\n\r\n if (ReportEmailRule) {\r\n createSimilarReportEmailRule(ReportEmailRule);\r\n }\r\n\r\n\r\n return _.defaults({\r\n setReportEmailRule(Rule) {\r\n createSimilarReportEmailRule(Rule);\r\n },\r\n }, returns);\r\n });\r\n });\r\n","import _ from 'underscore';\r\n\r\nfunction without(plugin, dependency, buildReplacement) {\r\n return definePlugin => plugin((name, dependencies, callback) => {\r\n const index = _.indexOf(dependencies, dependency);\r\n const newDeps = _.without(dependencies, dependency);\r\n return definePlugin(\r\n name,\r\n newDeps,\r\n (...args) => {\r\n const objDeps = _.object(newDeps, args);\r\n args.splice(index, 0, buildReplacement(objDeps));\r\n return callback(...args);\r\n }\r\n );\r\n });\r\n}\r\n\r\nexport function withoutFilterState(plugin) {\r\n return plugin;\r\n}\r\n\r\nexport function withoutSegment(plugin) {\r\n return without(plugin, 'segment', () => ({\r\n getAvailableSegmentationTypes: () => [],\r\n getSegmentType: () => null,\r\n validateSegmentType: () => true,\r\n }));\r\n}\r\n","import { inlineDownloadCampaignODataPlugin } from './campaign-odata-plugin';\r\nimport { withoutFilterState, withoutSegment } from './without-dependencies';\r\n\r\nexport const inlineDownloadWithoutFilterstatePlugin =\r\n withoutFilterState(inlineDownloadCampaignODataPlugin);\r\n\r\nexport const inlineDownloadWithoutSegmentPlugin =\r\n withoutSegment(inlineDownloadCampaignODataPlugin);\r\n\r\nexport const inlineDownloadWithoutFilterstateAndSegmentPlugin =\r\n withoutFilterState(withoutSegment(inlineDownloadCampaignODataPlugin));\r\n","import $ from 'jquery';\r\nimport _ from 'underscore';\r\nimport { decorate } from '@bingads-webui/dialog';\r\nimport { focusLockInstanceDecorator } from '@bingads-webui/focus-lock-decorator';\r\nimport { withUiBlock } from '@bingads-webui/uiblocker';\r\nimport { LabelsSelectorView, CreateLabelView, create, navigateToManagePage } from '@bingads-webui-campaign/labels';\r\n\r\nfunction getCheckMap(selectionInfo) {\r\n if (selectionInfo && selectionInfo.selectedItems) {\r\n const totalCount = selectionInfo.selectedRowIds.length;\r\n\r\n _.each(selectionInfo.selectedItems, (selectedItem) => {\r\n _.each(selectedItem.Labels, (label) => {\r\n if (typeof JSON.parse(label.Id) !== 'object' && label.Scope) {\r\n // eslint-disable-next-line no-param-reassign\r\n label.Id = JSON.stringify({ Id: label.Id, Scope: label.Scope });\r\n }\r\n });\r\n });\r\n\r\n // first got the ids of labels for each selected items\r\n // then got the count for each id by _.countby(_.flatten)\r\n const labelsCount = _.countBy(_.flatten(_.map(\r\n selectionInfo.selectedItems,\r\n rowItem => _.pluck(rowItem.Labels || [], 'Id')\r\n )));\r\n\r\n // finally map each label id to the different state based on whether its all checked\r\n const result = {};\r\n let isShortCycle = true;\r\n _.each(labelsCount, (count, id) => {\r\n if (count === totalCount) {\r\n result[id] = {\r\n Id: id,\r\n state: LabelsSelectorView.CheckState.checked,\r\n transition: LabelsSelectorView.CheckTransition.indeterminateToCheckedShortCycle,\r\n };\r\n } else {\r\n isShortCycle = false;\r\n result[id] = {\r\n Id: id,\r\n state: LabelsSelectorView.CheckState.indeterminate,\r\n transition: LabelsSelectorView.CheckTransition.indeterminateToCheckedFullCycle,\r\n };\r\n }\r\n });\r\n\r\n return {\r\n checkMap: result,\r\n isShortCycle,\r\n };\r\n }\r\n\r\n return {\r\n checkMap: null,\r\n };\r\n}\r\n\r\nfunction updateAssociation({\r\n grid,\r\n selectionInfo,\r\n LabelAssociationView,\r\n isForVNext,\r\n toolbarEditor,\r\n toolbar,\r\n disableDeselectAll,\r\n isManagementRequest,\r\n gridName,\r\n}) {\r\n return (_action, stats) => {\r\n const associationView = new LabelAssociationView({\r\n stats,\r\n selectionInfo,\r\n grid,\r\n isForVNext,\r\n disableDeselectAll,\r\n isManagementRequest,\r\n gridName,\r\n });\r\n\r\n associationView.updateSelectedEntityCount(selectionInfo.selectedRowCount);\r\n\r\n associationView.render();\r\n\r\n associationView.once('hide', () => {\r\n if (isForVNext) {\r\n toolbarEditor.overrideWith(null);\r\n }\r\n associationView.remove();\r\n\r\n toolbarEditor.restoreToolbar();\r\n toolbar.gridToolbarGroup.showAllToolbars();\r\n });\r\n\r\n if (isForVNext) {\r\n toolbarEditor.overrideWith(associationView);\r\n } else {\r\n const $bulkEditContainer = $('#bulkEditContainer');\r\n $bulkEditContainer.html(associationView.el).show();\r\n }\r\n\r\n // make labels column selected if it is not currently\r\n // fetch list of names this way since query does not\r\n // always get patched with list of selected columns\r\n // did this after update so that grid will show latest labels\r\n grid.gridView.once('didUpdate', () => {\r\n const columns = _.map(grid.gridView.get('columns'), ({ name }) => name);\r\n\r\n if (!_.contains(columns, 'Labels')) {\r\n columns.push('Labels');\r\n grid.pgridPlugins.columnChooser.setSelectedColumns(columns);\r\n }\r\n });\r\n };\r\n}\r\n\r\nexport function onCreate({\r\n grid,\r\n selectionInfo,\r\n i18n,\r\n i18nErrors,\r\n LabelAssociationView,\r\n s$label,\r\n instrumentation,\r\n jsdata,\r\n isForVNext,\r\n toolbarEditor,\r\n toolbar,\r\n disableDeselectAll,\r\n edm,\r\n scope,\r\n customerLevelLabelEnabled,\r\n isManagementRequest,\r\n gridName,\r\n}) {\r\n return () => {\r\n const CreateView = decorate(CreateLabelView, {\r\n title: i18n.getString('create_label_dialog_title'),\r\n position: 'center',\r\n popupFront: '.navbar-fixed-top',\r\n closeButtonAriaLabel: i18n.getString('Close'),\r\n });\r\n const createView = new CreateView({\r\n i18n, s$label, i18nErrors, isForVNext,\r\n }).render();\r\n\r\n createView.on('create', (label) => {\r\n create({\r\n jsdata,\r\n label,\r\n entityType: selectionInfo.entityType,\r\n instrumentation,\r\n edm,\r\n scope,\r\n })\r\n .then((results) => {\r\n const labelId = results.value;\r\n const stats = {\r\n added: {\r\n [`${labelId}`]: LabelsSelectorView.CheckState.checked,\r\n },\r\n };\r\n if (customerLevelLabelEnabled) {\r\n const id = JSON.stringify({ Id: labelId, Scope: selectionInfo.entityType === 'Account' ? 'Customer' : 'Account' });\r\n stats.added = { [id]: { id, state: LabelsSelectorView.CheckState.checked } };\r\n }\r\n updateAssociation({\r\n grid,\r\n selectionInfo,\r\n LabelAssociationView,\r\n isForVNext,\r\n toolbarEditor,\r\n toolbar,\r\n disableDeselectAll,\r\n isManagementRequest,\r\n gridName,\r\n })('apply', stats);\r\n })\r\n .then(() => createView.remove())\r\n .catch((res) => {\r\n // todo: this silently fails if the error is not from the server\r\n createView.setErrors(res.errors);\r\n })\r\n .finally(withUiBlock(createView.$el));\r\n });\r\n\r\n createView.on('cancel', () => createView.remove());\r\n };\r\n}\r\n\r\nexport function createLabelSelectorView({\r\n selectionInfo,\r\n grid,\r\n i18n,\r\n i18nErrors,\r\n router,\r\n LabelAssociationView,\r\n dataContextManager,\r\n cacheService,\r\n jsdata,\r\n s$label,\r\n instrumentation,\r\n isForVNext,\r\n toolbarEditor,\r\n toolbar,\r\n edm,\r\n scope,\r\n disableDeselectAll,\r\n customerLevelLabelEnabled,\r\n isManagementRequest,\r\n gridName,\r\n perfMarker,\r\n useSubMenu,\r\n}) {\r\n const { checkMap, isShortCycle } = getCheckMap(selectionInfo);\r\n\r\n let checkAll;\r\n if (selectionInfo && selectionInfo.allPages) {\r\n checkAll = LabelsSelectorView.CheckState.indeterminate;\r\n } else {\r\n checkAll = null;\r\n }\r\n\r\n const labelSelectorView = new LabelsSelectorView({\r\n checkAll,\r\n checkMap,\r\n i18n,\r\n dataContextManager,\r\n cacheService,\r\n jsdata,\r\n isForVNext,\r\n edm,\r\n scope,\r\n customerLevelLabelEnabled,\r\n isManagementRequest,\r\n gridName,\r\n useSubMenu,\r\n });\r\n\r\n if (isForVNext) {\r\n // AS remove it directly from label not work, remove it here for now\r\n // TODO: after new UI GA, remove this from label view\r\n labelSelectorView.$el.removeClass('dropdown-menu');\r\n\r\n // add this for hover experience\r\n let cycleStatusClass = 'tri-state-selector';\r\n if (isShortCycle) {\r\n cycleStatusClass = 'two-state-selector';\r\n }\r\n\r\n labelSelectorView.$el.addClass(cycleStatusClass);\r\n }\r\n\r\n labelSelectorView.on('apply', updateAssociation({\r\n grid,\r\n selectionInfo,\r\n LabelAssociationView,\r\n isForVNext,\r\n toolbarEditor,\r\n toolbar,\r\n disableDeselectAll,\r\n isManagementRequest,\r\n gridName,\r\n }));\r\n labelSelectorView.on('create', onCreate({\r\n grid,\r\n selectionInfo,\r\n i18n,\r\n i18nErrors,\r\n LabelAssociationView,\r\n s$label,\r\n instrumentation,\r\n jsdata,\r\n isForVNext,\r\n toolbarEditor,\r\n toolbar,\r\n disableDeselectAll,\r\n edm,\r\n scope,\r\n customerLevelLabelEnabled,\r\n isManagementRequest,\r\n gridName,\r\n }));\r\n labelSelectorView.on('manage', () => { navigateToManagePage(router); });\r\n\r\n if (perfMarker) {\r\n labelSelectorView.on('request:data:beginning', () => {\r\n perfMarker.willFetchData();\r\n });\r\n labelSelectorView.on('request:data:finished', () => {\r\n perfMarker.willRender();\r\n });\r\n labelSelectorView.on('load:data', () => {\r\n if (!perfMarker.isDone) {\r\n perfMarker.done();\r\n }\r\n });\r\n }\r\n\r\n if (isForVNext) {\r\n const LabelSelectorViewWithFocusLock = focusLockInstanceDecorator(labelSelectorView, {\r\n focusFirstItemOnMount: true,\r\n }, {\r\n managed: true,\r\n });\r\n\r\n return new LabelSelectorViewWithFocusLock();\r\n }\r\n\r\n return labelSelectorView;\r\n}\r\n\r\n","/**\r\n * @file Label plugin for projection grids.\r\n *\r\n */\r\nimport $ from 'jquery';\r\nimport _ from 'underscore';\r\n\r\nimport { createLabelSelectorView } from './create-label-selector-view';\r\n\r\n/**\r\n * Projection grid labels plugin,\r\n * User need to set these things in config\r\n * filterService: the filterService which can get current filter using getCombinedFilter\r\n * labels: {\r\n * i18n { getString }, localization setting\r\n * i18nErrors { getODataErrors }, localization for odata errors\r\n * LabelAssociationView: the label association view, it's sub class of AssociationView\r\n * router: { navigateToRoute }, specify the routing function\r\n * dataContextManager: { getContext } provide function to get context of request\r\n * cacheService: {cache} provide cache function\r\n * instrumentation - instrumentation that already intilized\r\n * and which should contains the senario of label and activity of createLabel\r\n * jsdata\r\n * s$label: schema for label\r\n * @param { object } definePlugin: function pointer used to define plugin for grid\r\n * @returns {void}\r\n */\r\nexport const labelsPlugin = definePlugin => definePlugin('labels', [\r\n 'config',\r\n 'gridView',\r\n 'toolbar',\r\n 'columnChooser',\r\n 'pagination',\r\n 'crossPageSelectAll',\r\n], (config, gridView, toolbar, columnChooser, pagination, crossPageSelectAll) => {\r\n const {\r\n i18n,\r\n i18nErrors,\r\n LabelAssociationView,\r\n router,\r\n dataContextManager,\r\n cacheService,\r\n instrumentation,\r\n jsdata,\r\n s$label,\r\n scope,\r\n edm,\r\n isForVNext = false,\r\n disableDeselectAll = false,\r\n isManagementRequest = undefined,\r\n perfMarker,\r\n } = _.result(config.plugins, 'labels', {});\r\n const appCfg = config.config || { get: () => ({}) };\r\n const { dataSource, filterService } = config;\r\n\r\n let labelSelectorView = null;\r\n let $dropdownContainer = null;\r\n let labelSelectorPerfMarker = null;\r\n const useSubMenu = true; // Add a flag to indicate the change with this flag useSubMenu should be related\r\n const labelDropdownId = 'dropdown-labels';\r\n const toolbarEditor = config.plugins.labels.toolbar ||\r\n toolbar.gridToolbarGroup.toolbarWithItem(labelDropdownId);\r\n\r\n function getEntityName() {\r\n if (!dataSource) {\r\n return undefined;\r\n }\r\n const entityName = dataSource.entity && dataSource.entity.name;\r\n const resourceName = dataSource.resource && dataSource.resource.name;\r\n return entityName || resourceName;\r\n }\r\n\r\n function getSelectionInfo(entityType) {\r\n const info = {\r\n entityType,\r\n scope,\r\n };\r\n\r\n if (crossPageSelectAll.isAllSelected) {\r\n info.allPages = true;\r\n info.selectedRowIds = null;\r\n info.selectedRowCount = gridView.totalCountRows;\r\n } else {\r\n info.allPages = false;\r\n info.selectedItems = gridView.selectedItems().map(x => _.pick(x, 'Id', 'Labels'));\r\n info.selectedRowIds = info.selectedItems.map(x => x.Id);\r\n info.selectedRowCount = info.selectedRowIds.length;\r\n }\r\n\r\n return info;\r\n }\r\n\r\n function createGridObjectForLegacyPlugins() {\r\n return {\r\n gridView,\r\n pgridPlugins: {\r\n pagination,\r\n filterService,\r\n crossPageSelectAll,\r\n columnChooser,\r\n },\r\n };\r\n }\r\n\r\n function showSelector(oldSelector, selectionInfo) {\r\n if (perfMarker) {\r\n labelSelectorPerfMarker = perfMarker.createChild('Label_Selector_View');\r\n labelSelectorPerfMarker.willInit();\r\n }\r\n\r\n const permissions = appCfg.get('Permissions');\r\n const isAccountLabelsEnabled =\r\n permissions && permissions.IsAccountLabelsEnabled;\r\n if (labelSelectorView) {\r\n labelSelectorView.remove();\r\n }\r\n\r\n labelSelectorView = createLabelSelectorView({\r\n grid: createGridObjectForLegacyPlugins(),\r\n selectionInfo,\r\n i18n,\r\n i18nErrors,\r\n router,\r\n LabelAssociationView,\r\n dataContextManager,\r\n cacheService,\r\n jsdata,\r\n s$label,\r\n instrumentation,\r\n isForVNext,\r\n toolbarEditor,\r\n toolbar,\r\n disableDeselectAll,\r\n edm,\r\n scope,\r\n customerLevelLabelEnabled: isAccountLabelsEnabled,\r\n isManagementRequest,\r\n gridName: config.name,\r\n perfMarker: labelSelectorPerfMarker,\r\n useSubMenu,\r\n });\r\n\r\n // useSubMenu, create a subMenu inside the dropdown with search bar and search results\r\n if (useSubMenu) {\r\n // change the role of the dropdown from menu to group\r\n $dropdownContainer.attr('role', 'group');\r\n }\r\n $dropdownContainer.append(labelSelectorView.el);\r\n\r\n labelSelectorView.render();\r\n }\r\n\r\n function unbindDropdownContainerClick() {\r\n if ($dropdownContainer && _.isFunction($dropdownContainer.off)) {\r\n $dropdownContainer.off('click');\r\n }\r\n }\r\n\r\n function setupLabelMenu() {\r\n unbindDropdownContainerClick();\r\n $dropdownContainer = toolbarEditor.$('#dropdown-labels');\r\n const entityName = getEntityName();\r\n\r\n $dropdownContainer.click(() => {\r\n const selectionInfo = getSelectionInfo(entityName);\r\n\r\n if (selectionInfo.selectedRowCount > 0) {\r\n showSelector(null, selectionInfo, gridView);\r\n }\r\n });\r\n }\r\n\r\n function updateToolbar() {\r\n const permissions = appCfg.get('Permissions');\r\n const isAccountLabelsEnabled =\r\n permissions && permissions.IsAccountLabelsEnabled;\r\n let shouldBeDisabled = !gridView || gridView.selectedItems().length === 0;\r\n if (isForVNext) {\r\n shouldBeDisabled = appCfg.get('Permissions').IsReadOnlyUser || (appCfg.get('CurrentAccountInActive') && scope.values.aid !== undefined);\r\n }\r\n\r\n if (isAccountLabelsEnabled) {\r\n shouldBeDisabled = shouldBeDisabled ||\r\n (!crossPageSelectAll.isAllSelected && gridView.selectedItems() && gridView.selectedItems()\r\n .some(item => item.AccountType === 'ManagerAccount'));\r\n }\r\n\r\n const updateToolbarConfig = {\r\n type: 'dropdown',\r\n id: labelDropdownId,\r\n classes: ['btn-secondary'],\r\n button: {\r\n text: i18n.getString('Grid_Labels'),\r\n disabled: shouldBeDisabled,\r\n },\r\n };\r\n\r\n if (isForVNext) {\r\n updateToolbarConfig.iconLeftGlyphName = 'ba-Label';\r\n\r\n updateToolbarConfig.onClick = (event) => {\r\n // click inside label selector, just return\r\n if ($(event.target).closest('.labels-selector').length > 0) {\r\n return;\r\n }\r\n // put labels inside the ul\r\n $dropdownContainer = $('#dropdown-labels').parent().find('ul.dropdown-menu');\r\n const selectionInfo = getSelectionInfo(getEntityName());\r\n\r\n if (selectionInfo.selectedRowCount > 0) {\r\n showSelector(null, selectionInfo, gridView);\r\n }\r\n };\r\n }\r\n toolbarEditor.update(updateToolbarConfig);\r\n }\r\n\r\n updateToolbar();\r\n\r\n // Don't need to redraw toolbar for vnext\r\n if (!isForVNext) {\r\n if (gridView) {\r\n gridView.on('didUpdate', () => {\r\n updateToolbar();\r\n setupLabelMenu();\r\n });\r\n }\r\n }\r\n\r\n function removeView() {\r\n unbindDropdownContainerClick();\r\n\r\n if (labelSelectorView) {\r\n labelSelectorView.remove();\r\n }\r\n }\r\n\r\n\r\n const permissions = appCfg.get('Permissions');\r\n const isAccountLabelsEnabled =\r\n permissions && permissions.IsAccountLabelsEnabled;\r\n\r\n if (isAccountLabelsEnabled) {\r\n gridView.on('didSelect', () => {\r\n updateToolbar();\r\n });\r\n }\r\n return {\r\n remove: removeView,\r\n };\r\n});\r\n","import _ from 'underscore';\r\nimport { formatMetricValue } from '@bingads-webui-campaign/campaignui-common-columns';\r\n\r\nimport headerTemplate from './header.pug';\r\nimport cellTemplate from './cell.pug';\r\n\r\nconst biPattern = /^(Phone)?PerformanceMetrics\\//;\r\nconst phoneBiPattern = /^PhonePerformanceMetrics\\//;\r\nconst biReplacePattern = /PerformanceMetrics\\//;\r\nconst biSubColPrefix = 'PopSubCol';\r\n\r\nfunction getPoPCols(column, popTitles, i18n) {\r\n const prop = column.property;\r\n let propertyKey = _.isString(prop) ? prop : prop.key;\r\n let parentProperty = null;\r\n let isColumnWithFluc = false;\r\n\r\n // Handle performance metric column with fluctuations\r\n if (prop && prop.key && _.isArray(prop.key)) {\r\n propertyKey = _.find(prop.key, key => biPattern.test(key));\r\n parentProperty = prop;\r\n isColumnWithFluc = true;\r\n }\r\n\r\n const columnWithFlucTemplate = ({ value }) => {\r\n // eslint-disable-next-line max-len\r\n // Hack here: Columns with fluctuation are used in [Clics, Impressions, Spend]. Only Spend's format is decimal. Spend column in performance grid is called TotalEffectiveCost.\r\n const format = column.name === 'Spend' || column.name === 'TotalEffectiveCost' ? 'decimal' : 'integer';\r\n return cellTemplate({ value: formatMetricValue({ i18n, format, metricValue: value }) });\r\n };\r\n\r\n const { subColumns = {}, template: parentTemplate, ...parentColumn } = column;\r\n\r\n const primaryName = `${biSubColPrefix}${column.name}`;\r\n const primary = _.defaults({\r\n name: primaryName,\r\n property: parentProperty || propertyKey,\r\n helpId: null,\r\n title: popTitles.primary,\r\n width: column[`${biSubColPrefix}Width`],\r\n headAttributes: _.defaults(\r\n { 'aria-label': popTitles.primary },\r\n { 'data-column': primaryName },\r\n { style: `width: ${column[`${biSubColPrefix}Width`]}px` },\r\n column.headAttributes || {}\r\n ),\r\n bodyAttributes: {\r\n 'data-column': primaryName,\r\n style: `width: ${column[`${biSubColPrefix}Width`]}px`,\r\n },\r\n template: parentTemplate,\r\n }, subColumns[primaryName], parentColumn);\r\n\r\n const compareName = `Compared${column.name}`;\r\n const compare = _.defaults({\r\n name: compareName,\r\n property: phoneBiPattern.test(propertyKey) ?\r\n propertyKey.replace(phoneBiPattern, 'PhonePeriodPerformanceMetrics/') :\r\n `Period${propertyKey}`,\r\n helpId: null,\r\n width: column.ComparedWidth,\r\n title: popTitles.compared,\r\n sortable: _.defaults({\r\n key: `PoP${propertyKey}`,\r\n }, column.sortable),\r\n headAttributes: _.defaults(\r\n { 'aria-label': popTitles.compared },\r\n { 'data-column': compareName },\r\n { style: `width: ${column.ComparedWidth}px` },\r\n column.headAttributes || {}\r\n ),\r\n bodyAttributes: {\r\n 'data-column': compareName,\r\n style: `width: ${column.ComparedWidth}px`,\r\n },\r\n template: isColumnWithFluc ? columnWithFlucTemplate : parentTemplate,\r\n }, subColumns[compareName], parentColumn);\r\n\r\n let property = propertyKey.replace(biReplacePattern, 'PerformanceMetricsChange/');\r\n const changeTitle = i18n.getString('PoP_Sub_Title_Change');\r\n const changeName = `${column.name}Change`;\r\n const change = _.defaults({\r\n name: changeName,\r\n property,\r\n helpId: 'pop_BA_Reporting_Clarity_POPChange',\r\n title: changeTitle,\r\n width: column.ChangeWidth,\r\n helpAriaLabel: i18n.getString(_TL_('Click to learn more about {{item}}'), { item: changeTitle }),\r\n sortable: _.defaults({\r\n key: `PoP${property}`,\r\n }, column.sortable),\r\n headAttributes: _.defaults(\r\n { 'aria-label': changeTitle },\r\n { 'data-column': changeName },\r\n { style: `width: ${column.ChangeWidth}px` },\r\n column.headAttributes || {}\r\n ),\r\n bodyAttributes: {\r\n 'data-column': changeName,\r\n style: `width: ${column.ChangeWidth}px`,\r\n },\r\n template: isColumnWithFluc ? columnWithFlucTemplate : parentTemplate,\r\n }, subColumns[changeName], parentColumn);\r\n\r\n property = propertyKey.replace(biReplacePattern, 'PerformanceMetricsChangePercentage/');\r\n const changePercentTitle = i18n.getString('PoP_Sub_Title_Change_Percentage');\r\n const changePercentName = `${column.name}ChangePercentage`;\r\n const changePercent = _.defaults({\r\n name: changePercentName,\r\n property,\r\n helpId: 'pop_BA_Reporting_Clarity_POPChangePercent',\r\n title: changePercentTitle,\r\n width: column.PopSubColWidth,\r\n helpAriaLabel: i18n.getString(_TL_('Click to learn more about {{item}}'), { item: changePercentTitle }),\r\n sortable: _.defaults({\r\n key: `PoP${property}`,\r\n }, column.sortable),\r\n headAttributes: _.defaults(\r\n { 'aria-label': changePercentTitle },\r\n { 'data-column': changePercentName },\r\n { style: `width: ${column.ChangePercentageWidth}px` },\r\n column.headAttributes || {}\r\n ),\r\n bodyAttributes: {\r\n 'data-column': changePercentName,\r\n style: `width: ${column.ChangePercentageWidth}px`,\r\n },\r\n template: ({ value }) => {\r\n let formatted;\r\n // Show ∞ instead of NaN.00% if MT returns double.MaxValue or float.MaxValue\r\n if (value > 3.4e+38) {\r\n formatted = '∞';\r\n } else {\r\n formatted = i18n.formatPercent(value / 100, {\r\n maximumFractionDigits: 2,\r\n minimumFractionDigits: 2,\r\n });\r\n }\r\n return cellTemplate({ value: formatted });\r\n },\r\n }, subColumns[changePercentName], parentColumn);\r\n\r\n const columns = [primary, compare, change, changePercent];\r\n\r\n return _.map(columns, col => _.defaults({\r\n html: headerTemplate(col),\r\n }, col));\r\n}\r\n\r\nfunction getPopTitles(dateRange) {\r\n const primary = dateRange.formatedStart === dateRange.formatedEnd\r\n && dateRange.RangeStartDate === dateRange.RangeEndDate ?\r\n dateRange.startDate || dateRange.RangeStartDate :\r\n `${dateRange.formatedStart || dateRange.RangeStartDate} - ${dateRange.formatedEnd || dateRange.RangeEndDate}`;\r\n const compared = dateRange.compared.formattedStart === dateRange.compared.formattedEnd ?\r\n dateRange.compared.formattedStart :\r\n `${dateRange.compared.formattedStart} - ${dateRange.compared.formattedEnd}`;\r\n\r\n return { primary, compared };\r\n}\r\n\r\nfunction updateSubCols(columnsCur, expandedCols, popTitles, i18n) {\r\n return _.map(columnsCur, (column) => {\r\n if (_.contains(expandedCols, column.name)) {\r\n return _.defaults({ columns: getPoPCols(column, popTitles, i18n) }, column);\r\n } else if (biPattern.test(column.property)) {\r\n return _.omit(column, 'columns');\r\n } else if (column.columns && column.columns.length > 0) {\r\n return _.defaults({ columns: updateSubCols(column.columns, expandedCols) }, column);\r\n }\r\n\r\n return column;\r\n });\r\n}\r\n\r\nexport default {\r\n name: 'popColumns',\r\n handler: function popColumns(state, { expandedCols, dateRange, i18n } = {}) {\r\n const isComparing = Boolean(dateRange.compared);\r\n const expanded = isComparing ? expandedCols : [];\r\n const popTitles = isComparing ? getPopTitles(dateRange) : null;\r\n\r\n const columns = updateSubCols(state.columns, expanded, popTitles, i18n);\r\n\r\n return _.defaults({\r\n columns,\r\n popStatus: { isComparing },\r\n }, state);\r\n },\r\n defaults: {\r\n expandedCols: [],\r\n dateRange: {},\r\n },\r\n};\r\n","import _ from 'underscore';\r\nimport popHeaderTemplate from './period-over-period-header.pug';\r\n\r\nconst biPattern = /^(Phone)?PerformanceMetrics\\//;\r\nconst biSubColPattern = /^PopSubCol/;\r\nexport const biSubColPrefix = 'PopSubCol';\r\n\r\nfunction groupHandler(e) {\r\n const name = this.$(e.target).closest('th, .th').attr('data-name');\r\n const popColumnsCur = this.get('popColumns');\r\n const popColumns = _.defaults({\r\n expandedCols: _.contains(popColumnsCur.expandedCols, name) ?\r\n _.without(popColumnsCur.expandedCols, name) :\r\n _.union(popColumnsCur.expandedCols, [name]),\r\n }, popColumnsCur);\r\n\r\n const sortableHeaderCur = this.get('sortableHeader') || {};\r\n let sortableHeader = null;\r\n\r\n if (sortableHeaderCur.name === name) {\r\n sortableHeader = _.defaults({ name: `${biSubColPrefix}${name}` }, sortableHeaderCur);\r\n } else if (sortableHeaderCur.name === `${biSubColPrefix}${name}`) {\r\n sortableHeader = _.defaults({ name }, sortableHeaderCur);\r\n }\r\n\r\n if (sortableHeader) {\r\n this.set({ sortableHeader });\r\n }\r\n\r\n e.stopPropagation();\r\n\r\n this.set({ popColumns });\r\n\r\n // This is a workaround for the column alignment issue on IE\r\n // After redrawing the table with new column set, IE and Edge doesn't relayout\r\n // the table correctly. We need to reattach the table to DOM to force relayout\r\n this.once('didUpdate', () => { // eslint-disable-line no-invalid-this\r\n const elTable = this.$('table').get(-1); // eslint-disable-line no-invalid-this\r\n\r\n if (elTable) {\r\n elTable.parentElement.appendChild(elTable);\r\n }\r\n });\r\n}\r\n\r\nfunction isPoPColumn(column) {\r\n return column &&\r\n !biSubColPattern.test(column.name) &&\r\n column.property &&\r\n biPattern.test(column.property.key);\r\n}\r\n\r\nexport const popHeader = {\r\n name: 'popHeader',\r\n handler: function popHeader(state, { i18n }) {\r\n const patch = {};\r\n\r\n if (state.popStatus.isComparing) {\r\n patch.headRows = _.map(state.headRows, (row) => {\r\n let isPopHeaderRow = false;\r\n const patchRow = {};\r\n\r\n patchRow.cells = _.map(row.cells, (cell) => {\r\n const patchCell = {};\r\n const column = state.columnGroup.columnIndex[cell.name];\r\n\r\n if (isPoPColumn(column)) {\r\n const expanded = column.columns && column.columns.length > 0;\r\n\r\n patchCell.html = popHeaderTemplate({\r\n html: cell.html,\r\n icon: expanded ? 'minus' : 'plus',\r\n ariaLabel:\r\n expanded ? i18n.getString(_TL_('Click to minimize column {{columnName}}'), { columnName: column.title })\r\n : i18n.getString(_TL_('Click to expand column {{columnName}}'), { columnName: column.title }),\r\n });\r\n\r\n if (expanded) {\r\n patchCell.classes = _.chain(cell.classes)\r\n .without('text-left', 'text-right')\r\n .union(['text-center', 'pop-column-header'])\r\n .value();\r\n } else {\r\n patchCell.classes = _.union(cell.classes, ['pop-column-header']);\r\n }\r\n\r\n isPopHeaderRow = true;\r\n } else if (isPoPColumn(_.result(column, 'parent'))) {\r\n patchCell.classes = _.union(cell.classes, ['pop-column-header']);\r\n isPopHeaderRow = true;\r\n }\r\n\r\n return _.defaults(patchCell, cell);\r\n });\r\n\r\n if (isPopHeaderRow) {\r\n patchRow.classes = _.union(row.classes, ['pop-enabled']);\r\n }\r\n\r\n return _.defaults(patchRow, row);\r\n });\r\n\r\n patch.events = _.defaults({\r\n 'click span.pop-toggle-icon': groupHandler,\r\n }, state.events);\r\n }\r\n\r\n return _.defaults(patch, state);\r\n },\r\n};\r\n","import _ from 'underscore';\r\nimport popColumns from './projection/period-over-period-columns';\r\nimport { biSubColPrefix, popHeader } from './projection/period-over-period-header';\r\n\r\nexport const periodOverPeriodPlugin = definePlugin => definePlugin('popColumns', [\r\n 'config',\r\n 'gridView',\r\n 'dateFilter',\r\n], (\r\n config,\r\n gridView,\r\n dateFilter\r\n) => {\r\n const pluginConfig = _.result(config.plugins, 'popColumns', {});\r\n const { i18n } = pluginConfig;\r\n\r\n const sortableHeaderCur = gridView.get('sortableHeader') || {};\r\n\r\n if (sortableHeaderCur.name && sortableHeaderCur.name.indexOf(biSubColPrefix) === 0) {\r\n const sortableHeader = _.defaults({\r\n name: sortableHeaderCur.name.slice(biSubColPrefix.length),\r\n }, sortableHeaderCur);\r\n gridView.set({ sortableHeader });\r\n }\r\n\r\n gridView.set({\r\n popHeader: {\r\n i18n,\r\n },\r\n });\r\n\r\n dateFilter.p$getCurrentDateRange().then((dateRange) => {\r\n gridView.set({\r\n popColumns: {\r\n expandedCols: [],\r\n dateRange,\r\n i18n,\r\n },\r\n });\r\n\r\n gridView.pipeStructureProjections(popColumns);\r\n gridView.pipeContentProjections(popHeader);\r\n });\r\n\r\n dateFilter.events.on('dateChange', () => {\r\n gridView.once('didReload', () => {\r\n const popColumnsConfig = gridView.get('popColumns');\r\n\r\n gridView.set({\r\n popColumns: _.defaults({\r\n dateRange: dateFilter.getCurrentDateRange(),\r\n }, popColumnsConfig),\r\n });\r\n });\r\n });\r\n});\r\n","import _ from 'underscore';\r\nimport { get, set } from '@bingads-webui-universal/primitive-utilities';\r\n\r\nconst biPattern = /^(Phone)?PerformanceMetrics\\//;\r\nconst isBiColumn = (column) => {\r\n let key;\r\n\r\n if (_.isString(column.property)) {\r\n key = column.property;\r\n } else if (column.property) {\r\n ({ key } = column.property);\r\n key = _.isArray(key) && key.length > 0 ? key[0] : key;\r\n }\r\n\r\n return biPattern.test(key);\r\n};\r\n\r\nconst appendSegmentFlag = (property) => {\r\n if (_.isFunction(property)) {\r\n return model => ({\r\n IsSegmentRow: model.IsSegmentRow,\r\n property: {\r\n value: property(model),\r\n },\r\n });\r\n } else if (_.isObject(property) && _.isFunction(property.get)) {\r\n return _.defaults({\r\n get: model => ({\r\n IsSegmentRow: model.IsSegmentRow,\r\n property: {\r\n value: property.get(model),\r\n },\r\n }),\r\n }, property);\r\n } else if (_.isString(property)) {\r\n return {\r\n get: model => ({\r\n IsSegmentRow: model.IsSegmentRow,\r\n property: {\r\n value: get(model, property.replace(/\\//g, '.')),\r\n },\r\n }),\r\n key: property,\r\n };\r\n }\r\n\r\n throw new Error('unknown property type.');\r\n};\r\n\r\nconst segmentConfig = [{\r\n segArray: 'PerformanceMetrics.SegmentedData',\r\n from: 'Key[0].StringValue',\r\n to: 'SegmentValue',\r\n}, {\r\n segArray: 'PerformanceMetrics.SegmentedData',\r\n from: 'Key[0].SegmentationType',\r\n to: 'SegmentationType',\r\n}, {\r\n segArray: 'PerformanceMetrics.SegmentedData',\r\n from: 'Data',\r\n to: 'PerformanceMetrics',\r\n}, {\r\n segArray: 'PeriodPerformanceMetrics.SegmentedData',\r\n from: 'Data',\r\n to: 'PeriodPerformanceMetrics',\r\n}, {\r\n segArray: 'PerformanceMetricsChange.SegmentedData',\r\n from: 'Data',\r\n to: 'PerformanceMetricsChange',\r\n}, {\r\n segArray: 'PerformanceMetricsChangePercentage.SegmentedData',\r\n from: 'Data',\r\n to: 'PerformanceMetricsChangePercentage',\r\n}, {\r\n segArray: 'PhonePerformanceMetrics.SegmentedData',\r\n from: 'Data',\r\n to: 'PhonePerformanceMetrics',\r\n}, {\r\n segArray: 'PhonePeriodPerformanceMetrics.SegmentedData',\r\n from: 'Data',\r\n to: 'PhonePeriodPerformanceMetrics',\r\n}, {\r\n segArray: 'PhonePerformanceMetricsChange.SegmentedData',\r\n from: 'Data',\r\n to: 'PhonePerformanceMetricsChange',\r\n}, {\r\n segArray: 'PhonePerformanceMetricsChangePercentage.SegmentedData',\r\n from: 'Data',\r\n to: 'PhonePerformanceMetricsChangePercentage',\r\n}];\r\n\r\nfunction isAggregateRow(row) {\r\n return !!(_.result(row.item, '$total', false) || _.result(row.item, 'AggregateName', false));\r\n}\r\n\r\nexport default {\r\n name: 'segment',\r\n handler: function segment(state, { expandedAggregate = [] } = {}) {\r\n const columns = _.map(state.columns, (column) => {\r\n if (isBiColumn(column)) {\r\n return column;\r\n }\r\n\r\n return _.defaults({\r\n property: appendSegmentFlag(column.property || column.name),\r\n template: (prop) => {\r\n if (prop.value.IsSegmentRow) {\r\n return ' ';\r\n }\r\n\r\n return _.isFunction(column.template) ? column.template(prop.value.property) : undefined;\r\n },\r\n }, column);\r\n });\r\n\r\n const bodyRows = _.reduce(state.bodyRows.slice(), (memo, row) => {\r\n let result = memo;\r\n const r = _.extend({}, row);\r\n\r\n const segs = _.reduce(segmentConfig, (m, { segArray, from, to }) => {\r\n const toSeg = get(row.item, segArray);\r\n const rowType = _.result(row.item, '$total', {}).type;\r\n const segsInRow = m.slice();\r\n\r\n if (toSeg && toSeg.length > 0) {\r\n if (!isAggregateRow(row) ||\r\n _.contains(expandedAggregate, rowType || row.item.AggregateName)) {\r\n _.each(toSeg, (obj, index) => {\r\n segsInRow[index] = segsInRow[index] || {};\r\n segsInRow[index].classes = segsInRow[index].classes || r.classes || [];\r\n segsInRow[index].item = segsInRow[index].item || {};\r\n set(segsInRow[index].item, to, get(obj, from));\r\n segsInRow[index].item.IsSegmentRow = true;\r\n });\r\n }\r\n\r\n r.item = _.defaults({\r\n HasSegmentRow: true,\r\n }, r.item);\r\n }\r\n\r\n return segsInRow;\r\n }, []);\r\n\r\n result = result.concat(r);\r\n result = result.concat(segs);\r\n return result;\r\n }, []);\r\n\r\n return _.defaults({ bodyRows, columns }, state);\r\n },\r\n defaults: {},\r\n};\r\n","import _ from 'underscore';\r\nimport { localizeSegmentationValue } from '@bingads-webui-campaign/segmentation-utilities';\r\nimport defaultTemplate from './segment-value-cell-default.pug';\r\n\r\nfunction toggleAggregateSeg(e) {\r\n const name = this.$(e.target).closest('tr, .tr').attr('data-aggregate-name'); // eslint-disable-line no-invalid-this\r\n const segmentCur = this.get('segment'); // eslint-disable-line no-invalid-this\r\n const expandedAggregateCur = segmentCur.expandedAggregate;\r\n const expandedAggregate = _.contains(expandedAggregateCur, name) ?\r\n _.without(expandedAggregateCur, name) :\r\n _.union(expandedAggregateCur, [name]);\r\n\r\n this.set({\r\n segment: _.defaults({ expandedAggregate }, segmentCur),\r\n });\r\n}\r\n\r\nfunction isAggregateRow(row) {\r\n return !!(_.result(row.item, '$total', false) || _.result(row.item, 'AggregateName', false));\r\n}\r\n\r\nfunction translateSegRow(columnGroup, r, index, segmentCellStyleConfig, segmentConfig) {\r\n let row = _.extend({}, r);\r\n\r\n if (_.result(row.item, 'IsSegmentRow', false) || isAggregateRow(row)) {\r\n const patch = {};\r\n\r\n patch.cells = _.map(columnGroup.leafColumns, (col, colIndex) => {\r\n if (_.has(segmentCellStyleConfig.cellTemplates, col.name)) {\r\n let newHtml = null;\r\n const template = segmentCellStyleConfig.cellTemplates[col.name] === 'default' ?\r\n defaultTemplate :\r\n segmentCellStyleConfig.cellTemplates[col.name];\r\n\r\n if (isAggregateRow(row)) {\r\n const rowType = _.result(row.item, '$total', {}).type;\r\n const expanded = _.contains(segmentConfig.expandedAggregate, rowType ||\r\n row.item.AggregateName);\r\n\r\n const value = _.result(row.item, '$total', {}).text || row.item.AggregateName;\r\n\r\n newHtml = template({\r\n value,\r\n isAggregate: true,\r\n hasSegment: row.item.HasSegmentRow && !row.item.isTopAggregate,\r\n expanded,\r\n helpId: _.result(row.item, '$total', {}).helpId,\r\n helpAriaLabel: segmentCellStyleConfig.i18n.getString(_TL_('Click to learn more about {{item}}'), { item: value }),\r\n });\r\n } else {\r\n newHtml = template({\r\n value: localizeSegmentationValue({\r\n i18n: segmentCellStyleConfig.i18n,\r\n type: row.item.SegmentationType,\r\n value: row.item.SegmentValue,\r\n }),\r\n });\r\n }\r\n return _.defaults({\r\n html: newHtml,\r\n }, row.cells[colIndex]);\r\n }\r\n\r\n return row.cells[colIndex];\r\n });\r\n\r\n if (_.result(row.item, 'IsSegmentRow', false)) {\r\n row.classes = row.classes.concat('segment-row');\r\n } else {\r\n row = _.defaults({\r\n attributes: _.defaults({\r\n 'data-aggregate-name': _.result(row.item, '$total', {}).type || row.item.AggregateName,\r\n }, row.attributes),\r\n }, row);\r\n }\r\n\r\n return _.defaults(patch, row);\r\n }\r\n\r\n return row;\r\n}\r\n\r\nexport default {\r\n name: 'segmentCellStyle',\r\n handler: function segmentCellStyle(state, segmentCellStyleConfig) {\r\n const { columnGroup } = state;\r\n const segmentConfig = this.get('segment'); // eslint-disable-line no-invalid-this\r\n\r\n const bodyRows = {\r\n length: state.bodyRows.length,\r\n slice: (begin = 0, end = state.bodyRows.length) => state.bodyRows.slice(begin, end)\r\n .map((row, index) => translateSegRow(\r\n columnGroup,\r\n row,\r\n index + begin,\r\n segmentCellStyleConfig,\r\n segmentConfig\r\n )),\r\n };\r\n\r\n const events = _.defaults({\r\n 'click .aggregate-row td .glyphicon-triangle-right, .aggregate-row .td .glyphicon-triangle-right': toggleAggregateSeg,\r\n 'click .aggregate-row td .glyphicon-triangle-bottom, .aggregate-row .td .glyphicon-triangle-bottom': toggleAggregateSeg,\r\n 'click .aggregated-row td .glyphicon-triangle-right, .aggregated-row .td .glyphicon-triangle-right': toggleAggregateSeg,\r\n 'click .aggregated-row td .glyphicon-triangle-bottom, .aggregated-row .td .glyphicon-triangle-bottom': toggleAggregateSeg,\r\n }, state.events);\r\n\r\n return _.defaults({\r\n bodyRows,\r\n events,\r\n }, state);\r\n },\r\n defaults: {},\r\n};\r\n","import Backbone from 'backbone';\r\nimport template from './segment-alert.pug';\r\n\r\nexport default class View extends Backbone.View {\r\n get events() {\r\n return {\r\n 'click input.btn-default': '_ok',\r\n };\r\n }\r\n\r\n _ok() {\r\n this.trigger('ok');\r\n }\r\n\r\n render({\r\n segType,\r\n i18n,\r\n }) {\r\n this.$el.html(template({\r\n i18n,\r\n segmentationType: segType,\r\n }));\r\n\r\n return this;\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport { decorate } from '@bingads-webui/dialog';\r\nimport {\r\n getSupportedSegmentationTree,\r\n isSegmentationTypeSupported,\r\n isTimeRangeValid,\r\n localizeSegmentationType,\r\n campaignSegmentationTypeEnum,\r\n} from '@bingads-webui-campaign/segmentation-utilities';\r\nimport { get } from '@bingads-webui-universal/primitive-utilities';\r\nimport segment from './projection/segment';\r\nimport segmentCellStyle from './projection/segment-cell-style';\r\nimport segmentAlert from './segment-alert';\r\n\r\nfunction changeEntitySet(queryParams, segType, edm) {\r\n const { options } = queryParams;\r\n const entitySet = edm.root.identifyEntitySet(options.entitySet.toJSON());\r\n\r\n const action = entitySet.navigation.source;\r\n const gridDataParameters = segType ?\r\n _.defaults({\r\n SegmentationTypes: [segType],\r\n }, entitySet.navigation.parameters.gridDataParameters) :\r\n _.omit(entitySet.navigation.parameters.gridDataParameters, 'SegmentationTypes');\r\n const parameters = _.defaults({ gridDataParameters }, entitySet.navigation.parameters);\r\n\r\n return _.defaults({\r\n options: _.defaults({\r\n entitySet: action.$call(parameters),\r\n }, options),\r\n }, queryParams);\r\n}\r\n\r\nfunction changeQueryParams(queryParams, segType) {\r\n const query = segType ? _.defaults({ SegmentationTypes: segType }, queryParams.query) : _.omit(queryParams.query, 'SegmentationTypes');\r\n\r\n return _.defaults({\r\n query,\r\n }, queryParams);\r\n}\r\n\r\nfunction updateSource(gridView, segType, isOdataActionSource, edm, isDataFetchManagerSource) {\r\n if (isDataFetchManagerSource) {\r\n gridView.refresh(true);\r\n } else {\r\n const type = segType && segType !== 'None' ? segType : null;\r\n const curQuery = gridView.get('query');\r\n const query = isOdataActionSource ?\r\n changeEntitySet(changeQueryParams(curQuery, type), type, edm) :\r\n changeQueryParams(curQuery, type);\r\n\r\n gridView.set({ query });\r\n }\r\n}\r\n\r\nexport const segmentPlugin = definePlugin => definePlugin('segment', [\r\n 'config',\r\n 'gridView',\r\n 'toolbar',\r\n 'dateFilter',\r\n], (config, gridView, toolbar, dateFilter) => {\r\n const menuId = 'dropdown-segment';\r\n const toolbarEditor = toolbar.gridToolbarGroup.toolbarWithItem(menuId);\r\n const pluginConfig = _.result(config.plugins, 'segment', {});\r\n const {\r\n isOdataActionSource,\r\n permissions,\r\n edm,\r\n i18n,\r\n setSegType,\r\n timeRangeValidationEnabled = true,\r\n instrumentation,\r\n getSegType,\r\n } = pluginConfig;\r\n const {\r\n currentScenario,\r\n isDataFetchManagerSource,\r\n } = config;\r\n let { segmentationTypes = campaignSegmentationTypeEnum } = pluginConfig;\r\n\r\n let activity;\r\n if (instrumentation) {\r\n const scenario = instrumentation.default.segmentMenu.create(currentScenario);\r\n\r\n activity = scenario.segmentMenu.create();\r\n }\r\n\r\n function logTrace(msg) {\r\n if (activity) {\r\n activity.trace(msg, 'segment');\r\n }\r\n }\r\n\r\n function validateSegmentType(segType) {\r\n if (timeRangeValidationEnabled &&\r\n !isTimeRangeValid(segType, dateFilter.getCurrentDateRange())) {\r\n const SegmentAlertDialog = decorate(segmentAlert);\r\n let segAlertView = new SegmentAlertDialog({\r\n dialogOptions: {\r\n title: i18n.getString('Segment_Time_Invalid_Alert_Title'),\r\n titleHeadingLevel: 2,\r\n maxWidth: 658,\r\n closeButtonAriaLabel: i18n.getString(_TL_('Close')),\r\n },\r\n segType,\r\n i18n,\r\n }).render();\r\n\r\n segAlertView.center();\r\n\r\n setTimeout(() => {\r\n // The segment menu will get the focus first, delay this behavior to acquire the focus\r\n const dialogConfirmButton = document.querySelector('.segment-alert-ok input');\r\n if (dialogConfirmButton) {\r\n dialogConfirmButton.focus();\r\n }\r\n }, 0);\r\n\r\n segAlertView.bind('ok', () => {\r\n segAlertView.destroy();\r\n segAlertView = null;\r\n\r\n const menuButton = document.querySelector(`#${menuId}`);\r\n if (menuButton) {\r\n menuButton.focus();\r\n }\r\n });\r\n\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n function applySegment(segType) {\r\n return () => {\r\n if (validateSegmentType(segType)) {\r\n logTrace(`apply segment ${segType}`);\r\n const menu = getSegmentMenu(segType); // eslint-disable-line\r\n\r\n toolbarEditor.update(menu);\r\n\r\n setSegType(config.name, segType);\r\n\r\n updateSource(gridView, segType, isOdataActionSource, edm, isDataFetchManagerSource);\r\n } else {\r\n logTrace('failed to segment');\r\n }\r\n };\r\n }\r\n\r\n function getSegmentType() {\r\n if (isDataFetchManagerSource) {\r\n return get(getSegType(config.name), 'segmentationType', 'None');\r\n } else if (pluginConfig.isOdataActionSource) {\r\n return _.chain(gridView.get('queryParams'))\r\n .result('options')\r\n .result('entitySet')\r\n .result('navigation')\r\n .result('parameters')\r\n .result('gridDataParameters')\r\n .result('SegmentationTypes')\r\n .first()\r\n .value() || 'None';\r\n }\r\n\r\n return _.chain(gridView.get('query'))\r\n .result('query')\r\n .result('SegmentationTypes', 'None')\r\n .value();\r\n }\r\n\r\n function setSegmentType(segmentType, overrideSegmentationTypes) {\r\n if (overrideSegmentationTypes) {\r\n segmentationTypes = overrideSegmentationTypes;\r\n }\r\n const setter = applySegment(segmentType);\r\n\r\n setter();\r\n }\r\n\r\n function getAvailableSegmentationTypes() {\r\n return segmentationTypes;\r\n }\r\n\r\n function getSegmentMenu(segType) {\r\n function getMenuItem(seg) {\r\n const itemConfig = {\r\n text: localizeSegmentationType({ i18n, type: seg }),\r\n onClick: applySegment(seg),\r\n classes: [seg],\r\n };\r\n\r\n _.extend(itemConfig, {\r\n iconLeftGlyphName: segType === seg ? 'ba-CheckMark' : '',\r\n });\r\n return itemConfig;\r\n }\r\n\r\n const itemClasses = {\r\n Time: 'segment-time-sub-menu',\r\n Audience: 'segment-audience-type-sub-menu',\r\n Goal: 'segment-goal-type-sub-menu',\r\n };\r\n const segmentMenu = {\r\n iconLeftGlyphName: 'ba-SegmentInsights',\r\n type: 'dropdown',\r\n id: menuId,\r\n button: {\r\n text: i18n.getString('Segment_Dropdown_Title'),\r\n },\r\n ariaLabel: i18n.getString('Segment_Dropdown_Title'),\r\n menu: {\r\n items: _.map(getSupportedSegmentationTree({\r\n permissions,\r\n segmentationTypes,\r\n }), ({ children, name }) => {\r\n if (children) {\r\n const childMenuItems = _.map(children, childItem => getMenuItem(childItem.name));\r\n\r\n const isChild = _.any(children, childItem => childItem.name === segType);\r\n\r\n const menuItemWithChildren = {\r\n type: 'dropdown-submenu',\r\n button: {\r\n text: localizeSegmentationType({ i18n, type: name }),\r\n classes: [itemClasses[name]],\r\n },\r\n menu: {\r\n items: childMenuItems,\r\n },\r\n };\r\n\r\n _.extend(menuItemWithChildren.button, {\r\n iconLeftGlyphName: isChild ? 'ba-CheckMark' : '',\r\n });\r\n\r\n return menuItemWithChildren;\r\n }\r\n\r\n return getMenuItem(name);\r\n }),\r\n },\r\n };\r\n\r\n return segmentMenu;\r\n }\r\n\r\n function resetMenu() {\r\n const menu = getSegmentMenu('None');\r\n\r\n toolbarEditor.update(menu);\r\n }\r\n\r\n const cellTemplates = _.result(pluginConfig, 'cellTemplates', {});\r\n\r\n gridView.pipeStructureProjections(segment);\r\n gridView.pipeContentProjections(segmentCellStyle);\r\n\r\n gridView.set({\r\n segmentCellStyle: {\r\n cellTemplates,\r\n i18n,\r\n },\r\n });\r\n\r\n dateFilter.events.on('dateChange', () => {\r\n const curSegType = getSegmentType();\r\n\r\n if (curSegType && timeRangeValidationEnabled &&\r\n !isTimeRangeValid(curSegType, dateFilter.getCurrentDateRange())) {\r\n setSegType(config.name, 'None');\r\n updateSource(gridView, null, isOdataActionSource, edm, isDataFetchManagerSource);\r\n resetMenu();\r\n }\r\n });\r\n\r\n let segTypeInit = getSegType ?\r\n get(getSegType(config.name), 'segmentationType', 'None') :\r\n _.chain({})\r\n .defaults(config.query)\r\n .defaults(config.dataSource)\r\n .result('query')\r\n .result('SegmentationTypes', 'None')\r\n .value();\r\n\r\n if (!isSegmentationTypeSupported({ permissions, type: segTypeInit })) {\r\n segTypeInit = 'None';\r\n }\r\n\r\n logTrace(`init segment type is ${segTypeInit}`);\r\n updateSource(gridView, segTypeInit, isOdataActionSource, edm, isDataFetchManagerSource);\r\n const menu = getSegmentMenu(segTypeInit);\r\n\r\n toolbarEditor.update(menu);\r\n gridView.model.trigger('change');\r\n\r\n return {\r\n getSegmentType,\r\n setSegmentType,\r\n getAvailableSegmentationTypes,\r\n validateSegmentType,\r\n };\r\n});\r\n\r\n// when grid use the 'aggregatedRows', 'segment' plugin at the same time,\r\n// need use the 'arrgeratedRows' firstly.\r\nsegmentPlugin.softDependencies = ['aggregatedRows'];\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 (ariaLabel, customHelpContent, helpId, i18n, title) {pug_html = pug_html + \"\\u003Cspan class=\\\"grid-header-text\\\"\\u003E\" + (pug.escape(null == (pug_interp = title) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\";\nif (helpId) {\npug_html = pug_html + \"\\u003Cspan class=\\\"grid-header-helpId\\\"\\u003E\\u003Ca\" + (\" class=\\\"helpbutton\\\"\"+\" type=\\\"helppopup\\\" tabindex=\\\"0\\\"\"+pug.attr(\"topic\", helpId, true, true)+pug.attr(\"data-help\", true, true, true)+\" onclick=\\\"PopupController.PopupJsClick(this)\\\" href=\\\"javascript:void(0);\\\" role=\\\"button\\\"\"+pug.attr(\"aria-label\", ariaLabel, true, true)+pug.attr(\"content\", customHelpContent, true, true)) + \"\\u003E\\u003C\\u002Fa\\u003E\\u003C\\u002Fspan\\u003E\";\n}\npug_html = pug_html + \"\\u003Cdiv class=\\\"label-header-divider\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Ca\" + (\" class=\\\"manage-labels-button\\\"\"+pug.attr(\"title\", i18n.getString('label_selector_action_manage'), true, true)+\" href=\\\"javascript:void(0);\\\" role=\\\"button\\\" tabindex=\\\"0\\\"\"+pug.attr(\"aria-label\", i18n.getString('label_selector_action_manage'), true, true)) + \"\\u003E\\u003C\\u002Fa\\u003E\";}.call(this,\"ariaLabel\" in locals_for_with?locals_for_with.ariaLabel:typeof ariaLabel!==\"undefined\"?ariaLabel:undefined,\"customHelpContent\" in locals_for_with?locals_for_with.customHelpContent:typeof customHelpContent!==\"undefined\"?customHelpContent:undefined,\"helpId\" in locals_for_with?locals_for_with.helpId:typeof helpId!==\"undefined\"?helpId:undefined,\"i18n\" in locals_for_with?locals_for_with.i18n:typeof i18n!==\"undefined\"?i18n:undefined,\"title\" in locals_for_with?locals_for_with.title:typeof title!==\"undefined\"?title: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 (IsAggregateRow, Labels, ShowViewMoreLink, TotalLength, i18n, isMCCLabelEnabled) {pug_mixins[\"labelCellItem\"] = pug_interp = function(label, isMCCLabelEnabled, backgroundColor, color, title){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\npug_html = pug_html + \"\\u003Cdiv\" + (\" class=\\\"labels-cell-item\\\"\"+pug.attr(\"style\", pug.style(`background-color: ${backgroundColor}; color: ${color}; cursor: ${isMCCLabelEnabled ? 'pointer' : 'initial'}`), true, true)+pug.attr(\"title\", title, true, true)+\" data-action=\\\"filterLabel\\\"\"+pug.attr(\"data-id\", label.Id, true, true)+pug.attr(\"data-scope\", label.Scope, true, true)) + \"\\u003E\";\nif (isMCCLabelEnabled) {\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([['labels-cell-scope', label.Scope !== 'Account' ? 'labels-cell-mcc' : 'labels-cell-account']], [true]), false, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003Cspan\\u003E\" + (pug.escape(null == (pug_interp = label.Name) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\";\n};\nif (IsAggregateRow) {\npug_html = pug_html + (pug.escape(null == (pug_interp = ' ') ? \"\" : pug_interp));\n}\nelse {\nif (Labels.length > 0) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"labels-cell-container\\\"\\u003E\";\n// iterate Labels\n;(function(){\n var $$obj = Labels;\n if ('number' == typeof $$obj.length) {\n for (var pug_index0 = 0, $$l = $$obj.length; pug_index0 < $$l; pug_index0++) {\n var label = $$obj[pug_index0];\npug_mixins[\"labelCellItem\"](label, isMCCLabelEnabled, `#${label.labelColor}`, `#${label.contractColor}`, label.title);\n }\n } else {\n var $$l = 0;\n for (var pug_index0 in $$obj) {\n $$l++;\n var label = $$obj[pug_index0];\npug_mixins[\"labelCellItem\"](label, isMCCLabelEnabled, `#${label.labelColor}`, `#${label.contractColor}`, label.title);\n }\n }\n}).call(this);\n\nif (ShowViewMoreLink) {\npug_html = pug_html + \"\\u003Cbr\\u003E\\u003Ca href=\\\"javascript:void(0)\\\" id=\\\"see-all\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Label_Column_See_All').replace('{0}', TotalLength)) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\";\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\nvar noWrapText = '-'\npug_html = pug_html + \"\\u003Cspan class=\\\"no-wrap\\\"\\u003E\" + (pug.escape(null == (pug_interp = noWrapText) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\";\n}\n}}.call(this,\"IsAggregateRow\" in locals_for_with?locals_for_with.IsAggregateRow:typeof IsAggregateRow!==\"undefined\"?IsAggregateRow:undefined,\"Labels\" in locals_for_with?locals_for_with.Labels:typeof Labels!==\"undefined\"?Labels:undefined,\"ShowViewMoreLink\" in locals_for_with?locals_for_with.ShowViewMoreLink:typeof ShowViewMoreLink!==\"undefined\"?ShowViewMoreLink:undefined,\"TotalLength\" in locals_for_with?locals_for_with.TotalLength:typeof TotalLength!==\"undefined\"?TotalLength:undefined,\"i18n\" in locals_for_with?locals_for_with.i18n:typeof i18n!==\"undefined\"?i18n:undefined,\"isMCCLabelEnabled\" in locals_for_with?locals_for_with.isMCCLabelEnabled:typeof isMCCLabelEnabled!==\"undefined\"?isMCCLabelEnabled: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 (backgroundColor, entityName, entityType, i18n, isMCCLabelEnabled, labels, textColor, tooltip) {pug_mixins[\"labelCellItem\"] = pug_interp = function(label, isMCCLabelEnabled, backgroundColor, color, title){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\npug_html = pug_html + \"\\u003Cdiv\" + (\" class=\\\"labels-cell-item\\\"\"+pug.attr(\"style\", pug.style(`background-color: ${backgroundColor}; color: ${color}; cursor: ${isMCCLabelEnabled ? 'pointer' : 'initial'}`), true, true)+pug.attr(\"title\", title, true, true)+\" data-action=\\\"filterLabel\\\"\"+pug.attr(\"data-id\", label.Id, true, true)+pug.attr(\"data-scope\", label.Scope, true, true)) + \"\\u003E\";\nif (isMCCLabelEnabled) {\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([['labels-cell-scope', label.Scope !== 'Account' ? 'labels-cell-mcc' : 'labels-cell-account']], [true]), false, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003Cspan\\u003E\" + (pug.escape(null == (pug_interp = label.Name) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\";\n};\npug_html = pug_html + \"\\u003Cdiv\\u003E\";\nvar entityTypeLocalized = i18n.getString(`EntityType_${entityType}_Singular`);\nvar entityTypeFormatted = i18n.getString('label_popup_entity_type_format').replace('{0}', entityTypeLocalized);\npug_html = pug_html + \"\\u003Cspan class=\\\"popup--labels__entity-type\\\"\\u003E\" + (pug.escape(null == (pug_interp = entityTypeFormatted) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003Cspan\\u003E\" + (pug.escape(null == (pug_interp = entityName) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"popup--labels__container\\\"\\u003E\";\n// iterate labels\n;(function(){\n var $$obj = labels;\n if ('number' == typeof $$obj.length) {\n for (var pug_index0 = 0, $$l = $$obj.length; pug_index0 < $$l; pug_index0++) {\n var label = $$obj[pug_index0];\npug_mixins[\"labelCellItem\"](label, isMCCLabelEnabled, backgroundColor(label), textColor(label), tooltip(i18n, label));\n }\n } else {\n var $$l = 0;\n for (var pug_index0 in $$obj) {\n $$l++;\n var label = $$obj[pug_index0];\npug_mixins[\"labelCellItem\"](label, isMCCLabelEnabled, backgroundColor(label), textColor(label), tooltip(i18n, label));\n }\n }\n}).call(this);\n\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\nif (!isMCCLabelEnabled) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"popup--labels__actions\\\"\\u003E\\u003Ca class=\\\"action\\\" data-action=\\\"filter\\\" role=\\\"menuitem\\\" href=\\\"javascript:void(0)\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('label_popup_action_filter')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\\u003Cspan\\u003E\" + (pug.escape(null == (pug_interp = ' | ') ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003Ca class=\\\"action\\\" data-action=\\\"manage\\\" role=\\\"menuitem\\\" href=\\\"javascript:void(0)\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('label_selector_action_manage')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\\u003C\\u002Fdiv\\u003E\";\n}}.call(this,\"backgroundColor\" in locals_for_with?locals_for_with.backgroundColor:typeof backgroundColor!==\"undefined\"?backgroundColor:undefined,\"entityName\" in locals_for_with?locals_for_with.entityName:typeof entityName!==\"undefined\"?entityName:undefined,\"entityType\" in locals_for_with?locals_for_with.entityType:typeof entityType!==\"undefined\"?entityType:undefined,\"i18n\" in locals_for_with?locals_for_with.i18n:typeof i18n!==\"undefined\"?i18n:undefined,\"isMCCLabelEnabled\" in locals_for_with?locals_for_with.isMCCLabelEnabled:typeof isMCCLabelEnabled!==\"undefined\"?isMCCLabelEnabled:undefined,\"labels\" in locals_for_with?locals_for_with.labels:typeof labels!==\"undefined\"?labels:undefined,\"textColor\" in locals_for_with?locals_for_with.textColor:typeof textColor!==\"undefined\"?textColor:undefined,\"tooltip\" in locals_for_with?locals_for_with.tooltip:typeof tooltip!==\"undefined\"?tooltip: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 (cssClass, i18n, id, isForVNext) {pug_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\";\nif (!isForVNext) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"create-label__name-field-label\\\" id=\\\"CreateLabelName\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('create_label_dialog_field_label_name')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cinput class=\\\"create-label__name-field form-control\\\" type=\\\"text\\\" size=\\\"50\\\" maxlength=\\\"80\\\" data-bind=\\\"value: Name\\\" autofocus=\\\"true\\\" aria-required=\\\"true\\\" aria-labelledby=\\\"CreateLabelName\\\"\\u003E\";\n}\nelse {\npug_html = pug_html + \"\\u003Cinput\" + (\" class=\\\"create-label__name-field form-control\\\"\"+\" type=\\\"text\\\" size=\\\"50\\\"\"+pug.attr(\"placeholder\", i18n.getString('create_label_dialog_field_label_name'), true, true)+\" maxlength=\\\"80\\\" data-bind=\\\"value: Name\\\" autofocus=\\\"true\\\" aria-required=\\\"true\\\"\") + \"\\u003E\";\n}\npug_html = pug_html + \"\\u003Cul\" + (\" data-bind=\\\"visible: !Name.isValid(), foreach: Name.errors, attr: {"aria-hidden": Name.isValid()}\\\"\"+pug.attr(\"id\", id ? id : 'NameValidationError', true, true)+\" role=\\\"alert\\\"\") + \"\\u003E\\u003Cli\\u003E\\u003Cdiv class=\\\"error\\\" data-bind=\\\"html: $data\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fli\\u003E\\u003C\\u002Ful\\u003E\\u003Cdiv class=\\\"create-label__actions\\\"\\u003E\\u003Cbutton class=\\\"btn btn-primary create-label__action\\\" data-action=\\\"create\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Create')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"btn btn-default create-label__action\\\" data-action=\\\"cancel\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Cancel')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\";}.call(this,\"cssClass\" in locals_for_with?locals_for_with.cssClass:typeof cssClass!==\"undefined\"?cssClass:undefined,\"i18n\" in locals_for_with?locals_for_with.i18n:typeof i18n!==\"undefined\"?i18n:undefined,\"id\" in locals_for_with?locals_for_with.id:typeof id!==\"undefined\"?id:undefined,\"isForVNext\" in locals_for_with?locals_for_with.isForVNext:typeof isForVNext!==\"undefined\"?isForVNext: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 (checkState) {var ariaCheckedStatus = checkState === 'indeterminate' ? 'mixed' : checkState === 'checked' ? 'true' : 'false'\nvar classes = [].concat(checkState === 'indeterminate' ? ['glyphicon', 'glyphicon-minus'] : checkState === 'checked' ? ['glyphicon', 'glyphicon-ok'] : [])\npug_html = pug_html + \"\\u003Cdiv\" + (\" class=\\\"column-tri-state-checkbox\\\"\"+pug.attr(\"aria-checked\", ariaCheckedStatus, true, true)+\" role=\\\"checkbox\\\"\") + \"\\u003E\\u003Cspan\" + (pug.attr(\"class\", pug.classes([classes], [true]), false, true)) + \"\\u003E\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\";}.call(this,\"checkState\" in locals_for_with?locals_for_with.checkState:typeof checkState!==\"undefined\"?checkState: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, useSubMenu) {pug_html = pug_html + \"\\u003Cdiv class=\\\"menu-grid-selector\\\" data-ref=\\\"selectorView\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"divider\\\" data-bind=\\\"visible: !loaded() || hasData()\\\" role=\\\"separator\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\nif (useSubMenu) {\npug_html = pug_html + \"\\u003Cdiv role=\\\"menu\\\"\\u003E\\u003Cli class=\\\"action\\\" data-bind=\\\"visible: hasChanges()\\\" data-action=\\\"apply\\\" role=\\\"presentation\\\"\\u003E\\u003Ca class=\\\"clickable\\\" href=\\\"javascript:void(0)\\\" role=\\\"menuitem\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Apply')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\\u003C\\u002Fli\\u003E\\u003Cli class=\\\"action\\\" data-bind=\\\"visible: !hasChanges()\\\" data-action=\\\"create\\\" role=\\\"presentation\\\"\\u003E\\u003Ca class=\\\"clickable\\\" href=\\\"javascript:void(0)\\\" role=\\\"menuitem\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('CreateNew')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\\u003C\\u002Fli\\u003E\\u003Cli class=\\\"action\\\" data-bind=\\\"visible: !hasChanges()\\\" data-action=\\\"manage\\\" role=\\\"presentation\\\"\\u003E\\u003Ca class=\\\"clickable\\\" href=\\\"javascript:void(0)\\\" role=\\\"menuitem\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('label_selector_action_manage')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\\u003C\\u002Fli\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\npug_html = pug_html + \"\\u003Cli class=\\\"action\\\" data-bind=\\\"visible: hasChanges()\\\" data-action=\\\"apply\\\" role=\\\"presentation\\\"\\u003E\\u003Ca class=\\\"clickable\\\" href=\\\"javascript:void(0)\\\" role=\\\"menuitem\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Apply')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\\u003C\\u002Fli\\u003E\\u003Cli class=\\\"action\\\" data-bind=\\\"visible: !hasChanges()\\\" data-action=\\\"create\\\" role=\\\"presentation\\\"\\u003E\\u003Ca class=\\\"clickable\\\" href=\\\"javascript:void(0)\\\" role=\\\"menuitem\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('CreateNew')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\\u003C\\u002Fli\\u003E\\u003Cli class=\\\"action\\\" data-bind=\\\"visible: !hasChanges()\\\" data-action=\\\"manage\\\" role=\\\"presentation\\\"\\u003E\\u003Ca class=\\\"clickable\\\" href=\\\"javascript:void(0)\\\" role=\\\"menuitem\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('label_selector_action_manage')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\\u003C\\u002Fli\\u003E\";\n}}.call(this,\"i18n\" in locals_for_with?locals_for_with.i18n:typeof i18n!==\"undefined\"?i18n:undefined,\"useSubMenu\" in locals_for_with?locals_for_with.useSubMenu:typeof useSubMenu!==\"undefined\"?useSubMenu: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) {pug_html = pug_html + \"\\u003Cdiv class=\\\"nameTemplate\\\"\\u003E\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([['labels-cell-scope', model.Scope === 'Customer' ? 'labels-cell-mcc' : 'labels-cell-account']], [true]), false, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cspan class=\\\"table__cell--menu-item-style table__cell--ellipsis-overflow\\\"\\u003E\" + (pug.escape(null == (pug_interp = model.Name) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\";}.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 (value) {pug_mixins[\"entityName\"] = pug_interp = function(item){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nvar isSearchTerm = item.typeName === 'SearchTerm';\nvar isAccount = item.typeName === 'Account';\nvar AccountActivityStatus = item.AccountActivityStatus;\nif (isAccount) {\nif (item.status === AccountActivityStatus.Errors) {\npug_html = pug_html + \"\\u003Cdiv\" + (\" class=\\\"account-error-icon icon-error\\\"\"+pug.attr(\"title\", item.i18n.getString('AccountStatus_Error'), true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse\nif (item.status === AccountActivityStatus.Deleted) {\npug_html = pug_html + \"\\u003Cdiv\" + (\" class=\\\"account-deleted-icon\\\"\"+pug.attr(\"title\", item.i18n.getString('AccountStatus_Deleted'), true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse\nif (item.status === AccountActivityStatus.Enabled) {\npug_html = pug_html + \"\\u003Cdiv\" + (\" class=\\\"account-enabled-icon icon-success\\\"\"+pug.attr(\"title\", item.i18n.getString('AccountStatus_Active'), true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\nelse\nif (!isSearchTerm) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"status\\\"\\u003E\";\nif (item.status === 'Deleted') {\nif (item.isExperiment) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"experiment-paused-icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\npug_html = pug_html + \"\\u003Cdiv class=\\\"statusDeleted_icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\nelse\nif (item.status === 'Paused') {\nif (item.isExperiment) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"experiment-paused-icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\npug_html = pug_html + \"\\u003Cdiv class=\\\"statusPaused_icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\nelse\nif (item.status === 'Suspended') {\nif (item.isExperiment) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"experiment-paused-icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\npug_html = pug_html + \"\\u003Cdiv class=\\\"statusSuspended_icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\nelse\nif (item.status === 'Draft') {\nif (item.isExperiment) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"experiment-paused-icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\npug_html = pug_html + \"\\u003Cdiv class=\\\"statusDraft_icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\nelse\nif (item.status === 'Expired') {\npug_html = pug_html + \"\\u003Cdiv class=\\\"statushypendisplay\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\nif (item.isExperiment) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"experiment-active-icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\npug_html = pug_html + \"\\u003Cdiv class=\\\"statusEnabled_icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003Ca\" + (pug.attr(\"href\", item.hash, true, true)+pug.attr(\"title\", item.hideToolTip ? '' : item.name, true, true)+pug.attr(\"aria-label\", item.i18n.getString(`${item.rawStatus} {{entity}}`, {entity: item.name}), true, true)+pug.attr(\"data-campaignid\", item.campaignId, true, true)+pug.attr(\"data-adgroupid\", item.adGroupId, true, true)+pug.attr(\"data-accountid\", item.accountId, true, true)+pug.attr(\"data-type\", item.typeName, true, true)+pug.attr(\"data-text\", item.text, true, true)+pug.attr(\"data-navigationLevel\", item.navigationLevel, true, true)+pug.attr(\"data-campaigntype\", item.campaignType, true, true)+pug.attr(\"data-rawstatus\", item.rawStatus, true, true)+pug.attr(\"data-campaignName\", item.campaignName, true, true)+pug.attr(\"data-adGoupName\", item.adGroupName, true, true)+pug.attr(\"data-matchType\", item.matchType, true, true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = item.name) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\";\nif (isAccount && item.status === 'Deleted') {\npug_html = pug_html + \"\\u003Cspan class=\\\"inactive\\\"\\u003E\" + (null == (pug_interp = ` (${item.i18n.getString('AccountStatus_InActive')})`) ? \"\" : pug_interp) + \"\\u003C\\u002Fspan\\u003E\";\n}\n};\npug_html = pug_html + \"\\u003Cdiv class=\\\"grid-cell grid-cell--Name\\\"\\u003E\";\nvar hideToolTip = (value.typeName === 'Keyword') || (value.typeName === 'SearchTerm' && value.matchingKeyword);\nvar nameCell = {};\nnameCell.status = value.Status;\nnameCell.name = value.Name;\nnameCell.hash = value.hash;\nnameCell.campaignId = value.ids.campaignId;\nnameCell.adGroupId = value.ids.adgroupId;\nnameCell.accountId = value.ids.accountId;\nnameCell.typeName = value.typeName;\nnameCell.text = value.keywordText;\nnameCell.navigationLevel = value.navigationLevel;\nnameCell.campaignName = value.Campaign.Name;\nnameCell.adGroupName = value.AdGroup.Name;\nnameCell.matchType = value.MatchType;\nnameCell.hideToolTip = hideToolTip;\nnameCell.isExperiment = value.isExperiment;\nnameCell.campaignType = value.campaignType;\nnameCell.rawStatus = value.rawStatus;\nnameCell.i18n = value.i18n;\nnameCell.AccountActivityStatus = value.AccountActivityStatus;\npug_mixins[\"entityName\"](nameCell);\nif (value.typeName === 'SearchTerm') {\npug_html = pug_html + \"\\u003Cdiv class=\\\"search-term-detail\\\"\\u003E\\u003Cdiv class=\\\"actions\\\"\\u003E\";\nif (value.matchingKeyword) {\nvar added = value.searchTermStatus.indexOf('Added') > -1;\nif (added) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"add\\\"\\u003E\" + (null == (pug_interp = value.i18n.getString('SearchTermStatus_Added')) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\npug_html = pug_html + \"\\u003Cbutton class=\\\"add\\\"\\u003E\\u003Cdiv class=\\\"glyphicon search-term-add-keyword\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv\\u003E\" + (null == (pug_interp = value.i18n.getString('Dashboard_TopSearchTerms_Add')) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fbutton\\u003E\";\n}\n}\nvar excluded = value.searchTermStatus.indexOf('Excluded') > -1;\nif (excluded) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"exclude\\\"\\u003E\" + (null == (pug_interp = value.i18n.getString('SearchTermStatus_Excluded')) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\npug_html = pug_html + \"\\u003Cbutton class=\\\"exclude\\\"\\u003E\\u003Cdiv class=\\\"glyphicon search-term-add-neg-keyword\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv\\u003E\" + (null == (pug_interp = value.i18n.getString('Dashboard_TopSearchTerms_Exclude')) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fbutton\\u003E\";\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"grid-cell--Name__hover-container\\\"\\u003E\\u003Cdiv class=\\\"hover-content\\\"\\u003E\\u003Cdiv class=\\\"hover-content__text\\\"\\u003E\" + (pug.escape(null == (pug_interp = value.Name) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"hover-content__content\\\"\\u003E\" + (pug.escape(null == (pug_interp = value.Name) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\";\nif (value.matchingKeyword) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"hover-content__title\\\"\\u003E\" + (null == (pug_interp = value.i18n.getString('Dashboard_TopSearchTerms_Matched_Keyword')) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"hover-content__text\\\" style=\\\"padding-bottom:0px\\\"\\u003E\" + (null == (pug_interp = value.matchingKeyword) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"hover-content__content\\\"\\u003E\" + (null == (pug_interp = value.matchingKeyword) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse\nif (value.typeName === 'Keyword') {\npug_html = pug_html + \"\\u003Cdiv class=\\\"grid-cell--Name__hover-container\\\"\\u003E\\u003Cdiv class=\\\"hover-content\\\"\\u003E\\u003Cdiv class=\\\"hover-content__text\\\"\\u003E\" + (pug.escape(null == (pug_interp = value.Name) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"hover-content__name\\\"\\u003E\\u003Cdiv class=\\\"name-value\\\"\\u003E\" + (pug.escape(null == (pug_interp = value.Campaign.Name) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"name-value\\\"\\u003E\" + (null == (pug_interp = ' ') ? \"\" : pug_interp) + \"\\u003E \" + (pug.escape(null == (pug_interp = value.AdGroup.Name) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv\\u003E\" + (null == (pug_interp = value.i18n.getString('ColumnName_Type')) ? \"\" : pug_interp) + \": \" + (null == (pug_interp = value.MatchType) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"hover-content__content\\\"\\u003E\" + (pug.escape(null == (pug_interp = value.Campaign.Name) ? \"\" : pug_interp)) + \" \\u003E \" + (pug.escape(null == (pug_interp = value.AdGroup.Name) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";}.call(this,\"value\" in locals_for_with?locals_for_with.value:typeof value!==\"undefined\"?value: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 (AccountActivityStatus, AccountInactiveCauseValue, comparisonDateRangeText, currentDateRangeText, gridData, hasError, i18n, index, loaded, metricName) {pug_mixins[\"entityName\"] = pug_interp = function(item){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nvar isSearchTerm = item.typeName === 'SearchTerm';\nvar isAccount = item.typeName === 'Account';\nvar AccountActivityStatus = item.AccountActivityStatus;\nif (isAccount) {\nif (item.status === AccountActivityStatus.Errors) {\npug_html = pug_html + \"\\u003Cdiv\" + (\" class=\\\"account-error-icon icon-error\\\"\"+pug.attr(\"title\", item.i18n.getString('AccountStatus_Error'), true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse\nif (item.status === AccountActivityStatus.Deleted) {\npug_html = pug_html + \"\\u003Cdiv\" + (\" class=\\\"account-deleted-icon\\\"\"+pug.attr(\"title\", item.i18n.getString('AccountStatus_Deleted'), true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse\nif (item.status === AccountActivityStatus.Enabled) {\npug_html = pug_html + \"\\u003Cdiv\" + (\" class=\\\"account-enabled-icon icon-success\\\"\"+pug.attr(\"title\", item.i18n.getString('AccountStatus_Active'), true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\nelse\nif (!isSearchTerm) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"status\\\"\\u003E\";\nif (item.status === 'Deleted') {\nif (item.isExperiment) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"experiment-paused-icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\npug_html = pug_html + \"\\u003Cdiv class=\\\"statusDeleted_icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\nelse\nif (item.status === 'Paused') {\nif (item.isExperiment) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"experiment-paused-icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\npug_html = pug_html + \"\\u003Cdiv class=\\\"statusPaused_icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\nelse\nif (item.status === 'Suspended') {\nif (item.isExperiment) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"experiment-paused-icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\npug_html = pug_html + \"\\u003Cdiv class=\\\"statusSuspended_icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\nelse\nif (item.status === 'Draft') {\nif (item.isExperiment) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"experiment-paused-icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\npug_html = pug_html + \"\\u003Cdiv class=\\\"statusDraft_icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\nelse\nif (item.status === 'Expired') {\npug_html = pug_html + \"\\u003Cdiv class=\\\"statushypendisplay\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\nif (item.isExperiment) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"experiment-active-icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\npug_html = pug_html + \"\\u003Cdiv class=\\\"statusEnabled_icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003Ca\" + (pug.attr(\"href\", item.hash, true, true)+pug.attr(\"title\", item.hideToolTip ? '' : item.name, true, true)+pug.attr(\"aria-label\", item.i18n.getString(`${item.rawStatus} {{entity}}`, {entity: item.name}), true, true)+pug.attr(\"data-campaignid\", item.campaignId, true, true)+pug.attr(\"data-adgroupid\", item.adGroupId, true, true)+pug.attr(\"data-accountid\", item.accountId, true, true)+pug.attr(\"data-type\", item.typeName, true, true)+pug.attr(\"data-text\", item.text, true, true)+pug.attr(\"data-navigationLevel\", item.navigationLevel, true, true)+pug.attr(\"data-campaigntype\", item.campaignType, true, true)+pug.attr(\"data-rawstatus\", item.rawStatus, true, true)+pug.attr(\"data-campaignName\", item.campaignName, true, true)+pug.attr(\"data-adGoupName\", item.adGroupName, true, true)+pug.attr(\"data-matchType\", item.matchType, true, true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = item.name) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\";\nif (isAccount && item.status === 'Deleted') {\npug_html = pug_html + \"\\u003Cspan class=\\\"inactive\\\"\\u003E\" + (null == (pug_interp = ` (${item.i18n.getString('AccountStatus_InActive')})`) ? \"\" : pug_interp) + \"\\u003C\\u002Fspan\\u003E\";\n}\n};\npug_mixins[\"insightHover\"] = pug_interp = function(index){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\npug_html = pug_html + \"\\u003Cdiv class=\\\"hover-container\\\"\\u003E\\u003Cdiv class=\\\"hover-content\\\"\\u003E\\u003Cspan\\u003E\" + (pug.escape(null == (pug_interp = \"Click to view insight\") ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n};\npug_mixins[\"insightBulb\"] = pug_interp = function(item){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"mcc-perf-fluctuation-bulb-container\",item.rowClass], [false,true]), false, true)) + \"\\u003E\";\nif ((item.fluctuationTypeIds.length > 0)) {\npug_html = pug_html + \"\\u003Cdiv\" + (\" class=\\\"mcc-perf-fluctuation-bulb iconba iconba-Insights\\\"\"+\" tabindex=\\\"0\\\"\"+pug.attr(\"data-rowIndex\", item.index, true, true)+pug.attr(\"data-fluxTypeIds\", item.fluctuationTypeIds, true, true)+pug.attr(\"data-metricName\", item.metricName, true, true)+pug.attr(\"data-metricText\", item.formattedValue, true, true)+pug.attr(\"data-cmid\", item.campaignId, true, true)+pug.attr(\"data-aid\", item.accountId, true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"mcc-perf-fluctuation-placeholder\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\nif (item.fluctuationTypeIds.length > 0) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"insight-hover-target\\\"\\u003E\";\npug_mixins[\"insightHover\"]({ index, i18n });\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\n}\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\n};\npug_mixins[\"emptyContent\"] = pug_interp = function(i18n){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\npug_html = pug_html + \"\\u003Cdiv class=\\\"top-change-empty\\\"\\u003E\" + (null == (pug_interp = i18n.getString('Dashboard_TopChangeCard_NoData')) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\";\n};\npug_mixins[\"errorContent\"] = pug_interp = function(i18n){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\npug_html = pug_html + \"\\u003Cdiv class=\\\"top-change-empty\\\"\\u003E\" + (null == (pug_interp = i18n.getString('Dashboard_Cards_Data_Error')) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\";\n};\npug_mixins[\"kpi\"] = pug_interp = function(kpiData, metricName, dateRangeText){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\npug_html = pug_html + \"\\u003Cdiv class=\\\"kpi-date-range\\\"\\u003E\" + (pug.escape(null == (pug_interp = dateRangeText) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cspan\\u003E\" + (pug.escape(null == (pug_interp = metricName) ? \"\" : pug_interp)) + \":  \\u003Cspan class=\\\"kpi-data\\\"\\u003E\" + (pug.escape(null == (pug_interp = kpiData) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003C\\u002Fspan\\u003E\";\n};\npug_mixins[\"hoverContent\"] = pug_interp = function(i18n, item, metricName, currentDateRangeText, comparisonDateRangeText){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\npug_html = pug_html + \"\\u003Cdiv class=\\\"hover-container\\\"\\u003E\\u003Cdiv class=\\\"hover-content\\\"\\u003E\\u003Cdiv class=\\\"entity-name\\\"\\u003E\" + (pug.escape(null == (pug_interp = item.name) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"kpi-grid\\\"\\u003E\\u003Cdiv class=\\\"kpi-current\\\"\\u003E\";\npug_mixins[\"kpi\"](item.formattedMetrics, metricName, currentDateRangeText);\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"kpi-comparison\\\"\\u003E\";\npug_mixins[\"kpi\"](item.formattedPeriodMetrics, metricName, comparisonDateRangeText);\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"kpi-change\\\"\\u003E\\u003Cdiv class=\\\"bar-icon\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cspan\\u003E\" + (null == (pug_interp = i18n.getString(\"Dashboard_Change\")) ? \"\" : pug_interp) + \"\\u003C\\u002Fspan\\u003E\\u003Cspan class=\\\"kpi-data\\\"\\u003E\\u003Cspan\\u003E  \" + (pug.escape(null == (pug_interp = item.formattedValue) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003Cspan\\u003E  (\" + (pug.escape(null == (pug_interp = item.formattedPercentageValue) ? \"\" : pug_interp)) + \")\\u003C\\u002Fspan\\u003E\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n};\npug_mixins[\"gridRow\"] = pug_interp = function(i18n, item, index, metricName, currentDateRangeText, comparisonDateRangeText, AccountInactiveCauseValue){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nvar rowClass = \"top-change-grid-row-\" + (index+1)\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"top-change-entity-name\",rowClass], [false,true]), false, true)) + \"\\u003E\";\nvar nameCell = {};\nnameCell.status = item.status;\nnameCell.name = item.name;\nnameCell.hash = item.hash;\nnameCell.campaignId = item.campaignId;\nnameCell.adGroupId = item.adgroupId;\nnameCell.accountId = item.accountId;\nnameCell.typeName = item.typeName;\nnameCell.isExperiment = item.isExperiment;\nnameCell.campaignType = item.campaignType;\nnameCell.rawStatus = item.rawStatus;\nnameCell.i18n = i18n;\nnameCell.AccountActivityStatus = AccountActivityStatus;\npug_mixins[\"entityName\"](nameCell);\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"top-change-graph-decline\",rowClass], [false,true]), false, true)) + \"\\u003E\\u003Cdiv class=\\\"decline-box\\\"\\u003E\\u003Cdiv\" + (\" class=\\\"graph-space\\\"\"+pug.attr(\"style\", pug.style(`flex: ${item.declineSpace}`), true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv\" + (\" class=\\\"graph-bar\\\"\"+pug.attr(\"style\", pug.style(`flex: ${item.declineBar}`), true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"top-change-graph-increase\",rowClass], [false,true]), false, true)) + \"\\u003E\\u003Cdiv class=\\\"increase-box\\\"\\u003E\\u003Cdiv\" + (\" class=\\\"graph-bar\\\"\"+pug.attr(\"style\", pug.style(`flex: ${item.increaseBar}`), true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv\" + (\" class=\\\"graph-space\\\"\"+pug.attr(\"style\", pug.style(`flex: ${item.increaseSpace}`), true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\npug_mixins[\"insightBulb\"]({ index, fluctuationTypeIds: item.fluctuationTypeIds, rowClass, metricName, formattedValue: item.formattedValue, campaignId: item.campaignId, accountId: item.accountId });\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"pop-change\",rowClass], [false,true]), false, true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = item.formattedValue) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"pop-change-percentage\",rowClass], [false,true]), false, true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = item.formattedPercentageValue) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"pop-range\",rowClass], [false,true]), false, true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = item.fromTo) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\";\nvar classes = [rowClass]\nif (item.declineBar > 0) {\nclasses.push('kpi-declined')\n}\nelse\nif (item.increaseBar > 0) {\nclasses.push('kpi-increased')\n}\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"graph-hover-target\",classes], [false,true]), false, true)) + \"\\u003E\";\npug_mixins[\"hoverContent\"](i18n, item, metricName, currentDateRangeText, comparisonDateRangeText);\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"pop-hover-target\",classes], [false,true]), false, true)) + \"\\u003E\";\npug_mixins[\"hoverContent\"](i18n, item, metricName, currentDateRangeText, comparisonDateRangeText);\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\n};\nif (loaded) {\nif (hasError) {\npug_mixins[\"errorContent\"](i18n);\n}\nelse\nif (gridData != undefined) {\nif (gridData.length < 1) {\npug_mixins[\"emptyContent\"](i18n);\n}\nelse {\npug_html = pug_html + \"\\u003Cdiv class=\\\"top-change-grid\\\"\\u003E\";\n// iterate gridData\n;(function(){\n var $$obj = gridData;\n if ('number' == typeof $$obj.length) {\n for (var index = 0, $$l = $$obj.length; index < $$l; index++) {\n var item = $$obj[index];\npug_mixins[\"gridRow\"](i18n, item, index, metricName, currentDateRangeText, comparisonDateRangeText, AccountInactiveCauseValue);\n }\n } else {\n var $$l = 0;\n for (var index in $$obj) {\n $$l++;\n var item = $$obj[index];\npug_mixins[\"gridRow\"](i18n, item, index, metricName, currentDateRangeText, comparisonDateRangeText, AccountInactiveCauseValue);\n }\n }\n}).call(this);\n\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"cover-container\\\"\\u003E\\u003Cdiv class=\\\"scroll-bar-cover\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\n}}.call(this,\"AccountActivityStatus\" in locals_for_with?locals_for_with.AccountActivityStatus:typeof AccountActivityStatus!==\"undefined\"?AccountActivityStatus:undefined,\"AccountInactiveCauseValue\" in locals_for_with?locals_for_with.AccountInactiveCauseValue:typeof AccountInactiveCauseValue!==\"undefined\"?AccountInactiveCauseValue:undefined,\"comparisonDateRangeText\" in locals_for_with?locals_for_with.comparisonDateRangeText:typeof comparisonDateRangeText!==\"undefined\"?comparisonDateRangeText:undefined,\"currentDateRangeText\" in locals_for_with?locals_for_with.currentDateRangeText:typeof currentDateRangeText!==\"undefined\"?currentDateRangeText:undefined,\"gridData\" in locals_for_with?locals_for_with.gridData:typeof gridData!==\"undefined\"?gridData:undefined,\"hasError\" in locals_for_with?locals_for_with.hasError:typeof hasError!==\"undefined\"?hasError:undefined,\"i18n\" in locals_for_with?locals_for_with.i18n:typeof i18n!==\"undefined\"?i18n:undefined,\"index\" in locals_for_with?locals_for_with.index:typeof index!==\"undefined\"?index:undefined,\"loaded\" in locals_for_with?locals_for_with.loaded:typeof loaded!==\"undefined\"?loaded:undefined,\"metricName\" in locals_for_with?locals_for_with.metricName:typeof metricName!==\"undefined\"?metricName: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 (addInfo, metric, s$i18n) {pug_html = pug_html + \"\\u003Cdiv class=\\\"metric-picker__button metric-picker__button--single dropdown-toggle\\\" role=\\\"button\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\" tabindex=\\\"0\\\"\\u003E\";\nvar metricName = s$i18n.property('PerformanceMetrics', metric);\npug_html = pug_html + \"\\u003Cdiv\" + (\" class=\\\"metric-picker__name\\\"\"+pug.attr(\"title\", metricName, true, true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = metricName) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\";\nif (addInfo) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"metric-value-info\\\"\\u003E\\u003Cdiv data-ref=\\\"info-tooltip\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003Cspan class=\\\"caret\\\"\\u003E\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\";}.call(this,\"addInfo\" in locals_for_with?locals_for_with.addInfo:typeof addInfo!==\"undefined\"?addInfo:undefined,\"metric\" in locals_for_with?locals_for_with.metric:typeof metric!==\"undefined\"?metric:undefined,\"s$i18n\" in locals_for_with?locals_for_with.s$i18n:typeof s$i18n!==\"undefined\"?s$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;pug_html = pug_html + \"\\u003Cdiv class=\\\"device-metric__metric-picker metric-row\\\"\\u003E\\u003Cdiv data-ref=\\\"metric-picker\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";;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 (String, data, hasError, i18n, isAggregatedMetric, isSmartShoppingCampaign, loaded, metrics, navigationLevel, order, s$i18n) {pug_mixins[\"HoverContent\"] = pug_interp = function(order, data, metric){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nfor (var index = 0; index < order.length; index++)\n{\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"hover-container\",order[index].toLowerCase() + '-detail'], [false,true]), false, true)) + \"\\u003E\\u003Cdiv class=\\\"hover-content\\\"\\u003E\\u003Cdiv class=\\\"device-name\\\"\\u003E\" + (pug.escape(null == (pug_interp = s$i18n.enum('DeviceType', order[index])) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"metric-name\\\"\\u003E\" + (pug.escape(null == (pug_interp = s$i18n.property('PerformanceMetrics', metric)) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"hover-kpi-container\\\"\\u003E\\u003Cdiv class=\\\"hover-kpi-container__hover-kpi\\\"\\u003E\\u003Cdiv class=\\\"hover-kpi-container__date-range\\\"\\u003E\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"hover-kpi-container__date-range__color-block\",\"color-block-current-\" + order[index].toLowerCase()], [false,true]), false, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv\\u003E\" + (pug.escape(null == (pug_interp = data.formattedDateRange) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"hover-kpi-container__value\\\"\\u003E\" + (pug.escape(null == (pug_interp = data[index].formattedData[metric].formattedHoverValue) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\nif (data.formattedPeriodDateRange) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"hover-kpi-container__hover-kpi\\\"\\u003E\\u003Cdiv class=\\\"hover-kpi-container__date-range\\\"\\u003E\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"hover-kpi-container__date-range__color-block\",\"color-block-period-\" + order[index].toLowerCase()], [false,true]), false, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv\\u003E\" + (pug.escape(null == (pug_interp = data.formattedPeriodDateRange) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"hover-kpi-container__value\\\"\\u003E\" + (pug.escape(null == (pug_interp = data[index].formattedPeriodData[metric].formattedHoverValue) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\nif (data.formattedPeriodDateRange) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"hover-content__kpi-change\\\"\\u003E\\u003Cdiv\\u003E\" + (null == (pug_interp = i18n.getString(\"Dashboard_Change\")) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"hover-content__kpi-change__value\\\"\\u003E\" + (null == (pug_interp = data[index].formattedPeriodData[metric].formattedChange + \" \" + data[index].formattedPeriodData[metric].formattedChangePercentage) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n};\n\n\n\n\npug_mixins[\"errorContent\"] = pug_interp = function(i18n){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\npug_html = pug_html + \"\\u003Cdiv class=\\\"device-error\\\"\\u003E\" + (null == (pug_interp = i18n.getString('Dashboard_Cards_Data_Error')) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\";\n};\npug_mixins[\"gridContentVNext\"] = pug_interp = function(s$i18n, order, metrics, data, i18n, isAggregatedMetric){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"device-content-grid\",'device-count-' + order.length], [false,true]), false, true)) + \"\\u003E\";\nfor (var index = 0; index < order.length; index++)\n{\nvar columnClass = \"device-grid-column-\" + (index + 2)\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"device-card-legend-item\",\"device-grid-row-1\",columnClass], [false,false,true]), false, true)) + \"\\u003E\\u003Cdiv class=\\\"legend-container\\\"\\u003E\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"legend-icon\",order[index].toLowerCase() + '-icon-img'], [false,true]), false, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"legend-txt\\\"\\u003E\" + (pug.escape(null == (pug_interp = s$i18n.enum('DeviceType', order[index])) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n// iterate [0, 1, 2]\n;(function(){\n var $$obj = [0, 1, 2];\n if ('number' == typeof $$obj.length) {\n for (var pug_index0 = 0, $$l = $$obj.length; pug_index0 < $$l; pug_index0++) {\n var metricIndex = $$obj[pug_index0];\nvar metric = metrics[metricIndex]\nvar rowClass = \"device-grid-row-\" + (metricIndex + 2);\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"graph-area\",\"device-grid-column-1\",rowClass], [false,false,true]), false, true)) + \"\\u003E\\u003Cdiv\" + (\" class=\\\"device-card__metric\\\"\"+pug.attr(\"data-ref\", String(metricIndex), true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";\nif (data) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"graph-container current\\\"\\u003E\";\nfor (var index = 0; index < order.length; index++)\n{\nvar type = order[index].toLowerCase()\nvar barClass = \"device-grid-bar-\" + type\nvar flexValue = data[index].formattedData[metric].flexValue\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"device-grid-bar\",barClass], [false,true]), false, true)+pug.attr(\"style\", pug.style(`flex: ${flexValue}; min-width: ${flexValue > 0? '1px': '0px'}`), true, true)+pug.attr(\"data-type\", type, true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nif (!isAggregatedMetric(metric)) {\npug_mixins[\"HoverContent\"](order, data, metric);\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\nif (data.formattedPeriodDateRange) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"graph-container period\\\"\\u003E\";\nfor (var index = 0; index < order.length; index++)\n{\nvar type = order[index].toLowerCase()\nvar barClass = \"device-grid-bar-\" + order[index].toLowerCase()\nvar flexValue = data[index].formattedPeriodData[metric].flexValue\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"device-grid-bar\",barClass], [false,true]), false, true)+pug.attr(\"style\", pug.style(`flex: ${flexValue}; min-width: ${flexValue > 0? '1px': '0px'}`), true, true)+pug.attr(\"data-type\", type, true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003Cdiv class=\\\"overlay\\\"\\u003E\";\nfor (var index = 0; index < order.length; index++)\n{\nvar type = order[index].toLowerCase()\nvar flexValue = data[index].formattedPeriodData[metric].flexValue\npug_html = pug_html + \"\\u003Cdiv\" + (\" class=\\\"device-grid-bar\\\"\"+pug.attr(\"style\", pug.style(`flex: ${flexValue}; min-width: ${flexValue > 0? '1px': '0px'}`), true, true)+pug.attr(\"data-type\", type, true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\nfor (var index = 0; index < order.length; index++)\n{\nvar kpiClasses = [\"device-grid-column-\" + (index + 2), rowClass];\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([kpiClasses], [true]), false, true)) + \"\\u003E\\u003Cdiv class=\\\"kpi-container\\\"\\u003E\";\nif (data) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"kpi\\\"\\u003E\\u003Cdiv class=\\\"current-value\\\"\\u003E\" + (pug.escape(null == (pug_interp = data[index].formattedData[metric].formattedSegment) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\";\nif (data.formattedPeriodDateRange) {\nvar increase = data[index].formattedPeriodData[metric].changePercentage >= 0\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"change-percentage\",increase ? 'increase' : 'decrease'], [false,true]), false, true)) + \"\\u003E\" + (null == (pug_interp = data[index].formattedPeriodData[metric].formattedChangePercentage) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\nif (data.formattedPeriodDateRange) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"kpi\\\"\\u003E\\u003Cdiv class=\\\"period-value\\\"\\u003E\" + (pug.escape(null == (pug_interp = data[index].formattedPeriodData[metric].formattedSegment) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n }\n } else {\n var $$l = 0;\n for (var pug_index0 in $$obj) {\n $$l++;\n var metricIndex = $$obj[pug_index0];\nvar metric = metrics[metricIndex]\nvar rowClass = \"device-grid-row-\" + (metricIndex + 2);\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"graph-area\",\"device-grid-column-1\",rowClass], [false,false,true]), false, true)) + \"\\u003E\\u003Cdiv\" + (\" class=\\\"device-card__metric\\\"\"+pug.attr(\"data-ref\", String(metricIndex), true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";\nif (data) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"graph-container current\\\"\\u003E\";\nfor (var index = 0; index < order.length; index++)\n{\nvar type = order[index].toLowerCase()\nvar barClass = \"device-grid-bar-\" + type\nvar flexValue = data[index].formattedData[metric].flexValue\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"device-grid-bar\",barClass], [false,true]), false, true)+pug.attr(\"style\", pug.style(`flex: ${flexValue}; min-width: ${flexValue > 0? '1px': '0px'}`), true, true)+pug.attr(\"data-type\", type, true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nif (!isAggregatedMetric(metric)) {\npug_mixins[\"HoverContent\"](order, data, metric);\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\nif (data.formattedPeriodDateRange) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"graph-container period\\\"\\u003E\";\nfor (var index = 0; index < order.length; index++)\n{\nvar type = order[index].toLowerCase()\nvar barClass = \"device-grid-bar-\" + order[index].toLowerCase()\nvar flexValue = data[index].formattedPeriodData[metric].flexValue\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"device-grid-bar\",barClass], [false,true]), false, true)+pug.attr(\"style\", pug.style(`flex: ${flexValue}; min-width: ${flexValue > 0? '1px': '0px'}`), true, true)+pug.attr(\"data-type\", type, true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003Cdiv class=\\\"overlay\\\"\\u003E\";\nfor (var index = 0; index < order.length; index++)\n{\nvar type = order[index].toLowerCase()\nvar flexValue = data[index].formattedPeriodData[metric].flexValue\npug_html = pug_html + \"\\u003Cdiv\" + (\" class=\\\"device-grid-bar\\\"\"+pug.attr(\"style\", pug.style(`flex: ${flexValue}; min-width: ${flexValue > 0? '1px': '0px'}`), true, true)+pug.attr(\"data-type\", type, true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\nfor (var index = 0; index < order.length; index++)\n{\nvar kpiClasses = [\"device-grid-column-\" + (index + 2), rowClass];\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([kpiClasses], [true]), false, true)) + \"\\u003E\\u003Cdiv class=\\\"kpi-container\\\"\\u003E\";\nif (data) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"kpi\\\"\\u003E\\u003Cdiv class=\\\"current-value\\\"\\u003E\" + (pug.escape(null == (pug_interp = data[index].formattedData[metric].formattedSegment) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\";\nif (data.formattedPeriodDateRange) {\nvar increase = data[index].formattedPeriodData[metric].changePercentage >= 0\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"change-percentage\",increase ? 'increase' : 'decrease'], [false,true]), false, true)) + \"\\u003E\" + (null == (pug_interp = data[index].formattedPeriodData[metric].formattedChangePercentage) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\nif (data.formattedPeriodDateRange) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"kpi\\\"\\u003E\\u003Cdiv class=\\\"period-value\\\"\\u003E\" + (pug.escape(null == (pug_interp = data[index].formattedPeriodData[metric].formattedSegment) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n }\n }\n}).call(this);\n\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\n};\nif (loaded) {\nif (hasError) {\npug_mixins[\"errorContent\"](i18n);\n}\nelse {\npug_mixins[\"gridContentVNext\"](s$i18n, order, metrics, data, i18n, isAggregatedMetric);\n}\nvar isCustomerLevel = navigationLevel === 'customer';\nif (!isCustomerLevel && !isSmartShoppingCampaign) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"device-links\\\"\\u003E\\u003Cspan class=\\\"view-all-clickLink\\\" href=\\\"javascript:void(0);\\\" role=\\\"presentation\\\" tabindex=\\\"-1\\\"\\u003E\\u003Cbutton class=\\\"btn-default btn\\\" type=\\\"button\\\"\\u003E\" + (null == (pug_interp = i18n.getString('Dashboard_DeviceCard_View_All')) ? \"\" : pug_interp) + \"\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\npug_html = pug_html + \"\\u003Ca\" + (\" class=\\\"HelpTopic hiddenHelpBridge\\\"\"+pug.attr(\"query\", isCustomerLevel ? 'help:ext60045': 'help:app54555', true, true)+\" href=\\\"javascript:void(0);\\\" style=\\\"display:none\\\"\") + \"\\u003E\\u003C\\u002Fa\\u003E\";}.call(this,\"String\" in locals_for_with?locals_for_with.String:typeof String!==\"undefined\"?String:undefined,\"data\" in locals_for_with?locals_for_with.data:typeof data!==\"undefined\"?data:undefined,\"hasError\" in locals_for_with?locals_for_with.hasError:typeof hasError!==\"undefined\"?hasError:undefined,\"i18n\" in locals_for_with?locals_for_with.i18n:typeof i18n!==\"undefined\"?i18n:undefined,\"isAggregatedMetric\" in locals_for_with?locals_for_with.isAggregatedMetric:typeof isAggregatedMetric!==\"undefined\"?isAggregatedMetric:undefined,\"isSmartShoppingCampaign\" in locals_for_with?locals_for_with.isSmartShoppingCampaign:typeof isSmartShoppingCampaign!==\"undefined\"?isSmartShoppingCampaign:undefined,\"loaded\" in locals_for_with?locals_for_with.loaded:typeof loaded!==\"undefined\"?loaded:undefined,\"metrics\" in locals_for_with?locals_for_with.metrics:typeof metrics!==\"undefined\"?metrics:undefined,\"navigationLevel\" in locals_for_with?locals_for_with.navigationLevel:typeof navigationLevel!==\"undefined\"?navigationLevel:undefined,\"order\" in locals_for_with?locals_for_with.order:typeof order!==\"undefined\"?order:undefined,\"s$i18n\" in locals_for_with?locals_for_with.s$i18n:typeof s$i18n!==\"undefined\"?s$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;pug_html = pug_html + \"\\u003Cdiv class=\\\"no-data\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";;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;pug_html = pug_html + \"\\u003Cdiv class=\\\"cover-container\\\"\\u003E\\u003Cdiv class=\\\"scroll-bar-cover\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";;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 (metrics, s$i18n) {pug_html = pug_html + \"\\u003Cdiv class=\\\"dropdown open\\\"\\u003E\\u003Cul class=\\\"dropdown-menu dropdown-menu-right\\\" role=\\\"menu\\\"\\u003E\";\n// iterate metrics\n;(function(){\n var $$obj = metrics;\n if ('number' == typeof $$obj.length) {\n for (var pug_index0 = 0, $$l = $$obj.length; pug_index0 < $$l; pug_index0++) {\n var metric = $$obj[pug_index0];\npug_html = pug_html + \"\\u003Cli\" + (pug.attr(\"data-metric\", metric, true, true)) + \"\\u003E\\u003Ca href=\\\"#\\\" role=\\\"menuitem\\\"\\u003E\" + (pug.escape(null == (pug_interp = s$i18n.property('PerformanceMetrics', metric)) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\\u003C\\u002Fli\\u003E\";\n }\n } else {\n var $$l = 0;\n for (var pug_index0 in $$obj) {\n $$l++;\n var metric = $$obj[pug_index0];\npug_html = pug_html + \"\\u003Cli\" + (pug.attr(\"data-metric\", metric, true, true)) + \"\\u003E\\u003Ca href=\\\"#\\\" role=\\\"menuitem\\\"\\u003E\" + (pug.escape(null == (pug_interp = s$i18n.property('PerformanceMetrics', metric)) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\\u003C\\u002Fli\\u003E\";\n }\n }\n}).call(this);\n\npug_html = pug_html + \"\\u003C\\u002Ful\\u003E\\u003C\\u002Fdiv\\u003E\";}.call(this,\"metrics\" in locals_for_with?locals_for_with.metrics:typeof metrics!==\"undefined\"?metrics:undefined,\"s$i18n\" in locals_for_with?locals_for_with.s$i18n:typeof s$i18n!==\"undefined\"?s$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 (metric) {pug_html = pug_html + \"\\u003Cdiv\" + (\" class=\\\"btn-group metric-picker\\\"\"+pug.attr(\"data-metric\", metric, true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";}.call(this,\"metric\" in locals_for_with?locals_for_with.metric:typeof metric!==\"undefined\"?metric: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, metric, s$i18n) {pug_html = pug_html + \"\\u003Cdiv class=\\\"grid-card-header\\\"\\u003E\\u003Cdiv\" + (\" class=\\\"metric-picker\\\"\"+pug.attr(\"data-metric\", metric, true, true)) + \"\\u003E\";\nvar metricName = s$i18n.property('PerformanceMetrics', metric);\npug_html = pug_html + \"\\u003Cdiv\" + (\" class=\\\"metric-picker__name\\\"\"+pug.attr(\"title\", metricName, true, true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = metricName) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cbutton\" + (\" class=\\\"metric-picker__button metric-picker__button--caret btn btn-default dropdown-toggle\\\"\"+\" aria-haspopup=\\\"true\\\"\"+pug.attr(\"aria-label\", i18n.getString('Select metric'), true, true)+\" aria-expanded=\\\"false\\\"\") + \"\\u003E\\u003Cspan class=\\\"caret\\\"\\u003E\\u003C\\u002Fspan\\u003E\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";}.call(this,\"i18n\" in locals_for_with?locals_for_with.i18n:typeof i18n!==\"undefined\"?i18n:undefined,\"metric\" in locals_for_with?locals_for_with.metric:typeof metric!==\"undefined\"?metric:undefined,\"s$i18n\" in locals_for_with?locals_for_with.s$i18n:typeof s$i18n!==\"undefined\"?s$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 (order, showExtra, value) {pug_html = pug_html + \"\\u003Cdiv class=\\\"grid-card-cell grid-card-cell--performance-metric\\\"\\u003E\\u003Cdiv class=\\\"grid-card-cell__body\\\"\\u003E\" + (pug.escape(null == (pug_interp = value[order.body]) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\";\nif (showExtra) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"grid-card-cell__extra\\\"\\u003E\\u003Cdiv class=\\\"grid-card-cell__sup\\\"\\u003E\" + (pug.escape(null == (pug_interp = value[order.sup]) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"grid-card-cell__sub\\\"\\u003E\" + (pug.escape(null == (pug_interp = value[order.sub]) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";}.call(this,\"order\" in locals_for_with?locals_for_with.order:typeof order!==\"undefined\"?order:undefined,\"showExtra\" in locals_for_with?locals_for_with.showExtra:typeof showExtra!==\"undefined\"?showExtra:undefined,\"value\" in locals_for_with?locals_for_with.value:typeof value!==\"undefined\"?value: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 (options) {pug_html = pug_html + \"\\u003Cdiv class=\\\"empty-content\\\"\\u003E\" + (null == (pug_interp = options.templateOptions.i18n.getString('Dashboard_Cards_NoData')) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\";}.call(this,\"options\" in locals_for_with?locals_for_with.options:typeof options!==\"undefined\"?options: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 (adGroupName, addAsNegativeKeyword, appendLearnMoreLink, campaignName, errMsg, i18n, isEmpty, matchType, navigationLevel, selectionLevel, text) {pug_mixins[\"entitySelector\"] = pug_interp = function(navigationLevel, i18n, campaignName, adGroupName, selectionLevel){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nif (navigationLevel === 'account') {\nif (selectionLevel === 'adGroupLevel') {\npug_html = pug_html + \"\\u003Cdiv class=\\\"adgroup-campaign-label\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Dashboard_TopSearchTerms_SelectAdGroup')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"campaign-ad-group-selector\\\" data-ref=\\\"selector\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\npug_html = pug_html + \"\\u003Cdiv class=\\\"adgroup-campaign-label\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Dashboard_TopSearchTerms_SelectCampaign')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"campaign-ad-group-selector\\\" data-ref=\\\"selector\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\n}\nelse {\npug_html = pug_html + \"\\u003Cdiv class=\\\"entity-info\\\"\\u003E\\u003Cdiv class=\\\"campaign-info\\\"\\u003E\\u003Cdiv class=\\\"adgroup-campaign-label\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Entity_Campaign')) ? \"\" : pug_interp)) + \"\\u003Cdiv\" + (\" class=\\\"selected-entity-names__name\\\"\"+pug.attr(\"title\", campaignName, true, true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = campaignName) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\nif (selectionLevel === 'adGroupLevel') {\npug_html = pug_html + \"\\u003Cdiv class=\\\"adgroup-info\\\"\\u003E\\u003Cdiv class=\\\"adgroup-campaign-label\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Entity_Adgroup')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"campaign-ad-group-selector\\\" data-ref=\\\"selector\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\n}\n};\npug_html = pug_html + \"\\u003Cdiv class=\\\"add-keyword-content\\\"\\u003E\";\nvar title = addAsNegativeKeyword ? i18n.getString('Dashboard_TopSearchTerms_AddAsNegativeKeyword'): i18n.getString('Dashboard_TopSearchTerms_AddAsKeyword');\nif (addAsNegativeKeyword) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"add-keyword-content__tittle\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Dashboard_TopSearchTerms_AddAsNegativeKeyword')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"adgroup-campaign-label\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Dashboard_TopSearchTerms_AddNegativeKeyword_Level')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"level-selector\\\"\\u003E\";\nif (selectionLevel === 'adGroupLevel') {\npug_html = pug_html + \"\\u003Clabel class=\\\"entityLevel\\\"\\u003E\\u003Cinput name=\\\"entityLevel\\\" type=\\\"radio\\\" value=\\\"campaignLevel\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Dashboard_TopSearchTerms_CampaignLevel')) ? \"\" : pug_interp)) + \"\\u003C\\u002Flabel\\u003E\\u003Clabel class=\\\"entityLevel\\\"\\u003E\\u003Cinput name=\\\"entityLevel\\\" type=\\\"radio\\\" value=\\\"adGroupLevel\\\" checked=\\\"checked\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Dashboard_TopSearchTerms_AdGroupLevel')) ? \"\" : pug_interp)) + \"\\u003C\\u002Flabel\\u003E\";\n}\nelse {\npug_html = pug_html + \"\\u003Clabel class=\\\"entityLevel\\\"\\u003E\\u003Cinput name=\\\"entityLevel\\\" type=\\\"radio\\\" value=\\\"campaignLevel\\\" checked=\\\"checked\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Dashboard_TopSearchTerms_CampaignLevel')) ? \"\" : pug_interp)) + \"\\u003C\\u002Flabel\\u003E\\u003Clabel class=\\\"entityLevel\\\"\\u003E\\u003Cinput name=\\\"entityLevel\\\" type=\\\"radio\\\" value=\\\"adGroupLevel\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Dashboard_TopSearchTerms_AdGroupLevel')) ? \"\" : pug_interp)) + \"\\u003C\\u002Flabel\\u003E\";\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\npug_mixins[\"entitySelector\"](navigationLevel, i18n, campaignName, adGroupName, selectionLevel);\n}\nelse {\npug_html = pug_html + \"\\u003Cdiv class=\\\"add-keyword-content__tittle\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Dashboard_TopSearchTerms_AddAsKeyword')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\";\npug_mixins[\"entitySelector\"](navigationLevel, i18n, campaignName, adGroupName, selectionLevel);\n}\npug_html = pug_html + \"\\u003Chr style=\\\"clear:both\\\"\\u003E\\u003Cdiv class=\\\"keyword-detail\\\"\\u003E\";\nvar keywordType = addAsNegativeKeyword ? i18n.getString('Entity_NegativeKeywords') :i18n.getString('Entity_Keywords');\npug_html = pug_html + \"\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Cdiv class=\\\"keyword-type\\\" id=\\\"Searchterm-Keywordtype\\\"\\u003E\" + (pug.escape(null == (pug_interp = keywordType) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"keyword-value\\\"\\u003E\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([addAsNegativeKeyword ? 'negative-keyword-input' : 'keyword-input'], [true]), false, true)) + \"\\u003E\\u003Cinput\" + (\" class=\\\"form-control keyword-text__value\\\"\"+pug.attr(\"value\", text, true, true)+\" type=\\\"text\\\" aria-labelledby=\\\"Searchterm-Keywordtype\\\"\") + \"\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Cdiv class=\\\"keyword-match-type\\\" id=\\\"Searchterm-MatchType\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('ColumnName_Type')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"keyword-match-type-selector\\\"\\u003E\\u003Cselect\" + (\" class=\\\"form-control match-type__value\\\"\"+pug.attr(\"value\", matchType, true, true)+\" aria-labelledby=\\\"Searchterm-MatchType\\\"\") + \"\\u003E\";\nvar selection\nselection = matchType === 'Exact' ? {selected: 'selected'} : {};\npug_html = pug_html + \"\\u003Coption\" + (pug.attrs(pug.merge([{\"value\": \"Exact\"},selection]), true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('KeywordType_Exact')) ? \"\" : pug_interp)) + \"\\u003C\\u002Foption\\u003E\";\nselection = matchType === 'Phrase' ? {selected: 'selected'} : {};\npug_html = pug_html + \"\\u003Coption\" + (pug.attrs(pug.merge([{\"value\": \"Phrase\"},selection]), true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('KeywordType_Phrase')) ? \"\" : pug_interp)) + \"\\u003C\\u002Foption\\u003E\";\nif (!addAsNegativeKeyword) {\nselection = matchType === 'Broad' ? {selected: 'selected'} : {};\npug_html = pug_html + \"\\u003Coption\" + (pug.attrs(pug.merge([{\"value\": \"Broad\"},selection]), true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('KeywordType_Broad')) ? \"\" : pug_interp)) + \"\\u003C\\u002Foption\\u003E\";\n}\npug_html = pug_html + \"\\u003C\\u002Fselect\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\nif (errMsg) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"alert-danger\\\"\\u003E\" + (null == (pug_interp = errMsg) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003Cdiv class=\\\"type-help\\\"\\u003E\" + (null == (pug_interp = appendLearnMoreLink(i18n.getString('SearchTerm_ManageKeyword_HelpText'), 'app51021')) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\\u003Chr\\u003E\";\nvar attributes = isEmpty ? { disabled: 'disabled' }: {};\npug_html = pug_html + \"\\u003Cbutton\" + (pug.attrs(pug.merge([{\"class\": \"apply btn btn-primary\"},attributes]), true)) + \"\\u003EApply\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"cancel btn btn-default\\\"\\u003ECancel\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\";}.call(this,\"adGroupName\" in locals_for_with?locals_for_with.adGroupName:typeof adGroupName!==\"undefined\"?adGroupName:undefined,\"addAsNegativeKeyword\" in locals_for_with?locals_for_with.addAsNegativeKeyword:typeof addAsNegativeKeyword!==\"undefined\"?addAsNegativeKeyword:undefined,\"appendLearnMoreLink\" in locals_for_with?locals_for_with.appendLearnMoreLink:typeof appendLearnMoreLink!==\"undefined\"?appendLearnMoreLink:undefined,\"campaignName\" in locals_for_with?locals_for_with.campaignName:typeof campaignName!==\"undefined\"?campaignName:undefined,\"errMsg\" in locals_for_with?locals_for_with.errMsg:typeof errMsg!==\"undefined\"?errMsg:undefined,\"i18n\" in locals_for_with?locals_for_with.i18n:typeof i18n!==\"undefined\"?i18n:undefined,\"isEmpty\" in locals_for_with?locals_for_with.isEmpty:typeof isEmpty!==\"undefined\"?isEmpty:undefined,\"matchType\" in locals_for_with?locals_for_with.matchType:typeof matchType!==\"undefined\"?matchType:undefined,\"navigationLevel\" in locals_for_with?locals_for_with.navigationLevel:typeof navigationLevel!==\"undefined\"?navigationLevel:undefined,\"selectionLevel\" in locals_for_with?locals_for_with.selectionLevel:typeof selectionLevel!==\"undefined\"?selectionLevel:undefined,\"text\" in locals_for_with?locals_for_with.text:typeof text!==\"undefined\"?text: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 (buttonText, isCustomerLevel, typeName) {var contentType = typeName.toLowerCase() + \"-card-content\";\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"grid-card__grid-content\",contentType], [false,true]), false, true)) + \"\\u003E\\u003Cdiv data-ref=\\\"content\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\nif ((buttonText)) {\nvar linkType = typeName.toLowerCase() + \"-card-link\"\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([\"grid-links\",linkType], [false,true]), false, true)) + \"\\u003E\\u003Cspan class=\\\"view-all-clickLink\\\"\\u003E\\u003Cbutton class=\\\"btn-default btn\\\" type=\\\"button\\\"\\u003E\" + (pug.escape(null == (pug_interp = buttonText) ? \"\" : pug_interp)) + \"\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003Ca\" + (\" class=\\\"HelpTopic hiddenHelpBridge\\\"\"+pug.attr(\"query\", isCustomerLevel ? 'help:ext60045': 'help:app54555', true, true)+\" href=\\\"javascript:void(0);\\\" style=\\\"display:none\\\"\") + \"\\u003E\\u003C\\u002Fa\\u003E\";}.call(this,\"buttonText\" in locals_for_with?locals_for_with.buttonText:typeof buttonText!==\"undefined\"?buttonText:undefined,\"isCustomerLevel\" in locals_for_with?locals_for_with.isCustomerLevel:typeof isCustomerLevel!==\"undefined\"?isCustomerLevel:undefined,\"typeName\" in locals_for_with?locals_for_with.typeName:typeof typeName!==\"undefined\"?typeName: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 (addInfo, ariaLabel, i18n, metric, metricValue, s$i18n) {pug_html = pug_html + \"\\u003Cdiv class=\\\"metric-picker__text\\\"\\u003E\";\nvar metricName = s$i18n.property('PerformanceMetrics', metric);\npug_html = pug_html + \"\\u003Cdiv\" + (\" class=\\\"metric-picker__name\\\"\"+pug.attr(\"title\", metricName, true, true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = metricName) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"metric-picker__value\\\"\\u003E\";\nvar title = addInfo ? null : metricValue;\npug_html = pug_html + \"\\u003Cdiv\" + (\" class=\\\"metric-value\\\"\"+pug.attr(\"title\", title, true, true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = metricValue) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\";\nif (addInfo) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"metric-value-info\\\"\\u003E\\u003Cdiv data-ref=\\\"info-tooltip\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cbutton\" + (\" class=\\\"metric-picker__button metric-picker__button--caret dropdown-toggle btn btn-default\\\"\"+\" data-toggle=\\\"dropdown\\\"\"+pug.attr(\"aria-label\", ariaLabel || i18n.getString('Select metric'), true, true)+\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\"\") + \"\\u003E\\u003Cspan class=\\\"caret\\\"\\u003E\\u003C\\u002Fspan\\u003E\\u003C\\u002Fbutton\\u003E\";}.call(this,\"addInfo\" in locals_for_with?locals_for_with.addInfo:typeof addInfo!==\"undefined\"?addInfo:undefined,\"ariaLabel\" in locals_for_with?locals_for_with.ariaLabel:typeof ariaLabel!==\"undefined\"?ariaLabel:undefined,\"i18n\" in locals_for_with?locals_for_with.i18n:typeof i18n!==\"undefined\"?i18n:undefined,\"metric\" in locals_for_with?locals_for_with.metric:typeof metric!==\"undefined\"?metric:undefined,\"metricValue\" in locals_for_with?locals_for_with.metricValue:typeof metricValue!==\"undefined\"?metricValue:undefined,\"s$i18n\" in locals_for_with?locals_for_with.s$i18n:typeof s$i18n!==\"undefined\"?s$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 (leftAlign, metrics, s$i18n) {var menuClass = leftAlign ? 'dropdown-menu-left' : 'dropdown-menu-right';\npug_html = pug_html + \"\\u003Cul\" + (pug.attr(\"class\", pug.classes([\"dropdown-menu\",menuClass], [false,true]), false, true)+\" role=\\\"menu\\\"\") + \"\\u003E\";\n// iterate metrics\n;(function(){\n var $$obj = metrics;\n if ('number' == typeof $$obj.length) {\n for (var pug_index0 = 0, $$l = $$obj.length; pug_index0 < $$l; pug_index0++) {\n var metric = $$obj[pug_index0];\npug_html = pug_html + \"\\u003Cli\" + (pug.attr(\"data-metric\", metric, true, true)+\" role=\\\"presentation\\\"\") + \"\\u003E\\u003Ca href=\\\"#\\\" role=\\\"menuitem\\\"\\u003E\" + (pug.escape(null == (pug_interp = s$i18n.property('PerformanceMetrics', metric)) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\\u003C\\u002Fli\\u003E\";\n }\n } else {\n var $$l = 0;\n for (var pug_index0 in $$obj) {\n $$l++;\n var metric = $$obj[pug_index0];\npug_html = pug_html + \"\\u003Cli\" + (pug.attr(\"data-metric\", metric, true, true)+\" role=\\\"presentation\\\"\") + \"\\u003E\\u003Ca href=\\\"#\\\" role=\\\"menuitem\\\"\\u003E\" + (pug.escape(null == (pug_interp = s$i18n.property('PerformanceMetrics', metric)) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\\u003C\\u002Fli\\u003E\";\n }\n }\n}).call(this);\n\npug_html = pug_html + \"\\u003C\\u002Ful\\u003E\";}.call(this,\"leftAlign\" in locals_for_with?locals_for_with.leftAlign:typeof leftAlign!==\"undefined\"?leftAlign:undefined,\"metrics\" in locals_for_with?locals_for_with.metrics:typeof metrics!==\"undefined\"?metrics:undefined,\"s$i18n\" in locals_for_with?locals_for_with.s$i18n:typeof s$i18n!==\"undefined\"?s$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 (metric) {pug_html = pug_html + \"\\u003Cdiv\" + (\" class=\\\"btn-group btn btn-default metric-picker\\\"\"+pug.attr(\"data-metric\", metric, true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";}.call(this,\"metric\" in locals_for_with?locals_for_with.metric:typeof metric!==\"undefined\"?metric: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;pug_html = pug_html + \"\\u003Cdiv class=\\\"dashboard-page\\\" railviewid=\\\"Overview\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";;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) {pug_html = pug_html + \"\\u003Cdiv class=\\\"add-card__panel\\\"\\u003E\\u003Cdiv class=\\\"text-info add-card__text-info\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Dashboard_AddCard_DescInfo')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cdiv\" + (\" class=\\\"add-card__card-container\\\"\"+\" role=\\\"listbox\\\"\"+pug.attr(\"aria-label\", i18n.getString('Dashboard_AddCard'), true, true)+\" aria-multiselectable=\\\"true\\\" data-bind=\\\"foreach: allCards\\\"\") + \"\\u003E\\u003Cdiv class=\\\"pull-left add-card__card-wrapper\\\"\\u003E\\u003Cdiv class=\\\"add-card__card\\\"\\u003E\\u003Cdiv class=\\\"add-card__card-box\\\" role=\\\"option\\\" data-bind=\\\"css: {'add-card__card-box--selected': $data.selected}, event: { keypress: $parent.onKeyPress, click: $parent.onThumbnailClicked, focus: $parent.onFocus }, attr: { 'aria-selected': $data.selected() ? 'true' : 'false', tabindex: $parent.firstFocusedIndex() == $index() ? 0 : -1 }\\\"\\u003E\\u003Cdiv class=\\\"add-card-indicator\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"add-card__thumbnail\\\" data-bind=\\\"css: $data.appliedClass\\\"\\u003E\\u003Cdiv class=\\\"add-card__card-title\\\" data-bind=\\\"text: $data.addCardTitle\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"add-card__image\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"add-card__description\\\" data-bind=\\\"text: $data.desc\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"form\\\"\\u003E\\u003Cdiv class=\\\"add-card__button-container\\\"\\u003E\\u003Cbutton class=\\\"btn btn-primary save\\\" type=\\\"button\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Dashboard_AddCard_Save')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"btn btn-default cancel\\\" type=\\\"button\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Dashboard_AddCard_Cancel')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fbutton\\u003E\\u003Cdiv class=\\\"text-info add-card__text-info\\\"\\u003E\\u003Cspan data-bind=\\\"text: i18n.getString("Dashboard_AddCard_TilesSelected", selectedTilesNumber())\\\"\\u003E\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";}.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;pug_html = pug_html + \"\\u003Cdiv class=\\\"dashboard__new-tile-banner\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"mcc_too_many-accounts\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"dashboard__toolbar\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"dashboard__card-panel\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"summarypage-bifreshtime\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";;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 (_TL_, accountTimeZoneText, appendLearnMoreLink, i18n) {pug_html = pug_html + ((null == (pug_interp = appendLearnMoreLink(i18n.getString('BITimeStampNotes_Label'), 'ext54480')) ? \"\" : pug_interp) + \"\\u003Cbr\\u003E\" + (null == (pug_interp = appendLearnMoreLink(i18n.getString('MRCAccredited_Label'), '', {linkText:i18n.getString(_TL_('Learn more. ')),label:i18n.getString('MRCAccredited_Label'),} , 'https://about.ads.microsoft.com/en-us/resources/policies/microsoft-advertising-click-measurement-description-of-methodology')) ? \"\" : pug_interp) + (null == (pug_interp = appendLearnMoreLink(i18n.getString('DateRange_Timezone',accountTimeZoneText), 'ext54483')) ? \"\" : pug_interp));}.call(this,\"_TL_\" in locals_for_with?locals_for_with._TL_:typeof _TL_!==\"undefined\"?_TL_:undefined,\"accountTimeZoneText\" in locals_for_with?locals_for_with.accountTimeZoneText:typeof accountTimeZoneText!==\"undefined\"?accountTimeZoneText:undefined,\"appendLearnMoreLink\" in locals_for_with?locals_for_with.appendLearnMoreLink:typeof appendLearnMoreLink!==\"undefined\"?appendLearnMoreLink:undefined,\"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) {pug_html = pug_html + \"\\u003Csup class=\\\"new-feature-label\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('New_Feature_Label')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fsup\\u003E\";}.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, newTileMsg) {pug_html = pug_html + \"\\u003Cdiv class=\\\"new-tile-msg\\\"\\u003E\\u003Cspan class=\\\"new-feature-label\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('New_Feature_Label')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003Cspan\\u003E\" + (pug.escape(null == (pug_interp = newTileMsg) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003Ca class=\\\"show-new-tile\\\" target=\\\"_blank\\\"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Dashboard_ShowMe')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"msg-dismiss-button\\\"\\u003E\\u003Cbutton class=\\\"closeimage close\\\"\\u003E\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\";}.call(this,\"i18n\" in locals_for_with?locals_for_with.i18n:typeof i18n!==\"undefined\"?i18n:undefined,\"newTileMsg\" in locals_for_with?locals_for_with.newTileMsg:typeof newTileMsg!==\"undefined\"?newTileMsg: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 (warning) {pug_html = pug_html + \"\\u003Cdiv\\u003E\" + (null == (pug_interp = warning) ? \"\" : pug_interp) + \"\\u003C\\u002Fdiv\\u003E\";}.call(this,\"warning\" in locals_for_with?locals_for_with.warning:typeof warning!==\"undefined\"?warning: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 (metric, s$i18n) {pug_html = pug_html + \"\\u003Cdiv class=\\\"metric-picker__button metric-picker__button--single dropdown-toggle\\\" role=\\\"button\\\" tabindex=\\\"0\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\"\\u003E\\u003Cdiv class=\\\"metric-picker__name\\\"\\u003E\" + (pug.escape(null == (pug_interp = s$i18n.property('PerformanceMetrics', metric)) ? \"\" : pug_interp)) + \"\\u003C\\u002Fdiv\\u003E\\u003Cspan class=\\\"glyphicon glyphicon-triangle-bottom toolbar-icon pull-right\\\"\\u003E\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\";}.call(this,\"metric\" in locals_for_with?locals_for_with.metric:typeof metric!==\"undefined\"?metric:undefined,\"s$i18n\" in locals_for_with?locals_for_with.s$i18n:typeof s$i18n!==\"undefined\"?s$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 (buttonText, isCustomerLevel, popText, popTextAriaLabel) {pug_html = pug_html + \"\\u003Cdiv class=\\\"top-changes-card-header\\\"\\u003E\\u003Cdiv class=\\\"popComparisonRange\\\"\\u003E\" + (pug.escape(null == (pug_interp = popText) ? \"\" : pug_interp)) + \"\\u003Ca\" + (\" class=\\\"helpbutton\\\"\"+\" type=\\\"helppopup\\\"\"+pug.attr(\"aria-label\", popTextAriaLabel, true, true)+\" topic=\\\"pop_BA_Overview_TopChangesDateRange\\\" onclick=\\\"PopupController.PopupJsClick(this)\\\" href=\\\"javascript:void(0);\\\"\") + \"\\u003E\\u003C\\u002Fa\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"metric-container\\\"\\u003E\\u003Cdiv class=\\\"dev\\\" data-ref=\\\"metric-picker\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"div\\\" data-ref=\\\"grid-content\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";\nif ((buttonText)) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"entity-links\\\"\\u003E\\u003Cspan class=\\\"view-all-clickLink\\\" href=\\\"javascript:void(0);\\\" role=\\\"presentation\\\" tabindex=\\\"-1\\\"\\u003E\\u003Cbutton class=\\\"btn-default btn\\\" type=\\\"button\\\"\\u003E\" + (pug.escape(null == (pug_interp = buttonText) ? \"\" : pug_interp)) + \"\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003Ca\" + (\" class=\\\"HelpTopic hiddenHelpBridge\\\"\"+pug.attr(\"query\", isCustomerLevel ? 'help:ext60045': 'help:app54555', true, true)+\" href=\\\"javascript:void(0);\\\" style=\\\"display:none\\\"\") + \"\\u003E\\u003C\\u002Fa\\u003E\";}.call(this,\"buttonText\" in locals_for_with?locals_for_with.buttonText:typeof buttonText!==\"undefined\"?buttonText:undefined,\"isCustomerLevel\" in locals_for_with?locals_for_with.isCustomerLevel:typeof isCustomerLevel!==\"undefined\"?isCustomerLevel:undefined,\"popText\" in locals_for_with?locals_for_with.popText:typeof popText!==\"undefined\"?popText:undefined,\"popTextAriaLabel\" in locals_for_with?locals_for_with.popTextAriaLabel:typeof popTextAriaLabel!==\"undefined\"?popTextAriaLabel: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 (customClass, texts) {// iterate texts\n;(function(){\n var $$obj = texts;\n if ('number' == typeof $$obj.length) {\n for (var pug_index0 = 0, $$l = $$obj.length; pug_index0 < $$l; pug_index0++) {\n var text = $$obj[pug_index0];\npug_html = pug_html + \"\\u003Cp\" + (pug.attr(\"class\", pug.classes([customClass], [true]), false, true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = text) ? \"\" : pug_interp)) + \"\\u003C\\u002Fp\\u003E\";\n }\n } else {\n var $$l = 0;\n for (var pug_index0 in $$obj) {\n $$l++;\n var text = $$obj[pug_index0];\npug_html = pug_html + \"\\u003Cp\" + (pug.attr(\"class\", pug.classes([customClass], [true]), false, true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = text) ? \"\" : pug_interp)) + \"\\u003C\\u002Fp\\u003E\";\n }\n }\n}).call(this);\n}.call(this,\"customClass\" in locals_for_with?locals_for_with.customClass:typeof customClass!==\"undefined\"?customClass:undefined,\"texts\" in locals_for_with?locals_for_with.texts:typeof texts!==\"undefined\"?texts: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 (className, value) {var cls = className || '';\npug_html = pug_html + \"\\u003Cspan\" + (pug.attr(\"class\", pug.classes([\"grid-cell-text\",cls], [false,true]), false, true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = value) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\";}.call(this,\"className\" in locals_for_with?locals_for_with.className:typeof className!==\"undefined\"?className:undefined,\"value\" in locals_for_with?locals_for_with.value:typeof value!==\"undefined\"?value: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 (helpAriaLabel, helpId, title) {pug_mixins[\"popupHelp\"] = pug_interp = function(popupId){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\npug_html = pug_html + \"\\u003Ca\" + (\" class=\\\"helpbutton\\\"\"+\" type=\\\"helppopup\\\"\"+pug.attr(\"topic\", popupId, true, true)+pug.attr(\"data-help\", true, true, true)+\" onclick=\\\"PopupController.PopupJsClick(this)\\\" href=\\\"javascript:void(0);\\\"\"+pug.attr(\"aria-label\", helpAriaLabel, true, true)) + \"\\u003E\\u003C\\u002Fa\\u003E\";\n};\npug_html = pug_html + \"\\u003Cspan class=\\\"grid-header-text\\\"\\u003E\" + (pug.escape(null == (pug_interp = title) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\";\nif (helpId) {\npug_html = pug_html + \"\\u003Cspan class=\\\"grid-header-helpId\\\"\\u003E\";\npug_mixins[\"popupHelp\"](helpId);\npug_html = pug_html + \"\\u003C\\u002Fspan\\u003E\";\n}}.call(this,\"helpAriaLabel\" in locals_for_with?locals_for_with.helpAriaLabel:typeof helpAriaLabel!==\"undefined\"?helpAriaLabel:undefined,\"helpId\" in locals_for_with?locals_for_with.helpId:typeof helpId!==\"undefined\"?helpId:undefined,\"title\" in locals_for_with?locals_for_with.title:typeof title!==\"undefined\"?title: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 (ariaLabel, html, icon) {var classIcon = icon === 'plus' ? ['pop-expand', 'iconba', 'iconba-Add'] : ['pop-collapse', 'iconba', 'iconba-Remove'];\npug_html = pug_html + (\"\\u003Cspan\" + (\" class=\\\"pop-toggle-icon clickable\\\"\"+\" tabindex=\\\"0\\\" role=\\\"button\\\"\"+pug.attr(\"aria-label\", ariaLabel, true, true)) + \"\\u003E\\u003Cspan\" + (pug.attr(\"class\", pug.classes([classIcon], [true]), false, true)) + \"\\u003E\\u003C\\u002Fspan\\u003E\\u003C\\u002Fspan\\u003E\" + (null == (pug_interp = html) ? \"\" : pug_interp));}.call(this,\"ariaLabel\" in locals_for_with?locals_for_with.ariaLabel:typeof ariaLabel!==\"undefined\"?ariaLabel:undefined,\"html\" in locals_for_with?locals_for_with.html:typeof html!==\"undefined\"?html:undefined,\"icon\" in locals_for_with?locals_for_with.icon:typeof icon!==\"undefined\"?icon: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 (expanded, hasSegment, helpAriaLabel, helpId, isAggregate, value) {if (isAggregate) {\nif (hasSegment) {\nif (expanded) {\npug_html = pug_html + \"\\u003Cspan\" + (\" class=\\\"icon-right glyphicon glyphicon-triangle-bottom\\\"\"+\" role=\\\"button\\\" tabindex=\\\"0\\\" aria-expanded=\\\"true\\\"\"+pug.attr(\"aria-label\", value, true, true)) + \"\\u003E\\u003C\\u002Fspan\\u003E\";\n}\nelse {\npug_html = pug_html + \"\\u003Cspan\" + (\" class=\\\"icon-right glyphicon glyphicon-triangle-right\\\"\"+\" role=\\\"button\\\" tabindex=\\\"0\\\" aria-expanded=\\\"false\\\"\"+pug.attr(\"aria-label\", value, true, true)) + \"\\u003E\\u003C\\u002Fspan\\u003E\";\n}\n}\npug_html = pug_html + \"\\u003Cspan\\u003E\" + (pug.escape(null == (pug_interp = value) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\";\nif (helpId) {\npug_html = pug_html + \"\\u003Ca\" + (\" class=\\\"helpbutton\\\"\"+\" role=\\\"button\\\" type=\\\"helppopup\\\"\"+pug.attr(\"topic\", helpId, true, true)+pug.attr(\"data-help\", true, true, true)+\" onclick=\\\"PopupController.PopupJsClick(this)\\\" href=\\\"javascript:void(0);\\\" aria-haspopup=\\\"true\\\"\"+pug.attr(\"aria-label\", helpAriaLabel, true, true)) + \"\\u003E\\u003C\\u002Fa\\u003E\";\n}\n}\nelse {\npug_html = pug_html + \"\\u003Cdiv class=\\\"segment-value\\\"\\u003E\\u003Cspan\\u003E\" + (pug.escape(null == (pug_interp = value) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\";\n}}.call(this,\"expanded\" in locals_for_with?locals_for_with.expanded:typeof expanded!==\"undefined\"?expanded:undefined,\"hasSegment\" in locals_for_with?locals_for_with.hasSegment:typeof hasSegment!==\"undefined\"?hasSegment:undefined,\"helpAriaLabel\" in locals_for_with?locals_for_with.helpAriaLabel:typeof helpAriaLabel!==\"undefined\"?helpAriaLabel:undefined,\"helpId\" in locals_for_with?locals_for_with.helpId:typeof helpId!==\"undefined\"?helpId:undefined,\"isAggregate\" in locals_for_with?locals_for_with.isAggregate:typeof isAggregate!==\"undefined\"?isAggregate:undefined,\"value\" in locals_for_with?locals_for_with.value:typeof value!==\"undefined\"?value: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, segmentationType) {if ((segmentationType === 'GoalName' || segmentationType === 'GoalType' || segmentationType === 'GoalCategory')) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"form-group segment-alert-msg\\\"\\u003E\\u003Cspan\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Segment_Conversion_Invalid_Alert_Message')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003Ca\" + (\" class=\\\"HelpTopic\\\"\"+\" query=\\\"help:app51239\\\" href=\\\"javascript:void(0);\\\"\"+pug.attr(\"aria-label\", i18n.getString('Segment_Time_Invalid_Alert_Learn_More_Segment'), true, true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Segment_Time_Invalid_Alert_Learn_More')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse\nif ((segmentationType === 'AudienceName' || segmentationType === 'AudienceType')) {\npug_html = pug_html + \"\\u003Cdiv class=\\\"form-group segment-alert-msg\\\"\\u003E\\u003Cspan\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Segment_Audience_Invalid_Alert_Message')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003Ca\" + (\" class=\\\"HelpTopic\\\"\"+\" query=\\\"help:app51239\\\" href=\\\"javascript:void(0);\\\"\"+pug.attr(\"aria-label\", i18n.getString('Segment_Time_Invalid_Alert_Learn_More_Segment'), true, true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Segment_Time_Invalid_Alert_Learn_More')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\nelse {\npug_html = pug_html + \"\\u003Cdiv class=\\\"form-group segment-alert-msg\\\"\\u003E\\u003Cspan\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Segment_Time_Invalid_Alert_Message')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Cul style=\\\"list-style-type: disc; padding-left: 40px\\\"\\u003E\\u003Cli\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Segment_Time_Invalid_Alert_Message_Example_Too_Long')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fli\\u003E\\u003Cli\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Segment_Time_Invalid_Alert_Message_Example_Too_Short')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fli\\u003E\\u003C\\u002Ful\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Cspan\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Segment_Time_Invalid_Alert_Message_Check')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fspan\\u003E\\u003Ca\" + (\" class=\\\"HelpTopic\\\"\"+\" query=\\\"help:app51239\\\" href=\\\"javascript:void(0);\\\"\"+pug.attr(\"aria-label\", i18n.getString('Segment_Time_Invalid_Alert_Learn_More_Segment'), true, true)) + \"\\u003E\" + (pug.escape(null == (pug_interp = i18n.getString('Segment_Time_Invalid_Alert_Learn_More')) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\\u003C\\u002Fdiv\\u003E\";\n}\npug_html = pug_html + \"\\u003Cdiv class=\\\"save-bar form-group segment-alert-ok\\\"\\u003E\\u003Cinput\" + (\" class=\\\"btn btn-default\\\"\"+\" type=\\\"button\\\" tabindex=\\\"0\\\"\"+pug.attr(\"aria-label\", i18n.getString('Segment_Time_Invalid_Alert_OK'), true, true)+pug.attr(\"value\", i18n.getString('Segment_Time_Invalid_Alert_OK'), true, true)) + \"\\u003E\\u003C\\u002Fdiv\\u003E\";}.call(this,\"i18n\" in locals_for_with?locals_for_with.i18n:typeof i18n!==\"undefined\"?i18n:undefined,\"segmentationType\" in locals_for_with?locals_for_with.segmentationType:typeof segmentationType!==\"undefined\"?segmentationType:undefined));;return pug_html;};\nmodule.exports = template;","import { actionButtonStyle, topBannerContentStyle } from '@bingads-webui-react/notification-center';\r\n\r\nexport const miniCalloutStyle = () => {\r\n return {\r\n content: topBannerContentStyle,\r\n calloutTargetContainer: {\r\n display: 'inline-block',\r\n cursor: 'pointer',\r\n flexShrink: 0,\r\n },\r\n calloutCloseButton: {\r\n top: 9,\r\n width: 12,\r\n right: 8,\r\n border: '0px !important',\r\n height: '13px !important',\r\n padding: '0px 0px 0px 0px !important',\r\n position: 'absolute !important',\r\n maxWidth: 12,\r\n minWidth: '12px !important',\r\n background: 'inherit !important',\r\n maxHeight: 13,\r\n minHeight: 13,\r\n },\r\n popover: {\r\n zIndex: 1110000, // should be larger than z-index of floating banner\r\n },\r\n button: {\r\n ...actionButtonStyle,\r\n '&:hover, &:active, &:focus': {\r\n '& .iconba-OpenInNewWindow': {\r\n display: 'block',\r\n },\r\n },\r\n },\r\n innerText: {\r\n fontSize: 12,\r\n },\r\n innerTextInLink: {\r\n textDecoration: 'underline',\r\n },\r\n openIcon: {\r\n position: 'absolute',\r\n top: 4,\r\n right: 4,\r\n display: 'none',\r\n },\r\n openIconInLink: {\r\n paddingLeft: 4,\r\n },\r\n title: {\r\n minWidth: '232px',\r\n fontSize: '20px',\r\n lineHeight: '28px',\r\n paddingBottom: '10px',\r\n fontWeight: '600',\r\n },\r\n };\r\n};\r\n\r\nexport const calloutContentStyle = () => {\r\n return {\r\n link: {\r\n fontSize: '16px !important',\r\n fontFamily: 'Segoe UI !important',\r\n fontWeight: '400 !important',\r\n lineHeight: '19px !important',\r\n color: '#0078D4 !important',\r\n padding: '5px !important',\r\n height: 'auto !important',\r\n whiteSpace: 'normal !important',\r\n textAlign: 'left !important',\r\n minWidth: '232px !important',\r\n },\r\n message: {\r\n fontFamily: 'Segoe UI',\r\n minWidth: '232px',\r\n fontSize: '12px',\r\n lineHeight: '22px',\r\n paddingBottom: '10px',\r\n },\r\n };\r\n};\r\n","/** ************************ Core Interface Start ****************************** */\r\n\r\nimport {\r\n INotification, TargetComponent, NotificationLevel, DismissMode, ScopeLevel, ExtraOptions\r\n} from '@bingads-webui-react/notification-center';\r\n\r\nexport { INotification, TargetComponent, NotificationLevel, DismissMode, ScopeLevel, ExtraOptions };\r\n\r\nexport interface IScope {\r\n values: {\r\n aid: string | number;\r\n cid: string | number;\r\n uid: string | number | null;\r\n adGroupId: string | number | null;\r\n campaignId: string | number | null;\r\n };\r\n location: {\r\n hash: string;\r\n pathname: string;\r\n search: string;\r\n };\r\n}\r\n\r\nexport enum NotificationEntityType {\r\n accountSuspended = 12,\r\n adBlockWarning = 26,\r\n budgetOpportunity = 5,\r\n disapproved = 7,\r\n import = 1,\r\n incompatibleBrowsers = 22,\r\n introBingAdsforioS = 20,\r\n keywordOpportunity = 6,\r\n maintenance = 11,\r\n migration = 4,\r\n none = 0\r\n}\r\n\r\nexport type EnvType = 'OldUI' | 'New UI';\r\n","import classNames from 'classnames';\r\nimport React from 'react';\r\nimport { Button, Glyphicon } from '@bingads-webui-react/primitive';\r\nimport { withDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\n// @ts-ignore\r\nimport { Callout } from '@bingads-webui-react/callout';\r\n// @ts-ignore\r\nimport { withI18nConsumer } from '@bingads-webui-react/i18n-context';\r\n// @ts-ignore\r\nimport { miniCalloutStyle, calloutContentStyle } from './mini-callout-styles';\r\nimport { TargetComponent } from '../types';\r\n\r\ninterface ICalloutContentProps {\r\n link: string,\r\n handleClose: Function,\r\n i18n: any,\r\n classes: any,\r\n}\r\n\r\nclass unstyleCalloutContent extends React.PureComponent {\r\n render() {\r\n const ContentMessage = this.props.i18n.getString(_TL_(\"This feature isn't available in the new version yet.\"));\r\n const LinkMessage = this.props.i18n.getString(_TL_('Go to this feature in previous Microsoft Advertising.'));\r\n const { classes } = this.props;\r\n const clickAction = (e: any) => {\r\n this.props.handleClose(e);\r\n window.open(this.props.link);\r\n }\r\n\r\n return (\r\n \r\n
    \r\n {ContentMessage}\r\n
    \r\n
    \r\n \r\n \r\n {LinkMessage}\r\n \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport const CalloutContent = withI18nConsumer(withDefaultStyles(unstyleCalloutContent, calloutContentStyle));\r\n\r\ninterface IMiniCalloutProps {\r\n innerText: string,\r\n href: string,\r\n bannerType: TargetComponent,\r\n i18n: any,\r\n classes: any,\r\n handleClick: any,\r\n}\r\n\r\ninterface IMiniCalloutState {\r\n showCallout: boolean,\r\n}\r\n\r\nclass unstyleMiniCallout extends React.PureComponent {\r\n static defaultProps = {\r\n // eslint-disable-next-line react/default-props-match-prop-types\r\n handleClick: () => {},\r\n };\r\n\r\n constructor(props: IMiniCalloutProps) {\r\n super(props);\r\n this.state = {\r\n showCallout: false,\r\n };\r\n }\r\n\r\n handleCalloutClose = () => {\r\n this.setState({ showCallout: false });\r\n }\r\n\r\n handleClick = (event: any) => {\r\n // eslint-disable-next-line no-mixed-operators\r\n if (event.type === 'click' || event.type === 'keydown' && [13, 32].indexOf(event.which) >= 0) {\r\n this.setState(state => ({\r\n showCallout: !state.showCallout,\r\n }));\r\n if (this.props.bannerType === TargetComponent.TopBanner) {\r\n this.props.handleClick?.();\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n const { classes, innerText, href, i18n, bannerType } = this.props;\r\n return (\r\n {innerText}}\r\n content={}\r\n show={this.state.showCallout}\r\n onClose={this.handleCalloutClose}\r\n focusLockContent\r\n >\r\n { // According to designer, top banner uses button and floating banner uses hyperlink for action\r\n bannerType === TargetComponent.TopBanner ?\r\n
    \r\n {innerText}\r\n \r\n
    :\r\n // eslint-disable-next-line jsx-a11y/anchor-is-valid, jsx-a11y/no-noninteractive-tabindex, jsx-a11y/no-static-element-interactions\r\n \r\n {innerText}\r\n \r\n \r\n }\r\n \r\n );\r\n }\r\n}\r\n\r\nexport const MiniCallout = withI18nConsumer(withDefaultStyles(unstyleMiniCallout, miniCalloutStyle));\r\n","import React from 'react';\r\nimport classNames from 'classnames';\r\nimport { withInstrumentation } from '@bingads-webui-react/hoc-with-instrumentation';\r\nimport { withDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { MiniCallout } from '../utils/mini-callout';\r\nimport { miniCalloutStyle } from '../utils/mini-callout-styles';\r\nimport { TargetComponent } from '../types';\r\n\r\ninterface IMiniCalloutProps {\r\n message: string,\r\n notificationId: string,\r\n i18n: any,\r\n classes: any,\r\n linkTarget?: string;\r\n}\r\n\r\nclass unstyleMiniCallout extends React.PureComponent {\r\n logger: any;\r\n bindedHandleClick: any;\r\n logHandlers: Map void>;\r\n innerTexts: string[];\r\n titleText: string;\r\n isPureAlink: boolean;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.logger = props?.instrumentation?.notificationTopBanner?.create?.()?.actionLink?.create?.();\r\n this.bindedHandleClick = this.handleClick.bind(this);\r\n this.logHandlers = new Map();\r\n this.innerTexts = [];\r\n this.titleText = '';\r\n this.isPureAlink = false;\r\n }\r\n\r\n removeClickEvents(renderedEls: HTMLElement[] = []) {\r\n const elsToRemove = new Map(this.logHandlers);\r\n renderedEls.forEach((el) => { elsToRemove.delete(el); });\r\n elsToRemove.forEach((handler, el) => {\r\n el.removeEventListener('click', handler, true);\r\n this.logHandlers.delete(el);\r\n });\r\n }\r\n\r\n bindClickEvent() {\r\n if (this.isPureAlink) {\r\n const className = 'notification-center-top-banner-action';\r\n const element = document.getElementsByClassName(className);\r\n if (element[0]) {\r\n const AElements = Array.prototype.slice.call(element[0].getElementsByTagName('a'));\r\n this.removeClickEvents(AElements);\r\n AElements.forEach((AElement, i) => {\r\n if (!this.logHandlers.has(AElement)) {\r\n const handler = () => this.bindedHandleClick(i);\r\n AElement.addEventListener('click', handler, true);\r\n this.logHandlers.set(AElement, handler);\r\n this.innerTexts[i] = AElement.innerText;\r\n }\r\n });\r\n this.log(`binded, titleText=${this.titleText}, innerText=[${this.innerTexts}], notificationId=${this.props.notificationId}`);\r\n }\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.bindClickEvent();\r\n this.log(`showed, titleText=${this.titleText}, innerText=[${this.innerTexts}], notificationId=${this.props.notificationId}`);\r\n }\r\n\r\n componentDidUpdate() {\r\n this.bindClickEvent();\r\n }\r\n\r\n log(message) {\r\n this.logger?.trace(message);\r\n }\r\n\r\n handleClick(index = 0) {\r\n this.log(`clicked, titleText=${this.titleText}, innerText=${this.innerTexts[index]}, notificationId=${this.props.notificationId}`);\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this.isPureAlink) {\r\n this.removeClickEvents();\r\n }\r\n }\r\n\r\n render() {\r\n const { classes, i18n, linkTarget } = this.props;\r\n const doc = (new DOMParser()).parseFromString(this.props.message, 'text/html');\r\n const aElements = doc.body.getElementsByTagName('a');\r\n const openInNewWindow = aElements.length !== 0 && aElements[0].getElementsByClassName('iconba-OpenInNewWindow').length !== 0;\r\n if (aElements.length <= 0) {\r\n this.titleText = doc.body.innerText;\r\n return ()\r\n } else if (!openInNewWindow) {\r\n const aTags = Array.prototype.slice.call(aElements).map((el: HTMLLinkElement) => {\r\n const aTag = doc.body.removeChild(el);\r\n aTag.classList.add(classes.button);\r\n if (!aTag.style.color) {\r\n aTag.style.color = 'black';\r\n }\r\n\r\n if (linkTarget) {\r\n aTag.setAttribute('target', linkTarget);\r\n }\r\n return aTag.outerHTML;\r\n }).join('');\r\n this.titleText = doc.body.innerHTML;\r\n this.isPureAlink = true;\r\n return (\r\n \r\n {doc.body.innerHTML}\r\n \r\n \r\n )\r\n }\r\n\r\n const aElement = doc.body.getElementsByTagName('a')[0];\r\n const { innerText } = aElement;\r\n const { href } = aElement;\r\n\r\n while (doc.body.getElementsByTagName('a').length > 0) { doc.body.removeChild(doc.body.getElementsByTagName('a')[0]); }\r\n\r\n this.titleText = doc.body.innerHTML;\r\n this.innerTexts = [innerText];\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n\r\nexport const MiniCalloutWrapper = withInstrumentation(withDefaultStyles(unstyleMiniCallout, miniCalloutStyle));\r\n","import { getTopBannerLayoutWithStore } from '@bingads-webui-react/notification-center';\r\nimport { NotificationStore } from '../notification-store';\r\n\r\nimport { MiniCalloutWrapper } from './mini-callout';\r\n\r\nexport const getTopBannerLayout = (store: NotificationStore) => getTopBannerLayoutWithStore(store, MiniCalloutWrapper);\r\n","export const i18nMap = {\r\n Alert_Account_suspended: _TL_('Your account has been suspended because of suspicious activity. Please contact Microsoft Advertising support'),\r\n LearnMore: _TL_('Learn more'),\r\n UnifiedNotificationQueue_DownForMaintenance_New_Title: _TL_('Microsoft Advertising down for maintenance'),\r\n UnifiedNotificationQueue_DownForMaintenance_New_Message: _TL_(\r\n \"Microsoft Advertising is down for planned maintenance from {{start}} to {{end}}. Your ads will continue to run, but you can't sign in during this period.\",\r\n {\r\n comment: '{{start}}, {{end}} are placeholders',\r\n }\r\n ),\r\n UnifiedNotificationQueue_Alert_AdBlockWarning_Title: _TL_('An ad-blocking extension is stopping your ads'),\r\n UnifiedNotificationQueue_Alert_AdBlockWarning_Message: _TL_('It looks like you have a browser extension that might be interfering with Microsoft Advertising tools. Please disable this extension.'),\r\n UnifiedNotificationQueue_Alert_IncompatibleBrowsers_Title: _TL_('Microsoft Advertising works better on newer browsers'),\r\n UnifiedNotificationQueue_Alert_IncompatibleBrowsers_Message: _TL_(\"Microsoft Advertising no longer supports the browser you're using. For the best Microsoft Advertising experience, please upgrade to a newer browser.\"),\r\n UnifiedNotificationQueue_Alert_DisapprovedEntityMessageTemplate_New_Title: _TL_('Ad content was not approved'),\r\n UnifiedNotificationQueue_Alert_DisapprovedAdResource_New_Title: _TL_('Ad resource was not approved'),\r\n UnifiedNotificationQueue_Alert_DisapprovedEntityMessageTemplate_New_Plural_Title: _TL_('Ad content was not approved for {0} accounts'),\r\n UnifiedNotificationQueue_Alert_DisapprovedSmartCampaignAd_Title: _TL_('Smart campaign ad content was not approved', {\r\n locked: true,\r\n comment: 'string is not finalized.',\r\n }),\r\n UnifiedNotificationQueue_Alert_DisapprovedSmartListing_Title: _TL_('Smart campaign products or services was not approved', {\r\n locked: true,\r\n comment: 'string is not finalized.',\r\n }),\r\n UnifiedNotificationQueue_Alert_DisapprovedSmartListingV2_Title: _TL_('Smart campaign keyword themes was not approved', {\r\n locked: true,\r\n comment: 'string is not finalized.',\r\n }),\r\n UnifiedNotificationQueue_Alert_OneDisapprovedEntityMessageTemplate_New_Message: _TL_(\"Review your {{disapprovedEntity}} ({{numberOfDisapprovedEntities}}). An ad can't run until it and at least one keyword are approved.\"),\r\n UnifiedNotificationQueue_Alert_OneDisapprovedAdresource_New_Message: _TL_(\"Review your {{disapprovedEntity}} ({{numberOfDisapprovedEntities}}). An ad can't run until the related videos are valid.\"),\r\n UnifiedNotificationQueue_Alert_TwoDisapprovedEntityMessageTemplate_New_Message: _TL_(\"Review your {{disapprovedAds}} ({{numberOfDisapprovedAds}}) or {{disapprovedKeywords}} ({{numberOfDisapprovedKeywords}}). An ad can't run until it and at least one keyword are approved.\"),\r\n UnifiedNotificationQueue_Alert_DisapprovedSmartCampaignAd_Message: _TL_('Review your ({{number}}) disapproved ads in smart campaigns.', {\r\n locked: true,\r\n comment: 'string is not finalized.',\r\n }),\r\n UnifiedNotificationQueue_Alert_DisapprovedSmartListing_Message: _TL_('Review your ({{number}}) disapproved products or services in smart campaigns.', {\r\n locked: true,\r\n comment: 'string is not finalized.',\r\n }),\r\n UnifiedNotificationQueue_Alert_DisapprovedSmartListingV2_Message: _TL_('Review your ({{number}}) disapproved keyword themes in smart campaigns.', {\r\n locked: true,\r\n comment: 'string is not finalized.',\r\n }),\r\n UnifiedNotificationQueue_Action_ReviewAds: _TL_('Review Ads'),\r\n UnifiedNotificationQueue_Action_ReviewKeywords: _TL_('Review keywords'),\r\n UnifiedNotificationQueue_Action_ReviewAdsOrKeywords: _TL_('Review {{disapprovedEntity}} ({{numberOfDisapprovedEntities}})'),\r\n UnifiedNotificationQueue_Action_AutoTaggingLink: _TL_('Enable auto-tagging of Click ID'),\r\n UnifiedNotificationQueue_LastImportFailedInfoText_New_Title: _TL_('An error stopped your campaign import'),\r\n UnifiedNotificationQueue_LastImportFailedInfoText_New_Message: _TL_(\"An error has occurred and we couldn't finish importing your campaigns.\"),\r\n UnifiedNotificationQueue_Action_SeeErrorDetails: _TL_('See error details'),\r\n UnifiedNotificationQueue_PendingImportInfoText_Title: _TL_(\"Your import process didn't finish\"),\r\n UnifiedNotificationQueue_PendingImportInfoText_Message: _TL_(\"You started to import campaign data, but didn't finish the process.\"),\r\n UnifiedNotificationQueue_Action_RestartTheImport: _TL_('Restart the import'),\r\n Alert_NoEligible_Campaign: _TL_('None of your ads are running, because you have paused your campaigns. You need to enable your campaigns.'),\r\n Alert_NoEligible_AdGroup: _TL_('None of your ads are running, because you paused all of your ad groups. You need to enable your ad groups.'),\r\n Alert_NoEligible_Ad: _TL_('None of your ads are running, because you paused all of them. You need to enable your ads.'),\r\n Alert_NoEligible_Keyword: _TL_('None of your ads are running, because you paused all of your keywords. You need to enable your keywords.'),\r\n Alert_DisapprovedAds: _TL_('disapproved ads'),\r\n Alert_DisapprovedKeywords: _TL_('disapproved keywords'),\r\n Alert_DisapprovedSmartListing: _TL_('products or services'),\r\n Alert_DisapprovedSmartListing_V2: _TL_('keyword themes'),\r\n Alert_Uet_EnableAutoTagging_Title: _TL_('Enable auto-tagging of Click ID under URL options.'),\r\n Alert_Uet_EnableAutoTagging: _TL_('For accurate conversion tracking, enable auto-tagging of Click ID under URL options.'),\r\n Notification_Action_View: _TL_('View'),\r\n Notification_Action_Apply: _TL_('Apply'),\r\n Notifications: _TL_('Notifications'),\r\n ViewAll: _TL_('View all'),\r\n DismissAll: _TL_('Dismiss all'),\r\n EmptyText: _TL_('Nothing to see here.'),\r\n WhatsNew: _TL_(\"What's new\"),\r\n WhatsNewCheckOut: _TL_('We’ve got something shiny and new for you in Microsoft Advertising!'),\r\n ViewMore: _TL_('and more'),\r\n Dismiss: _TL_('Dismiss'),\r\n Warning: _TL_('Warning'),\r\n Critical: _TL_('Critical'),\r\n Opportunity: _TL_('Recommendation'),\r\n Information: _TL_('Informational'),\r\n Loading: _TL_('...Loading...'),\r\n HintMessage: _TL_('Not all pages are available in the new Microsoft Advertising experience. You may find that many of these actions will require you to use the current interface in order to take action on your notifications.'),\r\n CalloutLink: _TL_('Go to this feature in previous Microsoft Advertising.'),\r\n CalloutMessage: _TL_(\"This feature isn't available in the new version yet.\"),\r\n ClosePreviewBar: _TL_('Close the preview bar'),\r\n ClosePanel: _TL_('Close the panel'),\r\n UnifiedNotificationQueue_Google_ImportTaskTokenExpirationInfoText_Title: _TL_('Google import interrupted due to expired credentials'),\r\n UnifiedNotificationQueue_Google_ImportTaskTokenExpirationInfoText_Singular_Message: _TL_('{{count}} of your Google imports is interrupted, because your credentials expired or are about to expire. To resume your imports, please go to the Import schedule & history page and select the in the Action column to log in to your Google account.'),\r\n UnifiedNotificationQueue_Google_ImportTaskTokenExpirationInfoText_Plural_Message: _TL_('{{count}} of your Google imports are interrupted, because your credentials expired or are about to expire. To resume your imports, please go to the Import schedule & history page and select the in the Action column to log in to your Google account.'),\r\n UnifiedNotificationQueue_Facebook_ImportTaskTokenExpirationInfoText_Title: _TL_('Facebook import interrupted due to expired credentials'),\r\n UnifiedNotificationQueue_Facebook_ImportTaskTokenExpirationInfoText_Singular_Message: _TL_('{{count}} of your Facebook imports is interrupted, because your credentials expired or are about to expire. To resume your imports, please go to the Import schedule & history page and select the in the Action column to log in to your Facebook account.'),\r\n UnifiedNotificationQueue_Facebook_ImportTaskTokenExpirationInfoText_Plural_Message: _TL_('{{count}} of your Facebook imports are interrupted, because your credentials expired or are about to expire. To resume your imports, please go to the Import schedule & history page and select the in the Action column to log in to your Facebook account.'),\r\n UnifiedNotificationQueue_Google_ImportTaskTokenInvalidInfoText_Title: _TL_('Sign in again to your Google Ads account'),\r\n UnifiedNotificationQueue_Google_ImportTaskTokenInvalidInfoText_Singular_Message: _TL_('{{count}} of your Google Ads imports is interrupted. To resume your imports, please go to the Import schedule & history page. Navigate to the Actions column and select Learn more, which will prompt you to sign in again with your Google Ads account.'),\r\n UnifiedNotificationQueue_Google_ImportTaskTokenInvalidInfoText_Plural_Message: _TL_('{{count}} of your Google Ads imports are interrupted. To resume your imports, please go to the Import schedule & history page. Navigate to the Actions column and select Learn more, which will prompt you to sign in again with your Google Ads account.'),\r\n UnifiedNotificationQueue_Facebook_ImportTaskTokenInvalidInfoText_Title: _TL_('Sign in again to your Meta Ads account'),\r\n UnifiedNotificationQueue_Facebook_ImportTaskTokenInvalidInfoText_Singular_Message: _TL_('{{count}} of your Meta Ads imports is interrupted. To resume your imports, please go to the Import schedule & history page. Navigate to the Actions column and select Learn more, which will prompt you to sign in again with your Meta Ads account.'),\r\n UnifiedNotificationQueue_Facebook_ImportTaskTokenInvalidInfoText_Plural_Message: _TL_('{{count}} of your Meta Ads imports are interrupted. To resume your imports, please go to the Import schedule & history page. Navigate to the Actions column and select Learn more, which will prompt you to sign in again with your Meta Ads account.'),\r\n UnifiedNotificationQueue_PmaxImportRecommendation_Fail_InfoText_Title: _TL_('Sign in to Google Ads so that we can run your import'),\r\n UnifiedNotificationQueue_PmaxImportRecommendation_Fail_InfoText_Message: _TL_('We need access to your Google Ads account (username: {{username}}). Once you\\'ve signed in, we\\'ll run your planned import immediately. Learn more about importing from Google Ads'),\r\n UnifiedNotificationQueue_PmaxImportRecommendation_SignIn_And_Trigger_Runnow_Import_Success_Message: _TL_('Success! We were able to set up your Google import, and are currently importing your campaigns. You can review your {{redirectLink}}Import schedule & history{{/redirectLink}} any time. '),\r\n UnifiedNotificationQueue_PmaxImportRecommendation_Complete_InfoText_Title: _TL_('Your Performance Max campaigns have been successfully imported!'),\r\n UnifiedNotificationQueue_PmaxImportRecommendation_Complete_InfoText_Message: _TL_('Your Google Ads campaigns, including Performance Max campaigns, have been successfully imported. Select View Performance Max campaigns below.'),\r\n UnifiedNotificationQueue_PmaxImportRecommendation_CompleteWithoutPmax_InfoText_Title: _TL_('Your Performance Max campaigns weren\\'t imported'),\r\n UnifiedNotificationQueue_PmaxImportRecommendation_CompleteWithoutPmax_InfoText_Message: _TL_('You\\'ve imported your Google Ads campaigns, but we couldn\\'t find any Performance Max campaigns.'),\r\n UnifiedNotificationQueue_Action_GoToImportSchedulePage: _TL_('Go to Import schedule & history'),\r\n UnifiedNotificationQueue_Action_ViewPerformanceMaxCampaigns: _TL_('View Performance Max campaigns'),\r\n UnifiedNotificationQueue_Action_ViewCampaigns: _TL_('View campaigns'),\r\n UnifiedNotificationQueue_Action_SignInToGoogleAds: _TL_('Sign in to Google Ads'),\r\n UnifiedNotificationQueue_DraftStoreSetupInfoText_Title: _TL_('Complete the setup of your draft store'),\r\n UnifiedNotificationQueue_DraftStoreSetupInfoText_Message: _TL_('To ensure your campaign runs, please complete the setup of your draft store.'),\r\n UnifiedNotificationQueue_Pmax_CampaignUpgrade_Title: _TL_('Upgrade smart shopping campaigns to Performance Max campaigns'),\r\n UnifiedNotificationQueue_Pmax_CampaignUpgrade_Message: _TL_(\"We're excited to enhance your existing campaigns by upgrading them to Performance Max campaigns! This upgrade will maintain all your assets, settings, insights, and change histories from existing campaigns while expanding your reach and driving your performance by upgrading to Performance Max campaigns. After the upgrade is finished, you'll notice that your smart shopping campaigns' campaign type will be changed to Performance Max. This update usually takes about one day to complete.\"),\r\n UnifiedNotificationQueue_Location_Intent_Update_Title: _TL_('Your location targeting settings will be updated'),\r\n UnifiedNotificationQueue_Location_Intent_Update_Message: _TL_(\"To maximize ad reach, your location targeting settings will be updated in the next few weeks.
    One or more of your campaigns are only serving ads to potential customers searching for or viewing webpages about your targeted location(s). To boost ad visibility, we're updating your settings so that your campaigns also serve ads to potential customers physically in your targeted location(s).
    For more information about which campaigns are affected by this change, please review the email we've sent to the primary contact for your account.\"),\r\n UnifiedNotificationQueue_DeprecateSyndicationSearchOnly_Update_Title: _TL_('Change in ad distribution settings'),\r\n UnifiedNotificationQueue_DeprecateSyndicationSearchOnly_Update_Message: _TL_('Starting July 2024, you will no longer be able to create Shopping campaigns for brands that use the syndicated-only ad distribution setting (Bing, AOL, and Yahoo syndicated search partner sites).

    Review your ad distribution selections and update them as necessary. To help boost campaign performance, we recommend using the entire Microsoft Advertising Network as your ad distribution setting.

    We also recommend that you leverage auto-bidding to help manage your budget for ad delivery across the Microsoft Advertising Network and maximize your return on investment.'),\r\n};\r\n","import { isEmpty } from 'underscore';\r\nimport { CampaignType, convertFilteredCampaignTypeToFilter } from '@bingads-webui-campaign/campaign-ui-common';\r\nimport { FilterStorageFactory, WaterfallFilterType, WaterfallFilterStorage } from '@bingads-webui-campaign/filter-storage';\r\n\r\n// get waterfall filter store\r\nfunction getWaterfallFilterStore({ preferenceService }) {\r\n return new WaterfallFilterStorage({\r\n preferenceService,\r\n });\r\n}\r\n\r\n// get campaign filter store\r\nfunction getCampaignFilterStore({ preferenceService }) {\r\n const campaignFilterFactory = new FilterStorageFactory({\r\n preferenceService,\r\n featureName: 'CampaignsGrid',\r\n });\r\n const campaignFilterStore = campaignFilterFactory.create('editableFilter', {\r\n filterEntityOptions: {\r\n entitySchema: { name: 'Campaign' },\r\n },\r\n });\r\n return campaignFilterStore;\r\n}\r\n\r\n// get filter store preferences\r\nfunction getFilterStorePreferences({ preferenceService, filterStore, featureName }) {\r\n return preferenceService.findByName(filterStore.getStorageKey(featureName));\r\n}\r\n\r\n// get query for campaign filter\r\nfunction getCampaignFilterQuery({ campaignFilterType }) {\r\n let filterQuery = {};\r\n\r\n if (campaignFilterType === 'pmax') {\r\n // pmax campaign type filter\r\n filterQuery = {\r\n CampaignType: {\r\n $in: ['Enum.CampaignType\\'PerformanceMax\\''],\r\n },\r\n name: null,\r\n id: null,\r\n };\r\n }\r\n\r\n return filterQuery;\r\n}\r\n\r\n// reset campaign filter and redirect through callback\r\nexport async function resetCampaignFiltersAndRedirect({\r\n preferenceService, campaignFilterType, callback,\r\n}) {\r\n const waterfallFilterStore = getWaterfallFilterStore({ preferenceService }); // waterfall filter store\r\n const campaignFilterStore = getCampaignFilterStore({ preferenceService }); // campaign filter store\r\n const waterfallFilterPreferences = getFilterStorePreferences({ // waterfall filter preferences\r\n preferenceService,\r\n filterStore: waterfallFilterStore.waterfallFilterStorages[WaterfallFilterType.CampaignType],\r\n featureName: waterfallFilterStore.waterfallFilterStorages[WaterfallFilterType.CampaignType].featureName,\r\n });\r\n const campaignFilterPreferences = getFilterStorePreferences({ // campaign filter preferences\r\n preferenceService,\r\n filterStore: campaignFilterStore,\r\n featureName: { featureName: campaignFilterStore.permanentFilterStorage.featureName },\r\n });\r\n\r\n // set campaign type to all campaigns in waterfall filters\r\n // if the current campaign type is the same one, no update based on waterfall filter existing logic\r\n waterfallFilterStore.save(WaterfallFilterType.CampaignType, convertFilteredCampaignTypeToFilter(CampaignType.All));\r\n\r\n // set campaign type to campaignFilterType in campaign filter\r\n const campaignFilterQuery = getCampaignFilterQuery({ campaignFilterType }); // campaign filter query\r\n campaignFilterStore.save(!isEmpty(campaignFilterQuery) ? { query: campaignFilterQuery } : {});\r\n\r\n // must wait for the remote sync done to get the correct preferences\r\n const idList = []\r\n .concat((waterfallFilterPreferences && waterfallFilterPreferences.Id) || [])\r\n .concat((campaignFilterPreferences && campaignFilterPreferences.Id) || []);\r\n await preferenceService.onMultipleRemoteSyncDone(idList).then(() => {\r\n callback();\r\n });\r\n}\r\n","import _ from 'underscore';\r\n\r\nimport { isBillingLinkPermission as isBillingLinkPermissionFunc } from '@bingads-webui/multi-agency-utils';\r\n\r\nimport { ScopeLevel, IScope } from '../types/notification.types';\r\n\r\nexport * from './i18n-map';\r\n\r\nexport * from './filters';\r\n\r\nexport const supportLegacyI18n = (i18n: any, i18nMap: any) => ({\r\n getString: (key: string, options?: Object) => {\r\n const value: string = (i18nMap as any)[key];\r\n return i18n.getString(value, options);\r\n },\r\n getLocale: () => i18n.getLocale(),\r\n});\r\n\r\nexport function shouldRender(level: ScopeLevel, changeLevel: ScopeLevel): boolean {\r\n return changeLevel >= level;\r\n}\r\n\r\nexport function shouldClear(level: ScopeLevel, changeLevel: ScopeLevel): boolean {\r\n return changeLevel >= level;\r\n}\r\n\r\nexport function isAvailable(currentScope: IScope, availableScopes: ScopeLevel[] = []) {\r\n const { aid } = currentScope.values;\r\n const isCustomerScope = !aid;\r\n\r\n if (!_.isEmpty(availableScopes)\r\n && !_.contains(availableScopes, ScopeLevel.customer)\r\n && isCustomerScope) {\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nexport const generateUNQViewAllLink = (userContext: any, scopeValues: any) => () => {\r\n // verify aid existing in scope to confirm it's really in Account level\r\n const preFilter = scopeValues.aid && userContext.CurrentAccount && userContext.CurrentAccount.AccountNumber ? JSON.stringify([{\r\n Field: 'AccountNumber',\r\n Operator: 2,\r\n Values: userContext.CurrentAccount.AccountNumber,\r\n }]) : 'all';\r\n\r\n return {\r\n siteMapId: 'notifications',\r\n search: `?cid=${userContext.CurrentCustomer.Id}&uid=${userContext.CurrentUser.Id}&filter=${preFilter}`,\r\n };\r\n};\r\n\r\nexport function calcScopeLevel(scope: IScope) {\r\n let scopeLevel = ScopeLevel.root;\r\n if (_.isNumber(scope.values.cid) || _.isString(scope.values.cid)) scopeLevel = ScopeLevel.customer;\r\n if (_.isNumber(scope.values.aid) || _.isString(scope.values.aid)) scopeLevel = ScopeLevel.account;\r\n if (_.isNumber(scope.values.campaignId) || _.isString(scope.values.campaignId)) scopeLevel = ScopeLevel.campaign;\r\n if (_.isNumber(scope.values.adGroupId) || _.isString(scope.values.adGroupId)) scopeLevel = ScopeLevel.adGroup;\r\n return scopeLevel;\r\n}\r\n\r\nexport const SmartCampaignPathPrefix = '/campaign/smart';\r\n\r\nexport function isSmartCampaignPath(path: string): boolean {\r\n return _.isString(path) && path.toLowerCase().indexOf(SmartCampaignPathPrefix) === 0;\r\n}\r\n\r\n// Currently, CMUI ui-next and CCUI are using the shared site map, while\r\n// Smart Campaign uses its own router. If the navigation is\r\n// - from Smart to others; or\r\n// - from others to Smart\r\n// we need to manual add location.origin to the relative path.\r\n// We could update the condition here if we have more \"external\" sites.\r\nexport function shouldNavigateCrossSite(path: string, currentPath: string) : boolean {\r\n return isSmartCampaignPath(path) !== isSmartCampaignPath(currentPath);\r\n}\r\n\r\n// This function is used for checking whether agency is visiting billing-only linked account, in\r\n// this case, billing-unrelated notifications should be hidden.\r\nexport const isBillingLinkPermission = (settingsContext: any) => isBillingLinkPermissionFunc(settingsContext);\r\n","// @ts-ignore\r\nimport { getRoutePathById } from '@bingads-webui-campaign-react/with-site-map';\r\n// @ts-ignore\r\nimport URI from 'urijs';\r\nimport queryString from 'query-string';\r\nimport { History, Location } from 'history';\r\n\r\nimport { SmartCampaignPathPrefix, shouldNavigateCrossSite, isSmartCampaignPath, resetCampaignFiltersAndRedirect } from '../utils';\r\nimport { IRoute } from '../types/route.types';\r\nimport { IContext } from '../types/context.types';\r\n\r\nexport class Route implements IRoute {\r\n context: IContext;\r\n constructor(context: IContext) {\r\n this.context = context;\r\n }\r\n\r\n public getImportScheduleWithImportTypePath(importType) {\r\n const path = this.getPathById('import-schedule');\r\n const search = this.getImportScheduleWithImportTypeSearch(importType);\r\n const targetUrl = `${path}${search}`;\r\n\r\n return targetUrl;\r\n }\r\n\r\n public goImportSchedule() {\r\n const path = this.getPathById('import-schedule');\r\n this.goPath(path);\r\n }\r\n\r\n public goImportScheduleWithImportType(importType) {\r\n const targetUrl = this.getImportScheduleWithImportTypePath(importType);\r\n this.navigateByUrl(targetUrl);\r\n }\r\n\r\n public goGoogleImport() {\r\n const path = this.getPathById('import-google');\r\n this.goPath(path);\r\n }\r\n\r\n public getMetaImportWithImportSrcPath(importsrc) {\r\n const path = this.getPathById('import-facebook');\r\n const search = this.getMetaImportWithImportSrcSearch(importsrc);\r\n const targetUrl = `${path}${search}`;\r\n\r\n return targetUrl;\r\n }\r\n\r\n public goMetaimportWithImportSrc(importsrc) {\r\n const targetUrl = this.getMetaImportWithImportSrcPath(importsrc);\r\n this.navigateByUrl(targetUrl);\r\n }\r\n\r\n public goMetaImport() {\r\n const path = this.getPathById('import-facebook');\r\n this.goPath(path);\r\n }\r\n\r\n public goDisapprovedAds() {\r\n const path = this.getPathById('ads');\r\n const search = this.getDisapprovedSearch('filterDisapprovedAds');\r\n this.goPath(path, search);\r\n }\r\n\r\n public goDisapprovedAdResource() {\r\n const path = this.getPathById('ads');\r\n const search = this.getDisapprovedSearch('filterAdResourceInvalidAds');\r\n this.goPath(path, search);\r\n }\r\n\r\n public goDisapprovedKeywords() {\r\n const path = this.getPathById('keywords');\r\n const search = this.getDisapprovedSearch('filterDisapprovedKeywords');\r\n this.goPath(path, search);\r\n }\r\n\r\n public goMerchantCenterDraftStores() {\r\n const path = this.getPathById('mmc_placeholder_stores');\r\n\r\n const location: Location = this.context.getRouteLocation() as Location;\r\n const { values: { uid, cid, aid } } = this.context.getCurrentScope();\r\n\r\n // redirect to merchant center draft stores page if it is not the current page\r\n if (!location.pathname.match(path)) {\r\n // only include uid cid aid params since there might be other params in url which would make the merchant center page crash\r\n this.goPath(path, queryString.stringify({ uid, cid, aid }));\r\n }\r\n }\r\n\r\n public goMerchantCenterGMCImortPage(storeId) {\r\n const path = this.getPathById('mmc-import');\r\n const { values: { uid, cid, aid } } = this.context.getCurrentScope();\r\n const search = queryString.stringify({\r\n uid, cid, aid, storeId,\r\n });\r\n\r\n this.goPath(path, search);\r\n }\r\n\r\n public goTargetPage(siteMapId: string, search: string, fallbackHref: string) {\r\n const path = this.getPathById(siteMapId);\r\n if (path) {\r\n this.goPath(path, search);\r\n } else if (fallbackHref) {\r\n // the target page might not be in site map of current scope, so we need to fallback\r\n this.navigateByUrl(fallbackHref);\r\n }\r\n }\r\n\r\n // task 2687857: If we can get the path from site map, we could get rid of the hardcoded link\r\n public goAllSmartCampaigns() {\r\n // here we need to hack when we go to allSmart from smart itself. as smart is now using\r\n // a hash router, we cannot use the history push from global menu's none-hash router\r\n const location: Location = this.context.getRouteLocation() as Location;\r\n if (isSmartCampaignPath(location.pathname)) {\r\n window.location.hash = '#/';\r\n }\r\n this.goPath(SmartCampaignPathPrefix, '');\r\n }\r\n\r\n // go to all campaigns page\r\n // if any filter, could add related logic and use\r\n public async goAllCampaigns(campaignFilterType ?: string) {\r\n const path = this.getPathById('campaigns');\r\n const { values: { uid, cid, aid } } = this.context.getCurrentScope();\r\n const search = queryString.stringify({\r\n uid, cid, aid,\r\n });\r\n const targetUrl = `${path}?${search}`;\r\n const preferenceService = this.context.getPreferenceService();\r\n\r\n // reset related filters, then redirect to all campaigns page with correct filters\r\n await resetCampaignFiltersAndRedirect({\r\n preferenceService,\r\n campaignFilterType,\r\n callback: () => {\r\n this.navigateByUrl(targetUrl);\r\n },\r\n });\r\n }\r\n\r\n private getDisapprovedSearch(alias: string) {\r\n const disapproveStr = `filterAlias=${alias}`;\r\n const location: Location = this.context.getRouteLocation() as Location;\r\n const search = location && location.search ? `${location.search}&${disapproveStr}` : `?${disapproveStr}`;\r\n\r\n return search;\r\n }\r\n\r\n private getImportScheduleWithImportTypeSearch(importType: string) {\r\n const importTypeStr = `importType=${importType}`;\r\n const location: Location = this.context.getRouteLocation() as Location;\r\n\r\n // remove importType param if any\r\n location.search = location.search.replace(/&importType=.*&*/, '');\r\n\r\n const search = location && location.search ? `${location.search}&${importTypeStr}` : `?${importTypeStr}`;\r\n\r\n return search;\r\n }\r\n\r\n private getMetaImportWithImportSrcSearch(importsrc: string) {\r\n const location: Location = this.context.getRouteLocation() as Location;\r\n\r\n const urlSearchParams: URLSearchParams = new URLSearchParams(location.search);\r\n // set importsrc param if any, add importsrc if not exist\r\n urlSearchParams.set('importsrc', importsrc);\r\n\r\n return `?${urlSearchParams.toString()}`;\r\n }\r\n\r\n public getPathById(id: string) {\r\n const siteMap = this.context.getSiteMap();\r\n return getRoutePathById(siteMap, id);\r\n }\r\n\r\n public goPath(path: string, searchOri?: string) {\r\n const history: History = this.context.getRouteHistory() as History;\r\n const location: Location = this.context.getRouteLocation() as Location;\r\n const search = searchOri || location.search;\r\n\r\n if (shouldNavigateCrossSite(path, location.pathname) && new URI(path).is('relative')) {\r\n // eslint-disable-next-line no-param-reassign\r\n path = new URI(window.location.origin).segment(path).toString();\r\n }\r\n\r\n history.push({\r\n pathname: path,\r\n search,\r\n });\r\n }\r\n\r\n public navigateByUrl(href: string) {\r\n window.location.href = href;\r\n }\r\n}\r\n","import {\r\n i18nStore,\r\n permissionsStore,\r\n routeStore,\r\n scopeStore,\r\n preferenceServiceStore,\r\n serverContextStore,\r\n tokenStore,\r\n userContextStore,\r\n siteMapStore,\r\n versionStore,\r\n settingsContextStore,\r\n} from '@bingads-webui-campaign/global-context-store';\r\nimport { StateStore } from '@bingads-webui/state-store';\r\n// @ts-ignore\r\nimport { isCompatibleBrowser } from '@bingads-webui-campaign/browser';\r\n// @ts-ignore\r\nimport { isAdBlockOn } from '@bingads-webui-campaign/block-ad-block';\r\n// @ts-ignore\r\nimport { getEntityFromScope, edmCampaign } from '@bingads-webui/edm-campaign';\r\nimport _ from 'underscore';\r\n\r\nimport { IScope, ScopeLevel } from '../../types/notification.types';\r\nimport { IRoute } from '../../types/route.types';\r\nimport { IContext } from '../../types/context.types';\r\nimport { Route } from '../route';\r\n\r\nfunction getScopeWithHash(scope?: IScope) {\r\n if (!scope) {\r\n return undefined;\r\n }\r\n const { currentAccount, currentEntity } = getEntityFromScope(scope);\r\n const values = _.assign({}, scope.values);\r\n\r\n // smart campaign put campaign id in url hash part, so we need special handle it here\r\n const match = scope.location?.hash?.match(/\\/campaign\\/(\\d+)/);\r\n if (currentAccount === currentEntity && match) {\r\n // eslint-disable-next-line prefer-destructuring\r\n values.campaignId = match[1];\r\n }\r\n\r\n return {\r\n values,\r\n location: scope.location,\r\n };\r\n}\r\n\r\ninterface ContextState {\r\n refresh: number;\r\n}\r\n\r\nexport class Context extends StateStore implements IContext {\r\n route: IRoute;\r\n lastScope?: IScope;\r\n scopeChangeLevel: ScopeLevel;\r\n isCompatibleBrowser: any;\r\n\r\n constructor() {\r\n const defaultState = {\r\n refresh: 0,\r\n };\r\n\r\n super(defaultState);\r\n this.route = new Route(this);\r\n this.lastScope = this.cloneScope(scopeStore.state.scope);\r\n this.scopeChangeLevel = ScopeLevel.root;\r\n this.isCompatibleBrowser = isCompatibleBrowser;\r\n\r\n scopeStore.subscribe(() => {\r\n this.onScopeChange();\r\n });\r\n\r\n versionStore.subscribe(() => this.refresh());\r\n }\r\n\r\n onScopeChange() {\r\n const clone = this.cloneScope(scopeStore.state.scope);\r\n const scope = getScopeWithHash(clone);\r\n if (this.isShouldRefresh(scope)) {\r\n this.calcScopeChangeLevel(scope);\r\n this.lastScope = scope;\r\n this.refresh();\r\n }\r\n }\r\n\r\n cloneScope(scope?: IScope): IScope | undefined {\r\n if (scope) {\r\n return {\r\n values: _.assign({}, scope.values),\r\n location: _.assign({}, scope.location),\r\n };\r\n }\r\n return undefined;\r\n }\r\n\r\n isShouldRefresh(scope?: IScope) {\r\n if (this.lastScope && scope) {\r\n if (\r\n scope.values.aid === this.lastScope.values.aid &&\r\n scope.values.cid === this.lastScope.values.cid &&\r\n scope.values.campaignId === this.lastScope.values.campaignId &&\r\n scope.values.adGroupId === this.lastScope.values.adGroupId\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n return true;\r\n }\r\n\r\n calcScopeChangeLevel(scope?: IScope) {\r\n if (this.lastScope && scope) {\r\n if (scope.values.cid !== this.lastScope.values.cid) {\r\n this.scopeChangeLevel = ScopeLevel.customer;\r\n return;\r\n }\r\n\r\n if (scope.values.aid !== this.lastScope.values.aid) {\r\n this.scopeChangeLevel = ScopeLevel.account;\r\n return;\r\n }\r\n\r\n if (scope.values.campaignId !== this.lastScope.values.campaignId) {\r\n this.scopeChangeLevel = ScopeLevel.campaign;\r\n return;\r\n }\r\n\r\n if (scope.values.adGroupId !== this.lastScope.values.adGroupId) {\r\n this.scopeChangeLevel = ScopeLevel.adGroup;\r\n }\r\n }\r\n }\r\n\r\n refresh() {\r\n this.setState({\r\n refresh: this.state.refresh + 1,\r\n });\r\n }\r\n\r\n getNewI18n() {\r\n return i18nStore.state.i18n;\r\n }\r\n\r\n getAuthToken() {\r\n return tokenStore.state.authToken;\r\n }\r\n\r\n getChangeScope() {\r\n return this.scopeChangeLevel;\r\n }\r\n\r\n /* istanbul ignore next */\r\n getCurrentScope(): IScope {\r\n return getScopeWithHash(scopeStore.state.scope) as IScope;\r\n }\r\n\r\n /* istanbul ignore next */\r\n getScopeObject(): IScope {\r\n return scopeStore.state.scope as IScope;\r\n }\r\n\r\n getCurrentPermissions() {\r\n return permissionsStore.state.permissions;\r\n }\r\n\r\n getServerContext() {\r\n return serverContextStore.state.serverContext;\r\n }\r\n\r\n /* istanbul ignore next */\r\n getPreferenceService() {\r\n return preferenceServiceStore.state.preferenceService;\r\n }\r\n\r\n getUserContext() {\r\n return userContextStore.state.userContext as any;\r\n }\r\n\r\n getRouteHistory() {\r\n return routeStore.state.history;\r\n }\r\n\r\n getRouteLocation() {\r\n return routeStore.state.location;\r\n }\r\n\r\n getEdmCampaign() {\r\n return edmCampaign;\r\n }\r\n\r\n /* istanbul ignore next */\r\n getSiteMap() {\r\n return siteMapStore.state.siteMap;\r\n }\r\n\r\n /* istanbul ignore next */\r\n getSettingsContext() {\r\n return settingsContextStore.state.settingsContext;\r\n }\r\n\r\n /* istanbul ignore next */\r\n isVersionRefreshed() {\r\n return versionStore.state.version !== versionStore.state.newVersion;\r\n }\r\n\r\n /* istanbul ignore next */\r\n async isAdBlockOn(): Promise {\r\n return isAdBlockOn();\r\n }\r\n}\r\n","import _ from 'underscore';\r\n\r\nimport { INotification, IContext } from '../types';\r\n\r\n/**\r\n * Seperate data source to fetch notifications from different data sources\r\n */\r\nexport class NotificationDataSource {\r\n private context: IContext;\r\n private getNotifications: Function;\r\n\r\n constructor(context: IContext, getNotifications: Function) {\r\n this.context = context;\r\n this.getNotifications = getNotifications;\r\n }\r\n\r\n public async fetchCampaignNotificationStatus(): Promise {\r\n let notifications: Promise[] = this.getNotifications(this.context);\r\n\r\n // Add error fallback code for all the notification promises\r\n notifications = notifications.map((notificationArrPromise: Promise) => {\r\n return notificationArrPromise.catch(reason => {\r\n console.log(reason);\r\n return [];\r\n });\r\n });\r\n const notificationArr: INotification[][] = await Promise.all(notifications);\r\n\r\n return _.flatten(notificationArr);\r\n }\r\n}\r\n","import { IContext } from '../types/context.types';\r\n\r\ninterface IDimissKeyScope {\r\n cid: number | string;\r\n aid: number | string;\r\n campaignId: number | string | null;\r\n adGroupId: number | string | null;\r\n}\r\n\r\nexport abstract class NotificationDismissStore {\r\n context: IContext;\r\n constructor(context: IContext) {\r\n this.context = context;\r\n }\r\n\r\n\r\n protected abstract isKeyInDismissStorage(key: string): boolean;\r\n protected abstract putIntoDismissStorage(key: string, value: any): void;\r\n\r\n public dimissNotification(notificationId: string) {\r\n // eslint-disable-next-line prefer-const\r\n let { cid, aid, campaignId, adGroupId } = this.context.getCurrentScope().values;\r\n\r\n if (!adGroupId) {\r\n adGroupId = null;\r\n }\r\n if (!campaignId) {\r\n campaignId = null;\r\n }\r\n this.putIntoDismissStorage(this.buildDismissKey(notificationId, { cid, aid, campaignId, adGroupId }), 'true');\r\n }\r\n\r\n public shouldShowNotification(notificationId: string) {\r\n const { cid, aid, campaignId, adGroupId } = this.context.getCurrentScope().values;\r\n let isInDimissStorage = false;\r\n if (adGroupId) {\r\n isInDimissStorage = this.isKeyInDismissStorage(this.buildDismissKey(notificationId, {\r\n cid,\r\n aid,\r\n campaignId,\r\n adGroupId,\r\n }));\r\n }\r\n\r\n if (campaignId) {\r\n isInDimissStorage =\r\n isInDimissStorage ||\r\n this.isKeyInDismissStorage(this.buildDismissKey(notificationId, {\r\n cid,\r\n aid,\r\n campaignId,\r\n adGroupId: null,\r\n }));\r\n }\r\n\r\n isInDimissStorage =\r\n isInDimissStorage ||\r\n this.isKeyInDismissStorage(this.buildDismissKey(notificationId, {\r\n cid,\r\n aid,\r\n campaignId: null,\r\n adGroupId: null,\r\n }));\r\n\r\n return !isInDimissStorage;\r\n }\r\n\r\n private buildDismissKey(notificationId: string, scope: IDimissKeyScope) {\r\n return `cid=${scope.cid}&aid=${scope.aid}&campaignId=${scope.campaignId}&adGroupId=${\r\n scope.adGroupId\r\n }¬ificationId=${notificationId}`;\r\n }\r\n}\r\n\r\nexport class SessionStorageNotificationDismissStore extends NotificationDismissStore {\r\n sessionStorage: Storage;\r\n constructor(context: IContext) {\r\n super(context);\r\n this.sessionStorage = window.sessionStorage;\r\n }\r\n\r\n protected isKeyInDismissStorage(key: string) {\r\n return this.sessionStorage.getItem(key) !== null;\r\n }\r\n\r\n protected putIntoDismissStorage(key: string, value: any) {\r\n this.sessionStorage.setItem(key, value);\r\n }\r\n}\r\n\r\nexport class PermanentNotificationDismissStore extends NotificationDismissStore {\r\n localStorage: Storage;\r\n constructor(context: IContext) {\r\n super(context);\r\n this.localStorage = window.localStorage;\r\n }\r\n\r\n protected isKeyInDismissStorage(key: string) {\r\n return this.localStorage.getItem(key) !== null;\r\n }\r\n\r\n protected putIntoDismissStorage(key: string, value: any) {\r\n this.localStorage.setItem(key, value);\r\n }\r\n}\r\n","/* eslint-disable no-param-reassign */\r\nimport { StateStore } from '@bingads-webui/state-store';\r\nimport _ from 'underscore';\r\n\r\nimport { DismissMode, INotification, NotificationLevel, TargetComponent, ExtraOptions, IContext } from '../types';\r\nimport { Context } from './context';\r\nimport { NotificationDataSource } from './notification-data-source';\r\nimport { getNotificationDataSource } from './notification-data-source-factory';\r\nimport {\r\n PermanentNotificationDismissStore,\r\n SessionStorageNotificationDismissStore\r\n} from './notification-dismiss-store';\r\nimport { shouldClear, isAvailable } from '../utils';\r\n\r\ninterface INotificationStateStore {\r\n bannerNotificationList: INotification[];\r\n nQNotificationList: INotification[];\r\n floatingBannerNotification?: INotification | null;\r\n}\r\n\r\nexport class NotificationStore extends StateStore {\r\n context: IContext;\r\n sessionDismissStore: SessionStorageNotificationDismissStore;\r\n permanenetDimissStore: PermanentNotificationDismissStore;\r\n floatingBannerId: string = 'floatingBannerId';\r\n dataSource: NotificationDataSource | null;\r\n getNotifications: Function | null;\r\n notificationFilter: Function | null;\r\n\r\n constructor(config?: {\r\n context?: IContext,\r\n dataSource?: NotificationDataSource | null,\r\n getNotifications? : Function | null,\r\n notificationFilter?: Function | null;\r\n }) {\r\n const defaultState:INotificationStateStore = {\r\n bannerNotificationList: [],\r\n nQNotificationList: [],\r\n floatingBannerNotification: null,\r\n };\r\n super(defaultState);\r\n this.context = (config && config.context) || new Context();\r\n this.sessionDismissStore = new SessionStorageNotificationDismissStore(this.context);\r\n this.permanenetDimissStore = new PermanentNotificationDismissStore(this.context);\r\n this.dataSource = (config && config.dataSource) || null;\r\n this.getNotifications = (config && config.getNotifications) || null;\r\n this.notificationFilter = (config && config.notificationFilter) || null;\r\n this.context.subscribe(() => {\r\n this.refresh();\r\n });\r\n }\r\n\r\n async refresh(override: boolean = false) {\r\n if (!this.getNotifications) {\r\n return;\r\n }\r\n\r\n if (!this.dataSource) {\r\n this.dataSource = await getNotificationDataSource(this.context, this.getNotifications);\r\n }\r\n let campaignNotifications = await this.dataSource.fetchCampaignNotificationStatus();\r\n\r\n campaignNotifications = this.filterDismissedNotifications(campaignNotifications);\r\n\r\n if (this.notificationFilter) {\r\n campaignNotifications = this.notificationFilter(campaignNotifications);\r\n }\r\n\r\n campaignNotifications.forEach((notification) => {\r\n this.buildDimissAction(notification);\r\n });\r\n\r\n const { bannerNotificationList, nQNotificationList, floatingBannerNotification } = this.groupNotifications(campaignNotifications);\r\n\r\n // dispatch notifications here\r\n this.setState({\r\n bannerNotificationList: override? bannerNotificationList: this.mergeToLeft(this.state.bannerNotificationList, bannerNotificationList),\r\n nQNotificationList: override? nQNotificationList : this.mergeToLeft(this.state.nQNotificationList, nQNotificationList),\r\n floatingBannerNotification: floatingBannerNotification || this.state.floatingBannerNotification,\r\n });\r\n }\r\n\r\n // TODO: Need to add unit test\r\n mergeToLeft(leftList: INotification[], rightList: INotification[]) {\r\n const rightMap: any = {};\r\n let resultList = [];\r\n rightList.forEach((item) => {\r\n rightMap[item.id] = item;\r\n });\r\n\r\n // clear notification that scopeLevel is lower than current change scope\r\n resultList = leftList.filter((notification) => {\r\n if (!isAvailable(this.context.getCurrentScope(), notification.availableScopes)) {\r\n return false;\r\n }\r\n if (notification.scopeLevel !== undefined && shouldClear(notification.scopeLevel, this.context.getChangeScope())) {\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n\r\n // Replace old one to new one if one notification exists in both new UI and old UI\r\n resultList = resultList.map((item) => {\r\n if (rightMap[item.id]) {\r\n const newNotification = rightMap[item.id];\r\n rightMap[item.id] = undefined;\r\n return newNotification;\r\n }\r\n return item;\r\n });\r\n\r\n // Add new notification in rightList to result list\r\n Object.keys(rightMap).forEach((key) => {\r\n if (rightMap[key]) {\r\n resultList.push(rightMap[key]);\r\n }\r\n });\r\n\r\n return _.assign([], _.compact(resultList));\r\n }\r\n\r\n groupNotifications(notificationList: INotification[]) {\r\n const bannerNotificationList: INotification[] = [];\r\n const nQNotificationList: INotification[] = [];\r\n let floatingBannerNotification;\r\n\r\n notificationList.forEach((notification) => {\r\n if (notification.target === TargetComponent.TopBanner) {\r\n bannerNotificationList.push(notification);\r\n } else if (notification.target === TargetComponent.UnifiedQueue) {\r\n nQNotificationList.push(notification);\r\n } else if (notification.target === TargetComponent.FloatingBanner) {\r\n floatingBannerNotification = notification;\r\n }\r\n });\r\n\r\n return { bannerNotificationList, nQNotificationList, floatingBannerNotification };\r\n }\r\n\r\n filterDismissedNotifications(notifications: INotification[]) {\r\n return notifications.filter(notification => notification.condition === true && this.shouldShowNotification(notification));\r\n }\r\n\r\n /**\r\n * Will be called by Unified Notification Queue\r\n */\r\n dismissNQAll() {\r\n this.state.nQNotificationList.forEach((notification) => {\r\n if (notification.dismissAction) {\r\n notification.dismissAction(notification);\r\n }\r\n });\r\n this.setState({\r\n nQNotificationList: [],\r\n });\r\n }\r\n\r\n buildDimissAction(notification: INotification) {\r\n if (!notification.dismissMode) {\r\n notification.dismissMode = DismissMode.session;\r\n }\r\n\r\n switch (notification.dismissMode) {\r\n case DismissMode.session:\r\n notification.dismissAction = () => {\r\n this.sessionDismissStore.dimissNotification(notification.id);\r\n this.deleteNotificationFromList(notification.id);\r\n };\r\n break;\r\n case DismissMode.custom:\r\n // eslint-disable-next-line no-case-declarations\r\n const originDismissAction = notification.dismissAction;\r\n notification.dismissAction = () => {\r\n this.deleteNotificationFromList(notification.id);\r\n if (originDismissAction) {\r\n originDismissAction(notification);\r\n }\r\n };\r\n break;\r\n case DismissMode.once:\r\n notification.dismissAction = () => {\r\n this.deleteNotificationFromList(notification.id);\r\n };\r\n break;\r\n case DismissMode.permanent:\r\n notification.dismissAction = () => {\r\n this.permanenetDimissStore.dimissNotification(notification.id);\r\n this.deleteNotificationFromList(notification.id);\r\n };\r\n break;\r\n case DismissMode.never:\r\n notification.dismissAction = () => {};\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n deleteNotificationFromList(id: string) {\r\n const bannerNotificationList = this.state.bannerNotificationList.filter(n => n.id !== id);\r\n\r\n const nQNotificationList = this.state.nQNotificationList.filter(n => n.id !== id);\r\n\r\n this.setState({\r\n bannerNotificationList,\r\n nQNotificationList,\r\n });\r\n }\r\n\r\n shouldShowNotification(notification: INotification) {\r\n return (\r\n this.sessionDismissStore.shouldShowNotification(notification.id) &&\r\n this.permanenetDimissStore.shouldShowNotification(notification.id)\r\n );\r\n }\r\n\r\n addnQNotifications(notifications: INotification[]) {\r\n const filteredNotifications = this.filterDismissedNotifications(notifications);\r\n this.setState({\r\n nQNotificationList: _.union(this.state.nQNotificationList, filteredNotifications),\r\n });\r\n }\r\n\r\n // used by notification api to add banner notification\r\n add(notification: INotification) {\r\n if (notification.severity === NotificationLevel.Info || notification.severity === NotificationLevel.Confirmation) {\r\n this.setFloatingBannerNotification(notification.message, NotificationLevel.Info);\r\n } else {\r\n this.setFloatingBannerNotification(notification.message, NotificationLevel.Warning);\r\n }\r\n }\r\n\r\n // used by notification api\r\n setFloatingBannerNotification(message: string, severity: NotificationLevel.Warning | NotificationLevel.Info, extraOptions?: ExtraOptions) {\r\n const notification: INotification = {\r\n message,\r\n title: '',\r\n severity,\r\n id: this.floatingBannerId,\r\n target: TargetComponent.FloatingBanner,\r\n condition: true,\r\n extraOptions,\r\n };\r\n this.setState({\r\n floatingBannerNotification: notification,\r\n });\r\n\r\n return this.floatingBannerId;\r\n }\r\n\r\n // used by notification api to dismiss notification\r\n dismiss(id: string) {\r\n if (id === this.floatingBannerId) {\r\n this.setState({\r\n floatingBannerNotification: undefined,\r\n });\r\n } else {\r\n this.deleteNotificationFromList(id);\r\n }\r\n }\r\n\r\n newId(): string {\r\n return _.uniqueId('notification-');\r\n }\r\n}\r\n\r\nlet store: NotificationStore | null = null;\r\nexport const getStoreInstance = (config?: { context: IContext }) => {\r\n if (store) {\r\n return store;\r\n }\r\n store = new NotificationStore(config);\r\n return store;\r\n};\r\n","import { NotificationDataSource } from './notification-data-source';\r\nimport { IContext } from '../types';\r\n\r\nexport const getNotificationDataSource = async (context: IContext, getNotifications: Function) => {\r\n const notificationDataSource = new NotificationDataSource(context, getNotifications);\r\n\r\n return notificationDataSource;\r\n};\r\n","import _ from 'underscore';\r\nimport { hasPlaceHolderStores } from '@bingads-webui-campaign-react/gmc-to-mmc-mapping-grid-shared';\r\nimport { INotification, TargetComponent, NotificationLevel, DismissMode, ScopeLevel, IContext } from '../../types';\r\nimport { i18nMap, shouldRender, isAvailable, isBillingLinkPermission } from '../../utils';\r\n\r\n/**\r\n * ManualTest:\r\n * 1. Prepare fiddler mock data/real failed import\r\n * 2. Lauch site with fiddler opened\r\n * 3. Check the notificaiton in UNQ\r\n * 4. Go to import schedule page\r\n */\r\n\r\nexport interface IDraftStoreNotification{\r\n HasPlaceholderStores: boolean,\r\n}\r\n\r\nexport class DraftStoreNotification {\r\n context: IContext;\r\n i18n: any;\r\n availableScopes: ScopeLevel[];\r\n\r\n constructor(context: IContext) {\r\n this.context = context;\r\n this.i18n = context.getNewI18n();\r\n this.availableScopes = [ScopeLevel.account, ScopeLevel.customer];\r\n }\r\n\r\n async getDraftStoreNotifications() {\r\n const { MockTopBanner } = this.context.getCurrentPermissions().dynamic;\r\n if (MockTopBanner) {\r\n return [];\r\n }\r\n\r\n if (!this.context.getUserContext().CurrentUser.IsInternal && isBillingLinkPermission(this.context.getSettingsContext())) {\r\n return [];\r\n }\r\n\r\n // Only get this notification under available scope\r\n if (!isAvailable(this.context.getCurrentScope(), this.availableScopes)) {\r\n return [];\r\n }\r\n\r\n // Only get this notification if change scope is bigger than customer level\r\n if (!shouldRender(ScopeLevel.customer, this.context.getChangeScope())) {\r\n return [];\r\n }\r\n\r\n // Get notifications\r\n const draftStoreNotification: IDraftStoreNotification = await this.getNotifications();\r\n const notifications: INotification[] = [];\r\n\r\n // Draft store notification\r\n if (this.hasAnyDraftStoreNotifications(draftStoreNotification)) {\r\n notifications.push({\r\n id: 'DraftStoreSetup',\r\n condition: true,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n severity: NotificationLevel.Warning,\r\n scopeLevel: ScopeLevel.customer,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap.UnifiedNotificationQueue_DraftStoreSetupInfoText_Title),\r\n message: this.i18n.getString(i18nMap.UnifiedNotificationQueue_DraftStoreSetupInfoText_Message),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.Notification_Action_View),\r\n action: () => {\r\n this.context.route.goMerchantCenterDraftStores();\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: ['draft-store-setup-redirect-button'],\r\n },\r\n {\r\n text: this.i18n.getString(i18nMap.LearnMore),\r\n extraClassNames: ['HelpTopic'],\r\n extraAttrs: {\r\n query: 'help:ext51085',\r\n },\r\n },\r\n ],\r\n });\r\n }\r\n\r\n return _.compact(notifications);\r\n }\r\n\r\n async getNotifications(): Promise {\r\n const { uid, aid, cid } = this.context.getCurrentScope().values;\r\n const smallToken = this.context.getServerContext().Token;\r\n\r\n return (await hasPlaceHolderStores({\r\n uid, cid, aid, smallToken,\r\n })) as IDraftStoreNotification;\r\n }\r\n\r\n hasAnyDraftStoreNotifications(draftStoreNotification: IDraftStoreNotification) {\r\n return draftStoreNotification.HasPlaceholderStores;\r\n }\r\n}\r\n","\r\n/* istanbul ignore file */\r\n\r\nimport { IScope } from '../../types';\r\n\r\nexport interface IAlertFlags {\r\n RejectedKeywordsCount: number;\r\n RejectedAdsCount: number;\r\n RejectedSmartCampaignAdsCount: number;\r\n RejectedKeywordsCountV2: number;\r\n RejectedAdsCountV2: number;\r\n RejectedSmartCampaignAdsCountV2: number;\r\n RejectedSmartListingsCount: number;\r\n RejectedAdResourceCount: number;\r\n\r\n HasCampaigns: boolean;\r\n HasNotPausedCampaigns: boolean;\r\n HasAdGroups: boolean;\r\n HasNotPausedAdGroups: boolean;\r\n HasAds: boolean;\r\n HasNotPausedAds: boolean;\r\n HasKeywords: boolean;\r\n HasNotPausedKeywords: boolean;\r\n HasActiveNonDefaultCampaigns: boolean;\r\n\r\n HasMsClickIdTaggingEnabled: boolean;\r\n HasGoals: boolean;\r\n}\r\n\r\nexport const getAlertFlags = async function (select: string[], scope: IScope) {\r\n // @ts-ignore\r\n const { getEntityFromScope } = await import(/* webpackMode: 'eager' */ '@bingads-webui/edm-campaign');\r\n const { currentEntity } = getEntityFromScope(scope);\r\n\r\n const alertFlags = await currentEntity['Default.AlertInformation']\r\n .$makeCall({\r\n query: { select },\r\n functionParams: {},\r\n })\r\n .toPromise();\r\n\r\n return alertFlags;\r\n};\r\n","import _ from 'underscore';\r\nimport { DismissMode, INotification, NotificationLevel, ScopeLevel, TargetComponent, IContext } from '../../types';\r\nimport { i18nMap, isAvailable, isBillingLinkPermission } from '../../utils';\r\nimport { getAlertFlags, IAlertFlags } from './alert-information';\r\n\r\n/**\r\n * ManualTest:\r\n * 1. Prepare fiddler mock data/real failed import\r\n * 2. Lauch site with fiddler opened\r\n * 3. Check the notificaiton in UNQ\r\n * 4. Go to disapproved keywords or disapproved ads page\r\n */\r\nexport class DisapprovedEntities {\r\n context: IContext;\r\n i18n: any;\r\n availableScopes?: ScopeLevel[];\r\n\r\n constructor(context: IContext) {\r\n this.context = context;\r\n this.i18n = this.context.getNewI18n();\r\n this.availableScopes = [ScopeLevel.account];\r\n }\r\n\r\n async getDisapprovedEntityNotifications(): Promise {\r\n if (!this.context.getUserContext().CurrentUser.IsInternal && isBillingLinkPermission(this.context.getSettingsContext())) {\r\n return [];\r\n }\r\n\r\n const scope = this.context.getCurrentScope();\r\n if (!isAvailable(scope, this.availableScopes)) {\r\n return [];\r\n }\r\n\r\n const permission = this.context.getCurrentPermissions();\r\n\r\n const { IsGoogleImportVideoAdsEnabled, IsGoogleImportVideoAdsImprovementEnabled } = permission;\r\n\r\n const { SmartNewNotification } = permission.dynamic;\r\n const select = ['RejectedKeywordsCountV2', 'RejectedAdsCountV2'];\r\n if (!scope.values.adGroupId) {\r\n select.push('RejectedSmartCampaignAdsCountV2');\r\n }\r\n if (scope.values.aid && !scope.values.campaignId) {\r\n select.push('RejectedSmartListingsCount');\r\n }\r\n\r\n if (IsGoogleImportVideoAdsEnabled && IsGoogleImportVideoAdsImprovementEnabled) {\r\n select.push('RejectedAdResourceCount');\r\n }\r\n\r\n const alertFlags: IAlertFlags = await getAlertFlags(select, scope);\r\n\r\n const hasDisapprovedAds = this.getNoneSmartDisapprovedAdsCount(alertFlags) > 0;\r\n const hasDisapprovedKeywords = this.getRejectedKeywordsCount(alertFlags) > 0;\r\n const hasDisapprovedSmartAds = this.getRejectedSmartCampaignAdsCount(alertFlags) > 0;\r\n const hasDisapprovedSmartListing = alertFlags.RejectedSmartListingsCount > 0;\r\n const hasDisapprovedAdResource = alertFlags.RejectedAdResourceCount > 0;\r\n\r\n const notifications = [];\r\n if (hasDisapprovedAds && hasDisapprovedKeywords) {\r\n notifications.push(this.getDisapprovedBothKeywordsAndAdsNotification(alertFlags));\r\n } else if (hasDisapprovedAds) {\r\n notifications.push(this.getDisapprovedAdsNotification(alertFlags));\r\n } else if (hasDisapprovedKeywords) {\r\n notifications.push(this.getDisapprovedKeywordsNotification(alertFlags));\r\n }\r\n\r\n if (SmartNewNotification) {\r\n if (hasDisapprovedSmartAds) {\r\n notifications.push(this.getDisapprovedSmartCampaignAdsNotification(alertFlags));\r\n }\r\n\r\n if (hasDisapprovedSmartListing) {\r\n notifications.push(this.getDisapprovedSmartListingNotification(alertFlags));\r\n }\r\n }\r\n\r\n if (hasDisapprovedAdResource) {\r\n notifications.push(this.getDisapprovedAdResourceNotification(alertFlags));\r\n }\r\n\r\n return _.compact(notifications);\r\n }\r\n\r\n navigateToDisapprovedKeywords() {\r\n this.context.route.goDisapprovedKeywords();\r\n }\r\n\r\n navigateToDisapprovedAds() {\r\n this.context.route.goDisapprovedAds();\r\n }\r\n\r\n navigateToDisapprovedAdResource() {\r\n this.context.route.goDisapprovedAdResource();\r\n }\r\n\r\n navigateToAllSmartCampaigns() {\r\n this.context.route.goAllSmartCampaigns();\r\n }\r\n\r\n getRejectedAdsCount(alertFlags: IAlertFlags): number {\r\n return alertFlags.RejectedAdsCountV2;\r\n }\r\n\r\n getRejectedKeywordsCount(alertFlags: IAlertFlags): number {\r\n return alertFlags.RejectedKeywordsCountV2;\r\n }\r\n\r\n getRejectedSmartCampaignAdsCount(alertFlags: IAlertFlags): number {\r\n return alertFlags.RejectedSmartCampaignAdsCountV2;\r\n }\r\n\r\n getNoneSmartDisapprovedAdsCount(alertFlags: IAlertFlags): number {\r\n return this.getRejectedAdsCount(alertFlags) - this.getRejectedSmartCampaignAdsCount(alertFlags);\r\n }\r\n\r\n getDisapprovedBothKeywordsAndAdsNotification(alertFlags: IAlertFlags): INotification {\r\n const numberOfDisapprovedAds = this.i18n.formatDecimalToInteger(this.getNoneSmartDisapprovedAdsCount(alertFlags));\r\n const numberOfDisapprovedKeywords = this.i18n.formatDecimalToInteger(this.getRejectedKeywordsCount(alertFlags));\r\n\r\n return {\r\n id: 'Notification_DisapprovedEntity',\r\n note: 'KeywordsAndAds',\r\n condition: true,\r\n severity: NotificationLevel.Warning,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n scopeLevel: ScopeLevel.adGroup,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Alert_DisapprovedEntityMessageTemplate_New_Title),\r\n message: this.i18n.getString(\r\n i18nMap.UnifiedNotificationQueue_Alert_TwoDisapprovedEntityMessageTemplate_New_Message,\r\n {\r\n disapprovedAds: this.i18n.getString(i18nMap.Alert_DisapprovedAds),\r\n numberOfDisapprovedAds,\r\n disapprovedKeywords: this.i18n.getString(i18nMap.Alert_DisapprovedKeywords),\r\n numberOfDisapprovedKeywords,\r\n }\r\n ),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Action_ReviewAds),\r\n action: () => {\r\n this.navigateToDisapprovedAds();\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n {\r\n text: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Action_ReviewKeywords),\r\n action: () => {\r\n this.navigateToDisapprovedKeywords();\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getDisapprovedKeywordsNotification(alertFlags: IAlertFlags): INotification {\r\n const numberOfDisapprovedKeywords = this.i18n.formatDecimalToInteger(this.getRejectedKeywordsCount(alertFlags));\r\n return {\r\n id: 'Notification_DisapprovedEntity',\r\n condition: true,\r\n note: 'Keywords',\r\n severity: NotificationLevel.Warning,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n scopeLevel: ScopeLevel.adGroup,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Alert_DisapprovedEntityMessageTemplate_New_Title),\r\n message: this.i18n.getString(\r\n i18nMap.UnifiedNotificationQueue_Alert_OneDisapprovedEntityMessageTemplate_New_Message,\r\n {\r\n disapprovedEntity: this.i18n.getString(i18nMap.Alert_DisapprovedKeywords),\r\n numberOfDisapprovedEntities: numberOfDisapprovedKeywords,\r\n }\r\n ),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Action_ReviewAdsOrKeywords, {\r\n disapprovedEntity: this.i18n.getString(i18nMap.Alert_DisapprovedKeywords),\r\n numberOfDisapprovedEntities: numberOfDisapprovedKeywords,\r\n }),\r\n action: () => {\r\n this.navigateToDisapprovedKeywords();\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getDisapprovedAdsNotification(alertFlags: IAlertFlags): INotification {\r\n const numberOfDisapprovedAds = this.i18n.formatDecimalToInteger(this.getNoneSmartDisapprovedAdsCount(alertFlags));\r\n return {\r\n id: 'Notification_DisapprovedEntity',\r\n condition: true,\r\n note: 'Ads',\r\n severity: NotificationLevel.Warning,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n scopeLevel: ScopeLevel.adGroup,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Alert_DisapprovedEntityMessageTemplate_New_Title),\r\n message: this.i18n.getString(\r\n i18nMap.UnifiedNotificationQueue_Alert_OneDisapprovedEntityMessageTemplate_New_Message,\r\n {\r\n disapprovedEntity: this.i18n.getString(i18nMap.Alert_DisapprovedAds),\r\n numberOfDisapprovedEntities: numberOfDisapprovedAds,\r\n }\r\n ),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Action_ReviewAdsOrKeywords, {\r\n disapprovedEntity: this.i18n.getString(i18nMap.Alert_DisapprovedAds),\r\n numberOfDisapprovedEntities: numberOfDisapprovedAds,\r\n }),\r\n action: () => {\r\n this.navigateToDisapprovedAds();\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getDisapprovedAdResourceNotification(alertFlags: IAlertFlags): INotification {\r\n const numberOfDisapprovedAds = alertFlags.RejectedAdResourceCount;\r\n return {\r\n id: 'Notification_DisapprovedAdResource',\r\n condition: true,\r\n note: 'Ads',\r\n severity: NotificationLevel.Warning,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n scopeLevel: ScopeLevel.adGroup,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Alert_DisapprovedAdResource_New_Title),\r\n message: this.i18n.getString(\r\n i18nMap.UnifiedNotificationQueue_Alert_OneDisapprovedAdresource_New_Message,\r\n {\r\n disapprovedEntity: this.i18n.getString(i18nMap.Alert_DisapprovedAds),\r\n numberOfDisapprovedEntities: numberOfDisapprovedAds,\r\n }\r\n ),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Action_ReviewAdsOrKeywords, {\r\n disapprovedEntity: this.i18n.getString(i18nMap.Alert_DisapprovedAds),\r\n numberOfDisapprovedEntities: numberOfDisapprovedAds,\r\n }),\r\n action: () => {\r\n this.navigateToDisapprovedAdResource();\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getDisapprovedSmartCampaignAdsNotification(alertFlags: IAlertFlags): INotification {\r\n const numberOfDisapprovedAds = this.i18n.formatDecimalToInteger(this.getRejectedSmartCampaignAdsCount(alertFlags));\r\n return {\r\n id: 'Notification_DisapprovedSmartAds',\r\n condition: true,\r\n note: 'Ads',\r\n severity: NotificationLevel.Warning,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n scopeLevel: ScopeLevel.campaign,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Alert_DisapprovedSmartCampaignAd_Title),\r\n message: this.i18n.getString(\r\n i18nMap.UnifiedNotificationQueue_Alert_DisapprovedSmartCampaignAd_Message,\r\n {\r\n number: numberOfDisapprovedAds,\r\n }\r\n ),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Action_ReviewAdsOrKeywords, {\r\n disapprovedEntity: this.i18n.getString(i18nMap.Alert_DisapprovedAds),\r\n numberOfDisapprovedEntities: numberOfDisapprovedAds,\r\n }),\r\n action: () => {\r\n this.navigateToAllSmartCampaigns();\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: ['smart-disapproved-ads-notification'],\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getDisapprovedSmartListingNotification(alertFlags: IAlertFlags): INotification {\r\n const number = this.i18n.formatDecimalToInteger(alertFlags.RejectedSmartListingsCount);\r\n return {\r\n id: 'Notification_DisapprovedSmartListings',\r\n condition: true,\r\n note: 'Ads',\r\n severity: NotificationLevel.Warning,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Alert_DisapprovedSmartListingV2_Title),\r\n message: this.i18n.getString(\r\n i18nMap.UnifiedNotificationQueue_Alert_DisapprovedSmartListingV2_Message,\r\n { number }\r\n ),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Action_ReviewAdsOrKeywords, {\r\n disapprovedEntity: this.i18n.getString(i18nMap.Alert_DisapprovedSmartListing_V2),\r\n numberOfDisapprovedEntities: number,\r\n }),\r\n action: () => {\r\n this.navigateToAllSmartCampaigns();\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: ['smart-disapproved-listing-notification'],\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n","import * as urlUtil from '@bingads-webui/url-util';\r\nimport { odata } from '@bingads-webui/http-util';\r\nimport _ from 'underscore';\r\nimport { INotification, TargetComponent, NotificationLevel, DismissMode, ScopeLevel, IContext } from '../../types';\r\nimport { i18nMap, shouldRender, isAvailable, isBillingLinkPermission } from '../../utils';\r\n\r\n/**\r\n * ManualTest:\r\n * 1. Prepare fiddler mock data/real failed import\r\n * 2. Lauch site with fiddler opened\r\n * 3. Check the notificaiton in UNQ\r\n * 4. Go to import schedule page\r\n */\r\nexport interface IImportStatus {\r\n CurrentImportStatus: ImportStatusEnum;\r\n ImportId: number;\r\n ImportType: ImportTypeEnum;\r\n LastModifiedTime: number | string;\r\n}\r\n\r\nexport enum ImportStatusEnum {\r\n StatusComplete = 6,\r\n StatusCancelled = 7,\r\n StatusFailed = 8,\r\n StatusUnknown = 9\r\n}\r\n\r\nexport enum ImportTypeEnum {\r\n GoogleAPIImport = 1,\r\n FileBasedImport = 2,\r\n GoogleMyBusinessImport = 3,\r\n CloudImport = 4\r\n}\r\n\r\nexport class ImportStatus {\r\n context: IContext;\r\n i18n: any;\r\n availableScopes: ScopeLevel[];\r\n\r\n constructor(context: IContext) {\r\n this.context = context;\r\n this.i18n = context.getNewI18n();\r\n this.availableScopes = [ScopeLevel.account];\r\n }\r\n\r\n async getImportStatusNotifications(scopeLevel?: ScopeLevel) {\r\n if (!this.context.getUserContext().CurrentUser.IsInternal && isBillingLinkPermission(this.context.getSettingsContext())) {\r\n return [];\r\n }\r\n\r\n if (!isAvailable(this.context.getCurrentScope(), this.availableScopes)) {\r\n return [];\r\n }\r\n\r\n if (!shouldRender(scopeLevel || ScopeLevel.account, this.context.getChangeScope())) {\r\n return [];\r\n }\r\n\r\n const status: IImportStatus = await this.getImportStatus();\r\n const notifications: INotification[] = [];\r\n if (this.hasLastImportFailed(status) && this.isLastImportIn5Days(status)) {\r\n notifications.push(this.getLastImportFailedNotification());\r\n } else if (this.isImportPending(status)) {\r\n notifications.push(this.getImportPendingNotification());\r\n }\r\n\r\n return _.compact(notifications);\r\n }\r\n\r\n async getImportStatus(): Promise {\r\n const { aid } = this.context.getCurrentScope().values;\r\n const { cid } = this.context.getCurrentScope().values;\r\n\r\n const getImportStatusWithIdUrl = `/ODataApi/Campaign/V2/ImportSession/ImportStatus(CustomerId=${cid},AccountId=${aid})`;\r\n // pass import id 0 for fetching last import\r\n const queryParameters = {\r\n aid,\r\n cid,\r\n importId: 0,\r\n };\r\n const url = urlUtil.queryify(getImportStatusWithIdUrl, queryParameters);\r\n return (await odata.get({\r\n url,\r\n oDataToken: this.context.getAuthToken(),\r\n })) as IImportStatus;\r\n }\r\n\r\n getImportPendingNotification(): INotification {\r\n const { IsReadOnlyUser } = this.context.getCurrentPermissions();\r\n return {\r\n id: IsReadOnlyUser ? 'PendingImportInfoReadOnlyText' : 'PendingImportInfoText',\r\n condition: true,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n severity: NotificationLevel.Warning,\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap.UnifiedNotificationQueue_PendingImportInfoText_Title),\r\n message: this.i18n.getString(i18nMap.UnifiedNotificationQueue_PendingImportInfoText_Message),\r\n actionList: IsReadOnlyUser\r\n ? []\r\n : [\r\n {\r\n text: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Action_RestartTheImport),\r\n action: () => {\r\n this.redirectToImportCampaignSchedule();\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: ['HelpTopic'],\r\n extraAttrs: {\r\n query: 'help:app51001',\r\n },\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getLastImportFailedNotification(): INotification {\r\n return {\r\n id: 'LastImportFailed',\r\n condition: true,\r\n severity: NotificationLevel.Warning,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap.UnifiedNotificationQueue_LastImportFailedInfoText_New_Title),\r\n message: this.i18n.getString(i18nMap.UnifiedNotificationQueue_LastImportFailedInfoText_New_Message),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Action_SeeErrorDetails),\r\n action: () => {\r\n this.redirectToImportCampaignSchedule();\r\n },\r\n callbackType: 'closeQueue',\r\n },\r\n ],\r\n };\r\n }\r\n\r\n redirectToImportCampaignSchedule() {\r\n // $.advertiser.redirect('/Campaign/ImportCampaign/FileImport');\r\n // window.App.navigate('customer/:customer_id/account/:account_id/importschedule');\r\n this.context.route.goImportSchedule();\r\n }\r\n\r\n isImportStatusValid(status: IImportStatus) {\r\n return status && status.ImportId !== 0;\r\n }\r\n\r\n hasLastImportFailed(status: IImportStatus) {\r\n return this.isImportStatusValid(status) && status.CurrentImportStatus === ImportStatusEnum.StatusFailed;\r\n }\r\n\r\n hasLastImportBeenCancelled(status: IImportStatus) {\r\n return this.isImportStatusValid(status) && status.CurrentImportStatus === ImportStatusEnum.StatusCancelled;\r\n }\r\n\r\n isImportCompleted(status: IImportStatus) {\r\n return status.CurrentImportStatus === ImportStatusEnum.StatusComplete;\r\n }\r\n\r\n isImportPending(status: IImportStatus) {\r\n return (\r\n this.isImportStatusValid(status) &&\r\n !this.hasLastImportFailed(status) &&\r\n !this.hasLastImportBeenCancelled(status) &&\r\n !this.isImportCompleted(status)\r\n );\r\n }\r\n\r\n isLastImportIn5Days(status: IImportStatus) {\r\n return Date.now() - new Date(status.LastModifiedTime).getTime() < 24 * 60 * 60 * 1000 * 5;\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport React from 'react';\r\nimport { odata } from '@bingads-webui/http-util';\r\nimport { showGoogleLoginPopup, updateTaskItem, prepareGoogleImportTaskItemBodyForPmaxImportRecommendationRunnow } from '@bingads-webui-campaign-legacy/scheduled-import/view/utils/google-import-utils';\r\nimport { ReactTemplate } from '@bingads-webui-react/react-template';\r\nimport { INotification, TargetComponent, NotificationLevel, DismissMode, ScopeLevel, IContext } from '../../types';\r\nimport { i18nMap, shouldRender, isAvailable, isBillingLinkPermission } from '../../utils';\r\nimport {\r\n INotificationItem,\r\n ITokenExpirationItemList,\r\n ITokenInvalidItemList,\r\n IExtractedNotifications,\r\n IPMaxImportRecommendationItemList,\r\n IImportTaskItem,\r\n} from '../../types/import.notification.types';\r\n\r\n/**\r\n * ManualTest:\r\n * 1. Prepare fiddler mock data/real failed import\r\n * 2. Lauch site with fiddler opened\r\n * 3. Check the notificaiton in UNQ\r\n * 4. Go to import schedule page\r\n */\r\n\r\nconst GOOGLE_IMPORT_TYPE = 'Google';\r\nconst FACEBOOK_IMPORT_TYPE = 'Facebook';\r\n\r\nexport interface IImportNotifications{\r\n '@odata.context': string,\r\n AccountId: number,\r\n TokenExpiration: ITokenExpirationItemList,\r\n TokenInvalid: ITokenInvalidItemList,\r\n PMaxImportRecommendation?: IPMaxImportRecommendationItemList,\r\n}\r\n\r\nexport class ImportNotification {\r\n context: IContext;\r\n i18n: any;\r\n availableScopes: ScopeLevel[];\r\n\r\n constructor(context: IContext) {\r\n this.context = context;\r\n this.i18n = context.getNewI18n();\r\n this.availableScopes = [ScopeLevel.account];\r\n }\r\n\r\n async getImportNotifications(scopeLevel?: ScopeLevel) {\r\n if (!this.context.getUserContext().CurrentUser.IsInternal && isBillingLinkPermission(this.context.getSettingsContext())) {\r\n return [];\r\n }\r\n\r\n // permissions\r\n const permissions = this.context.getCurrentPermissions();\r\n const { IsPmaxImportRecommendationNotificationEnabled, IsImportAutoMinimumBidEnabled } = permissions;\r\n const { TokenInvalidImportNotification, ImportNotificationForRemoveMinimumBid, MetaImportUpsellNotification } = permissions.dynamic; // TODO: remove GA pilot\r\n\r\n // Only get this notification under available scope\r\n if (!isAvailable(this.context.getCurrentScope(), this.availableScopes)) {\r\n return [];\r\n }\r\n\r\n // Only get this notification if change scope is bigger than account level\r\n if (!shouldRender(scopeLevel || ScopeLevel.account, this.context.getChangeScope())) {\r\n return [];\r\n }\r\n\r\n // Get import notifications\r\n const importNotifications: IImportNotifications = await this.getNotifications();\r\n const notifications: INotification[] = [];\r\n\r\n // Token expiration notification\r\n if (this.hasAnyTokenExpiratioinNotifications(importNotifications)) {\r\n // Get token expiration notifications\r\n const tokenExpirationNotifications: IExtractedNotifications = this.extractNotifications(importNotifications, 'TokenExpiration');\r\n\r\n // Google import token expiration notification\r\n if (tokenExpirationNotifications.GoogleAPIImport && tokenExpirationNotifications.GoogleAPIImport !== 0) {\r\n notifications.push(this.getGoogleTokenExpirationNotification(tokenExpirationNotifications.GoogleAPIImport));\r\n }\r\n\r\n // Facebook import token expiration notification\r\n if (tokenExpirationNotifications.FacebookImport && tokenExpirationNotifications.FacebookImport !== 0) {\r\n notifications.push(this.getFacebookTokenExpirationNotification(tokenExpirationNotifications.FacebookImport));\r\n }\r\n }\r\n\r\n // Token invalid notification\r\n if (TokenInvalidImportNotification && this.hasAnyTokenInvalidNotifications(importNotifications)) {\r\n // Get token invalid notifications\r\n const tokenInvalidNotifications: IExtractedNotifications = this.extractNotifications(importNotifications, 'TokenInvalid');\r\n\r\n // Google import token invalid notification\r\n if (tokenInvalidNotifications.GoogleAPIImport && tokenInvalidNotifications.GoogleAPIImport !== 0) {\r\n notifications.push(this.getGoogleTokenInvalidNotification(tokenInvalidNotifications.GoogleAPIImport));\r\n }\r\n\r\n // Facebook import token invalid notification\r\n if (tokenInvalidNotifications.FacebookImport && tokenInvalidNotifications.FacebookImport !== 0) {\r\n notifications.push(this.getFacebookTokenInvalidNotification(tokenInvalidNotifications.FacebookImport));\r\n }\r\n }\r\n\r\n // Pmax import recommendation notification\r\n if (IsPmaxImportRecommendationNotificationEnabled && this.hasAnyPmaxImportRecommendationNotifications(importNotifications)) {\r\n // Get pmax import recommendation notifications\r\n const pmaxImportRecommendationNotifications: IPMaxImportRecommendationItemList = importNotifications.PMaxImportRecommendation;\r\n\r\n // Pmax import notification fail notification\r\n if (pmaxImportRecommendationNotifications.Failed && pmaxImportRecommendationNotifications.Failed.length > 0) {\r\n this.getPMaxImportRecommendationFailNotification(pmaxImportRecommendationNotifications.Failed[0].Tasks, notifications);\r\n }\r\n\r\n // Pmax import notification complete notification\r\n if (pmaxImportRecommendationNotifications.Completed && pmaxImportRecommendationNotifications.Completed.length > 0) {\r\n this.getPMaxImportRecommendationCompleteNotification(pmaxImportRecommendationNotifications.Completed[0].Tasks, notifications);\r\n }\r\n\r\n // Pmax import notification complete without pmax campaign imported notification\r\n if (pmaxImportRecommendationNotifications.CompletedWithoutPMax && pmaxImportRecommendationNotifications.CompletedWithoutPMax.length > 0) {\r\n this.getPMaxImportRecommendationCompletedWithoutPmaxNotification(pmaxImportRecommendationNotifications.CompletedWithoutPMax[0].Tasks, notifications);\r\n }\r\n }\r\n if (ImportNotificationForRemoveMinimumBid && !IsImportAutoMinimumBidEnabled) {\r\n notifications.push(this.getImportAutoMinimumBidNotification());\r\n }\r\n if (MetaImportUpsellNotification) {\r\n notifications.push(this.getMetaImportUpsellNotification());\r\n }\r\n\r\n return _.compact(notifications);\r\n }\r\n\r\n async getNotifications(): Promise {\r\n const { aid, cid } = this.context.getCurrentScope().values;\r\n const url = `/ODataApi/Campaign/V2/Customers(${cid})/Accounts(${aid})/ImportNotifications`;\r\n\r\n return (await odata.get({\r\n url,\r\n oDataToken: this.context.getAuthToken(),\r\n })) as IImportNotifications;\r\n }\r\n\r\n getGoogleTokenExpirationNotification(count): INotification {\r\n const form = count > 1 ? 'Plural' : 'Singular';\r\n\r\n return {\r\n id: 'GoogleImportTokenExpiration',\r\n condition: true,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n severity: NotificationLevel.Warning,\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap[`UnifiedNotificationQueue_${GOOGLE_IMPORT_TYPE}_ImportTaskTokenExpirationInfoText_Title`]),\r\n message: this.i18n.getString(i18nMap[`UnifiedNotificationQueue_${GOOGLE_IMPORT_TYPE}_ImportTaskTokenExpirationInfoText_${form}_Message`], { count }),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Action_GoToImportSchedulePage),\r\n action: () => {\r\n this.redirectToImportCampaignScheduleWithImportType('googleimport');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: ['google-import-token-expiration-redirect-button'],\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getFacebookTokenExpirationNotification(count): INotification {\r\n const form = count > 1 ? 'Plural' : 'Singular';\r\n\r\n return {\r\n id: 'FacebookImportTokenExpiration',\r\n condition: true,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n severity: NotificationLevel.Warning,\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap[`UnifiedNotificationQueue_${FACEBOOK_IMPORT_TYPE}_ImportTaskTokenExpirationInfoText_Title`]),\r\n message: this.i18n.getString(i18nMap[`UnifiedNotificationQueue_${FACEBOOK_IMPORT_TYPE}_ImportTaskTokenExpirationInfoText_${form}_Message`], { count }),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Action_GoToImportSchedulePage),\r\n action: () => {\r\n this.redirectToImportCampaignScheduleWithImportType('facebookimport');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: ['facebook-import-token-expiration-redirect-button'],\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getGoogleTokenInvalidNotification(count): INotification {\r\n const form = count > 1 ? 'Plural' : 'Singular';\r\n\r\n return {\r\n id: 'GoogleImportTokenInvalid',\r\n condition: true,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n severity: NotificationLevel.Warning,\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap[`UnifiedNotificationQueue_${GOOGLE_IMPORT_TYPE}_ImportTaskTokenInvalidInfoText_Title`]),\r\n message: this.i18n.getString(i18nMap[`UnifiedNotificationQueue_${GOOGLE_IMPORT_TYPE}_ImportTaskTokenInvalidInfoText_${form}_Message`], { count }),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Action_GoToImportSchedulePage),\r\n action: () => {\r\n this.redirectToImportCampaignScheduleWithImportType('googleimport');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: ['google-import-token-invalid-redirect-button'],\r\n },\r\n // TODO: use real help id when it is prepared\r\n // {\r\n // text: this.i18n.getString(i18nMap.LearnMore),\r\n // extraClassNames: ['HelpTopic'],\r\n // extraAttrs: {\r\n // query: 'help:ext51085',\r\n // },\r\n // },\r\n ],\r\n };\r\n }\r\n\r\n getFacebookTokenInvalidNotification(count): INotification {\r\n const form = count > 1 ? 'Plural' : 'Singular';\r\n\r\n return {\r\n id: 'FacebookImportTokenInvalid',\r\n condition: true,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n severity: NotificationLevel.Warning,\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap[`UnifiedNotificationQueue_${FACEBOOK_IMPORT_TYPE}_ImportTaskTokenInvalidInfoText_Title`]),\r\n message: this.i18n.getString(i18nMap[`UnifiedNotificationQueue_${FACEBOOK_IMPORT_TYPE}_ImportTaskTokenInvalidInfoText_${form}_Message`], { count }),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Action_GoToImportSchedulePage),\r\n action: () => {\r\n this.redirectToImportCampaignScheduleWithImportType('facebookimport');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: ['facebook-import-token-invalid-redirect-button'],\r\n },\r\n // TODO: use real help id when it is prepared\r\n // {\r\n // text: this.i18n.getString(i18nMap.LearnMore),\r\n // extraClassNames: ['HelpTopic'],\r\n // extraAttrs: {\r\n // query: 'help:ext51085',\r\n // },\r\n // },\r\n ],\r\n };\r\n }\r\n\r\n getPMaxImportRecommendationFailNotification(tasks, notifications) {\r\n _.each(tasks, (task: IImportTaskItem) => {\r\n notifications.push({\r\n id: `PMaxImportRecommendationFail-${task.TaskId}`,\r\n condition: true,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n severity: NotificationLevel.Warning,\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap.UnifiedNotificationQueue_PmaxImportRecommendation_Fail_InfoText_Title),\r\n message: this.i18n.getString(i18nMap.UnifiedNotificationQueue_PmaxImportRecommendation_Fail_InfoText_Message, { username: task.GoogleUserEmail }),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Action_SignInToGoogleAds),\r\n action: () => {\r\n this.signInToGoogleAdsAndTriggerRunnowImport({ taskId: task.TaskId });\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: ['pmax-import-recommendation-fail-sign-in-button'],\r\n },\r\n ],\r\n });\r\n });\r\n\r\n return notifications;\r\n }\r\n\r\n getPMaxImportRecommendationCompleteNotification(tasks, notifications) {\r\n _.each(tasks, (task: IImportTaskItem) => {\r\n notifications.push({\r\n id: `PMaxImportRecommendationComplete-${task.TaskId}`,\r\n condition: true,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap.UnifiedNotificationQueue_PmaxImportRecommendation_Complete_InfoText_Title),\r\n message: this.i18n.getString(i18nMap.UnifiedNotificationQueue_PmaxImportRecommendation_Complete_InfoText_Message),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Action_ViewPerformanceMaxCampaigns),\r\n action: async () => {\r\n await this.redirectToPerformanceMaxCampaigns();\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: ['pmax-import-recommendation-complete-redirect-button'],\r\n },\r\n ],\r\n });\r\n });\r\n\r\n return notifications;\r\n }\r\n\r\n getPMaxImportRecommendationCompletedWithoutPmaxNotification(tasks, notifications) {\r\n _.each(tasks, (task: IImportTaskItem) => {\r\n notifications.push({\r\n id: `PMaxImportRecommendationCompletedWithoutPmax-${task.TaskId}`,\r\n condition: true,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap.UnifiedNotificationQueue_PmaxImportRecommendation_CompleteWithoutPmax_InfoText_Title),\r\n message: this.i18n.getString(i18nMap.UnifiedNotificationQueue_PmaxImportRecommendation_CompleteWithoutPmax_InfoText_Message),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Action_ViewCampaigns),\r\n action: async () => {\r\n await this.redirectToAllCampaigns();\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: ['pmax-import-recommendation-complete-without-pmax-redirect-button'],\r\n },\r\n ],\r\n });\r\n });\r\n\r\n return notifications;\r\n }\r\n\r\n getImportAutoMinimumBidNotification() {\r\n const startdate = new Date('2025-3-24');\r\n return {\r\n condition: true,\r\n id: 'ImportAutoMinimumBid',\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n title: this.i18n.getString(_TL_(\"We're changing the way we import low-bid ad groups\")),\r\n message: this.i18n.getString(\r\n _TL_(\"Starting on {{startdate}}, we'll automatically raise the bids of ad groups whose bids are below the Microsoft Advertising minimum to the Microsoft Advertising minimum. This is an effort to ensure that your campaigns are imported with as few issues as possible.\"),\r\n {\r\n startdate: startdate.toLocaleDateString(),\r\n }\r\n ),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('View my scheduled imports')),\r\n action: () => {\r\n this.redirectToImportCampaignSchedule();\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: ['google-import-auto-minimum-bid-redirect-button'],\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getMetaImportUpsellNotification() {\r\n return {\r\n condition: true,\r\n id: 'MetaImportupsell',\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n title: this.i18n.getString(_TL_('Effortlessly bring your ads to Microsoft Advertising with Meta Import')),\r\n message: this.i18n.getString(_TL_('With Microsoft Advertising, you can engage with unique audiences, leverage our audience signals for better conversions and ROI, and show your ads across the Microsoft Advertising Network with ease.')),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Set up Meta Import')),\r\n action: () => {\r\n this.redirectToMetaImportWithImportSrc('metaimportnotification');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: ['meta-import-redirect-button'],\r\n },\r\n {\r\n text: this.i18n.getString(i18nMap.LearnMore),\r\n extraClassNames: ['HelpTopic'],\r\n extraAttrs: {\r\n query: 'help:app54769',\r\n },\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getRedirectLinkToImportCampaignScheduleWithImportType(importType) {\r\n return this.context.route.getImportScheduleWithImportTypePath(importType);\r\n }\r\n\r\n redirectToImportCampaignScheduleWithImportType(importType) {\r\n this.context.route.goImportScheduleWithImportType(importType);\r\n }\r\n\r\n redirectToImportCampaignSchedule() {\r\n this.context.route.goImportSchedule();\r\n }\r\n\r\n async redirectToAllCampaigns() {\r\n await this.context.route.goAllCampaigns();\r\n }\r\n\r\n async redirectToPerformanceMaxCampaigns() {\r\n await this.context.route.goAllCampaigns('pmax');\r\n }\r\n\r\n redirectToMetaImportWithImportSrc(importsrc) {\r\n return this.context.route.goMetaimportWithImportSrc(importsrc);\r\n }\r\n\r\n // sign in to Google Ads and trigger a runnow import task based on previous import task\r\n signInToGoogleAdsAndTriggerRunnowImport({ taskId }) {\r\n const newI18n = this.i18n;\r\n const getSuccessMsg = ({ logMsg, newTaskItem }) => (\r\n (\r\n {\r\n logMsg(`Redirect_To_Import_Schedule_And_History, newTaskId: ${newTaskItem.Id}`);\r\n }}\r\n >\r\n {text}\r\n \r\n ),\r\n }}\r\n />\r\n );\r\n\r\n return showGoogleLoginPopup({\r\n newI18n,\r\n afterSignInCallback: ({ sessionId }) => updateTaskItem({\r\n sessionId,\r\n taskId,\r\n newI18n,\r\n prepareTaskItemBody: prepareGoogleImportTaskItemBodyForPmaxImportRecommendationRunnow,\r\n getSuccessMsg,\r\n }),\r\n });\r\n }\r\n\r\n hasAnyTokenExpiratioinNotifications(importNotificationResult: IImportNotifications) {\r\n return importNotificationResult.TokenExpiration &&\r\n (!_.isEmpty(importNotificationResult.TokenExpiration.Expired) || !_.isEmpty(importNotificationResult.TokenExpiration.Expiring));\r\n }\r\n\r\n hasAnyTokenInvalidNotifications(importNotificationResult: IImportNotifications) {\r\n return importNotificationResult.TokenInvalid && (!_.isEmpty(importNotificationResult.TokenInvalid.Invalid));\r\n }\r\n\r\n hasAnyPmaxImportRecommendationNotifications(importNotificationResult: IImportNotifications) {\r\n return importNotificationResult.PMaxImportRecommendation && (\r\n !_.isEmpty(importNotificationResult.PMaxImportRecommendation.Failed) ||\r\n !_.isEmpty(importNotificationResult.PMaxImportRecommendation.Completed) ||\r\n !_.isEmpty(importNotificationResult.PMaxImportRecommendation.CompletedWithoutPMax)\r\n );\r\n }\r\n\r\n extractNotifications(importNotifications: IImportNotifications, notificationType) {\r\n let allTokenExipationList = [];\r\n\r\n // Extract and combine data\r\n if (notificationType === 'TokenExpiration') {\r\n allTokenExipationList = [].concat(importNotifications.TokenExpiration.Expiring).concat(importNotifications.TokenExpiration.Expired);\r\n } else if (notificationType === 'TokenInvalid') {\r\n allTokenExipationList = importNotifications.TokenInvalid.Invalid;\r\n }\r\n\r\n const tokenExpirationNotifications = {};\r\n\r\n // Calculate the sum by import type\r\n _.each(allTokenExipationList, (item: INotificationItem) => {\r\n if (tokenExpirationNotifications[item.ImportType]) {\r\n tokenExpirationNotifications[item.ImportType] += item.Count;\r\n } else {\r\n tokenExpirationNotifications[item.ImportType] = item.Count;\r\n }\r\n });\r\n\r\n return tokenExpirationNotifications as IExtractedNotifications;\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-shadow */\r\nimport _ from 'underscore';\r\n\r\nimport {\r\n DismissMode,\r\n INotification,\r\n NotificationLevel,\r\n TargetComponent,\r\n ScopeLevel,\r\n} from '../../types/notification.types';\r\nimport { IContext } from '../../types/context.types';\r\nimport { getAlertFlags, IAlertFlags } from './alert-information';\r\nimport { i18nMap, shouldRender, isAvailable, isBillingLinkPermission } from '../../utils';\r\n\r\nexport class NoEntityNotifications {\r\n context: IContext;\r\n i18n: any;\r\n availableScopes: ScopeLevel[];\r\n\r\n constructor(context: IContext) {\r\n this.context = context;\r\n this.i18n = this.context.getNewI18n();\r\n this.availableScopes = [ScopeLevel.account];\r\n }\r\n\r\n async getNoEligibleEntityNotifications() {\r\n if (!this.context.getUserContext().CurrentUser.IsInternal && isBillingLinkPermission(this.context.getSettingsContext())) {\r\n return [];\r\n }\r\n\r\n const fields = [\r\n 'HasCampaigns',\r\n 'HasNotPausedCampaigns',\r\n 'HasAdGroups',\r\n 'HasNotPausedAdGroups',\r\n 'HasAds',\r\n 'HasNotPausedAds',\r\n 'HasKeywords',\r\n 'HasNotPausedKeywords',\r\n 'HasActiveNonDefaultCampaigns',\r\n ];\r\n\r\n if (!isAvailable(this.context.getCurrentScope(), this.availableScopes)) {\r\n return [];\r\n }\r\n\r\n if (!shouldRender(ScopeLevel.account, this.context.getChangeScope())) {\r\n return [];\r\n }\r\n\r\n const alertFlags: IAlertFlags = await getAlertFlags(fields, this.trimScopeToAccount());\r\n const hasNotEligibleCampaign = (alertFlags: IAlertFlags) =>\r\n alertFlags.HasCampaigns && !alertFlags.HasNotPausedCampaigns;\r\n const hasNotEligibleAdGroup = (alertFlags: IAlertFlags) =>\r\n alertFlags.HasAdGroups && !alertFlags.HasNotPausedAdGroups;\r\n const hasNotEligibleAd = (alertFlags: IAlertFlags) => alertFlags.HasAds && !alertFlags.HasNotPausedAds;\r\n const hasNotEligibleKeyword = (alertFlags: IAlertFlags) =>\r\n !alertFlags.HasActiveNonDefaultCampaigns && alertFlags.HasKeywords && !alertFlags.HasNotPausedKeywords;\r\n\r\n const scopes = _.compact([\r\n hasNotEligibleCampaign(alertFlags) ? 'Campaign' : null,\r\n hasNotEligibleAdGroup(alertFlags) ? 'AdGroup' : null,\r\n hasNotEligibleAd(alertFlags) ? 'Ad' : null,\r\n hasNotEligibleKeyword(alertFlags) ? 'Keyword' : null,\r\n ]);\r\n\r\n return _.compact(scopes.map(scope => this.generateErrorNotification(scope)));\r\n }\r\n\r\n trimScopeToAccount() {\r\n const scope = this.context.getCurrentScope();\r\n const values = _.assign({}, scope.values);\r\n values.adGroupId = undefined;\r\n values.campaignId = undefined;\r\n\r\n return {\r\n values,\r\n location: scope.location,\r\n };\r\n }\r\n\r\n generateErrorNotification(scope: string | null): INotification | null {\r\n // TODO: add walkme link to error message action when walkme is ready\r\n return {\r\n target: TargetComponent.TopBanner,\r\n dismissMode: DismissMode.never,\r\n severity: NotificationLevel.Error,\r\n title: '',\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n message: this.i18n.getString((i18nMap as any)[`Alert_NoEligible_${scope}`]),\r\n condition: true,\r\n id: `NoEligible_${scope}`,\r\n };\r\n }\r\n}\r\n","import React from 'react';\r\nimport _ from 'underscore';\r\n// @ts-ignore\r\nimport { Constants } from '@bingads-webui-clientcenter/entity-utils';\r\nimport {\r\n DismissMode,\r\n INotification,\r\n NotificationLevel,\r\n ScopeLevel,\r\n TargetComponent\r\n} from '../../types/notification.types';\r\nimport { IContext } from '../../types/context.types';\r\nimport { i18nMap, shouldRender, calcScopeLevel, isBillingLinkPermission as isBillingLinkPermissionFunc } from '../../utils';\r\n\r\nexport class PredefinedNotifications {\r\n context: IContext;\r\n i18n: any;\r\n\r\n constructor(context: IContext) {\r\n this.context = context;\r\n this.i18n = context.getNewI18n();\r\n }\r\n\r\n async getPredefinedAlerts(): Promise<(INotification | null)[]> {\r\n const accountSuspendedAlert = this.getAccountSuspendedAlert();\r\n const adBlockAlert = await this.getAdBlockAlert();\r\n const pmaxImportNotification = await this.getPerfMaxImportInfoNotification();\r\n const pmaxNonRetailExpansionNotification = await this.getPMaxRetailToNonRetailExpansionNotification();\r\n const isExternalUserBillingLinkPermission = !this.context.getUserContext().CurrentUser.IsInternal && isBillingLinkPermissionFunc(this.context.getSettingsContext());\r\n\r\n return _.compact([\r\n !isExternalUserBillingLinkPermission && this.getFixAudienceCampaignImportedAsSearchCampaignNotification(),\r\n !isExternalUserBillingLinkPermission && this.getGoogleImportImageAdForScheduledImportAccountsNotification(),\r\n !isExternalUserBillingLinkPermission && this.getMmaV2LaunchNotification(),\r\n !isExternalUserBillingLinkPermission && this.getAdoptAudienceShoppingCampaignNotification(),\r\n !isExternalUserBillingLinkPermission && this.getManualCpcDeprecationNotification(),\r\n !isExternalUserBillingLinkPermission && pmaxImportNotification,\r\n pmaxNonRetailExpansionNotification,\r\n this.getVersionRefreshedAlert(),\r\n adBlockAlert,\r\n accountSuspendedAlert,\r\n this.getMaintainanceAlert(),\r\n this.getIncompatibleBrowserAlert(),\r\n !isExternalUserBillingLinkPermission && this.getWebInsightsNotification(),\r\n !isExternalUserBillingLinkPermission && this.getGAConversionAttributionNotification(),\r\n !isExternalUserBillingLinkPermission && this.getMSANAutoBiddingInfoNotification(),\r\n !isExternalUserBillingLinkPermission && this.getSmartCropOfflineProcessingNotification(),\r\n ...(!isExternalUserBillingLinkPermission ? this.getMSANChurnNotifications() : []),\r\n !isExternalUserBillingLinkPermission && this.getImpressionReportingNotification(),\r\n !isExternalUserBillingLinkPermission && this.getMSANALogoAndCTAGANotification(),\r\n ]);\r\n }\r\n\r\n async getAdBlockAlert() {\r\n const scopeLevel = ScopeLevel.root;\r\n if (!shouldRender(scopeLevel, this.context.getChangeScope())) {\r\n return null;\r\n }\r\n\r\n const isAdBlockOn = await this.context.isAdBlockOn();\r\n const adBlockAlert: INotification = {\r\n condition: isAdBlockOn,\r\n id: 'Alert_AdBlockWarning',\r\n dismissMode: DismissMode.permanent,\r\n target: TargetComponent.TopBanner,\r\n severity: NotificationLevel.Warning,\r\n scopeLevel,\r\n title: '',\r\n message: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Alert_AdBlockWarning_Message),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.LearnMore),\r\n extraClassNames: ['HelpTopic'],\r\n extraAttrs: {\r\n query: 'help:56790',\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return adBlockAlert;\r\n }\r\n\r\n getGAConversionAttributionNotification() {\r\n const accountMode = this.context.getUserContext().CurrentAccount.AccountMode;\r\n if (accountMode !== 0 && accountMode !== null) {\r\n return null;\r\n }\r\n\r\n return {\r\n condition: true,\r\n id: 'GAConversionAttribution',\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n title: this.i18n.getString(_TL_('Changes to Google Analytics conversion attribution')),\r\n message: this.i18n.getString(_TL_('Google\\'s recent move to a default data driven attribution model in the new Google Analytics 4 (GA4) may result in significant discrepancies in conversion attribution reporting when compared to Microsoft Advertising. If you feel your Microsoft Advertising reporting may be impacted by GA4\\'s new default attribution model, contact support to better understand your conversion and revenue reporting within Microsoft Advertising.')),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Learn more')),\r\n action: () => {\r\n window.open('https://help.ads.microsoft.com/#apex/ads/en/56841/2', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n {\r\n text: this.i18n.getString(_TL_('Contact support')),\r\n action: () => {\r\n window.open('https://about.ads.microsoft.com/en-us/microsoft-advertising-support', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n async getPMaxRetailToNonRetailExpansionNotification() {\r\n const permissions = _.result(this.context.getCurrentPermissions(), 'dynamic', {});\r\n\r\n if (!_.result(permissions, 'PMaxRetailToNonRetailExpansionNotification', false) || this.context.getUserContext().CurrentAccount.AccountMode === 2) {\r\n // Skip notification if pilot is not enabled for this account, or if account mode is 2 (UNIFIED_SMART)\r\n return null;\r\n }\r\n\r\n return {\r\n condition: true,\r\n id: 'PMaxRetailToNonRetailExpansion',\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n title: this.i18n.getString(_TL_('Updates to allow auto asset generation')),\r\n message: this.i18n.getString(_TL_('We recently made updates that allow assets to generate automatically for some of your Pmax campaigns that have auto asset generation enabled in campaign settings. After this fix, your Performance Max campaigns will begin creating new text and image assets, alongside current product ads, resulting in more impressions and clicks.')),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Learn more')),\r\n action: () => {\r\n window.open('https://help.ads.microsoft.com/apex/index/3/en/60058', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n async getPerfMaxImportInfoNotification(getEntityFunctionObject?: any) {\r\n const permissions = _.result(this.context.getCurrentPermissions(), 'dynamic', {});\r\n\r\n if (!_.result(permissions, 'ShowPerfMaxImportNotification', false) || !_.result(permissions, 'ImportPerformanceMaxCampaignAsSmartShopping', false) || _.result(permissions, 'PerformanceMaxCampaigns', false)) {\r\n return null;\r\n }\r\n\r\n // skip for account mode 2 (UNIFIED_SMART)\r\n if (this.context.getUserContext().CurrentAccount.AccountMode === 2) {\r\n return null;\r\n }\r\n\r\n if (_.result(permissions, 'ImportNonRetailPMaxCampaignAsDynamicSearch', false)) {\r\n return {\r\n condition: true,\r\n id: 'perfMaxImportAsSmartShoppingOrSearch',\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n title: this.i18n.getString(_TL_('Import of Google Ads Performance Max campaigns')),\r\n message: this.i18n.getString(_TL_('You can now import your Google Ads Performance Max campaigns as smart shopping campaigns or search campaigns. If you added a Merchant Center account during Google Ads campaign creation, we’ll import your Performance Max campaigns as smart shopping campaigns; but, without a Merchant Center account, we’ll import them as search campaigns. ')),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Start your import')),\r\n action: () => {\r\n this.context.route.goGoogleImport();\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n {\r\n text: this.i18n.getString(_TL_('Learn more')),\r\n action: () => {\r\n window.open('https://go.microsoft.com/fwlink/?linkid=2208229', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n const hasSmartShoppingCampaign = await this.hasSmartShoppingCampaign(\r\n this.context,\r\n getEntityFunctionObject\r\n );\r\n\r\n if (!hasSmartShoppingCampaign) {\r\n return null;\r\n }\r\n\r\n return {\r\n condition: true,\r\n id: 'perfMaxImportAsSmartShopping',\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n title: this.i18n.getString(_TL_('Import of Google Ads Performance Max campaigns')),\r\n message: this.i18n.getString(_TL_('We’ll import your Google Ads Performance Max campaigns as smart shopping campaigns.')),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Start your import')),\r\n action: () => {\r\n this.context.route.goGoogleImport();\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n {\r\n text: this.i18n.getString(_TL_('Learn more')),\r\n action: () => {\r\n window.open('https://go.microsoft.com/fwlink/?linkid=2208229', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getWebInsightsNotification() {\r\n const permissions = _.result(this.context.getCurrentPermissions(), 'dynamic', {});\r\n const scope = this.context.getCurrentScope();\r\n\r\n const { aid } = scope.values;\r\n const serverContext = this.context.getServerContext();\r\n const message = `${this.i18n.getString(_TL_('UET Insights will show you key performance metrics to help you improve your website and audience targeting. These metrics can be found in your UET tag dashboard under the \"Insights\" tab. Enable UET Insights for all your tags, or enable it for individual tags by visiting the associated UET tag dashboard.'))} `;\r\n const learnMore = `${this.i18n.getString(_TL_('Learn More'))}`;\r\n\r\n if (!_.result(permissions, 'UETTagInsights', false) || !aid) {\r\n return null;\r\n }\r\n const edmCampaign = this.context.getEdmCampaign();\r\n\r\n // @ts-ignore-next-line\r\n const edmHolder = edmCampaign.Customers.$withKey(serverContext.CurrentAccount.AdvertiserCustomerID).Accounts.$withKey(aid);\r\n\r\n return {\r\n condition: true,\r\n id: 'WebInsightsNotification',\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n title: this.i18n.getString(_TL_('Opt-in to UET insights to get website traffic analytics through your UET Tag')),\r\n message: message + learnMore,\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Enable UET Insights for all my UET tags')),\r\n action: () => {\r\n const tagsPromise = edmHolder\r\n .Tags\r\n .get({ top: 200, select: ['Id', 'IsWebInsightsEnabled'] }).toPromise();\r\n\r\n return tagsPromise.then((tagResponse) => {\r\n if (tagResponse && tagResponse.value) {\r\n if (tagResponse.value.length > 0) {\r\n const tags = tagResponse.value;\r\n const payload = tags.reduce((acc, tag) => {\r\n if (!tag.IsWebInsightsEnabled) {\r\n acc.push({ Id: tag.Id, IsWebInsightsEnabled: true });\r\n }\r\n return acc;\r\n }, []);\r\n\r\n if (payload.length === 0) {\r\n return Promise.resolve(true);\r\n }\r\n\r\n return edmHolder\r\n .Tags['Default.UpdateTagsWebInsightsSetting']\r\n .$makeCall({ payload: { Tags: payload } })\r\n .toPromise().then(() => true)\r\n .catch((error) => {\r\n throw new Error(error);\r\n });\r\n }\r\n }\r\n return Promise.resolve(true);\r\n }).catch((error) => {\r\n throw new Error(`Could not fetch tags: ${error}`);\r\n });\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n {\r\n text: this.i18n.getString(_TL_('Go to UET tags')),\r\n action: () => {\r\n window.open(`/campaign/vnext/uettag?uid=${scope.values.uid}&cid=${scope.values.cid}&aid=${scope.values.aid}`, '_self');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getMSANAutoBiddingInfoNotification() {\r\n const permissions = this.context.getCurrentPermissions();\r\n\r\n // if user is smart account, don't show the notification\r\n if (_.result(permissions, 'IsSmartAccount', false)) {\r\n return null;\r\n }\r\n\r\n return {\r\n condition: true,\r\n id: 'MSANAutoBiddingInfoNotification',\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n title: this.i18n.getString(_TL_('Multi-channel management update')),\r\n message: this.i18n.getString(_TL_('Starting February 21st, you will no longer see the audience ad bid modifier in your campaign settings. Microsoft Advertising will fully optimize your campaigns across channels, as machine learning algorithms drive performance to your campaign goals. There is nothing you need to do to prepare, but you should always ensure optimal settings (adopt UET tags/conversion goals, set your desired automated bid strategy, and add image extensions) to deliver the best performance. If you need assistance, please contact support or your Microsoft Advertising account team.')),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Contact support')),\r\n action: () => {\r\n window.open('https://about.ads.microsoft.com/en-us/microsoft-advertising-support', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getMSANALogoAndCTAGANotification() {\r\n const permissions = this.context.getCurrentPermissions();\r\n\r\n if (!_.result(permissions.dynamic, 'MSANLogoAndCTANotification', false)) {\r\n return null;\r\n }\r\n\r\n return {\r\n condition: true,\r\n id: 'MSANALogoAndCTAGANotification',\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n title: this.i18n.getString(_TL_('Logos and calls to action are available for Native ads')),\r\n message: this.i18n.getString(_TL_('You can enhance your Native ads and entice customers to click them by adding logos and calls to action during ad creation. For logos, simply upload or choose an image for your logo from the Asset library. For calls to action, choose from our predefined list. This will provide potential customers with a brief, compelling reason to click your ad.
    Note: Automated is the default option for your call to action. If you don\\'t choose a call to action, it\\'ll be automated by default during ad delivery. This means that we\\'ll automatically choose your call to action and the language it serves in from the predefined list.')),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Learn more')),\r\n action: () => {\r\n window.open('https://help.ads.microsoft.com/#apex/ads/en/56907/0', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getSmartCropOfflineProcessingNotification() {\r\n const permissions = this.context.getCurrentPermissions();\r\n\r\n if (!_.result(permissions.dynamic, 'SmartCropNotification', false)) {\r\n return null;\r\n }\r\n\r\n return {\r\n condition: true,\r\n id: 'SmartCropOfflineProcessingNotification',\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n title: this.i18n.getString(_TL_('We’ve enabled smart image cropping for your account')),\r\n message: this.i18n.getString(_TL_('To help save time and increase efficiency, our AI will automatically crop your audience ad images and image extensions to focus on the most important part of the image. We recommend you review your existing audience ads and image extensions to ensure that your images and the aspect ratios they serve in look the way you want. Note: Smart image cropping will be applied automatically to any existing audience ad images and image extensions that you have not yet manually cropped.')),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Learn more')),\r\n action: () => {\r\n window.open('https://help.ads.microsoft.com/#apex/ads/en/60202/1', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getManualCpcDeprecationNotification() {\r\n const permissions = this.context.getCurrentPermissions();\r\n\r\n if (!_.result(permissions, 'ShouldDisplayManualCpcDeprecationNotification', false)) {\r\n return null;\r\n }\r\n\r\n return {\r\n condition: true,\r\n id: 'ManualCpcDeprecation1',\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n title: this.i18n.getString(_TL_('Update to Native ad campaign bid strategies')),\r\n message: this.i18n.getString(_TL_('Starting on April 30, 2024, you’ll no longer have the option to select the Manual CPC (cost per click) bid strategy for newly created image-based and feed-based Native ad campaigns. On May 13, 2024, all existing Native ad campaigns using manual CPC will transition to the enhanced CPC bid strategy. This change will be reflected within one week.

    Note: This change does not impact Connected TV ads, Display ads, Native ads using the Manual CPM (cost per thousand impressions) bid strategy, or Video Ad campaigns.')),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Learn more')),\r\n action: () => {\r\n window.open('https://about.ads.microsoft.com/en-us/blog/post/april-2024/upgrading-native-campaigns-to-enhanced-cpc', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getMmaV2LaunchNotification() {\r\n const permissions = this.context.getCurrentPermissions();\r\n\r\n if (!_.result(permissions, 'ShouldDisplayMMAV2LaunchNotification', false)) {\r\n return null;\r\n }\r\n\r\n return {\r\n condition: true,\r\n id: 'MMAV2LaunchNotification',\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n title: this.i18n.getString(_TL_('Update to ad preview for audience campaigns')),\r\n message: this.i18n.getString(_TL_('You can now preview more examples of what your audience ads might look like with our updated ad preview tool. To ensure that your audience ads are optimized for each ad placement and aspect ratio, review your ad previews and edit them accordingly.')),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Learn more')),\r\n action: () => {\r\n window.open('https://help.ads.microsoft.com/#apex/ads/en/56912/0', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getFixAudienceCampaignImportedAsSearchCampaignNotification() {\r\n const permissions = this.context.getCurrentPermissions();\r\n\r\n if (!_.result(permissions, 'NotificationForFixAudienceCampaignImportedAsSearchCampaign', false)) {\r\n return null;\r\n }\r\n const message = this.i18n.getString(_TL_('We’ve identified a system error, which has prevented a successful import of some of your audience campaigns from Google Ads. Three weeks after this notification’s send date, we’ll resolve this error for any subsequent imports you run. Please check your import logs on or after this date to ensure that your campaigns were imported successfully.'));\r\n\r\n const serverContext = this.context.getServerContext() || {};\r\n const rootURLPath = _.result(serverContext, 'Urls', {}).RootUIUrl;\r\n const aid = _.result(serverContext, 'CurrentAccount', {}).Id;\r\n const cid = _.result(serverContext, 'CurrentCustomer', {}).Id;\r\n const uid = _.result(serverContext, 'CurrentUser', {}).Id;\r\n\r\n const checkImportLogsUrl = rootURLPath && aid && cid && uid ?\r\n `${rootURLPath}campaign/vnext/importschedule?aid=${aid}&cid=${cid}&uid=${uid}` :\r\n 'https://help.ads.microsoft.com/#apex/ads/en/50851/0'; // this is the default page for import description.\r\n\r\n return {\r\n condition: true,\r\n id: 'FixAudienceCampaignImportedAsSearchCampaignNotification',\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n title: this.i18n.getString(_TL_('We’ll fix your Audience campaign import')),\r\n message: `${message}`,\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Check import logs')),\r\n action: () => {\r\n window.open(`${checkImportLogsUrl}`, '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: {\r\n checkImportLogsUrl,\r\n },\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getGoogleImportImageAdForScheduledImportAccountsNotification() {\r\n const permissions = this.context.getCurrentPermissions();\r\n\r\n if (!_.result(permissions, 'NotificationForImportGoogleImageAd', false)) {\r\n return null;\r\n }\r\n const message = this.i18n.getString(_TL_('We’ll begin supporting multi-format ads on October 9, at which point we’ll begin to import any image ads we’ve previously dropped from your scheduled Google import. Please review your ads once they’re in our system.'));\r\n\r\n const serverContext = this.context.getServerContext() || {};\r\n const rootURLPath = _.result(serverContext, 'Urls', {}).RootUIUrl;\r\n const aid = _.result(serverContext, 'CurrentAccount', {}).Id;\r\n const cid = _.result(serverContext, 'CurrentCustomer', {}).Id;\r\n const uid = _.result(serverContext, 'CurrentUser', {}).Id;\r\n\r\n const checkImportLogsUrl = rootURLPath && aid && cid && uid ?\r\n `${rootURLPath}campaign/vnext/campaigns?aid=${aid}&cid=${cid}&uid=${uid}` :\r\n 'https://help.ads.microsoft.com/#apex/ads/en/50851/0'; // this is the default page for import description.\r\n\r\n return {\r\n condition: true,\r\n id: 'FixAudienceCampaignImportedAsSearchCampaignNotification',\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n title: this.i18n.getString(_TL_('Importing your multi-format ads')),\r\n message: `${message}`,\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('View my campaigns')),\r\n action: () => {\r\n window.open(`${checkImportLogsUrl}`, '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: {\r\n checkImportLogsUrl,\r\n },\r\n },\r\n ],\r\n };\r\n }\r\n\r\n getAdoptAudienceShoppingCampaignNotification() {\r\n const permissions = this.context.getCurrentPermissions();\r\n if (!_.result(permissions, 'IsAWFShoppingAdoptionNotificationEnabled', false)) {\r\n return null;\r\n }\r\n const message = this.i18n.getString(_TL_('Reach people in the right place at the right time on any device by '));\r\n const messageLink = this.i18n.getString(_TL_('creating shopping audience campaigns.'));\r\n const learnMoreLink = 'https://www.youtube.com/watch?v=Ux8fIRFAkTQ';\r\n const config = {\r\n condition: true,\r\n id: 'AWFShoppingAdoptionNotification',\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n title: this.i18n.getString(_TL_('Create new shopping audience campaigns')),\r\n messageType: 'ReactComponent',\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Learn more')),\r\n action: () => {\r\n window.open(learnMoreLink, '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n };\r\n const MessageBox = (props) => {\r\n // eslint-disable-next-line react/prop-types\r\n const { logger, scenarioNames, logContent } = props;\r\n const content = logContent(`id=${config.id}, title=${config.title}, message=${message}, notificationSource=, notificationTypeId=, uiDeliveryId=, src=message`);\r\n return (\r\n \r\n {message}\r\n logger.trace(scenarioNames.NotificationCard, content)}\r\n >\r\n {messageLink}\r\n \r\n \r\n );\r\n };\r\n\r\n return {\r\n ...config,\r\n message: MessageBox,\r\n };\r\n }\r\n\r\n getImpressionReportingNotification() : INotification | null {\r\n return {\r\n condition: true,\r\n id: 'ImpressionReportingNotification',\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n title: this.i18n.getString(_TL_('Update to online video ad impressions reporting')),\r\n message: this.i18n.getString(_TL_('Your online video ad impressions now reflect viewable impressions, which are counted when at least 50% of the ad is in view on screen for two seconds or more (one second for native and display ads). This aligns with Interactive Advertising Bureau (IAB) standards.')),\r\n };\r\n }\r\n\r\n getMSANChurnNotifications() : INotification[] {\r\n const permissions = this.context.getCurrentPermissions();\r\n\r\n if (!_.result(permissions, 'IsMSANChurnNotificationEnabled', false)) {\r\n return [];\r\n }\r\n\r\n const phase = _.result(permissions, 'MSANChurnNotificationPhase', 0);\r\n\r\n const commonNotificationSetting = {\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n condition: true,\r\n };\r\n\r\n const churnNotifications : INotification[] = [\r\n _.extend({\r\n id: 'MSANChurnNotificationPhase1',\r\n title: this.i18n.getString(_TL_('Are your bids competitive enough to scale in your audience campaigns?')),\r\n message: this.i18n.getString(_TL_('Take a look at the bid landscape tool for recommendations and choose the optimal bid based on expected performance. Watch this quick video demo for more guidance.')),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Video demo')),\r\n action: () => {\r\n window.open('https://youtu.be/cizFKB3yWuw', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n {\r\n text: this.i18n.getString(_TL_('Bid landscape tool')),\r\n action: () => {\r\n window.open('https://help.ads.microsoft.com/#apex/ads/en/51096/1', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n }, commonNotificationSetting),\r\n _.extend({\r\n id: 'MSANChurnNotificationPhase2',\r\n title: this.i18n.getString(_TL_('Are you giving your audience campaigns the best chance of success? ')),\r\n message: this.i18n.getString(_TL_('For any new audience campaigns, make sure your ads are running for enough time before evaluating ROI. This gives the algorithms a chance to learn about your audience and optimize for best performance.')),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Optimization webcast')),\r\n action: () => {\r\n window.open('https://www.youtube.com/watch?v=Y6R_0cmF8GI', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n }, commonNotificationSetting),\r\n _.extend({\r\n id: 'MSANChurnNotificationPhase3',\r\n title: this.i18n.getString(_TL_('Do you have the best imagery for your audience campaigns?')),\r\n message: this.i18n.getString(_TL_('Upload multiple images and choose lifestyle photos for optimal performance. If you don\\'t have images, you can import from Google, Facebook, or Pinterest, choose from our free stock images, or bring over images from your website.')),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Best practices for images')),\r\n action: () => {\r\n window.open('https://help.ads.microsoft.com/#apex/ads/en/56912/0-500', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n {\r\n text: this.i18n.getString(_TL_('Using stock images')),\r\n action: () => {\r\n window.open('https://help.ads.microsoft.com/#apex/ads/en/60052/1', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n {\r\n text: this.i18n.getString(_TL_('Import tools')),\r\n action: () => {\r\n window.open('https://help.ads.microsoft.com/#apex/ads/en/n5032/0', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n }, commonNotificationSetting),\r\n _.extend({\r\n id: 'MSANChurnNotificationPhase4',\r\n title: this.i18n.getString(_TL_('Are you reaching your ideal customers in your audience campaigns?')),\r\n message: this.i18n.getString(_TL_('Here\\'s some tips:\\r\\n\\r\\nSet up a separate campaign for each audience type – add the most relevant in market audiences in one campaign and remarketing in another.\\r\\n\\r\\nAdd positive bid boosts to the best performing segments – like location, day of week/time of day, device, and age/gender.')),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Remarketing')),\r\n action: () => {\r\n window.open('https://help.ads.microsoft.com/#apex/ads/en/56935/1-500', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n {\r\n text: this.i18n.getString(_TL_('In-market audiences')),\r\n action: () => {\r\n window.open('https://help.ads.microsoft.com/#apex/ads/en/56851/1-500', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n {\r\n text: this.i18n.getString(_TL_('Target your ads')),\r\n action: () => {\r\n window.open('https://help.ads.microsoft.com/#apex/ads/en/51029/0-500', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n }, commonNotificationSetting),\r\n _.extend({\r\n id: 'MSANChurnNotificationPhase5',\r\n title: this.i18n.getString(_TL_('Are your potential customers experiencing creative fatigue from your audience ads?')),\r\n message: this.i18n.getString(_TL_('Your creative assets are what potential customers see first.\\r\\n\\r\\nRefresh your images regularly and add multiple variations of headlines, descriptions, and images for best performance.')),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Best practices for images')),\r\n action: () => {\r\n window.open('https://help.ads.microsoft.com/#apex/ads/en/56912/0-500', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n }, commonNotificationSetting),\r\n ];\r\n\r\n const allowedNotifications : INotification[] = [];\r\n\r\n for (let i = 1; i < phase + 1; i++) {\r\n allowedNotifications.push(churnNotifications[i - 1]);\r\n }\r\n\r\n return allowedNotifications;\r\n }\r\n\r\n getVersionRefreshedAlert() {\r\n const versionRefreshedAlert: INotification = {\r\n condition: this.context.isVersionRefreshed(),\r\n id: 'versionRefreshed',\r\n target: TargetComponent.TopBanner,\r\n dismissMode: DismissMode.never,\r\n severity: NotificationLevel.Error,\r\n title: '',\r\n scopeLevel: ScopeLevel.root,\r\n message: this.i18n.getString(_TL_('We\\'ve just made updates to Microsoft Advertising. You will need to refresh the page to get the new version. Refresh the page')),\r\n };\r\n\r\n return versionRefreshedAlert;\r\n }\r\n\r\n getAccountSuspendedAlert() {\r\n const currentScopeLevel = calcScopeLevel(this.context.getCurrentScope());\r\n\r\n if (currentScopeLevel !== ScopeLevel.account) {\r\n return null;\r\n }\r\n\r\n const suspendedAccountStatus = Constants.AccountLifecycleStatus.Suspended;\r\n const accountSuspendedAlert: INotification = {\r\n condition: this.context.getUserContext()\r\n .CurrentAccount.Status === suspendedAccountStatus, // Account suspended\r\n id: 'accountSuspended',\r\n target: TargetComponent.TopBanner,\r\n dismissMode: DismissMode.never,\r\n severity: NotificationLevel.Error,\r\n title: '',\r\n scopeLevel: ScopeLevel.account,\r\n message: this.i18n.getString(i18nMap.Alert_Account_suspended),\r\n };\r\n\r\n return accountSuspendedAlert;\r\n }\r\n\r\n // FixMe: Fetch maintenance message from server side\r\n getMaintainanceAlert(): INotification | null {\r\n const scopeLevel = ScopeLevel.root;\r\n if (!shouldRender(scopeLevel, this.context.getChangeScope())) {\r\n return null;\r\n }\r\n\r\n return {\r\n condition: false, // this.config.get('ShowMaintenanceAlert'),\r\n id: 'DownForMaintenance_New',\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n severity: NotificationLevel.Info,\r\n scopeLevel,\r\n title: this.i18n.getString(i18nMap.UnifiedNotificationQueue_DownForMaintenance_New_Title),\r\n message:\r\n this.i18n.getString(i18nMap.UnifiedNotificationQueue_DownForMaintenance_New_Message, {\r\n start: '', // this.config.get('ShowMaintenanceAlertStart'),\r\n end: '', // this.config.get('ShowMaintenanceAlertFinish')\r\n }),\r\n };\r\n }\r\n\r\n getIncompatibleBrowserAlert(): INotification | null {\r\n const scopeLevel = ScopeLevel.root;\r\n if (!shouldRender(scopeLevel, this.context.getChangeScope())) {\r\n return null;\r\n }\r\n\r\n return {\r\n condition: !this.context.isCompatibleBrowser(),\r\n id: 'Alert_IncompatibleBrowsers',\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n severity: NotificationLevel.Info,\r\n scopeLevel,\r\n title: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Alert_IncompatibleBrowsers_Title),\r\n message:\r\n this.i18n.getString(i18nMap.UnifiedNotificationQueue_Alert_IncompatibleBrowsers_Message),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.LearnMore),\r\n callbackType: 'closeQueue',\r\n extraClassNames: ['HelpTopic'],\r\n extraAttrs: {\r\n query: 'help:52033',\r\n },\r\n },\r\n ],\r\n };\r\n }\r\n\r\n async hasSmartShoppingCampaign(context: IContext, getEntityFunctionObject: any) {\r\n const currentScope = context.getCurrentScope();\r\n const values = _.assign({}, currentScope.values);\r\n values.adGroupId = undefined;\r\n values.campaignId = undefined;\r\n\r\n const accountScope = {\r\n values,\r\n location: currentScope.location,\r\n };\r\n\r\n // @ts-ignore\r\n const { getEntityFromScope } = getEntityFunctionObject || await import(/* webpackMode: 'eager' */ '@bingads-webui/edm-campaign');\r\n const { currentEntity } = getEntityFromScope(accountScope);\r\n\r\n const query = 'CampaignType eq \\'Shopping\\' and CampaignSubType eq \\'ShoppingSmartAds\\'';\r\n const hasSmartShoppingCampaign = await currentEntity.Campaigns.get({\r\n top: 1,\r\n filter: {\r\n where: query,\r\n },\r\n select: ['Id'],\r\n }).fetch()\r\n .then(data => data.value.length > 0, () => false);\r\n\r\n return hasSmartShoppingCampaign;\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport { IContext } from '../../types/context.types';\r\nimport { getAlertFlags, IAlertFlags } from './alert-information';\r\nimport { i18nMap, isAvailable, isBillingLinkPermission } from '../../utils';\r\nimport {\r\n DismissMode,\r\n INotification,\r\n NotificationLevel,\r\n TargetComponent,\r\n ScopeLevel,\r\n} from '../../types/notification.types';\r\n\r\nexport class UETNotifications {\r\n context: IContext;\r\n i18n: any;\r\n availableScopes: ScopeLevel[];\r\n\r\n constructor(context: IContext) {\r\n this.context = context;\r\n this.i18n = context.getNewI18n();\r\n this.availableScopes = [ScopeLevel.account];\r\n }\r\n\r\n async getUETNotifications(): Promise {\r\n if (!this.context.getUserContext().CurrentUser.IsInternal && isBillingLinkPermission(this.context.getSettingsContext())) {\r\n return [];\r\n }\r\n\r\n const currentScope = this.context.getCurrentScope();\r\n if (!isAvailable(currentScope, this.availableScopes)) {\r\n return [];\r\n }\r\n\r\n const fields = ['HasMsClickIdTaggingEnabled', 'HasGoals'];\r\n const alertFlags: IAlertFlags = await getAlertFlags(fields, this.trimScopeToAccount());\r\n\r\n if (!alertFlags.HasMsClickIdTaggingEnabled && alertFlags.HasGoals) {\r\n return [\r\n {\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Warning,\r\n title: this.i18n.getString(i18nMap.Alert_Uet_EnableAutoTagging_Title),\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n message: this.i18n.getString(i18nMap.Alert_Uet_EnableAutoTagging),\r\n condition: true,\r\n id: 'Notification_UET_EnableAutoTagging',\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Action_AutoTaggingLink),\r\n href: '/campaign/vnext/accountsettings',\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n },\r\n ];\r\n }\r\n return [];\r\n }\r\n\r\n trimScopeToAccount() {\r\n const scope = this.context.getCurrentScope();\r\n const values = _.assign({}, scope.values);\r\n values.adGroupId = undefined;\r\n values.campaignId = undefined;\r\n\r\n return {\r\n values,\r\n location: scope.location,\r\n };\r\n }\r\n}\r\n","export const mockTopBannerResponse = {\r\n alertType: 'BannerAlert',\r\n NotificationId: 'AddPaymentInstrument',\r\n NotificationMessage: 'You need a primary payment method before your ads will run. Add a payment method now',\r\n NotificationLevel: 'danger',\r\n ActionTriggered: false,\r\n};\r\n","import $ from 'jquery';\r\nimport _ from 'underscore';\r\nimport URI from 'urijs';\r\n\r\nimport { INotification, ScopeLevel, NotificationLevel, TargetComponent, DismissMode, IContext } from '../../types';\r\nimport { shouldRender } from '../../utils';\r\nimport { mockTopBannerResponse } from './mock-cc-notifications';\r\n\r\ninterface ICCUNQNotification extends INotification {\r\n alertType: 'UnifiedQueueAlert' | 'BannerAlert';\r\n}\r\n\r\ninterface ICCBannerNotification {\r\n alertType: 'UnifiedQueueAlert' | 'BannerAlert';\r\n NotificationId: string;\r\n NotificationMessage: string;\r\n NotificationLevel: 'danger' | 'warning' | 'info' | 'success';\r\n ActionTriggered: boolean;\r\n}\r\n\r\ntype ICCNotification = ICCBannerNotification | ICCUNQNotification;\r\n\r\nconst notificationLevelMapping = {\r\n danger: NotificationLevel.Error,\r\n warning: NotificationLevel.Warning,\r\n info: NotificationLevel.Info,\r\n success: NotificationLevel.Confirmation,\r\n};\r\n\r\nexport class CCNotifications {\r\n private context: IContext;\r\n constructor(context: IContext) {\r\n this.context = context;\r\n }\r\n\r\n private getUrl() {\r\n const { Urls } = this.context.getServerContext();\r\n const ccUrl = Urls.ClientCenterBaseUrl || Urls.CCBaseUrl;\r\n\r\n return ccUrl;\r\n }\r\n\r\n async getCCNotifications(scopeLevel: ScopeLevel) {\r\n if (!shouldRender(scopeLevel || ScopeLevel.account, this.context.getChangeScope())) {\r\n return [];\r\n }\r\n\r\n const ccNotificaitons: ICCNotification[] = await this.fetchCCNotifications();\r\n\r\n return this.transformCCNotifications(ccNotificaitons);\r\n }\r\n\r\n async fetchCCNotifications() {\r\n // MockTopBanner is for test use to speed up the banner loading in Onebox env.\r\n // When MockTopBanner=true, the page will not send the real request, just return a mock banner immediately.\r\n const { MockTopBanner } = this.context.getCurrentPermissions().dynamic;\r\n\r\n if (MockTopBanner) {\r\n const { values: { aid } } = this.context.getCurrentScope();\r\n const result: ICCBannerNotification[] = aid ? [mockTopBannerResponse as ICCBannerNotification] : [];\r\n return Promise.resolve(result);\r\n }\r\n\r\n const { values: { aid, cid, uid } } = this.context.getCurrentScope();\r\n const aidPart = (_.isNull(aid) || _.isUndefined(aid)) ? '' : `&aid=${aid}`;\r\n const query = new URI(location.href).search(true);\r\n const mktPart = query.mkt ? `&mkt=${query.mkt}` : '';\r\n\r\n return $.ajax({\r\n url: `${this.getUrl()\r\n }Notifications/StatusNotifications?rurl=${encodeURIComponent(window.location.href)}&cid=${\r\n cid\r\n }&uid=${uid}&isUINext=true${aidPart}${mktPart}`,\r\n xhrFields: {\r\n withCredentials: true,\r\n },\r\n headers: {\r\n 'X-Requested-With': 'XMLHttpRequest',\r\n },\r\n });\r\n }\r\n\r\n buildDismissCCNotification(notification: ICCUNQNotification) {\r\n const { values: { aid, cid, uid } } = this.context.getCurrentScope();\r\n const aidPart = (_.isNull(aid) || _.isUndefined(aid)) ? '' : `&aid=${aid}`;\r\n\r\n if ((notification.dismissAction as any) === 'CCUIServerSession') {\r\n // eslint-disable-next-line no-param-reassign\r\n notification.dismissAction = (no: INotification) => {\r\n $.ajax({\r\n url: `${this.getUrl()}Notifications/StatusNotifications?__adcenterAJAX=true&id=${no.id}&cid=${\r\n cid\r\n }&uid=${uid}${aidPart}`,\r\n type: 'DELETE',\r\n timeout: 20000,\r\n xhrFields: {\r\n withCredentials: true,\r\n },\r\n success: () => {},\r\n error: () => null,\r\n });\r\n };\r\n } else {\r\n // eslint-disable-next-line no-param-reassign\r\n notification.dismissAction = _.noop;\r\n }\r\n }\r\n\r\n transformCCNotifications(notifications: ICCNotification[]): INotification[] {\r\n return notifications.map((notification) => {\r\n if (notification.alertType === 'BannerAlert') {\r\n const bannerNot: ICCBannerNotification = notification as ICCBannerNotification;\r\n let target: TargetComponent = TargetComponent.TopBanner;\r\n if (bannerNot.ActionTriggered) {\r\n target = TargetComponent.FloatingBanner;\r\n }\r\n\r\n return {\r\n severity: notificationLevelMapping[bannerNot.NotificationLevel],\r\n message: bannerNot.NotificationMessage,\r\n id: bannerNot.NotificationId,\r\n condition: true,\r\n target,\r\n dismissMode: DismissMode.never,\r\n scopeLevel: ScopeLevel.account,\r\n } as INotification;\r\n }\r\n const unqNot: ICCUNQNotification = notification as ICCUNQNotification;\r\n unqNot.target = TargetComponent.UnifiedQueue;\r\n unqNot.condition = true;\r\n unqNot.dismissMode = DismissMode.custom;\r\n unqNot.scopeLevel = ScopeLevel.account;\r\n this.buildDismissCCNotification(unqNot);\r\n\r\n return unqNot;\r\n });\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport $ from 'jquery';\r\nimport {\r\n upgradeCampaignsToPMaxCall,\r\n fetchCampaignUpgradeData,\r\n upgradeSuccess,\r\n upgradeFailure,\r\n onGenericError,\r\n clearCache\r\n} from '@bingads-webui-campaign-react/campaign-upgrade-tool';\r\nimport { withUiBlock } from '@bingads-webui/uiblocker';\r\n\r\nimport { notificationApi } from '../api';\r\nimport { INotification, TargetComponent, NotificationLevel, DismissMode, ScopeLevel, IContext } from '../../types';\r\nimport { i18nMap, shouldRender, isAvailable, isBillingLinkPermission } from '../../utils';\r\n\r\n\r\nexport interface IPmaxCampaignUpgradeNotification{\r\n HasPmaxCampaignUpgrade: boolean,\r\n}\r\n\r\nexport class PmaxCampaignUpgradeNotification {\r\n context: IContext;\r\n i18n: any;\r\n availableScopes: ScopeLevel[];\r\n\r\n constructor(context: IContext) {\r\n this.context = context;\r\n this.i18n = context.getNewI18n();\r\n this.availableScopes = [ScopeLevel.account];\r\n }\r\n\r\n async getEligibleCampaignNum(params: any): Promise {\r\n return fetchCampaignUpgradeData(params);\r\n }\r\n\r\n async upgradeCampaignsToPMax(params: any): Promise {\r\n return upgradeCampaignsToPMaxCall(params);\r\n }\r\n\r\n async getPmaxCampaignUpgradeNotifications() {\r\n if (!this.context.getUserContext().CurrentUser.IsInternal && isBillingLinkPermission(this.context.getSettingsContext())) {\r\n return [];\r\n }\r\n\r\n const {\r\n PerformanceMaxCampaignsPhaseTwoCampaignUpgradeToolNotification,\r\n } = this.context.getCurrentPermissions().dynamic;\r\n\r\n if (!PerformanceMaxCampaignsPhaseTwoCampaignUpgradeToolNotification) {\r\n return [];\r\n }\r\n\r\n if (!isAvailable(this.context.getCurrentScope(), this.availableScopes)) {\r\n return [];\r\n }\r\n\r\n if (!shouldRender(ScopeLevel.account, this.context.getChangeScope())) {\r\n return [];\r\n }\r\n\r\n const pmaxCampaignUpgradeNotification: IPmaxCampaignUpgradeNotification = await this.getNotifications();\r\n const notifications: INotification[] = [];\r\n\r\n if (this.hasAnyPmaxCampaignUpgradeNotifications(pmaxCampaignUpgradeNotification)) {\r\n const { aid, cid } = this.context.getCurrentScope().values;\r\n\r\n const payload = {\r\n Campaigns: [{\r\n ParentId: aid,\r\n EntityId: -1,\r\n }],\r\n };\r\n\r\n const onUpgradeApiError = (response) => {\r\n const errors = _.result(response, 'errors', []);\r\n if (_.isEmpty(errors)) {\r\n onGenericError(this.i18n);\r\n } else {\r\n notificationApi.add({\r\n id: 'campaignUpgradeApiError',\r\n condition: true,\r\n severity: NotificationLevel.Error,\r\n message: this.i18n.getString(upgradeFailure),\r\n target: TargetComponent.FloatingBanner,\r\n });\r\n }\r\n };\r\n\r\n notifications.push({\r\n id: 'PmaxCampaignUpgrade',\r\n condition: true,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Pmax_CampaignUpgrade_Title),\r\n message: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Pmax_CampaignUpgrade_Message),\r\n extraOptions: {\r\n dialogProps: {\r\n dialogTitle: this.i18n.getString(_TL_('Are you sure you want to upgrade all smart shopping campaigns to Performance Max campaigns?')),\r\n dialogText: this.i18n.getString(_TL_('Once you confirm, the upgrade process will continue until it completes and cannot be discontinued.')),\r\n dialogConfirm: this.i18n.getString(_TL_('Yes')),\r\n dialogCancel: this.i18n.getString(_TL_('Cancel')),\r\n dialogAction: (removeNotification) => {\r\n this.upgradeCampaignsToPMax({ cid, aid, payload })\r\n .then((response) => {\r\n const updatedCampaigns = response.value;\r\n notificationApi.add({\r\n id: 'campaignUpgradeApiSuccess',\r\n condition: true,\r\n severity: NotificationLevel.Info,\r\n message: this.i18n.getString(upgradeSuccess, { count: updatedCampaigns.length }),\r\n target: TargetComponent.FloatingBanner,\r\n });\r\n if (_.isFunction(removeNotification)) removeNotification();\r\n clearCache('Campaign');\r\n })\r\n .catch(onUpgradeApiError)\r\n .finally(withUiBlock($('.notification-queue')));\r\n },\r\n },\r\n },\r\n actionList: [\r\n {\r\n text: this.i18n.getString(i18nMap.Notification_Action_Apply),\r\n callbackType: 'openDialog',\r\n extraClassNames: ['campaign-upgrade-apply-button'],\r\n },\r\n ],\r\n });\r\n }\r\n\r\n return notifications;\r\n }\r\n\r\n async getNotifications(): Promise {\r\n const { aid, cid } = this.context.getCurrentScope().values;\r\n\r\n const eligibleUpgradeCampaigns = await this.getEligibleCampaignNum({\r\n cid,\r\n aid,\r\n params: { $filter: \"(CampaignMigrationStatus eq Enum.CampaignMigrationStatus'AvailableForUpgrade')\" },\r\n payload: {\r\n gridDataParameters: {\r\n DateRange: {\r\n // Just want to get campaign upgrade status, don't care BI data, so pass dummy date ranges.\r\n StartDate: '2024-10-29',\r\n EndDate: '2024-10-29',\r\n },\r\n },\r\n },\r\n });\r\n\r\n if (_.result(eligibleUpgradeCampaigns, '@odata.count') > 0) {\r\n return { HasPmaxCampaignUpgrade: true } as IPmaxCampaignUpgradeNotification;\r\n }\r\n return { HasPmaxCampaignUpgrade: false } as IPmaxCampaignUpgradeNotification;\r\n }\r\n\r\n private hasAnyPmaxCampaignUpgradeNotifications(pmaxCampaignUpgradeNotification: IPmaxCampaignUpgradeNotification): boolean {\r\n return pmaxCampaignUpgradeNotification.HasPmaxCampaignUpgrade;\r\n }\r\n}\r\n","import { INotification, TargetComponent, NotificationLevel, DismissMode, ScopeLevel, IContext } from '../../types';\r\nimport { i18nMap, shouldRender, isAvailable, isBillingLinkPermission } from '../../utils';\r\n\r\nexport class LocationIntentUpdateNotifications {\r\n context: IContext;\r\n i18n: any;\r\n availableScopes: ScopeLevel[];\r\n\r\n constructor(context: IContext) {\r\n this.context = context;\r\n this.i18n = context.getNewI18n();\r\n this.availableScopes = [ScopeLevel.account];\r\n }\r\n\r\n async getLocationIntentUpdateNotifications() {\r\n if (!this.context.getUserContext().CurrentUser.IsInternal && isBillingLinkPermission(this.context.getSettingsContext())) {\r\n return [];\r\n }\r\n\r\n const {\r\n LocationIntentUpdateNotification,\r\n } = this.context.getCurrentPermissions().dynamic;\r\n\r\n if (!LocationIntentUpdateNotification) {\r\n return [];\r\n }\r\n\r\n if (!isAvailable(this.context.getCurrentScope(), this.availableScopes)) {\r\n return [];\r\n }\r\n\r\n if (!shouldRender(ScopeLevel.account, this.context.getChangeScope())) {\r\n return [];\r\n }\r\n\r\n const notifications: INotification[] = [];\r\n\r\n notifications.push({\r\n id: 'LocationIntentUpdate',\r\n condition: true,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Location_Intent_Update_Title),\r\n message: this.i18n.getString(i18nMap.UnifiedNotificationQueue_Location_Intent_Update_Message),\r\n actionList: [],\r\n });\r\n\r\n\r\n return notifications;\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport { INotification, TargetComponent, NotificationLevel, DismissMode, ScopeLevel, IContext } from '../../types';\r\nimport { isBillingLinkPermission } from '../../utils';\r\n\r\nconst notificationTitle = _TL_('Hotel Center to Lodging campaigns migration ');\r\nconst notificationMessage = _TL_('As of February 6, 2024, we’ll change the set up and management of Hotel price ads and Property promotion ads. You’ll still be able to manage any campaigns for hotels and vacation rentals using the enhanced Lodging campaigns.{{br}}Please review our {{guideLinkPrefix}}Lodging Campaigns Guide{{guideLinkSuffix}} to help you migrate to Lodging campaigns using bulk upload or API. You can also {{helpLinkPrefix}}create Lodging campaigns within the Microsoft Advertising Platform{{helpLinkSuffix}}.{{br}}{{blogLinkPrefix}}Read more about this migration.{{blogLinkSuffix}}');\r\n\r\nexport class HotelCenterMigrationNotification {\r\n context: IContext;\r\n i18n: any;\r\n availableScopes: ScopeLevel[];\r\n\r\n constructor(context: IContext) {\r\n this.context = context;\r\n this.i18n = context.getNewI18n();\r\n this.availableScopes = [ScopeLevel.account, ScopeLevel.customer];\r\n }\r\n\r\n async getHotelCenterMigrationNotifications() {\r\n if (!this.context.getUserContext().CurrentUser.IsInternal && isBillingLinkPermission(this.context.getSettingsContext())) {\r\n return [];\r\n }\r\n\r\n const serverContext = this.context.getServerContext();\r\n const isHotelCenterEnabled = serverContext && serverContext.DynamicPermissions.HotelAds;\r\n const isHotelCenterRemovalEnabled = serverContext && serverContext.DynamicPermissions.HotelCenterRemoval;\r\n if (!isHotelCenterEnabled || isHotelCenterRemovalEnabled) {\r\n return [];\r\n }\r\n\r\n const replaceMap = {\r\n br: '

    ',\r\n guideLinkPrefix: '',\r\n guideLinkSuffix: '',\r\n helpLinkPrefix: '',\r\n helpLinkSuffix: '',\r\n blogLinkPrefix: '',\r\n blogLinkSuffix: '',\r\n };\r\n\r\n let finalMessage = this.i18n.getString(notificationMessage);\r\n Object.keys(replaceMap).forEach((key) => {\r\n finalMessage = finalMessage.replaceAll(`{{${key}}}`, replaceMap[key]);\r\n });\r\n\r\n // Get notifications\r\n const notifications: INotification[] = [{\r\n id: 'HotelCenterMigration',\r\n condition: true,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(notificationTitle),\r\n message: finalMessage,\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Contact Support')),\r\n action: () => {\r\n window.open('https://about.ads.microsoft.com/en-us/microsoft-advertising-support');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: ['hotel-center-migration-contact-support'],\r\n },\r\n ],\r\n }];\r\n\r\n\r\n return _.compact(notifications);\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport { INotification, TargetComponent, NotificationLevel, DismissMode, ScopeLevel, IContext } from '../../types';\r\nimport { isBillingLinkPermission } from '../../utils';\r\n\r\nconst notificationTitle = _TL_('Important Hotel Center update');\r\nconst notificationMessage = _TL_('In response to customer feedback, we’ve temporarily paused the February 6th change for Hotel Center. However, in the near future, we’ll still change the set up and management of Hotel price ads and Property promotion ads. We strongly encourage you to convert your existing campaigns to Lodging campaigns to proactively help the migration process and avoid future disruptions.');\r\n\r\nexport class HotelCenterMigrationPhase2Notification {\r\n context: IContext;\r\n i18n: any;\r\n availableScopes: ScopeLevel[];\r\n\r\n constructor(context: IContext) {\r\n this.context = context;\r\n this.i18n = context.getNewI18n();\r\n this.availableScopes = [ScopeLevel.account, ScopeLevel.customer];\r\n }\r\n\r\n async getHotelCenterMigrationPhase2Notifications() {\r\n if (!this.context.getUserContext().CurrentUser.IsInternal && isBillingLinkPermission(this.context.getSettingsContext())) {\r\n return [];\r\n }\r\n\r\n const currentPermissions = this.context.getCurrentPermissions();\r\n const isHotelCenterEnabled = currentPermissions && currentPermissions.dynamic.HotelAds;\r\n const isHotelCenterRemovalEnabled = currentPermissions && currentPermissions.dynamic.HotelCenterRemoval;\r\n if (!isHotelCenterEnabled || isHotelCenterRemovalEnabled) {\r\n return [];\r\n }\r\n\r\n // Get notifications\r\n const notifications: INotification[] = [{\r\n id: 'HotelCenterPhase2Migration',\r\n condition: true,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(notificationTitle),\r\n message: this.i18n.getString(notificationMessage),\r\n actionList: [],\r\n }];\r\n\r\n\r\n return _.compact(notifications);\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport { INotification, TargetComponent, NotificationLevel, DismissMode, ScopeLevel, IContext } from '../../types';\r\nimport { isBillingLinkPermission } from '../../utils';\r\n\r\nconst notificationTitle = _TL_('Important updates about the Hotel Center Deprecation');\r\nconst notificationMessage = _TL_('As of April 9th, you’ll no longer have full access to Hotel Center for your campaign management. You can continue to manage your feeds through Hotel Center; otherwise, please use {{lodgingCampaignPrefix}}Lodging campaigns{{lodgingCampaignSuffix}} to manage your Hotel Price ads and Property Promotion ads. {{br2}}{{guideLinkPrefix}}Read more about how you can make your migration process smoother{{guideLinkSuffix}}.');\r\n\r\nexport class HotelCenterMigrationPhase3Notification {\r\n context: IContext;\r\n i18n: any;\r\n availableScopes: ScopeLevel[];\r\n\r\n constructor(context: IContext) {\r\n this.context = context;\r\n this.i18n = context.getNewI18n();\r\n this.availableScopes = [ScopeLevel.account, ScopeLevel.customer];\r\n }\r\n\r\n async getHotelCenterMigrationPhase3Notifications() {\r\n if (!this.context.getUserContext().CurrentUser.IsInternal && isBillingLinkPermission(this.context.getSettingsContext())) {\r\n return [];\r\n }\r\n\r\n const currentPermissions = this.context.getCurrentPermissions();\r\n const isHotelCenterEnabled = currentPermissions && currentPermissions.dynamic.HotelAds;\r\n const isHotelCenterRemovalEnabled = currentPermissions && currentPermissions.dynamic.HotelCenterRemoval;\r\n if (!isHotelCenterEnabled || isHotelCenterRemovalEnabled) {\r\n return [];\r\n }\r\n\r\n const replaceMap = {\r\n br: '
    ',\r\n br2: '

    ',\r\n lodgingCampaignPrefix: '',\r\n lodgingCampaignSuffix: '',\r\n guideLinkPrefix: '',\r\n guideLinkSuffix: '',\r\n };\r\n\r\n let finalMessage = this.i18n.getString(notificationMessage);\r\n Object.keys(replaceMap).forEach((key) => {\r\n finalMessage = finalMessage.replaceAll(`{{${key}}}`, replaceMap[key]);\r\n });\r\n\r\n // Get notifications\r\n const notifications: INotification[] = [{\r\n id: 'HotelCenterPhase3Migration',\r\n condition: true,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(notificationTitle),\r\n message: finalMessage,\r\n actionList: [],\r\n }];\r\n\r\n\r\n return _.compact(notifications);\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport { INotification, TargetComponent, NotificationLevel, DismissMode, ScopeLevel, IContext } from '../../types';\r\nimport { isBillingLinkPermission } from '../../utils';\r\n\r\nexport class BroadOnlyNotification {\r\n context: IContext;\r\n i18n: any;\r\n availableScopes: ScopeLevel[];\r\n\r\n constructor(context: IContext) {\r\n this.context = context;\r\n this.i18n = context.getNewI18n();\r\n this.availableScopes = [ScopeLevel.account, ScopeLevel.customer];\r\n }\r\n\r\n async getBroadOnlyNotifications() {\r\n if (!this.context.getUserContext().CurrentUser.IsInternal && isBillingLinkPermission(this.context.getSettingsContext())) {\r\n return [];\r\n }\r\n\r\n // const serverContext = this.context.getServerContext();\r\n // const isBroadOnlyEnabled = serverContext && serverContext.DynamicPermissions.BroadOnly;\r\n const isBroadOnlyEnabled = false;\r\n if (!isBroadOnlyEnabled) {\r\n return [];\r\n }\r\n\r\n const titleApproved = _TL_('We’ve approved your brand request for {{name}}');\r\n const titleNotApproved = _TL_('Your brand request for {{name}} was disapproved ');\r\n\r\n const messgeApproved = _TL_('Your brand request was approved and has been automatically added to your brand list. You can go to Tools > Brand lists to review and edit your shared library.');\r\n const messgeNotApproved = _TL_('The brand you requested wasn’t approved. To learn more about why your brand may have been disapproved, please see {{helpLinkStart}}[new help topic]{{helpLinkEnd}}.');\r\n\r\n const data = await this.getNotifications();\r\n\r\n // Get notifications\r\n const notifications: INotification[] = data.map(notification => ({\r\n id: `BroadOnlyNotification-${notification.Id}`,\r\n condition: true,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n title: notification.Approved ? this.i18n.getString(titleApproved, { name: notification.Name }) : this.i18n.getString(titleNotApproved, { name: notification.Name }),\r\n message: notification.Approved ? this.i18n.getString(messgeApproved) : this.i18n.getString(messgeNotApproved, {\r\n helpLinkStart: '',\r\n helpLinkEnd: '',\r\n }),\r\n actionList: [],\r\n }));\r\n\r\n\r\n return _.compact(notifications);\r\n }\r\n\r\n async getNotifications() {\r\n await new Promise(resolve => setTimeout(resolve, 500));\r\n return [\r\n {\r\n Id: 1,\r\n Name: 'adida',\r\n Approved: true,\r\n },\r\n {\r\n Id: 2,\r\n Name: 'adida',\r\n Approved: false,\r\n },\r\n ];\r\n }\r\n}\r\n","import { odata } from '@bingads-webui/http-util';\r\nimport { INotification, TargetComponent, NotificationLevel, DismissMode, ScopeLevel, IContext } from '../../types';\r\nimport { isBillingLinkPermission } from '../../utils';\r\n\r\nexport interface IStores{\r\n '@odata.context': string,\r\n ProviderIds: number[],\r\n}\r\n\r\nexport class GMCTokenExpiredNotification {\r\n context: IContext;\r\n i18n: any;\r\n availableScopes: ScopeLevel[];\r\n\r\n constructor(context: IContext) {\r\n this.context = context;\r\n this.i18n = context.getNewI18n();\r\n this.availableScopes = [ScopeLevel.account, ScopeLevel.customer];\r\n }\r\n\r\n async getAlerts(): Promise<(INotification | null)[]> {\r\n if (!this.context.getUserContext().CurrentUser.IsInternal && isBillingLinkPermission(this.context.getSettingsContext())) {\r\n return [];\r\n }\r\n\r\n const permissions = this.context.getCurrentPermissions();\r\n const isMMCEnabled = !permissions.IsDomesticSimplifiedChineseEnabled && permissions.IsEnhancedShoppingCampaignAllowed;\r\n const isGMCTokenAlertEnabled = permissions.dynamic.GMCTokenAlert;\r\n if (!isMMCEnabled || !isGMCTokenAlertEnabled) {\r\n return [];\r\n }\r\n\r\n const storeIds = await this.getIssuedStores();\r\n if (!storeIds || storeIds.length === 0) {\r\n return [];\r\n }\r\n\r\n const message = storeIds.length === 1 ? this.i18n.getString(_TL_('Your Google Merchant Center store imports are interrupted. To resume your imports, you’ll need to revalidate your authentication. Navigate to the Import tab in Merchant Center or select Go to Merchant Center Import below, where you’ll be prompted to sign in again.')) :\r\n this.i18n.getString(_TL_('{{number}} of your Google Merchant Center store imports are interrupted. To resume your imports, you’ll need to revalidate your authentication. Navigate to the Import tab in Merchant Center or select Go to Merchant Center Import below, where you’ll be prompted to sign in again.'), { number: storeIds.length });\r\n\r\n // unified queue notification\r\n const notification: INotification = {\r\n id: `GMCTokenExpiredNotification-${storeIds[0]}`,\r\n condition: true,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.session,\r\n severity: NotificationLevel.Warning,\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(_TL_('Revalidate your Google Merchant Center')),\r\n message,\r\n actionList: [{\r\n text: this.i18n.getString(_TL_('Go to Merchant Center Import')),\r\n action: () => {\r\n this.context.route.goMerchantCenterGMCImortPage(storeIds[0]);\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: ['gmc-token-expired-redirect-button'],\r\n }],\r\n };\r\n\r\n // top banner notification\r\n const topBanner: INotification = {\r\n id: 'GMCTokenExpiredNotification-TopBanner',\r\n condition: true,\r\n target: TargetComponent.TopBanner,\r\n dismissMode: DismissMode.never,\r\n severity: NotificationLevel.Error,\r\n scopeLevel: ScopeLevel.root,\r\n availableScopes: this.availableScopes,\r\n title: '',\r\n message: this.i18n.getString(_TL_('Your Google Merchant Center store imports are interrupted. To resume your imports, navigate to the Import tab in Merchant Center to sign in again.')),\r\n actionList: [],\r\n };\r\n\r\n return [notification, topBanner];\r\n }\r\n\r\n async getIssuedStores() {\r\n const { aid, cid, uid } = this.context.getCurrentScope().values;\r\n const url = `/ODataApi/Mmc/v3/Users(${uid})/Customers(${cid})/Accounts(${aid})/Imports/GetGMCTokenExpiredStores?origin=1`;\r\n const response = await odata.get({\r\n url,\r\n oDataToken: this.context.getAuthToken(),\r\n }) as IStores;\r\n\r\n return response && response.ProviderIds ? response.ProviderIds : [];\r\n }\r\n}\r\n","import { INotification, TargetComponent, NotificationLevel, DismissMode, ScopeLevel, IContext } from '../../types';\r\nimport { i18nMap, shouldRender, isAvailable, isBillingLinkPermission } from '../../utils';\r\n\r\nexport class DeprecateSyndicationSearchOnlyNotification {\r\n context: IContext;\r\n i18n: any;\r\n availableScopes: ScopeLevel[];\r\n\r\n constructor(context: IContext) {\r\n this.context = context;\r\n this.i18n = context.getNewI18n();\r\n this.availableScopes = [ScopeLevel.account];\r\n }\r\n\r\n async getDeprecateSyndicationSearchOnlyNotifications() {\r\n if (!this.context.getUserContext().CurrentUser.IsInternal && isBillingLinkPermission(this.context.getSettingsContext())) {\r\n return [];\r\n }\r\n\r\n const {\r\n DeprecateSyndicationSearchOnly,\r\n SyndicationSearchOnlyWhitelist,\r\n } = this.context.getCurrentPermissions().dynamic;\r\n\r\n if (!DeprecateSyndicationSearchOnly || SyndicationSearchOnlyWhitelist) {\r\n return [];\r\n }\r\n\r\n if (!isAvailable(this.context.getCurrentScope(), this.availableScopes)) {\r\n return [];\r\n }\r\n\r\n if (!shouldRender(ScopeLevel.account, this.context.getChangeScope())) {\r\n return [];\r\n }\r\n\r\n const notifications: INotification[] = [];\r\n\r\n notifications.push({\r\n id: 'DeprecateSyndicationSearchOnly',\r\n condition: true,\r\n target: TargetComponent.UnifiedQueue,\r\n dismissMode: DismissMode.permanent,\r\n severity: NotificationLevel.Info,\r\n scopeLevel: ScopeLevel.account,\r\n availableScopes: this.availableScopes,\r\n title: this.i18n.getString(i18nMap.UnifiedNotificationQueue_DeprecateSyndicationSearchOnly_Update_Title),\r\n message: this.i18n.getString(i18nMap.UnifiedNotificationQueue_DeprecateSyndicationSearchOnly_Update_Message),\r\n actionList: [\r\n {\r\n text: this.i18n.getString(_TL_('Learn more')),\r\n action: () => {\r\n window.open('https://help.ads.microsoft.com/#apex/ads/en/60146/0', '_blank');\r\n },\r\n callbackType: 'closeQueue',\r\n extraClassNames: undefined,\r\n extraAttrs: undefined,\r\n },\r\n ],\r\n });\r\n\r\n return notifications;\r\n }\r\n}\r\n","import { PreviewBar as PreviewBarInner } from '@bingads-webui-react/notification-preview-bar';\r\nimport { withLock, keyVault, priorityLevel } from '@bingads-webui-react/popup-manager';\r\n\r\nexport const PreviewBar = withLock(PreviewBarInner, {\r\n lockKey: keyVault.previewBar,\r\n priority: priorityLevel.previewBar,\r\n});\r\n","// @ts-ignore\r\nimport { withI18nConsumer } from '@bingads-webui-react/i18n-context';\r\n// @ts-ignore\r\nimport { withScope } from '@bingads-webui-react/scope-service';\r\n// @ts-ignore\r\nimport { withSettingsConsumer } from '@bingads-webui-react/settings-context';\r\nimport {\r\n withSiteMap,\r\n processor,\r\n allSiteMap,\r\n getRoutePathById,\r\n// @ts-ignore\r\n} from '@bingads-webui-campaign-react/with-site-map';\r\n// @ts-ignore\r\nimport { getUNQIndex, UnifiedNotificationQueueShared } from '@bingads-webui-react/unified-notification-queue';\r\n// @ts-ignore\r\nimport { withUserConsumer } from '@bingads-webui-react/user-context';\r\nimport { withDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { withStateStore } from '@bingads-webui/with-state-store';\r\n// @ts-ignore\r\nimport { withInstrumentation } from '@bingads-webui-react/hoc-with-instrumentation';\r\nimport React from 'react';\r\nimport _ from 'underscore';\r\n\r\nimport { NotificationStore, getStoreInstance } from '../notification-store';\r\nimport { generateUNQViewAllLink } from '../utils';\r\nimport { wrapLogger } from '../utils/logger';\r\nimport { PreviewBar } from '../preview-bar';\r\n\r\ninterface IUNQProps {\r\n store: NotificationStore;\r\n i18n: any;\r\n scope: any;\r\n classes: any;\r\n siteMap: any;\r\n instrumentation: any;\r\n userContext: {\r\n CurrentUser: {\r\n Id: string;\r\n };\r\n CurrentCustomer: {\r\n Id: string;\r\n };\r\n CurrentAccount: any;\r\n };\r\n settingsContext: {\r\n Urls: {\r\n ClientCenterBaseUrl: string;\r\n };\r\n };\r\n ccBaseUrl: string | undefined;\r\n generateUNQViewAllLink: Function | undefined;\r\n getPathBySiteMapId: Function | undefined;\r\n goTargetPage: Function | undefined;\r\n baseHelpUrl: string | undefined;\r\n helpParams: {\r\n project: string | undefined,\r\n language: string | undefined,\r\n asRow: number | undefined,\r\n query: string | undefined,\r\n } | undefined,\r\n notificationFilter: Function | undefined,\r\n showHintMessage: boolean | true,\r\n permissions: object | undefined,\r\n setIsActive: ()=> void | undefined,\r\n forNewGlobalMenu: boolean | undefined,\r\n}\r\n\r\ninterface Config {\r\n withContexts: Function;\r\n}\r\n\r\nclass UnifiedNotificationQueueWrapper extends React.Component {\r\n render() {\r\n const context: any = _.assign({}, this.props.scope.values, {\r\n uid: this.props.userContext.CurrentUser.Id,\r\n });\r\n\r\n const generateUNQViewAllLinkFunc = this.props.generateUNQViewAllLink ||\r\n generateUNQViewAllLink(this.props.userContext, this.props.scope.values);\r\n const getPathBySiteMapId = this.props.getPathBySiteMapId ?\r\n this.props.getPathBySiteMapId :\r\n (siteMapId: string) => getRoutePathById(this.props.siteMap, siteMapId);\r\n const goTargetPage = this.props.goTargetPage ?\r\n this.props.goTargetPage :\r\n (siteMapId: string, search: string, fallbackHref: string) => this.props.store.context.route.goTargetPage(siteMapId, search, fallbackHref);\r\n const baseHelpUrl = this.props.baseHelpUrl !== undefined ?\r\n this.props.baseHelpUrl :\r\n this.props.store.context.getServerContext().HelpModel.BaseHelpUrl;\r\n\r\n // TODO: update the wrapActionForUINext(action, getPathBySiteMapId, goTargetPage) in /private/client-react/packages/unified-notification-queue/src/utils.js\r\n return (\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n// TODO: Move getUNQIndex to UnifiedNotificationQueue component @xiaohui and @xiliu\r\nconst withContexts = (store?: NotificationStore) => _.compose(\r\n withSettingsConsumer,\r\n withUserConsumer,\r\n withScope,\r\n withI18nConsumer,\r\n withInstrumentation,\r\n (Component: any) => withSiteMap(Component, [\r\n processor.processPermissions,\r\n processor.processPath,\r\n ], allSiteMap), // need to use all site map here, since target page might be in other scope\r\n (Component: any) => withStateStore(Component, store || getStoreInstance()),\r\n (Component: any) => withDefaultStyles(Component, getUNQIndex)\r\n);\r\n\r\nexport const getUnifiedNotificationQueue = (store?: NotificationStore, config?: Config) => {\r\n if (config && config.withContexts && _.isFunction(config.withContexts)) {\r\n return config.withContexts(store)(UnifiedNotificationQueueWrapper);\r\n }\r\n\r\n return withContexts(store)(UnifiedNotificationQueueWrapper);\r\n};\r\n","/* istanbul ignore file */\r\nimport _ from 'underscore';\r\n// @ts-ignore\r\nimport { constants } from '@bingads-webui/instrumentation';\r\n\r\n// Only wrapped the essential fields for tracking.\r\nexport const wrapLogger = (instrumentation: any) => (instrumentation && _.isFunction(instrumentation.writeRawLog) ? {\r\n mark: (scenarioName: string) => {\r\n instrumentation.writeRawLog({\r\n logCategory: constants.LOGCATEGORY.PERFORMANCE,\r\n activityName: scenarioName,\r\n entryType: constants.ENTRYTYPE.MESSAGE,\r\n });\r\n },\r\n startProcess: (scenarioName: string) => {\r\n instrumentation.writeRawLog({\r\n logCategory: constants.LOGCATEGORY.PERFORMANCE,\r\n activityName: scenarioName,\r\n isMethodEnter: true,\r\n entryType: constants.ENTRYTYPE.MESSAGE,\r\n });\r\n },\r\n endProcess: (scenarioName: string) => {\r\n instrumentation.writeRawLog({\r\n logCategory: constants.LOGCATEGORY.PERFORMANCE,\r\n activityName: scenarioName,\r\n isMethodEnter: false,\r\n entryType: constants.ENTRYTYPE.MESSAGE,\r\n });\r\n },\r\n trace: (scenarioName: string, message: string) => {\r\n instrumentation.writeRawLog({\r\n logCategory: constants.LOGCATEGORY.TRACE,\r\n api: scenarioName,\r\n message,\r\n entryType: constants.ENTRYTYPE.MESSAGE,\r\n });\r\n },\r\n error: (scenarioName: string, message: string) => {\r\n instrumentation.writeRawLog({\r\n logCategory: constants.LOGCATEGORY.ERROR,\r\n api: scenarioName,\r\n message,\r\n entryType: constants.ENTRYTYPE.MESSAGE,\r\n });\r\n },\r\n} : undefined);\r\n","import _ from 'underscore';\r\nimport React from 'react';\r\nimport { withLock, keyVault } from '@bingads-webui-react/popup-manager';\r\nimport { TargetComponent, INotification } from '../types';\r\nimport { MiniCallout } from '../utils/mini-callout';\r\n\r\ninterface IFloatingBannerWrapperProps {\r\n notification: INotification,\r\n messageClassName: string,\r\n i18n: any,\r\n}\r\n\r\nclass MiniCalloutWrapperInner extends React.PureComponent {\r\n render() {\r\n const { messageClassName, notification, i18n } = this.props;\r\n if (React.isValidElement(notification.message)) {\r\n return (\r\n \r\n { notification.message }\r\n
    \r\n );\r\n }\r\n\r\n let wrappedMsg = ();\r\n\r\n if (notification.extraOptions?.showActionFallbackCallout) {\r\n const doc = (new DOMParser()).parseFromString(notification.message, 'text/html');\r\n wrappedMsg = (\r\n \r\n {_.map(doc.body.childNodes, (node, index) => {\r\n if (node.nodeName.toLowerCase() === 'a' && node.childNodes[0] && node.childNodes[0].parentElement) {\r\n const aTag = node.childNodes[0].parentElement;\r\n return (\r\n \r\n );\r\n }\r\n return node.textContent;\r\n })}\r\n \r\n );\r\n }\r\n\r\n return wrappedMsg;\r\n }\r\n}\r\n\r\nexport const MiniCalloutWrapper = withLock(MiniCalloutWrapperInner, {\r\n lockKey: keyVault.floatingBanner,\r\n force: true,\r\n});\r\n","\r\nimport { getWrappedFloatingBannerContainer } from '@bingads-webui-react/notification-center';\r\nimport { MiniCalloutWrapper } from './mini-callout';\r\n\r\nexport const WrappedFloatingBannerContainer = getWrappedFloatingBannerContainer(MiniCalloutWrapper);\r\n"],"names":["LabelsColumn","_CampaignuiBaseColumn","options","_this","_classCallCheck","title","i18n","getString","isMCCLabelEnabled","permissions","IsAccountLabelsEnabled","_callSuper","name","property","type","helpId","helpAriaLabel","item","headerTemplate","args","_objectSpread","undefined","_inherits","_createClass","key","value","$total","Labels","isAggregateRow","_","labels","_ref","labelsLength","length","labelsCountToShow","labelsToUse","i","label","Description","Name","this","replace","push","labelColor","toHex","ColorCode","contractColor","contrastColor","template","ShowViewMoreLink","TotalLength","IsAggregateRow","CampaignuiBaseColumn","LabelsPopupContentView","_DeterministicView","arguments","_ref$labels","entityType","entityName","_superPropGet","event","currentTarget","attributes","trigger","getAction","action","concat","get","backgroundColor","textColor","tooltip","onAction","onLabelCellItemClicked","DeterministicView","createFilterQuery","containsAll","labelIds","JSON","stringify","$containsall","$containsany","triggerFilter","grid","filterService","filterQuery","setEditableFilter","filterState","newFilter","createFilter","query","setFilter","filterOnLabelClick","gridView","labelId","parseInt","getAttribute","scope","find","l","Id","Scope","navigateToManagePage","router","navigateToRoute","showLabelsPopup","_ref$container","container","$","_ref$groupClass","groupClass","popupOptions","positioningMethod","positioningOptions","threshold","classes","contentView","_$$0$getBoundingClien","target","getBoundingClientRect","top","left","height","width","uiNextVirtualOffset","offset","anchorPosition","showPopup","then","isMCCLevel","values","aid","getCurrentCustomerLabels","edmCampaign","advertiser","cid","getUrlParameter","Customers","$withKey","getEntitySet","edm","currentAccount","selectorLoadAction","RequestError","_Error","message","responseData","_wrapNativeSuper","Error","requestErrorToRejection","result","status","statusText","getIsCombinedScopeRequest","customerLevelLabelEnabled","ids","some","id","parsed","parse","hasCustomerLabel","getLabels","jsdata","itemsDisplayLimit","searchFilter","_ref$ids","cacheService","dataContextManager","params","limit","filterOptions","ignoreCase","where","$contains","endQueries","$or","map","$eq","$and","Promise","resolve","cachedData","getContext","pseudoRequest","url","data","success","cache","skipRequest","isCombinedScopeRequest","loadResult","cacheResponse","bypassCache","headers","currentScopeLabels","Label","findAll","entitySet","customerLabels","load","newData","accountLabels","mccLabels","slice","getLabelsResult","LabelsDataSource","_ref2","viewFilter","stats","lastIds","lastViewFilter","Selector","ViewFilter","selected","checked","indeterminate","_ref3","changed","added","Number","ViewModel","hasData","ko","loaded","hasChanges","LabelsSelectorView","_PureKnockoutView","_ref$dataSource","dataSource","_ref$checkAll","checkAll","_ref$checkMap","checkMap","_ref$i18n","_ref$isForVNext","isForVNext","_ref$customerLevelLab","_ref$useSubMenu","useSubMenu","initializeSelector","model","_this2","selector","checkboxTemplate","busyIndicator","enabled","showAfterMs","showForMs","filter","showSelected","showChanged","styles","searchIcon","ariaLabel","searchBoxAriaLabel","list","listAttributes","role","checkboxColumn","checkboxAttributes","tabindex","nameColumn","templates","getSelectorTemplates","thiss","on","itemsOrPromise","finally","setData","viewModel","selectorViewDeterministic","DeterministicViewForBackBoneView","view","setChild","setCheckMap","rerender","getStats","remove","nameTemplate","labelNameTemplate","PureKnockoutView","CheckState","CheckTransition","statCheckMap","CreateLabelView","s$label","i18nErrors","_instance$schema$keys","instance","schema","keys","customValidators","KoSchema","onCreate","onCancel","errors","add","getODataErrors","validate","dto","toDec","Math","random","toString","create","instrumentation","createActivity","createLabel","initCreateInstrumentationActivity","monitorAsync","azureUrls","isAzureEnv","hostname","protocol","toLowerCase","indexOf","getODataPath","location","getConfig","odataPath","window","eventDispatcher","cardReady","perfMarkerCompleted","unblockCard","perfMarker","done","IsCardInViewPort","isInViewPort","typeId","onCardReady","BaseCard","deps","renderInSync","initPerfMarker","attached","finishedRender","call","blockCard","createChild","willInit","willRender","willFetchData","el","unblock","document","documentElement","contains","withUiBlock","currentCampaign","CampaignSubType","patch","requestingHelp","click","helpers","updateView","callback","windowResizeHandler","wunderbarCallback","addEventListener","removeEventListener","off","TopChangesFilterOption","AllChanges","TopDecliners","TopGainers","Insights","TopChangesFilterSortOptionMap","_defineProperty","AccountsMode","Smart","Expert","ConversionFilterOption","ConversionFilterSortOptionMap","changeEvents","_len","Array","_key","attr","join","formatDate","date","year","getFullYear","month","getMonth","padStart","day","getDate","getFilteredTotalsMetrics","metric","raw","filteredTotals","unfilteredTotals","OverallTotals","DeviceSegmentedPerformanceData","SegmentedData","upperLevelNavigation","navigation","source","coerceStatus","AccountInactiveReasons","activityStatus","AccountUtils","entityHash","hash","typeName","navigationLevel","adGroup","campaign","isSmartCampaign","pageContext","legacyRouter","uid","CurrentUser","CurrentCustomer","CurrentAccount","getRouteUrl","account_id","campaign_id","adgroup_id","getEntityIds","campaignId","adgroupId","accountId","saveToFilterStorage","_ref4","text","createEditableFilterStorage","save","Text","navigateToEntity","_ref5","constants","cardType","logMessage","LOGCATEGORY","TRACE","LOGLEVEL","INFO","button","ctrlKey","shiftKey","altKey","metaKey","campaignType","rawStatus","returnValue","href","getLocalizedSupportLink","culture","Culture","consultationLink","coachingLink","periodDurationIn","dateUtil","_ref6","start","end","max","min","duration","diff","periodFit","period","compared","availableGranularities","accountsMode","_period$comparativePe","comparativePeriod","hourlyStartDate","Date","setMonth","Infinity","getPopDescription","comparisonDateRange","comparisonDateRangeDateRangeText","comparisonText","rangeInDays","formattedStart","formattedEnd","comparisonDateRangeDescription","allMetrics","AppCampaignNewCampaignGridColumns","dynamic","isAppCampaign","isAllCampaigns","applyPartialConversionColumnName","IsAvgPositionDeprecationPhase2Enabled","metricToDisplayNameMap","Clicks","_TL_","Impressions","CTR","AverageCPC","Spend","AveragePosition","TopImpressionRate","AbsoluteTopImpressionRate","Conversions","ConversionRate","CPA","AdvertiserReportedRevenue","RevenueOnAdSpend","Downloads","PostClickDownloadRate","CostPerDownload","FirstLaunches","PostClickFirstLaunchRate","CostPerFirstLaunch","Purchases","PostInstallPurchaseRate","CostPerPurchase","Subscriptions","PostInstallSubscriptionRate","CostPerSubscription","ConversionsCredit","PartialConversionRate","PartialConversionCPA","UIToMTMetricNameMap","metricSelect","isInsightsMetric","UIMetric","getInsightsMetric","allowedMetric","MTMetric","getInsightsMetricFilterOption","defaultMetrics","metrics","getUIMetrics","cardTypeId","shouldExcludeAppMetrics","cardPerformanceId","cardTopCampaignsId","excludedMetrics","m","includes","entitySchemaCopy","getflattenEntitySchema","schemaName","entitySchema","flattenEntitySchema","SearchTerm","addCampaignTypePropertyForFilter","Keyword","Campaign","properties","AvailableInsightTypeIds","baseEntitySchemaForAvailableInsightTypeIds","AdGroup","AssetGroup","getMergedFilter","isFilterByInsights","filters","compact","_ref2$filter","_ref2$filter2","_ref2$filter2$value","updatedQuery","WaterfallFilterType","AdGroupStatus","CampaignStatus","Status","FilterEntity","availableInsightsTypeIdFilter","odata","fieldMap","buildNameToPropertyMapping","custom","lambdaConvertForAvailableInsightTypeIds","mergedFilter","merge","odataOptions","getConversionGoalsFilterStore","preferenceService","FilterStorageFactory","featureName","filterEntityOptions","defaultGridColumns","fetch","dateRange","expand","orderBy","SegmentationTypes","select","extraPayload","selectedMenuItem","disableCache","cacheManager","gridDataParameters","DateRange","StartDate","EndDate","ComparisonDateRange","parameters","$call","toJSON","elementType","shortName","odataV4","$top","$expand","$select","$filter","invalidate","millisecondsInDay","topChangesDefaultOptions","conversionDefaultOptions","getComparisonDateRange","timeRange","getTime","round","lastNDate","gridCardConfig","entityCount","isCompared","columns","metricSelectUnserPermission","segmentationTypes","defaultOptions","orderby","direction","directionIndex","shouldLoadShoppingTerms","isOverviewRequest","getColumnAndOrder","orderByValue","order","column","processGridTileOptions","OverviewPageFluentV2","OverviewPageFluent2","instrumentationLegacy","instrumentationConstants","availableMetrics","selectedColumns","union","uniq","first","fetchGridData","withDFMCache","_ref5$options","getCardsConfig","_getColumnAndOrder","f","fetchEntityGridCombined","dfmCacheKey","getEntityGridOptions","_ref6$typeName","_orderBy","_slicedToArray","_orderBy$","cardConfig","card","columnOrder","sortColumn","sortDirection","processTopChangesMetric","_ref7","getMetricConverter","_ref8","IsColumnConversionEnabled","ColumnConversion","IsPartialConversionsEnabled","PartialConversions","conversionPropertyMap","partialConversionPairs","patchMetric","_ref9","_ref9$permissions","_ref9$accountsMode","converter","patchMetrics","_ref10","_ref10$permissions","_ref10$metrics","_ref10$accountsMode","getTopChangesOptions","_ref11","_ref11$accountsMode","menuItem","selectedMetric","cardId","getConversionOptions","_ref12","allCardConfig","convertTopChangesOptions","_ref13","topChangesOrderBy","_ref13$accountsMode","_ref14","sortOption","getGranularityForConsolidatedCalls","_ref17","_ref17$accountsMode","_availableGranulariti","PerformanceChartGranularity","largerRange","_availableGranulariti3","getTilesFromConfigForConsolidatedCalls","_ref18","tiles","fetchMCCOverview","_ref19","allAccountsOrderBy","AccountsOverviewPrefetchQuery","isPreFetch","_ref19$accountsMode","_getEntityGridOptions","AllAccountsSortColumn","AllAccountsSortDirection","HasGlobalComparisonPeriod","_convertTopChangesOpt","TopChangedAccountsSortOption","TopChangedAccountsSortColumn","Tiles","allMetricsJoined","popMetrics","segmentSelect","tile","multiAccountOverviewParameters","Metrics","FetchFluctuationInsights","callParams","accountModes","UnifiedProductPhase2","PageReady","afterPageReady","postBody","PostBody","serverPreloadParams","serverAccountModes","e","stack","fetchCampaignOverview","_ref20","allCampaignsOrderBy","conversionOrderBy","_getEntityGridOptions2","AllCampaignsSortColumn","AllCampaignsSortDirection","_convertTopChangesOpt2","TopChangedCampaignsSortOption","TopChangedCampaignsSortColumn","_convertOverviewConve","_ref15","_ref16","convertOverviewConversionsOptions","OverviewConversionsSortOption","OverviewConversionsSortColumn","campaignOverviewParameters","fetchCombinedPerformanceTimeSeries","_ref21","fetchSingleTile","performanceTimeSeries","PerformanceTimeSeries","hideCurrency","AccountsHaveDifferentCurrencies","_ref22","_ref22$accountsMode","AllAccounts","AllCampaigns","fetchTopChanges","_ref23","_getTopChangesOptions","TopChangedAccounts","TopChangedCampaigns","popOrderByMetric","fetchAggregatedData","_ref24","isDevice","fetchConversionTracking","_ref25","_getConversionOptions","ConversionTileResult","FAC_FEATUREID","FAC_STATUS_NOT_IN_PROGRESS","CCUIConstants","RecommendationAdoptionStatus","NotInProgess","FAC_STATUS_ACTIVE","Active","p$Coupons","fetchCoupons","ccJsData","state","FeatureAdoptionCoupon","coupons","FeatureId","catch","clearCouponsCache","locationGranularity","country","longitude","latitude","county","stateOrProvince","city","postalCode","mapMetric","mappedMetric","level","Accounts","Campaigns","$makeCall","functionParams","Locale","config","ReportType","count","skip","startDate","endDate","toPromise","fetchCountryData","fetchStateOrProvinceData","fetchCountyData","fetchCityData","fetchPostalCodeData","BoldSyntax","props","_jsx","ReactTemplate","b","children","StringsMapping","GoalCategory","AddToCart","BeginCheckout","BookAppointment","Contact","GetDirections","InStoreVisit","None","Other","OutboundClick","PageView","Purchase","RequestQuote","Signup","Subcribe","SubmitLeadForm","metrici18nKeys","CouponSetup","newI18n","coupon","cost","couponText","useMemo","stepOneText","stepTwo","stepTwoText","_jsxs","React","className","defaultProps","useFetchCoupon","instrumentationLog","renderedWithData","GetJsDataInfo","cidFetcher","uidFetcher","willSupportCors","CCBaseUrl","jsDataCcRest","_pageContext$CurrentA","currencyCode","CurrencyCode","_useState","useState","isDataLoaded","couponLocalized","_useState2","_useState2$","setDataState","fetchDate","useCallback","formatCoupon","currency","response","fetchCouponsMethod","useEffect","EmptyState","requiredPermission","titleString","subtitleString","actionString","_useFetchCoupon","hasCoupons","navigateToConversionGoals","SetUpConversionClicked","renderView","CouponIsShown","NoCoupon","Button","onClick","DefaultButton","PropTypes","i18nKey","GridIncreaseCell","rowClass","space","increaseSpace","bar","increaseBar","classNames","style","flex","GridDeclineCell","declineSpace","declineBar","GridNameCell","GoalCategoryFilterStore","nameCellData","category","isAccount","AccountActivityStatus","Constants","statusIcon","Errors","Deleted","Enabled","GridNameClicked","updateFilterAndRoute","hideToolTip","entity","KpiGrid","currentDate","compareDate","changeString","formattedValue","percentageValue","formattedPercentageValue","metricCurrent","formattedMetrics","metricCompared","formattedPeriodMetrics","GridHoverContainer","isGrid","isIncrease","comparisonStartDate","comparisonEndDate","hoverClassName","KpiColorClassName","GridPopCell","fromTo","GridRow","index","HoverContainer","ConversionTrackingGrid","processedData","metricName","s$i18n","emptyText","renderGridRows","currentRow","ErrorType","ClassName","Title","Message","PopupCallout","content","close","popoverId","right","placement","innerWidth","onMouseLeave","Callout","onClose","show","closeButton","CalloutWithLock","withLock","lockKey","keyVault","hoveringPopup","force","PopupContent","bodyText","_ref$goalNames","goalNames","goalList","marginTop","paddingInlineStart","marginBottom","goalName","textOverflow","overflow","seeAllText","Link","PopupContentNoRevenue","noRevenueText","to","number","TrackingTypeFilterStore","hoverCardStatus","setHoverCardStatus","SeeAllClicked","formattedNumber","titleText","MessageText","errorClassName","ref","useRef","current","onMouseEnter","renderLine","StatusOverview","noConversionGoalsWithRevenue","subtitle","alertText","alertNum","memo","GoalCount","Line","GoalTrackingStatus","GoalNames","ConversionTrackingFooter","pageNumber","setPageNumber","totalPageCount","manageGoalsText","pageCount","ManageConversionsClicked","_Fragment","Tooltip","relationship","icon","ChevronLeftRegular","appearance","disabled","ChevronRightRegular","IconButton","iconProps","iconName","GridMetricPicker","updateMetric","showDropDown","setShowDropDown","_useState3","_useState4","setSelectedMetric","selectedMetricText","selectNewMetric","listItems","handleClickOutside","useOutsideAlerter","dropdownStyles","dropdown","border","boxShadow","outline","selectors","root","callout","caretDown","MetricPicker","handleChange","option","Dropdown","selectedKey","onChange","GridHeader","popDescription","HelpButton","topic","GridPicker","ConversionTrackingState","categoryResults","statusSummaries","updateCurrentMenuItems","processedResults","metricFormatter","PerformanceMetricsChange","ERROR","maxChange","abs","formatMetric","PeriodPerformanceMetrics","Currency","PerformanceMetrics","ceil","i18nString","formatMetricWithSign","formatChangePercentageWithSign","PerformanceMetricsChangePercentage","fromValue","toValue","CampaignType","processGridData","renderContent","SetUpConversionTracking","ManageConversionsClick","ConversionTrackingCard","_React$Component","getMenuItems","currentMenuItems","isDataFetchRequired","prevState","prevDateRange","prevMenuItem","prevMetric","_this$state","isFetchSingleTile","isMenuItemNeeded","defaultMenuItems","preset","triggerChangeMenuItem","fetchTileData","_this$state2","setState","dataLoaded","handleUpdate","triggerChangeMetric","errorType","InstrumentationLog","displayText","prevProps","_this$state$data","ConversionGoalCategoryResults","ConversionGoalTrackingStatusSummaries","NoConversionGoalsExist","NoConversionGoalsWithRevenue","_this$state3","newMetric","layoutSize","getLayoutSize","$el","closest","outerWidth","conversionTileFetch","_ref2$fetchSingleTile","_BaseCard","viewRef","items","_this$getState","getState","sharedOptions","conversionGoalsFilterStore","HelpLink","display","tabIndex","ConversionTrackingCardReact","menuItems","triggerPreferenceChange","getCardPreference","newErrorTypeFilter","TrackingStatus","$in","newCategoryFilter","onResize","relayout","newLayoutSize","currentLayoutSize","addClass","removeClass","ReactDOM","useStyles","makeStyles","cardContent","paddingBottom","smallSizeCard","_ref2$accountsMode","_ref3$fetchSingleTile","ConversionTrackingCardFluent","withDelayedStyles","constructOptions","legacyI18n","perfMarkerUtils","responsiveSize","headerState","useHeaderStateContext","hideRangeColumn","selectedItemValue","setHidden","_ref$palette","palette","Object","assign","getConversionTrackingCardStyle","metricPickerFluentV2Style","DeviceMetricView","ensureChildView","buttonTemplate","metricPickerButtonTemplate","pick","picked","html","getDeviceOrder","XandrVideoCampaigns","isXandrVideoAdsCampaign","getGraphLayoutSize","reLayoutGraph","currentGraphLayoutSize","isAggregatedMetric","reLayout","currentMetrics","child","String","SingleMetric","metricsWhenPick","_this$deps","actionButton","focus","segmentedPerformanceMetrics","performanceMetrics","formatOption","deviceType","segmentedData","Key","StringValue","Data","segmentedPeriodData","segmentedChangePercentageData","periodData","periodPerformanceMetrics","changePercentageData","performanceMetricsChangePercentage","formattedData","formattedPeriodData","flexValue","formattedSegment","formattedHoverValue","percentage","formatPercent","maximumFractionDigits","minimumFractionDigits","periodValue","periodFlexValue","formattedPeriodSegment","formattedPeriodHoverValue","changePercentage","formattedChangePercentage","formattedChange","formattedDateRange","formattedPeriodDateRange","render","loadData","_this$getState2","_this$deps2","hasError","removed","dataFetched","renderTrunk","navigateToDevicesSetting","setting","DeviceCard","_this3","_ref8$fetchSingleTile","_ref8$preexecuteFlag","preexecuteFlag","selectedMetrics","patchedMetrics","loadDataFunc","listenTo","hidePopup","bind","$target","_this4","willRenderWithData","_this5","_this$deps3","isSmartShoppingCampaign","newState","formatCell","metricColumnTemplate","body","performanceMetricTemplate","sup","sub","showExtra","sortableMapping","titleMapping","Account","columnHeaderMapping","sortableAttribute","metricColumn","bingadsGridColumn","_ref$PerformanceMetri","_ref$PerformanceMetri2","_ref$PerformanceMetri3","metricColumnProperty","sortable","colClasses","bodyClasses","headClasses","performanceMetricHeaderTemplate","isExperiment","MatchType","DeliveredMatchType","Added","SearchTermStatus","ExperimentId","nameText","keywordText","matchingKeyword","searchTermStatus","metricColumns","removeDropdown","onClickDocument","evt","hoverContent","$viewport","scrollTop","css","updatePopupPosition","getAllColumns","allMetricColumns","_toConsumableArray","refetch","refresh","updateGridBody","sortableHeader","newSortableHeader","updateGridColumn","onGridSortableHeaderChange","changes","newDirection","newOderByColumn","newDirectionIndex","_this$getState3","CombinedCallEntity","getParentState","_this$getParentState","GridDataEntity","_this$getParentState2","DummyDataSource","totalCount","GridCardContent","parent","tileOptions","initialState","gridFactory","pgrid","vnext","use","a11yPlugin","placeholderPlugin","performanceLogPlugin","tableClasses","tableAttributes","plugins","a11y","performanceLog","appConfig","logger","placeholder","viewRoot","placeholderTemplate","templateOptions","events","stopPropagation","preventDefault","$metricPicker","currentMetric","dataset","isDropdownOpenfortheColumn","currentColumns","metricPickerTemplate","default","dropdownMenuTemplate","col","stateColumns","append","scrolling","virtualized","header","tableName","setupScrollBarCover","headerOption","firstRow","once","keyCode","Escape","viewport","viewportWidth","tableWidth","scrollBarWidth","scrollBarHeight","coverTemplate","marginRight","prepend","_this$child$getState","navigate","accountLevelRout","campaignLevelRout","accountMode","navigateToMainGrid","getSearchTermDetail","$link","adGroupId","campaignName","adGroupName","matchType","setupMenuItems","onMenuAction","GridCard","buttonText","isCustomerLevel","_ref2$preexecuteFlag","adjustedMenuItem","Content","addKeywordView","updatePosition","addAsKeyword","addAsNegativeKeyword","AddKeywordView","gridCard","reloadGrid","_this6","CampaignAdgroupSelectorVnext","_DeterministicWrapper","selectedCampaign","selectedAdGroup","jsData","campaignAdgroupSelector","createCampaignAdGroupSelector","parentView","DeterministicWrapperView","setPosition","position","scrollLeft","updateSelectorPosition","$selector","$pageContainer","_$selector$offset","_$selector$offsetPare","offsetParent","parentTop","parentLeft","_$pageContainer$offse","pageContainerTop","pageContainerLeft","pageContainerHeight","pageContainerWidth","selectorSize","selectionLevel","clearError","errMsg","setupSelectorView","getChild","detachChild","campaignSelected","newCampaign","_this$getState4$level","adgroupSelected","newAdGroup","windowClickHandler","windowScrollHandler","scroll","errorHandler","getBulkApiErrors","_this$getState5","isEmpty","appendLearnMoreLink","hideOnClickOutSide","scopeContext","scopeService","getScope","negativeKeyword","NegativeKeywords","EntityType","CampaignId","AdGroupId","campaignEntity","AdGroups","NegativeKeyword","onSuccess","onError","keywordData","Keywords","Bid","update","adapter","val","cancel","apply","toggleSelector","updateEntityLevel","keywordTextChange","matchTypeChange","MetricToolTip","TooltipHost","Glyphicon","glyph","MetricToolTipBackBoneView","_Backbone$View","Backbone","_ref$template","defaultTemplate","_ref$buttonTemplate","defaultButtonTemplate","_ref$buttonTemplatePa","buttonTemplateParams","_ref$dropdownMenuTemp","defaultDropdownMenuTemplate","leftAlign","classList","toggleEl","SetUpContentForGlobalA11yAnnounceArea","_this$getState$perfor","performanceMetric","_this$getState$metric","metricValue","addInfo","tooltipView","a11yAnnounceArea","querySelector","textContent","setTimeout","overviewPanel","dashboardConfig","getDefaultConfig","defaultName","defaultDragAndDrop","defaultDebug","defaultDragHandlerSelector","layoutOptions","small","breakpoint","minCardSize","maxCardSize","defaultHeight","medium","large","toolbar","addCardButton","textKey","getWelcomeConfig","AddCardViewModel","allAvailableCards","selectedCards","updateFocusedIndex","getFirstFocusableIndex","cards","firstSelectedIndex","appliedClass","cssKey","firstFocusedIndex","allCards","cardsToAdd","pluck","difference","cardsToDelete","intersection","selectedTilesNumber","c","onThumbnailClicked","onKeyPress","Space","onFocus","globalLegacyI18n","saveAddCard","idsToAdd","idsToDelete","cancelAddCard","getNextFocusedItemIndex","numOfCards","previousIndex","isNext","maxIndex","getAllAvailableCardElements","onKeyDown","allAvailableCardElements","ArrowDown","focusedIndex","ArrowUp","Home","End","AddCardView","_ref$selectedCards","_ref$newCardsConfig","newCardsConfig","cardsConfig","conf","isValidForNavigationLevel","useNewI18n","addCardTitle","addCardTitleKey","desc","descKey","templateVNext","hide","welcomeCardConfig","validFor","titleKey","contentType","sizeOption","supportedWidth","getContentConstructor","contentConstructor","CampaignLevelCampaignType","AccountLevelCampaignType","CardState","_Backbone$Model","preferences","instrumentationSettings","welcomeCardsConfig","_ref$accountsMode","_ref$isPrefetch","isPrefetch","customerIdType","useAdvertiserCustomerId","set","p$Initialized","initialize","fetchDashboardId","quickInstrumentation","getQuickInstrumentation","Hotel","PerformanceMax","App","prefs","getDashBoardPreferences","dashboardId","userWelcomePref","findByNameAtUserLevel","doneWithWelcomeTips","doNotShowWelcomeTips","showWelcomeTips","WelcomeStatus","doneInitialLoad","ShowWelcomeTips","createdCampaign","HasCampaigns","skippedBothAtAccountCreation","skippedNoneAtAccountCreation","HasBIData","HasOtherAccounts","loadWelcomeTips","welcomeAttr","newOptions","setAtUserLevel","loadDashBoardCards","cardGroup","getCardCategory","availableCards","defaultIn","savePreference","defaultOut","retiredCards","hidden","newDefaultInCards","newDefaultOutCards","newCardConfig","newCards","defaultCards","loadDashboardState","hiddenCards","preference","setDashBoardPreferences","attribute","cardPref","findByNameAtAccountLevel","setAtAccountLevel","dashboardPrefName","accountsDashboardPrefName","userWelcomePrefName","OverviewAsDefaultPrefName","newDefaultOutCardsAvailable","DateFilterState","_ref$simpleFormat","simpleFormat","previousRange","views","Summary","bindDateFilterChangeHandler","dateRangeEquals","getPromise","newRange","leftOffsetUINext","leftOffsetMccUINext","dashboardTopUINext","cardMargin","subPageMarginsForUINext","newUIWidthPaddingsAndOffSet","getViewportCardCount","isMccLevel","topOffset","leftOffset","subPageMargins","availableWidth","layoutOption","optionKey","initialRowCount","innerHeight","rowSize","remainingRowCount","currentRowRemainingSpace","cardSize","ex","i18nMappings","CardHolder_Toolbar_Close","CardHolder_Toolbar_Add","CardHolder_Toolbar_Refresh","CardHolder_Toolbar_Hide","CardHolder_Toolbar_Help","CardHolder_Toolbar_Enlarge","CardHolder_Toolbar_Shrink","CardHolder_Toolbar_SmallSize","CardHolder_Toolbar_MediumSize","CardHolder_Toolbar_LargeSize","CardHolder_Toolbar_Toggle","Loading","i18nGlobal","localInstrumentation","saveSelectedCardsState","orders","cardPanel","cardsOrder","cardMaps","cardState","contentReady","remainingViewportCards","ViewportCardCount","viewportCardsCount","pageIsReady","pageName","createCardContentInstance","otherOptions","cardCreationOptions","cardOptions","currentCard","clearDragAndDrop","setupDragAndDrop","scrollToAddCardView","addCardView","y","animate","showAddCardView","_ref$fromTile","fromTile","panelDecorator","AddCardPanel","panelClassName","panelReadyAriaLabel","closeAddCardPanel","eventsToActions","addCard","deleteCard","setUpAgents","dateFilterState","dateFilter","onDateFilterStateChanged","filterAgent","onFilterStateChanged","updateCardContent","_ref5$fetchSingleTile","_ref5$onMounted","onMounted","_this$cardState$getCa","getCardAttrByTypeId","getContentContainer","azure","azureUrlRewrite","savedStates","updateContent","Dashboard","_ref7$preexecuteFlag","buildLegacyI18n","p$CardState","dispatched","showNewTile","hideNewTileBannerClicked","gotoManagementTab","dispatchStateAsync","_this7","dispatchState","states","updateState","toolbarItems","ToolbarView","toolbarId","iconLeft","_this8","cardAttrsArray","_this8$cardState$getC","preDefinedMenuItems","CardPanel","dragAndDrop","debug","dragHandlerSelector","initialWidth","extend","showMenuIcon","silent","wunderbarState","setupFooter","originalOrder","newOrder","hideNewTileBanner","typeIds","loadCardsOutSizeViewPort","dismissOverviewFluctuationPopup","dismissPopupIfExist","getElementsByClassName","updatePreDefinedMenuItems","windowScrollLayout","topChangeCardScrollLayout","parentNode","windowEventHandler","_this9","cardAttrs","_this9$cardState$getC","cardIds","_this10","delete","newFeatureTemplate","newTileDesc","title1Key","title2Key","newTileMsg","newTileBannerTemplate","newTileId","timeZoneId","footerContainer","accountTimeZoneText","footerTemplate","_this11","currentCustomer","res","showTooMuchDataError","error","Code","warningContainer","managementLink","linkContent","warning","tooManyAccountTemplate","_this12","setupToolbar","setupCardPanel","p$ReadyState","p$State","spread","saveInitialState","setupNewTileNotice","setupTooManyAccountsWarning","_this13","scrollIntoView","behavior","DashboardPage","_ref$onMounted","_ref$preexecuteFlag","createDashboard","dashboard","isRemoved","recreateView","localScenarioMap","LoadOverviewPage","scenario","SCENARIONAME","activity","ACTIVITYNAME","QualifiedVisitOverviewPageFromCampaign","SetOverviewPageAsDefault","AddTileToOverview","AddTileToOverviewFromPanel","RemoveTileFromOverview","ReorderTile","ResizeTile","FirstUse","RemoveRetiredTilesFromOverview","AddNewTilesToOverview","OverviewPageLoadData","msgs","startScenario","startActivity","msg","tipNames","importHelp","importVideo","broadMatchVideo","extaVideo","extaHelp1","extaHelp2","sitelinksMktg","sitelinksHelp","calloutsMktg","calloutsHelp","structSnipHelp","structSnipMktg","dsa","conversionTrackingVideo","remarketingTour","remarketingHelp1","remarketingVideo","remarketingHelp2","autoBidHelp","autoBidMktg","sharedBudgetsHelp","callMktg","callHelp","reviewsMktg","reviewsHelp","kWMatchTypeHelp","kWMatchTypeMktg","negKWHelp1","negKWHelp2","broadMatchHelp","ScheduledImportHelp","ReImportRSACampaigns","IncludeRSACampaigns","IncludeMultiAccountGoogleImport","ProvideStoreToImportShoppingCampaign","SelectAdCusFeedToImportEXTA","FacebookImport","UETCombineClarity","tipsConfig","tipName","description","helpLink","helpType","imgClass","isImportRelatedTip","_getEntityIds","fluctuationTypeIds","TopChangeGrid","showFluctuationPopup","triggerButton","nextSibling","_ref4$fluxtypeids","fluxtypeids","metricname","metrictext","cmid","selectedAccount","CurrentCampaign","pageContextWithMetricRowInfo","context","createElementBasedFluctuationPopupFactory","imagePath","token","Token","canViewAllInsights","asyncLoadFluctuationConfig","fromScenario","onFlucDismiss","isLastFluc","getParent","dismissLastFluctuation","onDismiss","gridData","currentDateRangeText","comparisonDateRangeText","topChangesGridTemplate","getItems","loadErrorMsg","updateData","popText","popTextAriaLabel","dataError","updateMetricPicker","metricPickerChild","navigateToEntityGrid","bottom","gridWidth","TopChangesCard","_ref$fetchSingleTile","_ref$dismissLastFluct","patchedMetric","metricProcessed","initialMetric","_this3$deps","updateDataFunc","schedule","invalidShoppingCampaignSubTypes","IsPersonalizedOffersV3Enabled","subtype","isShowCoupon","isPersonalizedOfferAvailable","campaignSubType","shouldSupportCashbackSettings","isCashbackPercentEmpty","getParentLevelCashbackScope","getParentLevelCashbackPercent","currentAdGroup","adGroupCashbackPercent","campaignCashbackPercent","getParentLevelCoupon","getCashbackInheritOptions","cashbackInheritInfo","inheritCashbackPercent","CashbackPercent","readonly","viewContext","inheritValue","isCashbackPercentValid","decimal","isValid","fromLocalToFloat","getCashbackPercentValidationError","allowEmptyCashbackPercent","validationError","isValidNumber","getRealCashbackPercentValue","shouldPersonalizedOffersReadOnly","isAfterSave","biddingStrategyView","getValues","Type","getBidStrategyByCampaignTypeWhenPersonalizedOffersEnabled","_ref6$campaignType","Permissions","selectedBidStrategy","targetBidStrategy","bidStrategyOptions","isSearchCampaign","commonBidStrategy","Value","costPerSaleBidStrategy","IsCostPerSaleEnabled","logCampaignPersonalizedOffers","shouldLog","log","campaignCashback","CouponsEnabled","PersonalizedOffersEnabled","logAdGroupPersonalizedOffers","adgroup","adgroupCashback","setBidStrategyForPersonalizedOffers","isEnabled","setPersonalizedOffersOptionsAndValue","setupCommonCashbackObserver","setBidStrategy","cashbackSettingsView","isEnablePersonalizedOffersChecked","subscribe","maxRowsBeforeShowOverallTotalsOnTop","getRawConfig","_ref$showSearchRow","showSearchRow","_ref$showAudienceRow","showAudienceRow","_ref$showNativeRow","showNativeRow","_ref$showDeletedRow","showDeletedRow","_ref$showPmaxRow","showPmaxRow","_ref$showLinkedInRow","showLinkedInRow","dataKey","ignore","IsAIMCampaignEnabled","IsNativeAdsAllowed","IsNativeAdsRebrandingEnabled","PerformanceMaxCampaigns","PerformanceMaxCampaignsPhaseTwoCrossNetwork","getTotalRow","rawData","cookRawConfig","helpIds","cfg","helpIdKey","formatDecimalToInteger","aggregatedRowsPluginBuilder","customConfig","_ref3$processBuilderC","processBuilderConfig","_ref3$processPluginCo","processPluginConfig","rawConfig","getUIFilters","getCombinedFilter","getDataSourceFilter","combinedFilter","dataSourceFilter","hasOnlyDataSourceFilters","depth","isEmptyFilter","showWaterFallFilterTotal","qFilter","getQuickFilter","aggregatedRowsPlugin","getRows","topConfig","appendToHeader","cookedConfig","visit","node","graph","permVisited","tempVisited","sortedList","dep","unshift","getOrderToInitializePlugin","nameToDepsMap","notVisited","pop","topoSort","generateDepGraph","pgridFactory","_ref3$plugins","gridConfig","preferenceConfig","_generatePluginNameMa","nameToPluginRefMap","softDependenciesMap","plugin","softDependencies","softDependency","generatePluginNameMaps","customDepsMap","sortedOrder","factory","pluginName","addPluginConfigToGridConfig","version","isInitialGridDataLoad","isPageReadyFulfilled","definePlugin","_ref3$scrolling","_ref3$scrolling2$virt","track","_plugins$performanceL","_ref2$logNavTiming","logNavTiming","timeStarted","performance","now","activeTimeBeforeStarted","NaN","logConsoleStamp","isSuccess","timeFetched","activeTimeBeforeFetched","timeRendered","activeTimeBeforeRendered","landingPageUrl","api","Version","GridName","IsPageReadyFulfilled","IsVirtualized","TotalRows","countRows","TotalServerSideRows","totalCountRows","TotalVisibleRows","TotalColumns","last","DataFetchStartTime","DataFetchStartActiveTime","DataFetchingTime","DataFetchingActiveTime","GridRenderingTime","GridRenderingActiveTime","PageNavStartTime","timing","navigationStart","PageFetchStartTime","fetchStart","LandingPageUrl","logPerformanceInfo","perfMarkerPlugin","_ref2$scrolling","_ref2$scrolling2$virt","_plugins$perfMarker","marker","gridMarker","pgridMarker","isDone","parentMarker","_ref$logNavTiming","isPortfolioBidStrategyEnabled","isBroadOnlyEnabled","isPredictiveMatchingEnabled","IsAvgPositionDeprecationPhase1Enabled","showExperiment","IsExperimentsEnabled","KeywordStatusColumn","KeywordColumn","CampaignColumn","AdGroupColumn","BidStrategyNameColumn","BidStrategyTypeColumn","BidColumn","MatchTypeColumn","DeliveryColumn","QualityScoreColumn","LandingPageColumn","CustomParametersColumn","TrackingTemplateColumn","FinalUrlSuffixColumn","Param1Column","Param2Column","Param3Column","FirstPageBidEstimationColumn","MainlineBidEstimationColumn","BestPositionBidEstimationColumn","KeywordIdColumn","getLockedColumns","getSelectedColumns","RSAAdCustomizerAttributesColumn","getColumnsMap","gridName","baseColumns","baseRawBIColumns","generateBaseBIColumns","getListOfRawBIColumns","mockI18n","enum","enumMappedString","enumDescription","valueDescription","i18nCache","legacyGlobalI18n","schemaI18nCampaign","getFilterConfig","cachedEntitySchema","restParams","_objectWithoutProperties","_excluded","filterConfig","getCommonFilterConfig","editor","searchbox","searchProperty","searchOperator","maxLength","globalConfig","enableCampaignWaterfall","enableEditorialRejectionFilter","enableAdGroupWaterfall","removable","defaultValue","editorialRejectionFlagId","EditorialRejectionFlagId","localized","getLocalizedEditorialRejectionReasons","CurrentTabId","refreshCampaignCache","isOdataActionSource","getDataSourceConfig","gridNameSource","logActivity","_Permissions$dynamic","KeywordsCombineGridAndChartOdataCallEnabled","initialQuery","nullifynotapplybidamounts","getGridDataParams","scopeAdapter","customerId","unset","edmEntity","existingDataSource","KeywordsFilterImprovementEnabled","primaryKey","useDfmCache","DataSourceStore","sessionStore","customColumnPreference","preferenceStoreFactory","FilterService","queryBuilder","decorators","columnsMap","defaultColumns","lockedColumns","addPoPColumnsOnComparisonEnabled","customColumnsEnabled","IsCustomColumnsInCampaignsSupported","comparisonPoPColumns","defaultPageSize","pageState","chartDataAdapter","ChartDataAdapter","inlineChartPreference","InlineChartPreferences","store","legacyPreferenceService","commonConfig","appState","ColumnChooserPreference","CustomColumnPreference","SegmentationPreference","fetchPaginationConfig","fetchSortInfo","columnConversions","getColumnsConversionMap","getDataSource","dataFetchConfig","QueryBuilderFactory","make","queryErrors","QueryErrorFactory","connect","cacheableObjects","PreferencesSubadapter","_ref$Resource","Resource","_ref$prefix","prefix","_ref$serialize","serialize","_ref$deserialize","deserialize","attrs","findByPrefix","thenReturn","del","safeGetString","TextView","texts","_ref$customClass","customClass","customColumnOperations","updateFilterSchemaForCustomColumns","customColumnData","op","_filterService","columnFormat","expression","customColumnId","performanceMetricsCustomColumnId","popCustomColumnId","popCustomColumnChangeId","popCustomColumnChangePercentId","idList","filterable","format","isPercentValue","nullable","originalProperty","required","isInvalidProperty","isValidForFeature","tempEntitySchema","appendPeriodOverPeriodProperties","propertyId","tempObject","cleanUpCustomColumnFilter","columnId","editableFilter","getEditableFilter","removeQueryByColumnId","filterToSet","removeAllQueriesInEditableFilter","getSavedFilters","savedFilters","deleteSavedFilter","FilterStorageType","EditableFilter","SelectableFilter","updateAppliedFilter","addUpdateSavedFilter","removeAllQueriesInSavedFilter","dropdownId","saveListId","ColumnChooserAgent","recordRemoveEventName","recordSaveEventName","recordChangeEventName","selectColumnsChangedEventName","names","columnChooserPlugin","applyColumnConversions","columnChooserAgent","columnChooser","customColumnPanel","customColumnService","entitySchemaName","columnChooserEditablePicker","_ref$dynamic","pluginConfig","_$result","_$result$columns","_$result$customColumn","customColumnConfig","debugMode","categories","_$result$mandatoryPro","mandatoryProperties","_$result$locked","locked","_$result$patchQuery","patchQuery","Columns","SelectedColumns","LegacyColumns","LegacySelectedColumns","CustomColumns","AdCustomizerAttribute","resource","LegacyGridFlag","nameFromLegacy","legacyGridName","customToolbarIcon","isHotelCenterGrid","columnProcessorBeforeSetRecord","RSAAdCustomizerAttributeColumn","enableRSAAdCustomizer","normalizeConfig","isCustomColumnEnabled","toolbarEditor","gridToolbarGroup","toolbarWithItem","project","adCustomizerAttributeColumns","_buildColumnConversio","buildColumnConversions","setSelectedColumns","customColumns","getAll","columnInfo","customColumnGridKeyFromId","CustomColumn","IsRSAAdCustomizerEnabled","gridType","validNames","isDataFetchManagerSource","reduce","prototype","patchCustomColumns","selectedCustomColumnNames","startsWith","ODATA_PREFIX","queryParams","existingGridDataParameters","updateGridConfig","customerHierarchyExtras","columnNames","elTable","$table","$parent","parentElement","detach","appendTo","triggerSelectedColumnsChangedEvent","initializePop","initializeUpdateFilterForCustomColumn","dynamicCustomColumnsSetup","resolveSetup","CustomColumnBackboneWrapper","CustomColumnServiceWrapper","getCustomColumnPreferenceName","updateCustomColumnPreferenceStore","removedColumns","editedColumns","addedColumns","IsCustomColumnFilterSupported","editedColumn","addedColumn","err","openCustomColumnPanel","resolvePanel","rejectPanel","initialName","initialDescription","initialColumnFormat","initialExpression","p$columnDetail","isEdit","parseIdFromGridKey","getCustomColumnDetailFromMT","detail","notificationApi","showWarning","removeCustomColumnByKey","open","metricCategories","segmentCategories","afterSave","formData","optionListViewFactory","categoryName","ColumnChooserEditablePicker","isReadOnlyUser","IsReadOnlyUser","p$removeColumn","split","filtered","p$editColumn","p$createColumn","getSelection","getSelectedRecord","setSelectedRecord","selection","refreshMenu","getRecord","setRecord","_columns","p$setRecord","record","unavailableSavedColumns","triggerRecordSavedEvent","applyRecord","promises","IsAvgPositionDeprecationPhase3Enabled","hasTopImpressionRate","hasAbsoluteTopImpressionRate","tap","triggerSelectedRecordChangedEvent","customColumnResponseKey","customColumnErrors","CustomColumnErrors","showFilterBar","columnsToExclude","ErrorCode","columnsToInvalidate","excluded","deletedProperties","invalidProperties","legacyQuery","legacyDataProcesser","legacySelected","legacyRecords","legacyRecord","creation","destroyColumnChooser","createColumnChooser","ColumnChooser","withColumnsChangeAnnouncement","restoreToolbar","showAllToolbars","overrideWith","showColumnChooser","hideAllToolbars","savedName","dialog","Dialog","backdrop","keyboard","showHeader","setContent","buttons","class","p$canSaveColumns","canSave","selectedKeys","applyColumns","iconLeftGlyphName","iconRight","menu","removeText","onSelect","onRemove","destroy","triggerRecordRemovedEvent","removeRecord","legacyGridFlagQuery","flags","flag","flagInfo","isColumnChooserMigrated","$orderby","returnResult","Datatype","dataTypeI18nKey","formatDateInQuery","kendo","formatDateInEntitySet","parseDate","dateString","defaultComparisonColumns","changeEntitySet","identifyEntitySet","RangeStartDate","RangeEndDate","dateFilterPlugin","currentDateRange","addDateChangeListener","_pluginConfig$compari","comparisonColumns","_pluginConfig$p$dater","p$daterange","originalQuery","setFullYear","defaultDateRange","grain","rest","dateRangeCopy","changeEntitySetFn","addDateRangeToQueryParams","newDateRange","getCurrentDateRange","p$getCurrentDateRange","inlineDownloadGenericPlugin","segment","_config$plugins$inlin","inlineDownload","DownloadView","_config$plugins$inlin2","_config$plugins$inlin3","gridId","_config$plugins$inlin4","cusToolbarItem","_config$plugins$inlin5","disableOnEmpty","_config$plugins$inlin6","disableOnTooMuchData","downloadFormats","isFeedbackEnabled","isAvailable","downloadView","showDownloadView","ReportRule","getAvailableSegmentationTypes","totalRecordCount","getItemCount","validateSegmentType","createDownloadView","segmentationType","getSegmentType","isTooMuchDataInGrid","succeeded","getAvailability","setAvailability","isAvailableNew","getDownloadView","setFilterByReportEmailRule","ReportEmailRule","_permissions$dynamic","Filter","getGridFilter","Entity","Selection","originalPromise","inlineDownloadCampaignODataPlugin","dependencies","customGridColumns","processReportRule","customDownloadService","rawSelection","customFilterQueryParams","CampaignODataDownloadView","_DownloadView","localizedHeaders","odataColumnNames","currentFilter","getGridColumnsProperties","gridColumns","_$map","getDefault","columnConfig","_$map2","filterString","encodeURIComponent","filterUrlParam","filterCustomQueryParams","additionalFilterUrlParams","URI","serializedFilter","returns","createSimilarReportEmailRule","Rule","setReportEmailRule","withoutSegment","dependency","buildReplacement","newDeps","objDeps","splice","without","inlineDownloadWithoutFilterstatePlugin","inlineDownloadWithoutSegmentPlugin","inlineDownloadWithoutFilterstateAndSegmentPlugin","updateAssociation","selectionInfo","LabelAssociationView","disableDeselectAll","isManagementRequest","_action","associationView","updateSelectedEntityCount","selectedRowCount","pgridPlugins","createLabelSelectorView","_getCheckMap","selectedItems","selectedRowIds","selectedItem","labelsCount","rowItem","isShortCycle","transition","indeterminateToCheckedShortCycle","indeterminateToCheckedFullCycle","getCheckMap","allPages","labelSelectorView","cycleStatusClass","createView","decorate","popupFront","closeButtonAriaLabel","results","setErrors","focusLockInstanceDecorator","focusFirstItemOnMount","managed","labelsPlugin","pagination","crossPageSelectAll","_$result$isForVNext","_$result$disableDesel","_$result$isManagement","appCfg","$dropdownContainer","labelSelectorPerfMarker","labelDropdownId","getEntityName","resourceName","getSelectionInfo","info","isAllSelected","x","showSelector","oldSelector","isAccountLabelsEnabled","unbindDropdownContainerClick","updateToolbar","shouldBeDisabled","AccountType","updateToolbarConfig","setupLabelMenu","biPattern","phoneBiPattern","biReplacePattern","biSubColPrefix","getPoPCols","popTitles","prop","propertyKey","parentProperty","isColumnWithFluc","test","columnWithFlucTemplate","cellTemplate","formatMetricValue","_column$subColumns","subColumns","parentTemplate","parentColumn","primaryName","primary","headAttributes","bodyAttributes","compareName","compare","ComparedWidth","changeTitle","changeName","change","ChangeWidth","changePercentTitle","changePercentName","PopSubColWidth","ChangePercentageWidth","formatted","updateSubCols","columnsCur","expandedCols","handler","isComparing","Boolean","expanded","formatedStart","formatedEnd","getPopTitles","popStatus","defaults","biSubColPattern","groupHandler","popColumnsCur","popColumns","sortableHeaderCur","appendChild","isPoPColumn","popHeader","headRows","row","isPopHeaderRow","patchRow","cells","cell","patchCell","columnGroup","columnIndex","popHeaderTemplate","columnName","periodOverPeriodPlugin","pipeStructureProjections","pipeContentProjections","popColumnsConfig","appendSegmentFlag","IsSegmentRow","segmentConfig","segArray","from","_ref$expandedAggregat","expandedAggregate","isBiColumn","bodyRows","r","segs","toSeg","rowType","segsInRow","AggregateName","obj","HasSegmentRow","toggleAggregateSeg","segmentCur","expandedAggregateCur","segmentCellStyleConfig","begin","leafColumns","colIndex","cellTemplates","newHtml","isAggregate","hasSegment","isTopAggregate","localizeSegmentationValue","SegmentationType","SegmentValue","translateSegRow","View","segType","changeQueryParams","updateSource","curQuery","segmentPlugin","menuId","setSegType","_pluginConfig$timeRan","timeRangeValidationEnabled","getSegType","currentScenario","_pluginConfig$segment","campaignSegmentationTypeEnum","segmentMenu","logTrace","trace","isTimeRangeValid","segAlertView","segmentAlert","dialogOptions","titleHeadingLevel","maxWidth","center","dialogConfirmButton","menuButton","applySegment","getSegmentMenu","getMenuItem","seg","itemConfig","localizeSegmentationType","itemClasses","Time","Audience","Goal","getSupportedSegmentationTree","childMenuItems","childItem","isChild","menuItemWithChildren","segmentCellStyle","curSegType","resetMenu","segTypeInit","isSegmentationTypeSupported","setSegmentType","segmentType","overrideSegmentationTypes","setter","pug","module","exports","locals","pug_interp","pug_html","locals_for_with","customHelpContent","escape","pug_mixins","color","block","$$obj","pug_index0","$$l","entityTypeLocalized","entityTypeFormatted","cssClass","checkState","ariaCheckedStatus","isSearchTerm","nameCell","AccountInactiveCauseValue","kpiData","dateRangeText","columnClass","metricIndex","barClass","kpiClasses","increase","keywordType","linkType","menuClass","linkText","cls","popupId","classIcon","miniCalloutStyle","topBannerContentStyle","calloutTargetContainer","cursor","flexShrink","calloutCloseButton","padding","minWidth","background","maxHeight","minHeight","popover","zIndex","actionButtonStyle","innerText","fontSize","innerTextInLink","textDecoration","openIcon","openIconInLink","paddingLeft","lineHeight","fontWeight","NotificationEntityType","unstyleCalloutContent","ContentMessage","LinkMessage","link","handleClose","btnStyle","CalloutContent","withI18nConsumer","withDefaultStyles","fontFamily","whiteSpace","textAlign","unstyleMiniCallout","constructor","super","handleCalloutClose","showCallout","handleClick","which","bannerType","TargetComponent","TopBanner","popoverClassName","focusLockContent","MiniCallout","notificationTopBanner","actionLink","bindedHandleClick","logHandlers","Map","innerTexts","isPureAlink","removeClickEvents","renderedEls","elsToRemove","forEach","bindClickEvent","element","AElements","getElementsByTagName","AElement","has","notificationId","componentDidMount","componentDidUpdate","componentWillUnmount","linkTarget","doc","DOMParser","parseFromString","aElements","openInNewWindow","dangerouslySetInnerHTML","__html","innerHTML","aTags","aTag","removeChild","setAttribute","outerHTML","aElement","MiniCalloutWrapper","withInstrumentation","getTopBannerLayout","getTopBannerLayoutWithStore","i18nMap","Alert_Account_suspended","LearnMore","UnifiedNotificationQueue_DownForMaintenance_New_Title","UnifiedNotificationQueue_DownForMaintenance_New_Message","UnifiedNotificationQueue_Alert_AdBlockWarning_Title","UnifiedNotificationQueue_Alert_AdBlockWarning_Message","UnifiedNotificationQueue_Alert_IncompatibleBrowsers_Title","UnifiedNotificationQueue_Alert_IncompatibleBrowsers_Message","UnifiedNotificationQueue_Alert_DisapprovedEntityMessageTemplate_New_Title","UnifiedNotificationQueue_Alert_DisapprovedAdResource_New_Title","UnifiedNotificationQueue_Alert_DisapprovedEntityMessageTemplate_New_Plural_Title","UnifiedNotificationQueue_Alert_DisapprovedSmartCampaignAd_Title","UnifiedNotificationQueue_Alert_DisapprovedSmartListing_Title","UnifiedNotificationQueue_Alert_DisapprovedSmartListingV2_Title","UnifiedNotificationQueue_Alert_OneDisapprovedEntityMessageTemplate_New_Message","UnifiedNotificationQueue_Alert_OneDisapprovedAdresource_New_Message","UnifiedNotificationQueue_Alert_TwoDisapprovedEntityMessageTemplate_New_Message","UnifiedNotificationQueue_Alert_DisapprovedSmartCampaignAd_Message","UnifiedNotificationQueue_Alert_DisapprovedSmartListing_Message","UnifiedNotificationQueue_Alert_DisapprovedSmartListingV2_Message","UnifiedNotificationQueue_Action_ReviewAds","UnifiedNotificationQueue_Action_ReviewKeywords","UnifiedNotificationQueue_Action_ReviewAdsOrKeywords","UnifiedNotificationQueue_Action_AutoTaggingLink","UnifiedNotificationQueue_LastImportFailedInfoText_New_Title","UnifiedNotificationQueue_LastImportFailedInfoText_New_Message","UnifiedNotificationQueue_Action_SeeErrorDetails","UnifiedNotificationQueue_PendingImportInfoText_Title","UnifiedNotificationQueue_PendingImportInfoText_Message","UnifiedNotificationQueue_Action_RestartTheImport","Alert_NoEligible_Campaign","Alert_NoEligible_AdGroup","Alert_NoEligible_Ad","Alert_NoEligible_Keyword","Alert_DisapprovedAds","Alert_DisapprovedKeywords","Alert_DisapprovedSmartListing","Alert_DisapprovedSmartListing_V2","Alert_Uet_EnableAutoTagging_Title","Alert_Uet_EnableAutoTagging","Notification_Action_View","Notification_Action_Apply","Notifications","ViewAll","DismissAll","EmptyText","WhatsNew","WhatsNewCheckOut","ViewMore","Dismiss","Warning","Critical","Opportunity","Information","HintMessage","CalloutLink","CalloutMessage","ClosePreviewBar","ClosePanel","UnifiedNotificationQueue_Google_ImportTaskTokenExpirationInfoText_Title","UnifiedNotificationQueue_Google_ImportTaskTokenExpirationInfoText_Singular_Message","UnifiedNotificationQueue_Google_ImportTaskTokenExpirationInfoText_Plural_Message","UnifiedNotificationQueue_Facebook_ImportTaskTokenExpirationInfoText_Title","UnifiedNotificationQueue_Facebook_ImportTaskTokenExpirationInfoText_Singular_Message","UnifiedNotificationQueue_Facebook_ImportTaskTokenExpirationInfoText_Plural_Message","UnifiedNotificationQueue_Google_ImportTaskTokenInvalidInfoText_Title","UnifiedNotificationQueue_Google_ImportTaskTokenInvalidInfoText_Singular_Message","UnifiedNotificationQueue_Google_ImportTaskTokenInvalidInfoText_Plural_Message","UnifiedNotificationQueue_Facebook_ImportTaskTokenInvalidInfoText_Title","UnifiedNotificationQueue_Facebook_ImportTaskTokenInvalidInfoText_Singular_Message","UnifiedNotificationQueue_Facebook_ImportTaskTokenInvalidInfoText_Plural_Message","UnifiedNotificationQueue_PmaxImportRecommendation_Fail_InfoText_Title","UnifiedNotificationQueue_PmaxImportRecommendation_Fail_InfoText_Message","UnifiedNotificationQueue_PmaxImportRecommendation_SignIn_And_Trigger_Runnow_Import_Success_Message","UnifiedNotificationQueue_PmaxImportRecommendation_Complete_InfoText_Title","UnifiedNotificationQueue_PmaxImportRecommendation_Complete_InfoText_Message","UnifiedNotificationQueue_PmaxImportRecommendation_CompleteWithoutPmax_InfoText_Title","UnifiedNotificationQueue_PmaxImportRecommendation_CompleteWithoutPmax_InfoText_Message","UnifiedNotificationQueue_Action_GoToImportSchedulePage","UnifiedNotificationQueue_Action_ViewPerformanceMaxCampaigns","UnifiedNotificationQueue_Action_ViewCampaigns","UnifiedNotificationQueue_Action_SignInToGoogleAds","UnifiedNotificationQueue_DraftStoreSetupInfoText_Title","UnifiedNotificationQueue_DraftStoreSetupInfoText_Message","UnifiedNotificationQueue_Pmax_CampaignUpgrade_Title","UnifiedNotificationQueue_Pmax_CampaignUpgrade_Message","UnifiedNotificationQueue_Location_Intent_Update_Title","UnifiedNotificationQueue_Location_Intent_Update_Message","UnifiedNotificationQueue_DeprecateSyndicationSearchOnly_Update_Title","UnifiedNotificationQueue_DeprecateSyndicationSearchOnly_Update_Message","getFilterStorePreferences","filterStore","findByName","getStorageKey","async","resetCampaignFiltersAndRedirect","campaignFilterType","waterfallFilterStore","WaterfallFilterStorage","getWaterfallFilterStore","campaignFilterStore","getCampaignFilterStore","waterfallFilterPreferences","waterfallFilterStorages","campaignFilterPreferences","permanentFilterStorage","All","campaignFilterQuery","getCampaignFilterQuery","onMultipleRemoteSyncDone","shouldRender","changeLevel","currentScope","availableScopes","isCustomerScope","ScopeLevel","customer","SmartCampaignPathPrefix","isSmartCampaignPath","path","isBillingLinkPermission","settingsContext","Route","getImportScheduleWithImportTypePath","importType","getPathById","getImportScheduleWithImportTypeSearch","goImportSchedule","goPath","goImportScheduleWithImportType","targetUrl","navigateByUrl","goGoogleImport","getMetaImportWithImportSrcPath","importsrc","getMetaImportWithImportSrcSearch","goMetaimportWithImportSrc","goMetaImport","goDisapprovedAds","search","getDisapprovedSearch","goDisapprovedAdResource","goDisapprovedKeywords","goMerchantCenterDraftStores","getRouteLocation","getCurrentScope","pathname","match","goMerchantCenterGMCImortPage","storeId","goTargetPage","siteMapId","fallbackHref","goAllSmartCampaigns","goAllCampaigns","getPreferenceService","alias","disapproveStr","importTypeStr","urlSearchParams","URLSearchParams","siteMap","getSiteMap","getRoutePathById","searchOri","history","getRouteHistory","currentPath","shouldNavigateCrossSite","is","origin","getScopeWithHash","currentEntity","getEntityFromScope","Context","StateStore","route","lastScope","cloneScope","scopeChangeLevel","isCompatibleBrowser","onScopeChange","isShouldRefresh","calcScopeChangeLevel","account","getNewI18n","getAuthToken","authToken","getChangeScope","getScopeObject","getCurrentPermissions","getServerContext","serverContext","getUserContext","userContext","getEdmCampaign","getSettingsContext","isVersionRefreshed","newVersion","isAdBlockOn","NotificationDataSource","getNotifications","fetchCampaignNotificationStatus","notifications","notificationArrPromise","reason","console","notificationArr","all","NotificationDismissStore","dimissNotification","putIntoDismissStorage","buildDismissKey","shouldShowNotification","isInDimissStorage","isKeyInDismissStorage","SessionStorageNotificationDismissStore","sessionStorage","getItem","setItem","PermanentNotificationDismissStore","localStorage","NotificationStore","bannerNotificationList","nQNotificationList","floatingBannerNotification","floatingBannerId","sessionDismissStore","permanenetDimissStore","notificationFilter","override","getNotificationDataSource","campaignNotifications","filterDismissedNotifications","notification","buildDimissAction","groupNotifications","mergeToLeft","leftList","rightList","rightMap","resultList","scopeLevel","newNotification","notificationList","UnifiedQueue","FloatingBanner","condition","dismissNQAll","dismissAction","dismissMode","DismissMode","session","deleteNotificationFromList","originDismissAction","permanent","never","n","addnQNotifications","filteredNotifications","severity","NotificationLevel","Info","Confirmation","setFloatingBannerNotification","extraOptions","dismiss","newId","getStoreInstance","DraftStoreNotification","getDraftStoreNotifications","MockTopBanner","IsInternal","draftStoreNotification","hasAnyDraftStoreNotifications","actionList","callbackType","extraClassNames","extraAttrs","smallToken","hasPlaceHolderStores","HasPlaceholderStores","getAlertFlags","DisapprovedEntities","getDisapprovedEntityNotifications","permission","IsGoogleImportVideoAdsEnabled","IsGoogleImportVideoAdsImprovementEnabled","SmartNewNotification","alertFlags","hasDisapprovedAds","getNoneSmartDisapprovedAdsCount","hasDisapprovedKeywords","getRejectedKeywordsCount","hasDisapprovedSmartAds","getRejectedSmartCampaignAdsCount","hasDisapprovedSmartListing","RejectedSmartListingsCount","hasDisapprovedAdResource","RejectedAdResourceCount","getDisapprovedBothKeywordsAndAdsNotification","getDisapprovedAdsNotification","getDisapprovedKeywordsNotification","getDisapprovedSmartCampaignAdsNotification","getDisapprovedSmartListingNotification","getDisapprovedAdResourceNotification","navigateToDisapprovedKeywords","navigateToDisapprovedAds","navigateToDisapprovedAdResource","navigateToAllSmartCampaigns","getRejectedAdsCount","RejectedAdsCountV2","RejectedKeywordsCountV2","RejectedSmartCampaignAdsCountV2","numberOfDisapprovedAds","numberOfDisapprovedKeywords","note","disapprovedAds","disapprovedKeywords","disapprovedEntity","numberOfDisapprovedEntities","ImportStatusEnum","ImportTypeEnum","ImportStatus","getImportStatusNotifications","getImportStatus","hasLastImportFailed","isLastImportIn5Days","getLastImportFailedNotification","isImportPending","getImportPendingNotification","getImportStatusWithIdUrl","queryParameters","importId","oDataToken","redirectToImportCampaignSchedule","isImportStatusValid","ImportId","CurrentImportStatus","StatusFailed","hasLastImportBeenCancelled","StatusCancelled","isImportCompleted","StatusComplete","LastModifiedTime","GOOGLE_IMPORT_TYPE","FACEBOOK_IMPORT_TYPE","ImportNotification","getImportNotifications","IsPmaxImportRecommendationNotificationEnabled","IsImportAutoMinimumBidEnabled","TokenInvalidImportNotification","ImportNotificationForRemoveMinimumBid","MetaImportUpsellNotification","importNotifications","hasAnyTokenExpiratioinNotifications","tokenExpirationNotifications","extractNotifications","GoogleAPIImport","getGoogleTokenExpirationNotification","getFacebookTokenExpirationNotification","hasAnyTokenInvalidNotifications","tokenInvalidNotifications","getGoogleTokenInvalidNotification","getFacebookTokenInvalidNotification","hasAnyPmaxImportRecommendationNotifications","pmaxImportRecommendationNotifications","PMaxImportRecommendation","Failed","getPMaxImportRecommendationFailNotification","Tasks","Completed","getPMaxImportRecommendationCompleteNotification","CompletedWithoutPMax","getPMaxImportRecommendationCompletedWithoutPmaxNotification","getImportAutoMinimumBidNotification","getMetaImportUpsellNotification","form","redirectToImportCampaignScheduleWithImportType","tasks","task","TaskId","username","GoogleUserEmail","signInToGoogleAdsAndTriggerRunnowImport","taskId","redirectToPerformanceMaxCampaigns","redirectToAllCampaigns","startdate","toLocaleDateString","redirectToMetaImportWithImportSrc","getRedirectLinkToImportCampaignScheduleWithImportType","getSuccessMsg","logMsg","newTaskItem","redirectLink","afterSignInCallback","sessionId","prepareTaskItemBody","importNotificationResult","TokenExpiration","Expired","Expiring","TokenInvalid","Invalid","notificationType","allTokenExipationList","ImportType","Count","NoEntityNotifications","getNoEligibleEntityNotifications","trimScopeToAccount","scopes","HasNotPausedCampaigns","hasNotEligibleCampaign","HasAdGroups","HasNotPausedAdGroups","hasNotEligibleAdGroup","HasAds","HasNotPausedAds","hasNotEligibleAd","HasActiveNonDefaultCampaigns","HasKeywords","HasNotPausedKeywords","hasNotEligibleKeyword","generateErrorNotification","PredefinedNotifications","getPredefinedAlerts","accountSuspendedAlert","getAccountSuspendedAlert","adBlockAlert","getAdBlockAlert","pmaxImportNotification","getPerfMaxImportInfoNotification","pmaxNonRetailExpansionNotification","getPMaxRetailToNonRetailExpansionNotification","isExternalUserBillingLinkPermission","getFixAudienceCampaignImportedAsSearchCampaignNotification","getGoogleImportImageAdForScheduledImportAccountsNotification","getMmaV2LaunchNotification","getAdoptAudienceShoppingCampaignNotification","getManualCpcDeprecationNotification","getVersionRefreshedAlert","getMaintainanceAlert","getIncompatibleBrowserAlert","getWebInsightsNotification","getGAConversionAttributionNotification","getMSANAutoBiddingInfoNotification","getSmartCropOfflineProcessingNotification","getMSANChurnNotifications","getImpressionReportingNotification","getMSANALogoAndCTAGANotification","AccountMode","getEntityFunctionObject","hasSmartShoppingCampaign","learnMore","edmHolder","AdvertiserCustomerID","Tags","tagResponse","payload","acc","tag","IsWebInsightsEnabled","rootURLPath","RootUIUrl","checkImportLogsUrl","messageLink","learnMoreLink","messageType","scenarioNames","logContent","rel","NotificationCard","phase","commonNotificationSetting","churnNotifications","allowedNotifications","calcScopeLevel","suspendedAccountStatus","AccountLifecycleStatus","Suspended","accountScope","UETNotifications","getUETNotifications","HasMsClickIdTaggingEnabled","HasGoals","mockTopBannerResponse","alertType","NotificationId","NotificationMessage","ActionTriggered","notificationLevelMapping","danger","CCNotifications","getUrl","Urls","ClientCenterBaseUrl","getCCNotifications","ccNotificaitons","fetchCCNotifications","transformCCNotifications","aidPart","mktPart","mkt","xhrFields","withCredentials","buildDismissCCNotification","no","timeout","bannerNot","unqNot","PmaxCampaignUpgradeNotification","getEligibleCampaignNum","fetchCampaignUpgradeData","upgradeCampaignsToPMax","upgradeCampaignsToPMaxCall","getPmaxCampaignUpgradeNotifications","PerformanceMaxCampaignsPhaseTwoCampaignUpgradeToolNotification","pmaxCampaignUpgradeNotification","hasAnyPmaxCampaignUpgradeNotifications","ParentId","EntityId","onUpgradeApiError","onGenericError","upgradeFailure","dialogProps","dialogTitle","dialogText","dialogConfirm","dialogCancel","dialogAction","removeNotification","updatedCampaigns","upgradeSuccess","clearCache","eligibleUpgradeCampaigns","HasPmaxCampaignUpgrade","LocationIntentUpdateNotifications","getLocationIntentUpdateNotifications","LocationIntentUpdateNotification","HotelCenterMigrationNotification","getHotelCenterMigrationNotifications","isHotelCenterEnabled","DynamicPermissions","HotelAds","isHotelCenterRemovalEnabled","HotelCenterRemoval","replaceMap","br","guideLinkPrefix","guideLinkSuffix","helpLinkPrefix","helpLinkSuffix","blogLinkPrefix","blogLinkSuffix","finalMessage","replaceAll","HotelCenterMigrationPhase2Notification","getHotelCenterMigrationPhase2Notifications","currentPermissions","HotelCenterMigrationPhase3Notification","getHotelCenterMigrationPhase3Notifications","br2","lodgingCampaignPrefix","lodgingCampaignSuffix","BroadOnlyNotification","getBroadOnlyNotifications","Approved","GMCTokenExpiredNotification","getAlerts","isMMCEnabled","IsDomesticSimplifiedChineseEnabled","IsEnhancedShoppingCampaignAllowed","isGMCTokenAlertEnabled","GMCTokenAlert","storeIds","getIssuedStores","ProviderIds","DeprecateSyndicationSearchOnlyNotification","getDeprecateSyndicationSearchOnlyNotifications","DeprecateSyndicationSearchOnly","SyndicationSearchOnlyWhitelist","PreviewBar","previewBar","priority","priorityLevel","UnifiedNotificationQueueWrapper","generateUNQViewAllLinkFunc","generateUNQViewAllLink","scopeValues","preFilter","AccountNumber","Field","Operator","Values","getPathBySiteMapId","baseHelpUrl","HelpModel","BaseHelpUrl","UNQIndex","alignItems","UnifiedNotificationQueueShared","shouldShowPreviewBar","ccBaseUrl","generateViewAllLink","isUINext","notificationStore","writeRawLog","mark","scenarioName","logCategory","PERFORMANCE","activityName","entryType","ENTRYTYPE","MESSAGE","startProcess","isMethodEnter","endProcess","helpParams","MTNotificationFilter","showHintMessage","setIsActive","forNewGlobalMenu","getUnifiedNotificationQueue","withContexts","withSettingsConsumer","withUserConsumer","withScope","Component","withSiteMap","processor","processPermissions","processPath","allSiteMap","withStateStore","getUNQIndex","MiniCalloutWrapperInner","messageClassName","wrappedMsg","showActionFallbackCallout","childNodes","nodeName","floatingBanner","WrappedFloatingBannerContainer","getWrappedFloatingBannerContainer"],"sourceRoot":""}