{"version":3,"file":"static/js/application.async.landing~ef272fa2.53c55a21.chunk.js","mappings":"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","sources":["../../../node_modules/@bingads-webui-campaign-react/product-services/src/odata-config.js","../../../node_modules/@bingads-webui-campaign-react/product-services/src/fetch-product-scope-data.js","../../../node_modules/@bingads-webui-campaign-react/props-reporting/src/index.js","../../../node_modules/@bingads-webui-campaign-react/recommendation-in-context-card/src/in-context-card.js","../../../node_modules/@bingads-webui-campaign-react/recommendation-in-context-card/src/card-style.js","../../../node_modules/@bingads-webui-campaign-react/recommendation-modal/src/modal.js","../../../node_modules/@bingads-webui-campaign-react/recommendation-modal/src/show-modal.js","../../../node_modules/@bingads-webui-campaign-react/recommendation-modal/src/forms/confirm-form.js","../../../node_modules/@bingads-webui-campaign-react/recommendation-modal/src/show-confirm-form-modal.js","../../../node_modules/@bingads-webui-campaign-react/recommendation-modal/src/forms/async-apply-form.js","../../../node_modules/@bingads-webui-campaign-react/recommendation-modal/src/show-async-apply-form-modal.js","../../../node_modules/@bingads-webui-campaign-react/recommendation-modal/src/show-apply-form-modal.js","../../../node_modules/@bingads-webui-campaign-react/recommendation-modal/src/forms/async-bulk-aar-confirm-form.js","../../../node_modules/@bingads-webui-campaign-react/recommendation-prefill/src/utils/api-error-mapping.js","../../../node_modules/@bingads-webui-campaign-react/recommendation-prefill/src/utils/expected-error-codes.js","../../../node_modules/@bingads-webui-campaign-react/recommendation-shared-styles/src/apply-form-style.js","../../../node_modules/@bingads-webui-campaign-react/recommendation-shared-styles/src/feedback-modal-style.js","../../../node_modules/@bingads-webui-campaign-react/recommendation-shared-styles/src/header-style.js","../../../node_modules/@bingads-webui-campaign-react/recommendation-shared-styles/src/icon-style.js","../../../node_modules/@bingads-webui-campaign-react/remaining-chars-hint/src/string-util.js","../../../node_modules/@bingads-webui-campaign-react/remaining-chars-hint/src/remaining-chars-hint.js","../../../node_modules/@bingads-webui-campaign-react/remaining-chars-hint/src/shared.js","../../../node_modules/@bingads-webui-campaign-react/remaining-chars-hint/src/style.js","../../../node_modules/@bingads-webui-campaign-react/remaining-chars-hint/src/remaining-chars-validated-text-field.js","../../../node_modules/@bingads-webui-campaign-react/remaining-chars-hint/src/with-remaining-chars.js","../../../node_modules/@bingads-webui-campaign-react/remaining-chars-hint/src/remaining-chars-unvalidated-text-field.js","../../../node_modules/@bingads-webui-campaign-react/remaining-chars-hint/src/with-remaining-chars-unvalidated.js","../../../node_modules/@bingads-webui-campaign-react/remaining-chars-hint/src/controlled-remaining-chars-unvalidated-text-field.js","../../../node_modules/@bingads-webui-campaign-react/remaining-chars-hint/src/with-controlled-remaining-chars-unvalidated.js","../../../node_modules/@bingads-webui-campaign-react/responsive-ad-editor-components/src/hotspots/glyphList.ts","../../../node_modules/@bingads-webui-campaign-react/responsive-ad-editor-components/src/hotspots/placementList.ts","../../../node_modules/@bingads-webui-campaign-react/responsive-ad-editor-components/src/hotspots/hotspot.tsx","../../../node_modules/@bingads-webui-campaign-react/responsive-ad-editor-components/src/hotspots/hotspot-panel.tsx","../../../node_modules/@bingads-webui-campaign-react/responsive-ad-editor-components/src/boost-anchors/index.tsx","../../../node_modules/@bingads-webui-campaign-react/responsive-ad-editor-utils/src/types.ts","../../../node_modules/@bingads-webui-campaign-react/responsive-ad-editor-utils/src/image-metadata-util.js","../../../node_modules/@bingads-webui-campaign-react/responsive-ad-editor-utils/src/data-process/mma-in-msan-dataprocessor.ts","../../../node_modules/@bingads-webui-campaign-react/responsive-ad-editor-utils/src/image-repository-util.js","../../../node_modules/@bingads-webui-campaign-react/responsive-ad-editor-utils/src/data-process/get-logo-experience.ts","../../../node_modules/@bingads-webui-campaign-react/responsive-ad-editor-utils/src/data-process/get-portrait-experience.ts","../../../node_modules/@bingads-webui-campaign-react/responsive-ad-editor-utils/src/config.js","../../../node_modules/@bingads-webui-campaign-react/responsive-ad-editor-utils/src/constants.js","../../../node_modules/@bingads-webui-campaign-react/responsive-ad-editor-utils/src/format-data-util.js","../../../node_modules/@bingads-webui-campaign-react/responsive-ad-editor-utils/src/image-asset-model-util.js","../../../node_modules/@bingads-webui-campaign-react/responsive-image-list-view/src/editable-image-button.js","../../../node_modules/@bingads-webui-campaign-react/responsive-image-list-view/src/sparkle-menu-button.js","../../../node_modules/@bingads-webui-campaign-react/responsive-image-list-view/src/index.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-editor/src/validators.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-editor/src/controls/error.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-editor/src/controls/with-error.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-editor/src/styles.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-editor/src/controls/dynamic-text-extention.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-editor/src/controls/base-text-field.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-editor/src/controls/url-path.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-editor/src/controls/url-input.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-preview-uapl/src/defaults.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-preview-uapl/src/ad-preview.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-preview-uapl/src/styles.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-editor/src/utils/format.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-editor/src/controls/pin-button.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-editor/src/controls/text-assets-styles.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-editor/src/controls/text-assets.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-editor/src/controls/disclaimer.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-editor/src/config.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-editor/src/responsive-search-ad-copilot-banner-with-dialog.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-editor/src/responsive-search-ad-editor.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-editor/src/use-copilot-for-responsive-search-ad.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-editor/src/controls/validated-text-field-with-ad-customizer.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-suggestion/src/strings.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-suggestion/src/ad-strength-helper.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-suggestion/src/new-ad-strength-score.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-suggestion/src/styles.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-suggestion/src/ad-strength.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-suggestion/src/ad-strength-repository.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-suggestion/src/ad-strength-suggestion-picker.js","../../../node_modules/@bingads-webui-campaign-react/responsive-search-ad-suggestion/src/ad-strength-top-grid.js","../../../node_modules/@bingads-webui-campaign-react/sdk-campaign-overview-page/src/navigate-to-full-product/index.tsx","../../../node_modules/@bingads-webui-campaign-react/sdk-campaign-overview-page/src/manage-account-menu.tsx","../../../node_modules/@bingads-webui-campaign-react/sdk-campaign-overview-page/src/bottom-bar.tsx","../../../node_modules/@bingads-webui-campaign-react/sdk-campaign-overview-page/src/overview-page.js","../../../node_modules/@bingads-webui-campaign-react/sdk-campaign-overview-page/src/manage-conversion-alert-dialog/use-navigate-to-conversion-goal-creation-workflow.ts","../../../node_modules/@bingads-webui-campaign-react/recommendation-modal/src/template.pug","../../../node_modules/@bingads-webui-campaign-react/protected-link/src/protected-link.tsx"],"sourcesContent":["export const getODataConfig = (serverContext) => {\r\n const isLocal = () => {\r\n const hostname = document.location.hostname.toLowerCase();\r\n return hostname.indexOf('ads.microsoft.com') === -1 &&\r\n hostname.indexOf('ads-int.microsoft.com') === -1;\r\n };\r\n\r\n const odataPath = isLocal() ? 'Advertiser/V2' : 'Campaign/V2';\r\n\r\n const oDataConfig = {\r\n odataToken: serverContext.Token,\r\n oDataToken: serverContext.Token,\r\n odataPath: `${serverContext.ServicesEndpoints.CampaignAPI}${odataPath}`,\r\n oDataPath: `${serverContext.ServicesEndpoints.CampaignAPI}${odataPath}`,\r\n };\r\n return oDataConfig;\r\n};\r\n","/* eslint-disable no-restricted-globals */\r\nimport _ from 'underscore';\r\nimport state from '@bingads-webui-component-legacy/state/index';\r\nimport jsdata from '@bingads-webui-component-legacy/js-data-campaign/index';\r\nimport instrumentation from '@bingads-webui-static-legacy/instrumentation/index';\r\nimport instrumentationSettings from '@bingads-webui-static-legacy/instrumentation/campaignSchemaAndSetting';\r\nimport constants from '@bingads-webui-static-legacy/instrumentation/constants';\r\nimport { odata } from '@bingads-webui/http-util';\r\nimport { queryify } from '@bingads-webui/url-util';\r\n\r\nimport { getODataConfig } from './odata-config';\r\n\r\nfunction getProductScopeFromUIServer(\r\n resolve,\r\n options = {\r\n dataName: 'MetaData',\r\n bypassCache: false,\r\n cacheResponse: true,\r\n shouldShowPlaceholderStoreIfExists: false,\r\n }\r\n) {\r\n let url = queryify('/Campaign/NewCampaign/GetProductScope', {\r\n aid: state.get('account_id'),\r\n cid: state.get('customer_id'),\r\n uid: state.get('user_id'),\r\n });\r\n\r\n const extraParam = {\r\n getBMCAccountsOnly: true,\r\n };\r\n\r\n if (options.shouldShowPlaceholderStoreIfExists) {\r\n extraParam.storeTypes = 'placeholder';\r\n }\r\n\r\n url = queryify(url, extraParam);\r\n\r\n const params = {\r\n url,\r\n adapter: 'legacy',\r\n bypassCache: options.bypassCache,\r\n cacheResponse: options.cacheResponse,\r\n };\r\n\r\n const p = jsdata.Product.find(options.dataName, params);\r\n\r\n p.then((data) => {\r\n resolve({ ...data });\r\n });\r\n\r\n return p;\r\n}\r\n\r\nfunction getProductScopeFromOdata(\r\n resolve,\r\n reject,\r\n serverContext,\r\n options = {\r\n campaignId: null,\r\n countryCode: null,\r\n getCampaignCriterions: false,\r\n getProductConditionOptions: false,\r\n getSalesCountryCollection: false,\r\n getDynamicDataFeedOptions: false,\r\n getCategoryFullData: false,\r\n getProductTypeFullData: false,\r\n }\r\n) {\r\n instrumentation.startScenario(instrumentationSettings.SCENARIONAME.CreateCampaignObjective);\r\n\r\n if (options.campaignId) {\r\n instrumentation.startActivity(instrumentationSettings.ACTIVITYNAME.GetProductScopeForCampaign);\r\n } else {\r\n instrumentation.startActivity(instrumentationSettings.ACTIVITYNAME.GetProductScopeForAccount);\r\n }\r\n\r\n const aid = _.get(serverContext, ['CurrentAccount', 'Id']);\r\n const cid = _.get(serverContext, ['CurrentCustomer', 'Id']);\r\n\r\n if (!aid) {\r\n instrumentation.logMessage([constants.LOGCATEGORY.TRACE], constants.LOGLEVEL.INFO, 'getProductScopeFromOdata', '[GetProductScopeFromOdata] usererror: aid is not defined');\r\n return reject('aid is not defined');\r\n }\r\n\r\n const oDataConfig = getODataConfig(serverContext);\r\n const campaignIdString = options.campaignId ? `/Campaigns(${options.campaignId})` : '';\r\n let url = `${oDataConfig.oDataPath}/Customers(${cid})/Accounts(${aid})${campaignIdString}/GetProductScope`;\r\n\r\n url = queryify(url, _.pick(_.omit(options, 'campaignId'), _.identity));\r\n\r\n instrumentation.logMessage([constants.LOGCATEGORY.TRACE], constants.LOGLEVEL.INFO, 'getProductScopeFromOdata', `[GetProductScopeFromOdata] url: ${url}`);\r\n\r\n const config = {\r\n oDataToken: oDataConfig.oDataToken,\r\n oDataTokenType: oDataConfig.oDataTokenType,\r\n applicationName: oDataConfig.applicationName,\r\n };\r\n\r\n const p = odata.get(url, config).then((data) => {\r\n resolve({ ...data });\r\n }).catch((error) => {\r\n instrumentation.logError('getProductScopeFromOdata', `[GetProductScopeFromOdata] error: ${JSON.stringify(error)}`, constants.IMPACTUSER.True);\r\n\r\n return reject(error);\r\n });\r\n\r\n if (options.campaignId) {\r\n instrumentation.endActivity(instrumentationSettings.ACTIVITYNAME.GetProductScopeForCampaign);\r\n } else {\r\n instrumentation.endActivity(instrumentationSettings.ACTIVITYNAME.GetProductScopeForAccount);\r\n }\r\n\r\n return p;\r\n}\r\n\r\nexport function getProductScopeData(\r\n resolve,\r\n serverContext,\r\n options = {\r\n campaignId: null,\r\n countryCode: null,\r\n getCampaignCriterions: false,\r\n getProductConditionOptions: false,\r\n getSalesCountryCollection: false,\r\n getDynamicDataFeedOptions: false,\r\n getCategoryFullData: false,\r\n getProductTypeFullData: false,\r\n dataName: 'MetaData',\r\n bypassCache: false,\r\n cacheResponse: true,\r\n shouldShowPlaceholderStoreIfExists: false,\r\n getCampaignCriterionsOnly: false,\r\n noBMCAccounts: false,\r\n }\r\n) {\r\n const uiServerOptionsKeys = ['dataName', 'bypassCache', 'cacheResponse', 'shouldShowPlaceholderStoreIfExists'];\r\n const uiServerOptions = _.pick(options, uiServerOptionsKeys);\r\n uiServerOptions.salesCountry = options.countryCode;\r\n\r\n const pUiServer = options.getCampaignCriterionsOnly || options.noBMCAccounts ? null : new Promise(resolveUiServer => getProductScopeFromUIServer(resolveUiServer, uiServerOptions));\r\n const pOdata = new Promise((resolveOdata, rejectOdata) => getProductScopeFromOdata(resolveOdata, rejectOdata, serverContext, _.omit(options, uiServerOptionsKeys)));\r\n const promises = _.compact([pUiServer, pOdata]);\r\n const p = Promise.all(promises);\r\n\r\n if (_.isFunction(resolve)) {\r\n resolve();\r\n }\r\n\r\n return p;\r\n}\r\n\r\n// Merge the data objects returned by Promise.all(promises)\r\nexport function mergeData(pData) {\r\n const mergedData = {};\r\n\r\n _.each(pData, (data) => {\r\n Object.assign(mergedData, data);\r\n });\r\n\r\n // SalesCountryCode is assigned to \"MetaData\"/\"AudienceMetaData\". Remove it for now.\r\n delete mergedData.SalesCountryCode;\r\n\r\n return mergedData;\r\n}\r\n","import PropTypes from 'prop-types';\r\n\r\nconst ReportingProps = {};\r\n\r\nReportingProps.i18n = PropTypes.shape({\r\n formatDate: PropTypes.func.isRequired,\r\n formatPercent: PropTypes.func.isRequired,\r\n getCurrencySymbol: PropTypes.func.isRequired,\r\n getString: PropTypes.func.isRequired,\r\n isReady: PropTypes.func.isRequired,\r\n parseDate: PropTypes.func.isRequired,\r\n parseDecimal: PropTypes.func.isRequired,\r\n});\r\n\r\nReportingProps.instrumentationSchema = PropTypes.shape({\r\n scenario: PropTypes.arrayOf(PropTypes.shape({\r\n name: PropTypes.string.isRequired,\r\n value: PropTypes.any.isRequired,\r\n activity: PropTypes.arrayOf(PropTypes.shape({\r\n name: PropTypes.string.isRequired,\r\n value: PropTypes.any.isRequired,\r\n })).isRequired,\r\n })).isRequired,\r\n});\r\n\r\nReportingProps.reactRouterLocation = PropTypes.shape({\r\n pathname: PropTypes.string.isRequired,\r\n search: PropTypes.string,\r\n hash: PropTypes.string,\r\n});\r\n\r\nReportingProps.reactRouterMatch = PropTypes.shape({\r\n params: PropTypes.objectOf(PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.number,\r\n ])).isRequired,\r\n path: PropTypes.string.isRequired,\r\n url: PropTypes.string.isRequired,\r\n isExact: PropTypes.bool.isRequired,\r\n});\r\n\r\nReportingProps.reactRouterHistory = PropTypes.shape({\r\n go: PropTypes.func.isRequired,\r\n goBack: PropTypes.func.isRequired,\r\n push: PropTypes.func.isRequired,\r\n});\r\n\r\nReportingProps.instrumentation = PropTypes.object;\r\n\r\nReportingProps.reportList = PropTypes.shape({\r\n reportsTree: PropTypes.shape({\r\n name: PropTypes.string.isRequired,\r\n path: PropTypes.string.isRequired,\r\n children: PropTypes.array,\r\n }).isRequired,\r\n reports: PropTypes.object.isRequired,\r\n isValidCreateReportId: PropTypes.func.isRequired,\r\n isValidCategoryId: PropTypes.func.isRequired,\r\n});\r\n\r\nReportingProps.reportDescription = PropTypes.oneOfType([\r\n PropTypes.string.isRequired,\r\n PropTypes.shape({\r\n what: PropTypes.string.isRequired,\r\n why: PropTypes.string.isRequired,\r\n }).isRequired,\r\n]);\r\n\r\nReportingProps.reportDefinition = PropTypes.shape({\r\n apiKey: PropTypes.string.isRequired,\r\n description: ReportingProps.reportDescription.isRequired,\r\n name: PropTypes.string.isRequired,\r\n});\r\n\r\nReportingProps.logger = PropTypes.shape({\r\n mark: PropTypes.func.isRequired,\r\n trace: PropTypes.func.isRequired,\r\n error: PropTypes.func.isRequired,\r\n});\r\n\r\nReportingProps.identityDetails = PropTypes.shape({\r\n user: PropTypes.shape({\r\n Id: PropTypes.number.isRequired,\r\n Name: PropTypes.string.isRequired,\r\n ParentCustomerId: PropTypes.number.isRequired,\r\n }).isRequired,\r\n customer: PropTypes.shape({\r\n Id: PropTypes.number.isRequired,\r\n Name: PropTypes.string.isRequired,\r\n }).isRequired,\r\n lcid: PropTypes.number.isRequired,\r\n});\r\n\r\nReportingProps.updateId = PropTypes.string;\r\nReportingProps.permissions =\r\n PropTypes.shape({});\r\n\r\nReportingProps.reportSchema = PropTypes.object;\r\n\r\nReportingProps.repository = PropTypes.shape({\r\n getDetailsByExecutionId: PropTypes.func.isRequired,\r\n});\r\n\r\nReportingProps.servicesEndpoints = PropTypes.shape({\r\n CampaignAPI: PropTypes.string.isRequired,\r\n ClientCenterUIAPI: PropTypes.string.isRequired,\r\n Token: PropTypes.string.isRequired,\r\n});\r\n\r\nexport { ReportingProps as default };\r\n","import React, { useEffect, useState, useMemo, useContext, useCallback, useRef } from 'react';\r\nimport _ from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { Carousel, Glyphicon } from '@bingads-webui-react/primitive-unthemed';\r\nimport { TooltipHost, DirectionalHint } from '@bingads-webui-react/fabric-control';\r\nimport { curlyTemplate, generateGuid } from '@bingads-webui-universal/primitive-utilities';\r\nimport { withDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { ScopeContext } from '@bingads-webui-react/scope-service';\r\nimport {\r\n withTrack,\r\n withGetSummary,\r\n getSummaryCardModel,\r\n isReadOnly,\r\n ADINSIGHT_LOG_API_NAME,\r\n RECOMMENDATION_IDS,\r\n ADINSIGHT_LOG_ACTION_TYPE,\r\n NOT_SUPPORT_DOWNLOAD_TYPES,\r\n DOWNLOAD_SCOPE,\r\n APPLY_ACTION_TYPES,\r\n AUTO_APPLY_TYPES,\r\n SUPPORT_ADINSIGHT_AUTO_APPLY_TYPES,\r\n} from '@bingads-webui-campaign/recommendation-core';\r\nimport { SummaryFooter, SummaryHeader } from '@bingads-webui-campaign-react/recommendation-summary-view';\r\nimport { ApplyFormModal } from '@bingads-webui-campaign-react/recommendation-modal';\r\nimport { perfMarkerPropTypes } from '@bingads-webui/performance-marker';\r\n\r\nimport { getStyles } from './card-style';\r\n\r\nconst SummaryFooterWrapper = withTrack(/* withAll */ true)(SummaryFooter);\r\n\r\nconst getPathNamePrefix = (isMCC) => {\r\n const pathNamePrefix = '/campaign/vnext/recommendations/';\r\n const pathNamePrefixMCC = '/campaign/vnext/accounts/recommendations/';\r\n\r\n return isMCC ? pathNamePrefixMCC : pathNamePrefix;\r\n};\r\n\r\nfunction usePrevious(value) {\r\n const ref = useRef();\r\n useEffect(() => {\r\n ref.current = value;\r\n });\r\n return ref.current;\r\n}\r\n\r\nexport function InContextCardBase(props) {\r\n const {\r\n isMCC,\r\n guid,\r\n setInContextRecommendationContent,\r\n classes,\r\n data,\r\n deps,\r\n scope,\r\n currentActivity,\r\n adDisplayUrlService,\r\n dataService,\r\n newI18n,\r\n campaignType,\r\n filterService,\r\n channel,\r\n hideCard,\r\n entityType,\r\n reload,\r\n applyAllCallback,\r\n campaignAdGroups,\r\n haveEnoughSpace,\r\n overallOptimizationScoreBar,\r\n perfMarker,\r\n } = props;\r\n const scopeService = useContext(ScopeContext);\r\n const dataFiltered = useMemo(() => {\r\n const filtered = _.map(data, item => item);\r\n return filtered;\r\n }, [data]);\r\n\r\n const [index, setIndex] = useState(0);\r\n const [direction, setDirection] = useState(null);\r\n const [isAsyncApplyModalOpen, setIsAsyncApplyModalOpen] = useState(false);\r\n const [isApplyConfirmModalOpen, setIsApplyConfirmModalOpen] = useState(false);\r\n const [recommendationCount, setRecommendationCount] = useState(0);\r\n const [pollTask, setPollTask] = useState(null);\r\n const [onApplyConfirm, setOnApplyConfirm] = useState(() => _.noop);\r\n const [onApplyReject, setOnApplyReject] = useState(() => _.noop);\r\n\r\n const readOnly = isReadOnly && isReadOnly(deps.appConfig, isMCC);\r\n const shouldRenderInContextRecommendationCard = !_.isEmpty(dataFiltered) && haveEnoughSpace;\r\n\r\n const cardContext = useMemo(() => ({\r\n Source: null,\r\n Level: scope.levelAt,\r\n Category: null,\r\n entityType,\r\n CampaignIds: scope.campaignId ? [Number(scope.campaignId)] : [],\r\n AdGroupIds: scope.adGroupId ? [Number(scope.adGroupId)] : [],\r\n }), [entityType, scope.adGroupId, scope.campaignId, scope.levelAt]);\r\n\r\n const logOpportunityEvent = useCallback(({\r\n type = null,\r\n action,\r\n context = null,\r\n }) => {\r\n const api = ADINSIGHT_LOG_API_NAME.INCONTEXTCARD;\r\n\r\n currentActivity.trace({\r\n type: type || '',\r\n typeId: RECOMMENDATION_IDS[type],\r\n action,\r\n campaignId: scope.campaignId,\r\n channel,\r\n position: index + 1,\r\n guid: guid || '',\r\n context: JSON.stringify(context),\r\n entityType,\r\n }, api);\r\n }, [channel, currentActivity, entityType, guid, index, scope.campaignId]);\r\n\r\n useEffect(() => {\r\n setInContextRecommendationContent(!_.isEmpty(dataFiltered));\r\n }, [dataFiltered, setInContextRecommendationContent]);\r\n\r\n const previousIndex = usePrevious(index);\r\n const previousType = usePrevious(_.size(dataFiltered) > index ? dataFiltered[index].type : '');\r\n\r\n useEffect(() => {\r\n if (_.size(dataFiltered) > index &&\r\n previousIndex !== index &&\r\n previousType !== dataFiltered[index].type) {\r\n logOpportunityEvent({\r\n type: dataFiltered[index].type,\r\n action: ADINSIGHT_LOG_ACTION_TYPE.IMPRESSION,\r\n context: cardContext,\r\n });\r\n }\r\n }, [cardContext, dataFiltered, index, logOpportunityEvent, previousIndex, previousType]);\r\n\r\n const showAsyncApplyModal = (poll) => {\r\n setPollTask(poll);\r\n setIsAsyncApplyModalOpen(true);\r\n };\r\n\r\n const closeAsyncApplyModal = useCallback(() => {\r\n if (pollTask) {\r\n pollTask.stop();\r\n }\r\n setIsAsyncApplyModalOpen(false);\r\n }, [pollTask]);\r\n\r\n const showApplyConfirmModal = ({ onApply, countRecommendation, onReject = _.noop }) => {\r\n _.defer(() => {\r\n setIsApplyConfirmModalOpen(true);\r\n setRecommendationCount(countRecommendation);\r\n });\r\n setOnApplyConfirm(() => onApply);\r\n setOnApplyReject(() => onReject);\r\n };\r\n\r\n const closeApplyConfirmModal = () => {\r\n setIsApplyConfirmModalOpen(false);\r\n };\r\n\r\n const confirmApplyConfirmModal = useCallback(() => {\r\n if (_.isFunction(onApplyConfirm)) {\r\n onApplyConfirm();\r\n }\r\n closeApplyConfirmModal();\r\n }, [onApplyConfirm]);\r\n\r\n const rejectApplyConfirmModal = useCallback(() => {\r\n if (_.isFunction(onApplyReject)) {\r\n onApplyReject();\r\n }\r\n closeApplyConfirmModal();\r\n }, [onApplyReject]);\r\n\r\n const handleSelect = useCallback((selectedIndex, e) => {\r\n if ((selectedIndex === dataFiltered.length && e.direction === 'next')) {\r\n return;\r\n }\r\n\r\n setIndex(selectedIndex % dataFiltered.length);\r\n setDirection(e.direction);\r\n }, [dataFiltered.length]);\r\n\r\n const handleDownload = useCallback((type, version) => {\r\n dataService.download({\r\n channel,\r\n campaignType,\r\n filterService,\r\n recommendationType: type,\r\n }).then(() => {\r\n logOpportunityEvent({\r\n type,\r\n action: ADINSIGHT_LOG_ACTION_TYPE.DOWNLOAD,\r\n context: _.extend({\r\n Version: version,\r\n DownloadScope: DOWNLOAD_SCOPE.INDIVIDUAL,\r\n }, cardContext),\r\n });\r\n });\r\n }, [campaignType, cardContext, channel, dataService, filterService, logOpportunityEvent]);\r\n\r\n const renderPitch = useCallback(pitching => (\r\n pitching ? (\r\n \r\n
{newI18n.getString(_TL_('See why this is recommended for you'))}
\r\n ) : null\r\n ), [classes.tooTip, newI18n]);\r\n\r\n const renderPagination = useMemo(() => (\r\n _.size(dataFiltered) > 1 &&\r\n
\r\n {curlyTemplate(newI18n.getString(_TL_('{{pageNumber}} of {{pageCount}}')))({\r\n pageNumber: index + 1,\r\n pageCount: _.size(dataFiltered),\r\n })}\r\n
\r\n ), [classes.carouselIndex, dataFiltered, index, newI18n]);\r\n\r\n const renderPrevIcon = useMemo(() => (\r\n _.size(dataFiltered) > 1 &&\r\n \r\n ), [dataFiltered, index]);\r\n\r\n const renderNextIcon = useMemo(() => (\r\n _.size(dataFiltered) > 1 &&\r\n \r\n ), [dataFiltered, index]);\r\n\r\n const viewDetails = useCallback(type => () => {\r\n scopeService.scope.set({\r\n ...scopeService.scope.values,\r\n recommendationType: type,\r\n recsrc: channel,\r\n });\r\n scopeService.scope.save(`${getPathNamePrefix(isMCC)}All`);\r\n }, [channel, isMCC, scopeService.scope]);\r\n\r\n const viewHistory = useCallback(() => {\r\n const url = `${getPathNamePrefix(isMCC)}history?${\r\n scopeService.scope.stringify(scopeService.scope.values)}`;\r\n window.open(url);\r\n }, [isMCC, scopeService.scope]);\r\n\r\n const getAutoApplyToolTipText = useCallback((type) => {\r\n let recommendationName = '';\r\n if (type === 'MultiMediaAdsOpportunity') {\r\n recommendationName = newI18n.getString(_TL_('Multimedia ads'));\r\n } else if (type === 'ResponsiveSearchAdsOpportunity') {\r\n recommendationName = newI18n.getString(_TL_('responsive search ads'));\r\n }\r\n\r\n return curlyTemplate(newI18n.getString(_TL_('New {{recommendationName}} recommendations will auto apply soon.')))({\r\n recommendationName,\r\n });\r\n }, [newI18n]);\r\n\r\n const carousel = useMemo(() => (\r\n dataFiltered.length - 1 ? 0 : index}\r\n direction={dataFiltered.length === 1 ? null : direction}\r\n onSelect={handleSelect}\r\n controls={false}\r\n indicators={false}\r\n prevIcon={renderPrevIcon}\r\n nextIcon={renderNextIcon}\r\n showPrevNextControls={dataFiltered.length > 1}\r\n > { _.map(dataFiltered, (recommendation) => {\r\n const model = getSummaryCardModel(_.extend({}, recommendation, {\r\n i18n: deps.i18n,\r\n newI18n,\r\n currency: deps.pageContext.AccountCurrencyCode,\r\n scope: scope.levelAt,\r\n permissions: deps.pageContext.Permissions,\r\n adDisplayUrlService,\r\n combineText: deps.combineText,\r\n currentActivity,\r\n }));\r\n\r\n const headerMenuItems = _.compact([\r\n _.contains(NOT_SUPPORT_DOWNLOAD_TYPES, model.type) ? null :\r\n {\r\n name: newI18n.getString(_TL_('Download this recommendation')),\r\n func: () => handleDownload(model.type, recommendation.version),\r\n }, {\r\n name: newI18n.getString(_TL_('Hide this tile')),\r\n func: () => {\r\n logOpportunityEvent({\r\n action: ADINSIGHT_LOG_ACTION_TYPE.HIDE,\r\n channel,\r\n campaignId: scope.campaignId,\r\n context: cardContext,\r\n });\r\n hideCard();\r\n },\r\n }]);\r\n\r\n const isOptimizationScoreOn = !isMCC && _.result(deps.pageContext.Permissions.dynamic, 'OptimizationScore');\r\n const isAutoApplyRecommendationEnabled = !isMCC && _.result(deps.pageContext.Permissions, 'IsAutoApplyRecommendationEnabled');\r\n const showAutoApply = isAutoApplyRecommendationEnabled\r\n && _.contains(\r\n _.keys(AUTO_APPLY_TYPES).concat(SUPPORT_ADINSIGHT_AUTO_APPLY_TYPES),\r\n model.type\r\n )\r\n && recommendation.isAutoApplyOptIn;\r\n\r\n return (\r\n \r\n \r\n
\r\n
\r\n {model.summary.description}\r\n
\r\n {renderPitch(model.summary.pitching)}\r\n
\r\n {renderPagination}\r\n {\r\n reload({\r\n isFromApplyOrDismiss: op.userAction !== APPLY_ACTION_TYPES.UNDISMISS,\r\n });\r\n if (op.userAction === APPLY_ACTION_TYPES.ACCEPT) {\r\n applyAllCallback();\r\n }\r\n }}\r\n newI18n={newI18n}\r\n />\r\n
\r\n );\r\n })}\r\n \r\n \r\n ), [\r\n dataFiltered, index, direction, handleSelect,\r\n renderPrevIcon, renderNextIcon, deps, viewHistory,\r\n isApplyConfirmModalOpen, isAsyncApplyModalOpen, recommendationCount,\r\n confirmApplyConfirmModal, rejectApplyConfirmModal, closeAsyncApplyModal,\r\n scope, adDisplayUrlService, currentActivity, newI18n, isMCC,\r\n readOnly, getAutoApplyToolTipText, overallOptimizationScoreBar,\r\n classes.cardContent, classes.description, renderPitch, renderPagination,\r\n guid, cardContext, campaignAdGroups, logOpportunityEvent, viewDetails,\r\n dataService, handleDownload, channel, hideCard, reload, applyAllCallback]);\r\n\r\n useEffect(() => {\r\n if (shouldRenderInContextRecommendationCard && perfMarker && !perfMarker.isDone) {\r\n perfMarker.done();\r\n }\r\n }, [shouldRenderInContextRecommendationCard, perfMarker]);\r\n\r\n return shouldRenderInContextRecommendationCard && (\r\n
\r\n {carousel}\r\n
);\r\n}\r\n\r\nInContextCardBase.propTypes = {\r\n setInContextRecommendationContent: PropTypes.func.isRequired,\r\n classes: PropTypes.shape({}).isRequired,\r\n isMCC: PropTypes.bool.isRequired,\r\n guid: PropTypes.string,\r\n data: PropTypes.shape().isRequired,\r\n deps: PropTypes.shape().isRequired,\r\n scope: PropTypes.shape({\r\n campaignId: PropTypes.number,\r\n adGroupId: PropTypes.number,\r\n }).isRequired,\r\n adDisplayUrlService: PropTypes.shape().isRequired,\r\n dataService: PropTypes.shape({\r\n track: PropTypes.func,\r\n }).isRequired,\r\n currentActivity: PropTypes.shape({\r\n trace: PropTypes.func,\r\n }).isRequired,\r\n newI18n: PropTypes.shape({}).isRequired,\r\n downloadService: PropTypes.shape({}).isRequired,\r\n campaignType: PropTypes.number,\r\n filterService: PropTypes.shape({}),\r\n channel: PropTypes.string.isRequired,\r\n hideCard: PropTypes.func.isRequired,\r\n entityType: PropTypes.string.isRequired,\r\n reload: PropTypes.func.isRequired,\r\n applyAllCallback: PropTypes.func,\r\n campaignAdGroups: PropTypes.arrayOf(PropTypes.shape({\r\n Key: PropTypes.number,\r\n Value: PropTypes.arrayOf(PropTypes.number),\r\n })).isRequired,\r\n haveEnoughSpace: PropTypes.bool,\r\n overallOptimizationScoreBar: PropTypes.shape({\r\n Gained: PropTypes.number,\r\n Dismissed: PropTypes.number,\r\n Available: PropTypes.number,\r\n }),\r\n perfMarker: perfMarkerPropTypes,\r\n};\r\n\r\nInContextCardBase.defaultProps = {\r\n guid: generateGuid(),\r\n campaignType: null,\r\n filterService: null,\r\n applyAllCallback: _.noop,\r\n haveEnoughSpace: true,\r\n overallOptimizationScoreBar: null,\r\n perfMarker: null,\r\n};\r\n\r\nexport const InContextCard = withGetSummary(\r\n false, // withDetails\r\n false // needExamples\r\n)(withDefaultStyles(InContextCardBase, getStyles));\r\n","import { extend } from 'underscore';\r\nimport { getHeaderStyles, getApplyFormStyles, getIconStyles, getFeedbackModalStyles } from '@bingads-webui-campaign-react/recommendation-shared-styles';\r\n\r\nconst cardWidth = 447;\r\n\r\nexport const getStyles = ({\r\n palette = {\r\n white: '#FFFFFF',\r\n themePrimary: '#0078D4',\r\n },\r\n}) => ({\r\n '@global': extend(\r\n Object.assign(getApplyFormStyles({ palette })),\r\n Object.assign(getFeedbackModalStyles({ palette }))\r\n ),\r\n carouselContainer: {\r\n width: cardWidth,\r\n height: 193,\r\n marginTop: 23,\r\n marginRight: 16,\r\n flexShrink: 0,\r\n flexGrow: 0,\r\n display: 'flex',\r\n boxShadow: '0px 1.6px 3.6px rgba(0, 0, 0, 0.132), 0px 0.3px 0.9px rgba(0, 0, 0, 0.108)',\r\n\r\n '& .carousel-wrapper': {\r\n display: 'flex',\r\n '& .carousel .item': {\r\n width: cardWidth,\r\n\r\n '& .recommendation-summary-header': {\r\n padding: '8px 13px 8px 16px',\r\n borderBottom: '1px solid #F3F2F1',\r\n\r\n ...getHeaderStyles({ palette }),\r\n ...getIconStyles(),\r\n },\r\n '& .recommendation-summary-footer': {\r\n paddingLeft: '16px',\r\n '& button.btn-primary': {\r\n marginRight: '8px',\r\n },\r\n '& button.btn': {\r\n paddingLeft: '12px',\r\n paddingRight: '12px',\r\n fontSize: '12px',\r\n },\r\n },\r\n },\r\n '& .carousel-control': {\r\n textShadow: 'none',\r\n background: 'none',\r\n cursor: 'default',\r\n top: 'auto',\r\n bottom: '10px',\r\n '&:focus:after': {\r\n border: 'none',\r\n },\r\n '&.left': {\r\n color: palette.themePrimary,\r\n right: '36px',\r\n left: 'auto',\r\n },\r\n '&.right': {\r\n color: palette.themePrimary,\r\n right: '13px',\r\n },\r\n '& .iconba': {\r\n cursor: 'pointer',\r\n\r\n '&.disabled': {\r\n cursor: 'default',\r\n color: '#C8C6C4',\r\n },\r\n },\r\n },\r\n },\r\n },\r\n cardContent: {\r\n padding: '0px 16px',\r\n height: '106px',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'space-evenly',\r\n },\r\n description: {\r\n fontSize: '16px',\r\n lineHeight: '20px',\r\n fontWeight: 600,\r\n },\r\n tooTip: {\r\n borderBottom: `1px dashed ${palette.themePrimary}`,\r\n cursor: 'default',\r\n display: 'inline-block',\r\n color: '#666666',\r\n },\r\n carouselIndex: {\r\n position: 'absolute',\r\n right: '60px',\r\n bottom: '3px',\r\n },\r\n});\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport ReactModal from 'react-modal';\r\n\r\nexport class RecommendationModal extends React.PureComponent {\r\n static propTypes = {\r\n isOpen: PropTypes.bool.isRequired,\r\n onCancel: PropTypes.func.isRequired,\r\n children: PropTypes.node.isRequired,\r\n closeOnOverlayClick: PropTypes.bool,\r\n };\r\n\r\n static defaultProps = {\r\n closeOnOverlayClick: true,\r\n };\r\n\r\n componentDidMount() {\r\n ReactModal.setAppElement(document.body);\r\n }\r\n\r\n render() {\r\n const {\r\n isOpen,\r\n onCancel,\r\n closeOnOverlayClick,\r\n } = this.props;\r\n\r\n return (\r\n \r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport _ from 'underscore';\r\nimport $ from 'jquery';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { RecommendationModal } from './modal';\r\nimport template from './template.pug';\r\n\r\nclass ModalContainer extends React.PureComponent {\r\n static propTypes = {\r\n el: PropTypes.string.isRequired,\r\n Form: PropTypes.shape({\r\n render: PropTypes.func.isRequired,\r\n }).isRequired,\r\n onCancel: PropTypes.func.isRequired,\r\n }\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n isOpen: true,\r\n };\r\n }\r\n\r\n onAction = () => {\r\n this.setState({ isOpen: false });\r\n }\r\n\r\n render() {\r\n const { isOpen } = this.state;\r\n const { Form, onCancel } = this.props;\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport function showRecommendationModal(options) {\r\n const container = document.querySelector('.recommendation-modal-container');\r\n if (container !== null) {\r\n ReactDOM.unmountComponentAtNode(container);\r\n } else {\r\n $(document.body).append(template());\r\n }\r\n ReactDOM.render(\r\n (\r\n \r\n ), document.querySelector('.recommendation-modal-container')\r\n );\r\n}\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\n\r\nexport class ConfirmForm extends React.PureComponent {\r\n static propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n title: PropTypes.string.isRequired,\r\n content: PropTypes.string.isRequired,\r\n confirmString: PropTypes.string.isRequired,\r\n cancelString: PropTypes.string.isRequired,\r\n onConfirm: PropTypes.func.isRequired,\r\n onCancel: PropTypes.func.isRequired,\r\n // extraAction is close modal action, used in no-react environment\r\n extraAction: PropTypes.func,\r\n };\r\n\r\n static defaultProps = {\r\n extraAction: () => {},\r\n };\r\n\r\n onConfirm = () => {\r\n this.props.onConfirm();\r\n this.props.extraAction();\r\n };\r\n\r\n onCancel = () => {\r\n this.props.onCancel();\r\n this.props.extraAction();\r\n };\r\n\r\n render() {\r\n const {\r\n title,\r\n content,\r\n confirmString,\r\n cancelString,\r\n i18n,\r\n } = this.props;\r\n\r\n return (\r\n \r\n \r\n

{title}

\r\n
{content}
\r\n \r\n {confirmString}\r\n \r\n \r\n {cancelString}\r\n \r\n \r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { RecommendationModal } from './modal';\r\nimport { ConfirmForm } from './forms/confirm-form';\r\n\r\nexport class ConfirmFormModal extends React.PureComponent {\r\n static propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n isApplyConfirmModalOpen: PropTypes.bool.isRequired,\r\n countRecommendation: PropTypes.number.isRequired,\r\n confirmApplyConfirmModal: PropTypes.func.isRequired,\r\n rejectApplyConfirmModal: PropTypes.func.isRequired,\r\n };\r\n\r\n render() {\r\n const {\r\n i18n,\r\n isApplyConfirmModalOpen,\r\n countRecommendation,\r\n confirmApplyConfirmModal,\r\n rejectApplyConfirmModal,\r\n } = this.props;\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\n\r\nexport class AsyncApplyForm extends React.PureComponent {\r\n static propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n routeApplyHistory: PropTypes.func.isRequired,\r\n runInBackground: PropTypes.func.isRequired,\r\n // extraAction is close modal action, used in no-react environment\r\n extraAction: PropTypes.func,\r\n };\r\n\r\n static defaultProps = {\r\n extraAction: () => {},\r\n };\r\n\r\n routeApplyHistory = () => {\r\n this.props.routeApplyHistory();\r\n this.props.extraAction();\r\n };\r\n\r\n runInBackground = () => {\r\n this.props.runInBackground();\r\n this.props.extraAction();\r\n };\r\n\r\n render() {\r\n const {\r\n i18n,\r\n } = this.props;\r\n const applyHistoryLink = (\r\n \r\n {i18n.getString('Recommendation_Async_Route_To_History')}\r\n \r\n );\r\n\r\n return (\r\n \r\n \r\n

\r\n \r\n \r\n \r\n \r\n \r\n {i18n.getString('Recommendation_Async_Apply_Title')}\r\n

\r\n
\r\n {i18n.getString('Recommendation_Async_Apply_Choices_Prefix')}\r\n
\r\n
\r\n {applyHistoryLink}\r\n
\r\n \r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { RecommendationModal } from './modal';\r\nimport { AsyncApplyForm } from './forms/async-apply-form';\r\n\r\nexport class AsyncApplyFormModal extends React.PureComponent {\r\n static propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n isAsyncApplyModalOpen: PropTypes.bool.isRequired,\r\n closeAsyncApplyModal: PropTypes.func.isRequired,\r\n viewHistory: PropTypes.func.isRequired,\r\n };\r\n\r\n render() {\r\n const {\r\n i18n,\r\n isAsyncApplyModalOpen,\r\n closeAsyncApplyModal,\r\n viewHistory,\r\n } = this.props;\r\n\r\n return (\r\n \r\n {\r\n closeAsyncApplyModal();\r\n viewHistory();\r\n }}\r\n />\r\n \r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { ConfirmFormModal } from './show-confirm-form-modal';\r\nimport { AsyncApplyFormModal } from './show-async-apply-form-modal';\r\n\r\nexport class ApplyFormModal extends React.PureComponent {\r\n static propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n isApplyConfirmModalOpen: PropTypes.bool.isRequired,\r\n isAsyncApplyModalOpen: PropTypes.bool.isRequired,\r\n countRecommendation: PropTypes.number.isRequired,\r\n confirmApplyConfirmModal: PropTypes.func.isRequired,\r\n rejectApplyConfirmModal: PropTypes.func.isRequired,\r\n closeAsyncApplyModal: PropTypes.func.isRequired,\r\n viewHistory: PropTypes.func.isRequired,\r\n };\r\n\r\n render() {\r\n const {\r\n i18n,\r\n isApplyConfirmModalOpen,\r\n isAsyncApplyModalOpen,\r\n countRecommendation,\r\n confirmApplyConfirmModal,\r\n rejectApplyConfirmModal,\r\n closeAsyncApplyModal,\r\n viewHistory,\r\n } = this.props;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\n\r\nexport class AsyncBulkAarConfirmForm extends React.PureComponent {\r\n static propTypes = {\r\n newI18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n title: PropTypes.string.isRequired,\r\n content: PropTypes.string.isRequired,\r\n confirmString: PropTypes.string.isRequired,\r\n cancelString: PropTypes.string.isRequired,\r\n onConfirm: PropTypes.func.isRequired,\r\n onCancel: PropTypes.func.isRequired,\r\n loading: PropTypes.bool.isRequired,\r\n stage: PropTypes.number.isRequired,\r\n // extraAction is close modal action, used in no-react environment\r\n extraAction: PropTypes.func,\r\n };\r\n\r\n static defaultProps = {\r\n extraAction: () => {},\r\n };\r\n\r\n onConfirm = () => {\r\n this.props.onConfirm();\r\n this.props.extraAction();\r\n };\r\n\r\n onCancel = () => {\r\n this.props.onCancel();\r\n this.props.extraAction();\r\n };\r\n\r\n render() {\r\n const {\r\n title,\r\n content,\r\n confirmString,\r\n cancelString,\r\n loading,\r\n stage,\r\n i18n,\r\n newI18n,\r\n } = this.props;\r\n\r\n const stageString = [\r\n _TL_('Uploading file ...'),\r\n _TL_('Validating your access to make updates ...'),\r\n _TL_('Applying changes ...'),\r\n ];\r\n\r\n return (\r\n
\r\n {\r\n !loading &&\r\n \r\n }\r\n
{title}
\r\n
\r\n {\r\n loading ?\r\n \r\n \r\n \r\n \r\n {newI18n.getString(stageString[stage])}\r\n \r\n \r\n \r\n : content\r\n }\r\n
\r\n {\r\n !loading &&\r\n \r\n {confirmString}\r\n \r\n }\r\n {\r\n !loading &&\r\n \r\n {cancelString}\r\n \r\n }\r\n
\r\n );\r\n }\r\n}\r\n","export const ApiErrorMapping = {\r\n EntityAlreadyExists: _TL_('This profile is already connected to your account.'),\r\n ExceedTheLimit: _TL_(\"You've reached the maximum number of social profiles you can connect to your account.\"),\r\n InternalError: _TL_('An unidentified error has occurred. Please try again later.'),\r\n GeneralError: _TL_(\"We've encountered an error and could not finish this task. Please try again or contact support.\"),\r\n};\r\n\r\nexport const generalError = ApiErrorMapping.GeneralError;\r\n","import _ from 'underscore';\r\n\r\n// please in uppercase characters\r\n// please sort alphabetically\r\nconst errorCodes = [\r\n 'AUTHORIZATIONEXPIRE',\r\n 'BINGPREVIEWAPIERROR',\r\n 'CAMPAIGNINLINEEDITORIALERROR',\r\n 'CCMTERRORNUMBER_POSTPAYACCOUNTCANTASSOCIATEWITHPREPAIDCARD',\r\n 'DUPLICATEENTITY',\r\n 'ENTITYDOESNOTEXIST',\r\n 'EXCEEDACCOUNTGOALLIMIT',\r\n 'EXCEEDTHELIMIT',\r\n 'ExpandedTextAdInlineEditorialError',\r\n 'FACEBOOKAPIUSERERROR',\r\n 'GOALHAVEDUPLICATENAME',\r\n 'GOALHAVEDUPLICATEURLANDOPERATOR',\r\n 'INSUFFICIENTPERMISSIONORNEEDENABLE2FA',\r\n 'INVALIDACTION',\r\n 'INVALIDACTIONONSMARTPAGEASSOCIATEDMCACAMPAIGN',\r\n 'INVALIDBUSINESSNAME',\r\n 'INVALIDDESTINATIONGOALOPERATOR',\r\n 'INVALIDKEYWORDTEXT',\r\n 'INVALIDPARAMETER',\r\n 'INVALIDVALUE',\r\n 'INVALIDZIPCODE',\r\n 'KEYWORDINLINEEDITORIALERROR',\r\n 'LINKEDINAPIERROR',\r\n 'LOCATIONNOTEXIST',\r\n 'LOCATIONNOTSUPPORTED',\r\n 'MEDIASIZEEXCEEDLIMIT',\r\n 'NEEDADMINPERMISSION',\r\n 'NEEDBUSINESSADMINPERMISSION',\r\n 'PAYMENTNOTSET',\r\n 'PROFILEALREADYLINKED',\r\n 'SMARTPAGEINVALIDSUBDOMAIN',\r\n 'SMARTPAGESUBDOMAINISNOTAVAILABLE',\r\n 'TIMEZONENOTMATCH',\r\n 'TOKENEXPIRED',\r\n 'TOKENNOTMATCHTOPROFILE',\r\n 'TWITTERAPIERROR',\r\n 'TWITTERAPIUSERERROR',\r\n 'UNSUPPORTEDWEBSITEDOMAIN',\r\n 'URLNOTACCESSIBLE',\r\n];\r\n\r\nexport const expectedErrorCodes = _.chain(errorCodes)\r\n .map(errorCode => errorCode.trim().toUpperCase())\r\n .value();\r\n\r\nexport function isExpectedErrorCodes(errorResponseJson) {\r\n if (_.isEmpty(errorResponseJson)) {\r\n return false;\r\n }\r\n const errorCodesInResponse = _.chain(errorResponseJson)\r\n .pluck('Code')\r\n .compact()\r\n .map(code => code.trim().toUpperCase())\r\n .uniq()\r\n .value();\r\n\r\n if (_.isEmpty(errorCodesInResponse)) {\r\n return false;\r\n }\r\n\r\n for (let index = 0; index < errorCodesInResponse.length; index += 1) {\r\n if (!_.contains(expectedErrorCodes, errorCodesInResponse[index])) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n","export const getApplyFormStyles = ({ palette = {}, iconFontFamily = 'MsAds MDL2 Assets' }) => (\r\n {\r\n '.recommendation-modal-overlay': {\r\n position: 'fixed',\r\n top: '0',\r\n left: '0',\r\n right: '0',\r\n bottom: '0',\r\n backgroundColor: 'rgba(51,51,51,0.3)',\r\n zIndex: '1061',\r\n '& .recommendation-modal': {\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n overflow: 'auto',\r\n outline: 'none',\r\n transform: 'translate(-50%,-50%)',\r\n marginRight: '-50%',\r\n padding: 24,\r\n border: '1px solid #d9d9d9',\r\n color: '#333',\r\n backgroundColor: palette.white,\r\n boxShadow: '0px 4.8px 14.4px rgba(0, 0, 0, 0.18), 0px 25.6px 57.6px rgba(0, 0, 0, 0.22)',\r\n borderRadius: '2px',\r\n\r\n '& .recommendation-confirm-form': {\r\n width: 402,\r\n\r\n '& .close.close-image': {\r\n fontStyle: 'normal',\r\n fontWeight: 'normal',\r\n fontSize: 12,\r\n lineHeight: '12px',\r\n },\r\n\r\n '& .recommendation-confirm-title': {\r\n fontFamily: 'Segoe UI',\r\n fontStyle: 'normal',\r\n fontWeight: 600,\r\n fontSize: 20,\r\n lineHeight: '27px',\r\n marginBottom: 26,\r\n marginTop: 0,\r\n },\r\n\r\n '& .recommendation-confirm-content': {\r\n fontFamily: 'Segoe UI',\r\n fontSize: 14,\r\n lineHeight: '20px',\r\n marginBottom: 19,\r\n },\r\n\r\n '& .btn-confirm': {\r\n backgroundColor: palette.themePrimary,\r\n fontSize: 14,\r\n fontWeight: 600,\r\n marginRight: 8,\r\n lineHeight: '19px',\r\n color: palette.white,\r\n },\r\n\r\n '& .btn-cancel': {\r\n backgroundColor: palette.white,\r\n border: '1px solid #8A8886',\r\n fontSize: 14,\r\n fontWeight: 600,\r\n lineHeight: '19px',\r\n },\r\n },\r\n '& .recommendation-async-bulk-aar-confirm-form': {\r\n width: 402,\r\n\r\n '& .close.close-image': {\r\n fontStyle: 'normal',\r\n fontWeight: 'normal',\r\n fontSize: 12,\r\n lineHeight: '12px',\r\n },\r\n\r\n '& .recommendation-aysnc-confirm-title': {\r\n fontFamily: 'Segoe UI',\r\n fontStyle: 'normal',\r\n fontWeight: 600,\r\n fontSize: 20,\r\n lineHeight: '27px',\r\n marginBottom: 26,\r\n marginTop: 0,\r\n },\r\n\r\n '& .recommendation-async-confirm-content': {\r\n fontFamily: 'Segoe UI',\r\n fontSize: 14,\r\n lineHeight: '20px',\r\n marginBottom: 19,\r\n '& .blocker': {\r\n display: 'inline-block',\r\n\r\n '& .blocker-indicator': {\r\n position: 'relative',\r\n padding: 0,\r\n top: 2,\r\n left: 0,\r\n\r\n '& .blocker-image': {\r\n height: 24,\r\n width: 24,\r\n },\r\n },\r\n },\r\n },\r\n\r\n '& .btn-confirm': {\r\n backgroundColor: palette.themePrimary,\r\n fontSize: 14,\r\n fontWeight: 600,\r\n marginRight: 8,\r\n lineHeight: '19px',\r\n color: palette.white,\r\n },\r\n\r\n '& .btn-cancel': {\r\n backgroundColor: palette.white,\r\n border: '1px solid #8A8886',\r\n fontSize: 14,\r\n fontWeight: 600,\r\n lineHeight: '19px',\r\n },\r\n },\r\n '& .recommendation-async-apply-form': {\r\n width: 482,\r\n\r\n '& .closeimage': {\r\n fontSize: 16,\r\n position: 'relative',\r\n top: '-8px',\r\n right: '-8px',\r\n fontFamily: iconFontFamily,\r\n },\r\n\r\n '& .closeimage:before': {\r\n content: '\"\\\\E711\"',\r\n },\r\n\r\n '& .recommendation-async-apply-title': {\r\n fontFamily: 'Segoe UI',\r\n fontStyle: 'normal',\r\n fontWeight: 600,\r\n fontSize: '14px',\r\n lineHeight: '19px',\r\n color: palette.black,\r\n marginBottom: 12,\r\n marginTop: 0,\r\n\r\n '& .blocker': {\r\n display: 'inline-block',\r\n\r\n '& .blocker-indicator': {\r\n position: 'relative',\r\n padding: 0,\r\n top: 2,\r\n left: 0,\r\n\r\n '& .blocker-image': {\r\n marginRight: 9,\r\n height: 14,\r\n width: 14,\r\n },\r\n },\r\n },\r\n },\r\n\r\n '& .recommendation-async-apply-actions': {\r\n fontFamily: 'Segoe UI',\r\n fontSize: 12,\r\n lineHeight: '16px',\r\n color: palette.black,\r\n marginBottom: 8,\r\n },\r\n\r\n '& .recommendation-apply-history': {\r\n fontFamily: 'Segoe UI',\r\n fontSize: 12,\r\n lineHeight: '16px',\r\n border: 'unset',\r\n padding: 'unset',\r\n color: '#337ABC',\r\n },\r\n },\r\n },\r\n },\r\n });\r\n","export const getFeedbackModalStyles = () => ({\r\n // recommendations-feedback-modal\r\n '.recommendation-feedback-overlay': {\r\n position: 'fixed',\r\n top: '0',\r\n left: '0',\r\n right: '0',\r\n bottom: '0',\r\n backgroundColor: 'rgba(51,51,51,0.3)',\r\n zIndex: '1061',\r\n '& .recommendation-feedback-modal': {\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n overflow: 'auto',\r\n outline: 'none',\r\n transform: 'translate(-50%,-50%)',\r\n marginRight: '-50%',\r\n width: 605,\r\n padding: 20,\r\n border: '1px solid #d9d9d9',\r\n background: '#fff',\r\n color: '#333',\r\n\r\n '& .form-inline': {\r\n '& .btn': {\r\n marginRight: 8,\r\n },\r\n },\r\n '& button.close': {\r\n marginTop: 3,\r\n },\r\n '& button:disabled': {\r\n color: '#666',\r\n backgroundColor: '#F4F4F4',\r\n border: '1px solid #CCC',\r\n },\r\n '& h3': {\r\n fontWeight: '600',\r\n marginTop: 0,\r\n marginBottom: 30,\r\n },\r\n '& p, & .radio': {\r\n paddingLeft: 10,\r\n fontFamily: '\\'Segoe UI\\', Arial, sans-serif',\r\n\r\n '&[data-checked=true]': {\r\n backgroundColor: '#DEECF9',\r\n },\r\n },\r\n '& div.reasons': {\r\n margin: '20px 0',\r\n },\r\n '& div.comments': {\r\n margin: '20px 0',\r\n '& textarea': {\r\n height: 75,\r\n width: 330,\r\n border: '1px #bbb solid',\r\n background: '#fff',\r\n marginBottom: 5,\r\n },\r\n },\r\n },\r\n },\r\n\r\n // recommendations-dismiss-feedback\r\n '.recommendation-dismiss-feedback-popup': {\r\n position: 'fixed',\r\n right: 10,\r\n bottom: 70,\r\n zIndex: '2000',\r\n '& .close': {\r\n right: 5,\r\n top: 5,\r\n position: 'relative',\r\n },\r\n },\r\n '.recommendation-dismiss-feedback-form': {\r\n width: 400,\r\n padding: 20,\r\n boxShadow: '0 0 5px #ccc',\r\n backgroundColor: '#fff',\r\n '& h3': {\r\n fontWeight: 'bold',\r\n },\r\n '& .checkbox.preference': {\r\n color: '#bbb',\r\n },\r\n '& button:disabled': {\r\n background: '#f3f2f1',\r\n borderColor: 'transparent',\r\n color: '#a19f9d',\r\n cursor: 'default',\r\n },\r\n },\r\n});\r\n","export const getHeaderStyles = ({ palette }) => (\r\n {\r\n display: 'grid',\r\n gridTemplateColumns: '24px minmax(0, min-content) min-content auto max-content 24px',\r\n gridTemplateRows: 24,\r\n alignItems: 'center',\r\n '& .summary-header-icon': {\r\n gridColumn: '1',\r\n justifySelf: 'stretch',\r\n alignSelf: 'center',\r\n position: 'relative',\r\n borderRadius: '50%',\r\n width: 24,\r\n height: 24,\r\n '& span': {\r\n color: palette.white,\r\n position: 'absolute',\r\n fontSize: 13,\r\n left: '25%',\r\n right: '25%',\r\n top: '25%',\r\n bottom: '25%',\r\n },\r\n },\r\n '& .summary-header-title': {\r\n padding: '0 0 0 10px',\r\n gridColumn: '2',\r\n fontSize: 14,\r\n color: '#323130',\r\n fontWeight: '500',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n },\r\n '& .summary-header-label': {\r\n alignSelf: 'center',\r\n marginLeft: 8,\r\n gridColumn: '3',\r\n fontSize: 12,\r\n background: '#EFF6FC',\r\n border: '1px solid #FFFFFF',\r\n boxSizing: 'border-box',\r\n borderRadius: 12,\r\n width: 48,\r\n padding: '0 10px 0 10px',\r\n },\r\n '& .summary-card-os-tag-container': {\r\n gridColumn: '5',\r\n '& .not-available-line': {\r\n paddingLeft: 10,\r\n paddingRight: 10,\r\n },\r\n '& .iconba.iconba-Trending12': {\r\n paddingLeft: 8,\r\n paddingRight: 8,\r\n paddingBottom: 3,\r\n },\r\n },\r\n '& .summary-header-auto-apply': {\r\n marginLeft: 8,\r\n gridColumn: '3',\r\n height: 20,\r\n fontSize: '11px',\r\n lineHeight: '16px',\r\n borderRadius: '12px',\r\n backgroundColor: '#F7F7F7',\r\n padding: '0px 10px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n\r\n '& .iconba.iconba-FlashAuto': {\r\n top: '2px',\r\n },\r\n },\r\n '& .summary-header-menu': {\r\n gridColumn: '6',\r\n justifySelf: 'right',\r\n '& .toggle-context-menu': {\r\n cursor: 'pointer',\r\n '& button': {\r\n background: 'none',\r\n border: 'none',\r\n margin: 0,\r\n padding: 0,\r\n },\r\n },\r\n '& .bingads-popover': {\r\n right: 5,\r\n },\r\n },\r\n '& .summary-context-menu': {\r\n '& .bingads-popover': {\r\n background: '#fff',\r\n border: '1px solid #ddd',\r\n boxShadow: '3px 3px 4px #ddd',\r\n top: 'inherit !important',\r\n left: 'inherit !important',\r\n '& >ul': {\r\n minWidth: 170,\r\n listStyle: 'none',\r\n margin: '0',\r\n padding: '0',\r\n '& button': {\r\n margin: '0',\r\n padding: '7px 10px',\r\n color: '#333',\r\n fontWeight: 'normal',\r\n textAlign: 'left',\r\n '&[disabled]': {\r\n opacity: 0.5,\r\n },\r\n '&:hover': {\r\n textDecoration: 'none',\r\n background: '#e5e5e5',\r\n },\r\n },\r\n },\r\n },\r\n },\r\n '& .new-badge-container': {\r\n gridColumn: 4,\r\n justifySelf: 'right',\r\n marginRight: 8,\r\n },\r\n }\r\n);\r\n","export const getIconStyles = () => ({\r\n '& .recommendation-keyword-icon': {\r\n backgroundColor: '#00AD56',\r\n },\r\n '& .recommendation-repair-icon': {\r\n backgroundColor: '#A80000',\r\n },\r\n '& .recommendation-ads-icon': {\r\n backgroundColor: '#0078D4',\r\n },\r\n '& .recommendation-bid-icon': {\r\n backgroundColor: '#00B7C3',\r\n },\r\n '& .recommendation-shopping-cart-icon': {\r\n backgroundColor: '#CA5010',\r\n },\r\n '& .recommendation-extension-icon': {\r\n backgroundColor: '#4F6BED',\r\n },\r\n '& .recommendation-seasonal-icon': {\r\n backgroundColor: '#E3008C',\r\n },\r\n '& .recommendation-targeting-icon': {\r\n backgroundColor: '#881798',\r\n },\r\n '& .recommendation-budget-icon': {\r\n backgroundColor: '#8378DE',\r\n },\r\n '& .recommendation-auto-apply-icon': {\r\n backgroundColor: '#373277',\r\n },\r\n '& .recommendation-p-max-icon': {\r\n backgroundColor: '#038387',\r\n },\r\n '& .recommendation-syndication-icon': {\r\n backgroundColor: '#4F6BED',\r\n },\r\n});\r\n","import { isString, size, isFinite } from 'underscore';\r\n\r\n/**\r\n * Regex Pattern for wide characters\r\n */\r\nconst wideCharPattern = new RegExp(\r\n '[\\\\u1100-\\\\u11FF]' + // IsHangulJamo\r\n '|[\\\\u2E80-\\\\u2EFF]' + // IsCJKRadicalsSupplement\r\n '|[\\\\u3000-\\\\u303F]' + // IsCJKSymbolsandPunctuation\r\n '|[\\\\u3040-\\\\u309F]' + // IsHiragana\r\n '|[\\\\u30A0-\\\\u30FF]' + // IsKatakana\r\n '|[\\\\u3130-\\\\u318F]' + // IsHangulCompatibilityJamo\r\n '|[\\\\u3200-\\\\u32FF]' + // IsEnclosedCJKLettersandMonths\r\n '|[\\\\u3300-\\\\u33FF]' + // IsCJKCompatibility\r\n '|[\\\\u3400-\\\\u4DBF]' + // IsCJKUnifiedIdeographsExtensionA\r\n '|[\\\\u4E00-\\\\u9FFF]' + // IsCJKUnifiedIdeographs\r\n '|[\\\\uAC00-\\\\uD7AF]' + // IsHangulSyllables\r\n '|[\\\\uF900-\\\\uFAFF]' + // IsCJKCompatibilityIdeographs\r\n '|[\\\\uFE30-\\\\uFE4F]' + // IsCJKCompatibilityForms\r\n '|[\\\\uFF01-\\\\uFF60]' + // Fullwidth Forms Part 1\r\n '|[\\\\uFFE0-\\\\uFFE6]' + // Fullwidth Forms Part 2\r\n '|[\\\\uD800-\\\\uDBFF][\\\\uDC00-\\\\uDFFF]' // Astral Planes\r\n , 'g'\r\n);\r\n\r\n/**\r\n * Get string length, which counting CJK character or Emojis as 2\r\n * @param {string} str - string to count\r\n * @returns {int} - length of string\r\n */\r\nconst displayLength = str =>\r\n (isString(str) ? str.replace(wideCharPattern, '12').length : 0);\r\n\r\nexport const getLength = (str, distinguishWideChar = false) =>\r\n (distinguishWideChar ? displayLength(str) : size(str));\r\n\r\nconst intRemaining = (str, schema) => {\r\n if (!isFinite(schema.maxLength)) {\r\n return Number.POSITIVE_INFINITY;\r\n }\r\n\r\n return schema.maxLength - getLength(str, schema.distinguishWideChar);\r\n};\r\n\r\nexport const strRemaining = (i18n, str, schema, newI18n) => {\r\n const remaining = intRemaining(str, schema);\r\n\r\n if (!isFinite(remaining)) {\r\n return '';\r\n }\r\n if (newI18n) {\r\n return remaining >= 0 ?\r\n newI18n.getString(_TL_('{{count}} characters remaining'), { count: remaining }) :\r\n newI18n.getString(_TL_('Exceeded by {{count}} characters'), { count: 0 - remaining });\r\n }\r\n return remaining >= 0 ?\r\n i18n.getString('RemainingCharactersText_New', { count: remaining }) :\r\n i18n.getString('ExceededCharactersText_New', { count: 0 - remaining });\r\n};\r\n\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport { strRemaining } from './string-util';\r\n\r\nexport const RemainingCharsHint = ({\r\n str, i18n, schema, newI18n,\r\n}) => (\r\n schema.maxLength && _.isString(str) ?\r\n (
{strRemaining(i18n, str, schema, newI18n)}
) : null);\r\n\r\nRemainingCharsHint.propTypes = {\r\n str: PropTypes.string,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }),\r\n schema: PropTypes.shape({\r\n maxLength: PropTypes.number,\r\n }).isRequired,\r\n newI18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }),\r\n};\r\n\r\nRemainingCharsHint.defaultProps = {\r\n str: undefined,\r\n i18n: undefined,\r\n newI18n: undefined,\r\n};\r\n","import React from 'react';\r\nimport { reduce, result } from 'underscore';\r\nimport { ViewmodelSchema } from '@bingads-webui/viewmodel-schema';\r\n\r\nimport { RemainingCharsHint } from './remaining-chars-hint';\r\n\r\nexport const getRemainingCharsHintTextWithSchema = (str, i18n, schema, field) => {\r\n const vmSchema = new ViewmodelSchema(schema, i18n, [field]);\r\n const vmField = reduce(field.split('/'), (obj, seg) => result(obj, seg), vmSchema);\r\n const vmFieldSchema = result(vmField, 'prop', {});\r\n const fieldSchema = {\r\n distinguishWideChar: true,\r\n ...vmFieldSchema,\r\n };\r\n return ();\r\n};\r\n\r\nexport const getRemainingCharsHintText = (str, i18n, maxLength) => {\r\n const fieldSchema = {\r\n maxLength,\r\n distinguishWideChar: true,\r\n };\r\n return ();\r\n};\r\n","export const getTextInputContainerStyles = () => ({\r\n TextInputContainer: {\r\n width: '435px',\r\n '& div .error': {\r\n color: '#A80000',\r\n },\r\n },\r\n});\r\n\r\nexport const getRemainingCharsStyles = () => ({\r\n RemainingCharsContainer: {\r\n display: 'flex',\r\n flexDirection: 'row-reverse',\r\n },\r\n});\r\n","import React from 'react';\r\nimport classnames from 'classnames';\r\n\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { withError, withValidation } from '@bingads-webui-react/validation';\r\nimport { withControlErrorHandling, withUnvalidatedControlErrors } from '@bingads-webui-campaign-react/error-handling';\r\nimport { TextField } from '@bingads-webui-react/fluent-controls';\r\n\r\nimport { getTextInputContainerStyles } from './style';\r\nimport { withRemainingChars } from './with-remaining-chars';\r\n\r\nconst ValidatedTextField = withValidation(TextField);\r\n\r\nconst RemainingCharsValidatedTextFieldInternal = withControlErrorHandling(withUnvalidatedControlErrors(withError(withRemainingChars(ValidatedTextField))));\r\n\r\nexport const RemainingCharsValidatedTextField = React.memo((props) => {\r\n const classes = useDefaultStyles(getTextInputContainerStyles);\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n});\r\n","import React, { useState } from 'react';\r\nimport { reduce, result, noop } from 'underscore';\r\nimport classnames from 'classnames';\r\nimport PropTypes from 'prop-types';\r\nimport hoistNonReactStatics from 'hoist-non-react-statics';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { getDisplayName } from '@bingads-webui-react/hoc-utils';\r\nimport { getRemainingCharsHintTextWithSchema } from './shared';\r\nimport { getRemainingCharsStyles } from './style';\r\n\r\nexport function withRemainingChars(WrappedComponent) {\r\n const RemainingCharsHOC = (props) => {\r\n const getNestedDataByPath = (data, path) => reduce(path.split('/'), (obj, seg) => result(obj, seg, {}), data);\r\n\r\n const [value, setValue] = useState(undefined);\r\n\r\n const onValidate = (validationResult) => {\r\n setValue(getNestedDataByPath(validationResult.data, props.validationProps.field));\r\n props.validationProps.onValidate(validationResult);\r\n };\r\n\r\n const classes = useDefaultStyles(getRemainingCharsStyles);\r\n\r\n const newValidationProps = {\r\n ...props.validationProps,\r\n onValidate,\r\n };\r\n\r\n return (\r\n \r\n \r\n
\r\n { getRemainingCharsHintTextWithSchema(value, props.i18n, newValidationProps.schema, newValidationProps.field) }\r\n
\r\n
\r\n );\r\n };\r\n\r\n RemainingCharsHOC.propTypes = {\r\n i18n: PropTypes.shape({}).isRequired,\r\n validationProps: PropTypes.shape({\r\n onValidate: PropTypes.func.isRequired,\r\n field: PropTypes.string.isRequired,\r\n schema: PropTypes.shape({}).isRequired,\r\n }),\r\n };\r\n\r\n RemainingCharsHOC.defaultProps = {\r\n validationProps: {\r\n onValidate: noop,\r\n field: undefined,\r\n schema: undefined,\r\n },\r\n };\r\n\r\n RemainingCharsHOC.displayName = `withRemainingChars(${getDisplayName(WrappedComponent)})`;\r\n hoistNonReactStatics(RemainingCharsHOC, WrappedComponent);\r\n\r\n return RemainingCharsHOC;\r\n}\r\n","import { TextField } from '@bingads-webui-react/fluent-controls';\r\n\r\nimport { withRemainingCharsUnvalidated } from './with-remaining-chars-unvalidated';\r\n\r\nexport const RemainingCharsUnvalidatedTextField = withRemainingCharsUnvalidated(TextField);\r\n","import React, { useState, useCallback } from 'react';\r\nimport classnames from 'classnames';\r\nimport PropTypes from 'prop-types';\r\nimport hoistNonReactStatics from 'hoist-non-react-statics';\r\n\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { getDisplayName } from '@bingads-webui-react/hoc-utils';\r\n\r\nimport { getRemainingCharsHintText } from './shared';\r\nimport { getRemainingCharsStyles } from './style';\r\n\r\nexport function withRemainingCharsUnvalidated(WrappedComponent) {\r\n const RemainingCharsHOC = (props) => {\r\n const {\r\n maxLengthHint,\r\n onChange,\r\n i18n,\r\n defaultValue,\r\n } = props;\r\n\r\n const [value, setValue] = useState(defaultValue);\r\n\r\n const localOnChange = useCallback((event, result) => {\r\n setValue(result);\r\n onChange(event, result);\r\n }, [onChange]);\r\n\r\n const classes = useDefaultStyles(getRemainingCharsStyles);\r\n\r\n const newProps = {\r\n ...props,\r\n onChange: localOnChange,\r\n };\r\n\r\n return (\r\n \r\n \r\n
\r\n { getRemainingCharsHintText(value, i18n, maxLengthHint) }\r\n
\r\n
\r\n );\r\n };\r\n\r\n RemainingCharsHOC.propTypes = {\r\n i18n: PropTypes.shape({}).isRequired,\r\n maxLengthHint: PropTypes.number.isRequired,\r\n onChange: PropTypes.func.isRequired,\r\n defaultValue: PropTypes.string,\r\n };\r\n\r\n RemainingCharsHOC.defaultProps = {\r\n defaultValue: '',\r\n };\r\n\r\n RemainingCharsHOC.displayName = `withRemainingCharsUnvalidated(${getDisplayName(WrappedComponent)})`;\r\n hoistNonReactStatics(RemainingCharsHOC, WrappedComponent);\r\n\r\n return RemainingCharsHOC;\r\n}\r\n","import { TextField } from '@bingads-webui-react/fluent-controls';\r\n\r\nimport { withControlledRemainingCharsUnvalidated } from './with-controlled-remaining-chars-unvalidated';\r\n\r\nexport const ControlledRemainingCharsUnvalidatedTextField = withControlledRemainingCharsUnvalidated(TextField);\r\n","import React from 'react';\r\nimport classnames from 'classnames';\r\nimport PropTypes from 'prop-types';\r\nimport hoistNonReactStatics from 'hoist-non-react-statics';\r\n\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { getDisplayName } from '@bingads-webui-react/hoc-utils';\r\n\r\nimport { getRemainingCharsHintText } from './shared';\r\nimport { getRemainingCharsStyles } from './style';\r\n\r\nexport function withControlledRemainingCharsUnvalidated(WrappedComponent) {\r\n const RemainingCharsHOC = (props) => {\r\n const {\r\n maxLengthHint,\r\n i18n,\r\n value,\r\n } = props;\r\n\r\n const classes = useDefaultStyles(getRemainingCharsStyles);\r\n\r\n return (\r\n \r\n \r\n
\r\n { getRemainingCharsHintText(value, i18n, maxLengthHint) }\r\n
\r\n
\r\n );\r\n };\r\n\r\n RemainingCharsHOC.propTypes = {\r\n i18n: PropTypes.shape({}).isRequired,\r\n maxLengthHint: PropTypes.number.isRequired,\r\n value: PropTypes.string.isRequired,\r\n };\r\n\r\n\r\n RemainingCharsHOC.displayName = `withControlledRemainingCharsUnvalidated(${getDisplayName(WrappedComponent)})`;\r\n hoistNonReactStatics(RemainingCharsHOC, WrappedComponent);\r\n\r\n return RemainingCharsHOC;\r\n}\r\n","export const glyphList = [\r\n { key: 'ActionCenter', text: 'Action Center' },\r\n { key: 'AllApps', text: 'All Apps' },\r\n { key: 'Camera', text: 'Camera' },\r\n { key: 'EdgeLogo', text: 'Edge Logo' },\r\n { key: 'Feedback', text: 'Feedback' },\r\n { key: 'GameController', text: 'Game Controller' },\r\n { key: 'GetStartedApp', text: 'Get Started App' },\r\n { key: 'MagnifyingGlass', text: 'Magnifying Glass' },\r\n { key: 'MapsApp', text: 'Maps App' },\r\n { key: 'MicrosoftLogo', text: 'Microsoft Logo' },\r\n { key: 'MMX-CellPhone', text: 'MMX-Cell Phone' },\r\n { key: 'MMX-CellPhoneHistory', text: 'MMX-Cell Phone History' },\r\n { key: 'MMX-CellPhoneSend', text: 'MMX-Cell Phone Send' },\r\n { key: 'News', text: 'News' }, { key: 'Office', text: 'Office' },\r\n { key: 'OneDriveApp', text: 'OneDrive App' },\r\n { key: 'PhotoApp', text: 'Photo App' },\r\n { key: 'RewardsGlyph', text: 'RewardsGlyph' },\r\n { key: 'Settings', text: 'Settings' },\r\n { key: 'StoreApp', text: 'Store App' },\r\n { key: 'VideoApp', text: 'Video App' },\r\n { key: 'WebURL', text: 'Web URL' },\r\n { key: 'XboxApp', text: 'Xbox App' },\r\n];\r\n","export const placementList = [\r\n { key: 'TopLeft', text: 'Top left' },\r\n { key: 'Center', text: 'Center' },\r\n { key: 'BottomRight', text: 'Bottom right' },\r\n];\r\n","import React from 'react';\r\nimport { Dropdown, TextField, ITextFieldStyles } from '@fluentui/react';\r\nimport { glyphList } from './glyphList';\r\nimport { placementList } from './placementList';\r\nimport { IHotspot } from './hotspot-panel';\r\n\r\ndeclare let _TL_: any;\r\n\r\ninterface IProps {\r\n i18n: any;\r\n hotspot: IHotspot;\r\n hotspots: IHotspot[];\r\n index: number;\r\n enableHotSpotPlacement: boolean;\r\n showHotspotCount: boolean;\r\n\r\n handleChangeTextField: (index: number, field: string, value: string) => void\r\n handleChangeGlyph: (index: number, value: string) => void;\r\n handleChangePlacement: (index: number, value: string) => void;\r\n}\r\n\r\nfunction remainingWarning(text: string, limit: number, i18n: any): string {\r\n if (text.length > limit) {\r\n return i18n.getString(_TL_('Exceeded by {{count}} characters'), { count: text.length - limit });\r\n }\r\n return `${limit - text.length} ${i18n.getString(_TL_('characters remaining'))}`;\r\n}\r\n\r\nfunction getErrorMessage(text: string, limit: number, i18n: any): string {\r\n if (text.length > limit) {\r\n return i18n.getString(_TL_('Field should not exceed {{count}} characters'), { count: text.length - limit });\r\n }\r\n\r\n return '';\r\n}\r\n\r\nfunction getPlacementMessage(placement: string, hotspots: IHotspot[], i18n: any): string {\r\n const placements = hotspots.map(i => i.placement).filter(i => !!i);\r\n if (new Set(placements).size !== placements.length) {\r\n return i18n.getString(_TL_('Duplicate placement'));\r\n }\r\n\r\n return '';\r\n}\r\n\r\nexport class Hotspot extends React.Component {\r\n handleChangeTitle = (field: string, _, value) => {\r\n const { index } = this.props;\r\n\r\n this.props.handleChangeTextField(index, field, value as string);\r\n };\r\n\r\n handleChangeGlyph = (_, item) => {\r\n const { index } = this.props;\r\n\r\n this.props.handleChangeGlyph(index, item.key);\r\n };\r\n\r\n handleChangePlacement = (_, item) => {\r\n const { index } = this.props;\r\n\r\n this.props.handleChangePlacement(index, item.key);\r\n };\r\n\r\n render() {\r\n const {\r\n i18n, hotspot, hotspots, index, showHotspotCount = false,\r\n } = this.props;\r\n\r\n const {\r\n title, desc, actionText, uri, glyph, placement,\r\n } = hotspot;\r\n\r\n const textFiledStyles: Partial = {\r\n description: {\r\n width: '100%',\r\n display: 'inline-block',\r\n textAlign: 'right',\r\n fontSize: 14,\r\n },\r\n };\r\n\r\n return (\r\n
\r\n { showHotspotCount && (
{`${i18n.getString(_TL_('Hotspot'))} ${index + 1}`}
) }\r\n \r\n \r\n \r\n \r\n \r\n {this.props.enableHotSpotPlacement && (\r\n \r\n )}\r\n\r\n
\r\n );\r\n }\r\n}\r\n\r\n","import React from 'react';\r\nimport { isEmpty, uniq, any } from 'underscore';\r\nimport { Stack, FontIcon, CommandButton } from '@fluentui/react';\r\n\r\nimport { Hotspot } from './hotspot';\r\n\r\ndeclare let _TL_: any;\r\n\r\nexport interface IHotspot {\r\n glyph: string;\r\n title: string;\r\n desc: string;\r\n actionText: string;\r\n uri: string;\r\n placement: string;\r\n}\r\n\r\ninterface IProps {\r\n i18n: any;\r\n enableHotSpotPlacement: boolean;\r\n onUpdateHotspots: (hotspots: IHotspot[]) => void;\r\n hotspots: IHotspot[];\r\n hideTitle: boolean;\r\n showHotspotCount: boolean;\r\n}\r\n\r\ninterface IState {\r\n hotspots: IHotspot[];\r\n error: string;\r\n}\r\n\r\nconst hotspotsUpperLimit = 3;\r\n\r\nexport class HotspotPanel extends React.Component {\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {\r\n error: '',\r\n hotspots: props.hotspots || [],\r\n };\r\n }\r\n\r\n getData = () => this.state.hotspots.map(hotspot => ({\r\n Title: hotspot.title,\r\n Description: hotspot.desc,\r\n ActionText: hotspot.actionText,\r\n Uri: hotspot.uri,\r\n Glyph: hotspot.glyph,\r\n Placement: hotspot.placement,\r\n }));\r\n\r\n setError(error: string) {\r\n this.setState({\r\n error,\r\n });\r\n }\r\n\r\n handleChangeTextField = (index: number, field: string, value: string) => {\r\n const { hotspots } = this.state;\r\n\r\n hotspots[index][field] = value;\r\n\r\n this.setState({\r\n hotspots: [...hotspots],\r\n }, () => {\r\n this.props.onUpdateHotspots(this.state.hotspots);\r\n });\r\n };\r\n\r\n handleChangeGlyph = (index: number, value: string) => {\r\n const { hotspots } = this.state;\r\n\r\n hotspots[index].glyph = value;\r\n\r\n this.setState({\r\n hotspots: [...hotspots],\r\n }, () => {\r\n this.props.onUpdateHotspots(this.state.hotspots);\r\n });\r\n };\r\n\r\n handleChangePlacement = (index: number, value: string) => {\r\n const { hotspots } = this.state;\r\n\r\n hotspots[index].placement = value;\r\n\r\n this.setState({\r\n hotspots: [...hotspots],\r\n }, () => {\r\n this.props.onUpdateHotspots(this.state.hotspots);\r\n });\r\n };\r\n\r\n AddHotspot = () => {\r\n const { hotspots } = this.state;\r\n\r\n hotspots.push({\r\n glyph: 'ActionCenter',\r\n title: '',\r\n desc: '',\r\n actionText: '',\r\n uri: '',\r\n placement: '',\r\n });\r\n\r\n this.setState({\r\n hotspots: [...hotspots],\r\n }, () => {\r\n this.props.onUpdateHotspots(this.state.hotspots);\r\n });\r\n };\r\n\r\n handleRemoveHotspot = (index: number) => {\r\n const { hotspots } = this.state;\r\n\r\n hotspots.splice(index, 1);\r\n\r\n this.setState({\r\n hotspots: [...hotspots],\r\n }, () => {\r\n this.props.onUpdateHotspots(this.state.hotspots);\r\n });\r\n };\r\n\r\n validate = () => {\r\n const { i18n, enableHotSpotPlacement } = this.props;\r\n\r\n const missField = this.state.hotspots.map(i =>\r\n isEmpty(i.glyph) || isEmpty(i.title) || isEmpty(i.actionText) || isEmpty(i.uri) ||\r\n (enableHotSpotPlacement && isEmpty(i.placement)));\r\n\r\n if (any(missField)) {\r\n this.setError(i18n.getString(_TL_('HotSpot missing required field')));\r\n return false;\r\n }\r\n\r\n // check if any duplicate hotspot\r\n const hotspotStrings = this.state.hotspots.map(hotspot => hotspot.title + hotspot.actionText + hotspot.desc + hotspot.uri + hotspot.glyph);\r\n\r\n if (this.state.hotspots.length !== uniq(hotspotStrings).length) {\r\n this.setError(i18n.getString(_TL_('HotSpots duplication')));\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n render() {\r\n const { i18n, showHotspotCount = false } = this.props;\r\n const {\r\n hotspots,\r\n error,\r\n } = this.state;\r\n\r\n const { hideTitle = false } = this.props;\r\n\r\n const disableAddhotspot = hotspots.length >= hotspotsUpperLimit;\r\n\r\n return (\r\n
\r\n
{!hideTitle && i18n.getString(_TL_('Hotspot'))}
\r\n {hotspots.map((hotspot, index) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n ))}\r\n \r\n
{error}
\r\n \r\n
\r\n \r\n );\r\n }\r\n}\r\n","import React, { useState, forwardRef, useImperativeHandle, useEffect } from 'react';\r\nimport { Dropdown, IDropdownOption, DropdownMenuItemType } from '@fluentui/react/lib/Dropdown';\r\n\r\n// eslint-disable-next-line no-underscore-dangle\r\ndeclare let _TL_: any;\r\ninterface BoostAnchorsProps {\r\n i18n: any;\r\n defaultSelectedKey: string | undefined;\r\n onUpdate: (key: string | number | undefined) => void;\r\n}\r\n\r\nconst getDropdownOptions = (i18n): IDropdownOption[] => {\r\n const options: IDropdownOption[] = [\r\n { key: 'key1', text: i18n.getString(_TL_('Top Bar')), itemType: DropdownMenuItemType.Header },\r\n { key: 'ntp_cm_waffle', text: i18n.getString(_TL_('App Launcher')) },\r\n { key: 'ntp_cm_locationGreeting', text: i18n.getString(_TL_('Location and Weather')) },\r\n { key: 'ntp_cm_rewardsMedallion', text: i18n.getString(_TL_('Rewards')) },\r\n { key: 'ntp_cm_notificationBell', text: i18n.getString(_TL_('Notification')) },\r\n { key: 'ntp_cm_settingsGear', text: i18n.getString(_TL_('Settings')) },\r\n { key: 'ntp_cm_personalizeButton', text: i18n.getString(_TL_('Personalize Settings')) },\r\n\r\n { key: 'key2', text: '-', itemType: DropdownMenuItemType.Divider },\r\n { key: 'key3', text: i18n.getString(_TL_('Search Box')), itemType: DropdownMenuItemType.Header },\r\n { key: 'ntp_cm_searchBox', text: i18n.getString(_TL_('Search')) },\r\n\r\n { key: 'key4', text: '-', itemType: DropdownMenuItemType.Divider },\r\n { key: 'key5', text: 'Navigation', itemType: DropdownMenuItemType.Header },\r\n { key: 'ntp_cm_followingNav', text: i18n.getString(_TL_('Following')) },\r\n { key: 'ntp_cm_gamingNav', text: i18n.getString(_TL_('Gaming')) },\r\n { key: 'ntp_cm_weatherNav', text: i18n.getString(_TL_('Weather')) },\r\n { key: 'ntp_cm_watchNav', text: i18n.getString(_TL_('Watch')) },\r\n { key: 'ntp_cm_shoppingNav', text: i18n.getString(_TL_('Shopping')) },\r\n ];\r\n\r\n return options;\r\n};\r\n\r\nconst BoostAnchors: React.FC = forwardRef(({ i18n, defaultSelectedKey, onUpdate }: BoostAnchorsProps, ref) => {\r\n const [selectedKey, setSelectedKey] = useState(defaultSelectedKey);\r\n\r\n const handleDropdownChange = (event: React.FormEvent, option?: IDropdownOption) => {\r\n setSelectedKey(option?.key);\r\n };\r\n\r\n useImperativeHandle(ref, () => ({\r\n getData: (): string | number | undefined => selectedKey,\r\n }));\r\n\r\n useEffect(() => {\r\n if (onUpdate) {\r\n onUpdate(selectedKey);\r\n }\r\n }, [onUpdate, selectedKey]);\r\n\r\n return (\r\n \r\n );\r\n});\r\n\r\nexport { BoostAnchors };\r\n","export interface ICropSettings {\r\n SourceX: number,\r\n SourceY: number,\r\n SourceWidth: number,\r\n SourceHeight: number\r\n}\r\n\r\n\r\nexport interface IAssetPayload {\r\n id: number;\r\n idString: string;\r\n subType: string;\r\n cropX?: number;\r\n cropY?: number;\r\n cropWidth?: number;\r\n cropHeight?: number;\r\n}\r\n\r\nexport enum AssociationType {\r\n Image191x100 = 'Image191x100',\r\n Image178x100 = 'Image178x100',\r\n Image172x100 = 'Image172x100',\r\n Image169x100 = 'Image169x100',\r\n Image155x100 = 'Image155x100',\r\n Image150x100 = 'Image150x100',\r\n Image133x100 = 'Image133x100',\r\n Image1x1 = 'Image1x1',\r\n Image93x100 = 'Image93x100',\r\n OriginalImage = 'OriginalImage',\r\n}\r\n\r\nexport interface IImageExperienceImage {\r\n setIncluded(val: boolean): void;\r\n isMaunalCropped(): boolean;\r\n isManualEdited(val: boolean): boolean;\r\n setCropSettings(cropSettings: ICropSettings): void;\r\n formatToSave(isMultimediaAd?: boolean, isVideoThumbnail?: boolean, overrideInfo?: any, isMMAV2Enabled?: boolean, isImageFittingEnabled?: boolean): IAssetPayload;\r\n copyEffectsFromOther(another: IImageExperienceImage): void;\r\n setType(AssociationType): void;\r\n isLogo: boolean;\r\n IsIncluded: boolean;\r\n isAutoCropping: boolean;\r\n Type: AssociationType;\r\n Id: string;\r\n IdString: string;\r\n isVirtual?: boolean;\r\n Width: number;\r\n Height: number;\r\n FinalSrc: string;\r\n CropSettings?: ICropSettings;\r\n BaseId?: number;\r\n associationType: string;\r\n originalImageCropSettings?: ICropSettings;\r\n}\r\n\r\nexport interface IImageAssetUpdate {\r\n id: number;\r\n}\r\n\r\nexport interface IImageExperienceImageWithUpdate {\r\n finalIdString: string;\r\n image: IImageExperienceImage;\r\n}\r\n\r\nexport interface IImageInfo {\r\n url: string,\r\n width: number,\r\n height: number,\r\n baseId: string,\r\n metadata: string,\r\n sourceType: string;\r\n isRecommendedImage: boolean;\r\n originalUrl: string;\r\n cropSettingOnOriginal: ICropSettings,\r\n placementSettings: Array,\r\n originalWidth: number,\r\n originalHeight: number,\r\n\r\n}\r\n\r\nexport interface IImageMapUrl {\r\n [key: string]: IImageInfo,\r\n}\r\n\r\nexport interface IMTAsset {\r\n Id: string,\r\n SubType: string,\r\n CropX: number,\r\n CropY: number,\r\n CropWidth: number,\r\n CropHeight: number,\r\n CroppingType: string,\r\n IdString: string,\r\n ImageUrl: string;\r\n Height: number;\r\n Width: number;\r\n AltText: string,\r\n}\r\n\r\ninterface ITextAsset {\r\n Asset: {\r\n Text: string;\r\n AssetType: string;\r\n }\r\n}\r\n\r\nexport interface IImageAsset {\r\n Asset: IMTAsset;\r\n}\r\n\r\nexport interface IRecommendAd {\r\n FinalUrls: string[];\r\n Text: string;\r\n Headline: string;\r\n LongHeadline: string;\r\n BusinessName: string;\r\n Headlines: ITextAsset[];\r\n Descriptions: ITextAsset[];\r\n LongHeadlines: ITextAsset[];\r\n Images: IImageAsset[];\r\n}\r\n\r\nexport interface IAdRecommendResponse {\r\n value: IRecommendAd[];\r\n}\r\n\r\nexport interface IActivityLogger {\r\n signal: (args0: string, args1: string) => void;\r\n}\r\n\r\nexport interface ISetUpAdWithRecommendAdParam {\r\n ad: IRecommendAd,\r\n isAdEditShown?: boolean,\r\n shouldSaveAdFromRecommend: boolean,\r\n}\r\n\r\nexport interface ResponsiveAdForPreview {\r\n images: IImageExperienceImage[][],\r\n shortHeadline: string;\r\n longHeadline: string;\r\n description: string;\r\n businessName: string;\r\n url: string;\r\n}\r\n","import _ from 'underscore';\r\nimport { deserializeImageAssetMetadata } from '@bingads-webui-campaign/media-metadata-model';\r\nimport { updatePlacementWithBaseCropSettings, updatePlacementWithPlacementSettings } from '@bingads-webui-campaign/image-experience-utils';\r\n\r\n/* Restore image model to UI state\r\n * When there is effect applied, need to convert Metadata to effectSettings\r\n */\r\nexport const processImagePlacementsMetadata =\r\n (placements, baseImageIdStr, baseImageInfo, isImageFittingEnabled, isCombinedMsanAndMmaAspectRatios) => {\r\n let imageLevelSettings;\r\n let propagateToImageLevel = false;\r\n\r\n const includedPlacements = _.filter(placements, placement => placement.IsIncluded);\r\n const excludedPlacements = _.filter(placements, placement => !placement.IsIncluded);\r\n const hasBeenBulkCropped = placements[0].baseImage.originalUrl &&\r\n placements[0].baseImage.originalUrl !== placements[0].baseImage.src;\r\n const hasPlacementSettings =\r\n placements[0].baseImage.placementSettings &&\r\n placements[0].baseImage.placementSettings.length > 0;\r\n\r\n const uniqueCountOfIds = _.chain(includedPlacements)\r\n .pluck('Id').uniq().size()\r\n .value();\r\n\r\n if (uniqueCountOfIds === 1) {\r\n // when placements have same effect, propagate it to image level\r\n propagateToImageLevel = true;\r\n }\r\n\r\n const cachedDeserializedMetadataById = {};\r\n\r\n _.each(includedPlacements, (placement) => {\r\n const cachedValue = cachedDeserializedMetadataById[placement.Id];\r\n let effectSettings;\r\n\r\n if (_.isUndefined(cachedValue)) {\r\n const deserializeMetadata = deserializeImageAssetMetadata(placement.Metadata) || {};\r\n\r\n cachedDeserializedMetadataById[placement.Id] = deserializeMetadata;\r\n ({ effectSettings } = deserializeMetadata);\r\n } else {\r\n ({ effectSettings } = cachedValue);\r\n }\r\n\r\n if (placement.IdString !== baseImageIdStr && effectSettings) {\r\n // restore placement various settings (effect, crop) in UI state\r\n const effectSrc = placement.Src;\r\n\r\n placement.setEffectSettings(_.defaults({ effectSrc }, effectSettings));\r\n }\r\n\r\n if (propagateToImageLevel && !imageLevelSettings) {\r\n imageLevelSettings = { effectSettings: placement.effectSettings };\r\n }\r\n });\r\n\r\n // restore image level UI state when all placements have same effect\r\n _.each(includedPlacements, (placement) => {\r\n const { url: originalSrc } = baseImageInfo;\r\n\r\n placement.BaseImage.setSrc(originalSrc);\r\n placement.BaseImage\r\n .setEffectSettings(imageLevelSettings && imageLevelSettings.effectSettings);\r\n });\r\n\r\n // let excluded placements inherit image level\r\n if (!_.isEmpty(includedPlacements)) {\r\n _.each(excludedPlacements, (placement) => {\r\n placement.setBaseImage(includedPlacements[0].BaseImage.clone());\r\n placement.setEffectSettings(placement.BaseImage.EffectSettings);\r\n });\r\n }\r\n\r\n if (hasBeenBulkCropped) {\r\n const { BaseImage } = placements[0];\r\n\r\n _.each(placements, (placement) => {\r\n updatePlacementWithBaseCropSettings({\r\n placement,\r\n mtImgObject: BaseImage,\r\n IsCroppingbasedOriginal: true,\r\n setCroppingType: isImageFittingEnabled,\r\n });\r\n });\r\n }\r\n\r\n if (hasPlacementSettings && !isCombinedMsanAndMmaAspectRatios) {\r\n const { BaseImage } = placements[0];\r\n\r\n _.each(placements, (placement) => {\r\n updatePlacementWithPlacementSettings({\r\n placement,\r\n mtImgObject: BaseImage,\r\n updatePlacementSettings:\r\n !placement.isMaunalCropped(), // fill in placement settings when\r\n // crop settings are auto-filled in MSAN workflow\r\n isMultimediaAd: false,\r\n isMultimediaAdinMSANEnabled: true,\r\n setCroppingType: isImageFittingEnabled,\r\n });\r\n });\r\n }\r\n };\r\n\r\nconst DefaultKey = 'default';\r\n\r\nconst containMetadata = metadata => !_.isEmpty(metadata);\r\nexport const getMetadataKey = metadata => (containMetadata(metadata) ? metadata : DefaultKey);\r\n\r\n/* This is to optimize bulkUpsert call to create new assets.\r\n If asset content exists in db, same asset id is returned from MT.\r\n So here we collect such information to reduce unnecessary calls.\r\n\r\nReturn result is a dictionary whose key is asset id which doesn't have any effects applied.\r\n{\r\n [base-id-1]: {\r\n default: { id, src },\r\n [metadata1]: { id, src },\r\n },\r\n}\r\n\r\n*/\r\nexport const collectExistingMetadata = assetList => _.reduce(assetList, (memo, asset) => {\r\n const key = asset.BaseId.toString();\r\n const original = memo[key];\r\n const metadataKey = getMetadataKey(asset.Metadata);\r\n const isProcessed = containMetadata(asset.Metadata);\r\n\r\n return {\r\n ...memo,\r\n [key]: _.extend({\r\n ...original,\r\n [metadataKey]: {\r\n // id and src should be matched\r\n // when apply effects, we only modify EffectSettings and keep src read-only.\r\n id: asset.Id,\r\n bingSrc: asset.Src,\r\n },\r\n }, isProcessed && {\r\n [DefaultKey]: {\r\n id: asset.BaseImage.Id,\r\n bingSrc: asset.BaseImage.Src,\r\n },\r\n }),\r\n };\r\n}, {});\r\n\r\nexport const insertMetadata = (dict, id, metadata, data) => {\r\n const key = getMetadataKey(metadata);\r\n _.extend(dict[id.toString()], {\r\n [key]: {\r\n id: data.id,\r\n bingSrc: data.bingSrc,\r\n },\r\n });\r\n};\r\n\r\nexport const findMetadata = (dict, id, metadata) => {\r\n const metadataKey = getMetadataKey(metadata);\r\n const assetsFromImage = dict[id.toString()];\r\n\r\n return assetsFromImage[metadataKey];\r\n};\r\n\r\nexport const isMetadataExisting = (dict, id, metadata) => {\r\n const found = findMetadata(dict, id, metadata);\r\n\r\n return !_.isUndefined(found);\r\n};\r\n","import _ from 'underscore';\r\nimport {\r\n getAutoCroppedImages,\r\n constants,\r\n ImageExperienceImage,\r\n getCenterCroppedSettings,\r\n} from '@bingads-webui-campaign-react/image-experience';\r\nimport { constants as C } from '@bingads-webui-campaign-react/image-experience-model';\r\nimport {\r\n ICropSettings,\r\n IImageExperienceImage,\r\n IImageMapUrl,\r\n IMTAsset,\r\n AssociationType,\r\n IImageAssetUpdate,\r\n IImageExperienceImageWithUpdate,\r\n IAssetPayload,\r\n} from './types';\r\nimport { processImagePlacementsMetadata } from '../image-metadata-util';\r\n\r\nconst { subTypeToType } = constants;\r\n\r\nconst getImageProps = (\r\n asset: IMTAsset,\r\n imageToUrlMap: IImageMapUrl,\r\n options: {\r\n isIncluded?: boolean,\r\n isLogo?: boolean,\r\n cs?: ICropSettings\r\n },\r\n image: IImageExperienceImage\r\n) => {\r\n const { cs, isIncluded, isLogo } = options;\r\n\r\n const idString = asset.IdString || String(asset.Id);\r\n const assetExtraInfo = imageToUrlMap[idString];\r\n\r\n let croppingType = asset.CroppingType;\r\n if (asset.SubType !== AssociationType.OriginalImage && !croppingType) {\r\n croppingType = C.CroppingType.ManualCrop;\r\n }\r\n\r\n let cropSettings = {\r\n SourceX: asset.CropX ? asset.CropX : 0,\r\n SourceY: asset.CropY ? asset.CropY : 0,\r\n SourceWidth: asset.CropWidth ? asset.CropWidth : assetExtraInfo.width,\r\n SourceHeight: asset.CropHeight ? asset.CropHeight : assetExtraInfo.height,\r\n CroppingType: croppingType,\r\n };\r\n\r\n // Recommeded image don't support auto crop\r\n if (assetExtraInfo.isRecommendedImage) {\r\n cropSettings = {\r\n SourceX: asset.CropX,\r\n SourceY: asset.CropY,\r\n SourceWidth: asset.CropWidth,\r\n SourceHeight: asset.CropHeight,\r\n CroppingType: '',\r\n };\r\n }\r\n\r\n return ({\r\n id: asset.Id,\r\n idString: String(asset.Id),\r\n baseId: imageToUrlMap[asset.Id].baseId,\r\n metadata: imageToUrlMap[asset.Id].metadata,\r\n src: imageToUrlMap[asset.Id].url,\r\n type: subTypeToType[asset.SubType],\r\n width: imageToUrlMap[asset.Id].width,\r\n height: imageToUrlMap[asset.Id].height,\r\n source: imageToUrlMap[asset.Id].sourceType,\r\n altText: asset.AltText,\r\n cropSettings,\r\n isIncluded,\r\n isLogo,\r\n originCropSetting: cs,\r\n isRecommendedImage: assetExtraInfo.isRecommendedImage,\r\n originalUrl: assetExtraInfo.originalUrl,\r\n cropSettingOnOriginal: assetExtraInfo.cropSettingOnOriginal,\r\n placementSettings: assetExtraInfo.placementSettings,\r\n originalWidth: assetExtraInfo.originalWidth,\r\n originalHeight: assetExtraInfo.originalHeight,\r\n associationType: image && image.associationType,\r\n });\r\n};\r\n\r\nconst getMTAssetBaseId = (asset: IMTAsset, imageToUrlMap: IImageMapUrl) => {\r\n const info = imageToUrlMap[asset.Id];\r\n\r\n return info.baseId || asset.Id.toString();\r\n};\r\n\r\n/**\r\n * judge if the are using same base image\r\n * e.g. assets may come from base image and some effect\r\n */\r\nconst compareBaseImage = (\r\n image: IImageExperienceImage,\r\n asset: IMTAsset,\r\n imageToUrlMap: IImageMapUrl,\r\n isAdCreatorEnabled: boolean\r\n): boolean => {\r\n const matchedId = isAdCreatorEnabled\r\n ? image.BaseId!.toString() === getMTAssetBaseId(asset, imageToUrlMap)\r\n : image.IdString === asset.IdString;\r\n\r\n return matchedId;\r\n};\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nconst generateMTAssetV2 = (payloadV1: IMTAsset, imageToUrlMap: IImageMapUrl): IMTAsset => {\r\n const payloadV2 = _.clone(payloadV1);\r\n payloadV2.SubType = 'OriginalImage';\r\n payloadV2.CropHeight = payloadV1.CropHeight;\r\n payloadV2.CropWidth = payloadV1.CropWidth;\r\n payloadV2.CropX = payloadV1.CropX;\r\n payloadV2.CropY = payloadV1.CropY;\r\n return payloadV2;\r\n};\r\n\r\nconst generateMTAssetWithOriginalImage = (\r\n originalAssets: IMTAsset[],\r\n imageToUrlMap: IImageMapUrl\r\n) => {\r\n // generate original image payload\r\n const assets: IMTAsset[] = [];\r\n const originalAssetsFor191x100AspectRatio = _.filter(originalAssets, asset => subTypeToType[asset.SubType] === AssociationType.Image191x100);\r\n\r\n _.each(originalAssetsFor191x100AspectRatio || [], (assetsV1) => {\r\n // add original image to payload\r\n assets.push(generateMTAssetV2(assetsV1, imageToUrlMap));\r\n });\r\n\r\n return assets;\r\n};\r\n\r\n/**\r\n * MMA In MSAN UI Dev Spec:\r\n * https://microsoft-my.sharepoint.com/:w:/g/personal/xiao_microsoft_com1/ESfoVZCPYKlFn5p0Ee_Xx-4ByJuBjdDMNQ7vl7CgotNScg?e=cLqZae\r\n * pseudo code for this:\r\n * https://microsoft-my.sharepoint.com/personal/xiao_microsoft_com1/_layouts/15/onedrive.aspx?id=%2Fpersonal%2Fxiao%5Fmicrosoft%5Fcom1%2FDocuments%2Fsample%2Ejs&parent=%2Fpersonal%2Fxiao%5Fmicrosoft%5Fcom1%2FDocuments\r\n * get the image associations to display for each image\r\n *\r\n * MMA V2 In MSAN UI Dev Spec:\r\n * to support more aspect ratios and use original image as default image.\r\n * https://microsoft-my.sharepoint.com/:w:/r/personal/youngim_microsoft_com/Documents/MMA%20V2%20DevSpec.docx?d=w145d99a164574567a3c7187597b204a8&csf=1&web=1&e=TBLlhW\r\n */\r\nexport const getMultiImages =\r\n (\r\n originalAssets: IMTAsset[],\r\n imageToUrlMap: IImageMapUrl,\r\n options: {\r\n isAdCreatorEnabled: boolean,\r\n isMMAV2Enabled?: boolean,\r\n isBoost200x100ImageEnabled?: boolean,\r\n isBoostNewAspectRatioSupportEnabled?: boolean,\r\n isImageFittingEnabled?: boolean,\r\n }\r\n ) => {\r\n let assets: IMTAsset[] = originalAssets;\r\n const isV2Format = options.isMMAV2Enabled && _.some(originalAssets, asset => (asset.SubType === AssociationType.OriginalImage));\r\n\r\n // this is true when editing an existing ad which is not in V2 format (at least has one original image)\r\n // when creating a new ad, the returned recommended ad are all in V2 format.\r\n const shouldConvertAssetToV2Format = options.isMMAV2Enabled && !_.some(originalAssets, asset => (asset.SubType === AssociationType.OriginalImage));\r\n if (shouldConvertAssetToV2Format) {\r\n assets = _.union(generateMTAssetWithOriginalImage(originalAssets, imageToUrlMap), originalAssets);\r\n }\r\n\r\n const imageGroupByType = _.groupBy(assets, (asset: IMTAsset) => subTypeToType[asset.SubType]);\r\n const multiImagesGroup = options.isAdCreatorEnabled\r\n ? _.uniq(_.map(assets, asset => getMTAssetBaseId(asset, imageToUrlMap)))\r\n : Object.keys(imageToUrlMap);\r\n\r\n const multiImages = multiImagesGroup.map((key) => {\r\n let imagesExperience: IImageExperienceImage[] = getAutoCroppedImages({\r\n // @ts-ignore\r\n originalImageToCrop: {\r\n Id: key,\r\n IdString: key,\r\n Src: imageToUrlMap[key].url,\r\n Width: imageToUrlMap[key].width,\r\n Height: imageToUrlMap[key].height,\r\n source: imageToUrlMap[key].sourceType,\r\n },\r\n isMultimediaAdinMSANEnabled: true,\r\n isRecommendedImage: imageToUrlMap[key].isRecommendedImage,\r\n isMMAV2Enabled: options.isMMAV2Enabled,\r\n isBoost200x100ImageEnabled: options.isBoost200x100ImageEnabled,\r\n isBoostNewAspectRatioSupportEnabled: options.isBoostNewAspectRatioSupportEnabled,\r\n setCroppingType: options.isImageFittingEnabled,\r\n });\r\n\r\n // @ts-ignore\r\n imagesExperience = imagesExperience.map((image) => {\r\n // find image association\r\n const asset: IMTAsset | undefined = _.find(assets, (mtAsset) => {\r\n const matchedType = subTypeToType[mtAsset.SubType] === image.Type;\r\n\r\n return matchedType && compareBaseImage(image, mtAsset, imageToUrlMap, options.isAdCreatorEnabled);\r\n });\r\n\r\n if (asset) {\r\n // @ts-ignore\r\n return new ImageExperienceImage(getImageProps(\r\n asset,\r\n imageToUrlMap,\r\n { isIncluded: true, isLogo: image.isLogo, cs: image.CropSettings },\r\n image\r\n ));\r\n }\r\n\r\n image.setIncluded(false);\r\n\r\n return image;\r\n });\r\n\r\n /* If default image (1.91 is the default image for legacy RA/MMA V1 AND OriginalImage is the default image for MMA V2)\r\n * is included, process other ratios which are not included with below rule:\r\n * --- When there are no associations for this aspect ratio in ad image associations, auto include this ratio.\r\n * --- unless the image fails size validation for this aspect ratio, then it will still be excluded (cannot be auto included).\r\n */\r\n const landscapeFound = getLandscapeImage(imagesExperience);\r\n const originalImageFound = options.isMMAV2Enabled && getOriginalImage(imagesExperience);\r\n\r\n if ((landscapeFound && landscapeFound.IsIncluded && !isV2Format)\r\n || (originalImageFound && originalImageFound.IsIncluded)) {\r\n _.each(imagesExperience, (image) => {\r\n // if no image association for this aspect ratio, then include the image.\r\n if (!image.IsIncluded && !imageGroupByType[image.Type]) {\r\n if (options.isAdCreatorEnabled) {\r\n image.copyEffectsFromOther(originalImageFound || landscapeFound);\r\n }\r\n\r\n image.setIncluded(true);\r\n }\r\n });\r\n }\r\n\r\n if (options.isAdCreatorEnabled) {\r\n processImagePlacementsMetadata(imagesExperience, key, imageToUrlMap[key], options.isImageFittingEnabled);\r\n }\r\n\r\n if (shouldConvertAssetToV2Format) {\r\n // check size validation before return\r\n // (in V2 aspect ratio contract, 1.69 size (min height 372) is bigger than default image (minheight 368))\r\n // it may be auto-included by the rule above (which is \"When there are no associations for this aspect ratio in ad image associations, auto include this ratio\")\r\n const aspectRatios = C.getAspectRatios({\r\n isMultimediaAd: true,\r\n isMultimediaAdinMSANEnabled: true,\r\n imageOption: C.defaultImageOption,\r\n isCombinedMsanAndMmaAspectRatios: false,\r\n isMMAV2Enabled: true,\r\n isBoost200x100ImageEnabled: options.isBoost200x100ImageEnabled,\r\n isBoostNewAspectRatioSupportEnabled: options.isBoostNewAspectRatioSupportEnabled,\r\n });\r\n _.each(imagesExperience, (image) => {\r\n const { minSize } = aspectRatios[image.Type];\r\n if (image.Type !== AssociationType.OriginalImage &&\r\n // original image is always included\r\n (image.CropSettings!.SourceWidth < minSize[0] || image.CropSettings!.SourceHeight < minSize[1])) {\r\n // Simulating the logic in XAP that if customer explicitly provided the image association for this aspect ratio and it's smaller than the requested ad placement size\r\n // XAP will drop this traffic directly, as a result, we exclude this image directly.\r\n // even if the src or default image is bigger than the minimum.\r\n image.setIncluded(false);\r\n }\r\n });\r\n }\r\n return imagesExperience;\r\n });\r\n\r\n if (shouldConvertAssetToV2Format) {\r\n // filter out the image with all aspect ratio excluded\r\n return _.filter(multiImages, imageExperience => _.some(imageExperience, image => image.IsIncluded));\r\n }\r\n\r\n return multiImages;\r\n };\r\n\r\nconst getLandscapeImage =\r\n (images: IImageExperienceImage[]): IImageExperienceImage => _.find(images, image => image.Type === AssociationType.Image191x100)!;\r\n\r\nconst getOriginalImage =\r\n (images: IImageExperienceImage[]): IImageExperienceImage => _.find(images, image => image.Type === AssociationType.OriginalImage)!;\r\n\r\n// when nonLandscapeImageListOfOneType has same assets + auto crop settings, we treat the type as redundant info and will not send to MT\r\nconst checkIfShouldKeepImageType = (\r\n landscapeImageList: IImageExperienceImageWithUpdate[],\r\n nonLandscapeImageListOfOneType: IImageExperienceImageWithUpdate[],\r\n options: {\r\n isMMAV2Enabled: boolean,\r\n isBoost200x100ImageEnabled: boolean,\r\n isBoostNewAspectRatioSupportEnabled: boolean,\r\n }\r\n) => {\r\n const landscapeSize = _.size(landscapeImageList);\r\n const sizeofThisType = _.size(nonLandscapeImageListOfOneType);\r\n\r\n if (landscapeSize !== sizeofThisType) { // when length not equal, keep this type\r\n return true;\r\n }\r\n\r\n // compare image content + crop settings\r\n const orderedLandscapeImageList =\r\n _.sortBy(landscapeImageList, 'finalIdString');\r\n const orderedNonLandscapeImageListOfOneType =\r\n _.sortBy(nonLandscapeImageListOfOneType, 'finalIdString');\r\n\r\n const aspectRatios = constants.getAspectRatios({\r\n isMultimediaAdinMSANEnabled: true,\r\n isMMAV2Enabled: options.isMMAV2Enabled,\r\n isBoost200x100ImageEnabled: options.isBoost200x100ImageEnabled,\r\n isBoostNewAspectRatioSupportEnabled: options.isBoostNewAspectRatioSupportEnabled,\r\n });\r\n const type = nonLandscapeImageListOfOneType[0].image.Type;\r\n const ratio = aspectRatios[type].aspectRatio;\r\n\r\n for (let i = 0; i < landscapeSize; i += 1) {\r\n const { finalIdString: landscapeImageFinalId, image: landscapeImage } = orderedLandscapeImageList[i];\r\n const { finalIdString: imageOfThisTypeId, image: imageOfThisType } = orderedNonLandscapeImageListOfOneType[i];\r\n\r\n if (landscapeImageFinalId !== imageOfThisTypeId) {\r\n return true;\r\n }\r\n\r\n // compare image crop settings:\r\n // instead of checking UI activities to decide if it is auto cropped or not, directly compare with center crop algorithm output.\r\n // In this way, we can decouple UI logic with mt/de related logic. This will help better maintain in the future.\r\n const autoCroppedSettings = getCenterCroppedSettings({\r\n // use full image as box to crop\r\n SourceWidth: landscapeImage.Width,\r\n SourceHeight: landscapeImage.Height,\r\n SourceX: 0,\r\n SourceY: 0,\r\n }, ratio);\r\n\r\n const isCropSettingsEqual = (cropSettings, originalCropSettings) => (\r\n cropSettings.SourceX === originalCropSettings.SourceX &&\r\n cropSettings.SourceY === originalCropSettings.SourceY &&\r\n cropSettings.SourceWidth === originalCropSettings.SourceWidth &&\r\n cropSettings.SourceHeight === originalCropSettings.SourceHeight\r\n );\r\n\r\n // for image fitting, if originalImageCropSettings is equal to CropSettings, then it is not cropped\r\n if ((!imageOfThisType.originalImageCropSettings && !isCropSettingsEqual(imageOfThisType.CropSettings, autoCroppedSettings)) ||\r\n (imageOfThisType.originalImageCropSettings && !isCropSettingsEqual(imageOfThisType.CropSettings, imageOfThisType.originalImageCropSettings)\r\n && !isCropSettingsEqual(imageOfThisType.CropSettings, autoCroppedSettings))) {\r\n return true;\r\n }\r\n }\r\n\r\n // if image looks + crop settings match, then not necessary to keep\r\n return false;\r\n};\r\n\r\n/**\r\n * MMA In MSAN UI Dev Spec:\r\n * https://microsoft-my.sharepoint.com/:w:/g/personal/xiao_microsoft_com1/ESfoVZCPYKlFn5p0Ee_Xx-4ByJuBjdDMNQ7vl7CgotNScg?e=cLqZae\r\n * https://microsoft-my.sharepoint.com/:w:/p/taxiahou/EYnHXWA0PPxNsABcWrfolBIB9HGCXO4OM7pjIKNGRF8sew\r\n * pseudo code for this:\r\n * https://microsoft-my.sharepoint.com/personal/xiao_microsoft_com1/_layouts/15/onedrive.aspx?id=%2Fpersonal%2Fxiao%5Fmicrosoft%5Fcom1%2FDocuments%2Fsample%2Ejs&parent=%2Fpersonal%2Fxiao%5Fmicrosoft%5Fcom1%2FDocuments\r\n * convert imageList to image asset from MT\r\n * @param imageList A flattened included assets list. Otherwise, it is UI state two dimension array.\r\n * @param imageIdsUpdatesByIndex Information on updated ids. In some cases such as applying effect, the new ids are saved here by position in imagelist.\r\n * @returns selected asset list that will be sent to MT\r\n */\r\nexport const getMMAPayloadV2 = (\r\n flattenedImageList: IImageExperienceImage[],\r\n imageIdsUpdatesByIndex: IImageAssetUpdate[],\r\n isMMAV2Enabled: boolean = false,\r\n isBoost200x100ImageEnabled: boolean = false,\r\n isBoostNewAspectRatioSupportEnabled: boolean = false,\r\n isImageFittingEnabled: boolean = false\r\n): IAssetPayload[] => {\r\n // Motivation: If DE could not find association for a ratio, they will generate from landscape ratio 1.91\r\n const includedImageListByType = _.reduce(flattenedImageList, (memo, value, index) => {\r\n const key = value.Type;\r\n const overrideInfo = imageIdsUpdatesByIndex && imageIdsUpdatesByIndex[index];\r\n\r\n // eslint-disable-next-line no-param-reassign\r\n memo[key] = memo[key] || [];\r\n memo[key].push({\r\n finalIdString: ((overrideInfo && overrideInfo.id) || value.Id).toString(),\r\n image: value,\r\n });\r\n\r\n return memo;\r\n }, {}) as Record;\r\n\r\n // default behavior: user cannot exclude one aspect ratio for all images in UI.\r\n // in MMA V2, if image size is smaller than 703x372 (default image is 703x368)\r\n // Aspect Ratio 1.69:1 will be excluded due to size validation\r\n // so we will add a validation here to check if we need to keep this type of image\r\n const aspectRatios = constants.getAspectRatios({\r\n isMultimediaAdinMSANEnabled: true,\r\n isMMAV2Enabled,\r\n isBoost200x100ImageEnabled,\r\n isBoostNewAspectRatioSupportEnabled,\r\n });\r\n const shouldIgnoreThisAlgorithm = isMMAV2Enabled && _.size(includedImageListByType) !== _.size(aspectRatios);\r\n\r\n const payload: IAssetPayload[] = [];\r\n\r\n _.each(includedImageListByType, (imageWithUpdateListOfThisType, type) => {\r\n let keep = false;\r\n\r\n // we only need to handle non-landscape ratios to check if they can be ignored\r\n const checkType = isMMAV2Enabled ? AssociationType.OriginalImage : AssociationType.Image191x100;\r\n if (type === checkType || shouldIgnoreThisAlgorithm) {\r\n keep = true;\r\n } else {\r\n keep =\r\n checkIfShouldKeepImageType(\r\n includedImageListByType[checkType],\r\n imageWithUpdateListOfThisType,\r\n {\r\n isMMAV2Enabled,\r\n isBoost200x100ImageEnabled,\r\n isBoostNewAspectRatioSupportEnabled,\r\n }\r\n );\r\n }\r\n\r\n if (keep) {\r\n const mtModelArr = imageWithUpdateListOfThisType.map(({\r\n finalIdString,\r\n image,\r\n }) => image.formatToSave(false, false, { id: parseInt(finalIdString, 10) || finalIdString }, isMMAV2Enabled, isImageFittingEnabled)); // recommended image is not existing asset, so it's id is image url string\r\n\r\n payload.push(...mtModelArr);\r\n }\r\n });\r\n\r\n return payload;\r\n};\r\n","import _ from 'underscore';\r\nimport Promise from 'bluebird';\r\nimport {\r\n ImageExperienceImage,\r\n getAutoCroppedImages,\r\n ImageRepository,\r\n constants,\r\n} from '@bingads-webui-campaign-react/image-experience';\r\nimport { DependencyResolver } from '@bingads-webui-campaign/dependency-resolver';\r\nimport { queryify } from '@bingads-webui/url-util';\r\nimport { getCenterCroppedSettings } from '@bingads-webui-campaign/image-experience-utils';\r\nimport { getMultiImages, getLogoExperience, getPortraitExperience } from './data-process';\r\nimport { processImagePlacementsMetadata } from './image-metadata-util';\r\n\r\nconst {\r\n subTypeToType,\r\n getImageTypesWithOrder,\r\n logoSubtypes,\r\n portraitSubtypes,\r\n} = constants;\r\n\r\nconst autoFillMissingImagesAsync = (imageObjArr) => {\r\n const autoCroppedImages = getAutoCroppedImages({\r\n originalImageToCrop: imageObjArr[0],\r\n isMultimediaAd: false,\r\n });\r\n const imagesToReturn = [];\r\n\r\n _.each(autoCroppedImages, (croppedImage) => {\r\n const savedImage = _.find(imageObjArr, imageObj => imageObj.Type === croppedImage.Type);\r\n if (savedImage) {\r\n imagesToReturn.push(savedImage);\r\n } else {\r\n imagesToReturn.push(croppedImage);\r\n }\r\n });\r\n\r\n return imagesToReturn;\r\n};\r\n\r\nconst imageAssetCenterCrop = (asset) => {\r\n const {\r\n SourceHeight,\r\n SourceWidth,\r\n SourceX,\r\n SourceY,\r\n } = getCenterCroppedSettings({\r\n SourceHeight: asset.CropHeight,\r\n SourceWidth: asset.CropWidth,\r\n SourceX: 0,\r\n SourceY: 0,\r\n }, 1.91);\r\n\r\n return {\r\n ...asset,\r\n CropX: SourceX,\r\n CropY: SourceY,\r\n CropWidth: SourceWidth,\r\n CropHeight: SourceHeight,\r\n };\r\n};\r\n\r\nexport async function uploadRecommendImage(images, props, recommendAssetIdImageUrlMap) {\r\n const config = DependencyResolver.get('component/config/index');\r\n\r\n const odataToken = config.get('odata.token');\r\n const odataPath = config.get('odata.url') + config.get('odata.path');\r\n const odataRootUrl = config.get('CampaignAzureDomain');\r\n\r\n const { cid, aid } = props;\r\n const oDataConfig = {\r\n odataRootUrl,\r\n odataPath,\r\n odataToken,\r\n };\r\n\r\n const imagesWithoutId = images.filter(image => !image.Asset.Id);\r\n const urls = imagesWithoutId\r\n .map(image => ({ url: image.Asset.ImageUrl }));\r\n const imageRepository = new ImageRepository(cid, aid, oDataConfig);\r\n\r\n const ids = await imageRepository.bulkSaveImagesByUrl(urls);\r\n\r\n // save the mapping for log\r\n _.each(_.filter(images, i => !!i.Asset.Id), (image) => {\r\n recommendAssetIdImageUrlMap[image.Asset.Id] = image.Asset.ImageUrl; // eslint-disable-line no-param-reassign\r\n });\r\n _.each(ids, (id, index) => {\r\n recommendAssetIdImageUrlMap[id] = _.get(urls, [index, 'url']); // eslint-disable-line no-param-reassign\r\n });\r\n\r\n // eslint-disable-next-line\r\n const promises = imagesWithoutId.map((image, index) => {\r\n return imageRepository.getImageByIdAsync(ids[index]).then((imageInfo) => {\r\n image.Asset = { // eslint-disable-line no-param-reassign\r\n ...image.Asset,\r\n Id: ids[index],\r\n IdString: ids[index],\r\n SubType: 'LandscapeImageMedia',\r\n CropHeight: imageInfo.Height || 800,\r\n CropWidth: imageInfo.Width || 400,\r\n };\r\n }).catch(() => {\r\n image.Asset = { // eslint-disable-line no-param-reassign\r\n ...image.Asset,\r\n Id: ids[index],\r\n IdString: ids[index],\r\n SubType: 'LandscapeImageMedia',\r\n CropHeight: 800,\r\n CropWidth: 400,\r\n };\r\n }).finally(() => {\r\n image.Asset = imageAssetCenterCrop(image.Asset); // eslint-disable-line no-param-reassign\r\n });\r\n });\r\n\r\n await Promise.all(promises);\r\n return ids;\r\n}\r\n\r\nconst getImageProps = (asset, imageToUrlMap, isIncluded, isMultimediaAd) => {\r\n const idString = asset.IdString || String(asset.Id);\r\n const assetExtraInfo = imageToUrlMap[idString];\r\n const isLogo = asset.SubType in constants.logoSubtypes;\r\n return {\r\n id: isMultimediaAd && isLogo ? `${idString}-${asset.SubType}` : idString,\r\n baseId: assetExtraInfo.baseId,\r\n metadata: assetExtraInfo.metadata,\r\n src: assetExtraInfo.url,\r\n type: subTypeToType[asset.SubType],\r\n associationType: asset.SubType,\r\n isLogo,\r\n width: assetExtraInfo.width,\r\n height: assetExtraInfo.height,\r\n cropSettings: {\r\n SourceX: asset.CropX ? asset.CropX : 0,\r\n SourceY: asset.CropY ? asset.CropY : 0,\r\n SourceWidth: asset.CropWidth ?\r\n asset.CropWidth : assetExtraInfo.width,\r\n SourceHeight: asset.CropHeight ?\r\n asset.CropHeight : assetExtraInfo.height,\r\n },\r\n isIncluded,\r\n isRecommendedImage: asset.IsRecommendedImage,\r\n disableEdit: asset.DisableEdit,\r\n originalUrl: assetExtraInfo.originalUrl,\r\n cropSettingOnOriginal: assetExtraInfo.cropSettingOnOriginal,\r\n placementSettings: assetExtraInfo.placementSettings,\r\n originalWidth: assetExtraInfo.originalWidth,\r\n originalHeight: assetExtraInfo.originalHeight,\r\n };\r\n};\r\n\r\nconst getImageTasks = (mTAssetArrays, baseURL, odata, isImageFittingEnabled) => {\r\n let imageIdsToFetch = _.map(mTAssetArrays, mtAsset => mtAsset.Asset.IdString || mtAsset.Asset.Id);\r\n\r\n imageIdsToFetch = _.compact(_.uniq(imageIdsToFetch));\r\n\r\n return _.map(imageIdsToFetch, (imageId) => {\r\n let url = `${baseURL}Images(${imageId})`;\r\n if (isImageFittingEnabled) {\r\n url = `${url}?AdType=Audience`;\r\n }\r\n\r\n return odata.get(url)\r\n .then(response => ({\r\n ...response,\r\n\r\n // &c=0 means no crop. It wil help convert tiff to jpg so that img tag can be displayed.\r\n // This is to mitigate unexpected MMA demand associated with tiff images caused by a MT bug\r\n // Attention: this is not an official support for tiff format.\r\n // If we want to officially support a new image type, need more changes/tests.\r\n Url: queryify(response.Url, { c: 0 }),\r\n }));\r\n });\r\n};\r\n\r\n// fetch image info as well as base image info if any\r\nconst getAllImagesInfoFromMTAssets = ({\r\n mTAssetArrays,\r\n baseURL,\r\n odata,\r\n isAdCreatorEnabled,\r\n isImageFittingEnabled,\r\n}) => {\r\n const imageInfoArr = [];\r\n\r\n return Promise.all(getImageTasks(mTAssetArrays, baseURL, odata, isImageFittingEnabled))\r\n .then((values) => {\r\n imageInfoArr.push(...values);\r\n\r\n if (isAdCreatorEnabled) {\r\n const existingIds = _.pluck(imageInfoArr, 'Id');\r\n const baseAssetArrays = _.chain(values)\r\n .pluck('BaseIdString')\r\n .compact()\r\n .difference(existingIds)\r\n .map(Id => ({ Asset: { Id } }))\r\n .value();\r\n\r\n if (!_.isEmpty(baseAssetArrays)) {\r\n return Promise.all(getImageTasks(baseAssetArrays, baseURL, odata, isImageFittingEnabled));\r\n }\r\n }\r\n\r\n return [];\r\n })\r\n .then((baseImageInfos) => {\r\n imageInfoArr.push(...baseImageInfos);\r\n\r\n const ret = _.reduce(imageInfoArr, (memo, value) => _.extend(memo, {\r\n [value.IdString]: _.extend({\r\n url: value.Url,\r\n height: value.Height,\r\n sourceType: value.SourceType,\r\n width: value.Width,\r\n }, isAdCreatorEnabled && {\r\n baseId: value.BaseIdString,\r\n metadata: value.Metadata,\r\n }, {\r\n originalUrl: value.OriginalUrl,\r\n cropSettingOnOriginal: value.CropSettingOnOriginal,\r\n placementSettings: value.PlacementSettings,\r\n originalHeight: value.OriginalHeight,\r\n originalWidth: value.OriginalWidth,\r\n roiInfo: isImageFittingEnabled ? value.ROIInfo : undefined,\r\n }),\r\n }), {});\r\n\r\n return ret;\r\n });\r\n};\r\n\r\nconst buildAssetModels = ({\r\n mTAssetArrays,\r\n imageToUrlMap,\r\n imageTypesWithOrder,\r\n isMultimediaAd,\r\n}) => {\r\n // build ImageExperienceImage for all existing placements\r\n let imageObjArr = _.map(\r\n mTAssetArrays,\r\n mtAsset => new ImageExperienceImage(getImageProps(mtAsset.Asset, imageToUrlMap, true, isMultimediaAd))\r\n );\r\n\r\n imageObjArr = imageObjArr.sort((imageObj1, imageObj2) => {\r\n const obj1Inx = imageTypesWithOrder.indexOf(imageObj1.Type);\r\n const obj2Inx = imageTypesWithOrder.indexOf(imageObj2.Type);\r\n\r\n if (obj1Inx < obj2Inx) {\r\n return -1;\r\n }\r\n return 1;\r\n });\r\n\r\n return imageObjArr;\r\n};\r\n\r\nconst autoFillMissingImageIdAndSizeFromRecommendation = (mTAssetArrays, imageToUrlMap) => {\r\n _.each(mTAssetArrays, (mTAsset) => {\r\n if (_.isNull(mTAsset.Asset.Id)) {\r\n // Use image url as id because id is necessary field in ad preview components.\r\n _.extend(mTAsset.Asset, {\r\n Id: mTAsset.Asset.ImageUrl,\r\n });\r\n\r\n // Fill image url, height and width from recommendation.\r\n _.extend(imageToUrlMap, {\r\n [mTAsset.Asset.Id]: {\r\n url: mTAsset.Asset.ImageUrl,\r\n height: mTAsset.Asset.ImageHeight,\r\n width: mTAsset.Asset.ImageWidth,\r\n isRecommendedImage: mTAsset.Asset.IsRecommendedImage,\r\n },\r\n });\r\n }\r\n });\r\n};\r\n\r\nconst getMultiImagesFromMTAssetsAsync = (\r\n odata,\r\n baseURL,\r\n mTAssetArrays,\r\n isAdCreatorEnabled,\r\n isImproveMMA,\r\n isMMAV2Enabled,\r\n isBoostPortraitImageEnabled,\r\n isBoost200x100ImageEnabled,\r\n isBoostNewAspectRatioSupportEnabled,\r\n isImageFittingEnabled\r\n) => {\r\n const options = {\r\n mTAssetArrays,\r\n baseURL,\r\n odata,\r\n isAdCreatorEnabled,\r\n isImageFittingEnabled,\r\n };\r\n\r\n return getAllImagesInfoFromMTAssets(options)\r\n .then((imageToUrlMap) => {\r\n // When image asset id is null, auto fill image url and size from recommendation.\r\n if (isImproveMMA) {\r\n autoFillMissingImageIdAndSizeFromRecommendation(mTAssetArrays, imageToUrlMap);\r\n }\r\n\r\n const logoAssets = mTAssetArrays\r\n .map(mtAsset => mtAsset.Asset).filter(asset => logoSubtypes[asset.SubType]);\r\n const logoExperiences = getLogoExperience(logoAssets, imageToUrlMap);\r\n\r\n const imageAsset = mTAssetArrays\r\n .map(mtAsset => mtAsset.Asset).filter((asset) => {\r\n if (isBoostPortraitImageEnabled) {\r\n return !logoSubtypes[asset.SubType] && !portraitSubtypes[asset.SubType];\r\n }\r\n return !logoSubtypes[asset.SubType];\r\n });\r\n\r\n const portraitAssets = mTAssetArrays\r\n .map(mtAsset => mtAsset.Asset).filter(asset => portraitSubtypes[asset.SubType]);\r\n const portraitExperiences = getPortraitExperience(portraitAssets, imageToUrlMap);\r\n\r\n const imageExperiences = getMultiImages(\r\n imageAsset,\r\n imageToUrlMap,\r\n {\r\n isAdCreatorEnabled,\r\n isMMAV2Enabled,\r\n isBoost200x100ImageEnabled,\r\n isBoostNewAspectRatioSupportEnabled,\r\n isImageFittingEnabled,\r\n }\r\n );\r\n\r\n if (isImageFittingEnabled) {\r\n _.each(imageExperiences, (image) => {\r\n _.each(image, (placement) => {\r\n const { roiInfo } = imageToUrlMap[placement.IdString] || {};\r\n placement.setROIInfo(roiInfo, isMMAV2Enabled, true);\r\n });\r\n });\r\n }\r\n\r\n return [...logoExperiences, ...imageExperiences, ...portraitExperiences];\r\n });\r\n};\r\n\r\nconst groupImageObjectsByBaseImage = (imageObjArr, isAdCreatorEnabled) => {\r\n const initialObj = {\r\n image: {},\r\n logo: {},\r\n };\r\n\r\n return imageObjArr.reduce((memo, imageObj) => {\r\n const id = isAdCreatorEnabled ? imageObj.BaseId : imageObj.Id;\r\n const category = imageObj.isLogo ? 'logo' : 'image';\r\n\r\n const previousPlacements = memo[category][id] ? memo[category][id].placements : [];\r\n\r\n return {\r\n image: {\r\n ...memo.image,\r\n },\r\n logo: {\r\n ...memo.logo,\r\n },\r\n [category]: {\r\n ...memo[category],\r\n [id]: { baseId: id, placements: [...previousPlacements, imageObj] },\r\n },\r\n };\r\n }, initialObj);\r\n};\r\n\r\nconst getImagesFromMTAssetsAsync = (\r\n odata,\r\n baseURL,\r\n mTAssetArrays,\r\n isMultimediaAd = false,\r\n isAdCreatorEnabled = false,\r\n isCombinedMsanAndMmaAspectRatios = false,\r\n isStoreAppProng = false,\r\n isStoreAppSpotLight = false,\r\n isStoreAppTransparentLogo = false,\r\n isLinkedInAd = false,\r\n isImageFittingEnabled = false,\r\n isPMaxAspectRatiosV2Enabled = false\r\n) => {\r\n const options = {\r\n mTAssetArrays,\r\n baseURL,\r\n odata,\r\n isAdCreatorEnabled,\r\n isImageFittingEnabled,\r\n };\r\n\r\n return getAllImagesInfoFromMTAssets(options).then((imageToUrlMap) => {\r\n const imageTypesWithOrder =\r\n getImageTypesWithOrder(isMultimediaAd, isCombinedMsanAndMmaAspectRatios, isStoreAppProng, isStoreAppSpotLight, isStoreAppTransparentLogo, isLinkedInAd, isPMaxAspectRatiosV2Enabled);\r\n\r\n // When image asset id is null, auto fill image url and size from recommendation.\r\n autoFillMissingImageIdAndSizeFromRecommendation(mTAssetArrays, imageToUrlMap);\r\n\r\n // build ImageExperienceImage for all existing placements\r\n let imageObjArr = buildAssetModels({\r\n mTAssetArrays,\r\n imageToUrlMap,\r\n imageTypesWithOrder,\r\n isMultimediaAd,\r\n });\r\n\r\n if (isMultimediaAd || isStoreAppProng || isStoreAppSpotLight || isStoreAppTransparentLogo || isLinkedInAd) {\r\n // for MMA, UI state imageList is 2-dimensional array.\r\n // Each image element consists of multiple placements state.\r\n const mmaAspectRatios = constants.getAspectRatios({\r\n isMultimediaAd,\r\n isMultimediaAdinMSANEnabled: false,\r\n isCombinedMsanAndMmaAspectRatios,\r\n isStoreAppProng,\r\n isStoreAppSpotLight,\r\n isStoreAppTransparentLogo,\r\n isLinkedInAd,\r\n isPMaxAspectRatiosV2Enabled,\r\n });\r\n\r\n imageObjArr = _.filter(imageObjArr, image => image.type in mmaAspectRatios);\r\n\r\n // group by base image\r\n let imageObjArrById = groupImageObjectsByBaseImage(imageObjArr, isAdCreatorEnabled);\r\n\r\n // process placements metadata and fill in missing placements for each base image\r\n imageObjArrById = _.map([\r\n ..._.values(imageObjArrById.image),\r\n ..._.values(imageObjArrById.logo),\r\n ], ({ baseId, placements: imageArr }) => {\r\n const baseImageId = baseId.toString().indexOf('-') > -1 ? baseId.match(/(\\S*)-/)[1] : baseId;\r\n\r\n // preprocess metadata in existing placement\r\n if (isAdCreatorEnabled) {\r\n processImagePlacementsMetadata(imageArr, baseImageId, imageToUrlMap[baseImageId], isImageFittingEnabled, isCombinedMsanAndMmaAspectRatios);\r\n }\r\n\r\n // fill in missing placement and generate full list of placements\r\n const missingTypes = _.difference(imageTypesWithOrder, _.pluck(imageArr, 'type'));\r\n const autoCroppedImages =\r\n getAutoCroppedImages({\r\n originalImageToCrop: isAdCreatorEnabled\r\n ? _.first(imageArr).BaseImage : _.first(imageArr),\r\n isMultimediaAd: true,\r\n imageOption: _.first(imageArr).isLogo ?\r\n constants.imageOptionKeys.Logo : constants.imageOptionKeys.Image,\r\n isRecommendedImage: _.first(imageArr).isRecommendedImage,\r\n isCombinedMsanAndMmaAspectRatios,\r\n isLinkedInAd,\r\n disableEdit: _.first(imageArr).disableEdit,\r\n isPMaxAspectRatiosV2Enabled,\r\n });\r\n\r\n return _.compact(_.map(imageTypesWithOrder, (type) => {\r\n const isMissingType = missingTypes.indexOf(type) >= 0;\r\n let placement;\r\n\r\n if (isMissingType) {\r\n placement = _.find(autoCroppedImages, image => image.type === type);\r\n if (placement) {\r\n placement.setIncluded(false);\r\n\r\n if (isAdCreatorEnabled) {\r\n placement.setBaseImage(imageArr[0].BaseImage.clone());\r\n placement.setEffectSettings(placement.BaseImage.EffectSettings);\r\n }\r\n }\r\n } else {\r\n placement = _.find(imageArr, image => image.type === type);\r\n }\r\n\r\n return placement;\r\n }));\r\n });\r\n\r\n return _.values(imageObjArrById);\r\n }\r\n\r\n if (imageObjArr.length === imageTypesWithOrder.length) {\r\n return imageObjArr;\r\n }\r\n\r\n return autoFillMissingImagesAsync(imageObjArr);\r\n });\r\n};\r\n\r\nexport {\r\n getImagesFromMTAssetsAsync,\r\n getMultiImagesFromMTAssetsAsync,\r\n getImageProps,\r\n getAllImagesInfoFromMTAssets,\r\n};\r\n","import {\r\n getAutoCroppedImages,\r\n constants,\r\n} from '@bingads-webui-campaign-react/image-experience';\r\n\r\nimport { IMTAsset, IImageMapUrl } from './types';\r\n\r\nexport function getLogoExperience(assets: IMTAsset[], imageToUrlMap: IImageMapUrl) {\r\n const logoGroup = Object.keys(imageToUrlMap);\r\n\r\n // ImageToUrlMap contains distinct ids, while assets could contain multiple assets with same id\r\n return assets.filter(ass => logoGroup.includes(ass.IdString)).map((asset) => {\r\n const key = asset.IdString;\r\n const assetExtraInfo = imageToUrlMap[key];\r\n\r\n return getAutoCroppedImages({\r\n originalImageToCrop: {\r\n Id: `${key}-${asset.SubType}`,\r\n IdString: key,\r\n Src: imageToUrlMap[key].url,\r\n Width: imageToUrlMap[key].width,\r\n Height: imageToUrlMap[key].height,\r\n source: imageToUrlMap[key].sourceType,\r\n },\r\n imageOption: constants.imageOptionKeys.Logo,\r\n aspectRatioOption: constants.logoSubtypes[asset.SubType],\r\n isMultimediaAdinMSANEnabled: true,\r\n maxCropBox: {\r\n SourceX: asset.CropX ? asset.CropX : 0,\r\n SourceY: asset.CropY ? asset.CropY : 0,\r\n SourceWidth: asset.CropWidth ? asset.CropWidth : assetExtraInfo.width,\r\n SourceHeight: asset.CropHeight ? asset.CropHeight : assetExtraInfo.height,\r\n },\r\n });\r\n });\r\n}\r\n","import {\r\n getAutoCroppedImages,\r\n constants,\r\n} from '@bingads-webui-campaign-react/image-experience';\r\n\r\nimport { IMTAsset, IImageMapUrl } from './types';\r\n\r\nexport function getPortraitExperience(assets: IMTAsset[], imageToUrlMap: IImageMapUrl) {\r\n const portraitGroup = Object.keys(imageToUrlMap);\r\n\r\n // ImageToUrlMap contains distinct ids, while assets could contain multiple assets with same id\r\n return assets.filter(ass => portraitGroup.includes(ass.IdString)).map((asset) => {\r\n const key = asset.IdString;\r\n const assetExtraInfo = imageToUrlMap[key];\r\n\r\n return getAutoCroppedImages({\r\n originalImageToCrop: {\r\n Id: key,\r\n IdString: key,\r\n Src: imageToUrlMap[key].url,\r\n Width: imageToUrlMap[key].width,\r\n Height: imageToUrlMap[key].height,\r\n source: imageToUrlMap[key].sourceType,\r\n },\r\n imageOption: constants.imageOptionKeys.Portrait,\r\n aspectRatioOption: constants.portraitSubtypes[asset.SubType],\r\n isMultimediaAdinMSANEnabled: true,\r\n isPortraitImage: true,\r\n maxCropBox: {\r\n SourceX: asset.CropX ? asset.CropX : 0,\r\n SourceY: asset.CropY ? asset.CropY : 0,\r\n SourceWidth: asset.CropWidth ? asset.CropWidth : assetExtraInfo.width,\r\n SourceHeight: asset.CropHeight ? asset.CropHeight : assetExtraInfo.height,\r\n },\r\n });\r\n });\r\n}\r\n","export const MMAAssetConfigs = {\r\n MAX_HEADLINES: 15,\r\n DEFAULT_HEADLINES: 1,\r\n MIN_HEADLINES: 1,\r\n MAX_LONGHEADLINES: 5,\r\n DEFAULT_LONGHEADLINES: 1,\r\n MIN_LONGHEADLINES: 1,\r\n MAX_DESCRIPTIONS: 5,\r\n DEFAULT_DESCRIPTIONS: 1,\r\n MIN_DESCRIPTIONS: 1,\r\n MAX_HEADLINE_SUGGESTIONS: 15, // MAX_HEADLINES\r\n MAX_DESCRIPTION_SUGGESTIONS: 10, // MAX_DESCRIPTIONS + MAX_LONGHEADLINES\r\n MAX_BUSINESS_NAME: 25,\r\n};\r\n\r\n\r\nexport const ResponsiveAdConfigs = {\r\n MAX_HEADLINE_SUGGESTIONS: 15,\r\n MAX_DESCRIPTION_SUGGESTIONS: 10,\r\n};\r\n","import _ from 'underscore';\r\nimport { MMAAssetConfigs } from './config';\r\n\r\nexport const headlineFields = _.map(_.range(MMAAssetConfigs.MAX_HEADLINES), i => `Headline${i}`);\r\nexport const longHeadlineFields = _.map(_.range(MMAAssetConfigs.MAX_LONGHEADLINES), i => `LongHeadline${i}`);\r\nexport const descriptionFields = _.map(_.range(MMAAssetConfigs.MAX_DESCRIPTIONS), i => `Description${i}`);\r\n\r\nexport const ResponsiveAdScenarios = {\r\n MMASearch: 'MMASearch',\r\n MMAResponsive: 'MMAResponsive',\r\n NonMMAResponsive: 'NonMMAResponsive',\r\n};\r\n\r\nexport const AdEditFields = {\r\n Headline: 'Headline',\r\n LongHeadline: 'LongHeadline',\r\n Description: 'Description',\r\n Text: 'Text',\r\n BusinessName: 'BusinessName',\r\n};\r\n\r\nexport const assetSuggestionType = {\r\n // use for asset suggestions\r\n [AdEditFields.Headline]: 'headline',\r\n [AdEditFields.LongHeadline]: 'description',\r\n [AdEditFields.Description]: 'description',\r\n [AdEditFields.Text]: 'description',\r\n [AdEditFields.BusinessName]: 'business',\r\n};\r\n\r\nexport const singleAssetSuggestionType = {\r\n [AdEditFields.Headline]: 'shortHeadline',\r\n [AdEditFields.LongHeadline]: 'longHeadline',\r\n [AdEditFields.Text]: 'description',\r\n};\r\n","import { forEach, omit, isEmpty, get, reduce, map, filter, defaults } from 'underscore';\r\nimport { isEmptyUrl } from '@bingads-webui-campaign-react/url-input-fluent';\r\nimport { newVideoFromMTObject } from '@bingads-webui-campaign-react/image-experience-video-part';\r\nimport { headlineFields, longHeadlineFields, descriptionFields } from './constants';\r\n\r\n/**\r\n * The optional parameters that are set to empty will be set to 'delete_value' during update,\r\n * need to remove these params before feed to model on edit UI, otherwise the string 'delete_value'\r\n * will be shown on UI instead of empty value.\r\n *\r\n * @param {object} params The object returned from the update request.\r\n *\r\n * @returns {object} Updated object to be saved for edit on UI later.\r\n *\r\n */\r\nexport function omitDeletedParameters(params) {\r\n const optionalParameters = [\r\n 'MobileFinalUrls',\r\n 'FinalUrlSuffix',\r\n 'TrackingUrlTemplate',\r\n 'UrlCustomParameters',\r\n 'LandscapeLogoMediaId',\r\n 'SquareLogoMediaId',\r\n ];\r\n\r\n let formattedParams = params;\r\n\r\n forEach(optionalParameters, (p) => {\r\n if (formattedParams[p] === 'delete_value') {\r\n formattedParams = omit(formattedParams, p);\r\n }\r\n });\r\n\r\n return formattedParams;\r\n}\r\n\r\nexport function convertToLowerCaseKey(objs) {\r\n return objs.map((obj) => {\r\n const item = {};\r\n Object.keys(obj).forEach((key) => {\r\n item[key.charAt(0).toLowerCase() + key.substring(1)] = obj[key];\r\n });\r\n\r\n return item;\r\n });\r\n}\r\n\r\nexport function convertFromAdModel(ad, processImages = true) {\r\n if (!Array.isArray(ad.Headlines)) {\r\n return ad;\r\n }\r\n\r\n const headlines = reduce(get(ad, ['Headlines'], []), (memo, val, idx) => {\r\n const results = { ...memo };\r\n results[`Headline${idx}`] = isEmpty(val.Asset) ? val.Text : val.Asset.Text;\r\n return results;\r\n }, {});\r\n\r\n const longHeadlines = reduce(get(ad, ['LongHeadlines'], []), (memo, val, idx) => {\r\n const results = { ...memo };\r\n results[`LongHeadline${idx}`] = isEmpty(val.Asset) ? val.Text : val.Asset.Text;\r\n return results;\r\n }, {});\r\n\r\n const descriptions = reduce(get(ad, ['Descriptions'], []), (memo, val, idx) => {\r\n const results = { ...memo };\r\n results[`Description${idx}`] = isEmpty(val.Asset) ? val.Text : val.Asset.Text;\r\n return results;\r\n }, {});\r\n\r\n const CallToAction = ad && ad.CallToAction ? {\r\n CallToAction: {\r\n cta: ad.CallToAction,\r\n language: ad.CallToActionLanguage,\r\n },\r\n } : {};\r\n\r\n const adModel = {\r\n ...ad,\r\n Headlines: headlines,\r\n LongHeadlines: longHeadlines,\r\n Descriptions: descriptions,\r\n ...CallToAction,\r\n };\r\n\r\n if (ad && ad.Videos) {\r\n adModel.videos = map(ad.Videos, video => newVideoFromMTObject(video.Asset));\r\n }\r\n\r\n if (processImages) {\r\n adModel.Images = isEmpty(ad.ImageList) ? {\r\n ImageAssets: ad.Images,\r\n } : {\r\n ImageList: ad.ImageList,\r\n };\r\n }\r\n\r\n return adModel;\r\n}\r\n\r\nexport function convertFromBulkResponse(ad = {}) {\r\n const Headlines = JSON.parse(get(ad, ['Headlines'], '[]'));\r\n const LongHeadlines = JSON.parse(get(ad, ['LongHeadlines'], '[]'));\r\n const Descriptions = JSON.parse(get(ad, ['Descriptions'], '[]'));\r\n const Images = JSON.parse(get(ad, ['Images'], '[]'));\r\n\r\n return convertFromAdModel({\r\n ...ad,\r\n Headlines,\r\n LongHeadlines,\r\n Descriptions,\r\n Images,\r\n }, false);\r\n}\r\n\r\nconst mapAssets = (fields, viewModel) => JSON.stringify(map(filter(\r\n fields,\r\n field => !isEmpty(viewModel[field])\r\n), field => ({ Text: viewModel[field] })));\r\n\r\nexport function convertToAdModel(viewModel) {\r\n const data = {\r\n ...viewModel,\r\n Headlines: mapAssets(headlineFields, viewModel.Headlines),\r\n LongHeadlines: mapAssets(longHeadlineFields, viewModel.LongHeadlines),\r\n Descriptions: mapAssets(descriptionFields, viewModel.Descriptions),\r\n CallToAction: viewModel.CallToAction.cta,\r\n CallToActionLanguage: viewModel.CallToAction.language,\r\n UrlCustomParameters: filter(viewModel.UrlCustomParameters, param => !isEmpty(param.Key)),\r\n MobileFinalUrls: isEmptyUrl(viewModel.MobileFinalUrls) ? [] : viewModel.MobileFinalUrls,\r\n };\r\n\r\n return omit(data, isEmpty);\r\n}\r\n\r\nexport function convertToAdModelInResponse(ad = {}) {\r\n const Headlines = map(get(ad, ['Headlines'], {}), headline => ({ Asset: { Text: headline } }));\r\n const LongHeadlines = map(get(ad, ['LongHeadlines'], {}), longHeadline => ({ Asset: { Text: longHeadline } }));\r\n const Descriptions = map(get(ad, ['Descriptions'], {}), description => ({ Asset: { Text: description } }));\r\n const CallToAction = get(ad, ['CallToAction', 'cta']);\r\n const CallToActionLanguage = get(ad, ['CallToAction', 'language']);\r\n const Images = get(ad, ['Images', 'ImageAssets'], []);\r\n const ImageList = get(ad, ['Images', 'ImageList'], []);\r\n\r\n return {\r\n ...ad,\r\n Headlines,\r\n LongHeadlines,\r\n Descriptions,\r\n CallToAction,\r\n CallToActionLanguage,\r\n Images,\r\n ImageList,\r\n };\r\n}\r\n\r\nfunction deleteUndefinedParameters(params) {\r\n const optionalParameters = ['MobileFinalUrls', 'TrackingUrlTemplate', 'UrlCustomParameters', 'LandscapeLogoMediaId', 'SquareLogoMediaId', 'FinalUrlSuffix', 'Headline', 'LongHeadline', 'Text'];\r\n\r\n forEach(optionalParameters, (p) => {\r\n if (isEmpty(params[p]) || (params[p] instanceof Array && params[p].length === 0)) {\r\n // eslint-disable-next-line no-param-reassign\r\n params[p] = 'delete_value';\r\n }\r\n });\r\n\r\n return params;\r\n}\r\n\r\nexport function processViewModelDataForSaving(viewModel, campaignId, adGroupId, adId) {\r\n const adData = defaults(convertToAdModel(viewModel), {\r\n Campaign: {\r\n Id: Number(campaignId),\r\n },\r\n AdGroup: {\r\n Id: Number(adGroupId),\r\n },\r\n });\r\n\r\n if (adId) {\r\n adData.Id = adId;\r\n return deleteUndefinedParameters(adData);\r\n }\r\n\r\n return adData;\r\n}\r\n","import _ from 'underscore';\r\nimport Promise from 'bluebird';\r\nimport { constants, ImageExperienceImage } from '@bingads-webui-campaign-react/image-experience';\r\nimport { serializeImageAssetMetadata } from '@bingads-webui-campaign/media-metadata-model';\r\nimport { getMMAPayloadV2 } from './data-process';\r\nimport { findMetadata, insertMetadata, isMetadataExisting, collectExistingMetadata } from './image-metadata-util';\r\nimport { convertToLowerCaseKey } from './format-data-util';\r\n\r\nconst removeRatioTypeInId = (flattenImageList) => {\r\n flattenImageList.forEach((image) => {\r\n // eslint-disable-next-line no-param-reassign\r\n image.id = image.id.toString().indexOf('-') > -1 && image.isLogo ? image.id.match(/(\\S*)-/)[1] : image.id;\r\n });\r\n return flattenImageList;\r\n};\r\n\r\nconst getMMAImageList = imageList =>\r\n _.map(\r\n imageList,\r\n imageArray => _.filter(\r\n imageArray,\r\n imageObj => imageObj.type in constants.getMmaAspectRatios() && imageObj.isIncluded // eslint-disable-line max-len\r\n )\r\n );\r\n\r\nexport const getFlattenedImageAssetList = (imageList, isMultimediaAdinMSANEnabled, isMultimediaAd) => {\r\n let filteredImageList = imageList;\r\n\r\n if (isMultimediaAdinMSANEnabled) {\r\n filteredImageList = _.map(\r\n imageList,\r\n imageArray => _.filter(imageArray, imageObj => imageObj.isIncluded)\r\n );\r\n } else if (isMultimediaAd) {\r\n filteredImageList = getMMAImageList(imageList);\r\n }\r\n const flattenImageList = _.flatten(filteredImageList, 1);\r\n return removeRatioTypeInId(flattenImageList);\r\n};\r\n\r\n// flattenedImageAssetList and flattenedImageAssetsPayload are mutually exclusive\r\n// only one will be used at one time\r\nexport const getImagesDataModel = ({\r\n flattenedImageAssetList, updates, flattenedImageAssetsPayload, isMultimediaAd, UiUnsupportedRatios,\r\n}) => {\r\n const imagesModel = flattenedImageAssetsPayload || _.map(\r\n flattenedImageAssetList,\r\n (imageObj, index) => {\r\n const overrideInfo = updates && updates[index];\r\n const model = imageObj.formatToSave(isMultimediaAd, false, overrideInfo);\r\n\r\n return model;\r\n }\r\n );\r\n\r\n const UIUnSupportedImagesModel = convertToLowerCaseKey(UiUnsupportedRatios\r\n .map(association =>\r\n _.pick(association.Asset, ['Id', 'CropWidth', 'CropHeight', 'CropX', 'CropY', 'IdString', 'SubType'])));\r\n\r\n return {\r\n Images: JSON.stringify([...imagesModel, ...UIUnSupportedImagesModel]),\r\n };\r\n};\r\n\r\nexport const setMTImageModel = (\r\n originalData,\r\n updates = {},\r\n imageList,\r\n options = {}, // isMultimediaAdinMSANEnabled, isMultimediaAd, isMMAV2Enabled\r\n UiUnsupportedRatios,\r\n portraitImage = {}\r\n) => {\r\n const flattenedImageList = getFlattenedImageAssetList(imageList, options.isMultimediaAdinMSANEnabled, options.isMultimediaAd);\r\n if (options.isMultimediaAdinMSANEnabled) {\r\n let payload = getMMAPayloadV2(\r\n flattenedImageList.filter(item => !item.isLogo),\r\n updates,\r\n options.isMMAV2Enabled,\r\n options.isBoost200x100ImageEnabled,\r\n options.isBoostNewAspectRatioSupportEnabled,\r\n options.isImageFittingEnabled\r\n );\r\n\r\n payload = payload.concat(flattenedImageList\r\n .filter(item => item.isLogo)\r\n .map(item => item.formatToSave()));\r\n\r\n if (options.isBoostPortraitImageEnabled && portraitImage instanceof ImageExperienceImage) {\r\n const portraitImagePayload = portraitImage.formatToSave();\r\n payload.push(portraitImagePayload);\r\n }\r\n\r\n _.extend(originalData, getImagesDataModel({\r\n flattenedImageAssetsPayload: payload,\r\n isMultimediaAd: options.isMultimediaAd,\r\n UiUnsupportedRatios,\r\n }));\r\n } else {\r\n _.extend(originalData, getImagesDataModel({\r\n flattenedImageAssetList: flattenedImageList,\r\n updates,\r\n isMultimediaAd: options.isMultimediaAd,\r\n UiUnsupportedRatios,\r\n }));\r\n }\r\n};\r\n\r\n// If applying effect to an image, need to upload to get a new image Id\r\nexport const updateAssetsIdsAsync = (flattenedImageAssetList, imageIndexAsThumbnail, isAdCreatorEnabled, imageOData) => {\r\n const updates = {};\r\n\r\n if (isAdCreatorEnabled) {\r\n const assetPositionsToUpdate = [];\r\n const newAssets = [];\r\n\r\n // use this mapping to update id. collect metadata-id mapping from existing assets\r\n const existingMetadataIdMapping = collectExistingMetadata(flattenedImageAssetList);\r\n\r\n _.each(flattenedImageAssetList, (asset, index) => {\r\n const metadata = serializeImageAssetMetadata({ effectSettings: asset.EffectSettings });\r\n\r\n // check if any assets have updates in metadata, if so, need to update id\r\n if (asset.isEffectEdited()) {\r\n assetPositionsToUpdate.push({ position: index, baseId: asset.BaseId, metadata });\r\n\r\n if (!isMetadataExisting(existingMetadataIdMapping, asset.BaseId, metadata)) {\r\n newAssets.push({\r\n url: asset.FinalSrc,\r\n baseId: asset.BaseId,\r\n metadata,\r\n });\r\n }\r\n }\r\n });\r\n\r\n if (!_.isEmpty(assetPositionsToUpdate)) {\r\n const saveNewImagesPromise = _.isEmpty(newAssets)\r\n ? Promise.resolve([]) : imageOData.bulkSaveImagesByUrl(newAssets);\r\n\r\n return saveNewImagesPromise\r\n .then((ids) => {\r\n const hasError = _.some(ids, id => id && id.code);\r\n\r\n if (hasError) {\r\n const error = {\r\n errors: _.compact(_.map(ids, id => id.code && {\r\n Error: id.code,\r\n })),\r\n };\r\n\r\n // reject to reuse common catch logic\r\n return Promise.reject(error);\r\n }\r\n\r\n _.each(ids, (id, index) => {\r\n const { baseId, metadata } = newAssets[index];\r\n insertMetadata(existingMetadataIdMapping, baseId, metadata, {\r\n id,\r\n bingSrc: undefined, // for new assets, we don't have bing url yet\r\n });\r\n });\r\n\r\n _.each(assetPositionsToUpdate, ({ position, baseId, metadata }) => {\r\n const foundInfo = findMetadata(existingMetadataIdMapping, baseId, metadata);\r\n\r\n updates[position] = {\r\n id: foundInfo.id,\r\n bingSrc: foundInfo.bingSrc,\r\n };\r\n });\r\n\r\n // if asset used for thumbnail is updated without latest bing src, send call\r\n if (updates[imageIndexAsThumbnail] && !updates[imageIndexAsThumbnail].bingSrc) {\r\n const thumbnailAsset = updates[imageIndexAsThumbnail];\r\n\r\n return imageOData.getImageByIdAsync(thumbnailAsset.id)\r\n .then((value) => {\r\n thumbnailAsset.bingSrc = value.Url;\r\n\r\n return updates;\r\n });\r\n }\r\n\r\n return updates;\r\n });\r\n }\r\n }\r\n\r\n return Promise.resolve(updates);\r\n};\r\n\r\nexport const processImageListViewModelToModel = (imageList, imageOData, isMultimediaAd = true, isMultimediaAdinMSANEnabled = false, isMMAV2Enabled = false, UiUnsupportedRatios = []) => {\r\n const flattenedIncludedImageAssetList = getFlattenedImageAssetList(imageList, isMultimediaAdinMSANEnabled, isMultimediaAd);\r\n const imageIndexAsThumbnail = 0;\r\n const originalData = {};\r\n\r\n return updateAssetsIdsAsync(flattenedIncludedImageAssetList, imageIndexAsThumbnail, true /* isAdCreatorEnabled */, imageOData)\r\n .then((updates) => {\r\n const originalThumbnailAsset = flattenedIncludedImageAssetList[imageIndexAsThumbnail];\r\n const overrideInfo = updates[imageIndexAsThumbnail];\r\n let imageToGenerateThumbnail;\r\n\r\n if (overrideInfo) {\r\n imageToGenerateThumbnail = originalThumbnailAsset.copyThumbnailLookToNewImage({\r\n id: overrideInfo.id,\r\n src: overrideInfo.bingSrc,\r\n });\r\n } else {\r\n imageToGenerateThumbnail = originalThumbnailAsset;\r\n }\r\n\r\n setMTImageModel(\r\n originalData,\r\n updates,\r\n imageList,\r\n {\r\n isMultimediaAdinMSANEnabled,\r\n isMultimediaAd,\r\n isMMAV2Enabled,\r\n isBoostPortraitImageEnabled: false,\r\n isBoost200x100ImageEnabled: false,\r\n isBoostNewAspectRatioSupportEnabled: false,\r\n },\r\n UiUnsupportedRatios\r\n );\r\n\r\n return {\r\n mtModel: originalData,\r\n imageToGenerateThumbnail,\r\n };\r\n });\r\n};\r\n","import React from 'react';\r\nimport { useId, useConst } from '@fluentui/react-hooks';\r\nimport { TooltipHost } from '@fluentui/react/lib/Tooltip';\r\nimport PropTypes from 'prop-types';\r\n\r\n\r\nexport const EditableImageButton = (props) => {\r\n const {\r\n imageItem, i18n, baseImageId, onEdit,\r\n } = props;\r\n const tooltipId = useId('disableEditImageToolTip');\r\n const buttonId = useId('targetButton');\r\n const calloutProps = useConst({\r\n gapSpace: 0,\r\n target: `#${buttonId}`,\r\n });\r\n\r\n return (\r\n \r\n {\r\n !imageItem.disableEdit && \r\n }\r\n {\r\n imageItem.disableEdit &&\r\n \r\n \r\n \r\n }\r\n \r\n );\r\n};\r\n\r\nEditableImageButton.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n onEdit: PropTypes.func.isRequired,\r\n baseImageId: PropTypes.string.isRequired,\r\n imageItem: PropTypes.shape({\r\n disableEdit: PropTypes.bool.isRequired,\r\n }).isRequired,\r\n};\r\n\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport {\r\n MenuGroup,\r\n Menu,\r\n MenuTrigger,\r\n MenuList,\r\n MenuItem,\r\n MenuPopover,\r\n MenuGroupHeader,\r\n FluentProvider,\r\n webLightTheme,\r\n makeStyles,\r\n} from '@fluentui/react-components';\r\nimport CopilotIcon from './media/sparkle.svg';\r\nimport CopilotIconSelected from './media/sparkle-selected.svg';\r\nimport TryBackgroundIcon from './media/try-background.svg';\r\n\r\nconst padding = '6px';\r\nconst useInlineCopilotUIStyles = makeStyles({\r\n image: {\r\n paddingRight: '4px',\r\n },\r\n popover: {\r\n paddingTop: padding,\r\n paddingBottom: padding,\r\n paddingLeft: padding,\r\n paddingRight: padding,\r\n },\r\n groupHeader: {\r\n paddingTop: padding,\r\n paddingBottom: padding,\r\n paddingLeft: padding,\r\n paddingRight: padding,\r\n },\r\n menuItem: {\r\n paddingTop: padding,\r\n paddingBottom: padding,\r\n paddingLeft: padding,\r\n paddingRight: padding,\r\n },\r\n});\r\n\r\nexport const SparkleMenuButton = (props) => {\r\n const {\r\n imageItem, i18n, baseImageId, onChangeBackgroundScene, onMeuOpenChange,\r\n } = props;\r\n const classes = useInlineCopilotUIStyles();\r\n\r\n return (\r\n \r\n \r\n \r\n {triggerprops => (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {i18n.getString(_TL_('Copilot can assist you'))}\r\n \r\n {i18n.getString(_TL_('Change\r\n {i18n.getString(_TL_('Change to a new background'))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nSparkleMenuButton.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n onChangeBackgroundScene: PropTypes.func.isRequired,\r\n baseImageId: PropTypes.string.isRequired,\r\n imageItem: PropTypes.shape({\r\n disableEdit: PropTypes.bool.isRequired,\r\n }).isRequired,\r\n onMeuOpenChange: PropTypes.func.isRequired,\r\n};\r\n\r\n","/* eslint-disable react-hooks/rules-of-hooks */\r\nimport React, { useState, useCallback } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport classnames from 'classnames';\r\nimport { ChoiceGroup } from '@bingads-webui-react/fabric-control';\r\nimport { setClarityTag } from '@bingads-webui-universal/clarity';\r\nimport { ImageExperienceImage, constants as C } from '@bingads-webui-campaign-react/image-experience-model';\r\nimport { UiBlocker } from '@bingads-webui-react/ui-blocker';\r\nimport { EditableImageButton } from './editable-image-button';\r\nimport { SparkleMenuButton } from './sparkle-menu-button';\r\n\r\nconst logSignal = (props, message) => {\r\n if (props.logger) {\r\n props.logger.signal(`${message}: isLogo:${props.isLogo} isPortrait:${props.isPortrait}`, 'ResponsiveImageListView');\r\n }\r\n};\r\n\r\nexport const handleMouseEnter = (props) => {\r\n logSignal(props, 'mouse enter image-list-item');\r\n setClarityTag({ HoverResponsiveImageListView: 'Hover' });\r\n if (props.showCopilotOption) {\r\n logSignal(props, 'mouse enter image-list-item: show copilot option');\r\n setClarityTag({ HoverResponsiveImageListView: 'HoverCopilotMenu' });\r\n }\r\n};\r\n\r\nexport const handleMouseLeave = (props) => {\r\n logSignal(props, 'mouse leave image-list-item');\r\n if (props.showCopilotOption) {\r\n logSignal(props, 'mouse leave image-list-item: show copilot option');\r\n }\r\n};\r\n\r\nexport class ResponsiveImageListView extends React.PureComponent {\r\n constructor(props) {\r\n super(props);\r\n // Only for test purpose\r\n if (this.props.testRef) {\r\n this.props.testRef.current = {\r\n that: this,\r\n };\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n logSignal(this.props, 'mount');\r\n if (this.props.showCopilotOption) {\r\n logSignal(this.props, 'mount: show copilot option');\r\n }\r\n }\r\n\r\n onSelect = (_event, option) => {\r\n if (!option.isAddButton) {\r\n this.props.onSelectImage(option.key, option.isLogo);\r\n }\r\n };\r\n\r\n onRemove = (event) => {\r\n logSignal(this.props, 'remove');\r\n if (this.props.showCopilotOption) {\r\n logSignal(this.props, 'remove: show copilot option');\r\n }\r\n this.props.onRemoveImage(event.currentTarget.dataset.imageid, this.props.isLogo, this.props.isPortrait);\r\n };\r\n\r\n onEdit = (event) => {\r\n logSignal(this.props, 'edit');\r\n if (this.props.showCopilotOption) {\r\n logSignal(this.props, 'edit: show copilot option');\r\n }\r\n this.props.onEditImage(event.currentTarget.dataset.imageid, this.props.isLogo, this.props.isPortrait);\r\n };\r\n\r\n onChangeBackgroundScene = (event) => {\r\n logSignal(this.props, 'change background');\r\n this.props.onChangeBackgroundScene(event.currentTarget.dataset.imageid);\r\n };\r\n\r\n getKeyForImageItem(placements) {\r\n const [firstPlacement] = placements;\r\n const baseImageId = firstPlacement.BaseId;\r\n return baseImageId;\r\n }\r\n\r\n getChoiceGroupOption() {\r\n return _.map(this.props.imageList, (placements, index) => {\r\n const imageItem = _.first(placements);\r\n const baseImageId = this.getKeyForImageItem(placements);\r\n\r\n if (imageItem) {\r\n const contentWidth = 112; // choice box width\r\n const contentHeight = 99;\r\n // ad creator restyles buttons, adjust height accordingly\r\n let desiredImageWidth = contentWidth;\r\n let desiredImageHeight = contentHeight;\r\n\r\n const styles = {};\r\n\r\n let imageSrc = imageItem.Src;\r\n // distinguish the thumbnail of logo\r\n const isLandscapeLogoMedia = imageItem.isLogo && imageItem.id.indexOf('LandscapeLogoMedia') > -1;\r\n\r\n // if there is image crop, re-locate the image based on the crop box\r\n const ratio = contentHeight / imageItem.Height > contentWidth / imageItem.Width ?\r\n contentHeight / imageItem.Height : contentWidth / imageItem.Width;\r\n\r\n desiredImageHeight = imageItem.Height * ratio;\r\n desiredImageWidth = imageItem.Width * ratio;\r\n\r\n let midPointOffsetX = desiredImageWidth > contentWidth ?\r\n Math.ceil(-(desiredImageWidth - contentWidth) / 2) : 0;\r\n let midPointOffsetY = desiredImageHeight > contentHeight ?\r\n Math.ceil(-(desiredImageHeight - contentHeight) / 2) : 0;\r\n\r\n _.extend(styles, {\r\n field: {\r\n alignItems: 'center',\r\n justifyContent: 'start',\r\n overflow: 'hidden',\r\n },\r\n selectedImageWrapper: {\r\n marginLeft: midPointOffsetX,\r\n marginTop: midPointOffsetY,\r\n },\r\n imageWrapper: {\r\n marginLeft: midPointOffsetX,\r\n marginTop: midPointOffsetY,\r\n },\r\n });\r\n\r\n /* istanbul ignore if */\r\n if (isLandscapeLogoMedia) {\r\n let landscapeLogoRatio = C.getMmaAspectRatios('Logo');\r\n // get the ratio :4\r\n landscapeLogoRatio = landscapeLogoRatio.Image4x1.aspectRatio;\r\n const landscapeLogoMarginTop = (contentHeight - (contentHeight / landscapeLogoRatio)) / 2;\r\n const landscapeLogoShowHeight = contentHeight / landscapeLogoRatio;\r\n const landscapeLogoTop = ((desiredImageHeight - contentHeight) / 2) + landscapeLogoMarginTop;\r\n\r\n _.extend(styles, {\r\n innerField: {\r\n height: `${landscapeLogoShowHeight}px !important`,\r\n overflow: 'hidden',\r\n marginTop: landscapeLogoMarginTop,\r\n },\r\n selectedImageWrapper: {\r\n position: 'absolute',\r\n top: -landscapeLogoTop,\r\n },\r\n imageWrapper: {\r\n position: 'absolute',\r\n top: -landscapeLogoTop,\r\n },\r\n });\r\n }\r\n\r\n const imageCropSettings = imageItem.BaseImage && imageItem.BaseImage.CropSettings;\r\n imageSrc = imageItem.BaseImage.FinalSrc;\r\n\r\n if (imageCropSettings\r\n && imageCropSettings.SourceWidth > 0\r\n && imageCropSettings.SourceHeight > 0) {\r\n let desiredCropWidth = contentWidth;\r\n let desiredCropHeight = contentHeight;\r\n\r\n const cropImageWidth = imageCropSettings.SourceWidth;\r\n const cropImageHeight = imageCropSettings.SourceHeight;\r\n\r\n const cropRatio = contentHeight / cropImageHeight > contentWidth / cropImageWidth ?\r\n contentHeight / cropImageHeight : contentWidth / cropImageWidth;\r\n\r\n desiredCropHeight = cropImageHeight * cropRatio;\r\n desiredCropWidth = cropImageWidth * cropRatio;\r\n\r\n const xscale = desiredCropWidth / imageCropSettings.SourceWidth;\r\n const yscale = desiredCropHeight / imageCropSettings.SourceHeight;\r\n\r\n // use original image width/height and use css to re-position to show cropped area\r\n desiredImageWidth = imageItem.Width * xscale;\r\n desiredImageHeight = imageItem.Height * yscale;\r\n\r\n midPointOffsetX = desiredCropWidth > contentWidth ?\r\n Math.ceil(-(desiredCropWidth - contentWidth) / 2) : 0;\r\n midPointOffsetY = desiredCropHeight > contentHeight ?\r\n Math.ceil(-(desiredCropHeight - contentHeight) / 2) : 0;\r\n\r\n _.extend(styles, {\r\n selectedImageWrapper: {\r\n marginLeft: (-imageCropSettings.SourceX * xscale) + midPointOffsetX,\r\n marginTop: (-imageCropSettings.SourceY * yscale) + midPointOffsetY,\r\n },\r\n imageWrapper: {\r\n marginLeft: (-imageCropSettings.SourceX * xscale) + midPointOffsetX,\r\n marginTop: (-imageCropSettings.SourceY * yscale) + midPointOffsetY,\r\n },\r\n });\r\n }\r\n\r\n const {\r\n i18n,\r\n isLogo,\r\n showCopilotOption,\r\n enableEdit,\r\n } = this.props;\r\n\r\n return {\r\n key: baseImageId,\r\n imageSrc,\r\n selectedImageSrc: imageSrc,\r\n imageSize: {\r\n /* istanbul ignore next */\r\n width: desiredImageWidth, height: desiredImageHeight,\r\n },\r\n text: '',\r\n isLogo,\r\n styles,\r\n ariaLabel: `${i18n.getString(_TL_('Image'))} ${index + 1}`,\r\n onRenderLabel: () => null,\r\n onRenderField: (props, render) => {\r\n const [open, setOpen] = useState(false);\r\n const onMeuOpenChange = useCallback((e, data) => {\r\n logSignal(this.props, `open copilot menu: ${data.open}`);\r\n if (data.open) {\r\n setClarityTag({ HoverResponsiveImageListView: 'OpenCopilotMenu' });\r\n }\r\n setOpen(data.open);\r\n }, []);\r\n\r\n\r\n return (\r\n handleMouseEnter(this.props)}\r\n onMouseLeave={() => handleMouseLeave(this.props)}\r\n key={imageItem.Type}\r\n style={{ overflow: 'hidden' }}\r\n data-imageid={baseImageId}\r\n >\r\n
\r\n { render(props) }\r\n
\r\n {showCopilotOption &&\r\n \r\n }\r\n {enableEdit &&\r\n }\r\n {showCopilotOption &&
}\r\n \r\n {\r\n imageItem.isRecommendedImage && \r\n }\r\n
\r\n
\r\n
\r\n );\r\n },\r\n };\r\n }\r\n\r\n return null;\r\n });\r\n }\r\n\r\n addButtonChoiceOption = ({\r\n key: 'choice-group-add-img',\r\n isAddButton: true,\r\n text: '',\r\n styles: {\r\n field: {\r\n alignItems: 'center',\r\n justifyContent: 'start',\r\n overflow: 'hidden',\r\n '&:before, &:after': {\r\n visibility: 'hidden',\r\n },\r\n },\r\n },\r\n ariaLabel: 'choice-group-add-img',\r\n onRenderLabel: () => null,\r\n onRenderField: (props, render) => (\r\n \r\n
\r\n { render(props) }\r\n \r\n
\r\n \r\n ),\r\n });\r\n\r\n render() {\r\n const { portalContainer, blocking } = this.props;\r\n\r\n const choiceGroupOptions = this.getChoiceGroupOption();\r\n if (this.props.isRenderAddInImageList) {\r\n choiceGroupOptions.push(this.addButtonChoiceOption);\r\n }\r\n\r\n const renderContent = (\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n {this.props.error ? (\r\n
\r\n {this.props.error}\r\n
\r\n ) : null}\r\n
\r\n \r\n );\r\n\r\n return portalContainer ? ReactDOM.createPortal(renderContent, portalContainer) : renderContent;\r\n }\r\n}\r\n\r\nResponsiveImageListView.propTypes = {\r\n imageList: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.instanceOf(ImageExperienceImage)))\r\n .isRequired,\r\n onRemoveAllImages: PropTypes.func.isRequired,\r\n onRemoveImage: PropTypes.func.isRequired,\r\n onEditImage: PropTypes.func,\r\n onChangeBackgroundScene: PropTypes.func,\r\n onSelectImage: PropTypes.func.isRequired,\r\n isRenderAddInImageList: PropTypes.bool,\r\n onAddImage: PropTypes.func,\r\n currentSelectedImageId: PropTypes.any,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n parseDecimal: PropTypes.func.isRequired,\r\n }).isRequired,\r\n isLogo: PropTypes.bool,\r\n portalContainer: PropTypes.instanceOf(Element),\r\n showCopilotOption: PropTypes.bool,\r\n enableEdit: PropTypes.bool,\r\n blocking: PropTypes.bool,\r\n error: PropTypes.string,\r\n isPortrait: PropTypes.bool,\r\n logger: PropTypes.shape({\r\n signal: PropTypes.func.isRequired,\r\n }),\r\n};\r\n\r\nResponsiveImageListView.defaultProps = {\r\n isRenderAddInImageList: false,\r\n onAddImage: null,\r\n currentSelectedImageId: null,\r\n onEditImage: _.noop,\r\n onChangeBackgroundScene: _.noop,\r\n isLogo: false,\r\n portalContainer: null,\r\n showCopilotOption: false,\r\n enableEdit: true,\r\n blocking: false,\r\n error: undefined,\r\n isPortrait: false,\r\n logger: undefined,\r\n};\r\n","import _ from 'underscore';\r\nimport { getUrlProtocolAndDomain } from '@bingads-webui/url-util';\r\nimport { getCharCountExcludingAdCustomizers } from '@bingads-webui-campaign/ad-customizers-next';\r\nimport { validateAdUrl } from '@bingads-webui-campaign-react/url-input-fluent';\r\n\r\nconst textFieldErrorMessage = _TL_('This field is required');\r\nconst lengthLimitErrorMessage = _TL_('The number of characters in this field cannot exceed {{lengthLimit}}');\r\nconst requirePath1ErrorMessage = _TL_('In order to use path 2, path 1 must also be used.');\r\nconst pathLengthLimitErrorMessages = [\r\n _TL_('Path 1 cannot exceed 15 characters.'),\r\n _TL_('Path 2 cannot exceed 15 characters.'),\r\n];\r\n\r\nexport const URL_COLON_SLASH_SLASH = '://';\r\nexport const DEFAULT_URL_PREFIX = 'https';\r\nexport const IS_DISTINGUISH_WIDE_CHAR = true;\r\nexport const AD_TYPE_RSA = 'ResponsiveSearchAd';\r\n\r\nexport const adsFields = {\r\n DESTINATION_URL: 'FinalUrls',\r\n DISPLAY_URL: 'DisplayUrl',\r\n PATH1: 'Path1',\r\n PATH2: 'Path2',\r\n MOBILE_URL: 'MobileFinalUrls',\r\n HEADLINES: 'Headlines',\r\n DESCRIPTIONS: 'Descriptions',\r\n TRACKING_URL_TEMPLATE: 'TrackingUrlTemplate',\r\n FINAL_URL_SUFFIX: 'FinalUrlSuffix',\r\n URL_CUSTOM_PARAMETERS: 'UrlCustomParameters',\r\n};\r\n\r\nexport const adsFieldAlias = {\r\n [adsFields.HEADLINES]: 'AdHeadlines',\r\n [adsFields.DESCRIPTIONS]: 'AdDescriptions',\r\n};\r\n\r\nexport const adsFieldLengthLimitMap = {\r\n FinalUrls: 2048,\r\n Path1: 15,\r\n Path2: 15,\r\n DisplayUrl: 2048,\r\n MobileFinalUrls: 2048,\r\n Headlines: 30,\r\n LongHeadlines: 90,\r\n Descriptions: 90,\r\n TrackingUrlTemplate: 2048,\r\n FinalUrlSuffix: 1024,\r\n UrlCustomParametersKey: 16,\r\n UrlCustomParametersValue: 2048,\r\n};\r\n\r\n// This was used to bypass the requirement to use the actual i18n object\r\n// in scenarios where we only want to determine if a given field passes\r\n// validation - i.e., we don't care about the actual error message itself.\r\nexport const notI18n = {\r\n getString: _.identity,\r\n};\r\n\r\n/**\r\n * Calculate the max length for the destination URL without prefix.\r\n * @param {String} urlPrefix - URL prefix.\r\n * @returns {Number} - Max length for the destination URL without prefix.\r\n */\r\nexport function getDestinationUrlWithoutPrefixLengthLimit(urlPrefix) {\r\n const key = adsFields.DESTINATION_URL;\r\n\r\n return adsFieldLengthLimitMap[key] - urlPrefix.length - URL_COLON_SLASH_SLASH.length;\r\n}\r\n\r\n/**\r\n * Validates a text field value.\r\n * @param {String} value - Value of the text field.\r\n * @param {Number} lengthLimit - Max length allowed for the value.\r\n * @param {Object} [i18n] - i18n library.\r\n * @param {String} field - field.\r\n * @param {Boolean} [optional=false] - If true, value is allowed to be empty.\r\n * @param {String} [adType] - ResponsiveSearchAd or ResponsiveAd.\r\n * @returns {String} - Null if value is valid. Error message if invalid.\r\n */\r\nexport function validateTextFieldValue(\r\n value, lengthLimit, i18n = notI18n, field,\r\n optional = false, adType = AD_TYPE_RSA\r\n) {\r\n const size = getCharCountExcludingAdCustomizers({\r\n text: value,\r\n adType,\r\n field,\r\n });\r\n\r\n if (!optional && size === 0) {\r\n return i18n.getString(textFieldErrorMessage);\r\n }\r\n\r\n if (size > lengthLimit) {\r\n // character count exceeds limit\r\n return i18n.getString(lengthLimitErrorMessage, { lengthLimit });\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function validateTextField(fieldName, i18n, optional, adType = AD_TYPE_RSA) {\r\n return (value) => {\r\n const lengthLimit = adsFieldLengthLimitMap[fieldName];\r\n const errMsg = validateTextFieldValue(value, lengthLimit, i18n, fieldName, optional, adType);\r\n return errMsg || '';\r\n };\r\n}\r\n\r\nexport function validateDestinationUrl(urlPrefix, campaignWebsite, i18n, optional = false) {\r\n const campaignUrlProtocolAndDomain = getUrlProtocolAndDomain(campaignWebsite);\r\n\r\n return (value) => {\r\n if (optional && _.isEmpty(value)) {\r\n return '';\r\n }\r\n\r\n const selectedUrlPrefix = urlPrefix || DEFAULT_URL_PREFIX;\r\n const url = `${selectedUrlPrefix}${URL_COLON_SLASH_SLASH}${value}`;\r\n\r\n const errMsg = validateAdUrl(url, campaignUrlProtocolAndDomain, i18n);\r\n\r\n return errMsg || '';\r\n };\r\n}\r\n\r\nexport function validateTextAssets(assets, config, i18n) {\r\n let error;\r\n const { minSize, errorMap } = config;\r\n\r\n const availableAssets = _.filter(assets, a => !_.isEmpty(a.Asset.Text.trim()))\r\n .map(a => ({\r\n Text: a.Asset.Text.trim(),\r\n PinnedField: a.PinnedField,\r\n }));\r\n\r\n if (_.size(availableAssets) < minSize) {\r\n error = errorMap.lessThanRequired;\r\n } else if (_.size(_.uniq(availableAssets, 'Text')) < _.size(availableAssets)) {\r\n error = errorMap.duplicate;\r\n } else {\r\n const unpinnedSize = _.size(_.filter(availableAssets, a => a.PinnedField === 'None'));\r\n if (unpinnedSize < minSize) {\r\n const pinnedSize = _.size(_.uniq(availableAssets, 'PinnedField')) - (unpinnedSize ? 1 : 0);\r\n if (pinnedSize < minSize - unpinnedSize) {\r\n error = errorMap.lessPosition;\r\n }\r\n }\r\n }\r\n\r\n return error ? i18n.getString(error) : '';\r\n}\r\n\r\nexport function validatePath(values, i18n) {\r\n const errors = [];\r\n\r\n if (_.isEmpty(values[0]) && !_.isEmpty(values[1])) {\r\n errors.push({\r\n Property: adsFields.PATH1,\r\n Message: i18n.getString(requirePath1ErrorMessage),\r\n });\r\n }\r\n\r\n _.each([\r\n adsFields.PATH1,\r\n adsFields.PATH2,\r\n ], (field, index) => {\r\n const error =\r\n validateTextFieldValue(values[index], adsFieldLengthLimitMap[field], i18n, field, true);\r\n if (error) {\r\n errors.push({\r\n Property: field,\r\n Message: i18n.getString(pathLengthLimitErrorMessages[index]),\r\n });\r\n }\r\n });\r\n\r\n return errors;\r\n}\r\n","import _ from 'underscore';\r\nimport React, { useMemo, useContext, useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { adsFieldAlias } from '../validators';\r\n\r\nexport const ErrorContext = React.createContext([]);\r\n\r\nexport function Error(props) {\r\n const {\r\n filter,\r\n property,\r\n index,\r\n } = props;\r\n\r\n const { errors, onFirstErrorHandler } = useContext(ErrorContext);\r\n const alertRef = useRef(null);\r\n\r\n const filteredErrors = useMemo(() => {\r\n if (_.isFunction(filter)) {\r\n return _.filter(errors, error => filter(error));\r\n } else if (!_.isEmpty(property)) {\r\n return _.filter(errors, error => (error.Property === property ||\r\n error.Property === adsFieldAlias[property]) &&\r\n (index === null || index === error.Index));\r\n }\r\n return errors;\r\n }, [errors, filter, index, property]);\r\n\r\n useEffect(() => {\r\n if (filteredErrors && filteredErrors.length > 0 && errors[0].Property === filteredErrors[0].Property) {\r\n onFirstErrorHandler(alertRef.current);\r\n }\r\n }, [errors, filteredErrors, onFirstErrorHandler]);\r\n\r\n return filteredErrors && filteredErrors.length > 0 ? (\r\n \r\n { _.map(filteredErrors, error => (\r\n
\r\n {error.Message || error.Code}\r\n
\r\n ))}\r\n \r\n ) : null;\r\n}\r\n\r\nError.propTypes = {\r\n filter: PropTypes.func,\r\n\r\n property: PropTypes.string,\r\n\r\n index: PropTypes.number,\r\n};\r\n\r\nError.defaultProps = {\r\n filter: null,\r\n property: null,\r\n index: null,\r\n};\r\n","import _ from 'underscore';\r\nimport React, { useContext, useMemo } from 'react';\r\nimport { ErrorContext } from './error';\r\nimport { adsFieldAlias } from '../validators';\r\n\r\nexport const withError = (WrappedComponent, property) => (\r\n React.memo((props) => {\r\n const { errors } = useContext(ErrorContext);\r\n\r\n const filteredErrors = useMemo(() => {\r\n if (!_.isEmpty(property)) {\r\n return _.filter(errors, error => error.Property === property ||\r\n error.Property === adsFieldAlias[property]);\r\n }\r\n return errors;\r\n }, [errors]);\r\n\r\n const errorMessage = _.isEmpty(filteredErrors) ? undefined : _.map(filteredErrors, error => error.Message || error.Code).join('\\n');\r\n\r\n return (\r\n \r\n );\r\n })\r\n);\r\n","export const contentStyles = {\r\n contentContainerStackToken: {\r\n childrenGap: 16,\r\n },\r\n urlFieldStackToken: {\r\n childrenGap: 16,\r\n },\r\n pathFieldStackToken: {\r\n childrenGap: 6,\r\n },\r\n actionStackToken: {\r\n childrenGap: 16,\r\n },\r\n errorStackToken: {\r\n childrenGap: 6,\r\n },\r\n};\r\n\r\nexport const textFieldStyles = (props) => {\r\n const { inputClassName } = props;\r\n const noInlineError = inputClassName === 'no-inline-error';\r\n\r\n return {\r\n charCountDescription: {\r\n root: {\r\n textAlign: 'right',\r\n fontWeight: 'normal',\r\n fontSize: 14,\r\n },\r\n },\r\n dynamicLinkContainer: {\r\n marginLeft: '5px',\r\n },\r\n dynamicLink: {\r\n root: {\r\n padding: '5px',\r\n selectors: {\r\n '&:focus': {\r\n boxShadow: 'none !important',\r\n outline: '1px solid rgb(96, 94, 92) !important',\r\n },\r\n },\r\n },\r\n },\r\n errorMessage: noInlineError ? { display: 'none' } : {},\r\n };\r\n};\r\n\r\nexport const containerStyles = {\r\n container: {\r\n root: {\r\n width: '100%',\r\n minHeight: '100%',\r\n position: 'relative',\r\n selectors: {\r\n '& .rsa-left-copilot-column': {\r\n maxWidth: 600,\r\n '& .rsa-card-title': {\r\n fontSize: '18px',\r\n display: 'inline',\r\n },\r\n },\r\n '& .rsa-right-column': {\r\n '& .fixed': {\r\n position: 'sticky',\r\n top: 0,\r\n },\r\n },\r\n '& .rsa-left-column': {\r\n maxWidth: 592,\r\n minWidth: 460,\r\n width: '100%',\r\n '& .collapse-panel .img-ext-pane': {\r\n borderTop: 'none',\r\n borderBottom: 'none',\r\n },\r\n '& .collapse-panel .img-ext-pane-header': {\r\n display: 'none',\r\n },\r\n '& .collapse-panel .title-item': {\r\n width: 'auto',\r\n },\r\n '& .copilot-banner-container': {\r\n marginBottom: 8,\r\n },\r\n },\r\n\r\n '& .rsa-errors': {\r\n color: '#A80000',\r\n fontSize: 12,\r\n },\r\n\r\n '& .rsa-errors .error': {\r\n margin: 0,\r\n },\r\n '& .rsa-field-path1, & .rsa-field-path2': {\r\n width: '30%',\r\n },\r\n },\r\n },\r\n },\r\n input: {\r\n root: {\r\n padding: 16,\r\n overflow: 'hidden',\r\n },\r\n },\r\n preview: {\r\n root: {\r\n padding: '0 32px',\r\n },\r\n },\r\n contentContainer: {\r\n root: {\r\n overflowY: 'auto',\r\n overflowX: 'hidden',\r\n },\r\n },\r\n urlPath: {\r\n root: {\r\n flexFlow: 'row wrap',\r\n wordBreak: 'break-all',\r\n '& .rsa-field-display-url': {\r\n paddingBottom: '8px',\r\n },\r\n },\r\n },\r\n};\r\n\r\nexport const stickyAdPreviewStyles = {\r\n position: 'sticky',\r\n top: 50,\r\n};\r\n","/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useCallback, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { ContextualMenu, Link } from '@fluentui/react';\r\nimport { textFieldStyles } from '../styles';\r\n\r\nexport function DynamicTextExtention(props) {\r\n const { i18n, onTextFieldChange, cachedValue } = props;\r\n\r\n const [showContextualMenu, setShowContextualMenu] = useState(false);\r\n const [target, setTarget] = useState(null);\r\n const linkRef = React.useRef(null);\r\n const onShowContextualMenu = useCallback((e) => {\r\n e.preventDefault();\r\n setShowContextualMenu(true);\r\n setTarget(e.target);\r\n }, []);\r\n const onHideContextualMenu = useCallback(() => setShowContextualMenu(false), []);\r\n\r\n const menuItems = [{\r\n key: '{param1}',\r\n text: ` ${i18n.getString(_TL_('Placeholder {param1}'))}`,\r\n onClick: e => onTextFieldChange(e, `${cachedValue}{param1}`),\r\n }, {\r\n key: '{param2}',\r\n text: ` ${i18n.getString(_TL_('Placeholder {param2}'))}`,\r\n onClick: e => onTextFieldChange(e, `${cachedValue}{param2}`),\r\n }, {\r\n key: '{param3}',\r\n text: ` ${i18n.getString(_TL_('Placeholder {param3}'))}`,\r\n onClick: e => onTextFieldChange(e, `${cachedValue}{param3}`),\r\n }];\r\n\r\n return (\r\n \r\n \r\n {i18n.getString(_TL_('dynamic text'))}\r\n \r\n \r\n );\r\n}\r\n\r\nDynamicTextExtention.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n onTextFieldChange: PropTypes.func.isRequired,\r\n cachedValue: PropTypes.string.isRequired,\r\n};\r\n","import _ from 'underscore';\r\nimport React, { useMemo, useCallback, useState, useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { TextField, Label, Stack } from '@fluentui/react';\r\nimport { useAdCustomizers, getCharCountExcludingAdCustomizers } from '@bingads-webui-campaign/ad-customizers-next';\r\nimport { useAdStrengthSuggestion } from '@bingads-webui-campaign-react/responsive-search-ad-suggestion';\r\nimport { DynamicTextExtention } from './dynamic-text-extention';\r\n\r\nimport {\r\n validateTextField,\r\n adsFieldLengthLimitMap,\r\n AD_TYPE_RSA,\r\n} from '../validators';\r\nimport { textFieldStyles } from '../styles';\r\n\r\n// Bug 2751598: Cursor jump on edit text ads, updateItem() runs for too long\r\nconst UPDATE_ITEM_WAIT_IN_MS = 100;\r\n\r\nexport function BaseTextField(props) {\r\n const {\r\n configProps,\r\n value,\r\n updateItem,\r\n i18n,\r\n optional,\r\n adsFieldId,\r\n allowNewLines,\r\n showCharRemaining,\r\n showErrorMessage,\r\n errorMessage,\r\n isForVnext,\r\n assets,\r\n index,\r\n updateSuggestionMeasurement,\r\n showDynamicTextExtention,\r\n inputClassName,\r\n onBlur,\r\n llmAssetsSuggestions,\r\n adType,\r\n containerSelector,\r\n enableDKI,\r\n DKIThemeName,\r\n } = props;\r\n\r\n const [cachedValue, setCachedValue] = useState(value);\r\n const {\r\n key,\r\n ...restProps\r\n } = configProps;\r\n\r\n const charLimit = useMemo(() => adsFieldLengthLimitMap[key], [key]);\r\n\r\n const [charRemaining, setCharRemaining] =\r\n useState(charLimit - getCharCountExcludingAdCustomizers({\r\n text: cachedValue,\r\n adType,\r\n field: key,\r\n }));\r\n\r\n useEffect(() => {\r\n setCachedValue(value);\r\n setCharRemaining(charLimit - getCharCountExcludingAdCustomizers({\r\n text: value,\r\n adType,\r\n field: key,\r\n }));\r\n }, [adType, charLimit, key, value]);\r\n\r\n const inputRef = useRef(null);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const setComponentRef = (component) => {\r\n // eslint-disable-next-line no-underscore-dangle\r\n inputRef.current = component ? _.result(component._textElement, 'current', null) : null;\r\n };\r\n\r\n const debouncedUpdateItem = useMemo(() =>\r\n _.debounce(updateItem, UPDATE_ITEM_WAIT_IN_MS), [updateItem]);\r\n\r\n const onTextFieldChange = useCallback((event, textValue, populatedWithFullValue) => {\r\n // if we don't allow new lines, we translate new line chararter to single space\r\n // so we have better format when user copy paste text with new lines in the middle\r\n const newValue = allowNewLines ? textValue : textValue.replace(/(\\r\\n|\\n|\\r)+/mg, ' ');\r\n setCachedValue(newValue);\r\n setCharRemaining(charLimit - getCharCountExcludingAdCustomizers({\r\n text: newValue,\r\n adType,\r\n field: key,\r\n }));\r\n\r\n debouncedUpdateItem(newValue, key, populatedWithFullValue);\r\n }, [allowNewLines, charLimit, adType, key, debouncedUpdateItem]);\r\n\r\n const dynamicErrorMessage = useMemo(\r\n () => validateTextField(key, i18n, optional, adType)(cachedValue),\r\n [key, i18n, optional, adType, cachedValue]\r\n );\r\n\r\n useEffect(() => {\r\n if (key === 'FinalUrls' && inputRef) {\r\n inputRef.current.focus();\r\n }\r\n }, [key, cachedValue]);\r\n\r\n const onBlurCheck = useCallback(() => {\r\n if (key === 'FinalUrls' && document.activeElement === inputRef.current) {\r\n return;\r\n }\r\n onBlur();\r\n }, [key, onBlur]);\r\n\r\n const onRenderDescription = useCallback(() => (\r\n showCharRemaining ? (\r\n \r\n \r\n {showDynamicTextExtention ?\r\n
|\r\n \r\n
: null\r\n }\r\n\r\n
\r\n ) : null\r\n ), [cachedValue, charRemaining, i18n, onTextFieldChange,\r\n showCharRemaining, showDynamicTextExtention]);\r\n\r\n useAdCustomizers({\r\n ref: inputRef,\r\n updateAction: (val) => {\r\n setCachedValue(val);\r\n setCharRemaining(charLimit - getCharCountExcludingAdCustomizers({\r\n text: val,\r\n adType,\r\n field: key,\r\n }));\r\n debouncedUpdateItem(val, key);\r\n },\r\n adType,\r\n container: containerSelector,\r\n field: key,\r\n });\r\n\r\n useAdStrengthSuggestion({\r\n container: containerSelector,\r\n i18n,\r\n ref: inputRef,\r\n llmAssetsSuggestions,\r\n assets,\r\n assetType: configProps.key,\r\n updateItem: val => onTextFieldChange(null, val, true),\r\n isForVnext,\r\n index,\r\n updateSuggestionMeasurement,\r\n enableDKI,\r\n DKIThemeName,\r\n });\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nBaseTextField.propTypes = {\r\n inputClassName: PropTypes.string,\r\n\r\n configProps: PropTypes.shape({\r\n key: PropTypes.string.isRequired,\r\n }).isRequired,\r\n\r\n updateItem: PropTypes.func.isRequired,\r\n\r\n value: PropTypes.string,\r\n\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n\r\n optional: PropTypes.bool,\r\n\r\n campaignWebsite: PropTypes.string,\r\n\r\n adsFieldId: PropTypes.string,\r\n\r\n allowNewLines: PropTypes.bool,\r\n\r\n isAutoAdsEnabled: PropTypes.bool,\r\n\r\n showCharRemaining: PropTypes.bool,\r\n\r\n showErrorMessage: PropTypes.bool,\r\n\r\n errorMessage: PropTypes.string,\r\n\r\n assets: PropTypes.arrayOf(PropTypes.shape({\r\n Asset: PropTypes.shape({\r\n Text: PropTypes.string.isRequired,\r\n }).isRequired,\r\n PinnedField: PropTypes.string.isRequired,\r\n })),\r\n\r\n isForVnext: PropTypes.bool,\r\n\r\n index: PropTypes.number,\r\n\r\n updateSuggestionMeasurement: PropTypes.func,\r\n\r\n showDynamicTextExtention: PropTypes.bool,\r\n\r\n onBlur: PropTypes.func,\r\n\r\n llmAssetsSuggestions: PropTypes.shape({\r\n Suggestions: PropTypes.arrayOf(PropTypes.shape({\r\n SuggestionId: PropTypes.string,\r\n Asset: PropTypes.string,\r\n })),\r\n }),\r\n adType: PropTypes.string,\r\n containerSelector: PropTypes.string,\r\n enableDKI: PropTypes.bool,\r\n DKIThemeName: PropTypes.string,\r\n};\r\n\r\nBaseTextField.defaultProps = {\r\n inputClassName: '',\r\n value: '',\r\n optional: true,\r\n campaignWebsite: undefined,\r\n adsFieldId: undefined,\r\n allowNewLines: true,\r\n isAutoAdsEnabled: true,\r\n showCharRemaining: false,\r\n showErrorMessage: false,\r\n errorMessage: undefined,\r\n isForVnext: false,\r\n assets: [],\r\n index: -1,\r\n updateSuggestionMeasurement: _.noop,\r\n showDynamicTextExtention: false,\r\n onBlur: _.noop,\r\n llmAssetsSuggestions: {},\r\n adType: AD_TYPE_RSA,\r\n containerSelector: '.rsa-content-container',\r\n enableDKI: false,\r\n DKIThemeName: '',\r\n};\r\n","import { noop, partial, isString } from 'underscore';\r\nimport React, { useCallback, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Stack } from '@fluentui/react';\r\nimport { getDomain } from '@bingads-webui/url-util';\r\n\r\nimport { Error } from './error';\r\nimport { withError } from './with-error';\r\nimport { BaseTextField } from './base-text-field';\r\nimport { containerStyles, contentStyles } from '../styles';\r\n\r\nconst Path1Field = withError(BaseTextField, 'Path1');\r\nconst Path2Field = withError(BaseTextField, 'Path2');\r\nconst DisplayUrlField = withError(BaseTextField, 'DisplayUrl');\r\nexport function UrlPath(props) {\r\n const {\r\n config,\r\n value,\r\n url,\r\n i18n,\r\n onChange,\r\n IsVanityUrlEnabled,\r\n DisplayUrl,\r\n } = props;\r\n const [Path1, Path2] = value;\r\n\r\n const urlDomain = useMemo(() => getDomain(url), [url]);\r\n\r\n const onTextChange = useCallback((path, newValue) => {\r\n onChange(newValue, path);\r\n }, [onChange]);\r\n\r\n return (\r\n \r\n \r\n {\r\n IsVanityUrlEnabled ?\r\n :\r\n
\r\n {isString(urlDomain) && urlDomain.length > 0 ?\r\n urlDomain :\r\n 'www.example.com'\r\n }\r\n
\r\n }\r\n
/
\r\n \r\n
/
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nUrlPath.propTypes = {\r\n config: PropTypes.shape({\r\n }).isRequired,\r\n\r\n value: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n\r\n url: PropTypes.string.isRequired,\r\n\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n\r\n onChange: PropTypes.func,\r\n\r\n IsVanityUrlEnabled: PropTypes.bool,\r\n\r\n DisplayUrl: PropTypes.string,\r\n};\r\n\r\nUrlPath.defaultProps = {\r\n onChange: noop,\r\n IsVanityUrlEnabled: false,\r\n DisplayUrl: '',\r\n};\r\n","import { noop } from 'underscore';\r\nimport React, { useCallback, useMemo, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Dropdown, Stack } from '@fluentui/react';\r\nimport {\r\n getUrlPrefixAndDestination,\r\n getUpdatedFullUrlOnPrefixUpdate,\r\n getUpdatedFullUrlOnTextUpdate,\r\n} from '@bingads-webui-campaign-react/url-input-fluent';\r\n\r\nimport { BaseTextField } from './base-text-field';\r\nimport { Error } from './error';\r\nimport { withError } from './with-error';\r\nimport { contentStyles } from '../styles';\r\n\r\nconst urlPrefixOptions = [\r\n { key: 'https', text: 'https://', title: 'https://' },\r\n { key: 'http', text: 'http://', title: 'http://' },\r\n];\r\n\r\nexport function UrlInput(props) {\r\n const {\r\n config,\r\n url,\r\n i18n,\r\n onChange,\r\n onBlur,\r\n } = props;\r\n const UrlTextField = useMemo(() =>\r\n withError(BaseTextField, config.key), [config.key]);\r\n\r\n const [urlPrefix, urlWithoutPrefix] = useMemo(\r\n () => getUrlPrefixAndDestination(url),\r\n [url]\r\n );\r\n\r\n const [key, setKey] = useState(0);\r\n\r\n const onUrlPrefixChanged = useCallback(\r\n (event, newItem) =>\r\n onChange([getUpdatedFullUrlOnPrefixUpdate(urlWithoutPrefix, newItem.key)], config.key),\r\n [config.key, onChange, urlWithoutPrefix]\r\n );\r\n\r\n const onTextChange = useCallback((value) => {\r\n const newValue = getUpdatedFullUrlOnTextUpdate(urlPrefix, value);\r\n\r\n if (newValue) {\r\n if (newValue === value) { // this means value contains protocol\r\n // forceUpdate UrlTextField, need to ensure the prefix removed. https://msasg.visualstudio.com/Bing_Ads/_workitems/edit/4027143/\r\n setKey(key + 1);\r\n }\r\n onChange([getUpdatedFullUrlOnTextUpdate(urlPrefix, value)], config.key);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [config.key, onChange, urlPrefix]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nUrlInput.propTypes = {\r\n config: PropTypes.shape({\r\n className: PropTypes.string,\r\n key: PropTypes.string.isRequired,\r\n }).isRequired,\r\n\r\n url: PropTypes.string.isRequired,\r\n\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n\r\n onChange: PropTypes.func,\r\n\r\n onBlur: PropTypes.func,\r\n};\r\n\r\nUrlInput.defaultProps = {\r\n onChange: noop,\r\n onBlur: noop,\r\n};\r\n","export const defaultUrl = 'https://www.example.com';\r\nexport const urlPrefix = ['https://', 'http://'];\r\n","import { contains, isEmpty, noop } from 'underscore';\r\nimport React, { useEffect, useMemo, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useGroupsPreviewerLayout } from '@bingads-webui-campaign-react/ad-placement-factory';\r\nimport { evaluateAdCustomizers } from '@bingads-webui-campaign/ad-customizers-next';\r\nimport { withDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { getDomain } from '@bingads-webui/url-util';\r\nimport { getTitlePreview, getDescPreview } from '@bingads-webui-campaign-react/ad-common';\r\nimport { defaultUrl, urlPrefix } from './defaults';\r\nimport { getPreviewStyles } from './styles';\r\n\r\nconst adType = 'ResponsiveSearchAd';\r\n\r\nconst RSAPreviewGroupType = 'responsiveSearchAd';\r\n\r\nconst AdPlacementKeys = {\r\n TopView: 'responsive_search_desktop',\r\n SideView: 'responsive_search',\r\n MobileView: 'responsive_search_mobile',\r\n};\r\n\r\nconst previewLayoutConfig = {\r\n groupsDefinitions: [\r\n {\r\n key: 'topView',\r\n groupType: RSAPreviewGroupType,\r\n label: _TL_('Top view'),\r\n placementFilterPredicate: tmp => tmp.key === AdPlacementKeys.TopView,\r\n },\r\n {\r\n key: 'sideView',\r\n groupType: RSAPreviewGroupType,\r\n label: _TL_('Side view'),\r\n placementFilterPredicate: tmp => tmp.key === AdPlacementKeys.SideView,\r\n },\r\n {\r\n key: 'mobileView',\r\n groupType: RSAPreviewGroupType,\r\n label: _TL_('Mobile view'),\r\n placementFilterPredicate: tmp => tmp.key === AdPlacementKeys.MobileView,\r\n },\r\n ],\r\n};\r\n\r\nconst ResponsiveSearchAdPreviewUAPLUnstyled = ({\r\n data: {\r\n Headlines,\r\n Descriptions,\r\n FinalUrls,\r\n DisplayUrl,\r\n Path1,\r\n Path2,\r\n },\r\n classes,\r\n disclaimerInfo,\r\n image,\r\n permissions,\r\n}) => {\r\n const [headline, setHeadline] = useState('');\r\n const [description, setDescription] = useState('');\r\n const [urlPath1, setUrlPath1] = useState('');\r\n const [urlPath2, setUrlPath2] = useState('');\r\n\r\n const finalUrl = useMemo(() => ((isEmpty(FinalUrls) || contains(urlPrefix, FinalUrls[0])) ? defaultUrl : FinalUrls[0]), [FinalUrls]);\r\n const urlDomain = useMemo(() => getDomain(finalUrl), [finalUrl]);\r\n const displayUrl = useMemo(() => `${DisplayUrl || urlDomain}${urlPath1}${urlPath2}`, [DisplayUrl, urlDomain, urlPath1, urlPath2]);\r\n\r\n const { GroupsPreviewer } = useGroupsPreviewerLayout(previewLayoutConfig);\r\n\r\n const headerButtonProps = useMemo(() => ({\r\n onEdit: noop,\r\n onAddAspectRatio: noop,\r\n onRemoveAspectRatio: noop,\r\n }), []);\r\n\r\n useEffect(() => {\r\n evaluateAdCustomizers({\r\n adType,\r\n field: 'Headlines',\r\n text: getTitlePreview(Headlines),\r\n }).then((evaluatedText) => {\r\n setHeadline(evaluatedText);\r\n });\r\n }, [Headlines]);\r\n\r\n useEffect(() => {\r\n evaluateAdCustomizers({\r\n adType,\r\n field: 'Descriptions',\r\n text: getDescPreview(Descriptions, disclaimerInfo ? disclaimerInfo.LineText : ''),\r\n }).then((evaluatedText) => {\r\n setDescription(evaluatedText);\r\n });\r\n }, [Descriptions, disclaimerInfo]);\r\n\r\n useEffect(() => {\r\n evaluateAdCustomizers({\r\n adType,\r\n field: 'Path1',\r\n text: Path1,\r\n }).then((evaluatedText) => {\r\n setUrlPath1(evaluatedText ? `/${evaluatedText}` : '');\r\n });\r\n }, [Path1]);\r\n\r\n useEffect(() => {\r\n evaluateAdCustomizers({\r\n adType,\r\n field: 'Path2',\r\n text: Path2,\r\n }).then((evaluatedText) => {\r\n setUrlPath2(evaluatedText ? `/${evaluatedText}` : '');\r\n });\r\n }, [Path2]);\r\n\r\n const adData = useMemo(() => ({\r\n longHeadline: headline,\r\n description,\r\n url: finalUrl,\r\n displayUrl,\r\n }), [headline, description, finalUrl, displayUrl]);\r\n\r\n const decoratorsData = useMemo(() => ({\r\n disclaimer: disclaimerInfo,\r\n imageExtension: {\r\n image,\r\n enableCrop: permissions && permissions.dynamic && permissions.dynamic.RSAImageExtensionCrop,\r\n },\r\n }), [disclaimerInfo, image, permissions]);\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nResponsiveSearchAdPreviewUAPLUnstyled.propTypes = {\r\n data: PropTypes.shape({\r\n Headlines: PropTypes.arrayOf(PropTypes.string),\r\n Descriptions: PropTypes.arrayOf(PropTypes.string),\r\n FinalUrls: PropTypes.arrayOf(PropTypes.string),\r\n DisplayUrl: PropTypes.string,\r\n Path1: PropTypes.string,\r\n Path2: PropTypes.string,\r\n }),\r\n classes: PropTypes.shape({\r\n adPreviewContainer: PropTypes.string,\r\n }).isRequired,\r\n disclaimerInfo: PropTypes.shape({}) || null,\r\n image: PropTypes.shape({}) || null,\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({\r\n RSAImageExtensionCrop: PropTypes.bool,\r\n }),\r\n }),\r\n};\r\n\r\nResponsiveSearchAdPreviewUAPLUnstyled.defaultProps = {\r\n data: {},\r\n disclaimerInfo: null,\r\n image: null,\r\n permissions: {},\r\n};\r\n\r\nexport const ResponsiveSearchAdPreviewUAPL =\r\n withDefaultStyles(ResponsiveSearchAdPreviewUAPLUnstyled, getPreviewStyles);\r\n","export const getPreviewStyles = () => ({\r\n adPreviewContainer: {\r\n '& .new-preview-carousel-container-adprelib': {\r\n width: '610px',\r\n minWidth: '610px',\r\n },\r\n },\r\n});\r\n","import _ from 'underscore';\r\n\r\nexport function formatRSAObject(adItem) {\r\n let adObject = _.pick(adItem, [\r\n 'FinalUrls',\r\n 'DisplayUrl',\r\n 'MobileFinalUrls',\r\n 'Path1',\r\n 'Path2',\r\n 'TrackingUrlTemplate',\r\n 'FinalUrlSuffix',\r\n ]);\r\n\r\n adObject = _.extend(\r\n adObject,\r\n {\r\n '@odata.type': 'Model.ResponsiveSearchAd',\r\n Type: 'ResponsiveSearch',\r\n Headlines: _.map(\r\n _.filter(adItem.Headlines, h => !_.isEmpty(h.Asset.Text.trim())),\r\n h => ({\r\n Asset: {\r\n '@odata.type': '#Model.TextAsset',\r\n AssetType: 'Text',\r\n Name: null,\r\n Text: h.Asset.Text.trim(),\r\n },\r\n PinnedField: h.PinnedField,\r\n })\r\n ),\r\n Descriptions: _.map(\r\n _.filter(adItem.Descriptions, d => !_.isEmpty(d.Asset.Text.trim())),\r\n d => ({\r\n Asset: {\r\n '@odata.type': '#Model.TextAsset',\r\n AssetType: 'Text',\r\n Name: null,\r\n Text: d.Asset.Text.trim(),\r\n },\r\n PinnedField: d.PinnedField,\r\n })\r\n ),\r\n UrlCustomParameters: _.filter(adItem.UrlCustomParameters, ({ Key }) => !_.isEmpty(Key)),\r\n },\r\n adItem.Campaign ? {\r\n Campaign: { Id: adItem.Campaign.Id },\r\n } : {},\r\n adItem.AdGroup ? {\r\n AdGroup: { Id: adItem.AdGroup.Id },\r\n } : {},\r\n _.first(adItem.MobileFinalUrls) === 'https://' || _.first(adItem.MobileFinalUrls) === 'http://' ? {\r\n MobileFinalUrls: [],\r\n } : {}\r\n );\r\n\r\n return adObject;\r\n}\r\n\r\nfunction formatAssetRankingTexts(assetValues) {\r\n const textArr = _.map(assetValues, item => item && item.Asset && item.Asset.Text);\r\n\r\n return _.uniq(_.compact(textArr));\r\n}\r\n\r\nexport function formatRankingTexts(assets) {\r\n return _.mapObject(\r\n assets,\r\n assetValues => formatAssetRankingTexts(assetValues)\r\n );\r\n}\r\n\r\nexport function computeRankingTextsUpdates(currentAssets, prevAssetsRankingTexts) {\r\n const rankingTexts = formatRankingTexts(currentAssets);\r\n\r\n return {\r\n needUpdate: !_.isEqual(rankingTexts, prevAssetsRankingTexts),\r\n value: rankingTexts,\r\n };\r\n}\r\n","import { find, noop } from 'underscore';\r\nimport React, { useCallback, useMemo } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { CommandButton, registerIcons } from '@fluentui/react';\r\nimport pinIcon from '../media/pin.svg';\r\n\r\nregisterIcons({\r\n icons: {\r\n 'pin-icon': (\"chatgpt-logo\"),\r\n },\r\n});\r\nexport function PinButton(props) {\r\n const {\r\n getPinItems,\r\n pinnedPosition,\r\n styles,\r\n onChange,\r\n className,\r\n i18n,\r\n } = props;\r\n const pinItems = getPinItems(i18n);\r\n const selectedText = useMemo(() => {\r\n const item = find(pinItems, c => c.key === pinnedPosition);\r\n return item.value;\r\n }, [pinItems, pinnedPosition]);\r\n\r\n const onMenuItemClick = useCallback((event, item) => {\r\n onChange(item.key);\r\n }, [onChange]);\r\n const onMenuClick = useCallback(() => {\r\n const pickerContainer = document.querySelector('.ad-strength-suggestion-container');\r\n if (pickerContainer) {\r\n ReactDOM.unmountComponentAtNode(pickerContainer);\r\n }\r\n }, []);\r\n return (\r\n \r\n );\r\n}\r\n\r\nPinButton.propTypes = {\r\n getPinItems: PropTypes.func.isRequired,\r\n\r\n styles: PropTypes.shape({}),\r\n\r\n pinnedPosition: PropTypes.string,\r\n\r\n onChange: PropTypes.func,\r\n\r\n className: PropTypes.string.isRequired,\r\n\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n};\r\n\r\nPinButton.defaultProps = {\r\n pinnedPosition: 'None',\r\n onChange: noop,\r\n styles: {},\r\n};\r\n","// TextAssets is styled separately so that it can be exported as a shared component.\r\nexport const textAssetsStyles = {\r\n deleteButton: {\r\n root: {\r\n height: 32,\r\n '& .ms-Button-label': {\r\n display: 'none',\r\n },\r\n },\r\n },\r\n newPositionDeleteButton: {\r\n root: {\r\n padding: 0,\r\n marginLeft: '5px !important',\r\n marginRight: '5px !important',\r\n height: 32,\r\n '& .ms-Button-label': {\r\n display: 'none',\r\n },\r\n '& img': {\r\n position: 'static !important',\r\n },\r\n },\r\n },\r\n newDeleteButton: {\r\n root: {\r\n marginLeft: '10px !important',\r\n marginRight: '5px !important',\r\n height: 32,\r\n '& .ms-Button-label': {\r\n display: 'none',\r\n },\r\n },\r\n },\r\n newPositionPinButton: {\r\n root: {\r\n height: 32,\r\n selectors: {\r\n '& .ms-Button-menuIcon': {\r\n display: 'none',\r\n },\r\n '& img': {\r\n position: 'static !important',\r\n },\r\n '& i': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n },\r\n },\r\n },\r\n newPinButton: {\r\n root: {\r\n height: 32,\r\n selectors: {\r\n '& .ms-Button-menuIcon': {\r\n display: 'none',\r\n },\r\n '& i': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n },\r\n },\r\n },\r\n pinButton: {\r\n root: {\r\n height: 32,\r\n selectors: {\r\n '& .ms-Button-menuIcon': {\r\n display: 'none',\r\n },\r\n },\r\n },\r\n },\r\n\r\n textAssetsStackToken: {\r\n childrenGap: 16,\r\n },\r\n};\r\n","import _ from 'underscore';\r\nimport React, { useCallback, useEffect, useState, useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {\r\n ActionButton,\r\n Stack,\r\n CommandButton,\r\n registerIcons\r\n} from '@fluentui/react';\r\nimport classNames from 'classnames';\r\nimport { CopilotTextAssetRecommendation } from '@bingads-webui/inline-copilot';\r\nimport { getCharCountExcludingAdCustomizers } from '@bingads-webui-campaign/ad-customizers-next';\r\nimport { useEventLog, EMPTY_ASSET_HINTS, NO_FINAL_URL_HINT } from '@bingads-webui-campaign-react/copilot-common';\r\nimport { RecommendationContext } from '@bingads-webui-campaign/responsive-search-ad-recommendation';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { BaseTextField } from './base-text-field';\r\nimport { Error } from './error';\r\nimport { withError } from './with-error';\r\nimport { PinButton } from './pin-button';\r\nimport { textAssetsStyles } from './text-assets-styles';\r\nimport deleteIcon from '../media/delete.svg';\r\n\r\nconst TextAssetFields = {\r\n Headline: _.map(_.range(15), i => withError(BaseTextField, `Headline${i}`)),\r\n Description: _.map(_.range(4), i => withError(BaseTextField, `Description${i}`)),\r\n};\r\n\r\nregisterIcons({\r\n icons: {\r\n 'delete-icon': (\"chatgpt-logo\"),\r\n },\r\n});\r\n\r\nconst recommendationAssetTypeMap = {\r\n Headlines: 'headline',\r\n Descriptions: 'description',\r\n};\r\n\r\nconst recommendationAssetTypePluralMap = {\r\n Headlines: 'headlines',\r\n Descriptions: 'descriptions',\r\n};\r\n\r\nconst getStyles = () => ({\r\n copilotButton: {\r\n marginLeft: '8px',\r\n '& .text-asset-copilot > button': {\r\n height: '32px',\r\n },\r\n },\r\n});\r\n\r\nexport function TextAssets(props) {\r\n const {\r\n config,\r\n assets,\r\n i18n,\r\n onChange,\r\n onBlur,\r\n isForVnext,\r\n updateSuggestionMeasurement,\r\n showDynamicTextExtention,\r\n llmAssetsSuggestions,\r\n showDeleteButton,\r\n showCopilotButton,\r\n finalUrlWithoutPrefix,\r\n existingAssets,\r\n onSuggestionsRendered,\r\n isNewTextAssetsButtonStyle,\r\n permissions,\r\n } = props;\r\n\r\n const {\r\n copilotButtonLabel,\r\n defaultSize,\r\n deleteButtonLabel,\r\n getPinItems,\r\n inputLabel,\r\n itemProperty,\r\n maxSize,\r\n property,\r\n enableDKI,\r\n DKIThemeName,\r\n } = config;\r\n\r\n const [recommendationContext] = useContext(RecommendationContext);\r\n const { postAssetEventLog = _.noop, themes, copilotTracking } = recommendationContext;\r\n const {\r\n logTextAssetMenuOpen,\r\n logTextAssetDialogOpen,\r\n logRefineTextAsset,\r\n logTextAssetApplied,\r\n logRemoveSingleAsset,\r\n logEditSingleAsset,\r\n } = useEventLog(postAssetEventLog);\r\n\r\n const [cachedAssets, setCachedAssets] = useState(assets);\r\n const classes = useDefaultStyles(getStyles);\r\n\r\n useEffect(() => setCachedAssets(assets), [assets]);\r\n\r\n useEffect(() => {\r\n if (_.size(cachedAssets) > maxSize) {\r\n setCachedAssets(cachedAssets.slice(0, maxSize));\r\n } else if (_.size(cachedAssets) < defaultSize) {\r\n const filledAssets = [...cachedAssets];\r\n for (let i = 0; i < defaultSize - _.size(cachedAssets); i += 1) {\r\n filledAssets.push({\r\n Asset: {\r\n '@odata.type': '#Model.TextAsset',\r\n AssetType: 'Text',\r\n Name: null,\r\n Text: '',\r\n },\r\n PinnedField: 'None',\r\n });\r\n }\r\n setCachedAssets(filledAssets);\r\n }\r\n }, [cachedAssets, maxSize, defaultSize]);\r\n\r\n const onAddAsset = useCallback(() => {\r\n if (cachedAssets.length < maxSize) {\r\n const newAssets = [\r\n ...cachedAssets,\r\n {\r\n Asset: {\r\n '@odata.type': '#Model.TextAsset',\r\n AssetType: 'Text',\r\n Name: null,\r\n Text: '',\r\n },\r\n PinnedField: 'None',\r\n },\r\n ];\r\n setCachedAssets(newAssets);\r\n onChange(newAssets, property);\r\n }\r\n }, [cachedAssets, maxSize, onChange, property]);\r\n\r\n const onTextChange = useCallback((index, value, key, populatedWithFullValue) => {\r\n const newAssets = [...cachedAssets];\r\n const deletedAsset = newAssets[index].Asset.Text;\r\n const pluralAssetType = recommendationAssetTypePluralMap[property];\r\n\r\n newAssets[index].Asset.Text = value;\r\n setCachedAssets(newAssets);\r\n onChange(newAssets, `${itemProperty}${index}`);\r\n\r\n if (copilotTracking.isInRemainingInitialSuggestions(itemProperty, deletedAsset)) {\r\n copilotTracking.removeInitialSuggestion(itemProperty, deletedAsset);\r\n\r\n const recommendationId = _.chain(themes)\r\n .map(theme => _.chain(theme)\r\n .get(pluralAssetType, [])\r\n .find(asset => asset.Text === deletedAsset)\r\n .get('RecommendationId')\r\n .value())\r\n .compact()\r\n .first()\r\n .value();\r\n\r\n if (recommendationId) {\r\n logEditSingleAsset(itemProperty, recommendationId);\r\n }\r\n }\r\n\r\n // populating suggestion will not trigger onBlur, so needs to handle specially.\r\n if (populatedWithFullValue) {\r\n onBlur(newAssets, `${itemProperty}${index}`);\r\n }\r\n }, [cachedAssets, property, onChange, itemProperty, copilotTracking, themes, logEditSingleAsset, onBlur]);\r\n\r\n const onTextBlur = useCallback((index) => {\r\n onBlur(cachedAssets, `${itemProperty}${index}`);\r\n }, [cachedAssets, itemProperty, onBlur]);\r\n\r\n const onPinChange = useCallback((index, value) => {\r\n const newAssets = [...cachedAssets];\r\n newAssets[index].PinnedField = value;\r\n setCachedAssets(newAssets);\r\n onChange(newAssets, property);\r\n }, [cachedAssets, onChange, property]);\r\n\r\n const onDeleteAsset = useCallback((index) => {\r\n const newAssets = [...cachedAssets];\r\n const deletedAsset = newAssets[index].Asset.Text;\r\n const pluralAssetType = recommendationAssetTypePluralMap[property];\r\n\r\n if (cachedAssets.length > defaultSize) {\r\n newAssets.splice(index, 1);\r\n } else {\r\n for (let i = index; i < newAssets.length - 1; i += 1) {\r\n newAssets[i].Asset.Text = newAssets[i + 1].Asset.Text;\r\n }\r\n newAssets[newAssets.length - 1].Asset.Text = '';\r\n }\r\n setCachedAssets(newAssets);\r\n onChange(newAssets, property);\r\n\r\n if (!copilotTracking.isInRemainingInitialSuggestions(itemProperty, deletedAsset)) { return; }\r\n copilotTracking.removeInitialSuggestion(itemProperty, deletedAsset);\r\n\r\n const recommendationId = _.chain(themes)\r\n .map(theme => _.chain(theme)\r\n .get(pluralAssetType, [])\r\n .find(asset => asset.Text === deletedAsset)\r\n .get('RecommendationId')\r\n .value())\r\n .compact()\r\n .first()\r\n .value();\r\n\r\n if (recommendationId) {\r\n logRemoveSingleAsset(itemProperty, recommendationId);\r\n }\r\n }, [cachedAssets, property, defaultSize, onChange, themes, logRemoveSingleAsset, itemProperty, copilotTracking]);\r\n\r\n const isPinningEnabled = !_.isUndefined(getPinItems);\r\n\r\n const assetType = recommendationAssetTypeMap[property];\r\n const calculateDisableReason = (text) => {\r\n if (_.isEmpty(text.trim())) {\r\n return i18n.getString(EMPTY_ASSET_HINTS[assetType]);\r\n }\r\n if (!finalUrlWithoutPrefix) {\r\n return i18n.getString(NO_FINAL_URL_HINT);\r\n }\r\n if (getCharCountExcludingAdCustomizers({\r\n text,\r\n adType: 'ResponsiveSearchAd',\r\n field: property,\r\n }) !== text.length) {\r\n return i18n.getString(_TL_('Microsoft Advertising can\\'t use dynamic texts for generating asset recommendations. Please enter static text and try again.'));\r\n }\r\n return null;\r\n };\r\n\r\n return (\r\n \r\n {_.map(cachedAssets, (asset, index) => {\r\n const TextAsset = TextAssetFields[itemProperty][index];\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {showCopilotButton && (\r\n
\r\n {\r\n const text = _.get(newAsset, ['value', 0, 'text']);\r\n logTextAssetApplied(assetType, operationName);\r\n onTextChange(index, text, property);\r\n }}\r\n onSuggestionsRendered={onSuggestionsRendered}\r\n />\r\n
\r\n )}\r\n {showDeleteButton && (\r\n onDeleteAsset(index)}\r\n ariaLabel={i18n.getString(deleteButtonLabel, { index: index + 1 })}\r\n />\r\n )}\r\n\r\n {isPinningEnabled && (\r\n \r\n )}\r\n
\r\n
\r\n );\r\n })}\r\n\r\n \r\n\r\n = maxSize}\r\n onClick={onAddAsset}\r\n >\r\n {i18n.getString(config.addLabel)}\r\n \r\n \r\n );\r\n}\r\n\r\nTextAssets.propTypes = {\r\n config: PropTypes.shape({\r\n addLabel: PropTypes.string.isRequired,\r\n className: PropTypes.string,\r\n copilotButtonLabel: PropTypes.string.isRequired,\r\n defaultSize: PropTypes.number.isRequired,\r\n deleteButtonLabel: PropTypes.string.isRequired,\r\n getPinItems: PropTypes.func,\r\n inputLabel: PropTypes.string,\r\n itemClassName: PropTypes.string,\r\n itemProperty: PropTypes.string,\r\n maxSize: PropTypes.number.isRequired,\r\n property: PropTypes.string,\r\n enableDKI: PropTypes.bool,\r\n DKIThemeName: PropTypes.string,\r\n }).isRequired,\r\n\r\n assets: PropTypes.arrayOf(PropTypes.shape({\r\n Asset: PropTypes.shape({\r\n Text: PropTypes.string.isRequired,\r\n }).isRequired,\r\n PinnedField: PropTypes.string.isRequired,\r\n })),\r\n\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n\r\n onChange: PropTypes.func,\r\n onBlur: PropTypes.func,\r\n\r\n isForVnext: PropTypes.bool.isRequired,\r\n\r\n updateSuggestionMeasurement: PropTypes.func.isRequired,\r\n\r\n showDynamicTextExtention: PropTypes.bool.isRequired,\r\n\r\n llmAssetsSuggestions: PropTypes.shape({\r\n Suggestions: PropTypes.arrayOf(PropTypes.shape({\r\n SuggestionId: PropTypes.string,\r\n Asset: PropTypes.string,\r\n })),\r\n }),\r\n showDeleteButton: PropTypes.bool,\r\n finalUrlWithoutPrefix: PropTypes.string,\r\n showCopilotButton: PropTypes.bool,\r\n existingAssets: PropTypes.shape({}),\r\n onSuggestionsRendered: PropTypes.func,\r\n isNewTextAssetsButtonStyle: PropTypes.bool,\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({\r\n CopilotDKIRecommendation: PropTypes.bool,\r\n }),\r\n }),\r\n};\r\n\r\nTextAssets.defaultProps = {\r\n assets: [],\r\n onChange: _.noop,\r\n onBlur: _.noop,\r\n llmAssetsSuggestions: {},\r\n showDeleteButton: false,\r\n finalUrlWithoutPrefix: '',\r\n showCopilotButton: false,\r\n existingAssets: {},\r\n onSuggestionsRendered: _.noop,\r\n isNewTextAssetsButtonStyle: false,\r\n permissions: {},\r\n};\r\n","import React from 'react';\r\nimport _ from 'underscore';\r\nimport PropTypes from 'prop-types';\r\n\r\nexport const Disclaimer = (props) => {\r\n const { disclaimerInfo, i18n, permissions } = props;\r\n const showAdvancedInformation = permissions && permissions.dynamic && permissions.dynamic.SearchCampaignCreationRevamp;\r\n\r\n if (!_.isEmpty(disclaimerInfo)) {\r\n if (disclaimerInfo.DisclaimerLayout === 'Popup') {\r\n return (\r\n

\r\n {showAdvancedInformation ?\r\n i18n.getString(_TL_('Campaign level disclaimer: {{name}}'), { name: disclaimerInfo.Name }) :\r\n i18n.getString(_TL_('Campaign level disclaimer'))}\r\n

\r\n );\r\n }\r\n if (disclaimerInfo.DisclaimerLayout === 'AdditionalLine') {\r\n return (\r\n

\r\n {showAdvancedInformation ?\r\n i18n.getString(_TL_('Campaign level disclaimer: {{name}}\\n(Note: Additional line layout disclaimers will not have description 2.)'), { name: disclaimerInfo.Name }) :\r\n i18n.getString(_TL_('Campaign level disclaimer (Note: Additional line layout disclaimers will not have description 2.)'))}\r\n

\r\n );\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nDisclaimer.propTypes = {\r\n disclaimerInfo: PropTypes.shape({\r\n DisclaimerLayout: PropTypes.string,\r\n Name: PropTypes.string,\r\n }),\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({\r\n SearchCampaignCreationRevamp: PropTypes.bool,\r\n }),\r\n }),\r\n};\r\n\r\nDisclaimer.defaultProps = {\r\n disclaimerInfo: null,\r\n permissions: {\r\n dynamic: {\r\n SearchCampaignCreationRevamp: false,\r\n },\r\n },\r\n};\r\n","import { adsFields } from './validators';\r\n\r\nexport const headlinesConfig = {\r\n property: 'Headlines',\r\n itemProperty: 'Headline',\r\n className: 'rsa-field-headlines',\r\n itemClassName: 'rsa-field-headline',\r\n minSize: 3,\r\n maxSize: 15,\r\n defaultSize: 5,\r\n addLabel: _TL_('Add headline'),\r\n inputLabel: _TL_('Headline {{index}}'),\r\n copilotButtonLabel: _TL_('Get recommendations for headline {{index}}'),\r\n deleteButtonLabel: _TL_('Delete headline {{index}}'),\r\n getPinItems: i18n => [\r\n {\r\n key: 'None',\r\n text: i18n.getString(_TL_('Show this headline in any unpinned position')),\r\n value: i18n.getString(_TL_('Pin')),\r\n },\r\n {\r\n key: 'Headline1',\r\n text: i18n.getString(_TL_('Show this headline only in position 1')),\r\n value: i18n.getString(_TL_('1')),\r\n },\r\n {\r\n key: 'Headline2',\r\n text: i18n.getString(_TL_('Show this headline only in position 2')),\r\n value: i18n.getString(_TL_('2')),\r\n },\r\n {\r\n key: 'Headline3',\r\n text: i18n.getString(_TL_('Show this headline only in position 3')),\r\n value: i18n.getString(_TL_('3')),\r\n },\r\n ],\r\n errorMap: {\r\n lessThanRequired: _TL_('Please add at least three headlines, excluding headlines containing countdowns or location insertions.'),\r\n duplicate: _TL_('Remove duplicate headline.'),\r\n lessPosition: _TL_('You do not have enough headlines. Add at least 3 headlines or pin headlines to each position.'),\r\n },\r\n enableDKI: true,\r\n DKIThemeName: _TL_('Headline with dynamic keyword'),\r\n};\r\n\r\nexport const descriptionsConfig = {\r\n property: 'Descriptions',\r\n itemProperty: 'Description',\r\n className: 'rsa-field-descriptions',\r\n itemClassName: 'rsa-field-description',\r\n minSize: 2,\r\n maxSize: 4,\r\n defaultSize: 2,\r\n addLabel: _TL_('Add description'),\r\n inputLabel: _TL_('Description {{index}}'),\r\n copilotButtonLabel: _TL_('Get recommendations for description {{index}}'),\r\n deleteButtonLabel: _TL_('Delete description {{index}}'),\r\n getPinItems: i18n => [\r\n {\r\n key: 'None',\r\n text: i18n.getString(_TL_('Show this description in any unpinned position')),\r\n value: i18n.getString(_TL_('Pin')),\r\n },\r\n {\r\n key: 'Description1',\r\n text: i18n.getString(_TL_('Show this description only in position 1')),\r\n value: i18n.getString(_TL_('1')),\r\n },\r\n {\r\n key: 'Description2',\r\n text: i18n.getString(_TL_('Show this description only in position 2')),\r\n value: i18n.getString(_TL_('2')),\r\n },\r\n ],\r\n errorMap: {\r\n lessThanRequired: _TL_('Please add at least two descriptions, excluding descriptions containing countdowns or location insertions.'),\r\n duplicate: _TL_('Remove duplicate description.'),\r\n lessPosition: _TL_('You do not have enough descriptions. Add at least 2 descriptions or pin descriptions to each position.'),\r\n },\r\n};\r\n\r\nexport const adFieldsConfig = {\r\n Headlines: {\r\n key: adsFields.HEADLINES,\r\n className: 'rsa-field-headline',\r\n assetsConfig: headlinesConfig,\r\n },\r\n Descriptions: {\r\n key: adsFields.DESCRIPTIONS,\r\n className: 'rsa-field-description',\r\n assetsConfig: descriptionsConfig,\r\n },\r\n DestinationUrl: {\r\n key: adsFields.DESTINATION_URL,\r\n className: 'rsa-field-final-url',\r\n inputClassName: 'no-inline-error',\r\n ariaLabel: _TL_('Final URL'),\r\n dropdownLabel: _TL_('Final URL options'),\r\n optional: false,\r\n },\r\n DisplayUrl: {\r\n key: adsFields.DISPLAY_URL,\r\n className: 'rsa-field-display-url',\r\n inputClassName: 'no-inline-error',\r\n ariaLabel: _TL_('Display URL'),\r\n optional: false,\r\n },\r\n Path1: {\r\n key: adsFields.PATH1,\r\n className: 'rsa-field-path1',\r\n inputClassName: 'no-inline-error',\r\n ariaLabel: _TL_('Path 1'),\r\n },\r\n Path2: {\r\n key: adsFields.PATH2,\r\n className: 'rsa-field-path2',\r\n inputClassName: 'no-inline-error',\r\n ariaLabel: _TL_('Path 2'),\r\n },\r\n MobileUrl: {\r\n key: adsFields.MOBILE_URL,\r\n className: 'rsa-field-mobile-url',\r\n inputClassName: 'no-inline-error',\r\n ariaLabel: _TL_('Mobile URL'),\r\n dropdownLabel: _TL_('Mobile URL options'),\r\n optional: true,\r\n },\r\n TrackingUrlTemplate: {\r\n key: adsFields.TRACKING_URL_TEMPLATE,\r\n className: 'rsa-field-url-tracking-template',\r\n inputClassName: 'no-inline-error',\r\n ariaLabel: _TL_('Tracking template'),\r\n optional: true,\r\n },\r\n FinalUrlSuffix: {\r\n key: adsFields.FINAL_URL_SUFFIX,\r\n className: 'rsa-field-final-url-suffix',\r\n inputClassName: 'no-inline-error',\r\n ariaLabel: _TL_('Final URL suffix'),\r\n optional: true,\r\n },\r\n UrlCustomParameters: {\r\n key: adsFields.URL_CUSTOM_PARAMETERS,\r\n className: 'rsa-field-url-custom-parameters',\r\n inputClassName: 'no-inline-error',\r\n optional: true,\r\n },\r\n};\r\n","import React, { useCallback, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { CopilotRecommendationBanner, CopilotThemesRecommendationDialog } from '@bingads-webui/inline-copilot';\r\n\r\nexport function ResponsiveSearchAdCopilotBannerWithDialog(props) {\r\n const {\r\n eventLog,\r\n isCopilotEnabled,\r\n onApply,\r\n onDialogFetchAssetsSucceeded,\r\n onFetch,\r\n onFetchFailed,\r\n onFetchSucceeded,\r\n onReset,\r\n } = props;\r\n\r\n const {\r\n logBannerRefresh,\r\n logBannerRefreshCompleted,\r\n logFetch,\r\n logFetchSucceeded,\r\n } = eventLog;\r\n\r\n const [showCopilotDialog, setShowCopilotDialog] = useState(false);\r\n\r\n const handleCopilotDialogClose = useCallback(() => {\r\n setShowCopilotDialog(false);\r\n }, []);\r\n\r\n const handleRefresh = useCallback(() => {\r\n setShowCopilotDialog(true);\r\n logBannerRefresh();\r\n }, [logBannerRefresh]);\r\n\r\n const handleFetchThemesSucceeded = useCallback((url, themesList) => {\r\n logFetchSucceeded(url, themesList);\r\n }, [logFetchSucceeded]);\r\n\r\n const handleApply = useCallback((selectedThemes, selectedThemesAndAssets) => {\r\n onApply(selectedThemes, selectedThemesAndAssets);\r\n handleCopilotDialogClose();\r\n }, [handleCopilotDialogClose, onApply]);\r\n\r\n if (!isCopilotEnabled) {\r\n // copilot is not enabled, do not display the banner or fetch any recommendations\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {showCopilotDialog && (\r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nResponsiveSearchAdCopilotBannerWithDialog.propTypes = {\r\n eventLog: PropTypes.shape({\r\n logBannerRefresh: PropTypes.func,\r\n logBannerRefreshCompleted: PropTypes.func,\r\n logFetch: PropTypes.func,\r\n logFetchSucceeded: PropTypes.func,\r\n }).isRequired,\r\n isCopilotEnabled: PropTypes.bool,\r\n onApply: PropTypes.func.isRequired,\r\n onDialogFetchAssetsSucceeded: PropTypes.func.isRequired,\r\n onFetch: PropTypes.func.isRequired,\r\n onFetchFailed: PropTypes.func.isRequired,\r\n onFetchSucceeded: PropTypes.func.isRequired,\r\n onReset: PropTypes.func.isRequired,\r\n};\r\n\r\nResponsiveSearchAdCopilotBannerWithDialog.defaultProps = {\r\n isCopilotEnabled: false,\r\n};\r\n","import _ from 'underscore';\r\nimport React, { useCallback, useEffect, useState, useContext, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {\r\n DefaultButton,\r\n Label,\r\n PrimaryButton,\r\n Stack,\r\n getId,\r\n} from '@fluentui/react';\r\nimport { FluentProvider, makeStyles, webLightTheme } from '@fluentui/react-components';\r\nimport { HelpPopupInline } from '@bingads-webui-react/help-popup';\r\nimport {\r\n AssetEventFeature,\r\n AssetPropertyName,\r\n getCopilotRecommendationIdsFromThemes,\r\n getFormattedThemeForApplying,\r\n getUniqueAssetsFromThemes,\r\n useCopilotRecommendationSurvey,\r\n useAssetLibraryEventHandler,\r\n getFormattedImage,\r\n logCopilotRecommendations,\r\n} from '@bingads-webui-campaign-react/copilot-common';\r\nimport { ResponsiveSearchAdPreviewUAPL } from '@bingads-webui-campaign-react/responsive-search-ad-preview-uapl';\r\nimport { ResponsiveSearchAdStrength } from '@bingads-webui-campaign-react/responsive-search-ad-suggestion';\r\nimport {\r\n UrlOptionsParameters,\r\n validateTrackingUrlTemplate,\r\n validateFinalUrlSuffix,\r\n validateUrlCustomParameters,\r\n} from '@bingads-webui-campaign-react/url-options';\r\nimport { PermissionsContext } from '@bingads-webui-react/hoc-with-permissions';\r\nimport { initializeAdCustomizer } from '@bingads-webui-campaign/ad-customizers-next';\r\nimport { HeadlineAssetCollection, DescriptionAssetCollection, useCopilotRecommendations, RecommendationContext, withRecommendationContext, formatToLLMSuggestion, MAX_INLINE_RECOMMENDATIONS_PER_PAGE } from '@bingads-webui-campaign/responsive-search-ad-recommendation';\r\nimport { InstrumentationContext } from '@bingads-webui-react/hoc-with-instrumentation';\r\nimport {\r\n getUrlPrefixAndDestination,\r\n getUpdatedFullUrlOnPrefixUpdate,\r\n getUpdatedFullUrlOnTextUpdate,\r\n validateAdUrl\r\n} from '@bingads-webui-campaign-react/url-input-fluent';\r\nimport { Collapse, TextTitle } from '@bingads-webui-campaign/wizard-jumbo-card';\r\nimport { setClarityTag } from '@bingads-webui-universal/clarity';\r\nimport { CopilotRepositoryProvider, withBannerService } from '@bingads-webui/inline-copilot';\r\nimport { withActivityContext } from '@bingads-webui-react/hoc-with-signal';\r\n\r\nimport {\r\n adsFields,\r\n adsFieldAlias,\r\n adsFieldLengthLimitMap,\r\n validateTextFieldValue,\r\n validateTextAssets,\r\n validatePath,\r\n AD_TYPE_RSA,\r\n} from './validators';\r\nimport { containerStyles, contentStyles, stickyAdPreviewStyles } from './styles';\r\nimport { ErrorContext } from './controls/error';\r\nimport { UrlInput } from './controls/url-input';\r\nimport { UrlPath } from './controls/url-path';\r\nimport { formatRankingTexts, computeRankingTextsUpdates } from './utils/format';\r\nimport { TextAssets } from './controls/text-assets';\r\nimport { Disclaimer } from './controls/disclaimer';\r\nimport { adFieldsConfig, headlinesConfig, descriptionsConfig } from './config';\r\nimport { useCopilotForResponsiveSearchAd } from './use-copilot-for-responsive-search-ad';\r\nimport { ResponsiveSearchAdCopilotBannerWithDialog } from './responsive-search-ad-copilot-banner-with-dialog';\r\nimport UrlIcon from './media/url.svg';\r\nimport TextIcon from './media/text.svg';\r\nimport ImageIcon from './media/image.svg';\r\nimport DisclaimerIcon from './media/disclaimer.svg';\r\n\r\n// keep the order to ensure the focus order when errors are present\r\nconst adsFieldsToValidate = [\r\n adsFields.DESTINATION_URL,\r\n adsFields.MOBILE_URL,\r\n adsFields.PATH1,\r\n adsFields.PATH2,\r\n adsFields.HEADLINES,\r\n adsFields.DESCRIPTIONS,\r\n adsFields.TRACKING_URL_TEMPLATE,\r\n adsFields.FINAL_URL_SUFFIX,\r\n adsFields.URL_CUSTOM_PARAMETERS,\r\n];\r\n\r\nconst optionalFields = [\r\n adsFields.HEADLINES,\r\n adsFields.DESCRIPTIONS,\r\n adsFields.PATH1,\r\n adsFields.PATH2,\r\n adsFields.MOBILE_URL,\r\n adsFields.TRACKING_URL_TEMPLATE,\r\n adsFields.FINAL_URL_SUFFIX,\r\n adsFields.URL_CUSTOM_PARAMETERS,\r\n];\r\n\r\nconst requiredCompoundFields = [\r\n adsFields.HEADLINES,\r\n adsFields.DESCRIPTIONS,\r\n];\r\n\r\nconst textAssets = [\r\n adsFields.HEADLINES,\r\n adsFields.DESCRIPTIONS,\r\n];\r\n\r\nconst isSingleFieldOptional = field => _.contains(optionalFields, field);\r\nconst isCompoundFieldRequired = field => _.contains(requiredCompoundFields, field);\r\n\r\nconst isFieldEmpty = (field, fieldValue) => {\r\n switch (field) {\r\n case adsFields.HEADLINES:\r\n case adsFields.DESCRIPTIONS:\r\n return _.every(fieldValue, value => _.isEmpty(_.property(['Asset', 'Text'])(value)));\r\n default:\r\n break;\r\n }\r\n return _.isEmpty(fieldValue);\r\n};\r\n\r\nconst fieldMappings = {};\r\n_.each(_.range(15), (i) => { fieldMappings[`Headline${i}`] = 'Headlines'; });\r\n_.each(_.range(4), (i) => { fieldMappings[`Description${i}`] = 'Descriptions'; });\r\n\r\nconst fieldDependencies = {\r\n ...fieldMappings,\r\n [adsFields.PATH1]: adsFields.PATH2,\r\n [adsFields.PATH2]: adsFields.PATH1,\r\n};\r\n\r\nconst validators = {\r\n [adsFields.PATH1]: validatePath,\r\n [adsFields.PATH2]: validatePath,\r\n [adsFields.TRACKING_URL_TEMPLATE]: validateTrackingUrlTemplate,\r\n [adsFields.FINAL_URL_SUFFIX]: validateFinalUrlSuffix,\r\n [adsFields.URL_CUSTOM_PARAMETERS]: validateUrlCustomParameters,\r\n};\r\n\r\nconst useStyles = makeStyles({\r\n theme: {\r\n backgroundColor: 'transparent',\r\n },\r\n});\r\n\r\nexport function ResponsiveSearchAdEditorBase(props) {\r\n const {\r\n item,\r\n errors,\r\n i18n,\r\n onSave,\r\n onCancel,\r\n onChanged,\r\n onFetchAdStrengthV2,\r\n onFetchDisclaimerInfo,\r\n showActionBar,\r\n showInitialErrors,\r\n timeZone,\r\n AdPreviewComponent,\r\n permissions,\r\n token,\r\n triggerTestUurl,\r\n showUurlTestTool,\r\n showFinalUrlSuffix,\r\n showAdCustomizers,\r\n showDynamicTextExtention,\r\n isForVnext,\r\n updateSuggestionMeasurement,\r\n edmCampaign,\r\n jsDataCampaign,\r\n renderImageExtension,\r\n injectSetPreviewImage,\r\n perfMarker,\r\n serverContext,\r\n scope,\r\n editMode,\r\n saveLogAppliedSuggestionsFunc,\r\n saveAssetLibraryEventHandler,\r\n isSaving,\r\n isCanceling,\r\n onFirstErrorHandler,\r\n isNewTextAssetsButtonStyle,\r\n activityLogger,\r\n } = props;\r\n const instrumentation = useContext(InstrumentationContext);\r\n\r\n const styles = useStyles();\r\n\r\n initializeAdCustomizer({\r\n deps: {\r\n i18n,\r\n permissions,\r\n instrumentation,\r\n timeZone,\r\n showAdCustomizers,\r\n edmCampaign,\r\n jsDataCampaign,\r\n scope,\r\n },\r\n adType: AD_TYPE_RSA,\r\n });\r\n\r\n if (permissions.IsVanityUrlEnabled && !_.contains(adsFieldsToValidate, adsFields.DISPLAY_URL)) {\r\n adsFieldsToValidate.push(adsFields.DISPLAY_URL);\r\n }\r\n const [cachedAd, setCachedAd] = useState(item);\r\n const [cachedValuesForImageSuggestions, setCachedValuesForImageSuggestions] = useState(() =>\r\n formatRankingTexts({\r\n Headlines: item.data.Headlines,\r\n Descriptions: item.data.Descriptions,\r\n }));\r\n\r\n const {\r\n data,\r\n errors: clientErrors,\r\n } = cachedAd;\r\n\r\n const {\r\n Headlines,\r\n Descriptions,\r\n Path1,\r\n Path2,\r\n FinalUrls,\r\n DisplayUrl,\r\n MobileFinalUrls,\r\n TrackingUrlTemplate,\r\n FinalUrlSuffix,\r\n UrlCustomParameters,\r\n Id,\r\n } = data;\r\n\r\n const [formErrors, setFormErrors] = useState(clientErrors);\r\n const errorContextValue = useMemo(() => ({ errors: formErrors, onFirstErrorHandler }), [formErrors, onFirstErrorHandler]);\r\n const hasErrorInUrl = useMemo(() => _.some(formErrors, ({\r\n Property,\r\n }) => Property === adFieldsConfig.DestinationUrl.key), [formErrors]);\r\n\r\n const finalUrl = useMemo(() => _.first(FinalUrls) || '', [FinalUrls]);\r\n const [finalUrlPrefix, finalUrlWithoutPrefix] = useMemo(() => getUrlPrefixAndDestination(finalUrl), [finalUrl]);\r\n\r\n const finalUrlForRecommendation = _.isEmpty(finalUrlWithoutPrefix) || hasErrorInUrl ? '' : finalUrl;\r\n\r\n const urlField = getId(adsFields.DESTINATION_URL);\r\n const mobileUrlField = getId(adsFields.MOBILE_URL);\r\n const pathField = getId(adsFields.PATH1);\r\n const displayUrlField = getId(adsFields.DISPLAY_URL);\r\n\r\n const [isInExclusionList, setIsInExclusionList] = useState(true);\r\n const [disclaimerInfo, setDisclaimerInfo] = useState(null);\r\n const [hasDisclaimer, setHasDisclaimer] = useState(false);\r\n const [previewImage, setPreviewImage] = useState(null);\r\n const [llmAssetsSuggestions, setLLMAssetsSuggestions] = useState({});\r\n const [activeKeys, setActiveKeys] = useState([\r\n 'url',\r\n 'headlines',\r\n 'descriptions',\r\n 'imageExtensions',\r\n 'disclaimer',\r\n ]);\r\n\r\n const existingAssets = useMemo(() => ({\r\n shortHeadlines: Object.values(_.result(data, 'Headlines', {})).map(singleItem => singleItem.Asset.Text),\r\n descriptions: Object.values(_.result(data, 'Descriptions', {})).map(singleItem => singleItem.Asset.Text),\r\n }), [data]);\r\n\r\n const campaignId = scope && scope.campaignId;\r\n const adGroupId = scope && scope.adGroupId;\r\n\r\n const [recommendationContext, setRecommendationContext] = useContext(RecommendationContext);\r\n\r\n const { logRecommendationsAPIError, resetRecommendations } = useCopilotRecommendations({\r\n campaignId,\r\n serverContext,\r\n editMode,\r\n entityId: Id,\r\n instrumentation,\r\n activityLogger,\r\n });\r\n\r\n const {\r\n copilotTracking, themes, postAssetEventLog = _.noop,\r\n } = recommendationContext;\r\n\r\n const {\r\n eventLog,\r\n isCopilotEnabled,\r\n sendCopilotBannerNotification,\r\n } = useCopilotForResponsiveSearchAd({ permissions, postAssetEventLog, serverContext });\r\n const assetLibraryEventHandler = useAssetLibraryEventHandler(postAssetEventLog);\r\n\r\n const {\r\n logEnterFlow,\r\n logBannerGenerated,\r\n logFetchAssetsSucceeded,\r\n logApplyThemes,\r\n logSuggestionsViewed,\r\n logSuggestionsApplied,\r\n logRefineTextAssetSucceeded,\r\n logPrefillAssets,\r\n logPrefillAssetsApplied,\r\n logPrefilledAdStrength,\r\n logRemoveAssets,\r\n } = eventLog;\r\n\r\n const {\r\n triggerSurveyOnSubmit,\r\n triggerSurveyOnCancel,\r\n } = useCopilotRecommendationSurvey(AssetEventFeature.RSA);\r\n\r\n useEffect(() => {\r\n if (isSaving) {\r\n triggerSurveyOnSubmit();\r\n }\r\n }, [isSaving, triggerSurveyOnSubmit]);\r\n\r\n useEffect(() => {\r\n if (isCanceling && _.size(themes) > 0) {\r\n triggerSurveyOnCancel();\r\n }\r\n }, [isCanceling, triggerSurveyOnCancel, themes]);\r\n\r\n useEffect(() => {\r\n logEnterFlow();\r\n }, [logEnterFlow]);\r\n\r\n const [isPrefilled, setIsPrefilled] = useState(false);\r\n const [shouldLogPrefilledAdStrength, setShouldLogPrefilledAdStrength] = useState(false);\r\n\r\n const [applyHeadlinesCallback, setApplyHeadlinesCallback] = useState(_.noop);\r\n const [applyDescriptionsCallback, setApplyDescriptionsCallback] = useState(_.noop);\r\n\r\n const logPrefilledAdStrengthCallback = useCallback((adStrength) => {\r\n // Only log the ad strength once after prefilling\r\n if (shouldLogPrefilledAdStrength) {\r\n logPrefilledAdStrength(adStrength, copilotTracking.initialSuggestionsData);\r\n setShouldLogPrefilledAdStrength(false);\r\n }\r\n }, [shouldLogPrefilledAdStrength, logPrefilledAdStrength, copilotTracking.initialSuggestionsData]);\r\n\r\n useEffect(() => {\r\n if (themes && themes.length > 0 && copilotTracking) {\r\n const {\r\n descriptionRecommendationIds, headlineRecommendationIds,\r\n } = getCopilotRecommendationIdsFromThemes(themes);\r\n\r\n if (permissions && !permissions.dynamic.AdStrengthTestingNoPrefill && !isInExclusionList && cachedAd.data && !cachedAd.data.Headlines && !cachedAd.data.Descriptions) {\r\n // text assets are empty, prefill with copilot recommendations\r\n setIsPrefilled(true);\r\n\r\n sendCopilotBannerNotification('Apply');\r\n if (applyHeadlinesCallback) {\r\n // prefill with the first 12 headlines\r\n let newThems = themes;\r\n if (permissions && permissions.dynamic && permissions.dynamic.CopilotDKIRecommendation) {\r\n // prefill with the max 2 DKI headlines\r\n const DKITheme = _.first(themes.filter(theme => theme.name === 'Asset_Theme_For_DKI'));\r\n const normalThemes = themes.filter(theme => theme.name !== 'Asset_Theme_For_DKI');\r\n if (DKITheme && DKITheme.headlines) {\r\n newThems = [{ ...DKITheme, headlines: DKITheme.headlines.slice(0, 2) }, ...normalThemes];\r\n }\r\n }\r\n const newHeadlines = getUniqueAssetsFromThemes(newThems, 'headlines', 12);\r\n copilotTracking.trackInitialSuggestions(AssetPropertyName.HEADLINE, newHeadlines);\r\n\r\n applyHeadlinesCallback(newHeadlines);\r\n }\r\n if (applyDescriptionsCallback) {\r\n // prefill with the first 3 descriptions\r\n const newDescriptions = getUniqueAssetsFromThemes(themes, 'descriptions', 3);\r\n copilotTracking.trackInitialSuggestions(AssetPropertyName.DESCRIPTION, newDescriptions);\r\n\r\n applyDescriptionsCallback(newDescriptions);\r\n }\r\n setShouldLogPrefilledAdStrength(true);\r\n sendCopilotBannerNotification('ApplySucceeded');\r\n logPrefillAssets();\r\n }\r\n\r\n // By default, user views first 5 copilot text recommendations when they are returned\r\n const displayedDescriptions = _.first(descriptionRecommendationIds, MAX_INLINE_RECOMMENDATIONS_PER_PAGE);\r\n const displayedHeadlines = _.first(headlineRecommendationIds, MAX_INLINE_RECOMMENDATIONS_PER_PAGE);\r\n const displayedTextAssets = _.flatten([displayedDescriptions, displayedHeadlines]);\r\n const viewedTextSuggestionIds = copilotTracking.getUntrackedViewedSuggestionIds(displayedTextAssets);\r\n if (viewedTextSuggestionIds.length > 0) {\r\n logSuggestionsViewed(viewedTextSuggestionIds);\r\n copilotTracking.trackViewedSuggestionIds(viewedTextSuggestionIds);\r\n }\r\n }\r\n }, [\r\n applyDescriptionsCallback,\r\n applyHeadlinesCallback,\r\n isInExclusionList,\r\n cachedAd.data,\r\n copilotTracking,\r\n logPrefillAssets,\r\n logSuggestionsViewed,\r\n sendCopilotBannerNotification,\r\n themes,\r\n permissions,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (saveAssetLibraryEventHandler) {\r\n saveAssetLibraryEventHandler(assetLibraryEventHandler);\r\n }\r\n }, [saveAssetLibraryEventHandler, assetLibraryEventHandler]);\r\n\r\n\r\n useEffect(() => {\r\n if (saveLogAppliedSuggestionsFunc) {\r\n saveLogAppliedSuggestionsFunc(({\r\n headlines,\r\n descriptions,\r\n entityId,\r\n suggestedAdExtensions = [],\r\n }) => {\r\n logCopilotRecommendations({\r\n recommendationContext,\r\n assetGroup: {\r\n Headlines: headlines,\r\n Descriptions: descriptions,\r\n Images: {\r\n ImageList: suggestedAdExtensions.map(ext => ({ id: ext.Images && ext.Images[0] && ext.Images[0].Asset.Id })),\r\n },\r\n Id: entityId,\r\n },\r\n campaignId,\r\n isEditing: editMode,\r\n });\r\n });\r\n }\r\n }, [saveLogAppliedSuggestionsFunc, logSuggestionsApplied, logPrefillAssetsApplied, recommendationContext, editMode, campaignId, copilotTracking, isPrefilled]);\r\n\r\n const handleCopilotBannerFetchSucceeded = useCallback((url, assetsResponse) => {\r\n const { IsCustomerIdInExclusionList } = assetsResponse;\r\n if (IsCustomerIdInExclusionList !== isInExclusionList) {\r\n setIsInExclusionList(IsCustomerIdInExclusionList);\r\n }\r\n logBannerGenerated(url, assetsResponse);\r\n if (copilotTracking) {\r\n copilotTracking.trackReturnedTextAssets(assetsResponse.RecommendedAssets);\r\n }\r\n\r\n const formattedThemesAndAssets = _.map(assetsResponse.RecommendedAssets.Themes, getFormattedThemeForApplying);\r\n setRecommendationContext({ themes: formattedThemesAndAssets, imageAssets: _.map(assetsResponse.RecommendedAssets.ImageAssets, getFormattedImage) });\r\n }, [copilotTracking, isInExclusionList, logBannerGenerated, setRecommendationContext]);\r\n\r\n const onApplyCopilotRecommendation = useCallback((selectedThemes, selectedThemesAndAssets) => {\r\n logApplyThemes(selectedThemes);\r\n\r\n const formattedThemesAndAssets = _.map(selectedThemesAndAssets, getFormattedThemeForApplying);\r\n\r\n sendCopilotBannerNotification('Apply');\r\n setRecommendationContext({ themes: [...formattedThemesAndAssets] });\r\n\r\n if (applyHeadlinesCallback) {\r\n applyHeadlinesCallback(getUniqueAssetsFromThemes(formattedThemesAndAssets, 'headlines'));\r\n }\r\n\r\n if (applyDescriptionsCallback) {\r\n applyDescriptionsCallback(getUniqueAssetsFromThemes(formattedThemesAndAssets, 'descriptions'));\r\n }\r\n\r\n sendCopilotBannerNotification('ApplySucceeded');\r\n }, [sendCopilotBannerNotification, setRecommendationContext, applyHeadlinesCallback, applyDescriptionsCallback, logApplyThemes]);\r\n\r\n const handleFetchAssetsSucceeded = useCallback((url, assetsRecommendationData) => {\r\n logFetchAssetsSucceeded(url, assetsRecommendationData);\r\n if (copilotTracking) {\r\n copilotTracking.trackReturnedTextAssets(assetsRecommendationData.RecommendedAssets);\r\n }\r\n }, [logFetchAssetsSucceeded, copilotTracking]);\r\n\r\n const handleTextAssetSuggestionsRendered = useCallback((url, params, textSuggestions) => {\r\n const textSuggestionIds = _.pluck(textSuggestions, 'RecommendationId');\r\n logRefineTextAssetSucceeded(url, params, textSuggestionIds);\r\n\r\n if (copilotTracking) {\r\n copilotTracking.trackReturnedTextAssets({ TextAssets: textSuggestions });\r\n copilotTracking.trackViewedSuggestionIds(textSuggestionIds);\r\n }\r\n }, [copilotTracking, logRefineTextAssetSucceeded]);\r\n\r\n const formatRecommendationsToLLMSuggestions = useCallback(() => {\r\n if (!recommendationContext.themes || recommendationContext.themes.length === 0) return {};\r\n return formatToLLMSuggestion(recommendationContext, data);\r\n }, [data, recommendationContext]);\r\n\r\n useEffect(() => {\r\n injectSetPreviewImage(setPreviewImage);\r\n }, [injectSetPreviewImage]);\r\n\r\n const onValidate = useCallback((value, activeField = null) => {\r\n const shouldValidateAllFields = activeField === null;\r\n\r\n let newErrors;\r\n let errorFields;\r\n if (shouldValidateAllFields) {\r\n // validating all fields, start with an empty list\r\n errorFields = [];\r\n newErrors = [];\r\n } else {\r\n // validating activeField only, remove any pre-existing error for activeField only\r\n errorFields = _.filter(value.errorFields, f => f !== activeField);\r\n newErrors = _.filter(value.errors, e => e.Property !== activeField);\r\n }\r\n // also validate dependant fields\r\n const dependantField = fieldDependencies[activeField];\r\n if (dependantField) {\r\n errorFields = _.without(errorFields, dependantField);\r\n newErrors = _.filter(newErrors, e => e.Property !== dependantField);\r\n\r\n // also validate fields with alias, currently only dependant fields have aliases\r\n const aliasField = adsFieldAlias[dependantField];\r\n if (aliasField) {\r\n errorFields = _.without(errorFields, aliasField);\r\n newErrors = _.filter(newErrors, e => e.Property !== aliasField);\r\n }\r\n }\r\n\r\n let incomplete = false;\r\n\r\n _.each(adsFieldsToValidate, (adField) => {\r\n const isOptional = isSingleFieldOptional(adField);\r\n\r\n if (shouldValidateAllFields || adField === (dependantField || activeField)) {\r\n let fieldValue = value.data[adField];\r\n const maxLength = adsFieldLengthLimitMap[adField];\r\n\r\n let hasError;\r\n switch (adField) {\r\n case adsFields.DESTINATION_URL:\r\n case adsFields.MOBILE_URL: {\r\n // validate URL\r\n const url = _.first(fieldValue);\r\n const [, destination] = getUrlPrefixAndDestination(url);\r\n\r\n if (isOptional && !destination) {\r\n hasError = false;\r\n } else {\r\n const error = validateAdUrl(url, '', i18n);\r\n if (!_.isEmpty(error)) {\r\n newErrors.push({\r\n Property: adField,\r\n Message: error,\r\n });\r\n }\r\n hasError = !fieldValue || error;\r\n }\r\n break;\r\n }\r\n case adsFields.DISPLAY_URL: {\r\n if (permissions.IsVanityUrlEnabled) {\r\n const displayUrlError =\r\n validateTextFieldValue(fieldValue, maxLength, i18n, adField, isOptional);\r\n hasError = displayUrlError !== null;\r\n if (hasError) {\r\n newErrors.push({\r\n Property: adField,\r\n Message: displayUrlError,\r\n });\r\n errorFields.push(adField);\r\n }\r\n }\r\n break;\r\n }\r\n case adsFields.HEADLINES:\r\n case adsFields.DESCRIPTIONS: {\r\n hasError = _.any(\r\n fieldValue,\r\n h => validateTextFieldValue(h.Asset.Text, maxLength, i18n, adField, isOptional)\r\n );\r\n\r\n // eslint-disable-next-line max-len\r\n const error = validateTextAssets(fieldValue, adFieldsConfig[adField].assetsConfig, i18n);\r\n\r\n if (!_.isEmpty(error)) {\r\n hasError = true;\r\n newErrors.push({\r\n Property: adField,\r\n Message: error,\r\n });\r\n }\r\n break;\r\n }\r\n case adsFields.PATH1:\r\n case adsFields.PATH2: {\r\n if (shouldValidateAllFields && adField === adsFields.PATH2) {\r\n break;\r\n }\r\n\r\n fieldValue = [value.data.Path1, value.data.Path2];\r\n // fallthrough\r\n }\r\n // eslint-disable-next-line no-fallthrough\r\n case adsFields.TRACKING_URL_TEMPLATE:\r\n case adsFields.FINAL_URL_SUFFIX:\r\n case adsFields.URL_CUSTOM_PARAMETERS: {\r\n const errorList = validators[adField](fieldValue, i18n);\r\n if (!_.isEmpty(errorList)) {\r\n hasError = true;\r\n newErrors.push(...errorList);\r\n }\r\n break;\r\n }\r\n default: {\r\n hasError = validateTextFieldValue(fieldValue, maxLength, i18n, adField, isOptional);\r\n }\r\n }\r\n\r\n if (hasError) {\r\n errorFields.push(adField);\r\n }\r\n } else if ((!isOptional || isCompoundFieldRequired(adField)) && isFieldEmpty(adField, value.data[adField])) {\r\n // if not validating all fields, still need to check if ad is incomplete\r\n incomplete = true;\r\n }\r\n });\r\n\r\n // if there are any errors, ad is not complete yet\r\n if (!_.isEmpty(errorFields)) {\r\n incomplete = true;\r\n errorFields = _.uniq(errorFields);\r\n }\r\n\r\n setFormErrors(newErrors);\r\n\r\n return {\r\n ...value,\r\n errorFields,\r\n errors: newErrors,\r\n incomplete,\r\n };\r\n }, [i18n, permissions.IsVanityUrlEnabled]);\r\n\r\n const onClearTextAssets = useCallback(() => {\r\n const validatedItem = onValidate({\r\n ...cachedAd,\r\n data: {\r\n ...data,\r\n ...textAssets.reduce((acc, key) => {\r\n acc[key] = [];\r\n return acc;\r\n }, {}),\r\n },\r\n });\r\n setCachedAd(validatedItem);\r\n\r\n copilotTracking.removeAllInitialSuggestions();\r\n logRemoveAssets();\r\n }, [cachedAd, data, onValidate, logRemoveAssets, copilotTracking]);\r\n\r\n const onUpdateItemByKey = useCallback((value, key) => {\r\n setCachedAd((prevCachedAd) => {\r\n const updatedData = {\r\n ...prevCachedAd.data,\r\n [fieldMappings[key] || key]: value,\r\n };\r\n\r\n const validatedItem = onValidate({\r\n ...prevCachedAd,\r\n data: updatedData,\r\n }, key);\r\n\r\n return validatedItem;\r\n });\r\n }, [onValidate]);\r\n\r\n const onDebouncedUpdateItemByKey = useCallback(_.debounce((value, key) => {\r\n setCachedAd((prevCachedAd) => {\r\n const updatedData = {\r\n ...prevCachedAd.data,\r\n [fieldMappings[key] || key]: value,\r\n };\r\n\r\n const validatedItem = onValidate({\r\n ...prevCachedAd,\r\n data: updatedData,\r\n }, key);\r\n\r\n return validatedItem;\r\n });\r\n }, 1000), [onValidate]);\r\n\r\n const onItemBlurBykey = useCallback((newValue, key) => {\r\n if (renderImageExtension) {\r\n const fieldToUpdate = fieldMappings[key] || key;\r\n\r\n if (_.contains([\r\n adsFields.HEADLINES, adsFields.DESCRIPTIONS,\r\n ], fieldToUpdate)) {\r\n setCachedValuesForImageSuggestions((prev) => {\r\n const { needUpdate, value } = computeRankingTextsUpdates({\r\n Headlines,\r\n Descriptions,\r\n [fieldToUpdate]: newValue,\r\n }, prev);\r\n\r\n if (needUpdate) {\r\n return value;\r\n }\r\n return prev;\r\n });\r\n }\r\n }\r\n }, [Descriptions, Headlines, renderImageExtension]);\r\n\r\n const onUpdateFinalUrlPrefix = useCallback((evt, newPrefix) => {\r\n const newValue = getUpdatedFullUrlOnPrefixUpdate(finalUrlWithoutPrefix, newPrefix);\r\n\r\n onUpdateItemByKey([newValue], adFieldsConfig.DestinationUrl.key);\r\n }, [finalUrlWithoutPrefix, onUpdateItemByKey]);\r\n\r\n const onUpdateFinalUrlValue = useCallback((evt) => {\r\n const newValue = getUpdatedFullUrlOnTextUpdate(finalUrlPrefix, evt.target.value);\r\n\r\n if (newValue) {\r\n onUpdateItemByKey([newValue], adFieldsConfig.DestinationUrl.key);\r\n }\r\n }, [finalUrlPrefix, onUpdateItemByKey]);\r\n\r\n const onSaveClicked = useCallback(() => {\r\n const validatedItem = onValidate(cachedAd);\r\n\r\n setCachedAd(validatedItem);\r\n if (!validatedItem.incomplete && _.isEmpty(validatedItem.errorFields)) {\r\n onSave(validatedItem);\r\n }\r\n }, [cachedAd, onSave, onValidate]);\r\n\r\n const onCancelClicked = () => {\r\n onCancel();\r\n };\r\n\r\n useEffect(() => {\r\n onChanged(cachedAd);\r\n }, [cachedAd]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n useEffect(() => {\r\n const validatedItem = onValidate(cachedAd);\r\n if (!showInitialErrors) {\r\n setCachedAd({\r\n ...validatedItem,\r\n errorFields: [],\r\n errors: [],\r\n });\r\n } else {\r\n setCachedAd(validatedItem);\r\n }\r\n\r\n if (!showInitialErrors) {\r\n setFormErrors([]);\r\n }\r\n }, [showInitialErrors]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n useEffect(() => {\r\n setFormErrors(_.extend([], formErrors, errors));\r\n }, [errors]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n useEffect(() => {\r\n if (!hasErrorInUrl) {\r\n const copilotSuggestions = formatRecommendationsToLLMSuggestions();\r\n setLLMAssetsSuggestions(copilotSuggestions);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [finalUrlForRecommendation, recommendationContext]);\r\n\r\n useEffect(() => {\r\n if (isForVnext && onFetchDisclaimerInfo) {\r\n onFetchDisclaimerInfo().then((disclaimer) => {\r\n const {\r\n disclaimerData,\r\n } = disclaimer;\r\n if (disclaimer.hasDisclaimer) {\r\n setDisclaimerInfo(disclaimerData);\r\n setHasDisclaimer(disclaimer.hasDisclaimer);\r\n }\r\n });\r\n }\r\n }, [isForVnext, onFetchDisclaimerInfo]);\r\n\r\n useEffect(() => {\r\n setClarityTag({ RSANewCopilotUI: 'true' });\r\n }, []);\r\n\r\n const renderLeftColumnWithNewCopilotUI = () => {\r\n const errorProperties = (formErrors || []).map(error => error.Property);\r\n const renderCardError = properties => (_.some(properties, property => _.contains(errorProperties, property)) ? _TL_(\"* Something's wrong\") : null);\r\n const renderCardTitle = (name, icon, helpId) => ;\r\n const imageExtension = renderImageExtension && renderImageExtension({\r\n fullUrl: finalUrl,\r\n hasErrorInUrl,\r\n urlPrefix: finalUrlPrefix,\r\n onUpdateUrlPrefix: onUpdateFinalUrlPrefix,\r\n onUpdateUrlValue: onUpdateFinalUrlValue,\r\n headlines: cachedValuesForImageSuggestions.Headlines,\r\n descriptions: cachedValuesForImageSuggestions.Descriptions,\r\n });\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {permissions.IsVanityUrlEnabled ?\r\n :\r\n \r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {imageExtension &&\r\n \r\n {imageExtension}\r\n \r\n }\r\n {hasDisclaimer &&\r\n \r\n \r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n \r\n {showActionBar &&\r\n \r\n \r\n {i18n.getString(_TL_('Save'))}\r\n \r\n\r\n \r\n {i18n.getString(_TL_('Cancel'))}\r\n \r\n \r\n }\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {renderLeftColumnWithNewCopilotUI()}\r\n \r\n
\r\n { permissions && permissions.dynamic && !permissions.dynamic.AdStrengthTestingNoPanel &&\r\n \r\n }\r\n
\r\n {renderImageExtension ?\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\nResponsiveSearchAdEditorBase.propTypes = {\r\n\r\n item: PropTypes.shape({\r\n data: PropTypes.shape({\r\n Headlines: PropTypes.arrayOf(PropTypes.shape({})),\r\n Descriptions: PropTypes.arrayOf(PropTypes.shape({})),\r\n }).isRequired,\r\n errorFields: PropTypes.arrayOf(PropTypes.string),\r\n }),\r\n\r\n errors: PropTypes.arrayOf(PropTypes.shape({\r\n Property: PropTypes.string,\r\n Code: PropTypes.string,\r\n Message: PropTypes.string.isRequired,\r\n })),\r\n\r\n i18n: PropTypes.shape({\r\n getLocale: PropTypes.func.isRequired,\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n\r\n isNewTextAssetsButtonStyle: PropTypes.bool,\r\n\r\n onSave: PropTypes.func,\r\n\r\n onCancel: PropTypes.func,\r\n\r\n onChanged: PropTypes.func,\r\n\r\n onFetchAdStrengthV2: PropTypes.func,\r\n\r\n onFetchDisclaimerInfo: PropTypes.func,\r\n\r\n showActionBar: PropTypes.bool,\r\n\r\n showInitialErrors: PropTypes.bool,\r\n\r\n timeZone: PropTypes.number,\r\n\r\n AdPreviewComponent: PropTypes.elementType,\r\n\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({\r\n AdStrengthTestingNoPanel: PropTypes.bool,\r\n AdStrengthTestingNoPrefill: PropTypes.bool,\r\n CopilotDKIRecommendation: PropTypes.bool,\r\n }),\r\n IsVanityUrlEnabled: PropTypes.bool,\r\n }),\r\n\r\n urlOptionsElement: PropTypes.shape({}),\r\n\r\n token: PropTypes.string,\r\n\r\n triggerTestUurl: PropTypes.func,\r\n\r\n showUurlTestTool: PropTypes.bool,\r\n\r\n showFinalUrlSuffix: PropTypes.bool,\r\n\r\n showAdCustomizers: PropTypes.bool,\r\n\r\n showDynamicTextExtention: PropTypes.bool,\r\n\r\n isForVnext: PropTypes.bool,\r\n\r\n updateSuggestionMeasurement: PropTypes.func,\r\n\r\n edmCampaign: PropTypes.shape({}),\r\n\r\n jsDataCampaign: PropTypes.shape({}),\r\n\r\n renderImageExtension: PropTypes.func,\r\n\r\n injectSetPreviewImage: PropTypes.func,\r\n\r\n perfMarker: PropTypes.shape({\r\n createChild: PropTypes.func,\r\n }),\r\n\r\n serverContext: PropTypes.shape({}),\r\n scope: PropTypes.shape({\r\n campaignId: PropTypes.number,\r\n adGroupId: PropTypes.number,\r\n }),\r\n editMode: PropTypes.bool,\r\n saveLogAppliedSuggestionsFunc: PropTypes.func,\r\n isSaving: PropTypes.bool,\r\n isCanceling: PropTypes.bool,\r\n onFirstErrorHandler: PropTypes.func,\r\n saveAssetLibraryEventHandler: PropTypes.func,\r\n activityLogger: PropTypes.shape({}),\r\n};\r\n\r\nResponsiveSearchAdEditorBase.defaultProps = {\r\n showActionBar: true,\r\n showInitialErrors: true,\r\n item: { data: {} },\r\n errors: [],\r\n isNewTextAssetsButtonStyle: false,\r\n onSave: _.noop,\r\n onCancel: _.noop,\r\n onChanged: _.noop,\r\n onFetchAdStrengthV2: _.noop,\r\n onFetchDisclaimerInfo: null,\r\n timeZone: null,\r\n AdPreviewComponent: ResponsiveSearchAdPreviewUAPL,\r\n urlOptionsElement: null,\r\n token: '',\r\n triggerTestUurl: _.noop,\r\n showUurlTestTool: false,\r\n showFinalUrlSuffix: false,\r\n showAdCustomizers: false,\r\n showDynamicTextExtention: false,\r\n isForVnext: false,\r\n updateSuggestionMeasurement: _.noop,\r\n edmCampaign: {},\r\n jsDataCampaign: {},\r\n renderImageExtension: undefined,\r\n injectSetPreviewImage: _.noop,\r\n perfMarker: {},\r\n serverContext: {},\r\n scope: {},\r\n editMode: false,\r\n saveLogAppliedSuggestionsFunc: _.noop,\r\n saveAssetLibraryEventHandler: _.noop,\r\n isSaving: false,\r\n isCanceling: false,\r\n onFirstErrorHandler: _.noop,\r\n permissions: {\r\n dynamic: {\r\n AdStrengthTestingNoPanel: false,\r\n AdStrengthTestingNoPrefill: false,\r\n CopilotDKIRecommendation: false,\r\n },\r\n IsVanityUrlEnabled: false,\r\n },\r\n activityLogger: undefined,\r\n};\r\n\r\nexport const ResponsiveSearchAdEditor = _.compose(\r\n withActivityContext,\r\n withBannerService,\r\n withRecommendationContext\r\n)(ResponsiveSearchAdEditorBase);\r\n","import { useEffect, useState } from 'react';\r\nimport { isCopilotRegionRestricted } from '@bingads-webui-react/copilot-utils';\r\nimport { useBannerService } from '@bingads-webui/inline-copilot';\r\nimport { useEventLog } from '@bingads-webui-campaign-react/copilot-common';\r\n\r\nexport function useCopilotForResponsiveSearchAd({\r\n permissions,\r\n postAssetEventLog,\r\n serverContext,\r\n}) {\r\n const [isCopilotEnabled, setIsCopilotEnabled] = useState();\r\n const { send: sendCopilotBannerNotification } = useBannerService();\r\n const eventLog = useEventLog(postAssetEventLog);\r\n\r\n useEffect(() => {\r\n isCopilotRegionRestricted({\r\n feature: 'Recommendations',\r\n permissions,\r\n serverContext,\r\n }).then(isRestricted => setIsCopilotEnabled(!isRestricted));\r\n }, [permissions, serverContext]);\r\n\r\n return {\r\n eventLog,\r\n isCopilotEnabled,\r\n sendCopilotBannerNotification,\r\n };\r\n}\r\n","import React from 'react';\r\nimport classnames from 'classnames';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { withError, withValidation, AdapterFactory } from '@bingads-webui-react/validation';\r\nimport { withControlErrorHandling, withUnvalidatedControlErrors } from '@bingads-webui-campaign-react/error-handling';\r\nimport { BaseTextField } from './base-text-field';\r\nimport { validateTextField } from '../validators';\r\n\r\nconst Adapter = AdapterFactory({ convertEventToValue: value => value, functionToInject: 'updateItem' });\r\nconst validatedTextField = withValidation(BaseTextField, Adapter);\r\nconst ValidatedTextFieldWithErrors = withControlErrorHandling(withUnvalidatedControlErrors(withError(validatedTextField)));\r\n\r\nconst getTextInputContainerStyles = () => ({\r\n TextInputContainer: {\r\n width: '435px',\r\n '& div .error': {\r\n color: '#A80000',\r\n },\r\n },\r\n});\r\n\r\nexport const TextFieldWithAdCustomizerInternal = React.memo((props) => {\r\n const {\r\n i18n, adType, containerSelector, configProps, validationProps,\r\n } = props;\r\n\r\n const classes = useDefaultStyles(getTextInputContainerStyles);\r\n const customizedValidator = (newData) => {\r\n const isRequired = _.property(['schema', 'properties', configProps.id, 'required'])(validationProps);\r\n if (isRequired && _.isEmpty(newData)) {\r\n return [i18n.getString(_TL_('Required field'))];\r\n }\r\n const errorMessage = validateTextField(configProps.key, i18n, true, adType)(newData);\r\n return errorMessage === '' ? [] : [errorMessage];\r\n };\r\n const newValidationProps = {\r\n ...validationProps,\r\n validator: customizedValidator,\r\n };\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n});\r\n\r\nTextFieldWithAdCustomizerInternal.propTypes = {\r\n updateValidation: PropTypes.func.isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n adType: PropTypes.string,\r\n containerSelector: PropTypes.string,\r\n configProps: PropTypes.shape({\r\n id: PropTypes.string,\r\n key: PropTypes.string,\r\n }).isRequired,\r\n validationProps: PropTypes.shape({\r\n data: PropTypes.shape({}),\r\n field: PropTypes.string,\r\n }).isRequired,\r\n};\r\n\r\nTextFieldWithAdCustomizerInternal.defaultProps = {\r\n adType: 'ResponsiveAd',\r\n containerSelector: 'div.crud-multimedia-ad-react .ad-edit-and-preview-container',\r\n};\r\n\r\nexport const ValidatedTextFieldWithAdCustomizer = (TextFieldWithAdCustomizerInternal);\r\n","export const strengthStrings = {\r\n Poor: _TL_('Poor'),\r\n Average: _TL_('Average'),\r\n Good: _TL_('Good'),\r\n Excellent: _TL_('Excellent'),\r\n};\r\n\r\nexport const actionItemStrings = {\r\n AddMoreHeadlines: _TL_('Add more headlines'),\r\n AddMoreDescriptions: _TL_('Add more descriptions'),\r\n MoreCombinations: _TL_('Add more combinations'),\r\n LongerHeadlines: _TL_('Add longer headlines'),\r\n LongerDescriptions: _TL_('Add longer descriptions'),\r\n DistinctHeadlines: _TL_('Make your headlines more unique'),\r\n DistinctDescriptions: _TL_('Make your descriptions more unique'),\r\n UnpinHeadlinePositions: _TL_('Unpin headline positions'),\r\n UnpinDescriptionPositions: _TL_('Unpin description positions'),\r\n};\r\n\r\nexport const adStrengthSuggestionTipsStrings = {\r\n Ad_Strength_Suggestion_Tips_Category_Product_Title: _TL_('Products or service'),\r\n Ad_Strength_Suggestion_Tips_Category_Product_Subtitle: _TL_('What does your business offer?'),\r\n Ad_Strength_Suggestion_Tips_Category_Product_Item1: _TL_('Reliable AC Systems'),\r\n Ad_Strength_Suggestion_Tips_Category_Product_Item2: _TL_('Top-Rated Moving Service'),\r\n Ad_Strength_Suggestion_Tips_Category_Product_Item3: _TL_('Secure Self Storage'),\r\n Ad_Strength_Suggestion_Tips_Category_Product_Item4: _TL_('Workout Clothes & Activewear'),\r\n Ad_Strength_Suggestion_Tips_Category_Benefits_Title: _TL_('Benefits'),\r\n Ad_Strength_Suggestion_Tips_Category_Benefits_Subtitle: _TL_('How do your products or services help people?'),\r\n Ad_Strength_Suggestion_Tips_Category_Benefits_Item1: _TL_('No Cooking Required'),\r\n Ad_Strength_Suggestion_Tips_Category_Benefits_Item2: _TL_('Three Convenient Locations'),\r\n Ad_Strength_Suggestion_Tips_Category_Benefits_Item3: _TL_('In-Home Tutoring'),\r\n Ad_Strength_Suggestion_Tips_Category_Benefits_Item4: _TL_('Quick Delivery'),\r\n Ad_Strength_Suggestion_Tips_Category_Brand_Title: _TL_('Brand'),\r\n Ad_Strength_Suggestion_Tips_Category_Brand_Subtitle: _TL_('What phrases use your brand?'),\r\n Ad_Strength_Suggestion_Tips_Category_Brand_Item1: _TL_('[Brand Name]'),\r\n Ad_Strength_Suggestion_Tips_Category_Brand_Item2: _TL_('[Brand.com]'),\r\n Ad_Strength_Suggestion_Tips_Category_Brand_Item3: _TL_('Best Prices from [Brand]'),\r\n Ad_Strength_Suggestion_Tips_Category_Brand_Item4: _TL_('Official [Brand] site'),\r\n Ad_Strength_Suggestion_Tips_Category_Action_Title: _TL_('Call to action'),\r\n Ad_Strength_Suggestion_Tips_Category_Action_Subtitle: _TL_('What do you want your customers to do?'),\r\n Ad_Strength_Suggestion_Tips_Category_Action_Item1: _TL_('Book Your Next Adventure'),\r\n Ad_Strength_Suggestion_Tips_Category_Action_Item2: _TL_('Schedule a Test Drive'),\r\n Ad_Strength_Suggestion_Tips_Category_Action_Item3: _TL_('Call for an Appointment'),\r\n Ad_Strength_Suggestion_Tips_Category_Action_Item4: _TL_('Get a Free Personalized Quote'),\r\n Ad_Strength_Suggestion_Tips_Category_Inventory_Title: _TL_('Inventory and selection'),\r\n Ad_Strength_Suggestion_Tips_Category_Inventory_Subtitle: _TL_('What categories, options, and selections do you offer?'),\r\n Ad_Strength_Suggestion_Tips_Category_Inventory_Item1: _TL_('The Latest Summer Styles'),\r\n Ad_Strength_Suggestion_Tips_Category_Inventory_Item2: _TL_('Puppy Toys'),\r\n Ad_Strength_Suggestion_Tips_Category_Inventory_Item3: _TL_('50 Styles in 50 Colors'),\r\n Ad_Strength_Suggestion_Tips_Category_Inventory_Item4: _TL_('Thousands of Instruments to Choose From'),\r\n Ad_Strength_Suggestion_Tips_Category_Pricing_Title: _TL_('Pricing and fees'),\r\n Ad_Strength_Suggestion_Tips_Category_Pricing_Subtitle: _TL_('What are your prices, taxes, shipping, returns, and fees?'),\r\n Ad_Strength_Suggestion_Tips_Category_Pricing_Item1: _TL_('$10/Month Self-Storage'),\r\n Ad_Strength_Suggestion_Tips_Category_Pricing_Item2: _TL_('Free Delivery Over $49'),\r\n Ad_Strength_Suggestion_Tips_Category_Pricing_Item3: _TL_('No Risk 90-Day Returns'),\r\n Ad_Strength_Suggestion_Tips_Category_Pricing_Item4: _TL_('Prices as low as $29.99'),\r\n Ad_Strength_Suggestion_Tips_Category_Promotion_Title: _TL_('Promotion and discount'),\r\n Ad_Strength_Suggestion_Tips_Category_Promotion_Subtitle: _TL_('What type of deals do you offer?'),\r\n Ad_Strength_Suggestion_Tips_Category_Promotion_Item1: _TL_('Save Up to 30% Off All Orders'),\r\n Ad_Strength_Suggestion_Tips_Category_Promotion_Item2: _TL_('Weekend Deals Available Now'),\r\n Ad_Strength_Suggestion_Tips_Category_Promotion_Item3: _TL_('Get A $100 Sign-up Bonus'),\r\n Ad_Strength_Suggestion_Tips_Category_Promotion_Item4: _TL_('Buy One, Get One Free'),\r\n};\r\n\r\nexport const adStrengthSuggestionPerspectiveStrings = {\r\n Ad_Strength_Suggestion_Perspective_Headline_Title: _TL_('Recommending optimal headlines combinations'),\r\n Ad_Strength_Suggestion_Perspective_Headline_Pitching_Point: _TL_('Microsoft Advertising recommends the most optimal headline combinations to highlight your business and create effective ads for potential customers.'),\r\n Ad_Strength_Suggestion_Perspective_Description_Title: _TL_('Recommending optimal descriptions combinations'),\r\n Ad_Strength_Suggestion_Perspective_Description_Pitching_Point: _TL_('Microsoft Advertising recommends the most optimal description combinations to highlight your business and create effective ads for potential customers.'),\r\n};\r\n\r\nexport const defaultPromotionSuggestions = [\r\n { AssetType: 'Headline', Asset: 'Get More for Less' },\r\n { AssetType: 'Headline', Asset: 'Try Something New' },\r\n { AssetType: 'Headline', Asset: 'Fast Shipping Available' },\r\n { AssetType: 'Headline', Asset: 'Limited Time Offer' },\r\n { AssetType: 'Headline', Asset: 'Free Shipping Today' },\r\n { AssetType: 'Description', Asset: 'Discover the best deals on our website! Find what you need at unbeatable prices.' },\r\n { AssetType: 'Description', Asset: 'Discover endless possibilities with our website!' },\r\n];\r\n","import _ from 'underscore';\r\nimport { actionItemStrings } from './strings';\r\n\r\nconst SuggestionState = {\r\n Met: 'met',\r\n HalfMet: 'half-met',\r\n NotMet: 'not-met',\r\n};\r\n\r\nconst StrengthScore = {\r\n Poor: 25,\r\n Average: 50,\r\n Good: 75,\r\n Excellent: 100,\r\n};\r\n\r\nconst NewStrengthScore = {\r\n Incomplete: 7,\r\n Poor: 14,\r\n Average: 49,\r\n Good: 83,\r\n Excellent: 98,\r\n};\r\n\r\nconst StrengthColor = {\r\n Poor: '#BC0505',\r\n Average: '#F2610C',\r\n Good: '#107C10',\r\n Excellent: '#107C10',\r\n};\r\n\r\nconst StrengthIcon = {\r\n Poor: 'Error',\r\n Average: 'Warning',\r\n Good: 'Completed',\r\n Excellent: 'Completed',\r\n};\r\n\r\nexport const maxHeadlineCount = 15;\r\n\r\nexport const maxDescriptionCount = 4;\r\n\r\nexport const ViewSuggestionType = {\r\n None: 'none',\r\n Headline: 'headline',\r\n Description: 'description',\r\n};\r\n\r\nexport const assetStrMap = {\r\n Headlines: 'headline',\r\n Descriptions: 'description',\r\n};\r\n\r\nexport const assetTypeMap = {\r\n headline: 'Headlines',\r\n description: 'Descriptions',\r\n};\r\n\r\nexport function getStrengthScore(strength) {\r\n return StrengthScore[strength] || 0;\r\n}\r\n\r\nexport function getNewStrengthScore(strength) {\r\n return NewStrengthScore[strength] || 0;\r\n}\r\n\r\nexport function getStrengthColor(strength) {\r\n return StrengthColor[strength] || '#BC0505';\r\n}\r\n\r\nexport function getStrengthIcon(strength) {\r\n return StrengthIcon[strength] || 'Error';\r\n}\r\n\r\nexport function newGenerateSuggestion({\r\n i18n,\r\n actionItem,\r\n xValue,\r\n priority,\r\n}) {\r\n let suggestion;\r\n switch (actionItem) {\r\n case 'AddMoreHeadlines': {\r\n suggestion = i18n.getString(_TL_('Add {{x}} more headlines.'), { x: xValue });\r\n break;\r\n }\r\n case 'AddMoreDescriptions': {\r\n suggestion = i18n.getString(_TL_('Add {{x}} more descriptions.'), { x: xValue });\r\n break;\r\n }\r\n case 'AddLongerHeadlines': {\r\n suggestion = i18n.getString(_TL_('Create longer headlines. Your current average number of characters is {{x}}.'), { x: xValue });\r\n break;\r\n }\r\n case 'AddLongerDescriptions': {\r\n suggestion = i18n.getString(_TL_('Create longer Descriptions. Your current average number of characters is {{x}}.'), { x: xValue });\r\n break;\r\n }\r\n case 'UnpinHeadlines': {\r\n suggestion = i18n.getString(_TL_('Unpin headline for more combination.'));\r\n break;\r\n }\r\n case 'UnpinDescriptions': {\r\n suggestion = i18n.getString(_TL_('Unpin description for more combination.'));\r\n break;\r\n }\r\n case 'IncludeKeywordsOrKeywordInsertionHeadlines': {\r\n const keywordList = xValue.split('#');\r\n if (keywordList.length === 0) {\r\n suggestion = i18n.getString(_TL_('Include popular keywords in headlines.'));\r\n } else if (keywordList.length===1) {\r\n suggestion = i18n.getString(_TL_('Include a popular keyword in headlines such as \"{{x}}\".'), { x: keywordList[0] });\r\n } else {\r\n suggestion = i18n.getString(_TL_('Include a popular keyword in headlines such as \"{{x}}\" or \"{{y}}\".'), { x: keywordList[0], y: keywordList[1] });\r\n }\r\n break;\r\n }\r\n case 'IncludeKeywordsOrKeywordInsertionDescriptions': {\r\n const keywordList = xValue.split('#');\r\n if (keywordList.length === 0) {\r\n suggestion = i18n.getString(_TL_('Include popular keywords in descriptions.'));\r\n } else if (keywordList.length===1) {\r\n suggestion = i18n.getString(_TL_('Include a popular keyword in descriptions such as \"{{x}}\".'), { x: keywordList[0] });\r\n } else {\r\n suggestion = i18n.getString(_TL_('Include a popular keyword in descriptions such as \"{{x}}\" or \"{{y}}\".'), { x: keywordList[0], y: keywordList[1] });\r\n }\r\n break;\r\n }\r\n case 'MakeHeadlinesUnique': {\r\n suggestion = i18n.getString(_TL_('Try to diversify your headlines.'));\r\n break;\r\n }\r\n case 'MakeDescriptionsUnique': {\r\n suggestion = i18n.getString(_TL_('Try to diversify your descriptions.'));\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n return {\r\n suggestion,\r\n priority,\r\n };\r\n}\r\n\r\n\r\nexport function generateSuggestion({\r\n i18n,\r\n assets,\r\n actionItem,\r\n strength,\r\n priority,\r\n length,\r\n}) {\r\n const suggestion = i18n.getString(actionItemStrings[actionItem]);\r\n let state = 'not-met';\r\n let suggestionType = ViewSuggestionType.None;\r\n\r\n switch (actionItem) {\r\n case 'AddMoreHeadlines': {\r\n const headlineCount = assets.headlines.length;\r\n if (headlineCount < 5) {\r\n state = SuggestionState.NotMet;\r\n } else if (headlineCount >= maxHeadlineCount\r\n || (headlineCount > 8 && getStrengthScore(strength) >= StrengthScore.Good)) {\r\n state = SuggestionState.Met;\r\n } else {\r\n state = SuggestionState.HalfMet;\r\n }\r\n suggestionType = ViewSuggestionType.Headline;\r\n break;\r\n }\r\n case 'AddMoreDescriptions': {\r\n const descriptionCount = assets.descriptions.length;\r\n if (descriptionCount < 2) {\r\n state = SuggestionState.NotMet;\r\n } else if (descriptionCount >= maxDescriptionCount\r\n || (descriptionCount > 3 && getStrengthScore(strength) >= StrengthScore.Good)) {\r\n state = SuggestionState.Met;\r\n } else {\r\n state = SuggestionState.HalfMet;\r\n }\r\n suggestionType = ViewSuggestionType.Description;\r\n break;\r\n }\r\n case 'DistinctHeadlines': {\r\n state = _.uniq(assets.headlines).length === assets.headlines.length\r\n ? SuggestionState.HalfMet\r\n : SuggestionState.NotMet;\r\n suggestionType = ViewSuggestionType.Headline;\r\n break;\r\n }\r\n case 'DistinctDescriptions':\r\n state = _.uniq(assets.descriptions).length === assets.descriptions.length\r\n ? SuggestionState.HalfMet\r\n : SuggestionState.NotMet;\r\n suggestionType = ViewSuggestionType.Description;\r\n break;\r\n case 'LongerHeadlines':\r\n state = (_.size(assets.headlines) === 0\r\n || _.any(assets.headlines, headline => _.size(headline) < 10))\r\n ? SuggestionState.NotMet\r\n : SuggestionState.HalfMet;\r\n suggestionType = ViewSuggestionType.Headline;\r\n break;\r\n case 'LongerDescriptions':\r\n state = (_.size(assets.descriptions) === 0\r\n || _.any(assets.descriptions, description => _.size(description) < 10))\r\n ? SuggestionState.NotMet\r\n : SuggestionState.HalfMet;\r\n suggestionType = ViewSuggestionType.Description;\r\n break;\r\n case 'UnpinHeadlinePositions': {\r\n const pinCount = assets.headlinePins.length;\r\n if (pinCount > 0) {\r\n state = pinCount === assets.headlines.length\r\n ? SuggestionState.NotMet\r\n : SuggestionState.HalfMet;\r\n } else {\r\n state = SuggestionState.Met;\r\n }\r\n suggestionType = ViewSuggestionType.None;\r\n break;\r\n }\r\n case 'UnpinDescriptionPositions': {\r\n const pinCount = assets.descriptionPins.length;\r\n if (pinCount > 0) {\r\n state = pinCount === assets.descriptions.length\r\n ? SuggestionState.NotMet\r\n : SuggestionState.HalfMet;\r\n } else {\r\n state = SuggestionState.Met;\r\n }\r\n suggestionType = ViewSuggestionType.None;\r\n break;\r\n }\r\n case 'MoreCombinations':\r\n if (assets.headlines.length < 5 || assets.descriptions.length < 3) {\r\n state = SuggestionState.NotMet;\r\n } else {\r\n state = SuggestionState.HalfMet;\r\n }\r\n if (assets.headlines.length < 10) {\r\n suggestionType = ViewSuggestionType.Headline;\r\n } else if (assets.descriptions.length < maxDescriptionCount) {\r\n suggestionType = ViewSuggestionType.Description;\r\n } else {\r\n suggestionType = ViewSuggestionType.None;\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n return {\r\n action: actionItem,\r\n state,\r\n suggestion,\r\n suggestionType,\r\n priority: actionItem === 'MoreCombinations' ? length : priority,\r\n };\r\n}\r\n\r\nexport function sortSuggestions(suggestions) {\r\n const orderFromMT = {};\r\n const currentOrders = {\r\n AddMoreHeadlines: 1,\r\n AddMoreDescriptions: 2,\r\n LongerHeadlines: 3,\r\n LongerDescriptions: 4,\r\n DistinctHeadlines: 5,\r\n DistinctDescriptions: 6,\r\n UnpinHeadlinePositions: 7,\r\n UnpinDescriptionPositions: 8,\r\n MoreCombinations: 9,\r\n };\r\n suggestions.forEach((suggestion) => {\r\n orderFromMT[`${suggestion.action}-not-met`] = suggestion.priority + ((currentOrders[suggestion.action] || 0) / 10);\r\n orderFromMT[`${suggestion.action}-half-met`] = suggestion.priority + suggestions.length + ((currentOrders[suggestion.action] || 0) / 10);\r\n orderFromMT[`${suggestion.action}-met`] = suggestion.priority + (suggestions.length * 2) + ((currentOrders[suggestion.action] || 0) / 10);\r\n });\r\n return _.sortBy(suggestions, suggestion => orderFromMT[`${suggestion.action}-${suggestion.state}`] || 100);\r\n}\r\n\r\nexport function isViewSuggestionApplied(assets, suggestionContent = '') {\r\n if (_.isEmpty(assets)) return false;\r\n const index = _.findIndex(_.range(assets.length), i =>\r\n _.isString(assets[i].Asset.Text) &&\r\n suggestionContent.toLowerCase() === assets[i].Asset.Text.toLowerCase());\r\n\r\n return (index !== -1);\r\n}\r\n","import PropTypes from 'prop-types';\r\nimport React from 'react';\r\nimport { HighchartReactWrapper } from '@bingads-webui-react/highchart-react-wrapper';\r\nimport { getNewStrengthScore, getStrengthColor } from './ad-strength-helper';\r\n\r\nexport function NewAdStrengthScore({\r\n strength, width,\r\n}) {\r\n if (!strength) return null;\r\n\r\n const score = getNewStrengthScore(strength);\r\n const color = getStrengthColor(strength);\r\n const options = {\r\n chart: {\r\n width,\r\n height: 12,\r\n margin: [0, 0, 0, 0],\r\n type: 'bar',\r\n },\r\n title: {\r\n text: null,\r\n },\r\n xAxis: {\r\n visible: false,\r\n },\r\n yAxis: {\r\n visible: false,\r\n tickPositions: [-0.2, 100.2],\r\n },\r\n legend: {\r\n enabled: false,\r\n },\r\n credits: {\r\n enabled: false,\r\n },\r\n tooltip: {\r\n enabled: false,\r\n formatter: null,\r\n },\r\n plotOptions: {\r\n bar: {\r\n animation: false,\r\n pointWidth: 16,\r\n },\r\n series: {\r\n stacking: 'normal',\r\n states: {\r\n hover: {\r\n enabled: false,\r\n },\r\n inactive: {\r\n enabled: false,\r\n },\r\n },\r\n },\r\n },\r\n series: [{\r\n data: [100-score],\r\n color: '#D9D9D9',\r\n }, {\r\n data: [0.2],\r\n color: '#FFFFFF',\r\n }, {\r\n data: [score],\r\n color,\r\n },\r\n ],\r\n };\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nNewAdStrengthScore.propTypes = {\r\n strength: PropTypes.string,\r\n width: PropTypes.number,\r\n};\r\n\r\nNewAdStrengthScore.defaultProps = {\r\n strength: '',\r\n width: 418,\r\n};\r\n","import _ from 'underscore';\r\nimport { getTheme } from '@fluentui/react';\r\nimport { mergeStyles, mergeStyleSets } from '@fluentui/react/lib/Styling';\r\n\r\nconst { palette } = getTheme();\r\n\r\nexport const iconNames = {\r\n met: 'CompletedSolid',\r\n 'half-met': 'AlertSolid',\r\n 'not-met': 'RadioBtnOff',\r\n};\r\n\r\nexport const iconNamesUINext = {\r\n met: 'CompletedSolid',\r\n 'half-met': 'CRMCustomerInsightsApp',\r\n 'not-met': 'CRMCustomerInsightsApp',\r\n};\r\n\r\nconst iconClass = mergeStyles({\r\n fontSize: 16,\r\n marginRight: 6,\r\n verticalAlign: 'text-top',\r\n});\r\n\r\nexport const iconClasses = mergeStyleSets({\r\n met: [{ color: '#107C10' }, iconClass],\r\n 'half-met': [{ color: '#FFB900' }, iconClass],\r\n 'not-met': [{ color: palette.neutralSecondary }, iconClass],\r\n});\r\n\r\nexport const iconClassesUINext = mergeStyleSets({\r\n met: [{ color: '#107C10' }, iconClass],\r\n 'half-met': [{ color: '#0078D4' }, iconClass],\r\n 'not-met': [{ color: '#0078D4' }, iconClass],\r\n});\r\n\r\nexport const styles = {\r\n root: {\r\n borderRadius: 2,\r\n boxShadow: '0px 0.3px 0.9px rgba(0, 0, 0, 0.108), 0px 1.6px 3.6px rgba(0, 0, 0, 0.132)',\r\n margin: '2px 0 32px 0',\r\n padding: '15px 20px',\r\n position: 'relative',\r\n\r\n selectors: {\r\n '& ul.ad-strength-actions': {\r\n listStyleType: 'none',\r\n paddingInlineStart: 0,\r\n },\r\n\r\n '& ul.ad-strength-actions li': {\r\n padding: '2px 0',\r\n lineHeight: '20px',\r\n },\r\n\r\n '& .ad-strength-content': {\r\n display: 'inline-flex',\r\n marginTop: 15,\r\n },\r\n\r\n '& .ad-strength-score': {\r\n marginRight: 16,\r\n textAlign: 'center',\r\n },\r\n\r\n '& .ad-strength-score-vnext': {\r\n marginTop: -10,\r\n marginLeft: -20,\r\n },\r\n\r\n '& .ad-strength-suggestions': {\r\n fontSize: 14,\r\n lineHeight: '20px',\r\n },\r\n\r\n '& .ad-strength-suggestions-detail': {\r\n display: 'block !important',\r\n },\r\n '& .ad-strength-suggestion-detail-tips-item-container': {\r\n display: 'block !important',\r\n },\r\n },\r\n },\r\n};\r\n\r\nexport const getNewAdStrengthStyles = () => ({\r\n container: {\r\n '& .ad-strength-title': {\r\n fontWeight: 600,\r\n '& .icon': {\r\n fontSize: 10,\r\n marginRight: 4,\r\n height: 20,\r\n width: 20,\r\n lineHeight: '20px',\r\n fontWeight: 600,\r\n textAlign: 'center',\r\n borderRadius: '50%',\r\n },\r\n '& .Incomplete': {\r\n color: '#BC0505',\r\n background: '#FDE7E9',\r\n },\r\n '& .Poor': {\r\n color: '#BC0505',\r\n background: '#FDE7E9',\r\n },\r\n '& .Average': {\r\n color: '#D83B01',\r\n background: '#FFF4CE',\r\n },\r\n '& .Good': {\r\n color: '#107C10',\r\n background: '#DFF6DD',\r\n },\r\n '& .Excellent': {\r\n color: '#107C10',\r\n background: '#DFF6DD',\r\n },\r\n },\r\n '& .ad-strength-score-vnext': {\r\n marginTop: 8,\r\n },\r\n '& ul.ad-strength-actions': {\r\n listStyleType: 'none',\r\n paddingInlineStart: 0,\r\n },\r\n '& ul.ad-strength-actions li': {\r\n padding: '2px 0',\r\n lineHeight: '20px',\r\n '& .suggestion-icon': {\r\n fontSize: 16,\r\n marginRight: 6,\r\n verticalAlign: 'text-top',\r\n color: '#0078D4',\r\n },\r\n },\r\n '& .ad-strength-suggestions': {\r\n marginTop: 16,\r\n },\r\n },\r\n cardTitle: {\r\n fontSize: '18px',\r\n display: 'inline',\r\n },\r\n});\r\n\r\nexport const getAdStrengthTopGridStyles = () => ({\r\n container: _.extend({\r\n margin: '16px 16px 16px 32px',\r\n padding: '22px 16px 16px 32px',\r\n width: 'fit-content',\r\n boxShadow: '0px 0.3px 0.9px rgba(0, 0, 0, 0.1), 0px 1.6px 3.6px rgba(0, 0, 0, 0.13)',\r\n borderRadius: '2px',\r\n '& .ad-strengh-panel-title': {\r\n fontSize: '18px',\r\n fontWeight: 900,\r\n paddingBottom: '16px',\r\n },\r\n }, getNewAdStrengthStyles().container),\r\n});\r\n\r\nexport const getPickerListStyles = () => ({\r\n root: {\r\n boxShadow: '0px 3.2px 7.2px 0px rgba(0, 0, 0, 0.132), 0px 0.6px 1.8px 0px rgba(0, 0, 0, 0.108)',\r\n backgroundColor: '#fff',\r\n minWidth: '180px',\r\n '&>li>a': {\r\n color: palette.neutralPrimary,\r\n height: '36px',\r\n lineHeight: '36px',\r\n padding: '0 8px',\r\n whiteSpace: 'nowrap',\r\n display: 'block',\r\n\r\n '&:hover': {\r\n backgroundColor: palette.neutralLighter,\r\n color: '#201f1e',\r\n },\r\n\r\n '&:focus': {\r\n backgroundColor: 'transparent',\r\n color: palette.neutralPrimary,\r\n position: 'relative',\r\n textDecoration: 'none',\r\n outline: `1px solid ${palette.neutralSecondary}`,\r\n },\r\n },\r\n },\r\n pickerTitle: {\r\n padding: '10px 10px 3px 10px',\r\n fontWeight: 'bold',\r\n },\r\n});\r\n\r\nexport const getLLMPickerListStyles = () => ({\r\n root: {\r\n backgroundColor: '#fff',\r\n minWidth: '350px',\r\n position: 'relative',\r\n paddingLeft: 0,\r\n margin: 0,\r\n listStyle: 'none',\r\n '&>li>a': {\r\n color: palette.neutralPrimary,\r\n height: '36px',\r\n lineHeight: '36px',\r\n padding: '0 8px',\r\n paddingLeft: 32,\r\n whiteSpace: 'nowrap',\r\n display: 'block',\r\n\r\n '&:hover': {\r\n backgroundColor: palette.neutralLighter,\r\n color: '#201f1e',\r\n },\r\n\r\n '&:focus': {\r\n backgroundColor: 'transparent',\r\n color: palette.neutralPrimary,\r\n position: 'relative',\r\n textDecoration: 'none',\r\n border: `1px solid ${palette.neutralSecondary}`,\r\n },\r\n },\r\n },\r\n pickerTitle: {\r\n borderTop: '1px solid #f3f2f1',\r\n color: '#323130',\r\n padding: '10px 10px 3px 32px',\r\n fontWeight: 'bold',\r\n },\r\n});\r\n\r\nexport const shimmerWrapperClass = mergeStyles({\r\n padding: 2,\r\n selectors: {\r\n '& > .ms-Shimmer-container': {\r\n margin: '10px 0',\r\n },\r\n },\r\n});\r\n\r\nexport const llmIconClass = mergeStyles({\r\n position: 'absolute',\r\n top: 18,\r\n left: 24,\r\n});\r\n","/* eslint-disable @typescript-eslint/no-shadow */\r\nimport _ from 'underscore';\r\nimport React, { useEffect, useMemo, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { FontIcon } from '@fluentui/react/lib/Icon';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport classNames from 'classnames';\r\nimport { Collapse, TextTitle } from '@bingads-webui-campaign/wizard-jumbo-card';\r\n\r\nimport { NewAdStrengthScore } from './new-ad-strength-score';\r\nimport { getStrengthIcon, newGenerateSuggestion } from './ad-strength-helper';\r\nimport { getNewAdStrengthStyles } from './styles';\r\n\r\nconst suggestionLimit = 5;\r\n\r\nexport function ResponsiveSearchAdStrength(props) {\r\n const {\r\n adItem,\r\n campaignId,\r\n adGroupId,\r\n onFetchAdStrength,\r\n logAdStrength,\r\n i18n,\r\n } = props;\r\n const [adStrength, setAdStrength] = useState();\r\n const [actionItems, setActionItems] = useState([]);\r\n const [priority, setPriority] = useState([]);\r\n const [suggestions, setSuggestions] = useState([]);\r\n const iconName = getStrengthIcon(adStrength);\r\n const { Headlines, Descriptions } = adItem;\r\n const notEmptyHeadlines = useMemo(() => (Headlines ? Headlines.filter(item => item.Asset.Text !== '') : []), [Headlines]);\r\n const notEmptyDescriptions = useMemo(() => (Descriptions ? Descriptions.filter(item => item.Asset.Text !== '') : []), [Descriptions]);\r\n const IsCompleteAd = useMemo(() => (notEmptyHeadlines.length >= 3 && notEmptyDescriptions.length >= 2), [notEmptyHeadlines, notEmptyDescriptions]);\r\n const classes = useDefaultStyles(getNewAdStrengthStyles);\r\n const [activeKeys, setActiveKeys] = useState(['adStrength']);\r\n useEffect(() => {\r\n const rawActionItems = Object.keys(actionItems).map((key, index) => newGenerateSuggestion({\r\n i18n,\r\n actionItem: key,\r\n xValue: actionItems[key],\r\n priority: priority[index],\r\n }));\r\n\r\n const sortedSuggestions=_.sortBy(rawActionItems, suggestion => suggestion.priority || 100);\r\n\r\n setSuggestions(sortedSuggestions.slice(0, suggestionLimit));\r\n }, [Descriptions, Headlines, actionItems, adStrength, i18n, priority]);\r\n\r\n const lazyFetchNewAdStrength = useMemo(() => _.debounce((ad, campaignId, adGroupId, logAdStrength) => {\r\n onFetchAdStrength(ad, campaignId, adGroupId).then((response) => {\r\n const {\r\n Strength,\r\n ActionItemsV2,\r\n Priorities,\r\n } = response;\r\n\r\n setAdStrength(Strength);\r\n setActionItems(ActionItemsV2 ? JSON.parse(ActionItemsV2) : {});\r\n setPriority(Priorities || []);\r\n logAdStrength && logAdStrength({ Strength, ActionItemsV2, Priorities });\r\n });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, 1000), []);\r\n\r\n useEffect(() => {\r\n if (IsCompleteAd && campaignId) {\r\n lazyFetchNewAdStrength({ Headlines: notEmptyHeadlines, Descriptions: notEmptyDescriptions, adId: adItem.Id }, campaignId, adGroupId || '0', logAdStrength);\r\n } else {\r\n setAdStrength('Incomplete');\r\n }\r\n }, [adGroupId, adItem.Id, campaignId, IsCompleteAd, lazyFetchNewAdStrength, logAdStrength, notEmptyDescriptions, notEmptyHeadlines]);\r\n\r\n return (\r\n \r\n \r\n }>\r\n
\r\n { adStrength &&\r\n
\r\n \r\n {adStrength === 'Incomplete'? i18n.getString(_TL_('Incomplete')) : i18n.getString(_TL_(`${adStrength} Performance`))}\r\n
\r\n }\r\n \r\n { adStrength !== 'Excellent' && adStrength !== 'Incomplete' &&\r\n
\r\n
    \r\n {_.map(suggestions, suggestion => (\r\n
  • \r\n \r\n {suggestion.suggestion}\r\n
  • \r\n ))}\r\n
\r\n
\r\n }\r\n { adStrength === 'Incomplete' &&\r\n
\r\n
    \r\n { notEmptyHeadlines.length < 3 &&\r\n
  • \r\n \r\n {i18n.getString(_TL_('Add 3 headlines to start ad strength.'))}\r\n
  • \r\n }\r\n { notEmptyDescriptions.length < 2 &&\r\n
  • \r\n \r\n {i18n.getString(_TL_('Add 2 descriptions to start ad strength.'))}\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\nResponsiveSearchAdStrength.propTypes = {\r\n adItem: PropTypes.shape({\r\n Id: PropTypes.number,\r\n Headlines: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\r\n Descriptions: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\r\n }).isRequired,\r\n\r\n onFetchAdStrength: PropTypes.func.isRequired,\r\n\r\n logAdStrength: PropTypes.func,\r\n\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n\r\n campaignId: PropTypes.number,\r\n\r\n adGroupId: PropTypes.number,\r\n};\r\n\r\nResponsiveSearchAdStrength.defaultProps = {\r\n campaignId: null,\r\n adGroupId: null,\r\n logAdStrength: _.noop,\r\n};\r\n","const getDefaultAsset = (num) => {\r\n const assetList = new Array(num);\r\n const emptyAsset= {\r\n Asset: {\r\n '@odata.type': '#Model.TextAsset',\r\n AssetType: 'Text',\r\n Name: null,\r\n Text: '',\r\n },\r\n PinnedField: 'None',\r\n };\r\n assetList.fill(emptyAsset);\r\n return assetList;\r\n};\r\nexport class AdStrengthRepository {\r\n constructor({\r\n edm,\r\n jsdata,\r\n }) {\r\n this.edm = edm;\r\n this.jsdata = jsdata;\r\n }\r\n\r\n fetchAdStrengthV2(ad, campaignId, adGroupId) {\r\n const params = {\r\n query: {\r\n entitySet: this.edm.currentAccount\r\n .Campaigns.$withKey(campaignId)\r\n .AdGroups.$withKey(adGroupId)\r\n .Ads['Default.GetAdStrengthAndActionItems']\r\n .$call({\r\n ad: {\r\n '@odata.type': '#Model.ResponsiveSearchAd',\r\n Type: 'ResponsiveSearch',\r\n adId: ad.Id,\r\n Headlines: ad.Headlines || getDefaultAsset(5),\r\n Descriptions: ad.Descriptions || getDefaultAsset(2),\r\n },\r\n })\r\n .toJSON(),\r\n },\r\n };\r\n const options = {\r\n cacheResponse: false,\r\n };\r\n return this.jsdata.Ad.findAll(params, options);\r\n }\r\n\r\n fetchAdStrength(ad) {\r\n const params = {\r\n query: {\r\n entitySet: this.edm.currentAccount\r\n .Ads['Default.GetAdStrengthAndActionItems']\r\n .$call({\r\n ad: {\r\n '@odata.type': '#Model.ResponsiveSearchAd',\r\n Type: 'ResponsiveSearch',\r\n adId: ad.Id,\r\n Headlines: ad.Headlines,\r\n Descriptions: ad.Descriptions,\r\n },\r\n })\r\n .toJSON(),\r\n },\r\n };\r\n const options = {\r\n cacheResponse: false,\r\n };\r\n return this.jsdata.Ad.findAll(params, options);\r\n }\r\n}\r\n","/* eslint-disable jsx-a11y/anchor-is-valid, no-param-reassign */\r\nimport React, { useCallback, useEffect, useRef } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport _ from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { cloneDeep } from '@bingads-webui-universal/primitive-utilities';\r\nimport { FocusLock } from '@bingads-webui-react/focus-lock';\r\nimport { mergeStyles, FontIcon, registerIcons } from '@fluentui/react';\r\nimport { ViewSuggestionType, isViewSuggestionApplied, assetStrMap } from './ad-strength-helper';\r\nimport { getPickerListStyles, getLLMPickerListStyles } from './styles';\r\nimport { adStrengthSuggestionPerspectiveStrings } from './strings';\r\nimport llmIcon from '../media/llm.svg';\r\n\r\nregisterIcons({\r\n icons: {\r\n 'llm-svg': (\"chatgpt-logo\"),\r\n },\r\n});\r\n\r\nconst DKIThemeDefaultName = 'Asset_Theme_For_DKI';\r\n\r\nexport const AdStrengthSuggestionPicker = (props) => {\r\n const {\r\n i18n, target, suggestions, updateItem, hideSuggestionPicker, assetType, displayPostion,\r\n updateSuggestionMeasurement,\r\n } = props;\r\n\r\n const pickerListClass = useDefaultStyles(getPickerListStyles);\r\n const containerStyle = { position: 'absolute', left: `${displayPostion.left}px`, top: `${displayPostion.top}px` };\r\n\r\n useEffect(() => {\r\n const clickedAway = (event) => {\r\n if (!target.contains(event.target) &&\r\n event.target.closest('.ad-strength-suggestion-container') === null\r\n ) {\r\n hideSuggestionPicker();\r\n window.removeEventListener('click', clickedAway);\r\n }\r\n };\r\n const keydown = (event) => {\r\n switch (event.key) {\r\n case 'Escape': {\r\n const pickerContainer = document.querySelector('.ad-strength-suggestion-container');\r\n if (pickerContainer.hasChildNodes()) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n hideSuggestionPicker();\r\n }\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n if (!_.isEmpty(target)) {\r\n window.addEventListener('click', clickedAway);\r\n target.addEventListener('keydown', event => keydown(event));\r\n\r\n return () => {\r\n window.removeEventListener('click', clickedAway);\r\n target.removeEventListener('keydown', keydown);\r\n };\r\n }\r\n\r\n return () => { };\r\n }, [hideSuggestionPicker, target]);\r\n\r\n const addAssetSuggestion = (event, Asset, SuggestionId) => {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n hideSuggestionPicker();\r\n\r\n if (!_.isEmpty(target)) {\r\n updateItem(Asset);\r\n updateSuggestionMeasurement({ applySuggestionIds: [SuggestionId] });\r\n }\r\n };\r\n\r\n const pickerTitle = assetType === ViewSuggestionType.Headline ?\r\n i18n.getString(_TL_('View recommended headlines')) :\r\n i18n.getString(_TL_('View recommended descriptions'));\r\n\r\n updateSuggestionMeasurement({\r\n viewSuggestionIds: _.map(suggestions, suggestion => suggestion.SuggestionId),\r\n });\r\n\r\n return (\r\n \r\n {\r\n suggestions.length > 0 ?\r\n \r\n
    \r\n
  • \r\n {pickerTitle}\r\n
  • \r\n {\r\n suggestions.map(({ SuggestionId, Asset }, index) => (\r\n
  • \r\n addAssetSuggestion(event, Asset, SuggestionId)}\r\n key={SuggestionId}\r\n data-index={index}\r\n >\r\n {Asset || null}\r\n \r\n
  • ))\r\n }\r\n
\r\n \r\n : null\r\n }\r\n
);\r\n};\r\n\r\nAdStrengthSuggestionPicker.propTypes = {\r\n suggestions: PropTypes.arrayOf({\r\n SuggestionId: PropTypes.string.isRequired,\r\n Asset: PropTypes.string.isRequired,\r\n }).isRequired,\r\n target: PropTypes.shape({\r\n addEventListener: PropTypes.func,\r\n removeEventListener: PropTypes.func,\r\n contains: PropTypes.func,\r\n }),\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n assetType: PropTypes.string.isRequired,\r\n updateItem: PropTypes.func.isRequired,\r\n hideSuggestionPicker: PropTypes.func.isRequired,\r\n displayPostion: PropTypes.shape({\r\n left: PropTypes.number.isRequired,\r\n top: PropTypes.number.isRequired,\r\n }).isRequired,\r\n updateSuggestionMeasurement: PropTypes.func.isRequired,\r\n};\r\n\r\nAdStrengthSuggestionPicker.defaultProps = {\r\n target: null,\r\n};\r\n\r\nexport const AdStrengthLLMSuggestionPicker = (props) => {\r\n const {\r\n target, suggestions, perspectives, updateItem, showSuggestionPicker, hideSuggestionPicker, displayPostion,\r\n updateSuggestionMeasurement, autoFocus,\r\n } = props;\r\n\r\n const pickerRef = useRef(null);\r\n const pickerListClass = useDefaultStyles(getLLMPickerListStyles);\r\n const containerStyle = {\r\n position: 'absolute',\r\n left: `${displayPostion.left}px`,\r\n top: `${displayPostion.top}px`,\r\n maxHeight: 180,\r\n overflowY: 'auto',\r\n border: '1px solid #B3B0AD',\r\n borderRadius: 2,\r\n };\r\n\r\n useEffect(() => {\r\n const clickedAway = (event) => {\r\n if (!target.contains(event.target) &&\r\n event.target.closest('.ad-strength-suggestion-container') === null\r\n ) {\r\n hideSuggestionPicker();\r\n window.removeEventListener('click', clickedAway);\r\n }\r\n };\r\n const keydown = (event) => {\r\n switch (event.key) {\r\n case 'Escape':\r\n case 'Tab': {\r\n const pickerContainer = document.querySelector('.ad-strength-suggestion-container');\r\n if (pickerContainer.hasChildNodes()) {\r\n if (event.key === 'Escape') {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n hideSuggestionPicker();\r\n }\r\n break;\r\n }\r\n case 'ArrowDown': {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n showSuggestionPicker(event);\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n if (!_.isEmpty(target)) {\r\n window.addEventListener('click', clickedAway);\r\n target.addEventListener('keydown', event => keydown(event));\r\n\r\n return () => {\r\n window.removeEventListener('click', clickedAway);\r\n target.removeEventListener('keydown', keydown);\r\n };\r\n }\r\n\r\n return () => { };\r\n }, [hideSuggestionPicker, showSuggestionPicker, target]);\r\n\r\n useEffect(() => {\r\n if (pickerRef.current && autoFocus) {\r\n const firstItem = pickerRef.current.querySelector('[role=\"menuitem\"]');\r\n if (firstItem) {\r\n firstItem.focus();\r\n }\r\n }\r\n if (pickerRef.current) {\r\n const keydown = (event) => {\r\n switch (event.key) {\r\n case 'Escape':\r\n case 'Tab': {\r\n hideSuggestionPicker();\r\n if (target) {\r\n target.focus();\r\n }\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n };\r\n const pickerTarget = pickerRef.current;\r\n pickerTarget.addEventListener('keydown', event => keydown(event));\r\n return () => {\r\n pickerTarget.removeEventListener('keydown', keydown);\r\n };\r\n }\r\n return () => { };\r\n }, [autoFocus, hideSuggestionPicker, pickerRef, target]);\r\n\r\n const addAssetSuggestion = (event, Asset, SuggestionId) => {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n hideSuggestionPicker();\r\n\r\n if (!_.isEmpty(target)) {\r\n target.focus();\r\n updateItem(Asset);\r\n updateSuggestionMeasurement({ applySuggestionIds: [SuggestionId] });\r\n }\r\n };\r\n\r\n updateSuggestionMeasurement({\r\n viewSuggestionIds: _.map(suggestions, suggestion => suggestion.SuggestionId),\r\n });\r\n\r\n const iconClass = mergeStyles({\r\n position: 'absolute',\r\n top: 12,\r\n left: 12,\r\n });\r\n\r\n const perspectiveItems = _.map(perspectives, (perspective) => {\r\n const filteredPerspectiveSuggestions = _.filter(suggestions, suggestion =>\r\n suggestion.Perspective.toLowerCase() === perspective.Perspective.toLowerCase());\r\n\r\n const suggestionItems = _.map(filteredPerspectiveSuggestions, (suggestion, index) => (\r\n
  • \r\n addAssetSuggestion(event, suggestion.Asset, suggestion.SuggestionId)}\r\n key={suggestion.SuggestionId}\r\n data-index={index}\r\n >\r\n {suggestion.Asset || null}\r\n \r\n
  • ));\r\n\r\n return (\r\n suggestionItems.length > 0 ?\r\n
      \r\n \r\n
    • \r\n {perspective.Perspective}\r\n
    • \r\n {suggestionItems}\r\n
    :\r\n null\r\n );\r\n });\r\n\r\n return (\r\n \r\n {\r\n suggestions.length > 0 ?\r\n
    \r\n {perspectiveItems}\r\n
    \r\n : null\r\n }\r\n
    );\r\n};\r\n\r\nAdStrengthLLMSuggestionPicker.propTypes = {\r\n suggestions: PropTypes.arrayOf({\r\n SuggestionId: PropTypes.string.isRequired,\r\n Asset: PropTypes.string.isRequired,\r\n }).isRequired,\r\n target: PropTypes.shape({\r\n addEventListener: PropTypes.func,\r\n removeEventListener: PropTypes.func,\r\n contains: PropTypes.func,\r\n focus: PropTypes.func,\r\n }),\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n updateItem: PropTypes.func.isRequired,\r\n showSuggestionPicker: PropTypes.func.isRequired,\r\n hideSuggestionPicker: PropTypes.func.isRequired,\r\n displayPostion: PropTypes.shape({\r\n left: PropTypes.number.isRequired,\r\n top: PropTypes.number.isRequired,\r\n }).isRequired,\r\n updateSuggestionMeasurement: PropTypes.func.isRequired,\r\n perspectives: PropTypes.arrayOf({\r\n Perspective: PropTypes.string.isRequired,\r\n }).isRequired,\r\n autoFocus: PropTypes.bool,\r\n};\r\n\r\nAdStrengthLLMSuggestionPicker.defaultProps = {\r\n target: null,\r\n autoFocus: false,\r\n};\r\n\r\nfunction filterLLMSuggestion(suggestions, assetTypeString, value, assets) {\r\n const filteredTypeSuggestions = _.filter(suggestions.Suggestions, suggestion =>\r\n suggestion.AssetType.toLowerCase() === assetTypeString &&\r\n !_.isEmpty(suggestion.Asset) &&\r\n !isViewSuggestionApplied(assets, suggestion.Asset) &&\r\n !(!_.isEmpty(value) && (!suggestion.Asset.toLowerCase().startsWith(value.toLowerCase()) || suggestion.Asset.toLowerCase() === value.toLowerCase())));\r\n\r\n return filteredTypeSuggestions;\r\n}\r\n\r\nfunction getDisplayPosition(target, container) {\r\n // Calculate the position of the popup relative to the container.\r\n // The container needs to be non-statically positioned, either fixed, relative or absolute\r\n const targetRect = target.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect();\r\n return {\r\n top: (targetRect.bottom - containerRect.top) + 1,\r\n left: targetRect.left - containerRect.left - 1,\r\n };\r\n}\r\n\r\nexport const useAdStrengthSuggestion = ({\r\n container,\r\n i18n,\r\n ref,\r\n llmAssetsSuggestions,\r\n assets,\r\n assetType,\r\n updateItem,\r\n isForVnext,\r\n index,\r\n updateSuggestionMeasurement,\r\n enableDKI,\r\n DKIThemeName,\r\n}) => {\r\n const assetTypeString = assetStrMap[assetType];\r\n const containerElement = document.querySelector(container);\r\n\r\n if (containerElement && containerElement.querySelectorAll('.ad-strength-suggestion-container').length === 0) {\r\n const div = document.createElement('div');\r\n div.className = 'ad-strength-suggestion-container open';\r\n containerElement.appendChild(div);\r\n }\r\n\r\n const hideSuggestionPicker = useCallback(() => {\r\n if (containerElement) {\r\n const pickerContainer = containerElement.querySelector('.ad-strength-suggestion-container');\r\n if (pickerContainer) {\r\n ReactDOM.unmountComponentAtNode(pickerContainer);\r\n }\r\n }\r\n }, [containerElement]);\r\n\r\n useEffect(() => {\r\n const target = ref.current;\r\n let displayPostion = {};\r\n if (containerElement && target) {\r\n displayPostion = getDisplayPosition(target, containerElement);\r\n }\r\n\r\n const showSuggestionPicker = (event) => {\r\n if (event && event.type === 'keydown' && event.key === 'Escape') {\r\n return;\r\n }\r\n\r\n if (!containerElement) {\r\n return;\r\n }\r\n\r\n const assetsCopy = cloneDeep(assets);\r\n assetsCopy[index].Asset.Text = target.value;\r\n\r\n if (_.isEmpty(llmAssetsSuggestions)) { return; }\r\n\r\n if (llmAssetsSuggestions.ModelName === 'Fallback' && !_.isEmpty(llmAssetsSuggestions.Suggestions)) {\r\n llmAssetsSuggestions.Perspectives = [\r\n {\r\n Perspective: assetType === ViewSuggestionType.Headline ?\r\n adStrengthSuggestionPerspectiveStrings.Ad_Strength_Suggestion_Perspective_Headline_Title :\r\n adStrengthSuggestionPerspectiveStrings.Ad_Strength_Suggestion_Perspective_Description_Title,\r\n PitchingPoint: assetType === ViewSuggestionType.Headline ?\r\n adStrengthSuggestionPerspectiveStrings.Ad_Strength_Suggestion_Perspective_Headline_Pitching_Point :\r\n adStrengthSuggestionPerspectiveStrings.Ad_Strength_Suggestion_Perspective_Description_Pitching_Point,\r\n },\r\n ];\r\n _.each(llmAssetsSuggestions.Suggestions, (suggestion) => {\r\n // eslint-disable-next-line no-param-reassign\r\n suggestion.Perspective = assetType === 'headline' ?\r\n adStrengthSuggestionPerspectiveStrings.Ad_Strength_Suggestion_Perspective_Headline_Title :\r\n adStrengthSuggestionPerspectiveStrings.Ad_Strength_Suggestion_Perspective_Description_Title;\r\n });\r\n }\r\n\r\n let filteredSuggestions = filterLLMSuggestion(llmAssetsSuggestions, assetTypeString, target.value, assetsCopy);\r\n let perspectives = llmAssetsSuggestions.Perspectives.sort(perspective => perspective.Perspective);\r\n\r\n if (enableDKI) {\r\n const DKIfilteredSuggestions = filteredSuggestions.filter(suggestion => suggestion.Perspective === DKIThemeDefaultName).slice(0, 2).map(suggestion => ({ ...suggestion, Perspective: i18n.getString(DKIThemeName) }));\r\n const normalfilteredSuggestions = filteredSuggestions.filter(suggestion => suggestion.Perspective !== DKIThemeDefaultName);\r\n filteredSuggestions = [...DKIfilteredSuggestions, ...normalfilteredSuggestions];\r\n perspectives=[{ Perspective: i18n.getString(DKIThemeName), PitchingPoint: '' }, ...perspectives.filter(perspective => perspective.Perspective !== DKIThemeDefaultName)];\r\n }\r\n const autoFocus = event && event.type === 'keydown' && event.key === 'ArrowDown';\r\n\r\n if (filteredSuggestions.length > 0) {\r\n ReactDOM.render(, containerElement.querySelector('.ad-strength-suggestion-container'));\r\n } else {\r\n hideSuggestionPicker();\r\n }\r\n };\r\n\r\n if (!_.isEmpty(target) && (assetType === 'Headlines' || assetType === 'Descriptions') && isForVnext) {\r\n if (target === document.activeElement) {\r\n showSuggestionPicker();\r\n }\r\n target.addEventListener('input', showSuggestionPicker);\r\n target.addEventListener('click', showSuggestionPicker);\r\n target.addEventListener('keydown', showSuggestionPicker);\r\n\r\n return () => {\r\n target.removeEventListener('input', showSuggestionPicker);\r\n target.removeEventListener('click', showSuggestionPicker);\r\n target.removeEventListener('keydown', showSuggestionPicker);\r\n };\r\n }\r\n\r\n return () => { };\r\n }, [assetType, assetTypeString, assets, containerElement, hideSuggestionPicker, i18n, index, isForVnext, llmAssetsSuggestions, ref, updateItem, updateSuggestionMeasurement]);\r\n};\r\n","import _ from 'underscore';\r\nimport React, { useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { FontIcon } from '@fluentui/react/lib/Icon';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport classNames from 'classnames';\r\nimport jsdata from '@bingads-webui-component-legacy/js-data-campaign/index';\r\nimport edmCampaign from '@bingads-webui-component-legacy/edm-campaign/index';\r\n\r\nimport { NewAdStrengthScore } from './new-ad-strength-score';\r\nimport { getStrengthIcon, newGenerateSuggestion } from './ad-strength-helper';\r\nimport { getAdStrengthTopGridStyles } from './styles';\r\n\r\nconst getDefaultAsset = (num) => {\r\n const assetList = new Array(num);\r\n const emptyAsset= {\r\n Asset: {\r\n '@odata.type': '#Model.TextAsset',\r\n AssetType: 'Text',\r\n Name: null,\r\n Text: '',\r\n },\r\n PinnedField: 'None',\r\n };\r\n assetList.fill(emptyAsset);\r\n return assetList;\r\n};\r\n\r\nconst fetchAdStrength = (ad, scope) => {\r\n const { campaignId, adGroupId } = scope.values;\r\n const params = {\r\n query: {\r\n entitySet: edmCampaign.currentAccount\r\n .Campaigns.$withKey(campaignId)\r\n .AdGroups.$withKey(adGroupId)\r\n .Ads['Default.GetAdStrengthAndActionItems']\r\n .$call({\r\n ad: {\r\n '@odata.type': '#Model.ResponsiveSearchAd',\r\n Type: 'ResponsiveSearch',\r\n adId: ad.Id,\r\n Headlines: ad.Headlines || getDefaultAsset(5),\r\n Descriptions: ad.Descriptions || getDefaultAsset(2),\r\n },\r\n })\r\n .toJSON(),\r\n },\r\n };\r\n const options = {\r\n cacheResponse: false,\r\n };\r\n return jsdata.Ad.findAll(params, options);\r\n};\r\n\r\nexport function AdStrengthTopGrid(props) {\r\n const {\r\n adItem,\r\n scope,\r\n i18n,\r\n } = props;\r\n const [adStrength, setAdStrength] = useState();\r\n const [actionItems, setActionItems] = useState([]);\r\n const [priority, setPriority] = useState([]);\r\n const [suggestions, setSuggestions] = useState([]);\r\n const iconName = getStrengthIcon(adStrength);\r\n const classes = useDefaultStyles(getAdStrengthTopGridStyles);\r\n useEffect(() => {\r\n const rawActionItems = Object.keys(actionItems).map((key, index) => newGenerateSuggestion({\r\n i18n,\r\n actionItem: key,\r\n xValue: actionItems[key],\r\n priority: priority[index],\r\n }));\r\n const sortedSuggestions=_.sortBy(rawActionItems, suggestion => suggestion.priority || 100);\r\n\r\n setSuggestions(sortedSuggestions);\r\n }, [actionItems, adStrength, i18n, priority]);\r\n\r\n useEffect(() => {\r\n if (adItem) {\r\n const { Headlines, Descriptions } = adItem;\r\n const notEmptyHeadlines = Headlines && Headlines.filter(item => item.Asset.Text !== '');\r\n const notEmptyDescriptions = Descriptions && Descriptions.filter(item => item.Asset.Text !== '');\r\n fetchAdStrength({ Headlines: notEmptyHeadlines, Descriptions: notEmptyDescriptions, adId: adItem.Id }, scope).then((response) => {\r\n const {\r\n Strength,\r\n ActionItemsV2,\r\n Priorities,\r\n } = response;\r\n\r\n setAdStrength(Strength);\r\n setActionItems(JSON.parse(ActionItemsV2));\r\n setPriority(Priorities || []);\r\n });\r\n }\r\n }, [adItem, scope]);\r\n\r\n return (\r\n \r\n { adStrength &&\r\n
    \r\n
    Ad Strength
    \r\n
    \r\n
    \r\n \r\n {i18n.getString(_TL_(`${adStrength} Performance`))}\r\n
    \r\n \r\n { adStrength !== 'Excellent' &&\r\n
    \r\n
      \r\n {_.map(suggestions, suggestion => (\r\n
    • \r\n \r\n {suggestion.suggestion}\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\nAdStrengthTopGrid.propTypes = {\r\n adItem: PropTypes.shape({\r\n Headlines: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\r\n Descriptions: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\r\n }).isRequired,\r\n scope: PropTypes.shape({}).isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n};\r\n\r\n","/* eslint-disable react/prop-types */\r\n/* eslint-disable jsx-a11y/alt-text */\r\nimport React, { useContext, useCallback } from 'react';\r\nimport classNames from 'classnames';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { Button } from '@fluentui/react-components';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { ScopeContext } from '@bingads-webui-react/scope-service';\r\nimport { getRoutePathById, withSiteMap } from '@bingads-webui-react/with-site-map';\r\n\r\nimport cardBackground from './card-bg.png';\r\nimport rightBackground from './right-bg.png';\r\n\r\nconst getStyles = () => ({\r\n navigateToFullProduct: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n borderRadius: 4,\r\n position: 'relative',\r\n overflow: 'hidden',\r\n boxShadow: '0px 0px 2px 0px rgba(0, 0, 0, 0.12), 0px 2px 4px 0px rgba(0, 0, 0, 0.14)',\r\n padding: 24,\r\n },\r\n content: {\r\n zIndex: 1,\r\n flex: 1,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n },\r\n cardBackground: {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n backgroundImage: `url(${cardBackground})`,\r\n backgroundSize: 'cover',\r\n backgroundPosition: '50% 50%',\r\n opacity: 0.2,\r\n },\r\n rightBackground: {\r\n position: 'absolute',\r\n right: -116,\r\n bottom: 0,\r\n width: 406,\r\n height: 366,\r\n backgroundImage: `url(${rightBackground})`,\r\n backgroundSize: 'contain',\r\n },\r\n title: {\r\n lineHeight: '36px',\r\n fontWeight: 600,\r\n fontSize: 28,\r\n margin: 0,\r\n paddingRight: 73,\r\n },\r\n description: {\r\n fontSize: 14,\r\n lineHeight: '20px',\r\n marginTop: 16,\r\n paddingRight: 150,\r\n flex: 1,\r\n },\r\n});\r\n\r\ninterface INavigateToFullProductProps {\r\n onClick: () => void;\r\n className?: string;\r\n}\r\n\r\nexport const NavigateToFullProduct: React.FC = React.memo(({ className, onClick }) => {\r\n const classes = useDefaultStyles(getStyles);\r\n\r\n const i18n = useContext(I18nContext) as any;\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    {i18n.getString(_TL_('Optimize your business with Microsoft Advertising '))}

    \r\n

    {i18n.getString(_TL_('Explore a broad range of campaign types to help you achieve your goals (including Audience, Lodging, Search-Only, and Shopping campaigns).'))}

    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n});\r\n\r\nNavigateToFullProduct.defaultProps = {\r\n className: '',\r\n};\r\n\r\nconst getCardStyles = () => ({\r\n card: {\r\n position: 'absolute !important',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n backgroundColor: '#fff',\r\n },\r\n});\r\n\r\nexport const NavigateToFullProductCard = withSiteMap(({ siteMap }: { siteMap: object }) => {\r\n const classes = useDefaultStyles(getCardStyles);\r\n const { scope } = useContext(ScopeContext) as any;\r\n const {\r\n campaignId, aid, cid, uid,\r\n } = scope.values;\r\n\r\n const onNavigateToFullProductClick = useCallback(() => {\r\n const route = getRoutePathById(siteMap, 'overview');\r\n const search = `cid=${cid}&uid=${uid}&aid=${aid}&campaignId=${campaignId}`;\r\n const url = `${route}?${search}`;\r\n window.open(url);\r\n }, [aid, campaignId, cid, siteMap, uid]);\r\n\r\n return (\r\n \r\n );\r\n});\r\n","import React, { useCallback, useContext } from 'react';\r\nimport _ from 'underscore';\r\nimport {\r\n Settings16Regular,\r\n PersonAccounts20Regular,\r\n Payment20Regular,\r\n Tag20Regular\r\n} from '@fluentui/react-icons';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { ScopeContext } from '@bingads-webui-react/scope-service';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { ServerContext } from '@bingads-webui-campaign-react/server-context';\r\nimport { Menu, MenuTrigger, MenuButton, MenuItem, MenuList, MenuPopover } from '@fluentui/react-components';\r\n\r\nconst getStyles = () => ({\r\n menu: {\r\n position: 'fixed',\r\n top: 27,\r\n right: 43,\r\n },\r\n menuItem: {\r\n '& .fui-MenuItem__content': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n },\r\n menuItemIcon: {\r\n marginRight: 4,\r\n },\r\n});\r\n\r\nconst getRedirectUrl = (\r\n pageName: 'accountDetail' | 'payment' | 'coupon',\r\n rootUIUrl: string,\r\n { cid, aid, uid }: {cid: string, aid: string, uid: string}\r\n) => {\r\n const search = `cid=${cid}&uid=${uid}&aid=${aid}`;\r\n switch (pageName) {\r\n case 'accountDetail':\r\n return `${rootUIUrl}cc/Settings/Account?${search}`;\r\n case 'payment':\r\n return `${rootUIUrl}cc/PaymentMethods?${search}`;\r\n case 'coupon':\r\n return `${rootUIUrl}cc/Billing/CouponDetails?${search}`;\r\n default:\r\n return '';\r\n }\r\n};\r\n\r\nexport const ManageAccountMenu: React.FC<{}> = React.memo(() => {\r\n const i18n = useContext(I18nContext) as any;\r\n const classes = useDefaultStyles(getStyles);\r\n const serverContext = useContext(ServerContext);\r\n const { scope }: any = useContext(ScopeContext);\r\n const { aid, cid, uid } = scope.values;\r\n const RootUIUrl = _.get(serverContext, ['Urls', 'RootUIUrl'], '/');\r\n const onAccountDetailClick = useCallback(() => {\r\n window.open(getRedirectUrl('accountDetail', RootUIUrl, { aid, cid, uid }));\r\n }, [RootUIUrl, aid, cid, uid]);\r\n const onPaymentClick = useCallback(() => {\r\n window.open(getRedirectUrl('payment', RootUIUrl, { aid, cid, uid }));\r\n }, [RootUIUrl, aid, cid, uid]);\r\n const onCouponClick = useCallback(() => {\r\n window.open(getRedirectUrl('coupon', RootUIUrl, { aid, cid, uid }));\r\n }, [RootUIUrl, aid, cid, uid]);\r\n\r\n return (\r\n \r\n \r\n }>\r\n {i18n.getString(_TL_('Manage account'))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.getString(_TL_('Edit account details'))}\r\n \r\n \r\n \r\n {i18n.getString(_TL_('Edit payment'))}\r\n \r\n \r\n \r\n {i18n.getString(_TL_('View Coupon details'))}\r\n \r\n \r\n \r\n \r\n );\r\n});\r\n","/* eslint-disable react/no-danger */\r\nimport React, { useCallback, useContext } from 'react';\r\nimport _ from 'underscore';\r\nimport $ from 'jquery';\r\nimport classNames from 'classnames';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { Button } from '@fluentui/react-components';\r\nimport { ServerContext } from '@bingads-webui-campaign-react/server-context';\r\nimport {\r\n Call20Regular,\r\n ChatEmpty20Regular,\r\n QuestionCircle20Regular,\r\n PersonSupport20Regular,\r\n} from '@fluentui/react-icons';\r\nimport { ICustomSupportOptions } from '@bingads-webui-campaign-react/sdk-utils';\r\n\r\ndeclare global {\r\n // eslint-disable-next-line no-unused-vars\r\n interface Window { apex_glb: any }\r\n}\r\n\r\nconst getStyles = () => ({\r\n sdkBottomBar: {\r\n },\r\n supportOptionsLine: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n padding: '0 43px',\r\n '&:last-child': {\r\n marginBottom: 24,\r\n },\r\n },\r\n description: {\r\n fontSize: 12,\r\n color: '#616161',\r\n },\r\n buttonSplit: {\r\n height: 20,\r\n borderRight: '1px solid #f2f2f2',\r\n },\r\n});\r\n\r\nexport const SDKBottomBar: React.FC<{}> = React.memo(() => {\r\n const classes = useDefaultStyles(getStyles);\r\n const i18n = useContext(I18nContext) as any;\r\n const serverContext = useContext(ServerContext);\r\n const isCallAvailable = !!_.get(serverContext, ['SupportOptions', 'RequestCallText']);\r\n const isChatAvailable = !!_.get(serverContext, ['SupportOptions', 'IfShowLiveChat']);\r\n const customSupportOptions: ICustomSupportOptions = _.get(serverContext, ['SupportOptions', 'customSupportOptions']);\r\n\r\n const onRequestCallClick = useCallback(() => {\r\n $('#requestCallTrigger').trigger('click');\r\n }, []);\r\n const onSupportChatClick = useCallback(() => {\r\n $('#msSupportChatTrigger').trigger('click');\r\n }, []);\r\n const onBrowserHelpArticleClick = useCallback(() => {\r\n window.open(`${window.apex_glb.EndPoint}/#apex/ads/${window.apex_glb.Language}/60203/-1`);\r\n }, []);\r\n\r\n return (\r\n
    \r\n
    \r\n {(isCallAvailable || isChatAvailable) &&\r\n ${i18n.getString(_TL_('Microsoft Advertising'))}`),\r\n }}\r\n />}\r\n {isCallAvailable && (\r\n )}\r\n
    \r\n {isChatAvailable && (\r\n )}\r\n {(isCallAvailable || isChatAvailable) &&
    }\r\n \r\n
    \r\n {customSupportOptions && (\r\n
    \r\n ${customSupportOptions.headerText}`),\r\n }}\r\n />\r\n {customSupportOptions.supportOptions.map((option) => {\r\n const optionText = option.text || i18n.getString(_TL_('Contact support'));\r\n return (\r\n \r\n );\r\n })}\r\n
    )}\r\n
    \r\n );\r\n});\r\n","/* eslint-disable arrow-body-style */\r\nimport React, { useCallback, useContext, useEffect, useRef } from 'react';\r\nimport classNames from 'classnames';\r\nimport $ from 'jquery';\r\nimport _ from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport { OverviewPagePhase2 } from '@bingads-webui-campaign-react/overview';\r\nimport state from '@bingads-webui-component-legacy/state/index';\r\nimport { ScopeContext } from '@bingads-webui-react/scope-service';\r\nimport { ServerContext } from '@bingads-webui-campaign-react/server-context';\r\nimport { FluentProvider, webLightTheme } from '@fluentui/react-components';\r\nimport { getRoutePathById, withSiteMap, processorSet, processor } from '@bingads-webui-react/with-site-map';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { useCurrentCampaign } from '@bingads-webui-campaign-react/use-current-scope-entity';\r\nimport { getCampaignPageUrl } from '@bingads-webui-campaign-react/shared-app-capi';\r\nimport {\r\n getConversionTrackingCardStyle,\r\n metricPickerStyle,\r\n} from '@bingads-webui-campaign-react/overview-card-styles';\r\nimport { useAssetGroupsData } from '@bingads-webui-campaign-react/asset-performance-card';\r\nimport { ManageAccountMenu } from './manage-account-menu';\r\nimport { SDKBottomBar } from './bottom-bar';\r\nimport { useNavigateToConverstionGoalCreationWorkflow } from './manage-conversion-alert-dialog/use-navigate-to-conversion-goal-creation-workflow';\r\n\r\nconst getStyles = palette => ({\r\n sdkCampaignOverviewPage: {\r\n '& .ba-overview-page': {\r\n maxWidth: 'none',\r\n '& .pmax-overview-page': {\r\n margin: '0 33px 14px 33px',\r\n padding: '0 6px',\r\n },\r\n '& .ba-performance-card-fluent-v2': {\r\n '& .ba-performance-card-metric-picker': {\r\n '& .ba-pc-metric-picker-item': {\r\n maxWidth: 160,\r\n },\r\n },\r\n },\r\n },\r\n '& .overview-card-container': {\r\n '& .view-all-clickLink button.btn': {\r\n border: '1px solid #D1D1D1',\r\n borderRadius: 4,\r\n },\r\n '&.overview-card-container-small': {\r\n width: '50%',\r\n },\r\n '&.navigate-to-full-product': {\r\n '&>.fui-FluentProvider, & .sdk-navigate-to-full-product': {\r\n height: '100%',\r\n paddingBottom: 8,\r\n },\r\n },\r\n },\r\n },\r\n '@global': {\r\n '& .app-shell-tab': {\r\n padding: '0 43px',\r\n },\r\n '& .bingads-campaign-react-tab-bar': {\r\n marginLeft: 0,\r\n '& .subPageMenu-singleItem': {\r\n paddingLeft: 0,\r\n },\r\n },\r\n '& #main': {\r\n display: 'flex',\r\n zIndex: 1032,\r\n flexDirection: 'column',\r\n overflow: 'auto',\r\n '& .app-content-container-grid, & .app-content-container-row, & .app-shell-content': {\r\n display: 'block',\r\n },\r\n '& .app-shell-content': {\r\n overflow: 'visible',\r\n },\r\n '& .performance-card .performance-card-metrics-picker .performance-card-metrics-picker__metric': {\r\n minWidth: 160,\r\n width: 'auto',\r\n },\r\n },\r\n '& .overview-card-backbone-instance .conversion-tracking-card': {\r\n height: '100%',\r\n '& .conversion-tracking-state div.carousel-footer, & .conversion-empty-state': {\r\n paddingBottom: 0,\r\n },\r\n '& .ms-Button.ms-Button--default': {\r\n border: '1px solid #D1D1D1',\r\n borderRadius: 4,\r\n },\r\n },\r\n ...metricPickerStyle,\r\n ...getConversionTrackingCardStyle(palette),\r\n },\r\n});\r\n\r\n\r\nconst useEventBinding = ({ siteMap, rootNodeRef }) => {\r\n const { scope } = useContext(ScopeContext);\r\n const serverContext = useContext(ServerContext);\r\n\r\n const onLocationViewAllButtonClick = useCallback(() => {\r\n const route = getRoutePathById(siteMap, 'sdk-target-settings');\r\n scope.save(route);\r\n }, [siteMap, scope]);\r\n const onManageConversionGoalsClick = useCallback(() => {\r\n // Filter update should be conducted before open the url\r\n setTimeout(() => {\r\n const conversionGoalsGridUrl = getCampaignPageUrl(serverContext, 'conversiongoals');\r\n window.open(conversionGoalsGridUrl);\r\n });\r\n }, [serverContext]);\r\n const navigateToConverstionGoalCreationWorkflow = useNavigateToConverstionGoalCreationWorkflow();\r\n\r\n useEffect(() => {\r\n const rootNode = rootNodeRef.current;\r\n if (rootNode) {\r\n $(rootNode).on('click', '.view-all-clickLink', onLocationViewAllButtonClick);\r\n $(rootNode).on('click', '.conversion-tracking-card .action-button .ms-Button', onManageConversionGoalsClick);\r\n $(document.body).on('click', '.popover-content .see-all-link', onManageConversionGoalsClick);\r\n $(rootNode).on('click', '.conversion-goals-grid .conversion-goals-entity-name a', onManageConversionGoalsClick);\r\n $(rootNode).on('click', '.conversion-tracking-card .conversion-empty-state .entity-links .ms-Button', navigateToConverstionGoalCreationWorkflow);\r\n }\r\n\r\n return () => {\r\n $(rootNode).off('click', '.view-all-clickLink', onLocationViewAllButtonClick);\r\n $(rootNode).off('click', '.conversion-tracking-card .action-button .ms-Button', onManageConversionGoalsClick);\r\n $(document.body).off('click', '.popover-content .see-all-link', onManageConversionGoalsClick);\r\n $(rootNode).off('click', '.conversion-goals-grid .conversion-goals-entity-name a', onManageConversionGoalsClick);\r\n $(rootNode).off('click', '.conversion-tracking-card .conversion-empty-state .entity-links .ms_button', navigateToConverstionGoalCreationWorkflow);\r\n };\r\n }, [navigateToConverstionGoalCreationWorkflow, onLocationViewAllButtonClick, onManageConversionGoalsClick, rootNodeRef]);\r\n useEffect(() => {\r\n $('.app-shell-topBanner').on('click', '.setup-conversion-tracking-action', () => {\r\n navigateToConverstionGoalCreationWorkflow();\r\n });\r\n return () => {\r\n $('.app-shell-topBanner').off('click', '.setup-conversion-tracking-action');\r\n };\r\n }, [navigateToConverstionGoalCreationWorkflow]);\r\n};\r\n\r\nconst useFirstAssetGroup = () => {\r\n const { scope } = useContext(ScopeContext);\r\n const { assetContainers } = useAssetGroupsData();\r\n if (!_.isEmpty(assetContainers) && scope.values.assetGroupId == null) {\r\n const firstAssetGroup = _.first(assetContainers);\r\n scope.append({ assetGroupId: firstAssetGroup.Id });\r\n scope.history.replace({\r\n pathname: scope.history.location.pathname,\r\n search: scope.stringify(),\r\n });\r\n return firstAssetGroup;\r\n }\r\n return null;\r\n};\r\n\r\nconst SDKCampaignOverviewPageInternal = React.memo((props) => {\r\n const {\r\n siteMap,\r\n } = props;\r\n\r\n const { scope } = useContext(ScopeContext);\r\n const {\r\n campaignId,\r\n } = scope.values;\r\n if (campaignId) {\r\n state.set('campaign_id', campaignId);\r\n }\r\n const classes = useDefaultStyles(getStyles);\r\n const rootNodeRef = useRef(null);\r\n useEventBinding({ rootNodeRef, siteMap });\r\n\r\n const currentCampaign = useCurrentCampaign();\r\n\r\n useFirstAssetGroup();\r\n\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n});\r\n\r\nSDKCampaignOverviewPageInternal.propTypes = {\r\n preferenceService: PropTypes.shape({}).isRequired,\r\n siteMap: PropTypes.shape({}).isRequired,\r\n};\r\n\r\nexport const SDKCampaignOverviewPage = withSiteMap(SDKCampaignOverviewPageInternal, [processor.processPath, ...processorSet.basic]);\r\n","import { useCallback, useContext } from 'react';\r\nimport { getCampaignPageUrl } from '@bingads-webui-campaign-react/shared-app-capi';\r\nimport { ServerContext } from '@bingads-webui-campaign-react/server-context';\r\n\r\nexport const useNavigateToConverstionGoalCreationWorkflow = () => {\r\n const serverContext = useContext(ServerContext);\r\n return useCallback(() => {\r\n const url = getCampaignPageUrl(serverContext, 'conversiongoals/create');\r\n window.open(url);\r\n }, [serverContext]);\r\n};\r\n","var pug = require(\"!../../../../../node_modules/.pnpm/pug@2.0.4/node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;pug_html = pug_html + \"\\u003Cdiv class=\\\"recommendation-modal-container\\\"\\u003E\\u003C\\u002Fdiv\\u003E\";;return pug_html;};\nmodule.exports = template;","// @ts-nocheck\r\nimport React from 'react';\r\nimport { useConfirmDialog } from '@bingads-webui-campaign-react/confirmation-dialog-v2';\r\n\r\nexport interface I18n {\r\n getString: (key: string, params?: any) => string\r\n}\r\n\r\nexport interface ProtectedLinkProps {\r\n i18n: I18n;\r\n onNavigation: () => void;\r\n dialogProps: any;\r\n enabled?: boolean;\r\n children: React.ReactNode;\r\n className: string | undefined;\r\n}\r\n\r\nexport const ProtectedLink: React.FC = ({\r\n i18n, onNavigation, children, dialogProps = {}, enabled, className,\r\n}) => {\r\n const [\r\n dialogView,\r\n showDialog,\r\n shouldShow,\r\n ] = useConfirmDialog({\r\n ...dialogProps,\r\n onConfirm: onNavigation,\r\n className: 'external-dialog',\r\n i18n,\r\n });\r\n\r\n const onClick = (e) => {\r\n e.stopPropagation();\r\n if (enabled) {\r\n showDialog();\r\n } else {\r\n onNavigation();\r\n }\r\n };\r\n\r\n return (\r\n
    \r\n {children && React.Children.map(children, child =>\r\n React.cloneElement((child), {\r\n onClick,\r\n }))}\r\n {shouldShow && dialogView}\r\n
    \r\n );\r\n};\r\n\r\nProtectedLink.defaultProps = {\r\n enabled: false,\r\n};\r\n"],"names":["getODataConfig","serverContext","odataPath","hostname","document","location","toLowerCase","indexOf","isLocal","odataToken","Token","oDataToken","concat","ServicesEndpoints","CampaignAPI","oDataPath","getProductScopeData","resolve","options","arguments","length","undefined","campaignId","countryCode","getCampaignCriterions","getProductConditionOptions","getSalesCountryCollection","getDynamicDataFeedOptions","getCategoryFullData","getProductTypeFullData","dataName","bypassCache","cacheResponse","shouldShowPlaceholderStoreIfExists","getCampaignCriterionsOnly","noBMCAccounts","uiServerOptionsKeys","uiServerOptions","_","salesCountry","pUiServer","Promise","resolveUiServer","url","queryify","aid","state","get","cid","uid","extraParam","getBMCAccountsOnly","storeTypes","params","adapter","p","jsdata","Product","find","then","data","_objectSpread","getProductScopeFromUIServer","pOdata","resolveOdata","rejectOdata","reject","instrumentation","startScenario","instrumentationSettings","SCENARIONAME","CreateCampaignObjective","startActivity","ACTIVITYNAME","GetProductScopeForCampaign","GetProductScopeForAccount","logMessage","constants","LOGCATEGORY","TRACE","LOGLEVEL","INFO","oDataConfig","campaignIdString","config","oDataTokenType","applicationName","odata","catch","error","logError","JSON","stringify","IMPACTUSER","True","endActivity","getProductScopeFromOdata","promises","all","mergeData","pData","mergedData","Object","assign","SalesCountryCode","ReportingProps","i18n","PropTypes","formatDate","isRequired","formatPercent","getCurrencySymbol","getString","isReady","parseDate","parseDecimal","instrumentationSchema","scenario","name","value","activity","reactRouterLocation","pathname","search","hash","reactRouterMatch","path","isExact","reactRouterHistory","go","goBack","push","reportList","reportsTree","children","reports","isValidCreateReportId","isValidCategoryId","reportDescription","what","why","reportDefinition","apiKey","description","logger","mark","trace","identityDetails","user","Id","Name","ParentCustomerId","customer","lcid","updateId","permissions","reportSchema","repository","getDetailsByExecutionId","servicesEndpoints","ClientCenterUIAPI","SummaryFooterWrapper","withTrack","SummaryFooter","getPathNamePrefix","isMCC","usePrevious","ref","useRef","useEffect","current","InContextCardBase","props","guid","setInContextRecommendationContent","classes","deps","scope","currentActivity","adDisplayUrlService","dataService","newI18n","campaignType","filterService","channel","hideCard","entityType","reload","applyAllCallback","campaignAdGroups","haveEnoughSpace","overallOptimizationScoreBar","perfMarker","scopeService","useContext","ScopeContext","dataFiltered","useMemo","item","_useState","useState","_useState2","_slicedToArray","index","setIndex","_useState3","_useState4","direction","setDirection","_useState5","_useState6","isAsyncApplyModalOpen","setIsAsyncApplyModalOpen","_useState7","_useState8","isApplyConfirmModalOpen","setIsApplyConfirmModalOpen","_useState9","_useState10","recommendationCount","setRecommendationCount","_useState11","_useState12","pollTask","setPollTask","_useState13","_useState14","onApplyConfirm","setOnApplyConfirm","_useState15","_useState16","onApplyReject","setOnApplyReject","readOnly","isReadOnly","appConfig","shouldRenderInContextRecommendationCard","cardContext","Source","Level","levelAt","Category","CampaignIds","Number","AdGroupIds","adGroupId","logOpportunityEvent","useCallback","_ref","_ref$type","type","action","_ref$context","context","api","ADINSIGHT_LOG_API_NAME","INCONTEXTCARD","typeId","RECOMMENDATION_IDS","position","previousIndex","previousType","ADINSIGHT_LOG_ACTION_TYPE","IMPRESSION","showAsyncApplyModal","poll","closeAsyncApplyModal","stop","showApplyConfirmModal","_ref2","onApply","countRecommendation","_ref2$onReject","onReject","closeApplyConfirmModal","confirmApplyConfirmModal","rejectApplyConfirmModal","handleSelect","selectedIndex","e","handleDownload","version","download","recommendationType","DOWNLOAD","Version","DownloadScope","DOWNLOAD_SCOPE","INDIVIDUAL","renderPitch","pitching","_jsx","TooltipHost","content","directionalHint","DirectionalHint","rightCenter","calloutProps","calloutMaxWidth","className","tooTip","_TL_","renderPagination","carouselIndex","curlyTemplate","pageNumber","pageCount","renderPrevIcon","Glyphicon","glyph","renderNextIcon","viewDetails","set","values","recsrc","save","viewHistory","window","open","getAutoApplyToolTipText","recommendationName","carousel","_jsxs","Carousel","activeIndex","onSelect","controls","indicators","prevIcon","nextIcon","showPrevNextControls","recommendation","model","getSummaryCardModel","currency","pageContext","AccountCurrencyCode","Permissions","combineText","headerMenuItems","NOT_SUPPORT_DOWNLOAD_TYPES","func","HIDE","isOptimizationScoreOn","dynamic","showAutoApply","AUTO_APPLY_TYPES","SUPPORT_ADINSIGHT_AUTO_APPLY_TYPES","isAutoApplyOptIn","Item","SummaryHeader","summary","autoApplyToolTipText","inContextCard","customerId","accountId","showIntermediateView","optimizationScore","cardContent","callback","op","isFromApplyOrDismiss","userAction","APPLY_ACTION_TYPES","UNDISMISS","ACCEPT","ApplyFormModal","isDone","done","classNames","carouselContainer","defaultProps","generateGuid","InContextCard","withGetSummary","withDefaultStyles","_ref$palette","palette","white","themePrimary","extend","getApplyFormStyles","getFeedbackModalStyles","width","height","marginTop","marginRight","flexShrink","flexGrow","display","boxShadow","padding","borderBottom","getHeaderStyles","getIconStyles","paddingLeft","paddingRight","fontSize","textShadow","background","cursor","top","bottom","border","color","right","left","flexDirection","justifyContent","lineHeight","fontWeight","RecommendationModal","_React$PureComponent","_classCallCheck","_callSuper","_inherits","_createClass","key","ReactModal","body","_this$props","this","isOpen","onCancel","closeOnOverlayClick","onRequestClose","shouldCloseOnOverlayClick","overlayClassName","React","ConfirmForm","_this","_len","args","Array","_key","onConfirm","extraAction","title","confirmString","cancelString","onClick","ConfirmFormModal","count","AsyncApplyForm","routeApplyHistory","runInBackground","applyHistoryLink","AsyncApplyFormModal","AsyncBulkAarConfirmForm","loading","stage","generalError","map","errorCode","trim","toUpperCase","_ref$iconFontFamily","iconFontFamily","backgroundColor","zIndex","overflow","outline","transform","borderRadius","fontStyle","fontFamily","marginBottom","black","margin","borderColor","gridTemplateColumns","gridTemplateRows","alignItems","gridColumn","justifySelf","alignSelf","whiteSpace","textOverflow","marginLeft","boxSizing","paddingBottom","minWidth","listStyle","textAlign","opacity","textDecoration","wideCharPattern","RegExp","getLength","str","isString","replace","displayLength","size","strRemaining","schema","remaining","isFinite","maxLength","distinguishWideChar","POSITIVE_INFINITY","intRemaining","RemainingCharsHint","getRemainingCharsHintTextWithSchema","field","vmSchema","ViewmodelSchema","vmField","reduce","split","obj","seg","result","vmFieldSchema","fieldSchema","getRemainingCharsHintText","getTextInputContainerStyles","TextInputContainer","getRemainingCharsStyles","RemainingCharsContainer","ValidatedTextField","withValidation","TextField","RemainingCharsValidatedTextFieldInternal","withControlErrorHandling","withUnvalidatedControlErrors","withError","WrappedComponent","RemainingCharsHOC","setValue","useDefaultStyles","newValidationProps","validationProps","onValidate","validationResult","classnames","noop","displayName","getDisplayName","hoistNonReactStatics","withRemainingChars","RemainingCharsValidatedTextField","RemainingCharsUnvalidatedTextField","maxLengthHint","onChange","defaultValue","localOnChange","event","newProps","withRemainingCharsUnvalidated","ControlledRemainingCharsUnvalidatedTextField","withControlledRemainingCharsUnvalidated","glyphList","text","placementList","remainingWarning","limit","getErrorMessage","getPlacementMessage","placement","hotspots","placements","i","filter","Set","Hotspot","handleChangeTitle","handleChangeTextField","handleChangeGlyph","handleChangePlacement","render","hotspot","showHotspotCount","desc","actionText","uri","textFiledStyles","Dropdown","label","required","selectedKey","bind","errorMessage","styles","enableHotSpotPlacement","HotspotPanel","constructor","super","getData","Title","Description","ActionText","Uri","Glyph","Placement","setState","onUpdateHotspots","AddHotspot","handleRemoveHotspot","splice","validate","missField","isEmpty","any","setError","hotspotStrings","uniq","hideTitle","disableAddhotspot","style","Stack","horizontal","horizontalAlign","FontIcon","iconName","CommandButton","root","iconProps","disabled","getDropdownOptions","itemType","Header","Divider","BoostAnchors","forwardRef","defaultSelectedKey","onUpdate","setSelectedKey","useImperativeHandle","placeholder","option","AssociationType","processImagePlacementsMetadata","baseImageIdStr","baseImageInfo","isImageFittingEnabled","isCombinedMsanAndMmaAspectRatios","imageLevelSettings","propagateToImageLevel","includedPlacements","IsIncluded","excludedPlacements","hasBeenBulkCropped","baseImage","originalUrl","src","hasPlacementSettings","placementSettings","pluck","cachedDeserializedMetadataById","effectSettings","cachedValue","deserializeMetadata","deserializeImageAssetMetadata","Metadata","IdString","effectSrc","Src","setEffectSettings","originalSrc","BaseImage","setSrc","setBaseImage","clone","EffectSettings","updatePlacementWithBaseCropSettings","mtImgObject","IsCroppingbasedOriginal","setCroppingType","updatePlacementWithPlacementSettings","updatePlacementSettings","isMaunalCropped","isMultimediaAd","isMultimediaAdinMSANEnabled","DefaultKey","containMetadata","metadata","getMetadataKey","findMetadata","dict","id","metadataKey","toString","subTypeToType","getMTAssetBaseId","asset","imageToUrlMap","baseId","generateMTAssetWithOriginalImage","originalAssets","assets","originalAssetsFor191x100AspectRatio","SubType","Image191x100","assetsV1","payloadV1","payloadV2","CropHeight","CropWidth","CropX","CropY","generateMTAssetV2","getMultiImages","isV2Format","isMMAV2Enabled","OriginalImage","shouldConvertAssetToV2Format","imageGroupByType","multiImages","isAdCreatorEnabled","keys","imagesExperience","originalImageToCrop","Width","Height","source","sourceType","isRecommendedImage","isBoost200x100ImageEnabled","isBoostNewAspectRatioSupportEnabled","image","mtAsset","Type","BaseId","compareBaseImage","cs","isIncluded","isLogo","assetExtraInfo","String","croppingType","CroppingType","ManualCrop","cropSettings","SourceX","SourceY","SourceWidth","SourceHeight","idString","altText","AltText","originCropSetting","cropSettingOnOriginal","originalWidth","originalHeight","associationType","getImageProps","CropSettings","setIncluded","landscapeFound","getLandscapeImage","originalImageFound","getOriginalImage","copyEffectsFromOther","aspectRatios","getAspectRatios","imageOption","defaultImageOption","minSize","imageExperience","images","getMMAPayloadV2","flattenedImageList","imageIdsUpdatesByIndex","includedImageListByType","memo","overrideInfo","finalIdString","shouldIgnoreThisAlgorithm","payload","imageWithUpdateListOfThisType","keep","checkType","landscapeImageList","nonLandscapeImageListOfOneType","landscapeSize","orderedLandscapeImageList","orderedNonLandscapeImageListOfOneType","ratio","aspectRatio","landscapeImageFinalId","landscapeImage","imageOfThisTypeId","imageOfThisType","autoCroppedSettings","isCropSettingsEqual","originalCropSettings","originalImageCropSettings","checkIfShouldKeepImageType","mtModelArr","formatToSave","parseInt","getImageTypesWithOrder","logoSubtypes","portraitSubtypes","imageAssetCenterCrop","_getCenterCroppedSett","getCenterCroppedSettings","uploadRecommendImage","_x","_x2","_x3","_uploadRecommendImage","apply","_asyncToGenerator","_regeneratorRuntime","_callee","recommendAssetIdImageUrlMap","odataRootUrl","imagesWithoutId","urls","imageRepository","ids","wrap","_context","prev","next","DependencyResolver","Asset","ImageUrl","ImageRepository","bulkSaveImagesByUrl","sent","getImageByIdAsync","imageInfo","finally","abrupt","IsRecommendedImage","disableEdit","DisableEdit","getImageTasks","mTAssetArrays","baseURL","imageIdsToFetch","imageId","response","Url","c","getAllImagesInfoFromMTAssets","imageInfoArr","_toConsumableArray","existingIds","baseAssetArrays","compact","difference","baseImageInfos","_defineProperty","SourceType","BaseIdString","OriginalUrl","CropSettingOnOriginal","PlacementSettings","OriginalHeight","OriginalWidth","roiInfo","ROIInfo","autoFillMissingImageIdAndSizeFromRecommendation","mTAsset","ImageHeight","ImageWidth","getMultiImagesFromMTAssetsAsync","isImproveMMA","isBoostPortraitImageEnabled","logoExperiences","logoGroup","ass","includes","imageOptionKeys","Logo","aspectRatioOption","maxCropBox","getLogoExperience","imageAsset","portraitExperiences","portraitGroup","Portrait","isPortraitImage","getPortraitExperience","imageExperiences","setROIInfo","getImagesFromMTAssetsAsync","isStoreAppProng","isStoreAppSpotLight","isStoreAppTransparentLogo","isLinkedInAd","isPMaxAspectRatiosV2Enabled","imageTypesWithOrder","imageObjArr","ImageExperienceImage","sort","imageObj1","imageObj2","buildAssetModels","mmaAspectRatios","imageObjArrById","imageObj","category","previousPlacements","logo","groupImageObjectsByBaseImage","_ref5","imageArr","baseImageId","match","missingTypes","autoCroppedImages","getAutoCroppedImages","Image","imagesToReturn","croppedImage","savedImage","autoFillMissingImagesAsync","MMAAssetConfigs","MAX_HEADLINES","DEFAULT_HEADLINES","MIN_HEADLINES","MAX_LONGHEADLINES","DEFAULT_LONGHEADLINES","MIN_LONGHEADLINES","MAX_DESCRIPTIONS","DEFAULT_DESCRIPTIONS","MIN_DESCRIPTIONS","MAX_HEADLINE_SUGGESTIONS","MAX_DESCRIPTION_SUGGESTIONS","MAX_BUSINESS_NAME","headlineFields","longHeadlineFields","descriptionFields","AdEditFields","omitDeletedParameters","formattedParams","forEach","omit","convertFromAdModel","ad","processImages","isArray","Headlines","headlines","val","idx","results","Text","longHeadlines","descriptions","CallToAction","cta","language","CallToActionLanguage","adModel","LongHeadlines","Descriptions","Videos","videos","video","newVideoFromMTObject","Images","ImageList","ImageAssets","convertFromBulkResponse","parse","mapAssets","fields","viewModel","convertToAdModelInResponse","headline","longHeadline","processViewModelDataForSaving","adId","adData","defaults","UrlCustomParameters","param","Key","MobileFinalUrls","isEmptyUrl","convertToAdModel","Campaign","AdGroup","getFlattenedImageAssetList","imageList","filteredImageList","imageArray","getMmaAspectRatios","getMMAImageList","flattenImageList","removeRatioTypeInId","getImagesDataModel","flattenedImageAssetList","updates","flattenedImageAssetsPayload","UiUnsupportedRatios","imagesModel","UIUnSupportedImagesModel","association","charAt","substring","setMTImageModel","originalData","portraitImage","portraitImagePayload","updateAssetsIdsAsync","imageIndexAsThumbnail","imageOData","assetList","assetPositionsToUpdate","newAssets","existingMetadataIdMapping","original","isProcessed","bingSrc","serializeImageAssetMetadata","isEffectEdited","found","isMetadataExisting","FinalSrc","code","errors","Error","_newAssets$index","insertMetadata","foundInfo","thumbnailAsset","processImageListViewModelToModel","flattenedIncludedImageAssetList","imageToGenerateThumbnail","originalThumbnailAsset","copyThumbnailLookToNewImage","mtModel","EditableImageButton","imageItem","onEdit","tooltipId","useId","buttonId","useConst","gapSpace","target","useInlineCopilotUIStyles","makeStyles","popover","paddingTop","groupHeader","menuItem","SparkleMenuButton","onChangeBackgroundScene","onMeuOpenChange","FluentProvider","theme","webLightTheme","Menu","closeOnScroll","onOpenChange","MenuTrigger","triggerprops","CopilotIconSelected","alt","CopilotIcon","MenuPopover","MenuList","MenuGroup","MenuGroupHeader","MenuItem","TryBackgroundIcon","logSignal","message","signal","isPortrait","ResponsiveImageListView","_event","isAddButton","onSelectImage","onRemove","showCopilotOption","onRemoveImage","currentTarget","dataset","imageid","onEditImage","addButtonChoiceOption","visibility","ariaLabel","onRenderLabel","onRenderField","onAddImage","testRef","that","_this2","getKeyForImageItem","contentWidth","contentHeight","desiredImageWidth","desiredImageHeight","imageSrc","isLandscapeLogoMedia","midPointOffsetX","Math","ceil","midPointOffsetY","selectedImageWrapper","imageWrapper","landscapeLogoRatio","C","landscapeLogoMarginTop","Image4x1","landscapeLogoShowHeight","landscapeLogoTop","innerField","imageCropSettings","desiredCropWidth","desiredCropHeight","cropImageWidth","cropImageHeight","cropRatio","xscale","yscale","_this2$props","enableEdit","selectedImageSrc","imageSize","setOpen","setClarityTag","HoverResponsiveImageListView","onMouseEnter","handleMouseEnter","onMouseLeave","handleMouseLeave","portalContainer","blocking","choiceGroupOptions","getChoiceGroupOption","isRenderAddInImageList","renderContent","UiBlocker","loadingText","ChoiceGroup","currentSelectedImageId","onRemoveAllImages","role","ReactDOM","pathLengthLimitErrorMessages","AD_TYPE_RSA","adsFields","adsFieldAlias","adsFieldLengthLimitMap","FinalUrls","Path1","Path2","DisplayUrl","TrackingUrlTemplate","FinalUrlSuffix","UrlCustomParametersKey","UrlCustomParametersValue","notI18n","validateTextFieldValue","lengthLimit","optional","adType","getCharCountExcludingAdCustomizers","validateTextField","fieldName","validatePath","Property","Message","ErrorContext","property","_useContext","onFirstErrorHandler","alertRef","filteredErrors","Index","Code","join","contentStyles","contentContainerStackToken","childrenGap","urlFieldStackToken","pathFieldStackToken","actionStackToken","errorStackToken","textFieldStyles","charCountDescription","dynamicLinkContainer","dynamicLink","selectors","inputClassName","containerStyles","container","minHeight","maxWidth","borderTop","input","preview","contentContainer","overflowY","overflowX","urlPath","flexFlow","wordBreak","stickyAdPreviewStyles","DynamicTextExtention","onTextFieldChange","showContextualMenu","setShowContextualMenu","setTarget","linkRef","onShowContextualMenu","preventDefault","onHideContextualMenu","menuItems","Link","componentRef","ContextualMenu","items","hidden","onItemClick","onDismiss","BaseTextField","configProps","updateItem","adsFieldId","allowNewLines","showCharRemaining","showErrorMessage","isForVnext","updateSuggestionMeasurement","showDynamicTextExtention","onBlur","llmAssetsSuggestions","containerSelector","enableDKI","DKIThemeName","setCachedValue","restProps","_objectWithoutProperties","_excluded","charLimit","charRemaining","setCharRemaining","inputRef","debouncedUpdateItem","textValue","populatedWithFullValue","newValue","dynamicErrorMessage","focus","onBlurCheck","activeElement","onRenderDescription","Label","useAdCustomizers","updateAction","useAdStrengthSuggestion","assetType","autoComplete","component","_textElement","validateOnLoad","gapCompensation","campaignWebsite","isAutoAdsEnabled","Path1Field","Path2Field","DisplayUrlField","UrlPath","IsVanityUrlEnabled","_value","urlDomain","getDomain","onTextChange","tokens","verticalAlign","partial","urlPrefixOptions","UrlInput","UrlTextField","_useMemo","getUrlPrefixAndDestination","_useMemo2","urlPrefix","urlWithoutPrefix","setKey","onUrlPrefixChanged","newItem","getUpdatedFullUrlOnPrefixUpdate","getUpdatedFullUrlOnTextUpdate","dropdownLabel","grow","RSAPreviewGroupType","AdPlacementKeys","previewLayoutConfig","groupsDefinitions","groupType","placementFilterPredicate","tmp","ResponsiveSearchAdPreviewUAPLUnstyled","_ref$data","disclaimerInfo","setHeadline","setDescription","urlPath1","setUrlPath1","urlPath2","setUrlPath2","finalUrl","contains","displayUrl","GroupsPreviewer","useGroupsPreviewerLayout","headerButtonProps","onAddAspectRatio","onRemoveAspectRatio","evaluateAdCustomizers","getTitlePreview","evaluatedText","getDescPreview","LineText","decoratorsData","disclaimer","imageExtension","enableCrop","RSAImageExtensionCrop","adPreviewContainer","ResponsiveSearchAdPreviewUAPL","formatRSAObject","adItem","adObject","h","AssetType","PinnedField","d","formatRankingTexts","assetValues","textArr","formatAssetRankingTexts","PinButton","getPinItems","pinnedPosition","pinItems","selectedText","onMenuItemClick","onMenuClick","pickerContainer","querySelector","menuIconProps","menuProps","registerIcons","icons","pinIcon","textAssetsStyles","deleteButton","newPositionDeleteButton","newDeleteButton","newPositionPinButton","newPinButton","pinButton","textAssetsStackToken","TextAssetFields","Headline","deleteIcon","recommendationAssetTypeMap","recommendationAssetTypePluralMap","getStyles","copilotButton","TextAssets","showDeleteButton","showCopilotButton","finalUrlWithoutPrefix","existingAssets","onSuggestionsRendered","isNewTextAssetsButtonStyle","copilotButtonLabel","defaultSize","deleteButtonLabel","inputLabel","itemProperty","maxSize","RecommendationContext","recommendationContext","_recommendationContex","postAssetEventLog","themes","copilotTracking","_useEventLog","useEventLog","logTextAssetMenuOpen","logTextAssetDialogOpen","logRefineTextAsset","logTextAssetApplied","logRemoveSingleAsset","logEditSingleAsset","cachedAssets","setCachedAssets","slice","filledAssets","onAddAsset","deletedAsset","pluralAssetType","isInRemainingInitialSuggestions","removeInitialSuggestion","recommendationId","first","onTextBlur","onPinChange","onDeleteAsset","isPinningEnabled","TextAsset","itemClassName","CopilotDKIRecommendation","CopilotTextAssetRecommendation","currentIndex","disableReason","EMPTY_ASSET_HINTS","NO_FINAL_URL_HINT","menuButtonAriaLabel","onMenuOpen","onOperationDialogOpen","onFetch","newAsset","operationName","ActionButton","allowDisabledFocus","addLabel","Disclaimer","showAdvancedInformation","SearchCampaignCreationRevamp","DisclaimerLayout","headlinesConfig","errorMap","lessThanRequired","duplicate","lessPosition","descriptionsConfig","adFieldsConfig","assetsConfig","DestinationUrl","MobileUrl","ResponsiveSearchAdCopilotBannerWithDialog","eventLog","isCopilotEnabled","onDialogFetchAssetsSucceeded","onFetchFailed","onFetchSucceeded","onReset","logBannerRefresh","logBannerRefreshCompleted","logFetch","logFetchSucceeded","showCopilotDialog","setShowCopilotDialog","handleCopilotDialogClose","handleRefresh","handleFetchThemesSucceeded","themesList","handleApply","selectedThemes","selectedThemesAndAssets","CopilotRecommendationBanner","isToastEnabled","onRefresh","onBannerRefreshCompleted","shouldFetchRecommendations","CopilotThemesRecommendationDialog","onClosed","onFetchAssetsSucceeded","adsFieldsToValidate","optionalFields","requiredCompoundFields","textAssets","fieldMappings","fieldDependencies","validators","validateTrackingUrlTemplate","validateFinalUrlSuffix","validateUrlCustomParameters","useStyles","ResponsiveSearchAdEditorBase","onSave","onChanged","onFetchAdStrengthV2","onFetchDisclaimerInfo","showActionBar","showInitialErrors","timeZone","AdPreviewComponent","token","triggerTestUurl","showUurlTestTool","showFinalUrlSuffix","showAdCustomizers","edmCampaign","jsDataCampaign","renderImageExtension","injectSetPreviewImage","editMode","saveLogAppliedSuggestionsFunc","saveAssetLibraryEventHandler","isSaving","isCanceling","activityLogger","InstrumentationContext","initializeAdCustomizer","cachedAd","setCachedAd","cachedValuesForImageSuggestions","setCachedValuesForImageSuggestions","clientErrors","formErrors","setFormErrors","errorContextValue","hasErrorInUrl","finalUrlPrefix","finalUrlForRecommendation","urlField","getId","mobileUrlField","pathField","displayUrlField","isInExclusionList","setIsInExclusionList","setDisclaimerInfo","hasDisclaimer","setHasDisclaimer","previewImage","setPreviewImage","setLLMAssetsSuggestions","_useState17","_useState18","activeKeys","setActiveKeys","shortHeadlines","singleItem","_useContext2","setRecommendationContext","_useCopilotRecommenda","useCopilotRecommendations","entityId","logRecommendationsAPIError","resetRecommendations","_useCopilotForRespons","setIsCopilotEnabled","sendCopilotBannerNotification","useBannerService","send","isCopilotRegionRestricted","feature","isRestricted","useCopilotForResponsiveSearchAd","assetLibraryEventHandler","useAssetLibraryEventHandler","logEnterFlow","logBannerGenerated","logFetchAssetsSucceeded","logApplyThemes","logSuggestionsViewed","logSuggestionsApplied","logRefineTextAssetSucceeded","logPrefillAssets","logPrefillAssetsApplied","logPrefilledAdStrength","logRemoveAssets","_useCopilotRecommenda2","useCopilotRecommendationSurvey","AssetEventFeature","RSA","triggerSurveyOnSubmit","triggerSurveyOnCancel","_useState19","_useState20","isPrefilled","setIsPrefilled","_useState21","_useState22","shouldLogPrefilledAdStrength","setShouldLogPrefilledAdStrength","_useState23","_useState24","applyHeadlinesCallback","setApplyHeadlinesCallback","_useState25","_useState26","applyDescriptionsCallback","setApplyDescriptionsCallback","logPrefilledAdStrengthCallback","adStrength","initialSuggestionsData","_getCopilotRecommenda","getCopilotRecommendationIdsFromThemes","descriptionRecommendationIds","headlineRecommendationIds","AdStrengthTestingNoPrefill","newThems","DKITheme","normalThemes","newHeadlines","getUniqueAssetsFromThemes","trackInitialSuggestions","AssetPropertyName","HEADLINE","newDescriptions","DESCRIPTION","displayedDescriptions","MAX_INLINE_RECOMMENDATIONS_PER_PAGE","displayedHeadlines","displayedTextAssets","viewedTextSuggestionIds","getUntrackedViewedSuggestionIds","trackViewedSuggestionIds","_ref2$suggestedAdExte","suggestedAdExtensions","logCopilotRecommendations","assetGroup","ext","isEditing","handleCopilotBannerFetchSucceeded","assetsResponse","IsCustomerIdInExclusionList","trackReturnedTextAssets","RecommendedAssets","formattedThemesAndAssets","Themes","getFormattedThemeForApplying","imageAssets","getFormattedImage","onApplyCopilotRecommendation","handleFetchAssetsSucceeded","assetsRecommendationData","handleTextAssetSuggestionsRendered","textSuggestions","textSuggestionIds","formatRecommendationsToLLMSuggestions","formatToLLMSuggestion","newErrors","errorFields","activeField","shouldValidateAllFields","f","dependantField","aliasField","incomplete","adField","isOptional","hasError","fieldValue","_getUrlPrefixAndDesti","destination","validateAdUrl","displayUrlError","availableAssets","a","unpinnedSize","validateTextAssets","_newErrors","errorList","isCompoundFieldRequired","isFieldEmpty","onClearTextAssets","validatedItem","acc","removeAllInitialSuggestions","onUpdateItemByKey","prevCachedAd","updatedData","onDebouncedUpdateItemByKey","onItemBlurBykey","fieldToUpdate","_computeRankingTextsU","currentAssets","prevAssetsRankingTexts","rankingTexts","needUpdate","computeRankingTextsUpdates","onUpdateFinalUrlPrefix","evt","newPrefix","onUpdateFinalUrlValue","onSaveClicked","onCancelClicked","copilotSuggestions","disclaimerData","RSANewCopilotUI","Provider","PermissionsContext","errorProperties","renderCardError","properties","renderCardTitle","icon","helpId","TextTitle","titleKey","iconAltText","topicKey","as","headingClassName","fullUrl","onUpdateUrlPrefix","onUpdateUrlValue","CopilotRepositoryProvider","locale","getLocale","Collapse","Panel","UrlIcon","htmlFor","HelpPopupInline","topic","TextIcon","HeadlineAssetCollection","DescriptionAssetCollection","ImageIcon","DisclaimerIcon","UrlOptionsParameters","trackingUrlTemplate","finalUrlSuffix","urlCustomParameters","PrimaryButton","DefaultButton","renderLeftColumnWithNewCopilotUI","AdStrengthTestingNoPanel","ResponsiveSearchAdStrength","onFetchAdStrength","logAdStrength","urlOptionsElement","ResponsiveSearchAdEditor","withActivityContext","withBannerService","withRecommendationContext","Adapter","AdapterFactory","convertEventToValue","functionToInject","validatedTextField","ValidatedTextFieldWithErrors","TextFieldWithAdCustomizerInternal","validator","newData","ValidatedTextFieldWithAdCustomizer","adStrengthSuggestionPerspectiveStrings","NewStrengthScore","Incomplete","Poor","Average","Good","Excellent","StrengthColor","StrengthIcon","ViewSuggestionType","assetStrMap","getStrengthIcon","strength","newGenerateSuggestion","suggestion","actionItem","xValue","priority","x","keywordList","y","NewAdStrengthScore","score","getNewStrengthScore","getStrengthColor","chart","xAxis","visible","yAxis","tickPositions","legend","enabled","credits","tooltip","formatter","plotOptions","bar","animation","pointWidth","series","stacking","states","hover","inactive","HighchartReactWrapper","getTheme","iconClass","mergeStyles","getNewAdStrengthStyles","mergeStyleSets","met","neutralSecondary","listStyleType","paddingInlineStart","cardTitle","getAdStrengthTopGridStyles","getPickerListStyles","neutralPrimary","neutralLighter","pickerTitle","getLLMPickerListStyles","suggestionLimit","setAdStrength","actionItems","setActionItems","setPriority","suggestions","setSuggestions","notEmptyHeadlines","notEmptyDescriptions","IsCompleteAd","rawActionItems","sortedSuggestions","lazyFetchNewAdStrength","Strength","ActionItemsV2","Priorities","getDefaultAsset","num","fill","AdStrengthRepository","edm","query","entitySet","currentAccount","Campaigns","$withKey","AdGroups","Ads","$call","toJSON","Ad","findAll","llmIcon","DKIThemeDefaultName","hideSuggestionPicker","displayPostion","pickerListClass","containerStyle","clickedAway","closest","removeEventListener","keydown","hasChildNodes","stopPropagation","addEventListener","viewSuggestionIds","SuggestionId","FocusLock","onExit","focusFirstItemOnMount","href","applySuggestionIds","addAssetSuggestion","AdStrengthLLMSuggestionPicker","perspectives","showSuggestionPicker","autoFocus","pickerRef","maxHeight","firstItem","pickerTarget","perspectiveItems","perspective","filteredPerspectiveSuggestions","Perspective","suggestionItems","filterLLMSuggestion","assetTypeString","filteredTypeSuggestions","Suggestions","suggestionContent","isViewSuggestionApplied","startsWith","containerElement","querySelectorAll","div","createElement","appendChild","targetRect","getBoundingClientRect","containerRect","getDisplayPosition","assetsCopy","cloneDeep","ModelName","Perspectives","PitchingPoint","filteredSuggestions","DKIfilteredSuggestions","normalfilteredSuggestions","fetchAdStrength","_scope$values","AdStrengthTopGrid","navigateToFullProduct","flex","cardBackground","backgroundImage","backgroundSize","backgroundPosition","rightBackground","NavigateToFullProduct","I18nContext","Button","appearance","getCardStyles","card","NavigateToFullProductCard","withSiteMap","siteMap","onNavigateToFullProductClick","getRoutePathById","menu","menuItemIcon","getRedirectUrl","pageName","rootUIUrl","ManageAccountMenu","RootUIUrl","onAccountDetailClick","onPaymentClick","onCouponClick","MenuButton","sdkBottomBar","supportOptionsLine","buttonSplit","borderRight","SDKBottomBar","isCallAvailable","isChatAvailable","customSupportOptions","onRequestCallClick","trigger","onSupportChatClick","onBrowserHelpArticleClick","apex_glb","EndPoint","Language","dangerouslySetInnerHTML","__html","headerText","supportOptions","optionText","sdkCampaignOverviewPage","metricPickerStyle","getConversionTrackingCardStyle","useEventBinding","rootNodeRef","ServerContext","onLocationViewAllButtonClick","route","onManageConversionGoalsClick","setTimeout","conversionGoalsGridUrl","getCampaignPageUrl","navigateToConverstionGoalCreationWorkflow","useNavigateToConverstionGoalCreationWorkflow","rootNode","$","on","off","SDKCampaignOverviewPageInternal","currentCampaign","useCurrentCampaign","assetContainers","useAssetGroupsData","assetGroupId","firstAssetGroup","append","history","useFirstAssetGroup","OverviewPagePhase2","isSDK","SDKCampaignOverviewPage","processor","processPath","processorSet","basic","module","exports","locals","pug_html","ProtectedLink","onNavigation","dialogProps","dialogView","showDialog","shouldShow","child"],"sourceRoot":""}