{"version":3,"file":"static/js/application.initial~45bf5e0f.691af923.js","mappings":"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","sources":["../../../node_modules/@bingads-webui-campaign/filter-converter/src/index.js","../../../node_modules/@bingads-webui-campaign/filter-storage/src/session-filter-storage.js","../../../node_modules/@bingads-webui-campaign/filter-storage/src/legacy-quick-filter-storage.js","../../../node_modules/@bingads-webui-campaign/filter-storage/src/deserializer.js","../../../node_modules/@bingads-webui-campaign/filter-storage/src/task-queue-mixin.js","../../../node_modules/@bingads-webui-campaign/filter-storage/src/editable-filter-storage.js","../../../node_modules/@bingads-webui-campaign/filter-storage/src/permanent-filter-storage.js","../../../node_modules/@bingads-webui-campaign/filter-storage/src/editable-filter-permanent-storage.js","../../../node_modules/@bingads-webui-campaign/filter-storage/src/saved-filter-storage.js","../../../node_modules/@bingads-webui-campaign/filter-storage/src/recent-filter-storage.js","../../../node_modules/@bingads-webui-campaign/filter-storage/src/quick-filter-storage.js","../../../node_modules/@bingads-webui-campaign/filter-storage/src/quick-filter-permanent-storage.js","../../../node_modules/@bingads-webui-campaign/filter-storage/src/waterfall-filter-permanent-storage.js","../../../node_modules/@bingads-webui-campaign/filter-storage/src/filter-session-storage.js","../../../node_modules/@bingads-webui-campaign/filter-storage/src/quick-filter-session-storage.js","../../../node_modules/@bingads-webui-campaign/filter-storage/src/filter-storage-factory.js","../../../node_modules/@bingads-webui-campaign/filter-storage/src/waterfall-filter-storage.js","../../../node_modules/@bingads-webui-campaign/fluctuation-common/src/metric-counter.js","../../../node_modules/@bingads-webui-campaign/fluctuation-common/src/description-container.js","../../../node_modules/@bingads-webui-campaign/fluctuation-common/src/constants.js","../../../node_modules/@bingads-webui-campaign/fluctuation-common/src/components/callout.js","../../../node_modules/@bingads-webui-campaign/fluctuation-common/src/components/fluctuation-action-button.js","../../../node_modules/@bingads-webui-campaign/fluctuation-common/src/utils.js","../../../node_modules/@bingads-webui-campaign/fluctuation-common/src/components/insight-action-forms.js","../../../node_modules/@bingads-webui-campaign/fluctuation-common/src/insight-action.js","../../../node_modules/@bingads-webui-campaign/fluctuation-service/src/index.js","../../../node_modules/@bingads-webui-campaign/fluent-page-consts/src/card-ids.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/preference/preference-helper.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/preference/card-preference/performance-table.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/preference/use-selected-cards-with-preference.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/preference/card-preference/performance-chart.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/preference/card-preference/top-changes.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/preference/card-preference/devices.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/cards-configs/fluent-card-configs.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/helper/get-navigation-level.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/helper/get-cc-jsdata.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/helper/get-responsive-size.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/data-fetch/recommendation-card.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/data-fetch/grid-data.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/data-fetch-manager/fluent-page-data-fetch-manager.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/data-fetch/conversion-tracking.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/preference/card-preference/top-locations.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/preference/card-preference/conversion-tracking.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/preference/card-preference/recommendations.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/pmax-campaign-page-preference/pmax-single-campaign-overview-preference.js","../../../node_modules/@bingads-webui-campaign/fluent-page-data/src/pmax-campaign-page-preference/use-is-preference-initialized.js"],"sourcesContent":["import _ from 'underscore';\r\nimport { convertEnumValuetoLegacy, convertEnumValuetoLegacyString } from '@bingads-webui/filter-entity';\r\n\r\nconst EnumPropertyToTypeMapping = {\r\n AudienceStatus: ['AdGroupCriterionStatus'],\r\n BidTarget: ['BidTargetType'],\r\n BidType: ['BidType'],\r\n CampaignType: ['CampaignType'],\r\n CallTrackingStatus: ['AdGroupCallTrackingStatus'],\r\n DeliveryStatus: ['DeliveryStatus'],\r\n DevicePreference: ['DevicePreference'],\r\n DisplayBiddingStrategyType: ['BiddingStrategyType'],\r\n Language: ['Language'],\r\n Medium: ['Medium'],\r\n Status: ['CampaignStatus', 'AdGroupStatus', 'AudienceStatus', 'AdStatus'],\r\n Type: ['AdType'],\r\n MatchType: ['MatchType'],\r\n AvailableInsightTypeIds: ['FluctuationType'],\r\n AdGroupType: ['SearchStandard', 'SearchDynamic', null],\r\n CampaignCashbackScope: ['None', 'Store', 'Product'],\r\n AdGroupCashbackScope: ['None', 'Store', 'Product'],\r\n Coupon: ['None', 'Enabled', 'Disabled'],\r\n};\r\nconst EnumPropertyToStringTypeMapping = [\r\n 'AudienceType',\r\n];\r\n\r\nfunction toLegacyEnum(value, property) {\r\n const types = EnumPropertyToTypeMapping[property];\r\n let legacyValue = null;\r\n\r\n if (_.size(types) > 0) {\r\n legacyValue = convertEnumValuetoLegacy(value);\r\n\r\n if (legacyValue) {\r\n return legacyValue;\r\n }\r\n }\r\n\r\n if (_.contains(EnumPropertyToStringTypeMapping, property)) {\r\n legacyValue = convertEnumValuetoLegacyString(value);\r\n }\r\n\r\n return legacyValue;\r\n}\r\n\r\nfunction toLegacyOperator(op, col, schema) {\r\n let ret = op || '$eq';\r\n\r\n switch (ret) {\r\n case '$contains':\r\n ret = 'Contains';\r\n break;\r\n case '$doesnotcontain':\r\n ret = 'DoesNotContain';\r\n break;\r\n case '$startswith':\r\n ret = 'BeginsWith';\r\n break;\r\n case '$endswith':\r\n ret = 'EndsWith';\r\n break;\r\n case '$eq':\r\n ret = 'Equal';\r\n break;\r\n case '$neq':\r\n ret = 'NotEqual';\r\n break;\r\n case '$gt':\r\n ret = 'Greater';\r\n break;\r\n case '$gte':\r\n ret = 'GreaterOrEqual';\r\n break;\r\n case '$lt':\r\n ret = 'Less';\r\n break;\r\n case '$lte':\r\n ret = 'LessOrEqual';\r\n break;\r\n case '$in':\r\n if (_.isEmpty(schema.properties[col].enum) &&\r\n _.isEmpty(schema.properties[col].groupedItems)) {\r\n ret = 'Equal';\r\n } else {\r\n ret = 'EnumSelection';\r\n }\r\n break;\r\n case '$containsall':\r\n ret = 'ContainsAll';\r\n break;\r\n case '$containsany':\r\n ret = 'ContainsAny';\r\n break;\r\n case '$containsnone':\r\n ret = 'ContainsNone';\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n return ret;\r\n}\r\n\r\nfunction toLegacyColumn(col, filterSchema) {\r\n return filterSchema ? filterSchema.toAlias(col, 'legacy') : col;\r\n}\r\n\r\nfunction toLegacyValue(values, col, schema, i18n) {\r\n if (schema.properties[col]) {\r\n if (!_.isEmpty(schema.properties[col].enum) ||\r\n !_.isEmpty(schema.properties[col].groupedItems)) {\r\n return _.map(values, value => toLegacyEnum(value, col));\r\n } else if (schema.properties[col].type === 'boolean') {\r\n return _.map(values, value => (value === true ? 1 : 0));\r\n } else if (schema.properties[col].type === 'datetime') {\r\n return _.map(values, value => (i18n.formatDate(value, { raw: 'MM/dd/yyyy' })));\r\n }\r\n }\r\n\r\n return values;\r\n}\r\n\r\n/**\r\n * Converting filterEntity to Legacy filter\r\n *\r\n * @param {Object} filterentity - an instance of FilterEntity from @webui/filter-entity\r\n * @param {Object} i18n - the localization settings with formatDate support\r\n * @param {Object} i18n.formatDate - format Date time\r\n * @returns {Object} legacy filter in format of {SelectedColumn, SelectedOperator, Values}\r\n */\r\nexport function fromFilterEntityToLegacyFilter(filterentity, i18n) {\r\n const translateToLegacyFormat = function (query) {\r\n const condition = _.pairs(query)[0][1];\r\n const operator = _.pairs(condition)[0][0];\r\n let value = _.pairs(condition)[0][1];\r\n\r\n if (!_.isArray(value)) {\r\n value = [value];\r\n }\r\n\r\n return {\r\n SelectedColumn: _.pairs(query)[0][0],\r\n SelectedOperator: operator,\r\n Values: value,\r\n };\r\n };\r\n\r\n let schema;\r\n let legacyFormats;\r\n\r\n\r\n if (filterentity && filterentity.query && !_.isEmpty(filterentity.query)) {\r\n schema = filterentity.options ?\r\n filterentity.options.entitySchema :\r\n filterentity.schema.entitySchema;\r\n\r\n if (filterentity.query.$and && filterentity.query.$and.length > 0) {\r\n legacyFormats = _.map(filterentity.query.$and, query => translateToLegacyFormat(query));\r\n } else {\r\n legacyFormats = [translateToLegacyFormat(filterentity.query)];\r\n }\r\n }\r\n\r\n if (!_.isArray(legacyFormats)) {\r\n return null;\r\n }\r\n\r\n return _.map(legacyFormats, (legacyFormat) => {\r\n const col = legacyFormat.SelectedColumn;\r\n\r\n return {\r\n SelectedColumn: toLegacyColumn(col, filterentity.schema),\r\n SelectedOperator: toLegacyOperator(legacyFormat.SelectedOperator, col, schema),\r\n Values: toLegacyValue(legacyFormat.Values, col, schema, i18n),\r\n };\r\n });\r\n}\r\n","export class SessionFilterStorage {\r\n /**\r\n * Session storage that is configured to save filter object\r\n */\r\n constructor({\r\n featureName = '',\r\n filterEntityOptions = {},\r\n sessionStore,\r\n resourceId,\r\n entryId,\r\n } = {}) {\r\n if (!sessionStore) {\r\n throw new Error('No session store is provided');\r\n }\r\n this.featureName = featureName;\r\n\r\n if (resourceId) {\r\n this.resourceId = resourceId;\r\n } else {\r\n this.resourceId = this.getSessionStorageId({\r\n featureName,\r\n entityName: filterEntityOptions.entitySchema.name,\r\n }).resourceId;\r\n }\r\n\r\n if (entryId) {\r\n this.entryId = entryId;\r\n } else {\r\n this.entryId = this.getSessionStorageId({\r\n featureName,\r\n entityName: filterEntityOptions.entitySchema.name,\r\n }).entryId;\r\n }\r\n\r\n if (!sessionStore.definitions[this.resourceId]) {\r\n sessionStore.defineResource(this.resourceId);\r\n }\r\n\r\n this.storage = sessionStore.definitions[this.resourceId];\r\n }\r\n\r\n getSessionStorageId() {\r\n throw new Error('Not implemented');\r\n }\r\n\r\n save() {\r\n throw new Error('Not implemented');\r\n }\r\n\r\n get() {\r\n throw new Error('Not implemented');\r\n }\r\n\r\n clean() {\r\n return this.storage.destroy(this.entryId);\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport { SessionFilterStorage } from './session-filter-storage';\r\n\r\n// todo: this logic should really be in summary-tab. will make a query generating\r\n// interface and have the storage users pass in their own version of it.\r\nfunction mapFeatureNameToEnum(featureName) {\r\n switch (featureName) {\r\n case 'summary_tab_campaign':\r\n return 'Enum.CampaignStatus';\r\n case 'summary_tab_adgroup':\r\n return 'Enum.AdGroupStatus';\r\n default:\r\n return '';\r\n }\r\n}\r\n\r\nfunction mapFeatureNameToStatusKey(featureName) {\r\n switch (featureName) {\r\n case 'summary_tab_campaign':\r\n return 'Campaign/Status';\r\n case 'summary_tab_adgroup':\r\n return 'AdGroup/Status';\r\n default:\r\n return '';\r\n }\r\n}\r\n\r\nfunction mapFeatureNameToQuery(featureName) {\r\n switch (featureName) {\r\n case 'summary_tab_campaign':\r\n return {\r\n [mapFeatureNameToStatusKey(featureName)]: {\r\n $in: [\r\n `${mapFeatureNameToEnum(featureName)}'Active'`,\r\n `${mapFeatureNameToEnum(featureName)}'BudgetPaused'`,\r\n ],\r\n },\r\n };\r\n case 'summary_tab_adgroup':\r\n return {\r\n [mapFeatureNameToStatusKey(featureName)]: {\r\n $in: [\r\n `${mapFeatureNameToEnum(featureName)}'Active'`,\r\n `${mapFeatureNameToEnum(featureName)}'CampaignBudgetPaused'`,\r\n ],\r\n },\r\n };\r\n default:\r\n return {};\r\n }\r\n}\r\n\r\nexport class LegacyQuickFilterStorage extends SessionFilterStorage {\r\n constructor(options) {\r\n if (options.newCampaignsGridFilterEnabled) {\r\n super(_.extend({}, options, {\r\n resourceId: 'quick-filter-storage-campaignwebui-CampaignsGrid',\r\n entryId: 'Campaign/QuickFilter',\r\n }));\r\n } else {\r\n super(options);\r\n }\r\n }\r\n\r\n getSessionStorageId({\r\n featureName,\r\n }) {\r\n switch (featureName) {\r\n // quick filter saved using the new session filter storage\r\n case 'summary_tab_adgroup':\r\n return {\r\n resourceId: 'quick-filter-storage-campaignwebui-AdgroupGrid',\r\n entryId: 'AdGroup/QuickFilter',\r\n };\r\n default:\r\n return {\r\n resourceId: 'quick-filter-storage',\r\n entryId: `AdsApps(CampaignUI)/Grids(${featureName})/QuickFilter`,\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Get legacy quick filter object\r\n * @return {Object} - Quick filter object that contains\r\n * key and query\r\n */\r\n get() {\r\n // TODO: based on the scenario entity, decide if we want to also\r\n // get the waterfall filter.\r\n return this.storage.find(this.entryId)\r\n .then((filterEntity) => {\r\n let key = '';\r\n if (_.isUndefined(filterEntity.filter)) {\r\n key = filterEntity.selectedKey;\r\n } else {\r\n ({ key } = filterEntity.filter);\r\n }\r\n let query = null;\r\n\r\n if (key === 'active') {\r\n query = mapFeatureNameToQuery(this.featureName);\r\n }\r\n\r\n return {\r\n filter: {\r\n key,\r\n value: {\r\n query,\r\n },\r\n },\r\n };\r\n })\r\n .catch(() => null);\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport { FilterSchema, flattenEntitySchema } from '@bingads-webui/filter-schema';\r\n\r\nconst DEPRECATED_PROPERTIES = [\r\n 'PhonePerformanceMetricsPhoneSpend',\r\n 'PhonePerformanceMetricsClickCalls',\r\n 'PhonePerformanceMetricsAverageCPP',\r\n 'PhoneSpend',\r\n 'ClickCalls',\r\n 'AverageCPP',\r\n];\r\n\r\nconst isExpressionDeprecated = () => expression => _.some(\r\n DEPRECATED_PROPERTIES,\r\n deprecatedColumn => _.has(expression, deprecatedColumn)\r\n);\r\n\r\nconst applyConversionsToMongoPredicate = filterSchema =>\r\n mongoPredicate => filterSchema.applyConversions(mongoPredicate);\r\n\r\n/**\r\n * When saving values into session, they got converted to string\r\n * This class is to deserialize the string value based on the value type\r\n * upon reading the value\r\n */\r\nexport class Deserializer {\r\n constructor(options = {\r\n parseIdAsInt: true,\r\n }) {\r\n const processedSchema = flattenEntitySchema(options.filterEntityOptions.entitySchema);\r\n this.filterSchema = new FilterSchema(processedSchema);\r\n this.parseIdAsInt = options.parseIdAsInt;\r\n }\r\n\r\n deserialize(filter) {\r\n const expressions = this.convert(filter.query ? filter.query : filter);\r\n\r\n let logicalOperator = null;\r\n\r\n if (filter.query) {\r\n if (filter.query.$or) {\r\n logicalOperator = '$or';\r\n } else if (filter.query.$and) {\r\n logicalOperator = '$and';\r\n }\r\n }\r\n\r\n return _.extend(filter, {\r\n query: this.parse(expressions, logicalOperator),\r\n });\r\n }\r\n\r\n convert(query) {\r\n if (!query) {\r\n throw new Error('query is not defined. Filter object is incorrect');\r\n }\r\n\r\n if (_.isEmpty(query)) {\r\n return [];\r\n }\r\n\r\n const mongoExpressions = (query.$and || query.$or) ?\r\n (query.$and || query.$or) : [query];\r\n return mongoExpressions;\r\n }\r\n\r\n parse(expressions, logicalOperator) {\r\n if (!_.isArray(expressions)) {\r\n throw new Error('First argument must be an array of legacy expressions');\r\n }\r\n if (_.isEmpty(expressions)) {\r\n return {};\r\n }\r\n\r\n const processedExpressions = _.chain(expressions)\r\n .filter(_.negate(isExpressionDeprecated()))\r\n .map(_.compose(\r\n applyConversionsToMongoPredicate(this.filterSchema),\r\n this.toMongoPredicate.bind(this, this.filterSchema)\r\n ))\r\n .value();\r\n\r\n if (processedExpressions.length === 1) {\r\n return processedExpressions[0];\r\n }\r\n return _.object(\r\n [logicalOperator || '$and'],\r\n [processedExpressions]\r\n );\r\n }\r\n\r\n toMongoPredicate(schema, expression) {\r\n const propName = _.pairs(expression)[0][0];\r\n const condition = _.pairs(expression)[0][1];\r\n const operator = _.pairs(condition)[0][0];\r\n let value = _.pairs(condition)[0][1];\r\n const props = schema.getFilterProperty(propName);\r\n if (props && props.type) {\r\n switch (props.type) {\r\n case 'datetime':\r\n value = new Date(value);\r\n break;\r\n case 'number':\r\n value = parseFloat(value);\r\n break;\r\n case 'integer':\r\n value = parseInt(value, 10);\r\n break;\r\n case 'boolean':\r\n value = Boolean(value);\r\n break;\r\n case 'id':\r\n if (this.parseIdAsInt) {\r\n value = _.map(value, item => parseInt(item, 10)); // labels have integer ids\r\n }\r\n break;\r\n // no default\r\n }\r\n }\r\n\r\n return _.object([propName], [_.object([operator], [value])]);\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport Promise from 'bluebird';\r\n\r\nfunction isPending(obj) {\r\n return (obj instanceof Promise) && obj.isPending();\r\n}\r\n\r\n/* eslint-disable no-param-reassign */\r\nexport function taskQueueMixin(classInstance, methodNames) {\r\n let asyncTaskQueue = null;\r\n\r\n _.each(methodNames, (methodName) => {\r\n const originalMethod = classInstance[methodName];\r\n\r\n const wrappedMethod = (...args) => {\r\n asyncTaskQueue = isPending(asyncTaskQueue) ?\r\n asyncTaskQueue.catch(_.noop).then(() => originalMethod.call(classInstance, ...args)) :\r\n originalMethod.call(classInstance, ...args);\r\n\r\n return asyncTaskQueue;\r\n };\r\n\r\n classInstance[methodName] = wrappedMethod;\r\n });\r\n}\r\n","import _ from 'underscore';\r\nimport { cloneDeep } from '@bingads-webui-universal/primitive-utilities';\r\n\r\nimport { Deserializer } from './deserializer';\r\nimport { SessionFilterStorage } from './session-filter-storage';\r\nimport { taskQueueMixin } from './task-queue-mixin';\r\n\r\nexport class EditableFilterStorage extends SessionFilterStorage {\r\n constructor(options = {}) {\r\n super(options);\r\n this.deserializer = new Deserializer(options);\r\n\r\n taskQueueMixin(this, ['get', 'save', 'clean']);\r\n }\r\n\r\n /**\r\n * @private\r\n * @return {Object} - resource and entry ids\r\n */\r\n getSessionStorageId({\r\n featureName,\r\n entityName,\r\n }) {\r\n // Resource id is for defining resource\r\n // Entry id is for defining each entry under the same resource\r\n return {\r\n resourceId: `editable-filter-storage-campaignwebui-${featureName}`,\r\n entryId: `${entityName}/EditableFilter`,\r\n };\r\n }\r\n\r\n /**\r\n * @returns {Object} Promise that resolve to Filter object that contains query,\r\n * name and id\r\n */\r\n get() {\r\n return this.storage.find(this.entryId)\r\n .then((result = {}) => {\r\n try {\r\n if (_.isObject(result) && result.filter) {\r\n const savedFilter = result.filter;\r\n\r\n const filter = _.isString(savedFilter) ?\r\n this.deserializer.deserialize(JSON.parse(savedFilter)) :\r\n this.deserializer.deserialize(cloneDeep(savedFilter));\r\n\r\n return !_.isEmpty(filter.query) ? { filter } : {};\r\n }\r\n return JSON.parse(result);\r\n } catch (err) {\r\n throw new Error('Invalid filter JSON string');\r\n }\r\n })\r\n .catch(() => ({}));\r\n }\r\n\r\n /**\r\n * Save quick filter key and query to session\r\n * @param {Object} filter - Filter object that contains query, name and id\r\n * @return {undefined}\r\n */\r\n save(filter) {\r\n return this.storage.create({\r\n id: this.entryId,\r\n filter: JSON.stringify(_.pick(filter, 'query', 'name', 'id')),\r\n });\r\n }\r\n}\r\n","\r\nimport Promise from 'bluebird';\r\n\r\nexport class PermanentFilterStorage {\r\n /**\r\n * Filter storage based on preference service\r\n */\r\n\r\n constructor({\r\n featureName = '',\r\n preferenceService,\r\n storageKey,\r\n isAccountLevel = false,\r\n } = {}) {\r\n if (!preferenceService) {\r\n throw new Error('No preference service is provided');\r\n }\r\n\r\n if (storageKey) {\r\n this.storageKey = storageKey;\r\n } else {\r\n this.storageKey = this.getStorageKey(featureName);\r\n }\r\n\r\n this.featureName = featureName;\r\n this.storage = preferenceService;\r\n this.isAccountLevel = isAccountLevel;\r\n }\r\n\r\n getStorageKey() {\r\n throw new Error('Not implemented');\r\n }\r\n\r\n save(filter) {\r\n const preferenceData = {\r\n Name: this.storageKey,\r\n Data: filter,\r\n };\r\n if (this.isAccountLevel) {\r\n return this.storage.setAtAccountLevel(preferenceData);\r\n }\r\n return this.storage.setAtUserLevel(preferenceData);\r\n }\r\n\r\n get() {\r\n return Promise.resolve(this.isAccountLevel ?\r\n this.storage.findByNameAtAccountLevel(this.storageKey)\r\n : this.storage.findByNameAtUserLevel(this.storageKey))\r\n .then(result => (result ? { filter: result.Data } : { query: null }));\r\n }\r\n\r\n getFilterInSync() {\r\n const result = this.isAccountLevel ?\r\n this.storage.findByNameAtAccountLevel(this.storageKey)\r\n : this.storage.findByNameAtUserLevel(this.storageKey);\r\n return result ? { filter: result.Data } : null;\r\n }\r\n\r\n delete() {\r\n const result = this.isAccountLevel ?\r\n this.storage.findByNameAtAccountLevel(this.storageKey)\r\n : this.storage.findByNameAtUserLevel(this.storageKey);\r\n if (result && result.Id) {\r\n return this.isAccountLevel ? this.storage.del(result.Id) :\r\n this.storage.delAtUserLevel(result.Id);\r\n }\r\n return null;\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport { cloneDeep } from '@bingads-webui-universal/primitive-utilities';\r\n\r\nimport { Deserializer } from './deserializer';\r\nimport { PermanentFilterStorage } from './permanent-filter-storage';\r\nimport { taskQueueMixin } from './task-queue-mixin';\r\n\r\nexport class EditableFilterPermanentStorage {\r\n constructor(options = {}) {\r\n const {\r\n featureName,\r\n entityName,\r\n preferenceService,\r\n storageKey,\r\n } = options;\r\n\r\n this.permanentFilterStorage = new PermanentFilterStorage({\r\n featureName,\r\n preferenceService,\r\n storageKey: this.getStorageKey({\r\n featureName,\r\n entityName,\r\n storageKey,\r\n }),\r\n isAccountLevel: true,\r\n });\r\n this.deserializer = new Deserializer(options);\r\n\r\n taskQueueMixin(this, ['get', 'save', 'clean']);\r\n }\r\n\r\n /**\r\n * @private\r\n * @return {String} - resource and entry ids\r\n */\r\n getStorageKey({\r\n featureName,\r\n entityName,\r\n storageKey,\r\n }) {\r\n return storageKey || `editable-filter-storage-campaignwebui-${featureName}-${entityName}/EditableFilter`;\r\n }\r\n\r\n /**\r\n * @returns {Object} Promise that resolve to Filter object that contains query,\r\n * name and id\r\n */\r\n get() {\r\n return this.permanentFilterStorage.get()\r\n .then((result = {}) => {\r\n try {\r\n if (_.isObject(result) && result.filter) {\r\n const savedFilter = result.filter;\r\n\r\n const filter = _.isString(savedFilter) ?\r\n this.deserializer.deserialize(JSON.parse(savedFilter)) :\r\n this.deserializer.deserialize(cloneDeep(savedFilter));\r\n\r\n return !_.isEmpty(filter.query) ? { filter } : {};\r\n }\r\n return JSON.parse(result);\r\n } catch (err) {\r\n throw new Error('Invalid filter JSON string');\r\n }\r\n })\r\n .catch(() => ({}));\r\n }\r\n\r\n /**\r\n * Save quick filter key and query to session\r\n * @param {Object} filter - Filter object that contains query, name and id\r\n * @return {undefined}\r\n */\r\n save(filter) {\r\n const serializedValue = JSON.stringify(_.pick(filter, 'query', 'name', 'id'));\r\n return this.permanentFilterStorage.save(serializedValue);\r\n }\r\n\r\n clean() {\r\n return this.permanentFilterStorage.delete();\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport Promise from 'bluebird';\r\nimport { Deserializer } from './deserializer';\r\n\r\nfunction getPreferenceFilter(name, preference, preferenceQuery) {\r\n return _.first(preference.filter({\r\n where: _.defaults({ name }, preferenceQuery),\r\n }));\r\n}\r\n\r\nfunction reject(actionName) {\r\n return () => Promise.reject({ // eslint-disable-line prefer-promise-reject-errors\r\n error: `FilterPreference${actionName}`,\r\n });\r\n}\r\n\r\nexport class SavedFilterStorage {\r\n /**\r\n *\r\n * @param {boolean} getLegacySaved - Whether to save filter through UI server\r\n * to legacy filter storage\r\n * @param {string} featureName - Name of feature used to construct resource key\r\n * @param {Object} filterEntityOptions - Options to create FilterEntity,\r\n * contains entity schema\r\n * @param {function} preferenceStoreFactory - A method to create an instance\r\n * of component/bingads-grid/service/grid-preferences\r\n * @param {Number} maxSavedFilterLimit - Limit to impose on the number of saved\r\n * filters (10 by default)\r\n */\r\n constructor({\r\n getLegacySaved = true,\r\n featureName = '',\r\n filterEntityOptions = {},\r\n preferenceStoreFactory,\r\n maxSavedFilterLimit = 10,\r\n parseIdAsInt,\r\n } = {}) {\r\n if (!preferenceStoreFactory) {\r\n throw new Error('No PreferenceStore factory is provided');\r\n }\r\n this.preference = preferenceStoreFactory({\r\n getLegacySaved,\r\n gridName: featureName,\r\n entitySchema: filterEntityOptions.entitySchema,\r\n });\r\n this.preferenceQuery = {\r\n project: 'CampaignUI',\r\n grid: featureName,\r\n };\r\n this.preferenceInitPromise = this.preference.findAll({ where: this.preferenceQuery });\r\n this.maxSavedFilterLimit = maxSavedFilterLimit;\r\n this.deserializer = new Deserializer({ filterEntityOptions, parseIdAsInt });\r\n }\r\n\r\n /**\r\n * @param {Object} query - Filter query object\r\n * @param {string} name - Filter name\r\n * @return {Object} A promise that resolve to object with id of saved filter\r\n */\r\n save({ query, name }) {\r\n const exist = getPreferenceFilter(name, this.preference, this.preferenceQuery);\r\n\r\n if (exist) {\r\n return this.preference.update(exist.id, { query })\r\n .then(result => ({ id: result.id }), reject('Update'));\r\n }\r\n\r\n return this.preference.create(_.defaults({\r\n query,\r\n name,\r\n }, this.preferenceQuery))\r\n .then(result => ({ id: result.id }), reject('Create'));\r\n }\r\n\r\n /**\r\n * @return {Object} A promise that resolve to object with id, name and query of saved filter\r\n */\r\n get() {\r\n return this.preferenceInitPromise\r\n .then(() => {\r\n let filters = this.preference.filter({ where: this.preferenceQuery });\r\n\r\n filters = _.map(\r\n filters,\r\n _.bind(this.deserializer.deserialize, this.deserializer)\r\n );\r\n\r\n filters = _.reject(filters, filter => _.isEmpty(filter.query));\r\n\r\n return filters;\r\n }, reject('Get'));\r\n }\r\n\r\n /**\r\n * @return {Object} A promise that resolve to object with id of deleted filter\r\n */\r\n delete({ name }) {\r\n const exist = getPreferenceFilter(name, this.preference, this.preferenceQuery);\r\n\r\n if (exist) {\r\n return this.preference.destroy(exist.id).then(id => ({\r\n id,\r\n }), reject('Delete'));\r\n }\r\n\r\n return Promise.reject({ // eslint-disable-line prefer-promise-reject-errors\r\n error: 'FilterPreferenceNotExist',\r\n });\r\n }\r\n}\r\n","import Promise from 'bluebird';\r\nimport _ from 'underscore';\r\n\r\nimport { EditableFilterPermanentStorage } from './editable-filter-permanent-storage';\r\n\r\nexport class RecentFilterPermanentStorage {\r\n constructor(options = {}) {\r\n const {\r\n featureName,\r\n entityName,\r\n } = options;\r\n this.recentFilterStorages = [\r\n new EditableFilterPermanentStorage({\r\n ...options,\r\n storageKey: `recent-filter-campaignwebui-${featureName}-${entityName}/0`,\r\n isAccountLevel: true,\r\n }),\r\n new EditableFilterPermanentStorage({\r\n ...options,\r\n storageKey: `recent-filter-campaignwebui-${featureName}-${entityName}/1`,\r\n isAccountLevel: true,\r\n }),\r\n new EditableFilterPermanentStorage({\r\n ...options,\r\n storageKey: `recent-filter-campaignwebui-${featureName}-${entityName}/2`,\r\n isAccountLevel: true,\r\n }),\r\n ];\r\n this.currentIndex = 0;\r\n }\r\n\r\n /**\r\n * @returns {Object} Promise that resolve to Filter object that contains query,\r\n * name and id\r\n */\r\n get() {\r\n const getAllRecentPromise = [];\r\n _.each(this.recentFilterStorages, (storage) => {\r\n getAllRecentPromise.push(storage.get());\r\n });\r\n return Promise.all(getAllRecentPromise).then((filters) => {\r\n const result = _.map(filters, (filter) => {\r\n if (filter && filter.filter) {\r\n return filter.filter;\r\n }\r\n return filter;\r\n });\r\n return result;\r\n });\r\n }\r\n\r\n /**\r\n * Save quick filter key and query to session\r\n * @param {Object} filter - Filter object that contains query, name and id\r\n * @return {undefined}\r\n */\r\n save(filter) {\r\n const saveFilterPromise = [];\r\n return this.get().then((filters) => {\r\n filters.pop();\r\n filters.unshift(filter);\r\n _.each(filters, (newFilter, index) => {\r\n saveFilterPromise.push(this.recentFilterStorages[index].save(newFilter));\r\n });\r\n return Promise.all(saveFilterPromise);\r\n });\r\n }\r\n\r\n clean() {\r\n const cleanFilterPromise = [];\r\n _.each(this.recentFilterStorages, (storage) => {\r\n cleanFilterPromise.push(storage.clean());\r\n });\r\n return Promise.all(cleanFilterPromise);\r\n }\r\n}\r\n","import { SessionFilterStorage } from './session-filter-storage';\r\n\r\nexport class QuickFilterStorage extends SessionFilterStorage {\r\n /**\r\n * @private\r\n * @return {Object} - resource and entry ids\r\n */\r\n getSessionStorageId({\r\n featureName,\r\n entityName,\r\n }) {\r\n // Resource id is for defining resource\r\n // Entry id is for defining each entry under the same resource\r\n return {\r\n resourceId: `quick-filter-storage-campaignwebui-${featureName}`,\r\n entryId: `${entityName}/QuickFilter`,\r\n };\r\n }\r\n\r\n /**\r\n * Save quick filter key and query to session\r\n * @param {string} key - Filter key\r\n * @param {Object} value - Filter query object\r\n * @return {undefined}\r\n */\r\n save(key, value) {\r\n this.storage.create({\r\n id: this.entryId,\r\n filter: {\r\n key,\r\n value,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Get quick filter object\r\n * @return {Object} - Quick filter object that contains\r\n * key and query\r\n */\r\n get() {\r\n // TODO: based on the scenario entity, decide if we want to also\r\n // get the waterfall filter.\r\n return this.storage.find(this.entryId)\r\n .catch(() => null);\r\n }\r\n}\r\n","import { PermanentFilterStorage } from './permanent-filter-storage';\r\n\r\nexport class QuickFilterPermanentStorage {\r\n constructor(options = {}) {\r\n const {\r\n featureName,\r\n entityName,\r\n preferenceService,\r\n } = options;\r\n\r\n this.permanentFilterStorage = new PermanentFilterStorage({\r\n featureName,\r\n preferenceService,\r\n storageKey: this.getStorageKey({\r\n featureName,\r\n entityName,\r\n }),\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n * @return {String} - resource and entry ids\r\n */\r\n getStorageKey({\r\n featureName,\r\n entityName,\r\n }) {\r\n return `quick-filter-storage-campaignwebui-${featureName}-${entityName}/QuickFilter`;\r\n }\r\n\r\n /**\r\n * @returns {Object} Promise that resolve to Filter object that contains query,\r\n * name and id\r\n */\r\n get() {\r\n return this.permanentFilterStorage.get();\r\n }\r\n\r\n /**\r\n * Save quick filter key and query to session\r\n * @param {string} key - Filter key\r\n * @param {Object} value - Filter query object\r\n * @return {undefined}\r\n */\r\n save(key, value) {\r\n return this.permanentFilterStorage.save({\r\n key,\r\n value,\r\n });\r\n }\r\n\r\n clean() {\r\n return this.permanentFilterStorage.delete();\r\n }\r\n}\r\n","import { PermanentFilterStorage } from './permanent-filter-storage';\r\n\r\nexport class WaterfallFilterPermanentStorage extends PermanentFilterStorage {\r\n /**\r\n * @private\r\n * @param {string} featureName - feature name\r\n * @return {string} - return storage key\r\n */\r\n getStorageKey(featureName) {\r\n return `WebApp.CampaignUI.${featureName}`;\r\n }\r\n}\r\n","export class SessionFilterStorage {\r\n /**\r\n * Session storage that is configured to save filter object, sync version.\r\n */\r\n\r\n constructor({\r\n featureName = '',\r\n sessionStore,\r\n storageKey,\r\n } = {}) {\r\n if (!sessionStore) {\r\n throw new Error('No session store is provided');\r\n }\r\n\r\n if (storageKey) {\r\n this.storageKey = storageKey;\r\n } else {\r\n this.storageKey = this.getStorageKey(featureName);\r\n }\r\n\r\n this.featureName = featureName;\r\n this.storage = sessionStore;\r\n }\r\n\r\n getStorageKey() {\r\n throw new Error('Not implemented');\r\n }\r\n\r\n save(filter) {\r\n this.storage.set(this.storageKey, filter);\r\n }\r\n\r\n get() {\r\n const data = this.storage.get(this.storageKey);\r\n return data ? { filter: data } : null;\r\n }\r\n}\r\n","import { SessionFilterStorage } from './filter-session-storage';\r\n\r\nexport class QuickFilterSessionStorage extends SessionFilterStorage {\r\n /**\r\n * @private\r\n * @param {string} featureName - feature name\r\n * @return {string} - return storage key\r\n */\r\n getStorageKey(featureName) {\r\n return `WebApp.CampaignUI.${featureName}`;\r\n }\r\n\r\n /**\r\n * Get filter object, to keep compatible with permanent filter storage.\r\n * @return {Object} - Filter object that contains key and query\r\n */\r\n getFilterInSync() {\r\n return this.get();\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport { LegacyQuickFilterStorage } from './legacy-quick-filter-storage';\r\nimport { EditableFilterStorage } from './editable-filter-storage';\r\nimport { EditableFilterPermanentStorage } from './editable-filter-permanent-storage';\r\nimport { SavedFilterStorage } from './saved-filter-storage';\r\nimport { RecentFilterPermanentStorage } from './recent-filter-storage';\r\nimport { QuickFilterStorage } from './quick-filter-storage';\r\nimport { QuickFilterPermanentStorage } from './quick-filter-permanent-storage';\r\nimport { WaterfallFilterPermanentStorage } from './waterfall-filter-permanent-storage';\r\nimport { QuickFilterSessionStorage } from './quick-filter-session-storage';\r\n\r\nconst storageTypeMapping = {\r\n quickFilter: QuickFilterStorage,\r\n editableFilter: EditableFilterStorage,\r\n editableFilterPermanent: EditableFilterPermanentStorage,\r\n savedFilter: SavedFilterStorage,\r\n recentFilter: RecentFilterPermanentStorage,\r\n legacyQuickFilter: LegacyQuickFilterStorage,\r\n permanentQuickFilter: QuickFilterPermanentStorage,\r\n permanentWaterfallFilter: WaterfallFilterPermanentStorage,\r\n sessionQuickFilter: QuickFilterSessionStorage,\r\n};\r\n\r\nexport class FilterStorageFactory {\r\n /**\r\n * Create wrapper of session and preference storage for storing filters\r\n * @param {Object} preferenceStoreFactory - A method to create an instance\r\n * of component/bingads-grid/service/grid-preferences\r\n * @param {Object} sessionStore - A instance of component/js-data-storage/session-storage\r\n * @param {Object} getLegacySaved - Whether to save filter through UI server\r\n * to legacy storage\r\n * @param {Object} featureName - Name of feature\r\n * @param {Number} maxSavedFilterLimit - Limit to impose on number of saved filters\r\n * @param {Boolean} parseIdAsInt - Flag indicating whether or not ids in\r\n * filter queries should be parsed as ints upon deserialization\r\n */\r\n constructor({\r\n preferenceStoreFactory,\r\n sessionStore,\r\n getLegacySaved,\r\n featureName,\r\n maxSavedFilterLimit,\r\n parseIdAsInt,\r\n preferenceService,\r\n }) {\r\n this.preferenceStoreFactory = preferenceStoreFactory;\r\n this.sessionStore = sessionStore;\r\n this.getLegacySaved = getLegacySaved;\r\n this.featureName = featureName;\r\n this.maxSavedFilterLimit = maxSavedFilterLimit;\r\n this.parseIdAsInt = parseIdAsInt;\r\n this.preferenceService = preferenceService;\r\n }\r\n\r\n /**\r\n *\r\n * @param {('quickFilter'|'editableFilter'|'savedFilter')} type - Storage type\r\n * @param {Object} options - Options for creating storage instance\r\n * @param {Object} options.filterEntityOptions - Options to create FilterEntity,\r\n * contains entity schema\r\n * @param {string} [options.resourceId] - Resource Id\r\n * @param {string} [options.entryId] - Entry Id\r\n * @param {Boolean} [options.newCampaignsGridFilterEnabled] --\r\n * Indicates whether campaigns grid is using filter-service (used for waterfall filters)\r\n * @return {Object} An instance of filter storage object of specific type\r\n */\r\n create(type, options = {}) {\r\n let Storage = storageTypeMapping[type];\r\n if (type === 'editableFilter' && this.preferenceService &&\r\n !_.isEmpty(this.preferenceService)) {\r\n Storage = EditableFilterPermanentStorage;\r\n }\r\n if (type === 'quickFilter' && this.preferenceService &&\r\n !_.isEmpty(this.preferenceService)) {\r\n Storage = QuickFilterPermanentStorage;\r\n }\r\n return new (Storage)(_.extend(options || {}, {\r\n preferenceStoreFactory: this.preferenceStoreFactory,\r\n sessionStore: this.sessionStore,\r\n getLegacySaved: this.getLegacySaved,\r\n featureName: options.featureName || this.featureName,\r\n maxSavedFilterLimit: this.maxSavedFilterLimit,\r\n parseIdAsInt: this.parseIdAsInt,\r\n preferenceService: this.preferenceService,\r\n }));\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport kendo from '@bingads-webui/kendo/kendo.core';\r\nimport { getSessionStorage } from '@bingads-webui/storage';\r\nimport { FilterStorageFactory } from './filter-storage-factory';\r\n\r\nexport const WaterfallFilterType = {\r\n CampaignType: 0,\r\n CampaignStatus: 1,\r\n AdGroupStatus: 2,\r\n DateFilter: 3,\r\n BudgetCenterMonthFilter: 4,\r\n};\r\n\r\nconst waterfallFilterTypeMapping = {\r\n [WaterfallFilterType.CampaignType]: 'permanentWaterfallFilter',\r\n [WaterfallFilterType.CampaignStatus]: 'permanentWaterfallFilter',\r\n [WaterfallFilterType.AdGroupStatus]: 'permanentWaterfallFilter',\r\n [WaterfallFilterType.DateFilter]: 'permanentWaterfallFilter',\r\n [WaterfallFilterType.BudgetCenterMonthFilter]: 'sessionQuickFilter',\r\n};\r\n\r\nconst waterfallFilterNames = {\r\n [WaterfallFilterType.CampaignType]: 'New.CampaignType',\r\n [WaterfallFilterType.CampaignStatus]: 'New.CampaignStatus',\r\n [WaterfallFilterType.AdGroupStatus]: 'New.AdGroupStatus',\r\n // Keep the same key for date filter, so we can carry over\r\n // date filter between previous and new UI.\r\n [WaterfallFilterType.DateFilter]: 'dateFilter',\r\n [WaterfallFilterType.BudgetCenterMonthFilter]: 'BudgetCenterMonthFilter',\r\n};\r\n\r\nexport class WaterfallFilterStorage {\r\n /**\r\n * Create wrapper of permanent storage for waterfall filters\r\n * @param {Object} preferenceService- Preference service instance\r\n */\r\n constructor({\r\n preferenceService,\r\n sessionStore,\r\n }) {\r\n this.waterfallFilterStorages = {};\r\n\r\n _.each(waterfallFilterNames, (value, key) => {\r\n const filterStorage = new FilterStorageFactory({\r\n sessionStore: sessionStore || getSessionStorage(),\r\n preferenceService,\r\n featureName: value,\r\n }).create(waterfallFilterTypeMapping[key]);\r\n\r\n this.waterfallFilterStorages = { ...this.waterfallFilterStorages, [key]: filterStorage };\r\n });\r\n }\r\n\r\n /**\r\n * Get waterfall filter object array\r\n * @param {Array.} filterTypes - Array of waterfall filter types\r\n * @return {Array.} - Array of Waterfall filter object\r\n */\r\n getFilters(filterTypes) {\r\n return filterTypes.map((type) => {\r\n const storage = this.waterfallFilterStorages[type];\r\n return storage.getFilterInSync();\r\n });\r\n }\r\n\r\n /**\r\n * Save a waterfall filter by its type\r\n * @param {WaterfallFilterType} filterType - Waterfall filter type\r\n * @param {Object} filter - Waterfall filter object\r\n * @return {void}\r\n */\r\n save(filterType, filter) {\r\n const storage = this.waterfallFilterStorages[filterType];\r\n storage.save(filter);\r\n }\r\n}\r\n\r\n/**\r\n * helper function to format waterfall date filte objct\r\n * @param {Object} dateFilter - date filter storage\r\n * @param {string} format - used to parse date\r\n * @return {Object} cooked value\r\n */\r\nexport const dateFilterProcessor = (dateFilter, format) => {\r\n if (!dateFilter) return null;\r\n const newFilter = dateFilter;\r\n if (newFilter.compared) {\r\n newFilter.compared.start = kendo.parseDate(\r\n newFilter.compared.formattedStart,\r\n format\r\n );\r\n newFilter.compared.end = kendo.parseDate(\r\n newFilter.compared.formattedEnd,\r\n format\r\n );\r\n }\r\n return _.defaults({}, newFilter, {\r\n start: newFilter.RangeStartDate && kendo.parseDate(\r\n newFilter.RangeStartDate,\r\n format\r\n ),\r\n end: newFilter.RangeEndDate && kendo.parseDate(\r\n newFilter.RangeEndDate,\r\n format\r\n ),\r\n grain: newFilter.RangeId,\r\n });\r\n};\r\n\r\n/**\r\n * helper function to format waterfall date filte objct\r\n * we need serverContext to get date format, and here after\r\n * parseDate we get a date that is using local timeZone to\r\n * keep consistent with old UI kendo.toString timezone\r\n * @param {Array} dateFilterStorage - date filter storage\r\n * @param {Object} serverContext - used to parse date\r\n * @return {Object} cooked value\r\n */\r\nexport function waterfallDateFilterProcessor(dateFilterStorage, serverContext) {\r\n const dateFilter = dateFilterStorage && dateFilterStorage[0] && dateFilterStorage[0].filter;\r\n const format = serverContext.CurrentUser.CultureDateTimeFormat.ShortDatePattern;\r\n return dateFilterProcessor(dateFilter, format);\r\n}\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nexport class MetricCounter extends React.PureComponent {\r\n getMetricLine(metric) {\r\n return metric.line;\r\n }\r\n\r\n getText(metric) {\r\n const styles = {\r\n color: metric.color,\r\n };\r\n\r\n return (\r\n
\r\n
{metric.name}
\r\n
{metric.value}
\r\n
);\r\n }\r\n\r\n render() {\r\n const metricList = this.props.metrics.map(metric => (\r\n
\r\n
\r\n {this.getText(metric)}\r\n
));\r\n return (\r\n
\r\n {metricList}\r\n
\r\n );\r\n }\r\n}\r\n\r\nMetricCounter.propTypes = {\r\n metrics: PropTypes.arrayOf(PropTypes.shape({\r\n name: PropTypes.string,\r\n value: PropTypes.string,\r\n line: PropTypes.string,\r\n })).isRequired,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Glyphicon } from '@bingads-webui-react/primitive';\r\n\r\nexport const DescriptionContainer = ({\r\n description,\r\n}) => (\r\n
\r\n
\r\n \r\n
\r\n
{description}
\r\n
\r\n);\r\n\r\nDescriptionContainer.propTypes = {\r\n description: PropTypes.node.isRequired,\r\n};\r\n","export const FLUCTUATION_CALLOUT_CLASSNAME = 'bingads-fluctuation-callout';\r\n\r\nexport const ActionSubPanel = {\r\n None: 'none',\r\n FeedbackPanel: 'feedback',\r\n DismissPanel: 'dismiss',\r\n /**\r\n * The state for feedback submitted. Not a real sub panel.\r\n */\r\n FeedbackComplete: 'feedback-complete',\r\n};\r\n","import React, { useState, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport { Callout } from '@bingads-webui-react/callout';\r\n\r\nimport { FLUCTUATION_CALLOUT_CLASSNAME } from '../constants';\r\n\r\nconst CALLOUT_HORIZONTAL_SPACE = 500;\r\n\r\nexport function CalloutWithAutoPlacement({\r\n target, onDismiss, children, calloutKey, className,\r\n}) {\r\n const [autoFixPlacement, setAutoFixPlacement] = useState('right');\r\n\r\n /* istanbul ignore next */\r\n useEffect(() => {\r\n let fixedPlacement = autoFixPlacement;\r\n const { left, right } = target.getBoundingClientRect();\r\n switch (autoFixPlacement) {\r\n case 'right':\r\n fixedPlacement = right + CALLOUT_HORIZONTAL_SPACE > window.innerWidth ? 'left' : 'right'; break;\r\n case 'left':\r\n fixedPlacement = left - CALLOUT_HORIZONTAL_SPACE < 0 ? 'right' : 'left'; break;\r\n default:\r\n break;\r\n }\r\n setAutoFixPlacement(fixedPlacement);\r\n }, [autoFixPlacement, target]);\r\n\r\n return (\r\n onDismiss(e, target)}\r\n placement={autoFixPlacement}\r\n />\r\n );\r\n}\r\n\r\nCalloutWithAutoPlacement.propTypes = {\r\n target: PropTypes.instanceOf(Element).isRequired,\r\n onDismiss: PropTypes.func,\r\n children: PropTypes.oneOfType([\r\n PropTypes.arrayOf(PropTypes.node),\r\n PropTypes.node,\r\n ]).isRequired,\r\n calloutKey: PropTypes.string,\r\n className: PropTypes.string,\r\n};\r\n\r\nCalloutWithAutoPlacement.defaultProps = {\r\n onDismiss: _.noop,\r\n calloutKey: '',\r\n className: FLUCTUATION_CALLOUT_CLASSNAME,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Link } from '@bingads-webui-react/fabric-control';\r\n\r\nexport const FluctuationActionButton = ({\r\n i18n,\r\n actionType,\r\n onClick,\r\n}) => (\r\n \r\n |\r\n {// eslint-disable-next-line jsx-a11y/anchor-is-valid\r\n \r\n {i18n.getString(`Fluctuation_Option_${actionType}`)}\r\n }\r\n );\r\n\r\nFluctuationActionButton.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n actionType: PropTypes.string.isRequired,\r\n onClick: PropTypes.func.isRequired,\r\n};\r\n","import $ from 'jquery';\r\nimport _ from 'underscore';\r\nimport ReactDOM from 'react-dom';\r\n\r\nfunction replaceToken(pattern, val, str) {\r\n const regexp = new RegExp(pattern);\r\n let finalString = str;\r\n while (regexp.test(finalString)) {\r\n finalString = finalString.replace(pattern, val);\r\n }\r\n\r\n return finalString;\r\n}\r\n\r\nexport function replaceCurly(str, ctx, args) {\r\n const cidpattern = /{cid}/;\r\n const uidpattern = /{uid}/;\r\n const aidpattern = /{aid}/;\r\n const cmpidpattern = /{cmpid}/;\r\n const adgidpattern = /{adgid}/;\r\n let finalStr = str;\r\n let argCounter = 0;\r\n let params = args;\r\n\r\n if (!str) {\r\n return null;\r\n }\r\n\r\n if (!Array.isArray(args)) {\r\n params = [args];\r\n }\r\n\r\n if (ctx) {\r\n const userId = ctx.CurrentUser ? ctx.CurrentUser.Id : ctx.UserId;\r\n\r\n finalStr = replaceToken(cidpattern, ctx.CustomerId, finalStr);\r\n finalStr = replaceToken(uidpattern, userId, finalStr);\r\n finalStr = replaceToken(aidpattern, ctx.AccountId, finalStr);\r\n if (ctx.CampaignId) {\r\n finalStr = replaceToken(cmpidpattern, ctx.CampaignId, finalStr);\r\n }\r\n if (ctx.AdGroupId) {\r\n finalStr = replaceToken(adgidpattern, ctx.AdGroupId, finalStr);\r\n }\r\n }\r\n\r\n while (finalStr.indexOf(`{${argCounter}}`) > -1 && argCounter < args.length) {\r\n if (typeof (params[argCounter]) === 'string') {\r\n finalStr = finalStr.replace(`{${argCounter}}`, params[argCounter]);\r\n }\r\n argCounter += 1;\r\n }\r\n return finalStr;\r\n}\r\n\r\nexport const insightPopupContainerId = 'insight-popup-placeholder';\r\n\r\n// Insert a placeholder for popover when rendering popup in Backbone view.\r\nexport const insertPopoverContainer = (placeHolderId = insightPopupContainerId) => {\r\n // insert a static div for rendering element\r\n if ($(`#${placeHolderId}`).length === 0) {\r\n $('
').attr('id', placeHolderId).appendTo(document.body);\r\n }\r\n};\r\n\r\nexport const getDefaultFeedbackOptions = i18n => [\r\n {\r\n key: '0',\r\n text: i18n.getString('Fluctuation_Feedback1'),\r\n name: 'feedback1',\r\n }, {\r\n key: '1',\r\n text: i18n.getString('Fluctuation_Feedback2'),\r\n name: 'feedback2',\r\n }, {\r\n key: '2',\r\n text: i18n.getString('Fluctuation_Feedback3'),\r\n name: 'feedback3',\r\n }];\r\n\r\nexport const getDefaultDismissOptions = i18n => [\r\n {\r\n key: '0',\r\n text: i18n.getString('Fluctuation_Dismiss_Feedback1'),\r\n name: 'dismiss1',\r\n }, {\r\n key: '1',\r\n text: i18n.getString('Fluctuation_Dismiss_Feedback2'),\r\n name: 'dismiss2',\r\n }, {\r\n key: '2',\r\n text: i18n.getString('Fluctuation_Dismiss_Feedback3'),\r\n name: 'dismiss3',\r\n }];\r\n\r\nexport function dismissPopupIfExist(popupContainers, popupClassName = 'bingads-fluctuation-wrapper') {\r\n /* istanbul ignore next */\r\n const showPopup = document.getElementsByClassName(popupClassName).length > 0;\r\n /* istanbul ignore next */\r\n if (showPopup && popupContainers.length) {\r\n _.each(popupContainers, container => container && ReactDOM.unmountComponentAtNode(container));\r\n }\r\n}\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { DefaultButton, PrimaryButton, Checkbox, TextField } from '@bingads-webui-react/fabric-control';\r\n\r\nconst Checkboxes = ({ checkboxOption, toggleCheckbox }) => (\r\n
\r\n {checkboxOption.map(entry => (\r\n ))\r\n }\r\n
);\r\n\r\nconst checkboxesPropType = {\r\n checkboxOption: PropTypes.arrayOf(PropTypes.shape({\r\n key: PropTypes.string,\r\n text: PropTypes.string,\r\n name: PropTypes.string,\r\n })).isRequired,\r\n toggleCheckbox: PropTypes.func.isRequired,\r\n};\r\n\r\nCheckboxes.propTypes = checkboxesPropType;\r\n\r\nconst CommentContainer = ({\r\n i18n,\r\n onChange,\r\n}) => (\r\n
\r\n \r\n
\r\n);\r\n\r\nCommentContainer.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n onChange: PropTypes.func.isRequired,\r\n};\r\n\r\nexport const DismissForm = ({\r\n i18n,\r\n checkboxOption,\r\n toggleCheckbox,\r\n handleCommentChange,\r\n onSubmit,\r\n onCancel,\r\n}) => (\r\n
\r\n
\r\n \r\n \r\n
{i18n.getString('Fluctuation_Dismiss_Explanation')}
\r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n);\r\n\r\nconst commonProptypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n ...checkboxesPropType,\r\n handleCommentChange: PropTypes.func.isRequired,\r\n onSubmit: PropTypes.func.isRequired,\r\n onCancel: PropTypes.func.isRequired,\r\n};\r\n\r\nDismissForm.propTypes = commonProptypes;\r\n\r\nexport const FeedbackForm = ({\r\n i18n,\r\n checkboxOption,\r\n toggleCheckbox,\r\n handleCommentChange,\r\n onSubmit,\r\n onCancel,\r\n selectedCheckboxes,\r\n comment,\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\nFeedbackForm.propTypes = {\r\n ...commonProptypes,\r\n selectedCheckboxes: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n comment: PropTypes.string.isRequired,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport { LearnMoreLink } from '@bingads-webui-campaign-react/help';\r\nimport { FluctuationActionButton } from './components/fluctuation-action-button';\r\nimport { ActionSubPanel } from './constants';\r\nimport { getDefaultDismissOptions, getDefaultFeedbackOptions } from './utils';\r\nimport { DismissForm, FeedbackForm } from './components/insight-action-forms';\r\n\r\nexport class InsightAction extends React.PureComponent {\r\n constructor(props) {\r\n super(props);\r\n const { i18n } = this.props.deps;\r\n this.feedbackOptions = this.props.feedbackOptions || getDefaultFeedbackOptions(i18n);\r\n this.dismissFeedbackOptions = this.props.dismissOptions || getDefaultDismissOptions(i18n);\r\n\r\n this.state = {\r\n comment: '',\r\n selectedCheckboxes: [],\r\n };\r\n }\r\n\r\n showPanel = (panel) => {\r\n const newPanel = panel === this.props.activeSubPanel ? ActionSubPanel.None : panel;\r\n this.setState(\r\n {\r\n selectedCheckboxes: [],\r\n comment: '',\r\n },\r\n this.props.onCurrentSubPanelChange(newPanel)\r\n );\r\n };\r\n\r\n toggleCheckbox = ({ target }, checked) => {\r\n const { id } = target;\r\n this.setState({\r\n selectedCheckboxes: checked ? this.state.selectedCheckboxes.concat(id) :\r\n _.without(this.state.selectedCheckboxes, id),\r\n });\r\n };\r\n\r\n cancelAction = (event) => {\r\n event.stopPropagation();\r\n this.props.onCurrentSubPanelChange(ActionSubPanel.None);\r\n };\r\n\r\n submitActionFeedback = (event) => {\r\n event.stopPropagation();\r\n const feedbackObj = {\r\n feedbacks: this.state.selectedCheckboxes,\r\n comment: this.state.comment,\r\n type: this.props.activeSubPanel,\r\n };\r\n const newSubPanel = this.showFeedbackForm ?\r\n ActionSubPanel.FeedbackComplete : ActionSubPanel.None;\r\n this.props.onCurrentSubPanelChange(newSubPanel);\r\n this.props.onSubmit(feedbackObj);\r\n };\r\n\r\n handleCommentChange = ({ target }) => {\r\n this.setState({ comment: target.value });\r\n };\r\n\r\n render() {\r\n const { deps: { i18n } } = this.props;\r\n this.showFeedbackForm = this.props.activeSubPanel === ActionSubPanel.FeedbackPanel;\r\n this.showDismissForm = this.props.activeSubPanel === ActionSubPanel.DismissPanel;\r\n this.feedbackSubmitted = this.props.activeSubPanel === ActionSubPanel.FeedbackComplete;\r\n\r\n const actionFormCommonProps = {\r\n i18n,\r\n CommentContainer: this.commentContainer,\r\n onSubmit: this.submitActionFeedback,\r\n onCancel: this.cancelAction,\r\n toggleCheckbox: this.toggleCheckbox,\r\n handleCommentChange: this.handleCommentChange,\r\n };\r\n\r\n return (\r\n
\r\n
\r\n \r\n {_.map(this.props.subPanels, panel => (\r\n this.showPanel(panel)}\r\n key={panel}\r\n />))}\r\n
\r\n {this.showFeedbackForm &&\r\n }\r\n {this.showDismissForm &&\r\n }\r\n {this.feedbackSubmitted &&\r\n
\r\n {this.props.deps.i18n.getString('Fluctuation_feedback_complete')}\r\n
}\r\n
\r\n );\r\n }\r\n}\r\n\r\nInsightAction.propTypes = {\r\n deps: PropTypes.shape({\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n }).isRequired,\r\n onSubmit: PropTypes.func.isRequired,\r\n onCurrentSubPanelChange: PropTypes.func.isRequired,\r\n activeSubPanel: PropTypes.string.isRequired,\r\n feedbackOptions: PropTypes.arrayOf(PropTypes.shape({\r\n key: PropTypes.string,\r\n text: PropTypes.string,\r\n name: PropTypes.string,\r\n })),\r\n dismissOptions: PropTypes.arrayOf(PropTypes.shape({\r\n key: PropTypes.string,\r\n text: PropTypes.string,\r\n name: PropTypes.string,\r\n })),\r\n learnMoreLinkTopic: PropTypes.string,\r\n subPanels: PropTypes.arrayOf(PropTypes.string),\r\n};\r\n\r\nInsightAction.defaultProps = {\r\n feedbackOptions: undefined,\r\n dismissOptions: undefined,\r\n learnMoreLinkTopic: 'app54666',\r\n subPanels: [ActionSubPanel.FeedbackPanel, ActionSubPanel.DismissPanel],\r\n};\r\n","import Promise from 'bluebird';\r\nimport $ from 'jquery';\r\n\r\nconst BaseUrl = 'AdInsight/V2/Customers({cid})/Accounts({aid})/Fluctuation';\r\n\r\nexport class FluctuationService {\r\n constructor({\r\n token,\r\n options,\r\n }) {\r\n this.token = token;\r\n this.options = options;\r\n }\r\n\r\n getUrlParam = (queryString, param) => {\r\n const match = RegExp(`[?&]${param}=([^&]*)`).exec(queryString);\r\n const queryParamValue = match && decodeURIComponent(match[1].replace(/\\+/g, ' '));\r\n\r\n return queryParamValue ? `&${param}=${queryParamValue}` : '';\r\n }\r\n\r\n formatUrl(callType, withoutOpporCheck) {\r\n let url = '';\r\n const campaign = this.options.campaignId ? 'Campaign' : '';\r\n const campaignParam = this.options.campaignId ? '&campaignId={campaignId}' : '';\r\n const exeprimentParam = this.options.isFluctuationsExperiementEnabled ? '&$filter=true' : '';\r\n const urlParams = this.getUrlParam(window.location.search, 'internalVersion');\r\n const odataFuncPrefix = campaign ? 'Campaign' : 'Account';\r\n /* istanbul ignore next */\r\n let odataFunc = urlParams ? `Get${odataFuncPrefix}FluctuationsWithFilter` : `Get${campaign}Fluctuations`;\r\n\r\n if (withoutOpporCheck) {\r\n odataFunc = `Get${campaign}FluctuationsWithoutRecCheck`;\r\n }\r\n if (callType === 'GET') {\r\n url = `${BaseUrl}.${odataFunc}?userId={userId}${urlParams}${campaignParam}&granularity={granularity}&surfacingChannelId={surfacingChannelId}&startDate={startDate}&endDate={endDate}${exeprimentParam}`;\r\n } else {\r\n url = `${BaseUrl}.Post${campaign}FeedBack?userId={userId}${urlParams}${campaignParam}&uniqueId={uniqueId}&datetime={datetime}&feedbackType=Dismiss`;\r\n }\r\n let tempUrl = url.replace('{aid}', this.options.accountId)\r\n .replace('{userId}', this.options.userId)\r\n .replace('{cid}', this.options.customerId)\r\n .replace('{granularity}', this.options.granularity)\r\n .replace('{surfacingChannelId}', this.options.surfacingChannelId)\r\n .replace('{startDate}', this.options.startDate)\r\n .replace('{endDate}', this.options.endDate)\r\n .replace('{uniqueId}', this.options.uniqueId)\r\n .replace('{datetime}', this.options.datetime);\r\n\r\n if (this.options.campaignId) {\r\n tempUrl = tempUrl.replace('{campaignId}', this.options.campaignId);\r\n }\r\n const host = this.options.host || `${window.location.origin}/ODataApi/`;\r\n return `${host}${tempUrl}`;\r\n }\r\n\r\n /**\r\n * Gets localized list of granularities for the current daterange.\r\n * @param {string} callType - one of 'GET' or 'POST'\r\n * @param {boolean} withoutOpporCheck - one of 'account' or 'campaign'\r\n * @returns {object} option object to be used in ajax call\r\n */\r\n generateRequestOption(callType, withoutOpporCheck = false) {\r\n const option = {\r\n contentType: 'application/json',\r\n type: callType,\r\n headers: {\r\n authorization: `CCMTSmallToken ${this.token}`,\r\n },\r\n cache: callType === 'POST', // Disable cache when GET fluctuations\r\n };\r\n\r\n option.url = this.formatUrl(callType, withoutOpporCheck);\r\n\r\n return option;\r\n }\r\n\r\n findAll({\r\n withoutOpporCheck = false,\r\n } = {}) {\r\n const option = this.generateRequestOption('GET', withoutOpporCheck);\r\n\r\n return new Promise((resolve, reject) => {\r\n /* istanbul ignore next */\r\n $.ajax(option).then((rawData) => {\r\n /* istanbul ignore next */\r\n resolve(rawData.value);\r\n }, reject);\r\n });\r\n }\r\n\r\n postFeedback() {\r\n const option = this.generateRequestOption('POST');\r\n\r\n return new Promise((resolve, reject) => {\r\n /* istanbul ignore next */\r\n $.ajax(option).then(() => {\r\n /* istanbul ignore next */\r\n resolve();\r\n }, reject);\r\n });\r\n }\r\n}\r\n","const cardWelcomeTipsId = 'CardType-WelcomeTips';\r\nconst cardTopLocationsId = 'CardType-TopLocations';\r\nconst cardAssetPerformanceId = 'CardType-AssetPerformance';\r\nconst cardPerformanceId = 'CardType-Performance';\r\nconst cardDiagnosticId = 'CardType-Diagnostic';\r\nconst cardRecommendationsId = 'CardType-Recommendations';\r\nconst cardTopCampaignsId = 'CardType-TopCampaigns';\r\nconst cardTopAccountsId = 'CardType-TopAccounts';\r\nconst cardTopKeywordsId = 'CardType-TopKeyword';\r\nconst cardDeviceId = 'CardType-Device';\r\nconst cardSearchTermsId = 'CardType-TopSearchTerms';\r\nconst cardTopAdGroupsId = 'CardType-TopAdGroup';\r\nconst cardCompetitionId = 'CardType-Competition';\r\nconst cardConversionTrackingId = 'CardType-Conversion-Tracking';\r\nconst cardTopChangesAccountId = 'CardType-TopChanges-Account';\r\nconst cardTopChangesCampaignId = 'CardType-TopChanges-Campaign';\r\nconst cardTopChangesAdGroupId = 'CardType-TopChanges-AdGroup';\r\nconst cardNavigateToFullProductId = 'CardType-NavigateToFullProduct';\r\n\r\nexport {\r\n cardWelcomeTipsId,\r\n cardTopLocationsId,\r\n cardAssetPerformanceId,\r\n cardPerformanceId,\r\n cardDiagnosticId,\r\n cardRecommendationsId,\r\n cardTopCampaignsId,\r\n cardTopAccountsId,\r\n cardTopKeywordsId,\r\n cardDeviceId,\r\n cardSearchTermsId,\r\n cardTopAdGroupsId,\r\n cardCompetitionId,\r\n cardConversionTrackingId,\r\n cardTopChangesAccountId,\r\n cardTopChangesCampaignId,\r\n cardTopChangesAdGroupId,\r\n cardNavigateToFullProductId,\r\n};\r\n","import _ from 'underscore';\r\nimport { CampaignType as AccountLevelCampaignType } from '@bingads-webui-campaign/campaign-ui-common';\r\n\r\nconst CampaignLevelCampaignType = _.mapObject(AccountLevelCampaignType, (__, key) => key);\r\n\r\n// For card level preference, we should always use getCardPreferenceWithDefault to make sure we can fallback to default value\r\n// we now should only use this to try to get page level preference\r\nexport const getPreference = ({\r\n key,\r\n preference,\r\n}) => {\r\n // In fluent overview page, we always use user level preference, if we need to load legacy preference, we need add scope info\r\n // to figure out the correct preference level.\r\n const preferenceObj = preference.findByNameAtUserLevel(key);\r\n\r\n return _.get(preferenceObj, 'Data');\r\n};\r\n\r\nexport const getPreferencePatcher = ({\r\n key,\r\n preference,\r\n}) => (update) => {\r\n const preferenceData = getPreference({ key, preference });\r\n const newPreferenceData = {\r\n ...preferenceData,\r\n ...update,\r\n };\r\n\r\n preference.setAtUserLevel({\r\n Data: newPreferenceData,\r\n Name: key,\r\n });\r\n};\r\n\r\nfunction getPreferenceKeyPrefix({\r\n navigationLevel,\r\n campaignType,\r\n}) {\r\n let campaignTypeString = 'other';\r\n if (campaignType === CampaignLevelCampaignType.Hotel || campaignType === AccountLevelCampaignType.Hotel) {\r\n campaignTypeString = 'hotel';\r\n } else if (campaignType === CampaignLevelCampaignType.PerformanceMax || campaignType === AccountLevelCampaignType.PerformanceMax) {\r\n campaignTypeString = 'pmax';\r\n } else if (campaignType === CampaignLevelCampaignType.App || campaignType === AccountLevelCampaignType.App) {\r\n campaignTypeString = 'app';\r\n } else if (campaignType === CampaignLevelCampaignType.LinkedIn || campaignType === AccountLevelCampaignType.LinkedIn) {\r\n campaignTypeString = 'linkedin';\r\n }\r\n\r\n return `OverviewPage-${navigationLevel}-${campaignTypeString}`;\r\n}\r\n\r\nexport const getCardPreferenceKey = ({\r\n cardTypeId,\r\n navigationLevel,\r\n campaignType,\r\n}) => {\r\n const prefix = getPreferenceKeyPrefix({ navigationLevel, campaignType });\r\n\r\n return `${prefix}-${cardTypeId}`;\r\n};\r\n\r\nexport const getPagePreferenceKey = ({\r\n navigationLevel,\r\n campaignType,\r\n}) => {\r\n const prefix = getPreferenceKeyPrefix({ navigationLevel, campaignType });\r\n return `${prefix}-PageData`;\r\n};\r\n\r\n// This is not a pure function, we may need to clean up the preference store(set defualt value) if current preference is not valid\r\nexport const getCardPreferenceWithDefault = ({\r\n config,\r\n navigationLevel,\r\n campaignType,\r\n preference,\r\n permissions,\r\n}) => {\r\n const cardPreferenceKey = getCardPreferenceKey({\r\n cardTypeId: config.typeId,\r\n navigationLevel,\r\n campaignType,\r\n });\r\n let originCardPreference = getPreference({\r\n key: cardPreferenceKey,\r\n preference,\r\n });\r\n const defaultPreference = config.getDefaultPreference ? config.getDefaultPreference({\r\n permissions,\r\n }) : undefined;\r\n\r\n if (originCardPreference && _.isFunction(config.isPreferenceValid) && !config.isPreferenceValid({\r\n cardPreference: originCardPreference,\r\n permissions,\r\n campaignType,\r\n })) {\r\n originCardPreference = null;\r\n if (defaultPreference) {\r\n const patchPreference = getPreferencePatcher({\r\n key: cardPreferenceKey,\r\n preference,\r\n });\r\n patchPreference(defaultPreference);\r\n }\r\n }\r\n\r\n const cardPreference = (originCardPreference || defaultPreference)\r\n ? _.defaults(originCardPreference, defaultPreference)\r\n : undefined;\r\n\r\n return cardPreference;\r\n};\r\n\r\nexport const getCardPreferenceOptionsForDfm = ({\r\n config,\r\n navigationLevel,\r\n campaignType,\r\n preference,\r\n permissions,\r\n}) => {\r\n const cardPreference = getCardPreferenceWithDefault({\r\n config,\r\n navigationLevel,\r\n campaignType,\r\n preference,\r\n permissions,\r\n });\r\n\r\n let options = cardPreference;\r\n if (options && config.getDfmPreferenceObject) {\r\n options = config.getDfmPreferenceObject(cardPreference);\r\n }\r\n\r\n return {\r\n id: config.typeId,\r\n options,\r\n };\r\n};\r\n","import {\r\n allMetrics as metrics,\r\n metricToDisplayNameMap,\r\n defaultGridColumns,\r\n AccountsMode,\r\n} from '@bingads-webui-campaign/overview-cards-common';\r\n\r\nconst ComparisonValues = {\r\n PerformanceMetrics: 'PerformanceMetrics',\r\n PerformanceMetricsChange: 'PerformanceMetricsChange',\r\n PerformanceMetricsChangePercentage: 'PerformanceMetricsChangePercentage',\r\n};\r\n\r\nexport const getHeaderPropsFromPreferenceForPerformanceTable = ({\r\n cardPreference,\r\n patchPreference,\r\n i18n,\r\n dateRange,\r\n}) => {\r\n const initialSelectedValue = (cardPreference && cardPreference.selectedComparisonValue) || ComparisonValues.PerformanceMetrics;\r\n if (!dateRange.compared) {\r\n return { options: [], initialSelectedValue };\r\n }\r\n return ({\r\n options: [\r\n {\r\n value: ComparisonValues.PerformanceMetrics,\r\n displayName: i18n.getString(_TL_('Value')),\r\n },\r\n {\r\n value: ComparisonValues.PerformanceMetricsChange,\r\n displayName: i18n.getString(_TL_('Change')),\r\n },\r\n {\r\n value: ComparisonValues.PerformanceMetricsChangePercentage,\r\n displayName: i18n.getString(_TL_('Change %')),\r\n },\r\n ],\r\n initialSelectedValue,\r\n onOptionSelected: (value) => {\r\n patchPreference({\r\n selectedComparisonValue: value,\r\n });\r\n },\r\n });\r\n};\r\n\r\nexport const getTablePropsFromPreferenceForPerformanceTable = ({\r\n cardPreference,\r\n patchPreference,\r\n permissions,\r\n navigationLevel,\r\n i18n,\r\n campaignType,\r\n}) => {\r\n const selectedColumns = (cardPreference && cardPreference.selectedColumns) || defaultGridColumns;\r\n const allMetrics = metrics(permissions, AccountsMode.Expert, campaignType).map(metric => ({\r\n key: metric,\r\n displayName: i18n.getString(metricToDisplayNameMap[metric]),\r\n }));\r\n const initialSelectedMetrics = selectedColumns.map(column => allMetrics.find(metric => metric.key === column));\r\n return {\r\n initialSelectedMetrics,\r\n allMetrics,\r\n initialSortColumn: (cardPreference && cardPreference.sortColumn) || selectedColumns[0],\r\n initialSortDirection: (cardPreference && cardPreference.sortDirection) || 'descending',\r\n patchPreference,\r\n navigationLevel,\r\n campaignType,\r\n };\r\n};\r\n\r\nfunction isNullOrUndefined(value) {\r\n return value == null; // This covers both null and undefined\r\n}\r\n\r\nexport const isTablePreferenceValid = ({\r\n cardPreference,\r\n permissions,\r\n campaignType,\r\n}) => {\r\n const metricsKeys = metrics(permissions, AccountsMode.Expert, campaignType);\r\n if (!cardPreference\r\n || (!isNullOrUndefined(cardPreference.selectedColumns) && cardPreference.selectedColumns.length !== 3)\r\n || (!isNullOrUndefined(cardPreference.selectedColumns) && cardPreference.selectedColumns.some(column => !metricsKeys.includes(column)))\r\n || (!isNullOrUndefined(cardPreference.selectedComparisonValue) && !Object.values(ComparisonValues).includes(cardPreference.selectedComparisonValue))\r\n || (!isNullOrUndefined(cardPreference.sortColumn) && !metricsKeys.includes(cardPreference.sortColumn))\r\n || (!isNullOrUndefined(cardPreference.sortDirection) && (cardPreference.sortDirection !== 'descending' && cardPreference.sortDirection !== 'ascending'))\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nexport const getDefaultPerformanceTablePreference = () => ({\r\n selectedColumns: defaultGridColumns,\r\n sortColumn: defaultGridColumns[0],\r\n sortDirection: 'descending',\r\n selectedComparisonValue: ComparisonValues.PerformanceMetrics,\r\n});\r\n\r\nexport const getDfmPreferenceObjectForPerformanceTable = cardPreference => ({\r\n columns: cardPreference.selectedColumns,\r\n orderby: cardPreference.sortColumn,\r\n direction: cardPreference.sortDirection === 'descending' ? -1 : 1,\r\n selectedMenuItem: cardPreference.selectedComparisonValue,\r\n});\r\n\r\n","import _ from 'underscore';\r\nimport { useMemo, useCallback, useState } from 'react';\r\n\r\nimport { CampaignType as AccountLevelCampaignType } from '@bingads-webui-campaign/campaign-ui-common';\r\n\r\nimport { getPreference, getPreferencePatcher, getPagePreferenceKey } from './preference-helper';\r\n\r\nconst CampaignLevelCampaignType = _.mapObject(AccountLevelCampaignType, (val, key) => key);\r\n\r\nfunction fetchDashboardId({\r\n preference, campaignType, navigationLevel, serverContext,\r\n}) {\r\n const name = 'default';\r\n const preferenceData = preference.findByNameAtUserLevel('AccountsOverviewAccountMode');\r\n if ((preferenceData && preferenceData.Data === 'smart') || serverContext.CurrentCustomer.HasExpertAccount === false) {\r\n return `${name}-${navigationLevel}-smart`;\r\n } else if (campaignType === CampaignLevelCampaignType.Hotel || campaignType === AccountLevelCampaignType.Hotel) {\r\n return `${name}-${navigationLevel}-hotel`;\r\n } else if (campaignType === CampaignLevelCampaignType.PerformanceMax || campaignType === AccountLevelCampaignType.PerformanceMax) {\r\n return `${name}-${navigationLevel}-performancemax`;\r\n } else if (campaignType === CampaignLevelCampaignType.App || campaignType === AccountLevelCampaignType.App) {\r\n return `${name}-${navigationLevel}-app`;\r\n }\r\n return `${name}-${navigationLevel}`;\r\n}\r\n\r\nfunction getLegacyPreference({\r\n preference, campaignType, navigationLevel, serverContext,\r\n}) {\r\n const prefs = navigationLevel === 'customer' ? preference.findByNameAtUserLevel('accountsDashboard/preferences') : preference.findByNameAtAccountLevel('dashboard/preferences');\r\n const dashboardId = fetchDashboardId({\r\n preference, campaignType, navigationLevel, serverContext,\r\n });\r\n return _.get(prefs, ['Data', dashboardId, 'cards']);\r\n}\r\n\r\nfunction getAvailableCardsConfigs({\r\n cardsConfigs,\r\n navigationLevel,\r\n campaignType,\r\n isSDK,\r\n}) {\r\n return _.filter(cardsConfigs, cardConfig => cardsConfigs.isValidForNavigationLevel(cardConfig, navigationLevel, campaignType, isSDK));\r\n}\r\n\r\nfunction getSelectedCardsConfigs({\r\n availableCardsConfigs,\r\n selectedCards,\r\n}) {\r\n if (_.isArray(selectedCards)) {\r\n return _.filter(availableCardsConfigs, cardConfig => !_.get(_.find(selectedCards, sc => sc.id === cardConfig.typeId), 'hidden'));\r\n }\r\n return availableCardsConfigs;\r\n}\r\n\r\nexport function getInitSelectedCardsConfig({\r\n preference,\r\n cardsConfigs,\r\n navigationLevel,\r\n campaignType,\r\n serverContext,\r\n isSDK,\r\n}) {\r\n const pagePreferenceKey = getPagePreferenceKey({\r\n navigationLevel,\r\n campaignType,\r\n });\r\n const pagePreference = getPreference({\r\n key: pagePreferenceKey,\r\n preference,\r\n }) || {};\r\n\r\n const legacyCardSelectionPreference = getLegacyPreference({\r\n preference, campaignType, navigationLevel, serverContext,\r\n });\r\n\r\n const selectedCards = pagePreference.selectedCards || legacyCardSelectionPreference;\r\n\r\n const availableCardsConfigs = getAvailableCardsConfigs({\r\n cardsConfigs,\r\n navigationLevel,\r\n campaignType,\r\n isSDK,\r\n });\r\n\r\n const selectedCardsConfigs = getSelectedCardsConfigs({\r\n availableCardsConfigs,\r\n selectedCards,\r\n });\r\n\r\n return selectedCardsConfigs;\r\n}\r\n\r\nexport const useSelectedCardsWithPreference = ({\r\n preference,\r\n cardsConfigs,\r\n navigationLevel,\r\n campaignType,\r\n serverContext,\r\n isLoadingWelcomeCardConfig,\r\n isSDK,\r\n}) => {\r\n const pagePreferenceKey = getPagePreferenceKey({\r\n navigationLevel,\r\n campaignType,\r\n });\r\n\r\n const pagePreference = useMemo(() => getPreference({\r\n key: pagePreferenceKey,\r\n preference,\r\n }) || {}, [pagePreferenceKey, preference]);\r\n\r\n const patchPagePreference = useMemo(() => getPreferencePatcher({\r\n key: pagePreferenceKey,\r\n preference,\r\n }), [pagePreferenceKey, preference]);\r\n\r\n const { selectedCards: initSelectedCards } = pagePreference;\r\n const legacyCardSelectionPreference = getLegacyPreference({\r\n preference, campaignType, navigationLevel, serverContext,\r\n });\r\n const [selectedCards, setSelectedCards] = useState(initSelectedCards || legacyCardSelectionPreference);\r\n\r\n const availableCardsConfigs = useMemo(\r\n () => getAvailableCardsConfigs({\r\n cardsConfigs,\r\n navigationLevel,\r\n campaignType,\r\n isSDK,\r\n }),\r\n [campaignType, cardsConfigs, navigationLevel, isSDK]\r\n );\r\n\r\n const selectedCardsConfigs = useMemo(() => getSelectedCardsConfigs({\r\n availableCardsConfigs,\r\n selectedCards,\r\n }), [availableCardsConfigs, selectedCards]);\r\n\r\n const cardSelectionCards = useMemo(() => {\r\n if (!_.isArray(selectedCards)) {\r\n return _.map(availableCardsConfigs, cardConfig => ({ id: cardConfig.typeId, hidden: false }));\r\n }\r\n return _.map(availableCardsConfigs, cardConfig => ({ id: cardConfig.typeId, hidden: _.get(_.find(selectedCards, sc => sc.id === cardConfig.typeId), 'hidden') }));\r\n }, [availableCardsConfigs, selectedCards]);\r\n\r\n const onCardSelectionSaved = useCallback((selectionToSave) => {\r\n patchPagePreference({ selectedCards: selectionToSave });\r\n setSelectedCards(selectionToSave);\r\n }, [patchPagePreference]);\r\n\r\n if (isLoadingWelcomeCardConfig) {\r\n return {\r\n selectedCardsConfigs: [],\r\n cardSelectionCards: [],\r\n onCardSelectionSaved: _.noop,\r\n };\r\n }\r\n\r\n return {\r\n selectedCardsConfigs,\r\n cardSelectionCards,\r\n onCardSelectionSaved,\r\n };\r\n};\r\n","import _ from 'underscore';\r\n\r\nimport { allMetrics, defaultMetrics, AccountsMode } from '@bingads-webui-campaign/overview-cards-common';\r\n\r\nconst validMetricIndexes = [0, 1, 2, 3];\r\nconst defaultSelectedMetricIndexes = [0, 1];\r\n\r\nexport const getDefaultPerformanceChartPreference = ({\r\n permissions,\r\n}) => ({\r\n selectedMetricIndexes: defaultSelectedMetricIndexes,\r\n metrics: defaultMetrics(permissions, 1),\r\n});\r\n\r\nexport const getPropsFromPreferenceForPerformanceChart = ({\r\n cardPreference,\r\n patchPreference,\r\n campaignType,\r\n}) => {\r\n const shellContentElement = document.querySelector('.app-shell-content');\r\n\r\n return {\r\n ...cardPreference,\r\n patchPreference,\r\n shellContentElement,\r\n campaignType,\r\n };\r\n};\r\n\r\nexport const isPerformanceChartPreferenceValid = ({\r\n cardPreference,\r\n permissions,\r\n campaignType,\r\n}) => {\r\n const availableMetricKeys = allMetrics(permissions, AccountsMode.Expert, campaignType);\r\n if (!cardPreference\r\n || !_.isArray(cardPreference.metrics)\r\n || _.some(cardPreference.metrics, metric => !availableMetricKeys.includes(metric))\r\n || cardPreference.metrics.length !== 4\r\n || !_.isArray(cardPreference.selectedMetricIndexes)\r\n || cardPreference.selectedMetricIndexes.length > 4\r\n || _.some(cardPreference.selectedMetricIndexes, index => !validMetricIndexes.includes(index))\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n","import _ from 'underscore';\r\n\r\nimport { TopChangesFilterOption } from '@bingads-webui-campaign/overview-cards-common';\r\n\r\nconst defaultSelectedMetric = 'Clicks';\r\n\r\nexport const getTopChangesAllMetrics = i18n => ([{\r\n key: 'Clicks',\r\n displayName: i18n.getString(_TL_('Clicks')),\r\n}, {\r\n key: 'Impressions',\r\n displayName: i18n.getString(_TL_('Impressions')),\r\n}, {\r\n key: 'CTR',\r\n displayName: i18n.getString(_TL_('CTR')),\r\n}, {\r\n key: 'Spend',\r\n displayName: i18n.getString(_TL_('Spend')),\r\n}, {\r\n key: 'AverageCPC',\r\n displayName: i18n.getString(_TL_('Avg. CPC')),\r\n}, {\r\n key: 'PartialConversionCPA',\r\n displayName: i18n.getString(_TL_('Conv.')),\r\n}, {\r\n key: 'PartialConversionRate',\r\n displayName: i18n.getString(_TL_('Conv. Rate')),\r\n}]);\r\n\r\nexport function getPropsForTopChanges({\r\n navigationLevel,\r\n cardPreference,\r\n patchPreference,\r\n i18n,\r\n campaignType,\r\n}) {\r\n const allMetrics = getTopChangesAllMetrics(i18n);\r\n let preferenceFromServer = _.get(cardPreference, 'metric');\r\n if (!_.isString(preferenceFromServer)\r\n || !allMetrics.some(metric => metric.key === preferenceFromServer)\r\n ) {\r\n preferenceFromServer = defaultSelectedMetric;\r\n }\r\n\r\n return {\r\n preferenceFromServer,\r\n patchPreference,\r\n navigationLevel,\r\n campaignType,\r\n };\r\n}\r\n\r\nexport const getHeaderPropsFromPreferenceForTopChanges = ({\r\n cardPreference,\r\n patchPreference,\r\n i18n,\r\n}) => ({\r\n options: [\r\n {\r\n value: TopChangesFilterOption.AllChanges,\r\n displayName: i18n.getString(_TL_('All changes')),\r\n },\r\n {\r\n value: TopChangesFilterOption.TopGainers,\r\n displayName: i18n.getString(_TL_('Top gainers')),\r\n },\r\n {\r\n value: TopChangesFilterOption.TopDecliners,\r\n displayName: i18n.getString(_TL_('Top decliners')),\r\n },\r\n {\r\n value: TopChangesFilterOption.Insights,\r\n displayName: i18n.getString(_TL_('Insights')),\r\n },\r\n ],\r\n initialSelectedValue: (cardPreference && cardPreference.filter) || TopChangesFilterOption.AllChanges,\r\n onOptionSelected: (value) => {\r\n patchPreference({\r\n filter: value,\r\n });\r\n },\r\n});\r\n\r\nexport const getDfmPreferenceObjectForTopChanges = cardPreference => ({\r\n metric: cardPreference.metric,\r\n selectedMenuItem: cardPreference.filter,\r\n});\r\n\r\nexport const getDefaultTopChangesPreference = () => ({\r\n filter: TopChangesFilterOption.AllChanges,\r\n metric: defaultSelectedMetric,\r\n});\r\n","import {\r\n allMetrics as metrics,\r\n metricToDisplayNameMap,\r\n defaultGridColumns,\r\n} from '@bingads-webui-campaign/overview-cards-common';\r\n\r\nexport const getTablePropsFromPreferenceForDevices = ({\r\n cardPreference,\r\n patchPreference,\r\n permissions,\r\n navigationLevel,\r\n campaignType,\r\n i18n,\r\n}) => {\r\n const selectedColumns = (cardPreference && cardPreference.selectedColumns) || defaultGridColumns;\r\n const allMetrics = metrics(permissions, 1, campaignType).map(metric => ({\r\n key: metric,\r\n displayName: i18n.getString(metricToDisplayNameMap[metric]),\r\n }));\r\n const initialSelectedMetrics = selectedColumns.map(column => allMetrics.find(metric => metric.key === column));\r\n\r\n return {\r\n initialSelectedMetrics,\r\n allMetrics,\r\n patchPreference,\r\n navigationLevel,\r\n campaignType,\r\n };\r\n};\r\n\r\nexport const isDevicePreferenceValid = ({\r\n cardPreference,\r\n permissions,\r\n campaignType,\r\n}) => {\r\n const metricsKeys = metrics(permissions, 1, campaignType);\r\n if (!cardPreference\r\n || cardPreference.selectedColumns.length !== 3\r\n || cardPreference.selectedColumns.some(column => !metricsKeys.includes(column))\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nexport const getDefaultDevicePreference = () => ({\r\n selectedColumns: defaultGridColumns,\r\n});\r\n","import _ from 'underscore';\r\nimport { CampaignType as AccountLevelCampaignType } from '@bingads-webui-campaign/campaign-ui-common';\r\nimport { CardSize } from '@bingads-webui-campaign-react/overview-card-const';\r\nimport edm from '@bingads-webui-component-legacy/edm-campaign/index';\r\n\r\nimport {\r\n cardWelcomeTipsId,\r\n cardPerformanceId,\r\n cardDiagnosticId,\r\n cardAssetPerformanceId,\r\n cardRecommendationsId,\r\n cardTopCampaignsId,\r\n cardTopAccountsId,\r\n cardTopKeywordsId,\r\n cardDeviceId,\r\n cardSearchTermsId,\r\n cardCompetitionId,\r\n cardTopAdGroupsId,\r\n cardConversionTrackingId,\r\n cardTopLocationsId,\r\n cardTopChangesAccountId,\r\n cardTopChangesCampaignId,\r\n cardTopChangesAdGroupId,\r\n cardNavigateToFullProductId,\r\n} from '@bingads-webui-campaign/fluent-page-consts';\r\n\r\nimport {\r\n getDfmPreferenceObjectForPerformanceTable,\r\n getDefaultPerformanceTablePreference,\r\n isTablePreferenceValid,\r\n} from '../preference/card-preference/performance-table';\r\n\r\nimport {\r\n getDefaultPerformanceChartPreference,\r\n isPerformanceChartPreferenceValid,\r\n} from '../preference/card-preference/performance-chart';\r\n\r\nimport {\r\n getDfmPreferenceObjectForTopChanges,\r\n getDefaultTopChangesPreference,\r\n} from '../preference/card-preference/top-changes';\r\n\r\nimport {\r\n getDefaultDevicePreference,\r\n isDevicePreferenceValid,\r\n} from '../preference/card-preference/devices';\r\n\r\nconst CampaignLevelCampaignType = _.mapObject(AccountLevelCampaignType, (val, key) => key);\r\n\r\nfunction getCardOptions({\r\n navigationLevel,\r\n campaignType,\r\n isKeyword = false,\r\n isSearchTerm = false,\r\n}) {\r\n let edmLevel;\r\n let entitySet;\r\n let targetNagivationLevel = navigationLevel;\r\n let extraFilter;\r\n\r\n switch (navigationLevel) {\r\n case 'account':\r\n edmLevel = edm.currentAccount;\r\n entitySet = edmLevel.Campaigns;\r\n break;\r\n case 'campaign':\r\n // For PMax and App campaign, call campaigns on account level with filter by Campaign Id to include BI data for both AssetGroups and AdGroups before migration.\r\n if (campaignType === CampaignLevelCampaignType.PerformanceMax || campaignType === CampaignLevelCampaignType.App) {\r\n targetNagivationLevel = 'account';\r\n edmLevel = edm.currentAccount;\r\n entitySet = edmLevel.Campaigns;\r\n extraFilter = [{\r\n filter: {\r\n key: 'CampaignId',\r\n value: {\r\n query: {\r\n Id: _.result(edm.currentCampaign, ['navigation', 'key']),\r\n },\r\n },\r\n },\r\n }];\r\n } else {\r\n edmLevel = edm.currentCampaign;\r\n entitySet = edmLevel.AdGroups;\r\n }\r\n break;\r\n case 'customer':\r\n edmLevel = edm.currentCustomer;\r\n entitySet = edmLevel.Accounts;\r\n break;\r\n default:\r\n edmLevel = undefined;\r\n }\r\n\r\n if (isKeyword) {\r\n return {\r\n entitySet: edmLevel.Keywords,\r\n navigationLevel,\r\n };\r\n }\r\n\r\n if (isSearchTerm) {\r\n return {\r\n entitySet: edmLevel.SearchTerms,\r\n navigationLevel,\r\n };\r\n }\r\n\r\n return {\r\n entitySet,\r\n navigationLevel: targetNagivationLevel,\r\n extraFilter,\r\n };\r\n}\r\n\r\nfunction getCustomerLevelDataEntitySetOptions() {\r\n return getCardOptions({\r\n navigationLevel: 'customer',\r\n });\r\n}\r\n\r\nfunction getAccountLevelDataEntitySetOptions() {\r\n return getCardOptions({\r\n navigationLevel: 'account',\r\n });\r\n}\r\n\r\nfunction getTopKeywordCardOptions(navigationLevel) {\r\n return getCardOptions({\r\n navigationLevel,\r\n isKeyword: true,\r\n });\r\n}\r\n\r\nfunction getSearchTermCardOptions(navigationLevel) {\r\n return getCardOptions({\r\n navigationLevel,\r\n isSearchTerm: true,\r\n });\r\n}\r\n\r\nfunction getCampaignLevelDataEntitySetOptions() {\r\n return getCardOptions({\r\n navigationLevel: 'campaign',\r\n });\r\n}\r\n\r\nexport function getFluentCardsConfigs({ permissions, showWelcomeTips = false, isMobileAppCampaign = false }) {\r\n const audienceUnderspendShowTile = _.get(permissions, 'dynamic.AudienceUnderspendShowTile', false);\r\n\r\n const defaultHiddenCampaignTypes = [\r\n CampaignLevelCampaignType.None,\r\n CampaignLevelCampaignType.Default,\r\n CampaignLevelCampaignType.Shopping,\r\n CampaignLevelCampaignType.DynamicSearchAds,\r\n CampaignLevelCampaignType.Audience,\r\n CampaignLevelCampaignType.Smart,\r\n CampaignLevelCampaignType.Hotel,\r\n CampaignLevelCampaignType.App,\r\n CampaignLevelCampaignType.LinkedIn,\r\n ];\r\n\r\n const diagnosticCardDefaultHiddenCampaignTypesFiltered = audienceUnderspendShowTile ? _.without(defaultHiddenCampaignTypes, CampaignLevelCampaignType.Audience) : defaultHiddenCampaignTypes;\r\n const diagnosticCardForMobileAppCampaignsFiltered = diagnosticCardDefaultHiddenCampaignTypesFiltered.filter(type => type !== CampaignLevelCampaignType.App);\r\n\r\n const cardsConfig = showWelcomeTips ? [\r\n {\r\n validFor: ['account'],\r\n typeId: cardWelcomeTipsId,\r\n name: _TL_('Tips'),\r\n size: CardSize.Small,\r\n getEntitySetOptions: getCardOptions,\r\n enabled: true,\r\n },\r\n ] :\r\n // Order matters in this array, as this will be the default order of the cards in the dashboard\r\n // When we need to add a new config here, please refer to old overview page to get the correct position in this array\r\n // If we need to add a new card, please check with PM/Designer to get the correct position\r\n [\r\n {\r\n typeId: cardPerformanceId,\r\n name: _TL_('Performance'),\r\n size: CardSize.Large,\r\n dynamicHeightForNarrow: true,\r\n getEntitySetOptions: getCardOptions,\r\n getDefaultPreference: getDefaultPerformanceChartPreference,\r\n isPreferenceValid: isPerformanceChartPreferenceValid,\r\n enabled: true,\r\n },\r\n {\r\n typeId: cardRecommendationsId,\r\n hideForCampaignType: [\r\n AccountLevelCampaignType.Hotel,\r\n AccountLevelCampaignType.App,\r\n AccountLevelCampaignType.LinkedIn,\r\n AccountLevelCampaignType.PerformanceMax,\r\n CampaignLevelCampaignType.Hotel,\r\n CampaignLevelCampaignType.App,\r\n CampaignLevelCampaignType.LinkedIn,\r\n CampaignLevelCampaignType.PerformanceMax,\r\n ],\r\n name: _TL_('Recommendations'),\r\n size: CardSize.Small,\r\n getEntitySetOptions: getCardOptions,\r\n enabled: true,\r\n },\r\n {\r\n validFor: ['campaign'],\r\n typeId: cardDiagnosticId,\r\n hideForCampaignType: isMobileAppCampaign ? diagnosticCardForMobileAppCampaignsFiltered : diagnosticCardDefaultHiddenCampaignTypesFiltered,\r\n name: _TL_('Diagnostic'),\r\n size: CardSize.Large,\r\n dynamicHeightForNarrow: true,\r\n enabled: true,\r\n },\r\n {\r\n validFor: ['account'],\r\n typeId: cardTopCampaignsId,\r\n name: _TL_('Campaigns'),\r\n size: CardSize.Small,\r\n getEntitySetOptions: getAccountLevelDataEntitySetOptions,\r\n getDfmPreferenceObject: getDfmPreferenceObjectForPerformanceTable,\r\n getDefaultPreference: getDefaultPerformanceTablePreference,\r\n isPreferenceValid: isTablePreferenceValid,\r\n enabled: true,\r\n },\r\n {\r\n validFor: ['campaign'],\r\n typeId: cardTopAdGroupsId,\r\n hideForCampaignType: [\r\n CampaignLevelCampaignType.PerformanceMax,\r\n CampaignLevelCampaignType.App,\r\n CampaignLevelCampaignType.LinkedIn,\r\n CampaignLevelCampaignType.PerformanceMax,\r\n ],\r\n name: _TL_('Ad groups'),\r\n size: CardSize.Small,\r\n getEntitySetOptions: getCampaignLevelDataEntitySetOptions,\r\n // Ad group table will not have DFM, but we need it's preference to send out performance chart\r\n // aggregated data request, so we need to use getDfmPreferenceObject to convert new preference\r\n // so that data interface (processGridTileOptions, getColumnAndOrder) in\r\n // overview-cards-common/src/fetch.js can recognize it.\r\n getDfmPreferenceObject: getDfmPreferenceObjectForPerformanceTable,\r\n getDefaultPreference: getDefaultPerformanceTablePreference,\r\n isPreferenceValid: isTablePreferenceValid,\r\n enabled: true,\r\n },\r\n {\r\n validFor: ['customer'],\r\n typeId: cardTopChangesAccountId,\r\n name: _TL_('Top changes: Accounts'),\r\n getEntitySetOptions: getCustomerLevelDataEntitySetOptions,\r\n enabled: true,\r\n size: CardSize.Small,\r\n },\r\n {\r\n validFor: ['account'],\r\n typeId: cardTopChangesCampaignId,\r\n hideForCampaignType: [AccountLevelCampaignType.App],\r\n name: _TL_('Top changes: Campaigns'),\r\n getEntitySetOptions: getAccountLevelDataEntitySetOptions,\r\n getDfmPreferenceObject: getDfmPreferenceObjectForTopChanges,\r\n getDefaultPreference: getDefaultTopChangesPreference,\r\n enabled: true,\r\n size: CardSize.Small,\r\n },\r\n {\r\n validFor: ['campaign'],\r\n typeId: cardTopChangesAdGroupId,\r\n hideForCampaignType: [\r\n CampaignLevelCampaignType.PerformanceMax,\r\n CampaignLevelCampaignType.App,\r\n CampaignLevelCampaignType.LinkedIn,\r\n CampaignLevelCampaignType.PerformanceMax,\r\n ],\r\n name: _TL_('Top changes: Ad groups'),\r\n getEntitySetOptions: getCampaignLevelDataEntitySetOptions,\r\n enabled: true,\r\n size: CardSize.Small,\r\n },\r\n {\r\n validFor: ['customer'],\r\n typeId: cardTopAccountsId,\r\n name: _TL_('Accounts'),\r\n getEntitySetOptions: getCustomerLevelDataEntitySetOptions,\r\n getDfmPreferenceObject: getDfmPreferenceObjectForPerformanceTable,\r\n getDefaultPreference: getDefaultPerformanceTablePreference,\r\n isPreferenceValid: isTablePreferenceValid,\r\n enabled: true,\r\n size: CardSize.Small,\r\n },\r\n {\r\n validFor: ['account', 'campaign'],\r\n typeId: cardConversionTrackingId,\r\n hideForCampaignType: [\r\n AccountLevelCampaignType.App,\r\n CampaignLevelCampaignType.None,\r\n CampaignLevelCampaignType.Default,\r\n CampaignLevelCampaignType.Shopping,\r\n CampaignLevelCampaignType.DynamicSearchAds,\r\n CampaignLevelCampaignType.Audience,\r\n CampaignLevelCampaignType.Smart,\r\n CampaignLevelCampaignType.Hotel,\r\n CampaignLevelCampaignType.App,\r\n CampaignLevelCampaignType.LinkedIn,\r\n CampaignLevelCampaignType.PerformanceMax,\r\n ],\r\n hideForCampaignTypeSDK: [\r\n AccountLevelCampaignType.App,\r\n CampaignLevelCampaignType.None,\r\n CampaignLevelCampaignType.Default,\r\n CampaignLevelCampaignType.Shopping,\r\n CampaignLevelCampaignType.DynamicSearchAds,\r\n CampaignLevelCampaignType.Audience,\r\n CampaignLevelCampaignType.Smart,\r\n CampaignLevelCampaignType.Hotel,\r\n CampaignLevelCampaignType.App,\r\n CampaignLevelCampaignType.LinkedIn,\r\n ],\r\n name: _TL_('Conversion Tracking'),\r\n size: CardSize.Small,\r\n getEntitySetOptions: getAccountLevelDataEntitySetOptions,\r\n enabled: true,\r\n },\r\n {\r\n validFor: ['account', 'campaign'],\r\n typeId: cardTopKeywordsId,\r\n hideForCampaignType: [\r\n AccountLevelCampaignType.Hotel,\r\n AccountLevelCampaignType.PerformanceMax,\r\n AccountLevelCampaignType.App,\r\n AccountLevelCampaignType.LinkedIn,\r\n AccountLevelCampaignType.PerformanceMax,\r\n AccountLevelCampaignType.Audience,\r\n AccountLevelCampaignType.Shopping,\r\n CampaignLevelCampaignType.Hotel,\r\n CampaignLevelCampaignType.PerformanceMax,\r\n CampaignLevelCampaignType.App,\r\n CampaignLevelCampaignType.LinkedIn,\r\n CampaignLevelCampaignType.PerformanceMax,\r\n CampaignLevelCampaignType.Audience,\r\n CampaignLevelCampaignType.Shopping,\r\n ],\r\n name: _TL_('Keywords'),\r\n size: CardSize.Small,\r\n getEntitySetOptions: getTopKeywordCardOptions,\r\n getDfmPreferenceObject: getDfmPreferenceObjectForPerformanceTable,\r\n getDefaultPreference: getDefaultPerformanceTablePreference,\r\n isPreferenceValid: isTablePreferenceValid,\r\n enabled: true,\r\n },\r\n {\r\n validFor: ['account', 'campaign'],\r\n typeId: cardSearchTermsId,\r\n hideForCampaignType: [\r\n AccountLevelCampaignType.Hotel,\r\n AccountLevelCampaignType.PerformanceMax,\r\n AccountLevelCampaignType.App,\r\n AccountLevelCampaignType.LinkedIn,\r\n AccountLevelCampaignType.Audience,\r\n CampaignLevelCampaignType.Hotel,\r\n CampaignLevelCampaignType.PerformanceMax,\r\n CampaignLevelCampaignType.App,\r\n CampaignLevelCampaignType.LinkedIn,\r\n CampaignLevelCampaignType.Audience,\r\n ],\r\n name: _TL_('What people searched'),\r\n size: CardSize.Small,\r\n getEntitySetOptions: getSearchTermCardOptions,\r\n getDfmPreferenceObject: getDfmPreferenceObjectForPerformanceTable,\r\n getDefaultPreference: getDefaultPerformanceTablePreference,\r\n isPreferenceValid: isTablePreferenceValid,\r\n enabled: true,\r\n },\r\n {\r\n typeId: cardDeviceId,\r\n hideForCampaignType: [\r\n AccountLevelCampaignType.PerformanceMax,\r\n AccountLevelCampaignType.App,\r\n AccountLevelCampaignType.LinkedIn,\r\n CampaignLevelCampaignType.PerformanceMax,\r\n CampaignLevelCampaignType.App,\r\n CampaignLevelCampaignType.LinkedIn,\r\n ],\r\n name: _TL_('Devices'),\r\n size: CardSize.Small,\r\n getEntitySetOptions: getCardOptions,\r\n getDefaultPreference: getDefaultDevicePreference,\r\n isPreferenceValid: isDevicePreferenceValid,\r\n enabled: true,\r\n },\r\n {\r\n validFor: ['campaign'],\r\n typeId: cardTopLocationsId,\r\n hideForCampaignType: [\r\n CampaignLevelCampaignType.App,\r\n CampaignLevelCampaignType.LinkedIn,\r\n ],\r\n name: _TL_('Top Locations'),\r\n size: CardSize.Small,\r\n getEntitySetOptions: getCardOptions,\r\n enabled: true,\r\n },\r\n {\r\n validFor: ['campaign'],\r\n typeId: cardAssetPerformanceId,\r\n hideForCampaignType: isMobileAppCampaign ? defaultHiddenCampaignTypes.filter(type => type !== CampaignLevelCampaignType.App) : defaultHiddenCampaignTypes,\r\n name: _TL_('Asset Performance'),\r\n size: CardSize.Small,\r\n enabled: true,\r\n },\r\n {\r\n validFor: ['account', 'campaign'],\r\n typeId: cardCompetitionId,\r\n name: _TL_('Competition'),\r\n size: CardSize.Small,\r\n hideForCampaignType: [\r\n AccountLevelCampaignType.Hotel,\r\n AccountLevelCampaignType.PerformanceMax,\r\n AccountLevelCampaignType.App,\r\n AccountLevelCampaignType.LinkedIn,\r\n CampaignLevelCampaignType.Hotel,\r\n CampaignLevelCampaignType.PerformanceMax,\r\n CampaignLevelCampaignType.App,\r\n CampaignLevelCampaignType.LinkedIn,\r\n ],\r\n getEntitySetOptions: getCardOptions,\r\n enabled: true,\r\n },\r\n {\r\n validFor: ['campaign'],\r\n typeId: cardNavigateToFullProductId,\r\n name: _TL_(''),\r\n size: CardSize.Small,\r\n enabled: true,\r\n hideForCampaignType: [\r\n CampaignLevelCampaignType.None,\r\n CampaignLevelCampaignType.Default,\r\n CampaignLevelCampaignType.Shopping,\r\n CampaignLevelCampaignType.DynamicSearchAds,\r\n CampaignLevelCampaignType.Audience,\r\n CampaignLevelCampaignType.Smart,\r\n CampaignLevelCampaignType.Hotel,\r\n CampaignLevelCampaignType.App,\r\n CampaignLevelCampaignType.LinkedIn,\r\n CampaignLevelCampaignType.PerformanceMax,\r\n ],\r\n hideForCampaignTypeSDK: [\r\n CampaignLevelCampaignType.None,\r\n CampaignLevelCampaignType.Default,\r\n CampaignLevelCampaignType.Shopping,\r\n CampaignLevelCampaignType.DynamicSearchAds,\r\n CampaignLevelCampaignType.Audience,\r\n CampaignLevelCampaignType.Smart,\r\n CampaignLevelCampaignType.Hotel,\r\n CampaignLevelCampaignType.App,\r\n CampaignLevelCampaignType.LinkedIn,\r\n ],\r\n },\r\n ];\r\n\r\n cardsConfig.isValidForNavigationLevel = (cardConfig, navigationLevel, campaignType, isSDK = false) =>\r\n ((_.isFunction(cardConfig.enabled) && cardConfig.enabled()) ||\r\n (_.isBoolean(cardConfig.enabled) && cardConfig.enabled)) &&\r\n (!cardConfig.validFor || _.contains(cardConfig.validFor, navigationLevel)) &&\r\n (((!isSDK || !cardConfig.hideForCampaignTypeSDK) &&\r\n (!cardConfig.hideForCampaignType || !_.contains(cardConfig.hideForCampaignType, campaignType)))\r\n || (isSDK && cardConfig.hideForCampaignTypeSDK && !_.contains(cardConfig.hideForCampaignTypeSDK, campaignType)));\r\n\r\n return cardsConfig;\r\n}\r\n","import edm from '@bingads-webui-component-legacy/edm-campaign/index';\r\n\r\nexport const NavigationLevel = {\r\n Customer: 'customer',\r\n Account: 'account',\r\n Campaign: 'campaign',\r\n};\r\n\r\nexport function getNavigationLevel(scopeValues) {\r\n const {\r\n aid,\r\n campaignId,\r\n } = scopeValues;\r\n let result = NavigationLevel.Customer;\r\n if (campaignId) {\r\n result = NavigationLevel.Campaign;\r\n } else if (aid || edm.currentAccount) {\r\n result = NavigationLevel.Account;\r\n }\r\n\r\n return result;\r\n}\r\n","import { GetJsDataInfo } from '@bingads-webui-clientcenter/js-data-cc-rest-base';\r\n\r\nexport function getCcJsData({\r\n serverContext,\r\n}) {\r\n return GetJsDataInfo({\r\n cidFetcher: () => serverContext.CurrentCustomer.Id,\r\n uidFetcher: () => serverContext.CurrentUser.Id,\r\n willSupportCors: true,\r\n }, serverContext.Urls.ClientCenterBaseUrl, ['FeatureAdoptionCoupon']).jsDataCcRest;\r\n}\r\n","import _, { get } from 'underscore';\r\n\r\nimport { Constants } from '@bingads-webui-theme-2018/theme-fluent';\r\n\r\n// Global header + Shell status + Shell tab + Add/Remove tile button\r\nconst headerHeight = 60 + 56 + 58 + 50;\r\n// Shell nav + Shell scope panel\r\nconst sidebarWidth = 64 + 224;\r\nconst cardHeight = 389;\r\n\r\nexport const getResponsiveSize = containerWidth => _.chain(Constants.ResponsiveSizeBreakpoints)\r\n .filter(({ minWidth }) => containerWidth >= minWidth)\r\n .last()\r\n .get('name', 's')\r\n .value();\r\n\r\nexport const getResponsiveSizeBasedOnWindowSize = () => getResponsiveSize(window.innerWidth - sidebarWidth);\r\n\r\nconst getRowSize = () => Math.round((window.innerHeight - headerHeight) / cardHeight);\r\nconst getColumnSize = () => {\r\n const responsiveSize = getResponsiveSizeBasedOnWindowSize();\r\n if (responsiveSize === 'xxl') {\r\n return 3;\r\n } else if (responsiveSize === 'xl') {\r\n return 2;\r\n }\r\n return 1;\r\n};\r\n\r\nexport const getViewPortCardsCount = (selectedCardsConfig) => {\r\n const columnSize = getColumnSize();\r\n const responsiveSize = getResponsiveSizeBasedOnWindowSize();\r\n const selectedCardSize = selectedCardsConfig.length;\r\n\r\n let remainingRowSize = getRowSize();\r\n let remainingColumnSize = getColumnSize();\r\n for (let i = 0; i < selectedCardSize; i += 1) {\r\n const card = selectedCardsConfig[i];\r\n let cardSize = 1;\r\n if (card.size === 'large' && (responsiveSize === 'xxl' || responsiveSize === 'xl')) {\r\n cardSize = 2;\r\n }\r\n if (remainingColumnSize >= cardSize) {\r\n remainingColumnSize -= cardSize;\r\n } else {\r\n remainingRowSize -= 1;\r\n if (remainingRowSize <= 0) {\r\n return i;\r\n }\r\n remainingColumnSize = columnSize - cardSize;\r\n }\r\n }\r\n\r\n return selectedCardSize;\r\n};\r\n\r\nexport const isInViewPort = (cardIds, id, viewPortSize) => {\r\n const index = cardIds.indexOf(id);\r\n return index < viewPortSize && index >= 0;\r\n};\r\n","import _ from 'underscore';\r\nimport Promise from 'bluebird';\r\nimport { levelAtConstant } from '@bingads-webui-campaign/scope-constants';\r\nimport {\r\n RecommendationService,\r\n CHANNEL_TYPES,\r\n getRecommendationIds,\r\n} from '@bingads-webui-campaign/recommendation-core';\r\nimport { edmCampaign } from '@bingads-webui/edm-campaign';\r\n\r\nconst RECOMMENDATION_SUMMARY_TOP_NUMBER = 5;\r\nlet p$Opportunities = null;\r\n\r\nexport function fetchTips({\r\n cid,\r\n aid,\r\n}) {\r\n if (!aid || !cid) {\r\n return Promise.resolve([]);\r\n }\r\n\r\n return edmCampaign\r\n .Customers\r\n .$withKey(cid)\r\n .Accounts\r\n .$withKey(aid)\r\n .Tips\r\n .get({\r\n top: 20,\r\n count: true,\r\n })\r\n .toPromise()\r\n .then(({ value }) => value);\r\n}\r\n\r\nconst schema = {\r\n scenario: [\r\n {\r\n name: 'loadRecommendationTile',\r\n value: 'LoadRecommendationTab',\r\n setting: {},\r\n activity: [\r\n {\r\n name: 'loadRecommendationTile',\r\n value: 'LoadRecommendationTile',\r\n },\r\n {\r\n name: 'getSummary',\r\n value: 'getSummary',\r\n },\r\n {\r\n name: 'getCoupons',\r\n value: 'getCoupons',\r\n },\r\n ],\r\n },\r\n ],\r\n};\r\n\r\nexport function getScope({\r\n navigationLevel,\r\n legacyConfig,\r\n cid,\r\n aid,\r\n campaignId,\r\n}) {\r\n let levelAt;\r\n let entityIds;\r\n\r\n switch (navigationLevel) {\r\n case 'account':\r\n levelAt = levelAtConstant.ACCOUNT;\r\n entityIds = [aid];\r\n break;\r\n case 'campaign':\r\n levelAt = levelAtConstant.CAMPAIGN;\r\n entityIds = [campaignId];\r\n break;\r\n case 'customer':\r\n levelAt = levelAtConstant.CUSTOMER;\r\n entityIds = [cid];\r\n break;\r\n default:\r\n }\r\n\r\n const scope = {\r\n customerId: cid,\r\n accountId: aid,\r\n campaignId,\r\n campaignName: _.result(legacyConfig.get('CurrentCampaign'), 'Name'),\r\n token: legacyConfig.get('Token'),\r\n levelAt,\r\n entityIds,\r\n };\r\n\r\n return scope;\r\n}\r\n\r\nexport function fetchMCCOverviewRecommendations({\r\n entitySet,\r\n jsdata,\r\n permissions,\r\n}) {\r\n const isMCC = true;\r\n const multiAccountRecommendationParameters = {\r\n RecommendationTypes: getRecommendationIds(undefined, CHANNEL_TYPES.MCCOVERVIEW, permissions, isMCC),\r\n };\r\n\r\n const query = {\r\n entitySet: entitySet['Default.MultiAccountRecommendation'].$call({ multiAccountRecommendationParameters }).toJSON(),\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 fetchRecommendations({\r\n navigationLevel,\r\n featureInstrumentation,\r\n legacyConfig,\r\n permissions,\r\n serverContext,\r\n campaignType,\r\n ccJsData,\r\n cid,\r\n aid,\r\n campaignId,\r\n}) {\r\n if (p$Opportunities && navigationLevel === 'account') {\r\n return p$Opportunities;\r\n }\r\n\r\n const scope = getScope({\r\n navigationLevel,\r\n legacyConfig,\r\n cid,\r\n aid,\r\n campaignId,\r\n });\r\n\r\n if (!scope.accountId) {\r\n return Promise.resolve([]);\r\n }\r\n\r\n featureInstrumentation.addScenario(schema);\r\n const currentScenario = featureInstrumentation.loadRecommendationTile.create();\r\n const currentActivity = currentScenario.loadRecommendationTile.create();\r\n\r\n const dataService = new RecommendationService({\r\n scope,\r\n currentScenario,\r\n currentActivity,\r\n odataPath: legacyConfig.get('adinsight.odata.url'),\r\n permissions,\r\n lcid: serverContext.CurrentUser.LocaleID,\r\n ccJsData,\r\n channel: CHANNEL_TYPES.OVERVIEW,\r\n });\r\n\r\n const opportunities = dataService.getSummary({\r\n channel: CHANNEL_TYPES.OVERVIEW,\r\n campaignType,\r\n top: RECOMMENDATION_SUMMARY_TOP_NUMBER,\r\n ignoreCoupons: true,\r\n });\r\n\r\n if (navigationLevel === 'account') {\r\n p$Opportunities = opportunities;\r\n }\r\n\r\n return opportunities;\r\n}\r\n\r\nexport function clearRecommendationsCache() {\r\n p$Opportunities = null;\r\n}\r\n","import { fetchGridData } from '@bingads-webui-campaign/overview-cards-common';\r\n\r\nexport function fetchGridTileData({\r\n entitySet,\r\n filter,\r\n options,\r\n getCardsConfig,\r\n p$DateRange,\r\n jsdata,\r\n dateUtil,\r\n permissions,\r\n campaignType,\r\n}) {\r\n return p$DateRange.then(dateRange => fetchGridData({\r\n entitySet,\r\n dateRange,\r\n filter,\r\n options,\r\n jsdata,\r\n dateUtil,\r\n getCardsConfig,\r\n permissions,\r\n campaignType,\r\n }));\r\n}\r\n","import _ from 'underscore';\r\n\r\n// TODO: [yaoyao] Do we need to lazy load the data-fetch module based on preference data?\r\nimport { getAuctionInsightDataSource } from '@bingads-webui-campaign-legacy/dashboard-cards/competition-card/data-fetch';\r\nimport { fetchPerformanceTimeSeries } from '@bingads-webui-campaign-legacy/performance-graph/data-fetch';\r\nimport {\r\n fetchCoupons,\r\n fetchTopChanges,\r\n fetchAggregatedData,\r\n} from '@bingads-webui-campaign/overview-cards-common';\r\nimport edm from '@bingads-webui-component-legacy/edm-campaign/index';\r\nimport state from '@bingads-webui-component-legacy/state/index';\r\nimport dateUtil from '@bingads-webui-component-legacy/humanize/date';\r\n\r\nimport { setDFMCache, withDFMCache } from '@bingads-webui/dfm-cache';\r\nimport {\r\n // We only need to enable DFM for cards in account level page\r\n // Customer level and campaign level won't hit the code in this file\r\n cardPerformanceId, // need preference logic to enable DFM\r\n cardRecommendationsId,\r\n cardTopCampaignsId, // need preference logic to enable DFM\r\n cardTopKeywordsId, // need preference logic to enable DFM\r\n cardSearchTermsId, // need preference logic to enable DFM\r\n cardCompetitionId,\r\n cardDeviceId,\r\n cardConversionTrackingId, // preference is disabled for this card somehow\r\n cardTopChangesCampaignId, // need preference logic to enable DFM\r\n} from '@bingads-webui-campaign/fluent-page-consts';\r\n\r\nimport {\r\n getCardPreferenceWithDefault,\r\n getCardPreferenceOptionsForDfm,\r\n} from '../preference/preference-helper';\r\nimport { getDfmPreferenceObjectForPerformanceTable } from '../preference/card-preference/performance-table';\r\nimport { getInitSelectedCardsConfig } from '../preference/use-selected-cards-with-preference';\r\n\r\nimport { getFluentCardsConfigs } from '../cards-configs/fluent-card-configs';\r\n\r\nimport { getNavigationLevel } from '../helper/get-navigation-level';\r\nimport { getCcJsData } from '../helper/get-cc-jsdata';\r\nimport { isInViewPort, getViewPortCardsCount } from '../helper/get-responsive-size';\r\n\r\nimport {\r\n fetchRecommendations,\r\n fetchTips,\r\n} from '../data-fetch/recommendation-card';\r\nimport {\r\n fetchGridTileData,\r\n} from '../data-fetch/grid-data';\r\nimport {\r\n fetchConversionTrackingData,\r\n} from '../data-fetch/conversion-tracking';\r\n\r\nfunction getOptionsForCard({\r\n config,\r\n navigationLevel,\r\n campaignType,\r\n preference,\r\n getDfmPreferenceObject,\r\n permissions,\r\n}) {\r\n const cardPreference = getCardPreferenceWithDefault({\r\n config,\r\n navigationLevel,\r\n campaignType,\r\n preference,\r\n permissions,\r\n });\r\n\r\n let options = cardPreference;\r\n if (options && getDfmPreferenceObject) {\r\n options = getDfmPreferenceObject(cardPreference);\r\n }\r\n return options;\r\n}\r\n\r\nexport function fetchFluentOverviewTilesData({\r\n filter,\r\n campaignType,\r\n resolve,\r\n DateFilterState,\r\n preference,\r\n queryParam,\r\n serverContext,\r\n jsdata,\r\n permissions,\r\n legacyConfig,\r\n featureInstrumentation,\r\n}) {\r\n const {\r\n uid, cid, aid, campaignId, adGroupId,\r\n } = queryParam.values;\r\n const scope = {\r\n values: {\r\n uid, cid, aid, campaignId, adGroupId,\r\n },\r\n };\r\n const navigationLevel = getNavigationLevel(scope.values);\r\n const p$DateRange = new DateFilterState({ state }).p$State;\r\n const cardsConfigs = getFluentCardsConfigs({\r\n permissions,\r\n });\r\n\r\n const selectedCardsConfig = getInitSelectedCardsConfig({\r\n preference,\r\n cardsConfigs,\r\n navigationLevel,\r\n campaignType,\r\n serverContext,\r\n isSDK: false,\r\n });\r\n\r\n const cardIds = _.map(selectedCardsConfig, 'typeId');\r\n let viewPortCardSize = getViewPortCardsCount(selectedCardsConfig);\r\n const isPerformanceInViewPort = isInViewPort(cardIds, cardPerformanceId, viewPortCardSize);\r\n const isDeviceInViewPort = isInViewPort(cardIds, cardDeviceId, viewPortCardSize);\r\n const isRecommendationInViewPort = isInViewPort(cardIds, cardRecommendationsId, viewPortCardSize);\r\n const isTopCampaignsInViewPort = isInViewPort(cardIds, cardTopCampaignsId, viewPortCardSize);\r\n const isKeywordInViewPort = isInViewPort(cardIds, cardTopKeywordsId, viewPortCardSize);\r\n const isSearchTermInViewPort = isInViewPort(cardIds, cardSearchTermsId, viewPortCardSize);\r\n const isCompetitionInViewPort = isInViewPort(cardIds, cardCompetitionId, viewPortCardSize);\r\n const isConversionTrackingInViewPort = isInViewPort(cardIds, cardConversionTrackingId, viewPortCardSize);\r\n const isTopChangesCampaignInViewPort = isInViewPort(cardIds, cardTopChangesCampaignId, viewPortCardSize);\r\n\r\n const getCardsConfig = () => _.map(selectedCardsConfig, config => getCardPreferenceOptionsForDfm({\r\n config,\r\n navigationLevel,\r\n campaignType,\r\n preference,\r\n permissions,\r\n }));\r\n window.FluentOverviewPageDataFetchManagerCardsConfigObject = {\r\n config: getCardsConfig(),\r\n campaignType,\r\n viewPortCardSize,\r\n isKeywordInViewPort,\r\n isSearchTermInViewPort,\r\n innerHeight: window.innerHeight,\r\n innerWidth: window.innerWidth,\r\n };\r\n\r\n if (viewPortCardSize <= 0) {\r\n resolve();\r\n return;\r\n }\r\n\r\n const ccJsData = getCcJsData({\r\n serverContext,\r\n });\r\n\r\n const dfmDataFetchCallback = () => {\r\n viewPortCardSize -= 1;\r\n if (viewPortCardSize <= 0) {\r\n resolve();\r\n }\r\n };\r\n\r\n // current dfm logic is checking edm.currentAccount, we follow this logic here\r\n if (isPerformanceInViewPort && edm.currentAccount !== null) {\r\n p$DateRange\r\n .then((dateRange) => {\r\n const p$PerformanceAggregatedData = fetchAggregatedData({\r\n navigationLevel: 'account',\r\n entitySet: edm.currentAccount.Campaigns,\r\n dateRange,\r\n getCardsConfig,\r\n jsdata,\r\n filter,\r\n dateUtil,\r\n permissions,\r\n campaignType,\r\n });\r\n const p$PerformanceTimeSeries = fetchPerformanceTimeSeries({\r\n getCardsConfig,\r\n entitySet: edm.currentAccount.Campaigns,\r\n period: dateRange,\r\n filter,\r\n campaignType,\r\n });\r\n\r\n setDFMCache(`${cardPerformanceId}-aggregated-data`, p$PerformanceAggregatedData);\r\n setDFMCache(`${cardPerformanceId}-time-series`, p$PerformanceTimeSeries);\r\n\r\n dfmDataFetchCallback();\r\n });\r\n }\r\n\r\n if (isDeviceInViewPort && edm.currentAccount !== null) {\r\n p$DateRange\r\n .then((dateRange) => {\r\n const p$DeviceAggregatedData = fetchAggregatedData({\r\n navigationLevel: 'account',\r\n entitySet: edm.currentAccount.Campaigns,\r\n dateRange,\r\n getCardsConfig,\r\n jsdata,\r\n filter,\r\n dateUtil,\r\n permissions,\r\n campaignType,\r\n });\r\n\r\n setDFMCache(cardDeviceId, p$DeviceAggregatedData);\r\n\r\n dfmDataFetchCallback();\r\n });\r\n }\r\n\r\n if (isRecommendationInViewPort) {\r\n fetchCoupons({\r\n ccJsData,\r\n });\r\n fetchTips({\r\n aid,\r\n cid,\r\n });\r\n fetchRecommendations({\r\n navigationLevel,\r\n featureInstrumentation,\r\n legacyConfig,\r\n permissions,\r\n serverContext,\r\n campaignType,\r\n ccJsData,\r\n cid,\r\n aid,\r\n campaignId,\r\n });\r\n dfmDataFetchCallback();\r\n }\r\n\r\n if (isTopCampaignsInViewPort) {\r\n const config = selectedCardsConfig.find(c => c.typeId === cardTopCampaignsId);\r\n const options = getOptionsForCard({\r\n config,\r\n navigationLevel,\r\n campaignType,\r\n preference,\r\n getDfmPreferenceObject: getDfmPreferenceObjectForPerformanceTable,\r\n permissions,\r\n });\r\n\r\n const p$TopCampaigns = fetchGridTileData({\r\n entitySet: edm.currentAccount.Campaigns,\r\n filter,\r\n options,\r\n getCardsConfig,\r\n p$DateRange,\r\n jsdata,\r\n dateUtil,\r\n permissions,\r\n campaignType,\r\n });\r\n\r\n setDFMCache(cardTopCampaignsId, p$TopCampaigns);\r\n\r\n dfmDataFetchCallback();\r\n }\r\n\r\n if (isKeywordInViewPort) {\r\n const config = selectedCardsConfig.find(c => c.typeId === cardTopKeywordsId);\r\n const options = getOptionsForCard({\r\n config,\r\n navigationLevel,\r\n campaignType,\r\n preference,\r\n getDfmPreferenceObject: getDfmPreferenceObjectForPerformanceTable,\r\n permissions,\r\n });\r\n\r\n const p$TopAccountKeyword = fetchGridTileData({\r\n entitySet: edm.currentAccount.Keywords,\r\n filter,\r\n options,\r\n p$DateRange,\r\n jsdata,\r\n dateUtil,\r\n permissions,\r\n campaignType,\r\n });\r\n\r\n setDFMCache(cardTopKeywordsId, p$TopAccountKeyword);\r\n\r\n dfmDataFetchCallback();\r\n }\r\n\r\n if (isSearchTermInViewPort) {\r\n const config = selectedCardsConfig.find(c => c.typeId === cardSearchTermsId);\r\n const options = getOptionsForCard({\r\n config,\r\n navigationLevel,\r\n campaignType,\r\n preference,\r\n getDfmPreferenceObject: getDfmPreferenceObjectForPerformanceTable,\r\n permissions,\r\n });\r\n\r\n const p$TopAccountSearchTerms = fetchGridTileData({\r\n entitySet: edm.currentAccount.SearchTerms,\r\n filter,\r\n options,\r\n p$DateRange,\r\n jsdata,\r\n dateUtil,\r\n permissions,\r\n campaignType,\r\n });\r\n\r\n setDFMCache(cardSearchTermsId, p$TopAccountSearchTerms);\r\n\r\n dfmDataFetchCallback();\r\n }\r\n\r\n if (isCompetitionInViewPort) {\r\n const dataSource = getAuctionInsightDataSource();\r\n\r\n const p$CompetitionTile = dataSource.query();\r\n\r\n dataSource.query = withDFMCache(dataSource.query, cardCompetitionId);\r\n\r\n setDFMCache(cardCompetitionId, p$CompetitionTile);\r\n\r\n dfmDataFetchCallback();\r\n }\r\n\r\n if (isConversionTrackingInViewPort) {\r\n fetchCoupons({\r\n ccJsData,\r\n });\r\n\r\n const p$ConversionTracking = fetchConversionTrackingData({\r\n entitySet: edm.currentAccount.Campaigns,\r\n filter,\r\n getCardsConfig,\r\n p$DateRange,\r\n jsdata,\r\n dateUtil,\r\n permissions,\r\n campaignType,\r\n });\r\n\r\n setDFMCache(cardConversionTrackingId, p$ConversionTracking);\r\n\r\n dfmDataFetchCallback();\r\n }\r\n\r\n if (isTopChangesCampaignInViewPort) {\r\n p$DateRange.then((dateRange) => {\r\n const p$TopChangesCampaign = fetchTopChanges({\r\n entitySet: edm.currentAccount.Campaigns,\r\n dateRange,\r\n filter,\r\n jsdata,\r\n dateUtil,\r\n getCardsConfig,\r\n permissions,\r\n campaignType,\r\n });\r\n\r\n setDFMCache(cardTopChangesCampaignId, p$TopChangesCampaign);\r\n\r\n dfmDataFetchCallback();\r\n });\r\n }\r\n}\r\n","import { fetchConversionTracking } from '@bingads-webui-campaign/overview-cards-common';\r\n\r\nexport function fetchConversionTrackingData({\r\n entitySet,\r\n // we are not using this info in current conversion tracking card, maybe we shoud add it back?\r\n // metric,\r\n // selectedMenuItem,\r\n getCardsConfig,\r\n filter,\r\n p$DateRange,\r\n jsdata,\r\n dateUtil,\r\n permissions,\r\n campaignType,\r\n}) {\r\n return p$DateRange.then(dateRange => fetchConversionTracking({\r\n entitySet,\r\n dateRange,\r\n // we are not using this info in current conversion tracking card, maybe we shoud add it back?\r\n // metric,\r\n // selectedMenuItem,\r\n jsdata,\r\n dateUtil,\r\n getCardsConfig,\r\n filter,\r\n permissions,\r\n campaignType,\r\n }));\r\n}\r\n","import _ from 'underscore';\r\n\r\nimport { METRIC_OPTIONS } from '@bingads-webui-campaign-react/top-locations-card-const';\r\n\r\n\r\nexport const getPropsFromPreferenceForTopLocations = ({\r\n cardPreference,\r\n patchPreference,\r\n campaignType,\r\n}) => {\r\n let preferenceFromServer = _.get(cardPreference, 'metric');\r\n if (!_.isString(preferenceFromServer)\r\n || !METRIC_OPTIONS.includes(preferenceFromServer)\r\n ) {\r\n preferenceFromServer = _.first(METRIC_OPTIONS);\r\n }\r\n\r\n return {\r\n preferenceFromServer,\r\n patchPreference,\r\n campaignType,\r\n };\r\n};\r\n","import _ from 'underscore';\r\n\r\nimport { ConversionFilterOption } from '@bingads-webui-campaign/overview-cards-common';\r\n\r\nexport function getPropsFromPreferenceForConversionTracking({\r\n preferenceService,\r\n responsiveSize,\r\n campaignType,\r\n}) {\r\n return {\r\n preferenceService,\r\n responsiveSize,\r\n campaignType,\r\n };\r\n}\r\n\r\nexport function getHeaderPropsFromPreferenceForConversionTracking({\r\n i18n,\r\n}) {\r\n return ({\r\n options: [\r\n {\r\n value: ConversionFilterOption.AllChanges,\r\n displayName: i18n.getString(_TL_('All changes')),\r\n },\r\n {\r\n value: ConversionFilterOption.TopGainers,\r\n displayName: i18n.getString(_TL_('Top gainers')),\r\n },\r\n {\r\n value: ConversionFilterOption.TopDecliners,\r\n displayName: i18n.getString(_TL_('Top decliners')),\r\n },\r\n ],\r\n initialSelectedValue: ConversionFilterOption.AllChanges,\r\n // we are not using preference in conversion tracking card now.\r\n onOptionSelected: _.noop,\r\n });\r\n}\r\n","export function getPropsForRecommendations({\r\n navigationLevel,\r\n campaignType,\r\n}) {\r\n return {\r\n navigationLevel,\r\n campaignType,\r\n };\r\n}\r\n","import _ from 'underscore';\r\n\r\nfunction getPreferenceDataObj(preference, preferenceName) {\r\n const preferenceObj = preference.findByNameAtAccountLevel(preferenceName);\r\n\r\n return _.get(preferenceObj, 'Data');\r\n}\r\n\r\nexport function getPreferenceForDashboard({ preference, preferenceName, dashboardPreferenceKey }) {\r\n const preferenceDataObj = getPreferenceDataObj(preference, preferenceName);\r\n\r\n if (_.has(preferenceDataObj, dashboardPreferenceKey)) {\r\n return preferenceDataObj[dashboardPreferenceKey];\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction getCardPreference(dashboardPreferenceObj, cardId) {\r\n if (dashboardPreferenceObj && _.has(dashboardPreferenceObj, 'cards')) {\r\n const cardPref = _.find(dashboardPreferenceObj.cards, card => card.id === cardId);\r\n return cardPref;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getCardPreferenceOptions(dashboardPreferenceObj, cardId) {\r\n const cardPreference = getCardPreference(dashboardPreferenceObj, cardId);\r\n\r\n return _.get(cardPreference, 'options');\r\n}\r\n\r\nexport function setPreferenceForCard({\r\n preference,\r\n preferenceName,\r\n dashboardPreferenceKey,\r\n cardId,\r\n cardOptions,\r\n}) {\r\n const preferenceForDashboard = getPreferenceForDashboard({ preference, preferenceName, dashboardPreferenceKey });\r\n const preferenceForCard = getCardPreference(preferenceForDashboard, cardId);\r\n const cards = _.get(preferenceForDashboard, 'cards', []);\r\n let newCards = [];\r\n\r\n if (!preferenceForCard) {\r\n newCards = [...cards, { id: cardId, options: cardOptions }];\r\n } else {\r\n newCards = _.map(cards, (card) => {\r\n if (card.id === cardId) {\r\n return {\r\n ...card,\r\n options: cardOptions,\r\n };\r\n }\r\n\r\n return card;\r\n });\r\n }\r\n\r\n const newPreferenceForDashboard = {\r\n ...preferenceForDashboard,\r\n cards: newCards,\r\n };\r\n\r\n const preferenceDataObj = getPreferenceDataObj(preference, preferenceName);\r\n\r\n const newPreferenceDataObj = {\r\n ...preferenceDataObj,\r\n [dashboardPreferenceKey]: newPreferenceForDashboard,\r\n };\r\n\r\n preference.setAtAccountLevel({\r\n Data: newPreferenceDataObj,\r\n Name: preferenceName,\r\n });\r\n}\r\n","import React from 'react';\r\n\r\nexport function useIsPreferenceInitialized(preference) {\r\n const [isInitialized, setIsInitialized] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n preference.initialize().then(() => {\r\n setIsInitialized(true);\r\n });\r\n }, [preference]);\r\n\r\n return isInitialized;\r\n}\r\n"],"names":["EnumPropertyToTypeMapping","AudienceStatus","BidTarget","BidType","CampaignType","CallTrackingStatus","DeliveryStatus","DevicePreference","DisplayBiddingStrategyType","Language","Medium","Status","Type","MatchType","AvailableInsightTypeIds","AdGroupType","CampaignCashbackScope","AdGroupCashbackScope","Coupon","EnumPropertyToStringTypeMapping","toLegacyOperator","op","col","schema","ret","_","properties","enum","groupedItems","toLegacyColumn","filterSchema","toAlias","toLegacyValue","values","i18n","value","property","types","legacyValue","convertEnumValuetoLegacy","convertEnumValuetoLegacyString","toLegacyEnum","type","formatDate","raw","fromFilterEntityToLegacyFilter","filterentity","legacyFormats","translateToLegacyFormat","query","condition","operator","SelectedColumn","SelectedOperator","Values","options","entitySchema","$and","length","legacyFormat","SessionFilterStorage","_createClass","_ref","arguments","undefined","_ref$featureName","featureName","_ref$filterEntityOpti","filterEntityOptions","sessionStore","resourceId","entryId","_classCallCheck","Error","this","getSessionStorageId","entityName","name","definitions","defineResource","storage","key","destroy","mapFeatureNameToEnum","mapFeatureNameToStatusKey","LegacyQuickFilterStorage","_SessionFilterStorage","_this","newCampaignsGridFilterEnabled","_callSuper","_assertThisInitialized","_inherits","_ref3","concat","_this2","find","then","filterEntity","filter","selectedKey","_defineProperty","$in","mapFeatureNameToQuery","catch","DEPRECATED_PROPERTIES","Deserializer","parseIdAsInt","processedSchema","flattenEntitySchema","FilterSchema","expressions","convert","logicalOperator","$or","parse","processedExpressions","expression","deprecatedColumn","map","mongoPredicate","applyConversions","toMongoPredicate","bind","propName","props","getFilterProperty","Date","parseFloat","parseInt","Boolean","item","taskQueueMixin","classInstance","methodNames","asyncTaskQueue","methodName","originalMethod","_len","args","Array","_key","obj","Promise","isPending","call","apply","EditableFilterStorage","deserializer","result","savedFilter","deserialize","JSON","cloneDeep","err","create","id","stringify","PermanentFilterStorage","preferenceService","storageKey","_ref$isAccountLevel","isAccountLevel","getStorageKey","preferenceData","Name","Data","setAtAccountLevel","setAtUserLevel","findByNameAtAccountLevel","findByNameAtUserLevel","Id","del","delAtUserLevel","EditableFilterPermanentStorage","permanentFilterStorage","get","serializedValue","save","delete","getPreferenceFilter","preference","preferenceQuery","where","reject","actionName","error","SavedFilterStorage","_ref$getLegacySaved","getLegacySaved","preferenceStoreFactory","_ref$maxSavedFilterLi","maxSavedFilterLimit","gridName","project","grid","preferenceInitPromise","findAll","_ref2","exist","update","filters","RecentFilterPermanentStorage","recentFilterStorages","_objectSpread","currentIndex","getAllRecentPromise","push","saveFilterPromise","pop","unshift","newFilter","index","cleanFilterPromise","clean","QuickFilterStorage","QuickFilterPermanentStorage","WaterfallFilterPermanentStorage","_PermanentFilterStora","set","data","QuickFilterSessionStorage","storageTypeMapping","quickFilter","editableFilter","editableFilterPermanent","recentFilter","legacyQuickFilter","permanentQuickFilter","permanentWaterfallFilter","sessionQuickFilter","FilterStorageFactory","Storage","WaterfallFilterType","CampaignStatus","AdGroupStatus","DateFilter","BudgetCenterMonthFilter","waterfallFilterTypeMapping","waterfallFilterNames","WaterfallFilterStorage","waterfallFilterStorages","filterStorage","getSessionStorage","filterTypes","getFilterInSync","filterType","dateFilterProcessor","dateFilter","format","compared","start","kendo","formattedStart","end","formattedEnd","RangeStartDate","RangeEndDate","grain","RangeId","waterfallDateFilterProcessor","dateFilterStorage","serverContext","CurrentUser","CultureDateTimeFormat","ShortDatePattern","MetricCounter","_React$PureComponent","metric","line","styles","color","_jsxs","className","children","_jsx","style","metricList","metrics","getMetricLine","getText","React","DescriptionContainer","description","Glyphicon","glyph","ActionSubPanel","None","FeedbackPanel","DismissPanel","FeedbackComplete","CALLOUT_HORIZONTAL_SPACE","CalloutWithAutoPlacement","target","onDismiss","calloutKey","_useState","useState","_useState2","_slicedToArray","autoFixPlacement","setAutoFixPlacement","useEffect","fixedPlacement","_target$getBoundingCl","getBoundingClientRect","left","right","window","innerWidth","Callout","popoverId","popoverClassName","show","closeButton","focusLockContent","content","onClose","e","placement","defaultProps","FluctuationActionButton","actionType","onClick","Link","getString","replaceToken","pattern","val","str","regexp","RegExp","finalString","test","replace","replaceCurly","ctx","finalStr","argCounter","params","isArray","userId","UserId","CustomerId","AccountId","CampaignId","AdGroupId","indexOf","insightPopupContainerId","insertPopoverContainer","placeHolderId","$","attr","appendTo","document","body","dismissPopupIfExist","popupContainers","popupClassName","getElementsByClassName","container","ReactDOM","Checkboxes","checkboxOption","toggleCheckbox","entry","Checkbox","label","text","onChange","CommentContainer","TextField","multiline","resizable","placeholder","DismissForm","handleCommentChange","onSubmit","onCancel","PrimaryButton","DefaultButton","FeedbackForm","_ref4","selectedCheckboxes","comment","disabled","InsightAction","showPanel","panel","newPanel","activeSubPanel","setState","onCurrentSubPanelChange","checked","state","cancelAction","event","stopPropagation","submitActionFeedback","feedbackObj","feedbacks","newSubPanel","showFeedbackForm","deps","feedbackOptions","getDefaultFeedbackOptions","dismissFeedbackOptions","dismissOptions","getDefaultDismissOptions","showDismissForm","feedbackSubmitted","actionFormCommonProps","commentContainer","LearnMoreLink","topic","learnMoreLinkTopic","linkText","subPanels","BaseUrl","FluctuationService","token","getUrlParam","queryString","param","match","exec","queryParamValue","decodeURIComponent","callType","withoutOpporCheck","campaign","campaignId","campaignParam","exeprimentParam","isFluctuationsExperiementEnabled","urlParams","location","search","odataFunc","tempUrl","accountId","customerId","granularity","surfacingChannelId","startDate","endDate","uniqueId","datetime","host","origin","option","contentType","headers","authorization","cache","url","formatUrl","_ref2$withoutOpporChe","generateRequestOption","resolve","rawData","cardWelcomeTipsId","cardTopLocationsId","cardAssetPerformanceId","cardPerformanceId","cardDiagnosticId","cardRecommendationsId","cardTopCampaignsId","cardTopAccountsId","cardTopKeywordsId","cardDeviceId","cardSearchTermsId","cardTopAdGroupsId","cardCompetitionId","cardConversionTrackingId","cardTopChangesAccountId","cardTopChangesCampaignId","cardTopChangesAdGroupId","cardNavigateToFullProductId","CampaignLevelCampaignType","AccountLevelCampaignType","__","getPreference","preferenceObj","getPreferencePatcher","newPreferenceData","getPreferenceKeyPrefix","navigationLevel","campaignType","campaignTypeString","Hotel","PerformanceMax","App","LinkedIn","getCardPreferenceKey","cardTypeId","prefix","getPagePreferenceKey","_ref5","getCardPreferenceWithDefault","_ref6","config","permissions","cardPreferenceKey","typeId","originCardPreference","defaultPreference","getDefaultPreference","isPreferenceValid","cardPreference","patchPreference","getCardPreferenceOptionsForDfm","_ref7","getDfmPreferenceObject","ComparisonValues","PerformanceMetrics","PerformanceMetricsChange","PerformanceMetricsChangePercentage","getHeaderPropsFromPreferenceForPerformanceTable","dateRange","initialSelectedValue","selectedComparisonValue","displayName","_TL_","onOptionSelected","getTablePropsFromPreferenceForPerformanceTable","selectedColumns","defaultGridColumns","allMetrics","AccountsMode","Expert","metricToDisplayNameMap","initialSelectedMetrics","column","initialSortColumn","sortColumn","initialSortDirection","sortDirection","isNullOrUndefined","isTablePreferenceValid","metricsKeys","some","includes","Object","getDefaultPerformanceTablePreference","getDfmPreferenceObjectForPerformanceTable","columns","orderby","direction","selectedMenuItem","getLegacyPreference","prefs","dashboardId","CurrentCustomer","HasExpertAccount","fetchDashboardId","getAvailableCardsConfigs","cardsConfigs","isSDK","cardConfig","isValidForNavigationLevel","getSelectedCardsConfigs","availableCardsConfigs","selectedCards","sc","getInitSelectedCardsConfig","pagePreferenceKey","pagePreference","legacyCardSelectionPreference","useSelectedCardsWithPreference","isLoadingWelcomeCardConfig","useMemo","patchPagePreference","initSelectedCards","setSelectedCards","selectedCardsConfigs","cardSelectionCards","hidden","onCardSelectionSaved","useCallback","selectionToSave","validMetricIndexes","defaultSelectedMetricIndexes","getDefaultPerformanceChartPreference","selectedMetricIndexes","defaultMetrics","getPropsFromPreferenceForPerformanceChart","shellContentElement","querySelector","isPerformanceChartPreferenceValid","availableMetricKeys","defaultSelectedMetric","getTopChangesAllMetrics","getPropsForTopChanges","preferenceFromServer","getHeaderPropsFromPreferenceForTopChanges","TopChangesFilterOption","AllChanges","TopGainers","TopDecliners","Insights","getDfmPreferenceObjectForTopChanges","getDefaultTopChangesPreference","getTablePropsFromPreferenceForDevices","isDevicePreferenceValid","getDefaultDevicePreference","getCardOptions","edmLevel","entitySet","extraFilter","_ref$isKeyword","isKeyword","_ref$isSearchTerm","isSearchTerm","targetNagivationLevel","edm","currentAccount","Campaigns","currentCampaign","AdGroups","currentCustomer","Accounts","Keywords","SearchTerms","getCustomerLevelDataEntitySetOptions","getAccountLevelDataEntitySetOptions","getTopKeywordCardOptions","getSearchTermCardOptions","getCampaignLevelDataEntitySetOptions","getFluentCardsConfigs","_ref2$showWelcomeTips","showWelcomeTips","_ref2$isMobileAppCamp","isMobileAppCampaign","audienceUnderspendShowTile","defaultHiddenCampaignTypes","Default","Shopping","DynamicSearchAds","Audience","Smart","diagnosticCardDefaultHiddenCampaignTypesFiltered","diagnosticCardForMobileAppCampaignsFiltered","cardsConfig","validFor","size","CardSize","Small","getEntitySetOptions","enabled","Large","dynamicHeightForNarrow","hideForCampaignType","hideForCampaignTypeSDK","NavigationLevel","Customer","Account","Campaign","getNavigationLevel","scopeValues","aid","getCcJsData","GetJsDataInfo","cidFetcher","uidFetcher","willSupportCors","Urls","ClientCenterBaseUrl","jsDataCcRest","getResponsiveSize","containerWidth","Constants","ResponsiveSizeBreakpoints","minWidth","last","getResponsiveSizeBasedOnWindowSize","getColumnSize","responsiveSize","getViewPortCardsCount","selectedCardsConfig","columnSize","selectedCardSize","remainingRowSize","Math","round","innerHeight","remainingColumnSize","i","cardSize","isInViewPort","cardIds","viewPortSize","RECOMMENDATION_SUMMARY_TOP_NUMBER","p$Opportunities","fetchTips","cid","edmCampaign","Customers","$withKey","Tips","top","count","toPromise","scenario","setting","activity","getScope","levelAt","entityIds","legacyConfig","levelAtConstant","ACCOUNT","CAMPAIGN","CUSTOMER","campaignName","fetchMCCOverviewRecommendations","jsdata","multiAccountRecommendationParameters","RecommendationTypes","getRecommendationIds","CHANNEL_TYPES","MCCOVERVIEW","$call","toJSON","elementType","shortName","fetchRecommendations","featureInstrumentation","ccJsData","scope","addScenario","currentScenario","loadRecommendationTile","currentActivity","opportunities","RecommendationService","odataPath","lcid","LocaleID","channel","OVERVIEW","getSummary","ignoreCoupons","clearRecommendationsCache","fetchGridTileData","getCardsConfig","p$DateRange","dateUtil","fetchGridData","getOptionsForCard","fetchFluentOverviewTilesData","DateFilterState","queryParam","_queryParam$values","uid","adGroupId","p$State","viewPortCardSize","isPerformanceInViewPort","isDeviceInViewPort","isRecommendationInViewPort","isTopCampaignsInViewPort","isKeywordInViewPort","isSearchTermInViewPort","isCompetitionInViewPort","isConversionTrackingInViewPort","isTopChangesCampaignInViewPort","FluentOverviewPageDataFetchManagerCardsConfigObject","dfmDataFetchCallback","p$PerformanceAggregatedData","fetchAggregatedData","p$PerformanceTimeSeries","fetchPerformanceTimeSeries","period","setDFMCache","p$DeviceAggregatedData","fetchCoupons","c","p$TopCampaigns","p$TopAccountKeyword","p$TopAccountSearchTerms","dataSource","getAuctionInsightDataSource","p$CompetitionTile","withDFMCache","p$ConversionTracking","fetchConversionTracking","fetchConversionTrackingData","p$TopChangesCampaign","fetchTopChanges","getPropsFromPreferenceForTopLocations","METRIC_OPTIONS","getPropsFromPreferenceForConversionTracking","getHeaderPropsFromPreferenceForConversionTracking","ConversionFilterOption","getPropsForRecommendations","getPreferenceDataObj","preferenceName","getPreferenceForDashboard","dashboardPreferenceKey","preferenceDataObj","getCardPreference","dashboardPreferenceObj","cardId","cards","card","getCardPreferenceOptions","setPreferenceForCard","cardOptions","preferenceForDashboard","preferenceForCard","newCards","_toConsumableArray","newPreferenceForDashboard","newPreferenceDataObj","useIsPreferenceInitialized","_React$useState","_React$useState2","isInitialized","setIsInitialized","initialize"],"sourceRoot":""}