{"version":3,"file":"static/js/application.initial~4e189eca.36618d98.js","mappings":"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","sources":["../../../node_modules/@bingads-webui-campaign/global-app-init/src/constants.js","../../../node_modules/@bingads-webui-campaign/global-app-init/src/omniture.js","../../../node_modules/@bingads-webui-campaign/global-app-init/src/query-param-checker.js","../../../node_modules/@bingads-webui-campaign/global-app-init/src/global-init.js","../../../node_modules/@bingads-webui-campaign/grid-customized-popup-editor/src/get-position.js","../../../node_modules/@bingads-webui-campaign/grid-customized-popup-editor/src/view.js","../../../node_modules/@bingads-webui-campaign/global-context-store/src/global-context-store.ts","../../../node_modules/@bingads-webui-campaign/global-context-store/src/global-context-receiver.tsx"],"sourcesContent":["export function redirectToLogin(serverContext) {\r\n const { Urls: { SignOutUrl } = {} } = serverContext;\r\n\r\n window.location.href = SignOutUrl ||\r\n `${window.location.protocol}//${window.location.host}/default.aspx?reason=1&msg=sessionexpired`;\r\n}\r\n\r\nconst prodEnvs = [\r\n // CMUI\r\n 'ui.bingads.microsoft.com',\r\n 'ui.beta.bingads.microsoft.com',\r\n 'ui.ads.microsoft.com',\r\n 'ui.beta.ads.microsoft.com',\r\n // CCUI\r\n 'bingads.microsoft.com',\r\n 'beta.bingads.microsoft.com',\r\n 'ads.microsoft.com',\r\n 'beta.ads.microsoft.com',\r\n];\r\n\r\nexport function isTestEnvironment(envToCheck) {\r\n return prodEnvs.indexOf(envToCheck) === -1;\r\n}\r\n\r\nexport function isSignupRunningProxy() {\r\n return window.location.port === '12000' && window.location.host === 'ads-int.microsoft.com';\r\n}\r\n\r\nexport const PROJECTS = {\r\n DMC: 'DMC',\r\n UP: 'UP',\r\n CAMPAIGN_UI: 'CAMPAIGN_UI',\r\n SMART: 'SMART',\r\n SMART_PAGE: 'SMART_PAGE',\r\n UP_SUPPORT: 'UP_SUPPORT',\r\n SUB_ADS_LANDING: 'SUB_ADS_LANDING',\r\n DSP: 'DSP',\r\n SELLER_FORUM: 'SELLER_FORUM',\r\n STREAMLINED_SIGNUP: 'STREAMLINED_SIGNUP',\r\n PMAX_LITE_SIGNUP: 'PMAX_LITE_SIGNUP',\r\n PMAX_LITE_LANDING: 'PMAX_LITE_LANDING',\r\n OMS: 'OMS',\r\n};\r\n\r\n// All MS Ads products use the same clarity ID\r\nconst PROD_CLARITY_ID = '4jwlwd615c';\r\nconst TEST_CLARITY_ID = '6vo4jbalnn';\r\n\r\n// from clarity.microsoft.com\r\nexport const CLARITY_IDS = {\r\n [PROJECTS.DMC]: '4w966avnz2',\r\n [PROJECTS.CAMPAIGN_UI]: PROD_CLARITY_ID,\r\n [PROJECTS.UP]: PROD_CLARITY_ID,\r\n [PROJECTS.SMART]: PROD_CLARITY_ID,\r\n [PROJECTS.SMART_PAGE]: PROD_CLARITY_ID,\r\n [PROJECTS.UP_SUPPORT]: PROD_CLARITY_ID,\r\n [PROJECTS.SUB_ADS_LANDING]: PROD_CLARITY_ID,\r\n [PROJECTS.DSP]: 'az4m3zmuo0',\r\n [PROJECTS.SELLER_FORUM]: PROD_CLARITY_ID,\r\n [PROJECTS.STREAMLINED_SIGNUP]: PROD_CLARITY_ID,\r\n [PROJECTS.PMAX_LITE_SIGNUP]: PROD_CLARITY_ID,\r\n [PROJECTS.PMAX_LITE_LANDING]: PROD_CLARITY_ID,\r\n};\r\n\r\nexport const TEST_CLARITY_IDS = {\r\n [PROJECTS.DMC]: TEST_CLARITY_ID,\r\n [PROJECTS.CAMPAIGN_UI]: TEST_CLARITY_ID,\r\n [PROJECTS.UP]: TEST_CLARITY_ID,\r\n [PROJECTS.SMART]: TEST_CLARITY_ID,\r\n [PROJECTS.SMART_PAGE]: TEST_CLARITY_ID,\r\n [PROJECTS.UP_SUPPORT]: TEST_CLARITY_ID,\r\n [PROJECTS.SUB_ADS_LANDING]: TEST_CLARITY_ID,\r\n [PROJECTS.DSP]: 'az4mm7npsb',\r\n [PROJECTS.SELLER_FORUM]: TEST_CLARITY_ID,\r\n [PROJECTS.STREAMLINED_SIGNUP]: TEST_CLARITY_ID,\r\n [PROJECTS.PMAX_LITE_SIGNUP]: TEST_CLARITY_ID,\r\n [PROJECTS.PMAX_LITE_LANDING]: TEST_CLARITY_ID,\r\n};\r\n","/* eslint-disable no-underscore-dangle */\r\nimport _ from 'underscore';\r\nimport $ from 'jquery';\r\n// import { scopeStore } from '@bingads-webui-campaign/global-context-store';\r\n\r\n/* Note:\r\n * The events we fire to adobe omniture are used by the marketing team.\r\n * We should not break or change the events payload without confirming the changes with them.\r\n * Marketing Team: Galen Gerling, David Kline\r\n */\r\n\r\nfunction serializeList(list) {\r\n return _.chain(list)\r\n .pairs()\r\n .map(item => (item[1] ? item[0] : null))\r\n .compact()\r\n .value();\r\n}\r\n\r\nexport function triggerOmnitureEvent(payload) {\r\n $(document).trigger('pageview', payload);\r\n}\r\n\r\n// The marketing team uses adobe omniture to track\r\nexport function initPDL(serverContext) {\r\n // adobe tracking script will use window._PDL to provide info\r\n window._PDL = window._PDL || {};\r\n const omniture = serverContext.Omniture || {};\r\n\r\n window._PDL = window._PDL || {};\r\n window._PDL.market = omniture.Market;\r\n window._PDL.pageName = omniture.PageNamePDL;\r\n window._PDL.navLevel1 = omniture.NavLevel1;\r\n window._PDL.navLevel2 = omniture.NavLevel2;\r\n window._PDL.accountNumber = omniture.CurrentAccountNumber;\r\n window._PDL.accountMode = omniture.CurrentAccountMode || omniture.AccountMode;\r\n window._PDL.customerID = omniture.CustomerID;\r\n window._PDL.userID = omniture.UserID;\r\n window._PDL.serverName = omniture.ServerName;\r\n\r\n const permissions = serializeList(serverContext.Permissions);\r\n const dynamicPermissions = serializeList(serverContext.DynamicPermissions);\r\n const ccuiPermissions = serializeList(serverContext.CCUIPilots);\r\n\r\n window._PDL.permissions = _.union(\r\n permissions,\r\n dynamicPermissions,\r\n ccuiPermissions\r\n ).join(',');\r\n\r\n // TODO\r\n // scopeStore.subscribe(() => {\r\n // const { campaignId, adGroupId } = scopeStore.state.scope.values;\r\n // window._PDL.campaignID = campaignId;\r\n // window._PDL.adGroupID = adGroupId;\r\n // });\r\n\r\n // if navLevel3 was set before init, fire an event\r\n if (window._PDL.navLevel3) {\r\n triggerOmnitureEvent({\r\n campaignId: window._PDL.campaignID,\r\n adGroupId: window._PDL.adGroupID,\r\n navLevel3: window._PDL.navLevel3,\r\n navLevel3Title: window._PDL.navLevel3Title,\r\n });\r\n }\r\n}\r\n\r\nexport function updatePdlPage(payload) {\r\n const {\r\n campaignId,\r\n adGroupId,\r\n navLevel3,\r\n navLevel3Title,\r\n } = payload;\r\n\r\n window._PDL = window._PDL || {};\r\n window._PDL.campaignID = campaignId;\r\n window._PDL.adGroupID = adGroupId;\r\n window._PDL.navLevel3 = navLevel3;\r\n window._PDL.navLevel3Title = navLevel3Title;\r\n\r\n // Includes nav + campaign elements, plus any additional custom payload\r\n triggerOmnitureEvent(payload);\r\n}\r\n\r\nexport function updatePdlUser(serverContext) {\r\n const {\r\n CurrentAccount,\r\n CurrentUser,\r\n } = serverContext;\r\n\r\n window._PDL = window._PDL || {};\r\n window._PDL.accountNumber = CurrentAccount.AccountNumber;\r\n window._PDL.accountMode = CurrentAccount.AccountMode;\r\n window._PDL.customerID = CurrentAccount.AdvertiserCustomerID;\r\n window._PDL.userID = CurrentUser.Id;\r\n}\r\n","import _ from 'underscore';\r\nimport queryString from 'query-string';\r\n\r\nfunction isNullOrUndefined(value) {\r\n return _.isNull(value) || _.isUndefined(value);\r\n}\r\n\r\nfunction findMismatches(original, expected, force) {\r\n return _.reduce(expected, (result, value, key) => {\r\n if ((force || _.has(original, key)) &&\r\n !isNullOrUndefined(value) &&\r\n original[key] !== `${value}`) {\r\n _.extend(result, { [key]: `${value}` });\r\n }\r\n return result;\r\n }, {});\r\n}\r\n\r\n/**\r\n * Ensures that the params are present in the URL\r\n * @param {Object} params - The new query params\r\n * @param {Boolean} [force=false] - whether to update the URL even if the params aren't present\r\n * @returns {void}\r\n */\r\nexport function checkQueryParams(params, force = false) {\r\n const query = queryString.parse(window.location.search);\r\n\r\n const mismatches = findMismatches(query, params, force);\r\n\r\n if (!_.isEmpty(mismatches)) {\r\n const updatedQuery = _.extend(query, mismatches);\r\n // use replaceState as we just need to fix the url, no need to refresh page\r\n window.history.replaceState(\r\n {},\r\n document.title,\r\n `${window.location.pathname}?${queryString.stringify(updatedQuery, { sort: false })}${window.location.hash}`\r\n );\r\n }\r\n}\r\n\r\n// For fresh page load, in case user put wrong values for known query params (uid, cid, aid),\r\n// this component restores it per server context\r\nexport function checkUserQueryParams(serverContext, force = false) {\r\n const {\r\n CurrentUser: { Id: uid },\r\n CurrentCustomer: { Id: cid },\r\n CurrentAccount: { Id: aid },\r\n } = serverContext;\r\n\r\n const params = { uid, cid, aid };\r\n checkQueryParams(params, force);\r\n}\r\n\r\n// This function provides an easy way to trim unncessary params, e.g. skipcccache\r\nexport function deleteQueryParam(param) {\r\n const query = queryString.parse(window.location.search);\r\n delete query[param];\r\n window.history.replaceState(\r\n {},\r\n document.title,\r\n `${window.location.pathname}?${queryString.stringify(query, { sort: false })}${window.location.hash}`\r\n );\r\n}\r\n","import Promise from 'bluebird';\r\nimport _ from 'underscore';\r\nimport { useEffect, useState } from 'react';\r\nimport $ from 'jquery';\r\nimport { keepAliveInstance } from '@bingads-webui/keep-alive';\r\n// import { versionCheckInstance } from '@bingads-webui-campaign/version-check';\r\nimport { setupClarity } from '@bingads-webui-universal/clarity';\r\nimport { PageReady } from '@bingads-webui/page-ready';\r\nimport { setupQualtricsWithData } from '@bingads-webui-campaign/qualtrics';\r\nimport { PreferenceService } from '@bingads-webui/preference-service';\r\nimport { initPDL } from './omniture';\r\nimport { redirectToLogin, CLARITY_IDS, isTestEnvironment, TEST_CLARITY_IDS, isSignupRunningProxy } from './constants';\r\nimport { checkUserQueryParams, deleteQueryParam } from './query-param-checker';\r\n\r\nconst isTestEnv = isTestEnvironment(document.domain);\r\nconst CookieConsentActivityName = 'wcp-consent';\r\n\r\nexport function setupServiceRoots(serverContext) {\r\n // we check for proxy running so that we can properly route cc API calls in proxy\r\n if (isSignupRunningProxy()) {\r\n // eslint-disable-next-line no-param-reassign\r\n serverContext.ServicesEndpoints.ClientCenterUIAPI = 'https://app1.ads-int.microsoft.com:12000/cc/';\r\n }\r\n}\r\n\r\nfunction getCLarityID(feature) {\r\n return isTestEnv ? TEST_CLARITY_IDS[feature] : CLARITY_IDS[feature];\r\n}\r\n\r\n/**\r\n * Initialize global app services.\r\n * @param {any} {\r\n * featureName - Name of feature\r\n * serverContext - Context needed for initializing libraries\r\n * shouldLoadAdobe - Determines if Adobe tracking should load.\r\n * shouldStartKeepAlive - Determines if keep-alive polling should start.\r\n * shouldSetQueryParams - Determines if script to update url with query params will run\r\n * shouldSetupQualtrics - Determines if qualtrics initialization should run.\r\n * shouldEnableUnAuth - Determines if should not redirect when un auth\r\n * shouldLoadAmplifyTracking - Determines if Amplify tracking script should load.\r\n * }\r\n * @returns {void}\r\n */\r\nexport function initGlobalService({\r\n featureName,\r\n serverContext,\r\n shouldLoad1DS = true,\r\n shouldLoadAdobe = false,\r\n shouldStartKeepAlive = true,\r\n shouldSetQueryParams = false,\r\n shouldSetupQualtrics = false,\r\n shouldEnableUnAuth = false,\r\n shouldLoadAmplifyTracking = false,\r\n shouldSetupQualtricsWithData = false,\r\n setUpClarityBasedOnUserConsent = false,\r\n appActivity = {\r\n trace: _.noop,\r\n error: _.noop,\r\n },\r\n}) {\r\n try {\r\n // remove skipcccache from URL, this should only be used once to refresh sever cache\r\n deleteQueryParam('skipcccache');\r\n\r\n if (!shouldEnableUnAuth) {\r\n // create callback that will sign out if user's auth token is invalid or expired\r\n keepAliveInstance.unAuthCallBack = () => redirectToLogin(serverContext);\r\n }\r\n\r\n if (shouldStartKeepAlive) {\r\n // start keep alive\r\n keepAliveInstance.start();\r\n }\r\n\r\n /*\r\n TODO: implement\r\n // start version check\r\n versionCheckInstance.version = serverContext.Version;\r\n versionCheckInstance.start();\r\n */\r\n\r\n if (shouldSetQueryParams) {\r\n // if user put wrong values for known query params (uid, cid, aid)\r\n // restores it per server context\r\n checkUserQueryParams(serverContext);\r\n }\r\n\r\n // init an empty function to avoid customer click the help icon\r\n // before the apex loading is ready\r\n if (!window.PopupController) {\r\n window.PopupController = { PopupJsClick: () => { } };\r\n }\r\n PageReady.afterPageReady().then(() => {\r\n if (shouldSetupQualtricsWithData) {\r\n setupQualtricsWithData(serverContext, {\r\n PreferenceService,\r\n enableIframeCommunication: true,\r\n appActivity,\r\n });\r\n } else if (shouldSetupQualtrics) {\r\n setupQualtricsWithData(serverContext);\r\n }\r\n\r\n const init1DSAnalytics = () => {\r\n const scriptUrl = 'https://js.monitor.azure.com/scripts/c/ms.analytics-web-3.min.js';\r\n\r\n if (!_.isFunction($.ajax)) {\r\n return new Promise();\r\n }\r\n\r\n return new Promise((resolve) => {\r\n $.ajax({\r\n url: scriptUrl,\r\n dataType: 'script',\r\n crossOrigin: true,\r\n credentials: 'omit',\r\n }).always(() => resolve());\r\n });\r\n };\r\n\r\n const initAdobeTracking = () => {\r\n const trackingScriptUrl = _.chain(serverContext)\r\n .result('ThirdPartConfig')\r\n .result('AdobeTrackingScriptUrl', undefined)\r\n .value();\r\n if (!_.isUndefined(trackingScriptUrl) && _.isFunction($.getScript)) {\r\n $.ajax({\r\n url: trackingScriptUrl,\r\n dataType: 'script',\r\n crossOrigin: true,\r\n credentials: 'omit',\r\n success: () => initPDL(serverContext),\r\n });\r\n }\r\n };\r\n\r\n const initAmplifyTracking = () => {\r\n const amplifyTrackingScriptUrl = _.chain(serverContext)\r\n .result('AmplifyTrackingScriptUrl', undefined)\r\n .value();\r\n if (!_.isUndefined(amplifyTrackingScriptUrl) && _.isFunction($.getScript)) {\r\n $.ajax({\r\n url: amplifyTrackingScriptUrl,\r\n dataType: 'script',\r\n crossOrigin: true,\r\n credentials: 'omit',\r\n });\r\n }\r\n };\r\n\r\n const clarityId = getCLarityID(featureName);\r\n\r\n if (clarityId) {\r\n const currentUserId = (serverContext.CurrentUser &&\r\n serverContext.CurrentUser.Id &&\r\n serverContext.CurrentUser.Id.toString()) || '';\r\n const customerId = (serverContext.CurrentCustomer &&\r\n serverContext.CurrentCustomer.Id &&\r\n serverContext.CurrentCustomer.Id.toString()) || '';\r\n const accountId = (serverContext.CurrentAccount &&\r\n serverContext.CurrentAccount.Id &&\r\n serverContext.CurrentAccount.Id.toString()) || '';\r\n\r\n const initClarity = () => {\r\n setupClarity(\r\n clarityId,\r\n {\r\n customerId,\r\n accountId,\r\n SessionId: serverContext.Omniture.SessionId,\r\n PageTrackingId: serverContext.PageTrackingId,\r\n subFeature: featureName,\r\n },\r\n currentUserId,\r\n serverContext.Omniture.SessionId,\r\n serverContext.PageTrackingId\r\n );\r\n };\r\n\r\n const onConsentChanged = (categoryPreferences) => {\r\n appActivity.trace(`Consent: ${JSON.stringify(categoryPreferences)}`);\r\n window.dispatchEvent(new CustomEvent('ConsentChanged', {\r\n detail: categoryPreferences,\r\n }));\r\n };\r\n\r\n if (setUpClarityBasedOnUserConsent || shouldLoadAdobe || shouldLoadAmplifyTracking) {\r\n const script = document.createElement('script');\r\n script.src = 'https://wcpstatic.microsoft.com/mscc/lib/v2/wcp-consent.js';\r\n script.async = true;\r\n script.onload = () => {\r\n appActivity.trace('WcpConsent: script loaded', CookieConsentActivityName);\r\n // Init WcpConsent before in init clarity\r\n // cookie-banner will be hidden after user sign in, we only use this element to init WCP\r\n // we depend on CCUI page to show cookie banner to users\r\n if (window.WcpConsent) {\r\n appActivity.trace('WcpConsent: initialize start', CookieConsentActivityName);\r\n window.WcpConsent.init(serverContext.CurrentLocale, 'cookie-banner', (err, _siteConsent) => {\r\n appActivity.trace('WcpConsent: initialize complete', CookieConsentActivityName);\r\n if (!err) {\r\n window.siteConsent = _siteConsent;\r\n appActivity.trace('WcpConsent: initialize succeed', CookieConsentActivityName);\r\n if (!window.WcpConsent\r\n || !window.WcpConsent.siteConsent\r\n || !window.WcpConsent.siteConsent.onConsentChanged\r\n || !window.WcpConsent.siteConsent.getConsent\r\n ) {\r\n if (appActivity.error) {\r\n appActivity.error('WcpConsent: WcpConsent component is not initialized. Cannot read user cookie consent info');\r\n }\r\n return;\r\n }\r\n onConsentChanged(window.WcpConsent.siteConsent.getConsent());\r\n appActivity.trace('WcpConsent: read cookie consent value to see if we can init clarity', CookieConsentActivityName);\r\n\r\n const initAnalytics = ({ Analytics, Advertising }) => {\r\n if (Analytics) {\r\n const load1DS = shouldLoad1DS ? init1DSAnalytics : () => Promise.resolve();\r\n\r\n load1DS().then(() => {\r\n if (shouldLoadAdobe) {\r\n initAdobeTracking();\r\n }\r\n });\r\n\r\n if (shouldLoadAmplifyTracking) {\r\n initAmplifyTracking();\r\n }\r\n if (setUpClarityBasedOnUserConsent && Advertising) {\r\n initClarity();\r\n }\r\n }\r\n };\r\n\r\n const currentConsent = window.WcpConsent.siteConsent.getConsent();\r\n\r\n if (currentConsent.Analytics) {\r\n initAnalytics(currentConsent);\r\n } else {\r\n window.WcpConsent.siteConsent.onConsentChanged(initAnalytics);\r\n }\r\n } else if (appActivity.error) {\r\n appActivity.error(`WcpConsent: initialize error: ${err}`);\r\n }\r\n }, onConsentChanged);\r\n } else {\r\n appActivity.trace('WcpConsent: wcp-consent.js script has not been loaded yet', CookieConsentActivityName);\r\n }\r\n };\r\n script.onerror = () => {\r\n // ad blocker might block this script, so we only log trace here.\r\n appActivity.trace('WcpConsent: WcpConsent script didn\\'t load correctly.');\r\n };\r\n\r\n document.head.appendChild(script);\r\n } else {\r\n appActivity.trace('WcpConsent: WcpConsent logic skipped.');\r\n initClarity();\r\n }\r\n } else {\r\n appActivity.error('init global service error');\r\n }\r\n });\r\n\r\n setupServiceRoots(serverContext);\r\n } catch (e) {\r\n appActivity.error(`init global service raise exception ${e}`);\r\n }\r\n}\r\n\r\nexport const useWcpConstent = () => {\r\n const [wcpConsent, setWcpConsent] = useState({});\r\n const onConsentChanged = () => {\r\n const { siteConsent } = window;\r\n setWcpConsent(siteConsent);\r\n };\r\n useEffect(() => {\r\n window.addEventListener('ConsentChanged', () => {\r\n onConsentChanged();\r\n });\r\n return () => {\r\n window.removeEventListener('ConsentChanged', onConsentChanged);\r\n };\r\n });\r\n\r\n return wcpConsent;\r\n};\r\n","import $ from 'jquery';\r\n\r\nfunction getCellFromPoint(x, y) {\r\n // scrollTop takes into account a scrolled page\r\n const $cell = $(document.elementFromPoint(x, y - $(document).scrollTop())).closest('td');\r\n if ($cell.length > 0) {\r\n return $cell;\r\n }\r\n\r\n // td cell may not be found using elementFromPoint, use elementsFromPoint\r\n // to find all elements and filter by tag name\r\n if (document.elementsFromPoint) {\r\n const elements = document\r\n .elementsFromPoint(x, y - $(document).scrollTop())\r\n .filter(node => node.tagName.toUpperCase() === 'TD');\r\n\r\n return elements.length > 0 ? $(elements[0]) : $();\r\n } else if (document.msElementsFromPoint) {\r\n const nodeList = document.msElementsFromPoint(x, y - $(document).scrollTop());\r\n if (nodeList) {\r\n let $tdCell = $();\r\n\r\n Array.prototype.forEach.call(nodeList, (node) => {\r\n if (node.tagName.toUpperCase() === 'TD') {\r\n $tdCell = $(node);\r\n }\r\n });\r\n return $tdCell;\r\n }\r\n }\r\n\r\n return $();\r\n}\r\n\r\n/**\r\n* get popup editor positoin,\r\n* based on cellPosition & editor width & related position option setting\r\n*\r\n* @param {Object} cellPosition - position where popup editor event was triggered\r\n* @param {Object} $editor - editorView that will be host inside popup editor\r\n* @param {boolean} isRTL - whether culture is RTL, default false\r\n* @param {boolean} renderBelow - whether to render poup editor below cellPosition,\r\n* @param {boolean} parentContainerSelector - custom selector for parent container\r\n default false\r\n* @param {boolean} adjustTopPosition - whether to adjust top position,\r\n default true\r\n* @returns {void} void\r\n*/\r\nexport function getPosition(\r\n cellPosition,\r\n $editor,\r\n isRTL,\r\n renderBelow,\r\n parentContainerSelector = null,\r\n adjustTopPosition = true\r\n) {\r\n const cTop = cellPosition.top;\r\n const cLeft = cellPosition.left;\r\n const $cell = getCellFromPoint(cLeft, cTop);\r\n let left;\r\n let top = cTop;\r\n\r\n if (isRTL) {\r\n left = cLeft - $editor.width() + $cell.width() - 20; // eslint-disable-line no-mixed-operators\r\n } else {\r\n left = cLeft - 10;\r\n\r\n // eslint-disable-next-line no-mixed-operators\r\n let widthDiff = cLeft + $editor.outerWidth();\r\n\r\n if (parentContainerSelector) {\r\n const parentLeft = $(parentContainerSelector).offset() ?\r\n $(parentContainerSelector).offset().left : 0;\r\n widthDiff += parentLeft;\r\n const $table = $(`${parentContainerSelector} .table, ${parentContainerSelector} table`);\r\n const tableLeft = $table.offset() ? $table.offset().left : 0;\r\n widthDiff -= tableLeft + $table.width();\r\n } else {\r\n widthDiff -= document.body.clientWidth;\r\n }\r\n\r\n // adjust right edge if it extend past the grid's viewport\r\n if (widthDiff > 0) {\r\n left -= widthDiff;\r\n }\r\n }\r\n\r\n if (!adjustTopPosition) {\r\n return { top, left };\r\n }\r\n if (renderBelow) {\r\n if ($cell.length > 0) {\r\n // render below the content (assumes equal top/bottom padding)\r\n const height = $cell.children().length > 0 ? $cell.children().height() : $cell.height();\r\n const padding = ($cell.outerHeight() - height) / 2;\r\n\r\n // add offset of 5\r\n top += $cell.outerHeight() - padding + 2; // eslint-disable-line no-mixed-operators\r\n }\r\n } else {\r\n top -= 10;\r\n }\r\n\r\n return {\r\n top,\r\n left,\r\n };\r\n}\r\n\r\nexport function getEditorPositionAsideAnchor($anchor) {\r\n const space = 5;\r\n\r\n function getEditorPosition($editor) {\r\n const {\r\n top: anchorTop,\r\n left: anchorLeft,\r\n } = $anchor.offset();\r\n const anchorWidth = $anchor.outerWidth();\r\n const editorWidth = $editor.outerWidth();\r\n\r\n const editorTop = anchorTop - 10;\r\n\r\n // place at right side\r\n let editorLeft = anchorLeft + anchorWidth + space;\r\n\r\n if ((editorLeft + editorWidth) > document.body.clientWidth) {\r\n // place at left side\r\n editorLeft = anchorLeft - editorWidth - space;\r\n }\r\n\r\n return {\r\n top: editorTop,\r\n left: editorLeft,\r\n };\r\n }\r\n\r\n return getEditorPosition;\r\n}\r\n","import $ from 'jquery';\r\nimport _ from 'underscore';\r\nimport Backbone from 'backbone';\r\nimport { focusLockInstanceDecorator } from '@bingads-webui/focus-lock-decorator';\r\nimport { getTabbableNodes } from '@bingads-webui-react/focus-lock';\r\nimport { getPosition } from './get-position';\r\n\r\nconst editorClass = 'grid-popupeditor';\r\n\r\n/**\r\n* Provide grid popup editor function\r\n*\r\n*
It enabled functions:\r\n* render the editor view above or below,\r\n* close when editor view trigger close event,\r\n* close when usre click other part of document,\r\n*\r\n*
Triggered event close when it closes itself\r\n*/\r\nexport class GridCustomizedPopupEditor extends Backbone.View {\r\n get attributes() {\r\n return {\r\n role: 'dialog',\r\n };\r\n }\r\n\r\n constructor(options) {\r\n // set default class name for popup-editor to be 'grid-popupeditor'\r\n super(_.extend({ className: editorClass }, options));\r\n }\r\n\r\n /**\r\n * Initilize view settings\r\n *\r\n * @param {Object} param - An object containing these default options for view:\r\n * @param {Object} param.editorView - editorView that will be host inside popup editor\r\n * @param {Object} param.editorPositionFactory - a factory to generate position of editor,\r\n * which overrides default editor position\r\n * @param {Object} param.cellPosition - position where popup editor event was triggered\r\n * @param {boolean} param.renderBelow - whether to render poup editor below cellPosition,\r\n default false\r\n * @param {boolean} param.CultureIsRTL - whether culture is RTL, default false\r\n * @param {boolean} param.noDismiss - whether to not close editor when click outside of it,\r\n * default false (means close it by default)\r\n * @param {boolean} param.parentContainerSelector - custom parent container selector\r\n * (instead of body)\r\n * @param {boolean} adjustTopPosition - whether to adjust top position,\r\n default true\r\n * @returns {void} void\r\n */\r\n initialize({\r\n editorView,\r\n editorPositionFactory,\r\n cellPosition,\r\n renderBelow = false,\r\n CultureIsRTL = false,\r\n noDismiss = false,\r\n customDismissCondition = null,\r\n parentContainerSelector = null,\r\n lockRegionAriaLabel = '',\r\n adjustTopPosition = true,\r\n }) {\r\n this.editorView = editorView;\r\n this.editorPositionFactory = editorPositionFactory;\r\n this.cellPosition = cellPosition;\r\n this.renderBelow = renderBelow;\r\n this.CultureIsRTL = CultureIsRTL;\r\n this.parentContainerSelector = parentContainerSelector || 'body';\r\n this.hasCustomParentContainer = !!parentContainerSelector;\r\n this.adjustTopPosition = adjustTopPosition;\r\n\r\n this.dismiss = () => {\r\n this.trigger('close');\r\n this.remove();\r\n };\r\n\r\n const FocusLockEditorView = focusLockInstanceDecorator(this.editorView, {\r\n onExit: this.dismiss.bind(this),\r\n lockRegionAriaLabel,\r\n focusFirstItemOnMount: true,\r\n }, {\r\n managed: true,\r\n });\r\n\r\n this.focusLockEditorView = new FocusLockEditorView();\r\n\r\n this.clickToDismiss = (event) => {\r\n const defaultDismissCondition = e => $(e.target).closest(`.${this.className.replace(/ /g, '.')}`).length === 0;\r\n const dismissCondition = customDismissCondition || defaultDismissCondition;\r\n\r\n // Decide whether it is inside the popup editor\r\n if (dismissCondition(event)) {\r\n if (noDismiss) {\r\n return;\r\n }\r\n this.dismiss();\r\n }\r\n };\r\n }\r\n\r\n render() {\r\n this.$el.html(this.focusLockEditorView.render().el);\r\n\r\n this.editorView.on('close', (update) => {\r\n this.trigger('close', update);\r\n this.remove();\r\n });\r\n\r\n this.$el.hide();\r\n\r\n // position calculation need to be after the element appended to DOM, so defer it\r\n _.defer(() => {\r\n const position = _.isFunction(this.editorPositionFactory) ?\r\n this.editorPositionFactory(this.$el) :\r\n getPosition(\r\n this.cellPosition,\r\n this.$el,\r\n this.CultureIsRTL,\r\n this.renderBelow,\r\n this.hasCustomParentContainer && this.parentContainerSelector,\r\n this.adjustTopPosition\r\n );\r\n this.$el.css(position);\r\n this.$el.fadeIn();\r\n\r\n if (_.isFunction(this.editorView.setFocus)) {\r\n this.editorView.setFocus();\r\n } else if (this.editorView.el) {\r\n // filter the not visible element out which may due to parent display property\r\n const tabbableNode = _.filter(getTabbableNodes(this.editorView.el), item => $(item).is(':visible'));\r\n\r\n if (tabbableNode && tabbableNode.length > 0) {\r\n tabbableNode[0].focus({\r\n preventScroll: true,\r\n });\r\n }\r\n }\r\n // add data-focused flag to indicate the focus operation is done\r\n this.$el.attr('data-focused', '');\r\n\r\n $(window).on('click', this.clickToDismiss);\r\n $(window).on('hashchange', this.dismiss);\r\n });\r\n\r\n $(this.parentContainerSelector).append(this.el);\r\n\r\n return this;\r\n }\r\n\r\n remove() {\r\n this.focusLockEditorView.remove();\r\n this.editorView.remove();\r\n $(window).off('click', this.clickToDismiss);\r\n $(window).off('hashchange', this.dismiss);\r\n super.remove();\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport { StateStore } from '@bingads-webui/state-store';\r\nimport { History, Location } from 'history';\r\n\r\nexport interface IScope {\r\n values: {\r\n aid: string | number;\r\n cid: string | number;\r\n uid: string | number | null;\r\n adGroupId: string | number | null;\r\n campaignId: string | number | null;\r\n };\r\n location: {\r\n hash: string;\r\n pathname: string;\r\n search: string;\r\n };\r\n}\r\n\r\ninterface IScopeState {\r\n scope?: IScope;\r\n}\r\n\r\nexport const scopeStore = new StateStore({});\r\n\r\ninterface IRouteState {\r\n history?: History;\r\n location?: Location;\r\n}\r\nexport const routeStore = new StateStore({});\r\n\r\ninterface II18nState {\r\n i18n?: any;\r\n}\r\nexport const i18nStore = new StateStore({});\r\n\r\ninterface IPermissionsState {\r\n permissions?: any;\r\n}\r\nexport const permissionsStore = new StateStore({});\r\n\r\ninterface IServerContextState {\r\n serverContext?: any;\r\n}\r\nexport const serverContextStore = new StateStore({});\r\n\r\ninterface IPreferenceServiceState {\r\n preferenceService?: any;\r\n}\r\nexport const preferenceServiceStore = new StateStore({});\r\n\r\ninterface ITokenStore {\r\n authToken?: string;\r\n}\r\nexport const tokenStore = new StateStore({});\r\n\r\ninterface IUserContextStore {\r\n userContext?: {\r\n CurrentCustomer: any;\r\n CurrentAccount: any;\r\n CurrentUser: any;\r\n };\r\n}\r\nexport const userContextStore = new StateStore({});\r\n\r\ninterface ISiteMapState {\r\n siteMap?: any;\r\n}\r\nexport const siteMapStore = new StateStore({});\r\ninterface IVersionStore {\r\n version?: string;\r\n newVersion?: string;\r\n}\r\nconst _versionStore = new StateStore({});\r\nconst { setState } = _versionStore;\r\n_versionStore.setState = (stateChange:IVersionStore) => {\r\n if (_.isEmpty(_versionStore.state)) {\r\n _versionStore.state = stateChange;\r\n } else setState(stateChange);\r\n};\r\n\r\nexport const versionStore = _versionStore;\r\n\r\ninterface ISettingsContextStore {\r\n settingsContext?: {\r\n Urls?: any;\r\n AccountLinkPermissionType?: number | null;\r\n };\r\n}\r\nexport const settingsContextStore = new StateStore({});\r\n","import React from 'react';\r\n\r\nimport { Location, History } from 'history';\r\n// @ts-ignore\r\nimport { withScope } from '@bingads-webui-react/scope-service';\r\nimport { withRouter } from 'react-router';\r\n// @ts-ignore\r\nimport { withI18nConsumer } from '@bingads-webui-react/i18n-context';\r\n// @ts-ignore\r\nimport { withPermissions } from '@bingads-webui-react/hoc-with-permissions';\r\n// @ts-ignore\r\nimport { withPreference } from '@bingads-webui-react/preference-context';\r\n// @ts-ignore\r\nimport { withUserConsumer } from '@bingads-webui-react/user-context';\r\n// @ts-ignore\r\nimport { withSettingsConsumer } from '@bingads-webui-react/settings-context';\r\n\r\nimport {\r\n scopeStore,\r\n routeStore,\r\n IScope,\r\n i18nStore,\r\n permissionsStore,\r\n serverContextStore,\r\n preferenceServiceStore,\r\n tokenStore,\r\n userContextStore,\r\n siteMapStore,\r\n versionStore,\r\n settingsContextStore,\r\n} from './global-context-store';\r\n\r\ninterface IGlobalContextReceiverProps {\r\n location: Location;\r\n history: History;\r\n scope: IScope;\r\n i18n: any;\r\n permissions: any;\r\n serverContext: any;\r\n userContext: {\r\n CurrentCustomer: any;\r\n CurrentAccount: any;\r\n CurrentUser: any;\r\n };\r\n siteMap: any;\r\n preferenceService: any;\r\n settingsContext: any;\r\n}\r\n\r\nexport class InternalGlobalContextReceiver extends React.PureComponent {\r\n componentDidUpdate() {\r\n this.updateContextStore();\r\n }\r\n\r\n componentDidMount() {\r\n this.updateContextStore();\r\n this.initializeContextStore();\r\n }\r\n\r\n render() {\r\n return null;\r\n }\r\n\r\n initializeContextStore() {\r\n const { serverContext } = this.props;\r\n // version store has its own update logic\r\n versionStore.setState({ version: serverContext.Version, newVersion: serverContext.Version });\r\n }\r\n\r\n updateContextStore() {\r\n const {\r\n location, history, scope, i18n, permissions, serverContext, userContext, siteMap, preferenceService, settingsContext,\r\n } = this.props;\r\n scopeStore.setState({ scope });\r\n routeStore.setState({ history, location });\r\n i18nStore.setState({ i18n });\r\n permissionsStore.setState({ permissions });\r\n serverContextStore.setState({ serverContext }); // TODO: remove it if possible\r\n preferenceServiceStore.setState({ preferenceService });\r\n tokenStore.setState({ authToken: serverContext.Token });\r\n userContextStore.setState({ userContext });\r\n siteMapStore.setState({ siteMap });\r\n settingsContextStore.setState({ settingsContext });\r\n }\r\n}\r\n\r\nexport const GlobalContextReceiver = withSettingsConsumer(withPreference(withUserConsumer(withPermissions(withI18nConsumer(withRouter(withScope(InternalGlobalContextReceiver)))))));\r\n"],"names":["redirectToLogin","serverContext","_serverContext$Urls","Urls","SignOutUrl","window","location","href","concat","protocol","host","prodEnvs","isTestEnvironment","envToCheck","indexOf","PROJECTS","PROD_CLARITY_ID","TEST_CLARITY_ID","_CLARITY_IDS","_defineProperty","_TEST_CLARITY_IDS","triggerOmnitureEvent","payload","$","document","trigger","updatePdlPage","campaignId","adGroupId","navLevel3","navLevel3Title","_PDL","campaignID","adGroupID","findMismatches","original","expected","force","_","result","value","key","isNullOrUndefined","checkUserQueryParams","arguments","length","undefined","params","query","queryString","search","mismatches","updatedQuery","history","replaceState","title","pathname","sort","hash","checkQueryParams","uid","CurrentUser","Id","cid","CurrentCustomer","aid","CurrentAccount","domain","getPosition","cellPosition","$editor","isRTL","renderBelow","left","parentContainerSelector","adjustTopPosition","cTop","top","cLeft","$cell","x","y","elementFromPoint","scrollTop","closest","elementsFromPoint","elements","filter","node","tagName","toUpperCase","msElementsFromPoint","nodeList","$tdCell","Array","prototype","forEach","call","getCellFromPoint","width","widthDiff","outerWidth","offset","$table","body","clientWidth","height","children","padding","outerHeight","getEditorPositionAsideAnchor","$anchor","_$anchor$offset","anchorTop","anchorLeft","anchorWidth","editorWidth","editorTop","editorLeft","GridCustomizedPopupEditor","_Backbone$View","options","_classCallCheck","_callSuper","className","_inherits","_createClass","get","role","_ref","_this","editorView","editorPositionFactory","_ref$renderBelow","_ref$CultureIsRTL","CultureIsRTL","_ref$noDismiss","noDismiss","_ref$customDismissCon","customDismissCondition","_ref$parentContainerS","_ref$lockRegionAriaLa","lockRegionAriaLabel","_ref$adjustTopPositio","this","hasCustomParentContainer","dismiss","remove","FocusLockEditorView","focusLockInstanceDecorator","onExit","bind","focusFirstItemOnMount","managed","focusLockEditorView","clickToDismiss","event","e","target","replace","_this2","$el","html","render","el","on","update","hide","position","css","fadeIn","setFocus","tabbableNode","getTabbableNodes","item","is","focus","preventScroll","attr","append","off","_superPropGet","Backbone","scopeStore","StateStore","routeStore","i18nStore","permissionsStore","serverContextStore","preferenceServiceStore","tokenStore","userContextStore","siteMapStore","_versionStore","setState","stateChange","state","versionStore","settingsContextStore","InternalGlobalContextReceiver","componentDidUpdate","updateContextStore","componentDidMount","initializeContextStore","props","version","Version","newVersion","scope","i18n","permissions","userContext","siteMap","preferenceService","settingsContext","authToken","Token","GlobalContextReceiver","withSettingsConsumer","withPreference","withUserConsumer","withPermissions","withI18nConsumer","withRouter","withScope"],"sourceRoot":""}