{"version":3,"file":"static/js/application.async.landing~40420f87.337053f6.chunk.js","mappings":"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","sources":["../../../node_modules/@bingads-webui-campaign-react/legacy-bid-setting/src/style.js","../../../node_modules/@bingads-webui-campaign-react/legacy-bid-setting/src/legacy-bid-setting.js","../../../node_modules/@bingads-webui-campaign-react/legacy-budget/src/style.js","../../../node_modules/@bingads-webui-campaign-react/legacy-budget/src/legacy-budget.js","../../../node_modules/@bingads-webui-campaign-react/legacy-call-to-action/src/call-to-action-aria-text/index.js","../../../node_modules/@bingads-webui-campaign-react/legacy-call-to-action/src/call-to-action-text/index.tsx","../../../node_modules/@bingads-webui-campaign-react/legacy-call-to-action/src/style.js","../../../node_modules/@bingads-webui-campaign-react/legacy-call-to-action/src/locale-to-language.js","../../../node_modules/@bingads-webui-campaign-react/legacy-call-to-action/src/legacy-call-to-action.js","../../../node_modules/@bingads-webui-campaign-react/legacy-call-to-action/src/validated-legacy-call-to-action.js","../../../node_modules/@bingads-webui-campaign-react/legacy-call-to-action/src/action-text-localization.js","../../../node_modules/@bingads-webui-campaign-react/legacy-call-to-action/src/legacy-call-to-action-with-language.js","../../../node_modules/@bingads-webui-campaign-react/legacy-call-to-action/src/validated-legacy-call-to-action-with-language.js","../../../node_modules/@bingads-webui-campaign-react/legacy-call-to-action/src/validated-legacy-call-to-action-with-language-section.js","../../../node_modules/@bingads-webui-campaign-react/legacy-deps-context/src/legacy-deps-context.js","../../../node_modules/@bingads-webui-campaign-react/legacy-editorial-appeal-request-form/src/style.js","../../../node_modules/@bingads-webui-campaign-react/legacy-editorial-appeal-request-form/src/legacy-editorial-appeal-request-form.js","../../../node_modules/@bingads-webui-campaign-react/legacy-editorial-appeal-request-form/src/legacy-inline-error-view.js","../../../node_modules/@bingads-webui-campaign-react/legacy-final-url-expansion/src/legacy-final-url-expansion.js","../../../node_modules/@bingads-webui-campaign-react/legacy-final-url-expansion/src/validated-legacy-final-url-expansion.js","../../../node_modules/@bingads-webui-campaign-react/legacy-shared-budget/src/style.js","../../../node_modules/@bingads-webui-campaign-react/legacy-shared-budget/src/legacy-shared-budget.js","../../../node_modules/@bingads-webui-campaign-react/legacy-shopping-settings/src/style.js","../../../node_modules/@bingads-webui-campaign-react/legacy-shopping-settings/src/legacy-shopping-settings.js","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/constant.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/treeViewPanelSelector/PanelSelector/paginator.styles.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/treeViewPanelSelector/PanelSelector/paginator.tsx","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/treeViewPanelSelector/PanelSelector/BulkAddEditor.tsx","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/treeViewPanelSelector/PanelSelector/index.tsx","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/rawColumns.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/render/toolbar/ColumnChooser/columns.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/legacyI18nMap.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/API/adsOdata.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/API/getListingGroupConditions.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/API/updateListingTree.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/API/index.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/API/listingGroupGridData.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/API/productAttributeStatistics.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/API/productOffer.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/style.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/toolbarConfig.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/ColumnOdataMap.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/render/utils.tsx","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/render/column/ProductOffersCallout.tsx","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/render/column/ConditionTemplate.tsx","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/render/column/FlattenConditionTemplate.tsx","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/render/column/NameTemplate.tsx","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/API/bulk.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/render/column/IncludeExcludeTemplate.tsx","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/render/column/index.tsx","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/render/sortByHelper.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/logger.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/treeViewPanelSelector/panel-callbacks.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/treeViewPanelSelector/panel-helper.tsx","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/useTreeViewPanelSelector.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/API/useAccountData.js","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/API/getProductScope.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/utils.ts","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/listing-groups-page.tsx","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/filter-config.js","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/legacy-adapter/filter-entity.js","../../../node_modules/@bingads-webui-campaign-react/listing-groups-page/src/listing-groups-shell.js"],"sourcesContent":["export const getStyles = () => ({\r\n bidSetting: {\r\n '& .bid-setting__container': {\r\n '& .control-label': {\r\n marginTop: 12,\r\n paddingLeft: 0,\r\n },\r\n\r\n '& .col-sm-4': {\r\n paddingLeft: 0,\r\n\r\n '& .input-group': {\r\n maxWidth: 140,\r\n },\r\n },\r\n },\r\n },\r\n});\r\n","/* eslint-disable no-param-reassign */\r\n/* eslint-disable react-hooks/exhaustive-deps */\r\nimport React, { useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\n\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport BidSetting from '@bingads-webui-campaign-legacy/shopping-campaign/view/campaign-creation/bid-setting';\r\nimport '@bingads-webui-campaign/ko-stop-binding';\r\n\r\nimport { getStyles } from './style';\r\n\r\n// For sponsored campaigns for the moment\r\nexport const LegacyBidSetting = React.memo(({\r\n id,\r\n className,\r\n onChange,\r\n activity,\r\n budgetAmount,\r\n validateWithBudget,\r\n defaultBidValue,\r\n}) => {\r\n const view = useRef();\r\n let container;\r\n\r\n useEffect(() => {\r\n view.current = new BidSetting({\r\n activityLogger: activity,\r\n isAudienceCampaign: false,\r\n isMSStoreCampaign: false,\r\n withRealTimeValidation: true,\r\n onChange,\r\n budgetAmount,\r\n defaultBidValue,\r\n validateWithBudget,\r\n });\r\n\r\n view.current.render();\r\n view.current.$el.appendTo(container);\r\n\r\n return () => view.current.remove();\r\n }, [budgetAmount]);\r\n\r\n const classes = useDefaultStyles(getStyles);\r\n\r\n return (\r\n \r\n
{ container = ref; }} />\r\n
\r\n );\r\n});\r\n\r\nLegacyBidSetting.propTypes = {\r\n id: PropTypes.string,\r\n className: PropTypes.string,\r\n onChange: PropTypes.func.isRequired,\r\n activity: PropTypes.shape({}),\r\n budgetAmount: PropTypes.number,\r\n defaultBidValue: PropTypes.number,\r\n validateWithBudget: PropTypes.bool,\r\n};\r\n\r\nLegacyBidSetting.defaultProps = {\r\n id: undefined,\r\n className: undefined,\r\n activity: undefined,\r\n budgetAmount: null,\r\n defaultBidValue: null,\r\n validateWithBudget: false,\r\n};\r\n","import { mergeStyles } from '@bingads-webui-campaign-react/common-styles';\r\n\r\nexport const getStyles = (theme, palette = {}) => ({\r\n budgetContainer: {\r\n ...mergeStyles(\r\n { theme },\r\n {\r\n '& .container-budget': {\r\n '& span': {\r\n color: palette.neutralPrimary,\r\n },\r\n '& .form-control-static': {\r\n padding: '9px 0px',\r\n lineHeight: '14px',\r\n minHeight: 'auto',\r\n },\r\n '& .input-group': {\r\n marginLeft: 15,\r\n '& .input-group-addon': {\r\n color: '#323130',\r\n border: 0,\r\n padding: '6px',\r\n background: '#ffffff',\r\n },\r\n },\r\n '& .col-sm-3': {\r\n display: 'table',\r\n paddingRight: 0,\r\n paddingLeft: 0,\r\n },\r\n '& .margin-rt-five': {\r\n paddingLeft: 28,\r\n },\r\n\r\n },\r\n '& span.bold': {\r\n fontWeight: 1000,\r\n },\r\n '& .alert-budget-button': {\r\n marginLeft: '10px',\r\n paddingTop: '5px',\r\n '& button': {\r\n color: 'black',\r\n fontSize: '13px',\r\n fontWeight: 500,\r\n borderColor: '#edebe9',\r\n },\r\n },\r\n }\r\n ),\r\n },\r\n});\r\n","/* eslint-disable react-hooks/exhaustive-deps */\r\nimport React, { useEffect, useRef, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { clone } from 'underscore';\r\nimport classnames from 'classnames';\r\nimport Backbone from 'backbone';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport BudgetView from '@bingads-webui-campaign-legacy/budget/view/budget';\r\nimport '@bingads-webui-campaign/ko-stop-binding';\r\nimport PageContext from '@bingads-webui-static-legacy/page-context';\r\nimport { getStyles } from './style';\r\n\r\nexport const LegacyBudget = React.memo(({\r\n id, className, campaignId, budget, onChange, i18n, validationDailyMinBudget, hideBudgetMinRecommendation,\r\n}) => {\r\n const view = useRef();\r\n const viewListener = useMemo(() => clone(Backbone.Events), []);\r\n let container;\r\n\r\n useEffect(() => {\r\n view.current = new BudgetView({\r\n withRealTimeUpdates: true,\r\n model: budget,\r\n campaignId,\r\n isForVNext: true,\r\n hideDailyBudgetOptions: true,\r\n showBudgetMinRecommend: PageContext.Permissions.dynamic.BCCBudgetImprovementEnabled &&\r\n campaignId !== undefined &&\r\n !hideBudgetMinRecommendation,\r\n currencySymbol: i18n.getCurrencySymbol(PageContext.AccountCurrencyCode),\r\n minimumBudget: budget ? budget.Amount * 0.5 : undefined,\r\n validationDailyMinBudget,\r\n });\r\n\r\n view.current.render();\r\n view.current.$el.appendTo(container);\r\n\r\n return () => {\r\n view.current.remove();\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n viewListener.listenTo(view.current, 'change', onChange);\r\n\r\n return () => viewListener.stopListening(view.current);\r\n }, [onChange, viewListener]);\r\n\r\n useEffect(() => {\r\n view.current.update(budget);\r\n }, [budget]);\r\n\r\n const classes = useDefaultStyles(getStyles);\r\n\r\n return (\r\n \r\n
{ container = ref; }} />\r\n
\r\n );\r\n});\r\n\r\nLegacyBudget.propTypes = {\r\n id: PropTypes.string,\r\n className: PropTypes.string,\r\n campaignId: PropTypes.string,\r\n budget: PropTypes.shape({\r\n Amount: PropTypes.number,\r\n }),\r\n onChange: PropTypes.func.isRequired,\r\n i18n: PropTypes.shape({ getCurrencySymbol: PropTypes.func.isRequired }).isRequired,\r\n validationDailyMinBudget: PropTypes.number,\r\n hideBudgetMinRecommendation: PropTypes.bool,\r\n};\r\n\r\nLegacyBudget.defaultProps = {\r\n id: undefined,\r\n className: undefined,\r\n budget: undefined,\r\n campaignId: undefined,\r\n validationDailyMinBudget: undefined,\r\n hideBudgetMinRecommendation: false,\r\n};\r\n","import React, { forwardRef, useImperativeHandle, useMemo } from 'react';\r\nimport { isString } from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport { RemainingCharsValidatedTextField } from '@bingads-webui-campaign-react/remaining-chars-hint';\r\nimport { ResponsiveAd } from '@bingads-webui/campaign-odata-schemas';\r\nimport { buildLegacyI18n } from '@bingads-webui/build-legacy-i18n';\r\nimport { ValidationStringMap } from '@bingads-webui/validation-string-map';\r\n\r\nexport const CallToActionAriaText = forwardRef(({ i18n, value }, ref) => {\r\n const textFieldRef = React.useRef(null); // Create a ref for the TextField\r\n const [errorMessage, setErrorMessage] = React.useState('');\r\n const { maxLength } = ResponsiveAd.properties.CallToActionAriaText;\r\n\r\n const legacyI18n = useMemo(() => buildLegacyI18n(i18n, [ValidationStringMap]), [i18n]);\r\n\r\n const getErrorMessage = (newValue) => {\r\n if (isString(newValue)) {\r\n if (newValue.length > maxLength) {\r\n return i18n.getString(_TL_('Value cannot be longer than 30 characters'));\r\n }\r\n return '';\r\n }\r\n return '';\r\n };\r\n\r\n useImperativeHandle(ref, () => ({\r\n getData: () => textFieldRef.current.value.trim(),\r\n isValid: () => {\r\n const newValue = textFieldRef.current.value.trim();\r\n const message = getErrorMessage(newValue);\r\n setErrorMessage(message);\r\n return message === '';\r\n },\r\n }));\r\n\r\n const handleChange = (event, [newValue]) => {\r\n setErrorMessage(getErrorMessage(newValue));\r\n };\r\n\r\n return (\r\n (field === 'delete_value' ? '' : field),\r\n },\r\n }}\r\n />\r\n );\r\n});\r\n\r\nCallToActionAriaText.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n value: PropTypes.string,\r\n};\r\n\r\nCallToActionAriaText.defaultProps = {\r\n value: '',\r\n};\r\n","import React, { forwardRef, useMemo, useImperativeHandle } from 'react';\r\nimport { isString } from 'underscore';\r\nimport { RemainingCharsValidatedTextField } from '@bingads-webui-campaign-react/remaining-chars-hint';\r\nimport { ResponsiveAd } from '@bingads-webui/campaign-odata-schemas';\r\nimport { buildLegacyI18n } from '@bingads-webui/build-legacy-i18n';\r\nimport { ValidationStringMap } from '@bingads-webui/validation-string-map';\r\n\r\n\r\n// eslint-disable-next-line no-underscore-dangle\r\ndeclare let _TL_: any;\r\n\r\ninterface CallToActionTextProps {\r\n i18n: any;\r\n defaultValue: string;\r\n}\r\n\r\nexport const CallToActionText: React.FC = forwardRef(({ i18n, defaultValue = '' }: CallToActionTextProps, ref) => {\r\n const legacyI18n = useMemo(() => buildLegacyI18n(i18n, [ValidationStringMap]), [i18n]);\r\n const textFieldRef = React.useRef(null); // Create a ref for the TextField\r\n const [errorMessage, setErrorMessage] = React.useState('');\r\n const { maxLength }= ResponsiveAd.properties.CallToActionText;\r\n\r\n const getErrorMessage = (newValue) => {\r\n if (isString(newValue)) {\r\n if (newValue.trim() === '') {\r\n return i18n.getString(_TL_('Required field'));\r\n } else if (newValue.length > maxLength) {\r\n return i18n.getString(_TL_('Value cannot be longer than 15 characters'));\r\n }\r\n return '';\r\n }\r\n return '';\r\n };\r\n\r\n useImperativeHandle(ref, () => ({\r\n getData: (): string => textFieldRef.current.value.trim(),\r\n isValid: () => {\r\n const value = textFieldRef.current.value.trim();\r\n const message = getErrorMessage(value);\r\n setErrorMessage(message);\r\n return message === '';\r\n },\r\n }));\r\n\r\n const handleChange = (event, [newValue]) => {\r\n setErrorMessage(getErrorMessage(newValue));\r\n };\r\n\r\n const validationSchema = useMemo(() => ({\r\n type: 'object',\r\n properties: {\r\n CallToActionText: {\r\n ...ResponsiveAd.properties.CallToActionText,\r\n required: true,\r\n },\r\n },\r\n }), []);\r\n\r\n return (\r\n \r\n );\r\n});\r\n\r\n","import { mergeStyles, convertToLocalStyle, actionDropdownStyles } from '@bingads-webui-campaign-react/common-styles';\r\n\r\nexport const getStyles = (components, theme) => ({\r\n callToActionContainer: {\r\n ...mergeStyles(\r\n { theme },\r\n convertToLocalStyle(actionDropdownStyles(theme, { dropdownMinWidthPx: 281, noLeftMargin: true })),\r\n components.searchboxStyle\r\n ),\r\n },\r\n languageContainer: {\r\n ...mergeStyles(\r\n { theme },\r\n convertToLocalStyle(actionDropdownStyles(theme, { dropdownMinWidthPx: 281, noLeftMargin: true }))\r\n ),\r\n\r\n '& .actionextension-search-dropdown-container .dropdown-menu': {\r\n top: 'unset',\r\n },\r\n\r\n marginBottom: '15px',\r\n },\r\n});\r\n","import { contains, has } from 'underscore';\r\nimport { globalizationModelSetup } from '@bingads-webui-campaign/ads-globalization';\r\n\r\nconst langCodeMapper = {\r\n 'zh-cn': 'SimplifiedChinese',\r\n 'zh-hans': 'SimplifiedChinese',\r\n ar: 'Arabic',\r\n bg: 'Bulgarian',\r\n bs: 'Bosnian',\r\n cs: 'Czech',\r\n da: 'Danish',\r\n de: 'German',\r\n el: 'Greek',\r\n en: 'English',\r\n es: 'Spanish',\r\n et: 'Estonian',\r\n fi: 'Finnish',\r\n fr: 'French',\r\n hr: 'Croatian',\r\n hu: 'Hungarian',\r\n is: 'Icelandic',\r\n it: 'Italian',\r\n iw: 'Hebrew',\r\n ja: 'Japanese',\r\n lt: 'Lithuanian',\r\n lv: 'Latvian',\r\n mk: 'Macedonian',\r\n mt: 'Maltese',\r\n nl: 'Dutch',\r\n no: 'Norwegian',\r\n pl: 'Polish',\r\n pt: 'Portuguese',\r\n ro: 'Romanian',\r\n ru: 'Russian',\r\n sk: 'Slovak',\r\n sl: 'Slovenian',\r\n sq: 'Albanian',\r\n sr: 'Serbian',\r\n sv: 'Swedish',\r\n tr: 'Turkish',\r\n zh: 'TraditionalChinese',\r\n};\r\n\r\nconst getLocalLanguage = locale => locale.split('-')[0];\r\n\r\nconst FALLBACK_LANGUAGE_CODE = 'en';\r\nconst DEFAULT_LANGUAGE = 'English';\r\nconst localeToLanguage = (locale = '') => {\r\n const lcLocale = locale.toLocaleLowerCase();\r\n const localesToTry = [lcLocale, getLocalLanguage(lcLocale), FALLBACK_LANGUAGE_CODE];\r\n for (let i = 0; i < localesToTry.length; i += 1) {\r\n const localeToTry = localesToTry[i];\r\n if (has(langCodeMapper, localeToTry)) {\r\n return langCodeMapper[localeToTry];\r\n }\r\n }\r\n return DEFAULT_LANGUAGE;\r\n};\r\n\r\nexport const getLanguage = (permissions, locale) => {\r\n const { LANGUAGES: supportedLanguages } = globalizationModelSetup({ permissions, culture: locale });\r\n const language = localeToLanguage(locale);\r\n if (contains(supportedLanguages, language)) {\r\n return language;\r\n } else if (permissions && permissions.IsDomesticSimplifiedChineseEnabled && contains(supportedLanguages, 'SimplifiedChinese')) {\r\n return 'SimplifiedChinese';\r\n }\r\n return DEFAULT_LANGUAGE;\r\n};\r\n","import { isEmpty, noop, isFunction } from 'underscore';\r\nimport ko from 'knockout';\r\nimport React, { useCallback, useEffect, useState, useRef, useContext, useMemo } from 'react';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport BackboneCallToActionAdapter from '@bingads-webui-campaign-legacy/adextension-actionlink/view/action-type-adapter';\r\nimport BackboneCallToActionLanguageAdapter from '@bingads-webui-campaign-legacy/adextension-actionlink/view/language-adapter';\r\n\r\nimport { CallToActionAriaText } from './call-to-action-aria-text';\r\nimport { CallToActionText } from './call-to-action-text';\r\nimport { getStyles } from './style';\r\nimport { getLanguage } from './locale-to-language';\r\n\r\n// Wraps legacy @bingads-webui-component-legacy/adextension-actionlink/view/action-type-adapter component\r\nexport const LegacyCallToAction = React.memo(({\r\n id, className, value, setNewCTACallback, languageValue, ctaText, ctaAriaText, onChange, locale, permissions, isPmaxAd, isBoostScenario, isBoostCustomCTAEnabled, isCustomCTAEnabled, valueText,\r\n}) => {\r\n const view = useRef();\r\n\r\n const i18n = useContext(I18nContext);\r\n const languageView = useRef();\r\n const isBoostAccount = permissions && permissions.IsAmplifyEnabled;\r\n const isBoostCTAAriaTextEnabled = isBoostAccount && permissions && permissions.IsBoostCTAAriaTextEnabled;\r\n\r\n let container;\r\n\r\n let languageContainer;\r\n\r\n const [cta, setCta] = useState(null);\r\n const [ctaString, setCtaString] = useState(null);\r\n const [language, setLanguage] = useState(null);\r\n\r\n const viewModel = useMemo(() => ({\r\n ActionType: ko.observable(!isEmpty(value) ? value : null),\r\n Language: ko.observable(languageValue || getLanguage(permissions, locale)),\r\n }), [languageValue, locale, permissions, value]);\r\n\r\n const updateCTA = (selectedOption) => {\r\n setCta(selectedOption.id);\r\n setCtaString(selectedOption.value);\r\n };\r\n\r\n const updateLanguage = (selectedOption) => {\r\n setLanguage(selectedOption.id);\r\n };\r\n\r\n useEffect(() => {\r\n if (setNewCTACallback) {\r\n setNewCTACallback(() => ({ CallToAction, CallToActionLanguage }) => {\r\n if (CallToActionLanguage) {\r\n viewModel.Language = ko.observable(CallToActionLanguage);\r\n viewModel.ActionType(CallToAction);\r\n view.current.observable(CallToAction);\r\n view.current.render();\r\n\r\n if (languageView && languageView.current && isFunction(languageView.current.render)) {\r\n languageView.current.observable = viewModel.Language;\r\n languageView.current.render();\r\n }\r\n } else {\r\n view.current.observable(CallToAction);\r\n view.current.render();\r\n }\r\n });\r\n }\r\n }, [setNewCTACallback, viewModel]);\r\n\r\n useEffect(() => {\r\n const actionTypeAdapter = new BackboneCallToActionAdapter({\r\n observable: viewModel.ActionType,\r\n viewModel,\r\n callback: (selectedOption) => {\r\n updateCTA(selectedOption);\r\n },\r\n isPmaxAd,\r\n isBoostScenario,\r\n isBoostCustomCTAEnabled,\r\n isCustomCTAEnabled,\r\n defaultActionText: valueText,\r\n });\r\n\r\n const languageAdapter = new BackboneCallToActionLanguageAdapter({\r\n observable: viewModel.Language,\r\n viewModel,\r\n callback: (selectedOption) => {\r\n updateLanguage(selectedOption);\r\n },\r\n isBoostScenario,\r\n isBoostCustomCTAEnabled,\r\n });\r\n\r\n if (isBoostScenario) {\r\n languageView.current = languageAdapter;\r\n languageView.current.render();\r\n languageView.current.$el.appendTo(languageContainer);\r\n }\r\n\r\n view.current = actionTypeAdapter;\r\n\r\n view.current.render();\r\n view.current.$el.appendTo(container);\r\n\r\n\r\n return () => {\r\n view.current.remove();\r\n };\r\n // We want the view to be created only once,\r\n // hence ignoring all dependencies of this \"effect\".\r\n // This means that the view will ignore changes to all props.\r\n // If need be to make view pick props updates, the view\r\n // need to provide a way to communicate such updates to it.\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(\r\n () => {\r\n // for pmax ad, maintain same logic\r\n if (!isBoostScenario && cta !== null) {\r\n onChange(cta, ctaString);\r\n }\r\n\r\n // for display plus boost campaigns add language and cta text\r\n if (isBoostScenario) {\r\n if (cta !== null && language !== null) {\r\n onChange({ cta, language });\r\n }\r\n }\r\n }\r\n , [cta, ctaString, isBoostScenario, language, onChange]\r\n );\r\n\r\n const classes = useDefaultStyles(getStyles);\r\n\r\n const onGlobalShortcut = useCallback((e) => {\r\n if (e.key === 'Escape' && document.getElementsByClassName('dropdown-search-selector__dropdown open').length > 0) {\r\n e.preventDefault();\r\n document.getElementsByClassName('row btn btn-default dropdown-toggle')[0].click();\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n document.addEventListener('keyup', onGlobalShortcut);\r\n return () => {\r\n document.removeEventListener('keyup', onGlobalShortcut);\r\n };\r\n }, [i18n, onGlobalShortcut]);\r\n return (\r\n <>\r\n \r\n
{ languageContainer = ref; }} />\r\n
\r\n \r\n
{ container = ref; }} />\r\n
\r\n \r\n { /* this is a validated contrl so it directly reports to parent validation group */}\r\n {cta === 'CustomText' && }\r\n \r\n\r\n {\r\n isBoostCTAAriaTextEnabled && (\r\n
\r\n \r\n
\r\n )\r\n }\r\n \r\n );\r\n});\r\n\r\nLegacyCallToAction.propTypes = {\r\n id: PropTypes.string,\r\n className: PropTypes.string,\r\n\r\n locale: PropTypes.string.isRequired,\r\n permissions: PropTypes.shape({}).isRequired,\r\n value: PropTypes.string,\r\n onChange: PropTypes.func,\r\n isPmaxAd: PropTypes.bool,\r\n isBoostScenario: PropTypes.bool,\r\n isBoostCustomCTAEnabled: PropTypes.bool,\r\n ctaText: PropTypes.string,\r\n ctaAriaText: PropTypes.string,\r\n languageValue: PropTypes.string,\r\n isCustomCTAEnabled: PropTypes.bool,\r\n valueText: PropTypes.string,\r\n setNewCTACallback: PropTypes.func,\r\n};\r\n\r\nLegacyCallToAction.defaultProps = {\r\n id: undefined,\r\n className: undefined,\r\n value: undefined,\r\n onChange: noop,\r\n isPmaxAd: false,\r\n isBoostScenario: false,\r\n isBoostCustomCTAEnabled: false,\r\n ctaText: null,\r\n ctaAriaText: null,\r\n languageValue: null,\r\n isCustomCTAEnabled: false,\r\n valueText: '',\r\n setNewCTACallback: null,\r\n};\r\n","import React, { useCallback, useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withCustomValidation } from '@bingads-webui-react/validation';\r\nimport { ActivityContext } from '@bingads-webui-react/hoc-with-signal';\r\nimport { LegacyCallToAction } from './legacy-call-to-action';\r\n\r\nconst LegacyCallToActionWithCustomValidation = ({\r\n validationProps, updateValidation, setNewCTACallback, ...restProps\r\n}) => {\r\n const { data } = validationProps;\r\n\r\n const activity = useContext(ActivityContext);\r\n const onChange = useCallback((CallToAction, CallToActionValue) => {\r\n updateValidation([], { CallToAction, CallToActionValue });\r\n\r\n if (activity) {\r\n activity.signal(`onLegacyCallToActionChange - ${JSON.stringify(CallToAction)}`);\r\n }\r\n }, [updateValidation, activity]);\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nLegacyCallToActionWithCustomValidation.propTypes = {\r\n validationProps: PropTypes.shape({\r\n data: PropTypes.shape({\r\n CallToAction: PropTypes.string,\r\n CallToActionValue: PropTypes.string,\r\n }),\r\n }).isRequired,\r\n updateValidation: PropTypes.func.isRequired,\r\n setNewCTACallback: PropTypes.func,\r\n};\r\n\r\nLegacyCallToActionWithCustomValidation.defaultProps = {\r\n setNewCTACallback: null,\r\n};\r\n\r\nexport const ValidatedLegacyCallToAction = withCustomValidation(LegacyCallToActionWithCustomValidation);\r\n","import { getActionText } from '@bingads-webui-campaign-legacy/adextension-actionlink/model/language-type-text-mapper';\r\n\r\n\r\nexport const actionTextLocalization = (language, actionType) => {\r\n const ctaInfo = {\r\n Language: language,\r\n ActionType: actionType,\r\n };\r\n\r\n return getActionText(ctaInfo);\r\n};\r\n","import { noop } from 'underscore';\r\nimport ko from 'knockout';\r\nimport React, { useEffect, useRef, useState, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { Label } from '@fluentui/react';\r\nimport { HelpPopup } from '@bingads-webui-react/help-popup';\r\nimport { HelpLink } from '@bingads-webui-react/help-link';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport BackboneCallToActionAdapter from '@bingads-webui-campaign-legacy/adextension-actionlink/view/action-type-adapter';\r\nimport BackboneLanguageAdapter from '@bingads-webui-campaign-legacy/adextension-actionlink/view/language-adapter';\r\nimport { ReactTemplate } from '@bingads-webui-react/react-template';\r\n\r\nimport { getStyles } from './style';\r\n\r\nexport const CallToActionDescription = ({\r\n isMMAAutomatedCTAOptInEnabled, automatedCTAEnable, i18n, isDisplayPlusMMA, isBulk,\r\n}) => {\r\n if (!isMMAAutomatedCTAOptInEnabled) {\r\n if (isDisplayPlusMMA) {\r\n return (\r\n ({text}),\r\n }}\r\n template={i18n.getString(_TL_('\"Automated\" is the default option for your call to action’s {{b}}Language{{/b}} and {{b}}Action text{{/b}}. This means that we’ll automatically choose your call to action and the language it serves in during ad delivery.'))}\r\n />\r\n );\r\n }\r\n return (\r\n \r\n {i18n.getString(_TL_('We\\'ve updated call to action options fields to default to Language \"Automated\" and Action text \"Automated\"'))}\r\n \r\n );\r\n }\r\n\r\n const helpLinkElement = {i18n.getString(_TL_('Learn more'))};\r\n const boldFinalUrlElement = {i18n.getString(_TL_('Final URL'))};\r\n const boldEnableMMAAutoElement = {i18n.getString(_TL_('Enable autogenerated calls to action for Multimedia ads'))};\r\n\r\n if (!isBulk && automatedCTAEnable) {\r\n return (\r\n <>\r\n \r\n {i18n.getString(_TL_('You’ve enabled auto-generated assets for multimedia ads. This setting automatically generates assets to enhance ad relevance and performance. Please note that automated call to actions are the only auto-generated assets currently supported for multimedia ads. We use information pulled from your '))}\r\n \r\n {boldFinalUrlElement}\r\n {i18n.getString(_TL_(' as well as any assets you provide to automatically generate additional assets for your ads when available. '))}\r\n {helpLinkElement}\r\n \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {\r\n isBulk ?\r\n i18n.getString(_TL_('Enable this option in your campaign settings to allow Microsoft Advertising to automatically generate assets for your multimedia ads. We pull information and content from ')) :\r\n i18n.getString(_TL_('You’ve opted out of auto-generated assets for multimedia ads. This means that we won’t automatically generate assets from your '))\r\n }\r\n \r\n {boldFinalUrlElement}\r\n {i18n.getString(_TL_(' to enhance ad relevance and performance. To enable this setting, select the checkbox next to '))}\r\n {boldEnableMMAAutoElement}\r\n {i18n.getString(_TL_(' in your campaign settings. '))}\r\n {helpLinkElement}\r\n \r\n );\r\n};\r\n\r\nCallToActionDescription.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n isMMAAutomatedCTAOptInEnabled: PropTypes.bool,\r\n automatedCTAEnable: PropTypes.bool,\r\n isDisplayPlusMMA: PropTypes.bool,\r\n isBulk: PropTypes.bool,\r\n};\r\n\r\nCallToActionDescription.defaultProps = {\r\n isMMAAutomatedCTAOptInEnabled: false,\r\n automatedCTAEnable: false,\r\n isDisplayPlusMMA: false,\r\n isBulk: false,\r\n};\r\n\r\nexport const LegacyCallToActionWithLanguage = React.memo(({\r\n id, className, value, onChange, isDisplayPlusMMA, i18n, setNewCTACallback, isMMAAutomatedCTAOptInEnabled, automatedCTAEnable, isBulk, isMultimediaAd,\r\n}) => {\r\n const ctaView = useRef();\r\n const langView = useRef();\r\n\r\n const { cta, language, ctaText } = value || {};\r\n const [selectedCta, setSelectedCta] = useState(cta);\r\n const [selectedLanguage, setSelectedLanguage] = useState(language);\r\n const [selectedCtaText, setSelectedCtaText] = useState(ctaText || cta);\r\n\r\n let ctaContainer;\r\n let langContainer;\r\n\r\n const viewModel = useMemo(() => ({\r\n ActionType: ko.observable(cta),\r\n Language: ko.observable(language),\r\n }), [cta, language]);\r\n\r\n useEffect(() => {\r\n if (setNewCTACallback) {\r\n setNewCTACallback(() => ({ CallToAction, CallToActionLanguage }) => {\r\n if (CallToActionLanguage) {\r\n viewModel.Language = ko.observable(CallToActionLanguage);\r\n viewModel.ActionType(CallToAction);\r\n ctaView.current.observable(CallToAction);\r\n ctaView.current.render();\r\n\r\n langView.current.observable = viewModel.Language;\r\n langView.current.render();\r\n } else {\r\n ctaView.current.observable(CallToAction);\r\n ctaView.current.render();\r\n }\r\n });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [setNewCTACallback]);\r\n\r\n useEffect(() => {\r\n const languageAdapter = new BackboneLanguageAdapter({\r\n observable: viewModel.Language,\r\n isDisplayPlusMMA,\r\n isMultimediaAd,\r\n viewModel,\r\n callback: (selectedOption) => {\r\n setSelectedLanguage(selectedOption.id);\r\n },\r\n noEntiyCheck: true,\r\n isMMAAutomatedCTAOptInEnabled,\r\n });\r\n\r\n const actionTypeAdapter = new BackboneCallToActionAdapter({\r\n observable: viewModel.ActionType,\r\n isDisplayPlusMMA,\r\n isMultimediaAd,\r\n viewModel,\r\n callback: (selectedOption) => {\r\n setSelectedCta(selectedOption.id);\r\n setSelectedCtaText(selectedOption.value);\r\n },\r\n noEntiyCheck: true,\r\n isMMAAutomatedCTAOptInEnabled,\r\n });\r\n\r\n ctaView.current = actionTypeAdapter;\r\n ctaView.current.render();\r\n ctaView.current.$el.appendTo(ctaContainer);\r\n\r\n langView.current = languageAdapter;\r\n langView.current.render();\r\n langView.current.$el.appendTo(langContainer);\r\n\r\n return () => {\r\n langView.current.remove();\r\n ctaView.current.remove();\r\n };\r\n // Only init once\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n onChange({ cta: selectedCta, language: selectedLanguage }, { ctaText: selectedCtaText });\r\n }, [onChange, selectedCta, selectedCtaText, selectedLanguage]);\r\n\r\n const classes = useDefaultStyles(getStyles);\r\n const tooltipId = isDisplayPlusMMA ? 'pop_BA_AudAds_CTA_Text' : 'pop_BA_AdExtensions_ActionText';\r\n return (\r\n
\r\n \r\n \r\n \r\n
{ langContainer = ref; }} />\r\n
\r\n\r\n \r\n \r\n
{ ctaContainer = ref; }} />\r\n
\r\n
\r\n );\r\n});\r\n\r\nLegacyCallToActionWithLanguage.propTypes = {\r\n id: PropTypes.string,\r\n className: PropTypes.string,\r\n value: PropTypes.shape({\r\n cta: PropTypes.string,\r\n language: PropTypes.string,\r\n }).isRequired,\r\n onChange: PropTypes.func,\r\n isDisplayPlusMMA: PropTypes.bool,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n setNewCTACallback: PropTypes.func,\r\n isMMAAutomatedCTAOptInEnabled: PropTypes.bool,\r\n isMultimediaAd: PropTypes.bool,\r\n automatedCTAEnable: PropTypes.bool,\r\n isBulk: PropTypes.bool,\r\n};\r\n\r\nLegacyCallToActionWithLanguage.defaultProps = {\r\n id: undefined,\r\n className: undefined,\r\n onChange: noop,\r\n isDisplayPlusMMA: false,\r\n setNewCTACallback: null,\r\n isMMAAutomatedCTAOptInEnabled: false,\r\n isMultimediaAd: false,\r\n automatedCTAEnable: false,\r\n isBulk: false,\r\n};\r\n","import React, { useCallback, useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withCustomValidation } from '@bingads-webui-react/validation';\r\nimport { ActivityContext } from '@bingads-webui-react/hoc-with-signal';\r\n\r\nimport { LegacyCallToActionWithLanguage } from './legacy-call-to-action-with-language';\r\n\r\nconst LegacyCallToActionWithLanguageWithCustomValidation = ({\r\n validationProps, updateValidation, setNewCTACallback, onChange: onChangeFromProps, ...restProps\r\n}) => {\r\n const { data } = validationProps;\r\n\r\n const activity = useContext(ActivityContext);\r\n const onChange = useCallback((updates, extraParameters) => {\r\n updateValidation([], { CallToAction: updates });\r\n onChangeFromProps(extraParameters);\r\n\r\n if (activity) {\r\n activity.signal(`onLegacyCallToActionWithLanguageChange - ${JSON.stringify(updates)}`);\r\n }\r\n }, [updateValidation, onChangeFromProps, activity]);\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nLegacyCallToActionWithLanguageWithCustomValidation.propTypes = {\r\n validationProps: PropTypes.shape({\r\n data: PropTypes.shape({\r\n CallToAction: PropTypes.string,\r\n CallToActionLanguage: PropTypes.string,\r\n }),\r\n }).isRequired,\r\n updateValidation: PropTypes.func.isRequired,\r\n onChange: PropTypes.func,\r\n setNewCTACallback: PropTypes.func,\r\n};\r\n\r\nLegacyCallToActionWithLanguageWithCustomValidation.defaultProps = {\r\n onChange: () => {},\r\n setNewCTACallback: null,\r\n};\r\n\r\nexport const ValidatedLegacyCallToActionWithLanguage = withCustomValidation(LegacyCallToActionWithLanguageWithCustomValidation);\r\n","import React, { useMemo, useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {\r\n TextTitle,\r\n ValidatedFixedPanel,\r\n getPanelErrorProps,\r\n} from '@bingads-webui-campaign/wizard-jumbo-card';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\n\r\nimport { ValidatedLegacyCallToActionWithLanguage } from './validated-legacy-call-to-action-with-language';\r\nimport CallToActionImg from '../media/call-to-action.svg';\r\n\r\nexport const ValidatedLegacyCallToActionWithLanguageSection = ({\r\n callToAction, isDisplayPlusMMA, setNewCTACallback, isMultimediaAd, isMMAAutomatedCTAOptInEnabled, automatedCTAEnable, isBulk, onChange, ...rest\r\n}) => {\r\n const i18n = useContext(I18nContext);\r\n const ctaValidationProps = useMemo(() => ({\r\n data: callToAction,\r\n }), [callToAction]);\r\n\r\n return (\r\n \r\n }\r\n noOverflowHidden\r\n relativePosition\r\n attentionBeaconProps={{ getExtraProps: getPanelErrorProps }}\r\n {...rest}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nValidatedLegacyCallToActionWithLanguageSection.propTypes = {\r\n isMMAAutomatedCTAOptInEnabled: PropTypes.bool,\r\n isDisplayPlusMMA: PropTypes.bool,\r\n isMultimediaAd: PropTypes.bool,\r\n automatedCTAEnable: PropTypes.bool,\r\n callToAction: PropTypes.shape({\r\n cta: PropTypes.string,\r\n language: PropTypes.string,\r\n }).isRequired,\r\n onChange: PropTypes.func.isRequired,\r\n isBulk: PropTypes.bool,\r\n setNewCTACallback: PropTypes.func,\r\n};\r\n\r\nValidatedLegacyCallToActionWithLanguageSection.defaultProps = {\r\n isDisplayPlusMMA: false,\r\n isMMAAutomatedCTAOptInEnabled: false,\r\n isMultimediaAd: false,\r\n automatedCTAEnable: false,\r\n isBulk: false,\r\n setNewCTACallback: null,\r\n};\r\n","\r\nimport React from 'react';\r\n\r\nexport const LegacyDepsContext = React.createContext('');\r\n\r\n\r\nexport const withLegacyDeps = AReactComponent => (props => (\r\n \r\n {\r\n context => \r\n }\r\n ));\r\n","export const getRequestFormStyle = (_, { palette = {} }) => ({\r\n requestFormContainer: {\r\n '& .form-horizontal': {\r\n margin: 0,\r\n maxWidth: 784,\r\n border: 0,\r\n boxShadow: 'none',\r\n '& .form-group': {\r\n margin: '0px 0px 18px 0px',\r\n '& .root': {\r\n width: 'unset',\r\n margin: 0,\r\n padding: 0,\r\n '& .error': {\r\n color: '#a4262c',\r\n },\r\n '& > label': {\r\n padding: 0,\r\n },\r\n '& .title': {\r\n fontWeight: 'normal',\r\n },\r\n '& .details': {\r\n margin: '27px 0px 0px 0px',\r\n padding: 0,\r\n '& .col-sm-4': {\r\n padding: '0px 0px 0px 1px',\r\n width: '50%',\r\n '& .appeal-column-title': {\r\n fontSize: 18,\r\n lineHeight: '24px',\r\n fontWeight: 'normal',\r\n },\r\n '& .reasons > ul': {\r\n margin: '1px 0px 0px 0px',\r\n paddingLeft: 0,\r\n listStyle: 'none',\r\n '& > li': {\r\n marginTop: '10px',\r\n },\r\n },\r\n },\r\n '& .col-sm-8': {\r\n width: '50%',\r\n paddingLeft: 14,\r\n paddingRight: 0,\r\n '& .appeal-column-title': {\r\n fontSize: 14,\r\n lineHeight: '19px',\r\n fontWeight: 600,\r\n },\r\n '& .appeal-textarea': {\r\n marginTop: 7,\r\n padding: 8,\r\n fontSize: 14,\r\n lineHeight: '19px',\r\n border: `1px solid ${palette.neutralSecondary}`,\r\n borderRadius: '2px',\r\n background: '#FFFFFF',\r\n width: '100%',\r\n },\r\n '& .remaining-hint': {\r\n textAlign: 'right',\r\n marginTop: 3,\r\n marginBottom: 3,\r\n fontSize: 12,\r\n lineHeight: '16px',\r\n },\r\n },\r\n },\r\n '& .non-appeal-msg-panel': {\r\n margin: '11px 0px 0px 1px',\r\n },\r\n },\r\n },\r\n },\r\n },\r\n});\r\n","import { clone } from 'underscore';\r\nimport Backbone from 'backbone';\r\nimport React, { useEffect, useRef, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport EditorView from '@bingads-webui-campaign-legacy/editorial-appeal/view/editor';\r\nimport '@bingads-webui-campaign/ko-stop-binding';\r\nimport { getRequestFormStyle } from './style';\r\n\r\nexport const LegacyEditorialAppealRequestForm = React.memo(({\r\n id, className, appealTitle, infoMsg, appealData, appealIds, onChange,\r\n}) => {\r\n const view = useRef();\r\n const viewListener = useMemo(() => clone(Backbone.Events), []);\r\n let container;\r\n\r\n useEffect(() => {\r\n view.current = new EditorView({\r\n appealData,\r\n appealTitle,\r\n infoMsg,\r\n hideAppealCheckBox: true,\r\n isForVNext: true,\r\n withRealTimeUpdates: true,\r\n });\r\n\r\n viewListener.listenTo(view.current, 'change', onChange);\r\n\r\n view.current.render();\r\n view.current.$el.appendTo(container);\r\n\r\n view.current.toBulk(appealIds);\r\n\r\n return () => {\r\n viewListener.stopListening(view.current);\r\n view.current.remove();\r\n };\r\n }, [appealTitle, container, appealData, appealIds, infoMsg, viewListener, onChange]);\r\n\r\n const classes = useDefaultStyles(getRequestFormStyle);\r\n\r\n return (\r\n \r\n
{ container = ref; }} />\r\n
\r\n );\r\n});\r\n\r\nLegacyEditorialAppealRequestForm.propTypes = {\r\n id: PropTypes.string,\r\n className: PropTypes.string,\r\n appealData: PropTypes.shape({}).isRequired,\r\n appealIds: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.number, PropTypes.string])).isRequired,\r\n appealTitle: PropTypes.string.isRequired,\r\n infoMsg: PropTypes.string,\r\n onChange: PropTypes.func.isRequired,\r\n};\r\n\r\nLegacyEditorialAppealRequestForm.defaultProps = {\r\n id: undefined,\r\n className: undefined,\r\n infoMsg: undefined,\r\n};\r\n","import React, { useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport InlineErrorView from '@bingads-webui-campaign-legacy/editorial-appeal/view/inline-error';\r\nimport '@bingads-webui-campaign/ko-stop-binding';\r\nimport { getRequestFormStyle } from './style';\r\n\r\nexport const LegacyInlineErrorView = React.memo(({\r\n id, className,\r\n}) => {\r\n const view = useRef();\r\n let container;\r\n\r\n useEffect(() => {\r\n view.current = new InlineErrorView({ rowId: 'bulk', useKwCss: true });\r\n\r\n view.current.render();\r\n view.current.$el.appendTo(container);\r\n\r\n return () => {\r\n view.current.remove();\r\n };\r\n }, [container]);\r\n\r\n const classes = useDefaultStyles(getRequestFormStyle);\r\n\r\n return (\r\n \r\n
{ container = ref; }} />\r\n
\r\n );\r\n});\r\n\r\nLegacyInlineErrorView.propTypes = {\r\n id: PropTypes.string,\r\n className: PropTypes.string,\r\n};\r\n\r\nLegacyInlineErrorView.defaultProps = {\r\n id: undefined,\r\n className: undefined,\r\n};\r\n","/* eslint-disable no-param-reassign */\r\nimport ko from 'knockout';\r\nimport { isArray, each, bind, isEqual } from 'underscore';\r\nimport React from 'react';\r\nimport classnames from 'classnames';\r\nimport PropTypes from 'prop-types';\r\nimport { Toggle, Text } from '@fluentui/react';\r\nimport { cloneDeep } from '@bingads-webui-universal/primitive-utilities';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport AutoTargetView from '@bingads-webui-campaign-legacy/auto-targets/view/create/index';\r\nimport { dsaCampaignStyles, creationCommonStyle, campaignSettingsStyles, adgroupsKeywordsStyles } from '@bingads-webui-campaign-react/campaign-adgroup-settings-shared-styles';\r\nimport { withDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\n\r\nexport const getStyles = (_, { palette = {} }) => (\r\n Object.assign(\r\n {},\r\n {\r\n finalUrlContainer: Object.assign(\r\n {},\r\n creationCommonStyle({ palette }),\r\n dsaCampaignStyles({ palette }),\r\n campaignSettingsStyles({ palette }),\r\n adgroupsKeywordsStyles({ palette })\r\n ),\r\n }\r\n )\r\n);\r\n\r\nclass LegacyFinalUrlExpansionUnStyled extends React.Component {\r\n static propTypes = {\r\n data: PropTypes.shape({\r\n length: PropTypes.number,\r\n }).isRequired,\r\n onChange: PropTypes.func.isRequired,\r\n setFinalUrlExpansionsView: PropTypes.func.isRequired,\r\n isFinalUrlExpansionEnabled: PropTypes.bool.isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n classes: PropTypes.shape({\r\n finalUrlContainer: PropTypes.string,\r\n }).isRequired,\r\n };\r\n constructor(props) {\r\n super(props);\r\n\r\n const { isFinalUrlExpansionEnabled } = props;\r\n this.state = { isFinalUrlExpansionEnabled };\r\n this.view = React.createRef();\r\n this.container = null;\r\n this.operatorMap = {\r\n Equals: this.props.i18n.getString(_TL_('equals')),\r\n Contains: this.props.i18n.getString(_TL_('contains')),\r\n };\r\n\r\n this.operandMap = {\r\n Url: this.props.i18n.getString(_TL_('URL')),\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.setViewAndUpdateViewModel();\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n if (!isEqual(prevProps.data, this.props.data) || prevProps.isFinalUrlExpansionEnabled !== this.props.isFinalUrlExpansionEnabled) {\r\n this.setViewAndUpdateViewModel();\r\n }\r\n // We will refresh the view if data changes\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }\r\n\r\n setViewAndUpdateViewModel() {\r\n if (this.state.isFinalUrlExpansionEnabled) {\r\n if (!this.view.current) {\r\n this.view.current = new AutoTargetView({\r\n isForVNext: true,\r\n onChange: bind((newData) => {\r\n this.props.onChange({\r\n finalUrlExpansionOptOut: !this.state.isFinalUrlExpansionEnabled,\r\n finalUrlExpansionsBulkUpsert: newData,\r\n });\r\n }),\r\n isNegativeAutoTarget: true,\r\n isShowUrlOnly: true,\r\n selectedItem: 'mixedspecificwebpage',\r\n hideViewSelection: true,\r\n hideWebsiteLabel: true,\r\n isExclude: true,\r\n });\r\n }\r\n\r\n this.view.current.render();\r\n this.view.current.$el.appendTo(this.container);\r\n this.props.setFinalUrlExpansionsView(this.view);\r\n\r\n if (isArray(this.props.data)) {\r\n let toAddToViewModel = [];\r\n this.view.current.updateViewModels(cloneDeep(this.props.data));\r\n each(this.props.data, (target) => {\r\n let isExactMatch = false;\r\n const conditions = target.Criterion.WebPage.Parameter.Conditions;\r\n const results = [];\r\n\r\n each(conditions, (condition) => {\r\n if (condition.Operator === 'Equals') {\r\n isExactMatch = true;\r\n results.push({\r\n conditions: [{\r\n Operand: condition.Operand,\r\n ArgumentOperand: condition.ArgumentOperand,\r\n Operator: condition.Operator,\r\n DisplayOperator: this.operatorMap[condition.Operator],\r\n DisplayOperand: this.operandMap[condition.Operand],\r\n },\r\n ],\r\n type: 'exacturls',\r\n });\r\n } else {\r\n results.push({\r\n Operand: ko.observable(condition.Operand),\r\n ArgumentOperand: ko.observable(condition.ArgumentOperand),\r\n Operator: ko.observable(condition.Operator),\r\n DisplayOperator: ko.observable(this.operatorMap[condition.Operator]),\r\n DisplayOperand: ko.observable(this.operandMap[condition.Operand]),\r\n });\r\n }\r\n });\r\n\r\n if (isExactMatch) {\r\n toAddToViewModel = toAddToViewModel.concat(results);\r\n } else {\r\n toAddToViewModel.push({\r\n conditions: results,\r\n type: 'specificpage',\r\n shouldCheckArgumentOperandFormat: true,\r\n });\r\n }\r\n });\r\n if (this.props.data.length > 0) {\r\n this.view.current.selectedTargetsView.viewmodel.addBatch(toAddToViewModel);\r\n }\r\n }\r\n\r\n return () => {\r\n this.view.current.remove();\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n static i8n = I18nContext;\r\n\r\n render() {\r\n const onToggle = (event, checked) => {\r\n this.setState({\r\n isFinalUrlExpansionEnabled: checked,\r\n }, () => {\r\n if (!checked) {\r\n this.view.current.selectedTargetsView.viewmodel.clear();\r\n } else {\r\n this.props.onChange({\r\n finalUrlExpansionOptOut: false,\r\n });\r\n }\r\n });\r\n };\r\n\r\n return (\r\n \r\n \r\n {this.state.isFinalUrlExpansionEnabled &&\r\n
\r\n
\r\n \r\n {this.props.i18n.getString(_TL_('You have the option to exclude certain webpages from being displayed in your ads. Please note that these URLs won’t appear in your ads even if you’ve enabled Final URL expansion. The exclusion list requires 24 hours for it to become fully effective.'))}\r\n \r\n
\r\n
{ this.container = ref; }} />\r\n
\r\n }\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport const LegacyFinalUrlExpansion = withDefaultStyles(LegacyFinalUrlExpansionUnStyled, getStyles);\r\n","/* eslint-disable react-hooks/exhaustive-deps */\r\nimport React, { useCallback, useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { withCustomValidation } from '@bingads-webui-react/validation';\r\nimport { ActivityContext } from '@bingads-webui-react/hoc-with-signal';\r\nimport { LegacyFinalUrlExpansion } from './legacy-final-url-expansion';\r\n\r\n\r\nconst LegacyFinalUrlExpansionWithCustomValidation = ({ validationProps, updateValidation, ...restProps }) => {\r\n const { data: finalUrlExpansions } = validationProps;\r\n\r\n const activity = useContext(ActivityContext);\r\n\r\n const i18n = useContext(I18nContext);\r\n const onChange = useCallback((newData) => {\r\n updateValidation([], newData);\r\n\r\n if (activity) {\r\n activity.signal(`onLegacyFinalUrlExpansionChange - ${JSON.stringify(newData)}`);\r\n }\r\n }, [updateValidation]);\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nLegacyFinalUrlExpansionWithCustomValidation.propTypes = {\r\n validationProps: PropTypes.shape({\r\n data: PropTypes.shape({}),\r\n }).isRequired,\r\n updateValidation: PropTypes.func.isRequired,\r\n};\r\n\r\nexport const ValidatedLegacyFinalUrlExpansion = withCustomValidation(LegacyFinalUrlExpansionWithCustomValidation);\r\n","import { mergeStyles } from '@bingads-webui-campaign-react/common-styles';\r\n\r\nexport const getStyles = (theme, palette = {}) => ({\r\n budgetContainer: {\r\n ...mergeStyles(\r\n { theme },\r\n {\r\n '& .container-budget': {\r\n '& span': {\r\n color: palette.neutralPrimary,\r\n },\r\n '& .form-control-static': {\r\n padding: '9px 0px',\r\n lineHeight: '14px',\r\n minHeight: 'auto',\r\n },\r\n '& .input-group': {\r\n marginLeft: 15,\r\n '& .input-group-addon': {\r\n color: '#323130',\r\n border: 0,\r\n padding: '6px',\r\n background: '#ffffff',\r\n },\r\n },\r\n '& .col-sm-3': {\r\n display: 'table',\r\n paddingRight: 0,\r\n paddingLeft: 0,\r\n },\r\n '& .margin-rt-five': {\r\n paddingLeft: 28,\r\n },\r\n\r\n },\r\n '& span.bold': {\r\n fontWeight: 1000,\r\n },\r\n '& .alert-budget-button': {\r\n marginLeft: '10px',\r\n paddingTop: '5px',\r\n '& button': {\r\n color: 'black',\r\n fontSize: '13px',\r\n fontWeight: 500,\r\n borderColor: '#edebe9',\r\n },\r\n },\r\n }\r\n ),\r\n },\r\n});\r\n","/* eslint-disable react-hooks/exhaustive-deps */\r\nimport React, { useEffect, useRef, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { clone } from 'underscore';\r\nimport classnames from 'classnames';\r\nimport Backbone from 'backbone';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport BudgetView from '@bingads-webui-campaign-legacy/budget/view/budget';\r\nimport SharedBudgetView from '@bingads-webui-campaign-legacy/shared-budget/view/shared-budget-switch-editor';\r\nimport '@bingads-webui-campaign/ko-stop-binding';\r\nimport PageContext from '@bingads-webui-static-legacy/page-context';\r\nimport { getStyles } from './style';\r\n\r\nexport const LegacySharedBudget = React.memo(({\r\n id,\r\n className,\r\n campaignId,\r\n budget,\r\n onChange,\r\n i18n,\r\n validationDailyMinBudget,\r\n hideBudgetMinRecommendation,\r\n noApplyBudgetFromSharedLibrary,\r\n}) => {\r\n const view = useRef();\r\n const viewListener = useMemo(() => clone(Backbone.Events), []);\r\n let container;\r\n\r\n useEffect(() => {\r\n const budgetFactory = SharedBudgetView.newFactory(BudgetView);\r\n const showBudgetMinRecommend = campaignId !== undefined && !hideBudgetMinRecommendation;\r\n const minimumBudget = budget ? budget.Amount * 0.5 : undefined;\r\n\r\n view.current = budgetFactory({\r\n withRealTimeUpdates: true,\r\n model: budget,\r\n campaignId,\r\n isForVNext: true,\r\n hideDailyBudgetOptions: false,\r\n showBudgetMinRecommend,\r\n currencySymbol: i18n.getCurrencySymbol(PageContext.AccountCurrencyCode),\r\n minimumBudget,\r\n validationDailyMinBudget,\r\n showInitialUiBlocker: false,\r\n noApplyBudgetFromSharedLibrary,\r\n showNoSharedBudgetLink: true,\r\n });\r\n\r\n view.current.render();\r\n view.current.$el.appendTo(container);\r\n\r\n return () => {\r\n view.current.remove();\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n viewListener.listenTo(view.current, 'change', onChange);\r\n\r\n return () => viewListener.stopListening(view.current);\r\n }, [onChange, viewListener]);\r\n\r\n const classes = useDefaultStyles(getStyles);\r\n\r\n return (\r\n \r\n
{ container = ref; }} />\r\n
\r\n );\r\n});\r\n\r\nLegacySharedBudget.propTypes = {\r\n id: PropTypes.string,\r\n className: PropTypes.string,\r\n campaignId: PropTypes.string,\r\n budget: PropTypes.shape({\r\n Amount: PropTypes.number,\r\n }),\r\n onChange: PropTypes.func.isRequired,\r\n i18n: PropTypes.shape({ getCurrencySymbol: PropTypes.func.isRequired }).isRequired,\r\n validationDailyMinBudget: PropTypes.number,\r\n hideBudgetMinRecommendation: PropTypes.bool,\r\n noApplyBudgetFromSharedLibrary: PropTypes.bool,\r\n};\r\n\r\nLegacySharedBudget.defaultProps = {\r\n id: undefined,\r\n className: undefined,\r\n budget: undefined,\r\n campaignId: undefined,\r\n validationDailyMinBudget: undefined,\r\n hideBudgetMinRecommendation: false,\r\n noApplyBudgetFromSharedLibrary: false,\r\n};\r\n","export const getStyles = () => ({\r\n shoppingSettings: {\r\n '& .control-label': {\r\n marginTop: 12,\r\n },\r\n\r\n '& .filteredProducts .helpbutton': {\r\n marginLeft: '6px !important',\r\n },\r\n\r\n '& .col-sm-offset-2': {\r\n marginLeft: 0,\r\n },\r\n\r\n '& .col-sm-6': {\r\n minWidth: 650,\r\n },\r\n },\r\n});\r\n","/* eslint-disable no-param-reassign */\r\n/* eslint-disable react-hooks/exhaustive-deps */\r\nimport React, { useEffect, useRef, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport classnames from 'classnames';\r\nimport Backbone from 'backbone';\r\n\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport ShoppingSettings from '@bingads-webui-campaign-legacy/shopping-campaign/view/campaign-creation/shopping-settings';\r\nimport '@bingads-webui-campaign/ko-stop-binding';\r\n\r\nimport { getStyles } from './style';\r\n\r\n// Only for sponsored campaigns\r\nexport const LegacyShoppingSettings = React.memo(({\r\n id,\r\n className,\r\n onChange,\r\n shoppingSettingsRef,\r\n shoppingSettingOptions,\r\n}) => {\r\n const view = useRef();\r\n const viewListener = useMemo(() => _.clone(Backbone.Events), []);\r\n const { data } = shoppingSettingOptions;\r\n\r\n let container;\r\n\r\n useEffect(() => {\r\n if (_.isEmpty(data)) {\r\n return _.noop;\r\n }\r\n\r\n view.current = new ShoppingSettings(shoppingSettingOptions);\r\n\r\n shoppingSettingsRef.current = view.current;\r\n\r\n viewListener.listenTo(view.current, 'change', onChange);\r\n\r\n view.current.render();\r\n view.current.$el.appendTo(container);\r\n\r\n return () => {\r\n viewListener.stopListening(view.current);\r\n view.current.remove();\r\n };\r\n }, [data, shoppingSettingOptions.isCPSSelected]);\r\n\r\n const classes = useDefaultStyles(getStyles);\r\n\r\n return (\r\n \r\n
{ container = ref; }} />\r\n
\r\n );\r\n});\r\n\r\nLegacyShoppingSettings.propTypes = {\r\n id: PropTypes.string,\r\n className: PropTypes.string,\r\n onChange: PropTypes.func.isRequired,\r\n shoppingSettingsRef: PropTypes.shape({}).isRequired,\r\n shoppingSettingOptions: PropTypes.shape({\r\n data: PropTypes.shape({}),\r\n isCPSSelected: PropTypes.bool,\r\n }).isRequired,\r\n};\r\n\r\nLegacyShoppingSettings.defaultProps = {\r\n id: undefined,\r\n className: undefined,\r\n};\r\n","export const LISTING_GROUP_PERF_MARKER = 'Listing_Group';\r\nexport const LISTING_GROUP_TREE_ROUTING = '/campaign/vnext/listinggroups/hierarchy';\r\nexport const LISTING_GROUP_LIST_ROUTING = '/campaign/vnext/listinggroups/list';\r\nexport enum GridType {\r\n List = 'List',\r\n Tree = 'Tree',\r\n}\r\nexport const GRID_NAME = 'ListingGroupGrid';\r\nexport const columnChooserId = 'dropdown-column-chooser';\r\nexport enum ScopeLevel {\r\n Campaign = 'campaign',\r\n AssetGroup = 'assetGroup',\r\n}\r\nexport const nameColumnOdataPath = 'Condition/Attribute';\r\n\r\nexport const treeViewButtonId = 'button-hierarchy-view';\r\n\r\nexport const listViewButtonId = 'button-list-view';\r\n\r\nexport const firstColumnName = 'primary';\r\nexport const conversionsFiledName = 'conversions';\r\nexport const impressionsFiledName = 'impressions';\r\nexport const clicksFiledName = 'clicks';\r\nexport const hotelsFiledName = 'hotels';\r\n\r\nexport const EVERYTHING_ELSE_NODE_ATTRIBUTE = '';\r\n\r\nexport type NullPartial = {\r\n [P in keyof T]: T[P] | null;\r\n};\r\n","import { mergeStyles } from '@fluentui/react';\r\n\r\nexport const paginatorStyleClassName = mergeStyles({\r\n display: 'flex',\r\n '& .page-size-selector': {\r\n display: 'flex',\r\n '& .page-size-selector-dropdown': {\r\n marginLeft: 8,\r\n },\r\n },\r\n '& .page-index-selector': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n marginLeft: 12,\r\n '& .page-index-selector-dropdown': {\r\n marginRight: 8,\r\n },\r\n '& .page-change-icon': {\r\n marginLeft: 8,\r\n marginRight: 8,\r\n },\r\n },\r\n});\r\n","/* eslint-disable react/prop-types */\r\n/* eslint-disable react/jsx-filename-extension */\r\nimport { assert } from '@bingads-webui-campaign-react/debug-assert';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { Dropdown, IconButton, IDropdownOption, Label, IDropdownProps } from '@fluentui/react';\r\nimport { useId } from '@fluentui/react-hooks';\r\nimport React, { FC, useContext } from 'react';\r\nimport { paginatorStyleClassName } from './paginator.styles';\r\n\r\nexport interface PaginatorProps {\r\n className?: string;\r\n /**\r\n * @default _TL_(\"Show rows:\")\r\n */\r\n pageSizeLabel?: string;\r\n /**\r\n * @default [10,20,50]\r\n */\r\n pageSizeOptions?: number[];\r\n totalCount: number;\r\n currentPage: number;\r\n pageSize: number;\r\n onPageIndexChange(pageNum: number): void;\r\n onPageSizeChange(pageSize: number): void;\r\n}\r\n\r\nfunction buildPageSizeOptions(selectedPageSize: number, pageSizeOptions: number[]): IDropdownOption[] {\r\n assert(pageSizeOptions.includes(selectedPageSize));\r\n return pageSizeOptions.map(pageSize => ({\r\n key: pageSize,\r\n text: pageSize.toString(),\r\n selected: selectedPageSize === pageSize,\r\n data: pageSize,\r\n }));\r\n}\r\n\r\nfunction buildPageIndexOptions(selectedPageIndex: number, pageIndexOptions: number[]): IDropdownOption[] {\r\n assert(pageIndexOptions.includes(selectedPageIndex));\r\n return pageIndexOptions.map(pageIndex => ({\r\n key: pageIndex,\r\n text: pageIndex.toString(),\r\n selected: selectedPageIndex === pageIndex,\r\n data: pageIndex,\r\n }));\r\n}\r\n\r\nexport const Paginator: FC = (props) => {\r\n const {\r\n className,\r\n currentPage,\r\n onPageIndexChange,\r\n onPageSizeChange,\r\n pageSize,\r\n totalCount,\r\n pageSizeLabel = _TL_('Show rows:'),\r\n pageSizeOptions = [10, 20, 50],\r\n } = props;\r\n assert(currentPage >= 1);\r\n const i18n: any = useContext(I18nContext);\r\n const pageCount = Math.ceil(totalCount / pageSize);\r\n\r\n const pageSizeSelectorId = useId('page-size-selector');\r\n const pageSizeSelectorOptions = buildPageSizeOptions(pageSize, pageSizeOptions);\r\n const pageIndexSelectorOptions = buildPageIndexOptions(currentPage, Array.from(Array(pageCount), (_, i) => i + 1));\r\n\r\n const PREVIOUS_BUTTON = i18n.getString(_TL_('Previous page'));\r\n const NEXT_BUTTON = i18n.getString(_TL_('Next page'));\r\n\r\n function pageIndexChangeHandler(newPageIndex: number) {\r\n onPageIndexChange(newPageIndex);\r\n }\r\n\r\n function onPageSizeSelectorChange(event: React.FormEvent, option?: IDropdownOption) {\r\n const newPageSize = option.data;\r\n onPageSizeChange(newPageSize);\r\n\r\n // when change page size, the currentPageIndex might be out of range. If so, set it to the new last page.\r\n const newMaxPageNum = Math.ceil(totalCount / newPageSize);\r\n if (currentPage > newMaxPageNum) {\r\n pageIndexChangeHandler(newMaxPageNum);\r\n }\r\n }\r\n\r\n const onPageIndexSelectorChange: IDropdownProps['onChange'] = (event, option) => {\r\n pageIndexChangeHandler(option.data);\r\n };\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n { pageIndexChangeHandler(currentPage - 1); }}\r\n />\r\n \r\n {` / ${pageCount}`}\r\n { pageIndexChangeHandler(currentPage + 1); }}\r\n />\r\n
\r\n
\r\n );\r\n};\r\n","/* eslint-disable react/prop-types */\r\n/* eslint-disable react/jsx-filename-extension */\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { DefaultButton, PrimaryButton, Stack, TextField, ITextFieldProps, mergeStyles } from '@fluentui/react';\r\nimport React, { FC, useContext, useState } from 'react';\r\n\r\nexport interface BulkAddEditorProps {\r\n className?: string;\r\n onSubmit(bulkValues: string[]): void;\r\n onCancel(): void;\r\n}\r\n\r\nfunction formatRawString(value: string) {\r\n const values = value.split(/[\\n\\r]/).map(str => str.trim()).filter(str => str !== '');\r\n const unqiue = new Set();\r\n const res: string[] = [];\r\n values.forEach((v) => {\r\n if (!unqiue.has(v.toLowerCase())) {\r\n unqiue.add(v);\r\n res.push(v);\r\n }\r\n });\r\n return res;\r\n}\r\n\r\nconst bulkAddEditorStyleClassName = mergeStyles({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n '& .bulk-add-editor-textarea': {\r\n paddingLeft: 16,\r\n paddingRight: 16,\r\n },\r\n});\r\n\r\n// This component is only used for add new bulk-enabled values\r\nexport const BulkAddEditor: FC = (props) => {\r\n const {\r\n className,\r\n onCancel,\r\n onSubmit,\r\n } = props;\r\n const i18n: any = useContext(I18nContext);\r\n\r\n const [value, setValue] = useState('');\r\n\r\n function onClickSubmit() {\r\n const finalValues = formatRawString(value ?? '');\r\n onSubmit(finalValues);\r\n }\r\n\r\n function onClickCancel() {\r\n onCancel();\r\n }\r\n\r\n const onValueChange: ITextFieldProps['onChange'] = (event, newValue) => {\r\n setValue(newValue);\r\n };\r\n\r\n return (\r\n
\r\n \r\n
\r\n \r\n {i18n.getString(_TL_('Submit'))}\r\n {i18n.getString(_TL_('Cancel'))}\r\n \r\n
\r\n
\r\n );\r\n};\r\n","/* eslint-disable react/jsx-filename-extension */\r\n/* eslint-disable react/prop-types */\r\nimport { assertIsDefined } from '@bingads-webui-campaign-react/debug-assert';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { DefaultButton, Dropdown, IColumn, IDropdownOption, Label, Panel, PanelType, PrimaryButton, ShimmeredDetailsList, Stack, Selection, IGroup, IDetailsListCheckboxProps, IRenderFunction, mergeStyles, CheckboxVisibility, CollapseAllVisibility, CommandBarButton, IIconProps, IDropdownProps, MessageBar } from '@fluentui/react';\r\nimport { useId, usePrevious } from '@fluentui/react-hooks';\r\nimport { Loading } from '@bingads-webui-campaign-react/loading';\r\nimport { ListViewSelectionZone } from '@bingads-webui-grid/well-known';\r\nimport React, { FC, useContext, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Paginator } from './paginator';\r\nimport { BulkAddEditorProps, BulkAddEditor } from './BulkAddEditor';\r\n\r\nconst panelStyles = {\r\n main: {\r\n top: 60,\r\n },\r\n content: {\r\n paddingLeft: 0,\r\n paddingRight: 0,\r\n display: 'flex',\r\n overflow: 'hidden',\r\n },\r\n footerInner: {\r\n padding: 0,\r\n borderTop: '1px solid #EDEBE9',\r\n },\r\n} as const;\r\n\r\nconst overlayProps = {\r\n styles: {\r\n root: {\r\n top: 60,\r\n },\r\n },\r\n};\r\n\r\nconst panelSelectorStyleClassName = mergeStyles({\r\n '& .content': {\r\n display: 'flex',\r\n flex: 1,\r\n flexDirection: 'column',\r\n '& .divider': {\r\n display: 'flex',\r\n marginLeft: 28,\r\n marginTop: 16,\r\n marginBottom: 16,\r\n '& .divider-dropdown': {\r\n marginLeft: 8,\r\n width: 220,\r\n },\r\n },\r\n '& .bulk-value-editor-toggler': {\r\n height: 32,\r\n marginLeft: 28,\r\n marginTop: 16,\r\n marginBottom: 6,\r\n },\r\n '& .grid': {\r\n overflow: 'hidden',\r\n display: 'flex',\r\n flex: 1,\r\n flexDirection: 'column',\r\n '& .list-view-selection-zone': {\r\n display: 'flex',\r\n flex: 1,\r\n overflow: 'hidden',\r\n },\r\n '& .ms-Viewport': {\r\n display: 'flex',\r\n flex: 1,\r\n '& .ms-DetailsList': {\r\n marginBottom: 0,\r\n '& div[role=grid]': {\r\n height: '100%',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n '& .ms-DetailsList-contentWrapper': {\r\n overflowY: 'overlay',\r\n overflowX: 'hidden',\r\n '.ms-List-cell': {\r\n minHeight: 0, // empty group should not ocupy any space\r\n },\r\n },\r\n },\r\n },\r\n },\r\n '& .paginator': {\r\n marginLeft: 16,\r\n marginTop: 12,\r\n },\r\n },\r\n '& .error-region': {\r\n color: '#A80000',\r\n },\r\n },\r\n});\r\n\r\nconst onRenderSquareCheckbox: IRenderFunction = (props) => {\r\n assertIsDefined(props, 'props of checkbox render is undefined');\r\n const { checked } = props;\r\n\r\n // Do not use Chekbox of FluentUI. It is hard to manage events when working with `SelectionZone`(used by DetailsList)\r\n return ();\r\n};\r\n\r\nconst addIcon: IIconProps = { iconName: 'Add' };\r\n\r\nexport type WithBulk =\r\n { __bulk?: boolean; } & T;\r\n\r\nexport interface PanelSelectorProps {\r\n enableShimmer?: boolean;\r\n isOpen: boolean;\r\n /**\r\n *\r\n */\r\n onSave: (selectedItems: WithBulk[], selectedDimension: IDropdownOption) => void;\r\n onCancel: () => void;\r\n /**\r\n * Dimension Dropdown\r\n *\r\n * Control this variable to show default selected dimension\r\n */\r\n dimensions: IDropdownOption[];\r\n onSelectedDimensionChange: NonNullable;\r\n columns: IColumn[];\r\n /**\r\n * If the key of item is a negative number, it is added by `bulk add values`\r\n */\r\n items: any[];\r\n initialSelectedItems: any[];\r\n headerText: string;\r\n keyOfItem: (item: any) => string;\r\n /**\r\n * Some dimensions are avaliable to give arbitry values to divide them.\r\n *\r\n * If so, enable this flag so user could input arbitry values.\r\n */\r\n isBulkAddEnabledForDimension: (diemnsion: IDropdownOption) => boolean;\r\n\r\n // Error handing\r\n getErrors?: (selectedItems: any[], selectedDimension: IDropdownOption) => string[];\r\n}\r\n\r\nfunction copyAndSort(items: T[], columnKey: string, isSortedDescending?: boolean): T[] {\r\n const key = columnKey as keyof T;\r\n return items.slice(0).sort((a, b) => {\r\n const aValue = a[key];\r\n const bValue = b[key];\r\n let res = 0;\r\n if (aValue !== undefined && bValue !== undefined) {\r\n res = aValue > bValue ? 1 : -1;\r\n } else if (aValue === undefined && bValue === undefined) {\r\n res = 0;\r\n } else {\r\n // assume undefined as -Infinate\r\n res = aValue !== undefined ? 1 : -1;\r\n }\r\n return isSortedDescending ? -res : res;\r\n });\r\n}\r\n\r\nexport const PanelSelector: FC = (props) => {\r\n const {\r\n enableShimmer, isOpen, headerText,\r\n columns, items, dimensions,\r\n onCancel, onSave, onSelectedDimensionChange,\r\n initialSelectedItems, keyOfItem, isBulkAddEnabledForDimension,\r\n getErrors,\r\n } = props;\r\n const i18n: any = useContext(I18nContext);\r\n\r\n const preItems = usePrevious(items);\r\n const preColumns = usePrevious(columns);\r\n const preDimensions = usePrevious(dimensions);\r\n const preInitialSelectedItems = usePrevious(initialSelectedItems);\r\n\r\n const [finalItems, setFinalItemsImpl] = useState(items);\r\n const setFinalItems: typeof setFinalItemsImpl = (param) => {\r\n let finalValue;\r\n if (typeof param === 'function') {\r\n setFinalItemsImpl((pre) => {\r\n finalValue = param(pre);\r\n return finalValue;\r\n });\r\n } else {\r\n finalValue = param;\r\n setFinalItemsImpl(finalValue);\r\n }\r\n\r\n // / sync items and selected to selection\r\n // when dimension is still same, if all items are all selected in pre state, keep all selected\r\n // when dimension is changed, only when next dimension is default dimension and `initialSelectedItems` is `finalItems`, it is all selected\r\n\r\n const defaultSelectedDimension = getDefaultSelectedDimension();\r\n assertIsDefined(defaultSelectedDimension);\r\n assertIsDefined(selectedDimension);\r\n const isSelectedDimensionChanged = previousSelectedDimension?.key !== selectedDimension.key;\r\n\r\n const isCurrentAllSelected = selection.isAllSelected();\r\n let isNextAllSelect = false;\r\n const isDefaultDimensionSelected = selectedDimension.key === defaultSelectedDimension.key;\r\n if (isDefaultDimensionSelected && initialSelectedItems.length !== 0) {\r\n isNextAllSelect = initialSelectedItems.length === finalValue.length; // a quick and dirty check\r\n }\r\n\r\n const isEventSupressed = isSelectedDimensionChanged ? isCurrentAllSelected === isNextAllSelect : true;\r\n\r\n selection.setChangeEvents(false);\r\n if (finalValue) {\r\n selection.setItems(finalValue, true);\r\n }\r\n selection.setChangeEvents(true, isEventSupressed);\r\n if (isNextAllSelect) {\r\n setSelectedItemKeys(initialSelectedItems.map(keyOfItem));\r\n }\r\n setSelectedItemKeys((selectedItemKeys) => {\r\n selection.setChangeEvents(false);\r\n selectedItemKeys.forEach((key) => {\r\n selection.setKeySelected(key, true, false);\r\n });\r\n selection.setChangeEvents(true, isEventSupressed);\r\n return selectedItemKeys;\r\n });\r\n };\r\n\r\n const [finalColumns, setFinalColumns] = useState(columns);\r\n\r\n const [selectedItemKeys, setSelectedItemKeys] = useState([]);\r\n\r\n const selection = useMemo(() => new Selection({\r\n onSelectionChanged: () => {\r\n // The main purpose is to sync user operation to `selectedItemKeys`\r\n setSelectedItemKeys((pre) => {\r\n const newSelectedItemKeysCandidate = selection.getSelection().map(keyOfItem);\r\n if (pre.join() !== newSelectedItemKeysCandidate.join()) { return newSelectedItemKeysCandidate; }\r\n return pre;\r\n });\r\n },\r\n getKey: keyOfItem,\r\n items: finalItems,\r\n }), []);\r\n\r\n useEffect(() => {\r\n // if dimensions changes, update selectedDimension\r\n // if defualt selected dimension changes, update selectedDimension\r\n if (\r\n dimensions.map(dimension => dimension.key).join() !== (preDimensions?.map(dimension => dimension.key) ?? []).join()\r\n || dimensions.map(dimension => dimension.selected).join() !== (preDimensions?.map(dimension => dimension.selected) ?? []).join()\r\n ) {\r\n setSelectedDimension(getDefaultSelectedDimension());\r\n }\r\n\r\n // if items chagnes, update finalItems\r\n if (items.map(keyOfItem).join() !== (preItems?.map(keyOfItem) ?? []).join()) {\r\n setFinalItems(items);\r\n }\r\n\r\n // if initialSelectedItems changes, update selectedItemKeys\r\n if (initialSelectedItems.map(keyOfItem).join() !== preInitialSelectedItems?.map(keyOfItem).join()) {\r\n setSelectedItemKeys(initialSelectedItems.map(keyOfItem));\r\n }\r\n\r\n // if selection does not match selectedItemKeys, sync to selectedItemKeys\r\n if (selectedItemKeys.join() !== selection.getSelection().map(keyOfItem).join()) {\r\n selection.setChangeEvents(false);\r\n selectedItemKeys.forEach((key) => {\r\n selection.setKeySelected(key, true, false);\r\n });\r\n selection.setChangeEvents(true, true);\r\n }\r\n\r\n // if columns changes, update finalColumns\r\n if (columns.map(c => c.key).join() !== (preColumns?.map(c => c.key) ?? []).join()) {\r\n setFinalColumns(columns);\r\n // eslint-disable-next-line brace-style\r\n }\r\n // if column changes, we do not need to update binding of finalColumns\r\n else {\r\n // bind column click\r\n finalColumns.forEach((finalColumn) => {\r\n // eslint-disable-next-line no-param-reassign\r\n finalColumn.onColumnClick = (ev, column) => {\r\n // bind sort\r\n // eslint-disable-next-line @typescript-eslint/no-shadow\r\n setFinalColumns((preColumns) => {\r\n let { isSortedDescending } = column;\r\n if (column.isSorted) {\r\n isSortedDescending = !isSortedDescending;\r\n }\r\n setFinalItems(pre =>\r\n copyAndSort(pre, column.fieldName!, isSortedDescending));\r\n return preColumns.map(preColumn => ({\r\n ...preColumn,\r\n isSorted: preColumn.key === column.key,\r\n isSortedDescending: preColumn.key === column.key ? isSortedDescending : undefined,\r\n }));\r\n });\r\n };\r\n });\r\n }\r\n });\r\n\r\n const dimensionSelectorId = useId('divide-by');\r\n\r\n const [currentPageSize, setCurrentPageSize] = useState(20);\r\n const [currentPageIndex, setCurrentPageIndex] = useState(1);\r\n\r\n // use groups as false pages\r\n const pageCount = Math.ceil(finalItems.length / currentPageSize);\r\n\r\n const groups: IGroup[] = Array(pageCount).fill(null).map((_, i) => ({\r\n key: i.toString(), // maybe we should add currentPageSize and currentPageIndex as part of key?\r\n name: '', // name is not important, the group header should never be rendered.\r\n startIndex: i * currentPageSize,\r\n count: currentPageSize,\r\n isCollapsed: i + 1 !== currentPageIndex, // page is base-1, array index is base 0\r\n }));\r\n\r\n function onSaveClick() {\r\n const selectedItems = finalItems.filter(item => selectedItemKeys.includes(keyOfItem(item)));\r\n assertIsDefined(selectedDimension);\r\n onSave(selectedItems, selectedDimension);\r\n }\r\n\r\n const onRenderFooterContent = () => (\r\n
\r\n \r\n {i18n.getString(_TL_('Save'))}\r\n {i18n.getString(_TL_('Cancel'))}\r\n \r\n
\r\n );\r\n\r\n const isLoading = enableShimmer;\r\n\r\n const [isBulkAddEditorOpened, setIsBulkAddEditorOpened] = useState(false);\r\n\r\n const [selectedDimension, setSelectedDimension] = useState(getDefaultSelectedDimension);\r\n const previousSelectedDimension = usePrevious(selectedDimension);\r\n\r\n const errors = isLoading ? [] : getErrors?.(\r\n finalItems.filter(item => selectedItemKeys.includes(keyOfItem(item))),\r\n selectedDimension!\r\n );\r\n\r\n /** Always negative and not repeat, chooser a big enough number to avoid conflict with ID from API */\r\n const customCounter = useRef(-100000);\r\n\r\n function onClickBulkAddValues() {\r\n setIsBulkAddEditorOpened(true);\r\n }\r\n\r\n const onBulkAddEditorCancel: BulkAddEditorProps['onCancel'] = () => {\r\n setIsBulkAddEditorOpened(false);\r\n };\r\n\r\n function buildNewItemsByBulkAdd(strings: string[]) {\r\n return strings.map(s => ({\r\n __bulk: true,\r\n key: customCounter.current--,\r\n [firstColumnName]: s,\r\n }));\r\n }\r\n\r\n const onBulkAddEditorCommit: BulkAddEditorProps['onSubmit'] = (newValues) => {\r\n // Note: for current, `PanelSelector` do not do anything like deduplicate, so user might have multi same values\r\n // The callback should make sure the situation is handled correctly\r\n const newItems = buildNewItemsByBulkAdd(newValues);\r\n setFinalItems(pre => [...newItems, ...pre]);\r\n setSelectedItemKeys((pre) => {\r\n const newKeys = newItems.map(item => keyOfItem(item));\r\n const newSelectedItemKeys = [...pre, ...newKeys];\r\n\r\n selection.setChangeEvents(false);\r\n newSelectedItemKeys.forEach((key) => {\r\n selection.setKeySelected(key, true, false);\r\n });\r\n selection.setChangeEvents(true);\r\n\r\n return newSelectedItemKeys;\r\n });\r\n setIsBulkAddEditorOpened(false);\r\n };\r\n\r\n function renderBulkValueEditor() {\r\n return (\r\n
\r\n {selectedDimension && isBulkAddEnabledForDimension(selectedDimension) &&\r\n (!isBulkAddEditorOpened ?\r\n \r\n : )\r\n }\r\n
\r\n );\r\n }\r\n\r\n function getDefaultSelectedDimension() {\r\n return dimensions.find(dimension => dimension.selected === true);\r\n }\r\n\r\n const onSelectedDimensionChangeInner: IDropdownProps['onChange'] = (event, option, index) => {\r\n setSelectedDimension(option!);\r\n onSelectedDimensionChange(event, option, index);\r\n setCurrentPageIndex(1);\r\n };\r\n\r\n\r\n function renderErrorMessages() {\r\n return (\r\n
\r\n {errors?.map(error => (
{error}
))}\r\n
\r\n );\r\n }\r\n\r\n return (\r\n \r\n
\r\n {isLoading ?\r\n \r\n :\r\n \r\n
\r\n \r\n \r\n
\r\n {renderBulkValueEditor()}\r\n {finalItems.length === 0 &&\r\n \r\n {i18n.getString(_TL_('No suggestions available. Please add values manually.'))}\r\n \r\n }\r\n
\r\n {/* After Fluent UI is updated to a version that have `selectionClearedOnSurfaceClick` in `SelectionZone` */}\r\n {/* We should deprecated `ListViewSelectionZone` immediately. */}\r\n \r\n null, // only show items in current page\r\n collapseAllVisibility: CollapseAllVisibility.hidden,\r\n }}\r\n disableSelectionZone\r\n />\r\n \r\n {finalItems.length > 0 && }\r\n
\r\n {renderErrorMessages()}\r\n
\r\n }\r\n
\r\n \r\n );\r\n};\r\n\r\n/**\r\n * This is exported for `bulk add`\r\n *\r\n * Or we could export another callback for `bulk add value`, then let users to change items by themself, but it is kind of heavy.\r\n */\r\nexport const firstColumnName = 'primary';\r\n","import { ColumnRawData } from '@bingads-webui-grid/well-known';\r\n\r\nexport const ListingGroupColumn: ColumnRawData = {\r\n key: 'ListingGroup',\r\n name: _TL_('Listing group'),\r\n};\r\n\r\n/**\r\n * @deprecated\r\n */\r\nexport const AssetGroupColumn: ColumnRawData = {\r\n key: 'AssetGroup',\r\n name: _TL_('Asset group'),\r\n};\r\n\r\nexport const AssetGroupNameColumn: ColumnRawData = {\r\n key: 'AssetGroupName',\r\n name: _TL_('Asset group'),\r\n};\r\n\r\nexport const ListingColumn: ColumnRawData = {\r\n key: 'Listing',\r\n name: _TL_('Products'),\r\n};\r\n\r\nexport const IncludeExcludeColumn: ColumnRawData = {\r\n key: 'IncludeExclude',\r\n name: _TL_('Inclusion'),\r\n};\r\n","/* eslint-disable no-use-before-define */\r\nimport {\r\n absoluteTopImpressionRateColumn, advertiserReportedRevenue, allConversionAdvertiserReportedRevenue, allConversionCPAColumn,\r\n allConversionRateColumn, allConversionRevenueOnAdSpendColumn, allConversionsColumn, averageCPCColumn, averageCPMColumn, clicksColumn, conversionRateColumn,\r\n conversionsColumn, CPAColumn, CTRColumn, impressionsColumn, returnOnAdSpendColumn, spendColumn, I18n, ColumnChooserCategory, SelectOption,\r\n ColumnRawData, ColumnChooserColumnOption, averageCPSColumn, salesCountColumn\r\n} from '@bingads-webui-grid/well-known';\r\nimport { GridType, ScopeLevel } from '../../../constant';\r\nimport {\r\n ListingGroupColumn, AssetGroupNameColumn, IncludeExcludeColumn\r\n} from '../../../rawColumns';\r\n\r\ninterface GetColumnChooserCategoriesOptions {\r\n gridType: GridType,\r\n i18n: I18n,\r\n scopeLevel: ScopeLevel,\r\n permissions: any,\r\n}\r\n\r\nexport function getColumnChooserCategories(parameters: GetColumnChooserCategoriesOptions): ColumnChooserCategory[] {\r\n const {\r\n gridType, i18n, scopeLevel, permissions,\r\n } = parameters;\r\n\r\n const cpsColumnsEnabled = permissions && permissions.dynamic && permissions.dynamic.SupportCPSForPmax;\r\n\r\n const attributesCategory: ColumnChooserCategory = {\r\n name: i18n.getString(_TL_('Attributes')),\r\n type: 'Attributes',\r\n options: getAttributeColumnKeys(gridType, scopeLevel).map(o => buildCategoryOptionFromColumnRawData(o, i18n)),\r\n };\r\n\r\n const performaceCategory: ColumnChooserCategory = {\r\n name: i18n.getString(_TL_('Performance')),\r\n type: 'Performance',\r\n options: getPerfColumnKeys(cpsColumnsEnabled).map(o => buildCategoryOptionFromColumnRawData(o, i18n)),\r\n };\r\n\r\n const conversionsCategory: ColumnChooserCategory = {\r\n name: i18n.getString(_TL_('Conversions')),\r\n type: 'Conversions',\r\n options: getConvColumnKeys(cpsColumnsEnabled).map(o => buildCategoryOptionFromColumnRawData(o, i18n)),\r\n };\r\n\r\n return [\r\n attributesCategory,\r\n performaceCategory,\r\n conversionsCategory,\r\n ];\r\n}\r\n\r\nfunction buildCategoryOptionFromColumnRawData(column: ColumnRawData, i18n: I18n): ColumnChooserColumnOption {\r\n const selectOption = isLockedColumn(column.key);\r\n return {\r\n key: column.key,\r\n name: i18n.getString(column.name),\r\n selectOption,\r\n };\r\n}\r\n\r\nfunction isNotNullOrUndefined(value) {\r\n return value !== null && value !== undefined;\r\n}\r\n\r\nfunction getAttributeColumnKeys(gridType: GridType, scopeLevel: ScopeLevel) {\r\n return [\r\n IncludeExcludeColumn,\r\n ListingGroupColumn,\r\n (scopeLevel === ScopeLevel.Campaign) ? AssetGroupNameColumn : undefined,\r\n ].filter(isNotNullOrUndefined);\r\n}\r\n\r\nfunction getPerfColumnKeys(cpsColumnsEnabled) {\r\n const colmuns = [\r\n clicksColumn,\r\n impressionsColumn,\r\n CTRColumn,\r\n spendColumn,\r\n averageCPCColumn,\r\n averageCPMColumn,\r\n absoluteTopImpressionRateColumn,\r\n ];\r\n if (cpsColumnsEnabled) {\r\n colmuns.push(averageCPSColumn);\r\n }\r\n return colmuns;\r\n}\r\n\r\nfunction getConvColumnKeys(cpsColumnsEnabled) {\r\n const colmuns = [\r\n conversionRateColumn,\r\n conversionsColumn,\r\n CPAColumn,\r\n advertiserReportedRevenue,\r\n returnOnAdSpendColumn,\r\n allConversionsColumn,\r\n allConversionRateColumn,\r\n allConversionRevenueOnAdSpendColumn,\r\n allConversionAdvertiserReportedRevenue,\r\n allConversionCPAColumn,\r\n ];\r\n if (cpsColumnsEnabled) {\r\n colmuns.push(salesCountColumn);\r\n }\r\n return colmuns;\r\n}\r\n\r\nconst lockColumns = new Set([\r\n IncludeExcludeColumn.key,\r\n ListingGroupColumn.key,\r\n AssetGroupNameColumn.key,\r\n]);\r\n\r\nfunction isLockedColumn(columnKey: string) {\r\n return lockColumns.has(columnKey) ? SelectOption.locked : SelectOption.optional;\r\n}\r\n","import {\r\n allConversionCPAColumn,\r\n allConversionRateColumn,\r\n allConversionRevenueOnAdSpendColumn,\r\n allConversionsColumn,\r\n averageCPCColumn,\r\n averageCPMColumn,\r\n clicksColumn,\r\n conversionRateColumn,\r\n conversionsColumn,\r\n CPAColumn,\r\n CTRColumn,\r\n impressionsColumn,\r\n advertiserReportedRevenue,\r\n returnOnAdSpendColumn,\r\n spendColumn,\r\n averageCPSColumn,\r\n salesCountColumn\r\n} from '@bingads-webui-grid/well-known';\r\n\r\nexport const legacyI18nOfListingGroup = {\r\n Schema_PerformanceMetrics_Property_Impressions: impressionsColumn.name,\r\n Schema_PerformanceMetrics_Property_Clicks: clicksColumn.name,\r\n Schema_PerformanceMetrics_Property_CTR: CTRColumn.name,\r\n Schema_PerformanceMetrics_Property_Spend: spendColumn.name,\r\n Schema_PerformanceMetrics_Property_AverageCPC: averageCPCColumn.name,\r\n Schema_PerformanceMetrics_Property_AverageCPM: averageCPMColumn.name,\r\n Schema_PerformanceMetrics_Property_Conversions: conversionsColumn.name,\r\n Schema_PerformanceMetrics_Property_ConversionRate: conversionRateColumn.name,\r\n Schema_PerformanceMetrics_Property_RevenueOnAdSpend: returnOnAdSpendColumn.name,\r\n Schema_PerformanceMetrics_Property_AdvertiserReportedRevenue: advertiserReportedRevenue.name,\r\n Schema_PerformanceMetrics_Property_CPA: CPAColumn.name,\r\n Schema_PerformanceMetrics_Property_AllConversions: allConversionsColumn.name,\r\n Schema_PerformanceMetrics_Property_AllConversionRate: allConversionRateColumn.name,\r\n Schema_PerformanceMetrics_Property_AllConversionRevenueOnAdSpend: allConversionRevenueOnAdSpendColumn.name,\r\n Schema_PerformanceMetrics_Property_AllConversionAdvertiserReportedRevenue: advertiserReportedRevenue.name,\r\n Schema_PerformanceMetrics_Property_AllConversionCPA: allConversionCPAColumn.name,\r\n Schema_PerformanceMetrics_Property_AverageCPS: averageCPSColumn.name,\r\n Schema_PerformanceMetrics_Property_SalesCount: salesCountColumn.name,\r\n Schema_PerformanceMetrics_Property_ViewThroughConversions: _TL_('View-through conv.'),\r\n Schema_PerformanceMetrics_Property_ViewThroughConversionsRevenue: _TL_('View-through conv. revenue'),\r\n Schema_PerformanceMetrics_Property_ViewThroughConversionsCPA: _TL_('View-through conv. CPA'),\r\n Schema_PerformanceMetrics_Property_ViewThroughConversionsReturnOnAdSpend: _TL_('View-through conv. return on ad spend'),\r\n Schema_PerformanceMetrics_Property_ViewThroughConversionsRate: _TL_('View-through conv. rate'),\r\n ProductsGrid_Column_All: _TL_('All products'),\r\n ProductsGrid_Column_Brand: _TL_('Brand'),\r\n ProductsGrid_Column_Category1: _TL_('Category (1st level)'),\r\n ProductsGrid_Column_Category2: _TL_('Category (2nd level)'),\r\n ProductsGrid_Column_Category3: _TL_('Category (3rd level)'),\r\n ProductsGrid_Column_Category4: _TL_('Category (4th level)'),\r\n ProductsGrid_Column_Category5: _TL_('Category (5th level)'),\r\n ProductsGrid_Column_CategoryL1: _TL_('Category (1st level)'),\r\n ProductsGrid_Column_CategoryL2: _TL_('Category (2nd level)'),\r\n ProductsGrid_Column_CategoryL3: _TL_('Category (3rd level)'),\r\n ProductsGrid_Column_CategoryL4: _TL_('Category (4th level)'),\r\n ProductsGrid_Column_CategoryL5: _TL_('Category (5th level)'),\r\n ProductsGrid_Column_Channel: _TL_('Channel'),\r\n ProductsGrid_Column_ChannelExclusivity: _TL_('Channel Exclusivity'),\r\n ProductsGrid_Column_Condition: _TL_('Condition'),\r\n ProductsGrid_Column_CountryOfSale: _TL_('Country/region of sale'),\r\n ProductsGrid_Column_CustomLabel0: _TL_('Custom label 0'),\r\n ProductsGrid_Column_CustomLabel1: _TL_('Custom label 1'),\r\n ProductsGrid_Column_CustomLabel2: _TL_('Custom label 2'),\r\n ProductsGrid_Column_CustomLabel3: _TL_('Custom label 3'),\r\n ProductsGrid_Column_CustomLabel4: _TL_('Custom label 4'),\r\n ProductsGrid_Column_GTIN: _TL_('GTIN'),\r\n ProductsGrid_Column_Id: _TL_('Item ID'),\r\n ProductsGrid_Column_Language: _TL_('Language'),\r\n ProductsGrid_Column_MerchantId: _TL_('Merchant identifier'),\r\n ProductsGrid_Column_MPN: _TL_('MPN'),\r\n ProductsGrid_Column_Price: _TL_('Price'),\r\n ProductsGrid_Column_ProductBought: _TL_('Product Bought'),\r\n ProductsGrid_Column_ProductType1: _TL_('Product type (1st level)'),\r\n ProductsGrid_Column_ProductType2: _TL_('Product type (2nd level)'),\r\n ProductsGrid_Column_ProductType3: _TL_('Product type (3rd level)'),\r\n ProductsGrid_Column_ProductType4: _TL_('Product type (4th level)'),\r\n ProductsGrid_Column_ProductType5: _TL_('Product type (5th level)'),\r\n ProductsGrid_Column_Title: _TL_('Title'),\r\n};\r\n\r\n","import { OdataSystemQueryOptions } from './odata';\r\n\r\ntype CustomQueryOptions = {\r\n [x: string]: any;\r\n}\r\n\r\ntype CustomEntityPath = {\r\n [x: string]: number | string;\r\n}\r\n\r\ninterface AdsOdataGeneralEntityPath {\r\n /**\r\n * one of four general scope levels, will be transformed to `Customers(${customerId})` in url if not undefined\r\n */\r\n customerId?: number | undefined;\r\n /**\r\n * one of four general scope levels, will be transformed to `Accounts(${accountId})` in url if not undefined\r\n */\r\n accountId?: number | undefined;\r\n /**\r\n * one of four general scope levels, will be transformed to `Campaigns(${campaignId})` in url if not undefined\r\n */\r\n campaignId?: number | undefined;\r\n /**\r\n * one of four general scope levels, will be transformed to `AssetGroups(${assetGroupId})` in url if not undefined\r\n */\r\n assetGroupId?: number | undefined;\r\n}\r\n\r\nexport interface AdsOdataAPIParamsBase {\r\n /**\r\n * This property should be handled by user to get the correct URL path. There is no way to predicate the order of entity.\r\n *\r\n * The intention is place all relative things together.\r\n */\r\n entityPath: AdsOdataGeneralEntityPath & CustomEntityPath;\r\n queryOptions?: OdataSystemQueryOptions & CustomQueryOptions;\r\n}\r\n\r\ninterface RequestWithPayload {\r\n payload: Payload;\r\n}\r\n\r\n// Copy from https://stackoverflow.com/a/61132308\r\ntype DeepPartial = T extends object ? {\r\n [P in keyof T]?: DeepPartial;\r\n} : T;\r\n\r\nexport type PostOdataAdsAPIParams = AdsOdataAPIParamsBase & RequestWithPayload;\r\n\r\nexport type PatchOdataAdsAPIParams = AdsOdataAPIParamsBase & RequestWithPayload>;\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nexport type GetOdataAdsAPIParams = AdsOdataAPIParamsBase;\r\n\r\n\r\n// @example\r\n// baseUrl: `https://app1.ui.ads-int.microsoft.com:12000/ODataApi/Campaign/V2/`\r\n// path: `ProductListingGroups/Default.GridData`\r\n// adsOdataParams: { customerId:\"123456789\", queryStrings:{$top:1} }\r\n// --> https://app1.ui.ads-int.microsoft.com:12000/ODataApi/Campaign/V2/Customers(123456789)/ProductListingGroups/Default.GridData&$top=1\r\nexport function getFullUrlOfAdsOdata(baseUrl: string, path: string, adsOdataParams: AdsOdataAPIParamsBase) {\r\n const {\r\n queryOptions, entityPath: {\r\n customerId, accountId, campaignId, assetGroupId,\r\n },\r\n } = adsOdataParams;\r\n\r\n const scopeLevelPath = [\r\n '/',\r\n customerId ? `Customers(${customerId})/` : '',\r\n accountId ? `Accounts(${accountId})/` : '',\r\n campaignId ? `Campaigns(${campaignId})/` : '',\r\n assetGroupId ? `AssetGroups(${assetGroupId})/` : '',\r\n ].join('');\r\n\r\n const queryString = Object.entries(queryOptions ?? []).reduce((cur, [key, value]) => {\r\n if (value) {\r\n cur.set(key, value.toString());\r\n }\r\n return cur;\r\n }, new URLSearchParams()).toString();\r\n\r\n // omit `baseUrl`, for we are using a special fetch\r\n const finalUrl = `${scopeLevelPath}${path}${queryString ? `?${queryString}` : ''}`;\r\n return finalUrl;\r\n}\r\n\r\n/**\r\n * @example\r\n * interface CustomEntityPath1{\r\n * custom1: number | string;\r\n * }\r\n *\r\n * type FinalType = PostOdataAdsAPIParams & WithEntityPath\r\n */\r\nexport interface WithEntityPath {\r\n entityPath: T;\r\n}\r\n","import _ from 'underscore';\r\nimport { assertIsDefined } from '@bingads-webui-campaign-react/debug-assert';\r\nimport { WithTreeViewData } from '@bingads-webui-grid/well-known';\r\nimport { ListingGroupGridItemData } from '../interface';\r\nimport { Model$Listing, Model$ListingCondition, Model$ListingGroup } from '../ApiType';\r\nimport { GetOdataAdsAPIParams, getFullUrlOfAdsOdata } from './adsOdata';\r\n\r\nconst NonSplittableConditions = ['CategoryL1', 'CategoryL2', 'CategoryL3', 'CategoryL4', 'CategoryL5'];\r\n\r\nexport type GetListingGroupConditionsParams = GetOdataAdsAPIParams;\r\n\r\ninterface GetListingGroupConditionsResponseBody {\r\n value: Model$ListingCondition[];\r\n}\r\n\r\nexport function getListingGroupConditionsRequest(baseUrl: string, params: GetListingGroupConditionsParams) {\r\n const path = 'ProductListingGroups/Default.GetProductListingGroupConditions';\r\n const finalUrl = getFullUrlOfAdsOdata(baseUrl, path, params);\r\n return [finalUrl, {\r\n method: 'GET',\r\n }];\r\n}\r\n\r\nexport async function getListingGroupConditionsResponseHandler(responsePromise: Promise) {\r\n const response = await responsePromise;\r\n const responseBody: GetListingGroupConditionsResponseBody = await response.json();\r\n return responseBody;\r\n}\r\n\r\n// If we have used the dimension, it should not be used anymore in its subtree\r\n// @param `pathsToParent` from root to current node, like [rootInfo, path1Info, currentNodeDimensionInfo]\r\nfunction filterOutUsedDimensions(listingConditions: Model$ListingCondition[], pathsToParent: Model$Listing[]) {\r\n return listingConditions.filter(c =>\r\n pathsToParent.every(p => p.Operand !== c.Operand));\r\n}\r\n\r\n// Some dimension are only avaliable after some other dimension is chosen\r\n// Note: root is filtered out in this step\r\n// @param `pathsToParent` from root to current node, like [rootInfo, path1Info, currentNodeDimensionInfo]\r\nfunction filterReachableDimensions(listingConditions: Model$ListingCondition[], pathsToParent: Model$Listing[]): Model$ListingCondition[] {\r\n // Current impl is not effective, but easy to understand :)\r\n const reservedIds = new Set();\r\n pathsToParent.forEach((path) => {\r\n const currentOperand = path.Operand;\r\n const currentId = listingConditions.find(c =>\r\n (c.Operand === 'All' && currentOperand === '') ||\r\n c.Operand === currentOperand)?.Id;\r\n assertIsDefined(currentId);\r\n listingConditions.forEach((c) => {\r\n if (c.ParentId === currentId) {\r\n reservedIds.add(c.Id);\r\n }\r\n });\r\n });\r\n return listingConditions.filter(c => reservedIds.has(c.Id));\r\n}\r\n\r\n// There are some dimensions that everything else node cannot be split on\r\nfunction filterNonSplittableDimensions(listingConditions: Model$ListingCondition[], item:(WithTreeViewData)): Model$ListingCondition[] {\r\n assertIsDefined(item);\r\n\r\n let isFromEverythingElse = false;\r\n if (item.Condition?.Operand !== '' && item.Condition?.Attribute === '') {\r\n isFromEverythingElse = true;\r\n }\r\n\r\n _.each(item.ParentConditions || [], (condition) => {\r\n if (condition?.Operand !== '' && condition?.Attribute === '') {\r\n isFromEverythingElse = true;\r\n }\r\n });\r\n\r\n assertIsDefined(item.ParentConditions);\r\n assertIsDefined(item.Condition);\r\n\r\n const parentConditionOperands = _.pluck(item.ParentConditions, 'Operand');\r\n const allItemOperands = [item.Condition.Operand, ...parentConditionOperands];\r\n\r\n if (_.intersection(NonSplittableConditions, allItemOperands) && isFromEverythingElse) {\r\n return _.filter(listingConditions, condition => !_.contains(NonSplittableConditions, condition.Operand));\r\n }\r\n\r\n return listingConditions;\r\n}\r\n\r\n// Do we need to filter the country by current Campaign? In backend, we get current campaign by use something like `this.contextProvider.CurrentCampaign?.CampaignSettings[0]?.SalesCountry;`\r\n// function filterCountry() { }\r\n\r\n// All data is returned now, however, user should only see part of them\r\n// - user should not see any dimension they have used\r\n// - user should not see the root dimension\r\n// - user should not see a dimension if its partent is not reached\r\n// In conclusion, a valid node is valid if it is the direct son of a `pathsToParent` and it is not in `pathsToParent`\r\n// @param `pathsToParent` from root to current node, like [rootInfo, path1Info, currentNodeDimensionInfo]\r\nexport function getValidListingConditions(response: GetListingGroupConditionsResponseBody, pathsToParent: Model$Listing[], item: WithTreeViewData) {\r\n let conditions = response.value;\r\n conditions = filterReachableDimensions(conditions, pathsToParent);\r\n conditions = filterOutUsedDimensions(conditions, pathsToParent);\r\n conditions = filterNonSplittableDimensions(conditions, item);\r\n return conditions;\r\n}\r\n\r\nexport function getValidListingConditionsForWithoutPreselectedTreeNode(response: GetListingGroupConditionsResponseBody, pathsToParent: Model$Listing[]) {\r\n let conditions = response.value;\r\n conditions = filterReachableDimensions(conditions, pathsToParent);\r\n conditions = filterOutUsedDimensions(conditions, pathsToParent);\r\n return conditions;\r\n}\r\n","import { map } from 'underscore';\r\nimport { createOrUpdateListingGroup } from '@bingads-webui-campaign-react/perf-max-data';\r\nimport { Model$ListingGroup } from '../ApiType';\r\nimport { NullPartial, } from '../constant';\r\n\r\ninterface UpdateListingTreePayload {\r\n ListingGroupsToAdd: Partial>[];\r\n ListingGroupsToDelete: number[];\r\n AssetGroupId: number,\r\n}\r\n\r\n// edit tree view\r\nexport async function updateListingTree(payload: UpdateListingTreePayload) {\r\n const { ListingGroupsToAdd, ListingGroupsToDelete, AssetGroupId } = payload;\r\n const itemsToAdd = ListingGroupsToAdd;\r\n const itemsToDelete = map(ListingGroupsToDelete, id => ({\r\n Id: id,\r\n AssetGroupId,\r\n Status: 'Deleted',\r\n }));\r\n return createOrUpdateListingGroup(itemsToAdd, itemsToDelete).then(res => res).catch(e => e);\r\n}\r\n\r\nexport async function createRootListingTree(assetGroupId: number) {\r\n const itemsToAdd = [{\r\n Id: -1,\r\n AssetGroupId: assetGroupId,\r\n IsLeaf: true,\r\n IsExcluded: false,\r\n Condition: {\r\n Operand: 'All',\r\n Attribute: '',\r\n },\r\n }];\r\n\r\n return createOrUpdateListingGroup(itemsToAdd, []);\r\n}\r\n","import { useFetch } from '@bingads-webui-campaign/react-hook-use-fetch';\r\nimport { ProductAttrubuteStatisticsParams, productAttrubuteStatisticsResponseHandler, productAttrubuteStatisticsRequest } from './productAttributeStatistics';\r\nimport { GetListingGroupGridDataParmas, listingGroupGridDataResponseHandler, listingGroupGridDataRequest } from './listingGroupGridData';\r\nimport { GetListingGroupConditionsParams, getListingGroupConditionsResponseHandler, getListingGroupConditionsRequest } from './getListingGroupConditions';\r\nimport { productOfferRequest, productOfferResponseHandler, ProductOfferParams } from './productOffer';\r\n\r\nimport { updateListingTree, createRootListingTree } from './updateListingTree';\r\n\r\nexport function useAPIsOfListingGroup() {\r\n const { fetch: fetchImpl } = useFetch();\r\n\r\n // baseUrl is not used for now, for we are using a special fetch wrapper\r\n const baseUrl = '';\r\n\r\n return {\r\n listingGroupGridData: (params: GetListingGroupGridDataParmas) =>\r\n listingGroupGridDataResponseHandler(fetchImpl(...listingGroupGridDataRequest(baseUrl, params))),\r\n productAttributeStatistics: (params: ProductAttrubuteStatisticsParams) =>\r\n productAttrubuteStatisticsResponseHandler(fetchImpl(...productAttrubuteStatisticsRequest(baseUrl, params))),\r\n getListingGroupConditions: (params: GetListingGroupConditionsParams) =>\r\n getListingGroupConditionsResponseHandler(fetchImpl(...getListingGroupConditionsRequest(baseUrl, params))),\r\n getProductOffers: (params: ProductOfferParams) =>\r\n productOfferResponseHandler(fetchImpl(...productOfferRequest(baseUrl, params))),\r\n updateListingTree,\r\n createRootListingTree,\r\n };\r\n}\r\n","import { Model$ListingGroup } from '../ApiType';\r\nimport { PostOdataAdsAPIParams, getFullUrlOfAdsOdata } from './adsOdata';\r\n\r\nexport interface DateRange {\r\n /**\r\n * YYYY-MM-DD\r\n *\r\n * @example 2022-05-15\r\n */\r\n EndDate: string;\r\n /**\r\n * YYYY-MM-DD\r\n *\r\n * @example 2022-05-02\r\n */\r\n StartDate: string;\r\n}\r\n\r\ninterface GetListingGroupGridDataPayload {\r\n gridDataParameters: {\r\n DateRange: DateRange;\r\n },\r\n}\r\n\r\nexport type GetListingGroupGridDataParmas = PostOdataAdsAPIParams;\r\n\r\ninterface GetListingGroupGridDataResponseBody {\r\n value: Model$ListingGroup[];\r\n}\r\n\r\nexport function listingGroupGridDataRequest(baseUrl: string, params: GetListingGroupGridDataParmas) {\r\n const path = 'ProductListingGroups/Default.GridData';\r\n const finalUrl = getFullUrlOfAdsOdata(baseUrl, path, params);\r\n return [finalUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'x-ms-lastwritetime': 'Max',\r\n },\r\n body: JSON.stringify(params.payload),\r\n }];\r\n}\r\n\r\nexport async function listingGroupGridDataResponseHandler(responsePromise: Promise) {\r\n const response = await responsePromise;\r\n const responseBody: GetListingGroupGridDataResponseBody = await response.json();\r\n return responseBody;\r\n}\r\n","import { PostOdataAdsAPIParams, getFullUrlOfAdsOdata, WithEntityPath } from './adsOdata';\r\nimport { DateRange } from './listingGroupGridData';\r\nimport { Model$ProductAttributeStatistic, Header } from '../ApiType';\r\n\r\ninterface ProductAttrubuteStatisticsEntityPath {\r\n productListingGroupId: number;\r\n}\r\n\r\ninterface ProductAttrubuteStatisticsPayload {\r\n gridDataParameters: {\r\n DateRange: DateRange;\r\n },\r\n operand: string;\r\n}\r\n\r\nexport type ProductAttrubuteStatisticsParams = PostOdataAdsAPIParams & WithEntityPath;\r\n\r\nexport interface ProductAttrubuteStatisticsResponse {\r\n value: Model$ProductAttributeStatistic[];\r\n headers: Header;\r\n}\r\n\r\n// when editing tree view, the opened panel is also a grid, use this API to get data.\r\nexport function productAttrubuteStatisticsRequest(baseUrl: string, params: ProductAttrubuteStatisticsParams) {\r\n const path = `ProductListingGroups(${params.entityPath.productListingGroupId})/ProductAttributeStatistics/Default.ProductListingGroupGridData`;\r\n const finalUrl = getFullUrlOfAdsOdata(baseUrl, path, params);\r\n return [finalUrl, {\r\n method: 'POST',\r\n body: JSON.stringify(params.payload),\r\n }];\r\n}\r\n\r\nexport async function productAttrubuteStatisticsResponseHandler(responsePromise: Promise) {\r\n const p$response = await responsePromise;\r\n const response: ProductAttrubuteStatisticsResponse = await p$response.json();\r\n response.headers = p$response.headers;\r\n\r\n return response;\r\n}\r\n","import { GetOdataAdsAPIParams, getFullUrlOfAdsOdata, WithEntityPath } from './adsOdata';\r\nimport { DateRange } from './listingGroupGridData';\r\nimport { Model$ProductOffer, Header } from '../ApiType';\r\n\r\ninterface ProductOfferEntityPath {\r\n productListingGroupId: number;\r\n}\r\n\r\ninterface ProductOfferPayload {\r\n gridDataParameters: {\r\n DateRange: DateRange;\r\n },\r\n}\r\n\r\nexport type ProductOfferParams = GetOdataAdsAPIParams & WithEntityPath;\r\n\r\nexport interface ProductOfferResponse {\r\n value: Model$ProductOffer[];\r\n headers: Header;\r\n}\r\n\r\n// when editing tree view, the opened panel is also a grid, use this API to get data.\r\nexport function productOfferRequest(baseUrl: string, params: ProductOfferParams) {\r\n const path = `ProductListingGroups(${params.entityPath.productListingGroupId})/ProductOffers/Default.GetProductOffersForListingGroup`;\r\n const finalUrl = getFullUrlOfAdsOdata(baseUrl, path, params);\r\n return [finalUrl, {\r\n method: 'GET',\r\n }];\r\n}\r\n\r\nexport async function productOfferResponseHandler(responsePromise: Promise) {\r\n const p$response = await responsePromise;\r\n const response: ProductOfferResponse = await p$response.json();\r\n response.headers = p$response.headers;\r\n\r\n return response;\r\n}\r\n","import { helpbuttonStyle, convertToLocalStyle, statusStyle } from '@bingads-webui-campaign-react/common-styles';\r\nimport { mergeStyleSets } from '@fluentui/react';\r\n// import { ComponentSettings } from '@bingads-webui-theme-2018/theme-fluent';\r\nimport { merge } from '@bingads-webui-universal/primitive-utilities';\r\nimport { pagePaddingStyle } from '@bingads-webui-campaign-react/page-padding-style';\r\n\r\n// export const pageRootClass = mergeStyles({\r\n// });\r\n\r\nexport const staticStyles = mergeStyleSets({\r\n errorColor: {\r\n color: '#A80000',\r\n },\r\n});\r\n\r\nexport const styles = (_, core) => {\r\n const helpButtonStyle = convertToLocalStyle(helpbuttonStyle({ palette: core.palette ?? {} }));\r\n const { palette } = core;\r\n return {\r\n '@global': {\r\n ...pagePaddingStyle(),\r\n },\r\n 'listing-group-content-root': merge(\r\n {},\r\n // columnChooserStyle,\r\n // getColumnChooserOverrideStyle,\r\n statusStyle({ palette }),\r\n {\r\n '& .toolbar-container': {\r\n fontSize: 14,\r\n '& .navbar .container-fluid': {\r\n paddingLeft: 3,\r\n },\r\n },\r\n '& .ms-DetailsHeader .ms-DetailsHeader-cellName': {\r\n width: '100%',\r\n },\r\n '& #bulkEditContainer': {\r\n maxWidth: 'inherit',\r\n },\r\n '& .grid-header-helpId': helpButtonStyle,\r\n '& .listing-group-name-container': {\r\n whiteSpace: 'normal',\r\n },\r\n '& .campaign-details-list-pagination': {\r\n marginLeft: 15,\r\n },\r\n '& .listing-group-condition-cell .iconba.small-icon': {\r\n fontSize: 12,\r\n },\r\n '& .show-listing-group-selector': {\r\n color: palette.themePrimary,\r\n },\r\n '& #button-hierarchy-view': {\r\n borderRadius: '2px 0px 0px 2px',\r\n },\r\n '& #button-list-view': {\r\n borderRadius: '0px 2px 2px 0px',\r\n },\r\n '& .tree-view-cell': {\r\n display: 'flex',\r\n },\r\n '& .view-switch-button': {\r\n background: palette.white,\r\n color: palette.themePrimary,\r\n padding: '0px',\r\n width: 32,\r\n minWidth: 32,\r\n minHeight: 32,\r\n height: 32,\r\n margin: '0px !important',\r\n },\r\n '& .view-switch-button.active': {\r\n background: palette.themePrimary,\r\n border: '0px',\r\n '& .iconba': {\r\n color: palette.white,\r\n },\r\n },\r\n '& .view-switch-button.not-allowed': {\r\n cursor: 'not-allowed',\r\n },\r\n '& input[type=\"checkbox\"]::after': {\r\n transitionDuration: '0s !important',\r\n },\r\n '& .grid-nodata': {\r\n padding: '20px 0 20px 40px',\r\n fontSize: '26px',\r\n lineHeight: '36px',\r\n },\r\n '& .iconba-ChevronDown': {\r\n lineHeight: '16px',\r\n opacity: 0,\r\n marginLeft: 5,\r\n fontSize: 11,\r\n color: palette.themeDark,\r\n '&:hover': {\r\n opacity: 1,\r\n },\r\n },\r\n '& .create-first-listing-group': {\r\n color: palette.neutralSecondary,\r\n fontSize: 26,\r\n lineHeight: '36px',\r\n padding: '20px 0 20px 40px',\r\n },\r\n }\r\n ),\r\n };\r\n};\r\n","/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { columnChooserId, ScopeLevel, treeViewButtonId, listViewButtonId } from './constant';\r\n\r\ninterface ToolbarWithSelectionProps {\r\n selectedItems: any[];\r\n permissions: any;\r\n i18n: any;\r\n serverContext: any;\r\n onBidChangeClick: Function;\r\n}\r\n\r\nfunction toolbarItemsWithSelection({\r\n selectedItems,\r\n permissions,\r\n i18n,\r\n serverContext,\r\n onBidChangeClick,\r\n}: ToolbarWithSelectionProps) {\r\n // const isCurrentAccountInActive = serverContext.CurrentAccount.Status === 32; // 32 is InActive\r\n const isBidValueOption = true;\r\n const isBidBoostOption = false;\r\n\r\n const candidates: any[] = [\r\n ['expander', {\r\n type: 'expander',\r\n }],\r\n ['button-clear-selection', {\r\n type: 'button-clear-selection',\r\n }],\r\n ['divider', {\r\n id: 'product-groups-toolbar-divider',\r\n type: 'divider',\r\n }],\r\n ['button-chart-toggle', {\r\n id: 'button-chart-toggle',\r\n type: 'button',\r\n }],\r\n ];\r\n return new Map(candidates.filter(c => !!c));\r\n}\r\n\r\ninterface ToolbarWithoutSelectionConfigProps {\r\n scopeLevel: ScopeLevel,\r\n i18n: any,\r\n}\r\n\r\nfunction toolbarItemsWithoutSelection({\r\n scopeLevel, i18n,\r\n}: ToolbarWithoutSelectionConfigProps) {\r\n const candidates: any[] = [\r\n ['expander', {\r\n type: 'expander',\r\n }],\r\n [columnChooserId, {\r\n id: columnChooserId,\r\n type: 'dropdown',\r\n }],\r\n ['Expand table', {\r\n type: 'expand-table',\r\n }],\r\n scopeLevel === ScopeLevel.AssetGroup && [treeViewButtonId, {\r\n type: 'button',\r\n classes: ['view-switch-button', 'inactive'], // default inactive, update by callback\r\n iconLeftGlyphName: 'ba-BulletedTreeList',\r\n id: treeViewButtonId,\r\n ariaLabel: i18n.getString(_TL_('switch to hierarchy view')),\r\n attrs: {\r\n title: i18n.getString(_TL_('Hierarchy view')),\r\n },\r\n }],\r\n scopeLevel === ScopeLevel.AssetGroup && [listViewButtonId, {\r\n type: 'button',\r\n classes: ['view-switch-button', 'inactive'], // default inactive, update by callback\r\n iconLeftGlyphName: 'ba-BulletedList2',\r\n id: listViewButtonId,\r\n ariaLabel: i18n.getString(_TL_('switch to list view')),\r\n attrs: {\r\n title: i18n.getString(_TL_('List view')),\r\n },\r\n }],\r\n ];\r\n\r\n return new Map(candidates.filter(toolbarItem => !!toolbarItem));\r\n}\r\n\r\ninterface ToolbarConfigProps {\r\n scopeLevel: ScopeLevel,\r\n i18n: any,\r\n selectedItems: any[];\r\n permissions: any;\r\n serverContext: any;\r\n onBidChangeClick: Function;\r\n}\r\n\r\nexport function getGridToolbarConfig({\r\n scopeLevel, i18n, onBidChangeClick, permissions, selectedItems, serverContext,\r\n}: ToolbarConfigProps) {\r\n const toolbarUnselectedConfig = toolbarItemsWithoutSelection({\r\n scopeLevel, i18n,\r\n });\r\n const toolbarSelectedConfig = toolbarItemsWithSelection({\r\n i18n,\r\n onBidChangeClick,\r\n permissions,\r\n selectedItems,\r\n serverContext,\r\n });\r\n return { toolbarSelectedConfig, toolbarUnselectedConfig };\r\n}\r\n","import {\r\n destinationUrlColumn, finalUrlSuffixColumn, absoluteTopImpressionRateColumn, advertiserReportedRevenue, allConversionAdvertiserReportedRevenue, allConversionCPAColumn,\r\n allConversionRateColumn, allConversionRevenueOnAdSpendColumn, allConversionsColumn, averageCPCColumn, averageCPMColumn, clicksColumn, conversionRateColumn,\r\n conversionsColumn, CPAColumn, CTRColumn, impressionsColumn, returnOnAdSpendColumn, spendColumn, trackingUrlTemplateColumn, urlCustomParametersColumn,\r\n netRevenueColumn, eligibleImpressionsColumn, missedImpressionsColumn, impressionShareColumn, missedImpressionsNoBidColumn,\r\n missedImpressionsSpendingCapReachedColumn, missedImpressionsInsufficientBidColumn, missedImpressionsNoTaxColumn,\r\n missedImpressionsOtherColumn, ColumnKeyOdataPathMap, averageCPSColumn, salesCountColumn,\r\n} from '@bingads-webui-grid/well-known';\r\n\r\nimport {\r\n ListingGroupColumn,\r\n AssetGroupNameColumn,\r\n IncludeExcludeColumn\r\n} from './rawColumns';\r\n\r\n/**\r\n * To know how to get column raw data by column key\r\n */\r\nexport const columnKeyRawDataMap = {\r\n [ListingGroupColumn.key]: ListingGroupColumn,\r\n [AssetGroupNameColumn.key]: AssetGroupNameColumn,\r\n [IncludeExcludeColumn.key]: IncludeExcludeColumn,\r\n [absoluteTopImpressionRateColumn.key]: absoluteTopImpressionRateColumn,\r\n [advertiserReportedRevenue.key]: advertiserReportedRevenue,\r\n [allConversionAdvertiserReportedRevenue.key]: allConversionAdvertiserReportedRevenue,\r\n [allConversionCPAColumn.key]: allConversionCPAColumn,\r\n [allConversionRateColumn.key]: allConversionRateColumn,\r\n [allConversionRevenueOnAdSpendColumn.key]: allConversionRevenueOnAdSpendColumn,\r\n [allConversionsColumn.key]: allConversionsColumn,\r\n [averageCPCColumn.key]: averageCPCColumn,\r\n [averageCPMColumn.key]: averageCPMColumn,\r\n [CPAColumn.key]: CPAColumn,\r\n [CTRColumn.key]: CTRColumn,\r\n [clicksColumn.key]: clicksColumn,\r\n [conversionRateColumn.key]: conversionRateColumn,\r\n [conversionsColumn.key]: conversionsColumn,\r\n [impressionsColumn.key]: impressionsColumn,\r\n [returnOnAdSpendColumn.key]: returnOnAdSpendColumn,\r\n [spendColumn.key]: spendColumn,\r\n [eligibleImpressionsColumn.key]: eligibleImpressionsColumn,\r\n [missedImpressionsColumn.key]: missedImpressionsColumn,\r\n [missedImpressionsNoBidColumn.key]: missedImpressionsNoBidColumn,\r\n [missedImpressionsSpendingCapReachedColumn.key]: missedImpressionsSpendingCapReachedColumn,\r\n [missedImpressionsInsufficientBidColumn.key]: missedImpressionsInsufficientBidColumn,\r\n [missedImpressionsNoTaxColumn.key]: missedImpressionsNoTaxColumn,\r\n [missedImpressionsOtherColumn.key]: missedImpressionsOtherColumn,\r\n [impressionShareColumn.key]: impressionShareColumn,\r\n [averageCPSColumn.key]: averageCPSColumn,\r\n [salesCountColumn.key]: salesCountColumn,\r\n\r\n // FIXME: this is not added by back-end, so the data is always undefined/0(depend on how to treat undefeined data)\r\n // This should be an undefined behavior to visit them, but we could use them here to avoid page crash\r\n [netRevenueColumn.key]: netRevenueColumn,\r\n\r\n\r\n // FIXME: According to back-end's opinion, this column is not in back-end DB, so we should not have this column.\r\n [destinationUrlColumn.key]: destinationUrlColumn,\r\n\r\n} as const;\r\n\r\nexport const cpsColumnKeys = [\r\n averageCPSColumn.key,\r\n salesCountColumn.key,\r\n];\r\n\r\nconst odataPathOfCommonColumnsIterable: [string, string][] = [\r\n [absoluteTopImpressionRateColumn.key, 'PerformanceMetrics/AbsoluteTopImpressionRate'],\r\n [advertiserReportedRevenue.key, 'PerformanceMetrics/AdvertiserReportedRevenue'],\r\n [allConversionAdvertiserReportedRevenue.key, 'PerformanceMetrics/AllConversionAdvertiserReportedRevenue'],\r\n [allConversionCPAColumn.key, 'PerformanceMetrics/AllConversionCPA'],\r\n [allConversionRateColumn.key, 'PerformanceMetrics/AllConversionRate'],\r\n [allConversionRevenueOnAdSpendColumn.key, 'PerformanceMetrics/AllConversionRevenueOnAdSpend'],\r\n [allConversionsColumn.key, 'PerformanceMetrics/AllConversions'],\r\n [averageCPCColumn.key, 'PerformanceMetrics/AverageCPC'],\r\n [averageCPMColumn.key, 'PerformanceMetrics/AverageCPM'],\r\n [CPAColumn.key, 'PerformanceMetrics/CPA'],\r\n [CTRColumn.key, 'PerformanceMetrics/CTR'],\r\n [clicksColumn.key, 'PerformanceMetrics/Clicks'],\r\n [conversionRateColumn.key, 'PerformanceMetrics/ConversionRate'],\r\n [conversionsColumn.key, 'PerformanceMetrics/Conversions'],\r\n [impressionsColumn.key, 'PerformanceMetrics/Impressions'],\r\n [impressionShareColumn.key, 'PerformanceMetrics/ImpressionShare'],\r\n [returnOnAdSpendColumn.key, 'PerformanceMetrics/RevenueOnAdSpend'],\r\n [spendColumn.key, 'PerformanceMetrics/Spend'],\r\n [eligibleImpressionsColumn.key, 'PerformanceMetrics/EligibleImpressions'],\r\n [missedImpressionsColumn.key, 'PerformanceMetrics/MissedImpressions'],\r\n [missedImpressionsNoBidColumn.key, 'PerformanceMetrics/MissedImpressionsNoBid'],\r\n [missedImpressionsSpendingCapReachedColumn.key, 'PerformanceMetrics/MissedImpressionsSpendingCapReached'],\r\n [missedImpressionsInsufficientBidColumn.key, 'PerformanceMetrics/MissedImpressionsInsufficientBid'],\r\n [missedImpressionsNoTaxColumn.key, 'PerformanceMetrics/MissedImpressionsNoTax'],\r\n [missedImpressionsOtherColumn.key, 'PerformanceMetrics/MissedImpressionsOther'],\r\n [urlCustomParametersColumn.key, 'UrlCustomParameters'],\r\n [finalUrlSuffixColumn.key, 'FinalUrlSuffix'],\r\n [trackingUrlTemplateColumn.key, 'TrackingUrlTemplate'],\r\n [destinationUrlColumn.key, 'DestinationUrl'],\r\n [averageCPSColumn.key, 'PerformanceMetrics/AverageCPS'],\r\n [salesCountColumn.key, 'PerformanceMetrics/SalesCount'],\r\n];\r\n\r\nconst odataPathOfListingGroupColumnIterable: [string, string][] = [\r\n [ListingGroupColumn.key, 'Condition/Attribute'],\r\n [AssetGroupNameColumn.key, 'AssetGroupName'],\r\n [IncludeExcludeColumn.key, 'IsExcluded'],\r\n];\r\n\r\nexport const odataMapOfListingGroupResponse: ColumnKeyOdataPathMap = new Map([...odataPathOfCommonColumnsIterable, ...odataPathOfListingGroupColumnIterable]);\r\n","/* eslint-disable no-use-before-define */\r\n/* eslint-disable no-nested-ternary */\r\n/* eslint-disable react/prop-types */\r\n/* eslint-disable react/jsx-indent */\r\n/* eslint-disable react/jsx-filename-extension */\r\nimport { assertIsDefined } from '@bingads-webui-campaign-react/debug-assert';\r\nimport { IColumn } from '@fluentui/react';\r\nimport { Model$ListingGroup } from '../ApiType';\r\nimport { odataMapOfListingGroupResponse } from '../ColumnOdataMap';\r\nimport { ListingGroupGridItemData } from '../interface';\r\n\r\n// Not use '#', which will cause a lot of rerender\r\n// eslint-disable-next-line no-script-url\r\nexport const anchorHrefPlaceholder = 'javascript:void(0)';\r\nexport const NOT_INTERACTIVE_PLACEHOLDER = '-';\r\nexport const NO_DATA_PLACEHOLDER_NONLEAF = '-';\r\nexport const NO_DATA_PLACEHOLDER_LEAF = '';\r\n\r\nexport const IsProductGroupBidLandscapeEnabled = (serverContext: any) => serverContext.Permissions.IsProductGroupBidLandscapeEnabled;\r\nexport const IsBidLessThan5CentsInShoppingCampaignEnabled = (serverContext: any) => serverContext.Permissions.IsBidLessThan5CentsInShoppingCampaignEnabled;\r\nexport const IsCurrentAccountInactive = (serverContext: any) => serverContext.CurrentAccountInActive;\r\nexport const IsReadOnlyMode = (serverContext: any) => serverContext.ReadOnlyMode;\r\nexport const showBidBoostValue = (itemData: ListingGroupGridItemData) => itemData.BidBoost && itemData.BidBoost.Multiplier != null;\r\n\r\nexport function shouldEnableEdit(enable: boolean, serverContext: any) {\r\n return !IsCurrentAccountInactive(serverContext) && !IsReadOnlyMode(serverContext) && enable;\r\n}\r\n\r\nexport function getPropertyFromItemWithDefaultString(itemData: Model$ListingGroup | undefined, index: number | undefined, column: IColumn | undefined) {\r\n assertIsDefined(itemData);\r\n assertIsDefined(column);\r\n assertIsDefined(column.key);\r\n return itemData.IsLeaf ? getPropertyFromItem(itemData, index, column) || NO_DATA_PLACEHOLDER_LEAF : NO_DATA_PLACEHOLDER_NONLEAF;\r\n}\r\n\r\nexport function getPropertyFromItem(itemData: Model$ListingGroup | undefined, index: number | undefined, column: IColumn | undefined) {\r\n assertIsDefined(column);\r\n assertIsDefined(column.key);\r\n return getPropertyFromItemByColumnKey(itemData, column.key);\r\n}\r\n\r\nexport function getPropertyFromItemByColumnKey(itemData: Model$ListingGroup | undefined, columnKey: string) {\r\n const odataPathOfProperty = odataMapOfListingGroupResponse.get(columnKey);\r\n assertIsDefined(odataPathOfProperty);\r\n return getPropertyByPath(itemData, odataPathOfProperty);\r\n}\r\n\r\n// Format of property is like 'xx/yy/zz', then we get value from data.xx.yy.zz\r\nexport function getPropertyByPath(data: any, propertyPath: string) {\r\n const propertyPaths = propertyPath.split('/');\r\n return propertyPaths.reduce((obj, path) => (obj ? obj[path] : NO_DATA_PLACEHOLDER_NONLEAF), data);\r\n}\r\n\r\nexport const getAccountCurrencyCode = serverContext => (serverContext && serverContext.CurrentAccount && serverContext.CurrentAccount.CurrencyCode) || 'USD';\r\n\r\nexport const offerLimitExceededWarning = i18n => i18n.getString(_TL_('Products data cannot be shown if your campaign targets more than 16 million products.'));\r\nexport const offerLimitExceededWarningForListingGroup = i18n => i18n.getString(_TL_('Product performance data cannot be displayed since your campaign targets exceed 16 million products. However, you can still create or edit a listing group.'));\r\n","import React, { useMemo, useEffect, useState } from 'react';\r\nimport _ from 'underscore';\r\nimport { Callout, Link, mergeStyleSets, Text, MessageBarType, MessageBar } from '@fluentui/react';\r\nimport { I18n } from '@bingads-webui-grid/well-known';\r\nimport { ReactTemplate } from '@bingads-webui-react/react-template';\r\nimport { UiBlocker } from '@bingads-webui-react/ui-blocker';\r\nimport { Model$Listing, Model$ProductOffer } from '../../ApiType';\r\nimport { useAPIsOfListingGroup } from '../../API';\r\nimport { offerLimitExceededWarning } from '../utils';\r\n\r\nconst styles = mergeStyleSets({\r\n callout: {\r\n maxWidth: '90%',\r\n padding: '20px 24px',\r\n },\r\n partitionTrail: {\r\n fontWeight: 600,\r\n color: '#605e5c',\r\n },\r\n currentOperand: {\r\n marginBottom: 10,\r\n },\r\n currentAttribute: {\r\n color: '#323130',\r\n fontSize: '20px',\r\n },\r\n productSampleDescription: {\r\n color: '#323130',\r\n fontSize: '12px',\r\n lineHeight: '22px',\r\n marginBottom: 10,\r\n },\r\n productSampleId: {\r\n fontSize: '14px',\r\n fontWeight: '600',\r\n },\r\n link: {\r\n display: 'block',\r\n marginTop: 20,\r\n },\r\n});\r\n\r\ninterface ProductOffersCalloutProps {\r\n target: any;\r\n i18n: I18n;\r\n fullPath: Model$Listing[];\r\n scope: { save: Function, values: any };\r\n productListingGroupId: number,\r\n}\r\n\r\nexport const ProductOffersCallout: React.FunctionComponent = (props) => {\r\n const {\r\n target, i18n, fullPath, scope, productListingGroupId,\r\n } = props;\r\n\r\n const commonEntityPath = {\r\n accountId: scope.values.aid,\r\n campaignId: scope.values.campaignId,\r\n customerId: scope.values.cid,\r\n assetGroupId: scope.values.assetGroupId,\r\n };\r\n const currentCondition: Model$Listing = fullPath[fullPath.length - 1];\r\n const currentOperand =\r\n _.isEmpty(currentCondition.Operand) ? '' : i18n.getString(`ProductsGrid_Column_${currentCondition.Operand}`);\r\n const partitionTrail = useMemo(() => {\r\n let trail = i18n.getString(_TL_('All products')).concat(' > ');\r\n\r\n for (let index = 1; index < fullPath.length - 1; index += 1) {\r\n const item = fullPath[index];\r\n\r\n trail = trail.concat(item.Attribute || '', ' (', i18n.getString(`ProductsGrid_Column_${item.Operand}`), ') > ');\r\n }\r\n return trail;\r\n }, [fullPath, i18n]);\r\n\r\n const {\r\n getProductOffers,\r\n } = useAPIsOfListingGroup();\r\n const [offerCount, setOfferCount] = useState(0);\r\n const [sampleOffers, setSampleOffers] = useState>([]);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [showOfferLimitExceededError, setShowOfferLimitExceededError] = useState(false);\r\n\r\n useEffect(() => {\r\n setIsLoading(true);\r\n getProductOffers({\r\n entityPath: {\r\n ...commonEntityPath,\r\n assetGroupId: scope.values.assetGroupId,\r\n productListingGroupId,\r\n },\r\n queryOptions: {\r\n $top: 10,\r\n },\r\n }).then((response) => {\r\n setIsLoading(false);\r\n\r\n const offerLimitExceeded = response.headers.get('offerlimitexceeded');\r\n\r\n if (offerLimitExceeded === 'true') {\r\n setShowOfferLimitExceededError(true);\r\n } else {\r\n setOfferCount(response['@odata.count']);\r\n setSampleOffers(response.value);\r\n }\r\n });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [productListingGroupId]);\r\n\r\n const navigateToProductTab = () => {\r\n scope.save('/campaign/vnext/products/');\r\n };\r\n\r\n const offerLimitExceededContent = useMemo(() => offerLimitExceededWarning(i18n), [i18n]);\r\n\r\n return (\r\n // eslint-disable-next-line react/jsx-filename-extension\r\n <>\r\n \r\n \r\n \r\n {partitionTrail}\r\n \r\n \r\n {currentOperand}\r\n \r\n \r\n {currentCondition.Attribute}\r\n \r\n \r\n {\r\n offerCount === 0 && !showOfferLimitExceededError &&\r\n {i18n.getString(_TL_('This product group does not contain any products.'))}\r\n }\r\n {\r\n offerCount === 1 &&\r\n ({offerCount} {text}),\r\n }}\r\n template={i18n.getString(_TL_('This product group contains {{offerCountModel}} product{{/offerCountModel}}, including:'))}\r\n />\r\n }\r\n {\r\n offerCount > 1 &&\r\n ({offerCount} {text}),\r\n }}\r\n template={i18n.getString(_TL_('This product group contains {{offerCountModel}} products{{/offerCountModel}}, including:'))}\r\n />\r\n }\r\n \r\n {\r\n offerCount > 0 && sampleOffers.map(sampleOffer => (\r\n
\r\n { sampleOffer.Id }\r\n ({sampleOffer.Title})\r\n
\r\n ))\r\n }\r\n {\r\n offerCount > 0 &&\r\n // eslint-disable-next-line jsx-a11y/anchor-is-valid\r\n \r\n {i18n.getString(_TL_('View full list of products'))}\r\n \r\n }\r\n {\r\n showOfferLimitExceededError &&\r\n \r\n {offerLimitExceededContent}\r\n \r\n }\r\n \r\n \r\n \r\n );\r\n};\r\n","/* eslint-disable no-use-before-define */\r\n/* eslint-disable no-nested-ternary */\r\n/* eslint-disable react/prop-types */\r\n/* eslint-disable react/jsx-indent */\r\n\r\nimport { I18n } from '@bingads-webui-grid/well-known';\r\nimport React, { FC, Fragment, useRef, useState } from 'react';\r\nimport { anchorHrefPlaceholder } from '../utils';\r\nimport { ProductOffersCallout } from './ProductOffersCallout';\r\nimport { Model$Listing } from '../../ApiType';\r\n\r\n/* eslint-disable react/jsx-filename-extension */\r\ninterface ConditionTemplateProps {\r\n total: any;\r\n depth: number;\r\n hasChildren: boolean;\r\n i18n: I18n;\r\n showSelectorIcon: boolean;\r\n attributeText: string;\r\n isExpanded: boolean;\r\n onToggleCollapse: () => void;\r\n onAddOrEditTrigger: () => void;\r\n partitionFullPath: Array;\r\n scope: {\r\n values: {\r\n campaignId: string | number;\r\n };\r\n save: Function;\r\n };\r\n productListingGroupId: number;\r\n assetGroupId: number | undefined;\r\n}\r\n\r\nconst iconWidth = 12;\r\n\r\nconst levelGap = 10;\r\n\r\nconst textIconGap = 7;\r\n\r\nexport const ConditionTemplate: FC = (props) => {\r\n const {\r\n total, depth, hasChildren, i18n, showSelectorIcon,\r\n attributeText, isExpanded, onToggleCollapse, onAddOrEditTrigger,\r\n partitionFullPath, scope, productListingGroupId, assetGroupId,\r\n } = props;\r\n\r\n const updatedScope = {\r\n values: {\r\n ...scope.values,\r\n assetGroupId,\r\n },\r\n save: scope.save,\r\n };\r\n\r\n const attributeRef = useRef(null);\r\n const [showCallout, setShowCallout] = useState(false);\r\n let hideCalloutTimer: number | undefined;\r\n const slowHideCallout = () => {\r\n hideCalloutTimer = window.setTimeout(() => {\r\n setShowCallout(false);\r\n }, 300);\r\n };\r\n\r\n const textPadding: React.CSSProperties = {\r\n paddingLeft: (hasChildren ? 0 : ((depth - 1) * levelGap) + iconWidth) + textIconGap,\r\n };\r\n\r\n const toggleIconMargin: React.CSSProperties = {\r\n marginLeft: (depth - 1) * levelGap,\r\n fontFamily: 'MsAds MDL2 Assets',\r\n };\r\n\r\n const onCollpaseToggleKeyDown: React.KeyboardEventHandler = (e) => {\r\n if (e.key === 'Enter') {\r\n onToggleCollapse();\r\n }\r\n e.stopPropagation();\r\n };\r\n\r\n const onCollapseClick: React.MouseEventHandler = (e) => {\r\n onToggleCollapse();\r\n e.stopPropagation();\r\n };\r\n\r\n const onAddOrEditClick: React.MouseEventHandler = (e) => {\r\n onAddOrEditTrigger();\r\n e.stopPropagation();\r\n };\r\n\r\n const onAddOrEditKeyDown: React.KeyboardEventHandler = (e) => {\r\n if (e.key === 'Enter') {\r\n onAddOrEditTrigger();\r\n }\r\n e.stopPropagation();\r\n };\r\n const closeTooltip: React.KeyboardEventHandler = (e) => {\r\n if (e.key === 'Escape') {\r\n setShowCallout(false);\r\n }\r\n e.stopPropagation();\r\n };\r\n return (\r\n \r\n {total ?
{total}
:\r\n
\r\n {hasChildren &&\r\n (isExpanded ?\r\n \r\n : )\r\n }\r\n
\r\n
clearTimeout(hideCalloutTimer)} onMouseLeave={() => slowHideCallout()}>\r\n {\r\n // eslint-disable-next-line jsx-a11y/mouse-events-have-key-events\r\n setShowCallout(true)} onFocus={() => setShowCallout(true)} onKeyDown={e => closeTooltip(e)} onBlur={() => setShowCallout(false)} href={anchorHrefPlaceholder} className=\"listing-group-name-container\" aria-label={attributeText}>\r\n {attributeText}\r\n \r\n }\r\n { showCallout && }\r\n
\r\n
\r\n {showSelectorIcon &&\r\n \r\n }\r\n
\r\n
\r\n
\r\n }\r\n
);\r\n};\r\n","/* eslint-disable no-use-before-define */\r\n/* eslint-disable no-nested-ternary */\r\n/* eslint-disable react/prop-types */\r\n/* eslint-disable react/jsx-indent */\r\n/* eslint-disable react/jsx-filename-extension */\r\nimport { I18n } from '@bingads-webui-grid/well-known';\r\nimport React, { FC, Fragment, useRef, useState } from 'react';\r\nimport { anchorHrefPlaceholder } from '../utils';\r\nimport { ProductOffersCallout } from './ProductOffersCallout';\r\nimport { Model$Listing } from '../../ApiType';\r\n\r\ninterface FlattenConditionTemplateProps {\r\n path: string;\r\n Attribute: string;\r\n i18n: I18n;\r\n partitionFullPath: Array;\r\n scope: {\r\n values: {\r\n campaignId: string | number;\r\n };\r\n save: Function;\r\n };\r\n productListingGroupId: number;\r\n assetGroupId: number | undefined;\r\n}\r\n\r\nexport const FlattenConditionTemplate: FC = (props) => {\r\n const {\r\n path, Attribute, i18n, partitionFullPath, scope, productListingGroupId, assetGroupId,\r\n } = props;\r\n const attributeRef = useRef(null);\r\n const [showCallout, setShowCallout] = useState(false);\r\n let hideCalloutTimer: number | undefined;\r\n const slowHideCallout = () => {\r\n hideCalloutTimer = window.setTimeout(() => {\r\n setShowCallout(false);\r\n }, 300);\r\n };\r\n\r\n const updatedScope = {\r\n values: {\r\n ...scope.values,\r\n assetGroupId,\r\n },\r\n save: scope.save,\r\n };\r\n\r\n const closeTooltip: React.KeyboardEventHandler = (e) => {\r\n if (e.key === 'Escape') {\r\n setShowCallout(false);\r\n }\r\n e.stopPropagation();\r\n };\r\n\r\n return (\r\n \r\n {\r\n
\r\n
{path}
\r\n
\r\n
clearTimeout(hideCalloutTimer)} onMouseLeave={() => slowHideCallout()}>\r\n {\r\n // eslint-disable-next-line jsx-a11y/mouse-events-have-key-events\r\n setShowCallout(true)} onFocus={() => setShowCallout(true)} onKeyDown={e => closeTooltip(e)} onBlur={() => setShowCallout(false)} href={anchorHrefPlaceholder} className=\"listing-group-name-container\" aria-label={Attribute}>\r\n {Attribute}\r\n \r\n }\r\n { showCallout && }\r\n
\r\n
\r\n
}\r\n
);\r\n};\r\n","/* eslint-disable no-script-url */\r\n/* eslint-disable jsx-a11y/anchor-is-valid */\r\n/* eslint-disable no-use-before-define */\r\n/* eslint-disable no-nested-ternary */\r\n/* eslint-disable react/prop-types */\r\n/* eslint-disable react/jsx-indent */\r\n/* eslint-disable react/jsx-filename-extension */\r\nimport React, { FC, Fragment } from 'react';\r\nimport { LISTING_GROUP_TREE_ROUTING } from '../../constant';\r\n\r\ninterface NameTemplateProps {\r\n campaignId: number;\r\n assetGroupId?: number;\r\n ariaLabel: string;\r\n name: string;\r\n scope: {\r\n append: Function,\r\n save: Function;\r\n };\r\n}\r\n\r\n\r\nexport const NameTemplate: FC = (props) => {\r\n const {\r\n assetGroupId, ariaLabel, campaignId, name,\r\n scope,\r\n } = props;\r\n\r\n const onNavigateClick: React.MouseEventHandler = () => {\r\n scope.append({\r\n assetGroupId,\r\n });\r\n scope.save(LISTING_GROUP_TREE_ROUTING);\r\n };\r\n\r\n return (\r\n \r\n {name ?\r\n {name}\r\n \r\n : ''}\r\n \r\n );\r\n};\r\n","import { ListingGroupGridItemData, } from '../interface';\r\n\r\nexport function fromViewModelToBulkModel(itemData: ListingGroupGridItemData) {\r\n const condition = itemData.Condition || {};\r\n if (condition.Attribute === '' && condition.Operand === '') {\r\n condition.Operand = 'All';\r\n }\r\n return {\r\n Id: itemData.Id,\r\n AssetGroupId: itemData.AssetGroupId,\r\n IsExcluded: itemData.IsExcluded,\r\n IsLeaf: itemData.IsLeaf,\r\n Condition: itemData.Condition,\r\n ParentId: itemData.ParentId,\r\n };\r\n}\r\n","/* eslint-disable react/jsx-filename-extension */\r\nimport _ from 'underscore';\r\nimport React, { FC, useCallback, useState } from 'react';\r\nimport classnames from 'classnames';\r\nimport { Callout, Text, FontIcon } from '@fluentui/react';\r\nimport { Target } from '@fluentui/react-hooks';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { merge } from '@bingads-webui-universal/primitive-utilities';\r\nimport { statusStyle } from '@bingads-webui-campaign-react/common-styles';\r\nimport { createOrUpdateListingGroup } from '@bingads-webui-campaign-react/perf-max-data';\r\nimport { ListingGroupGridItemData, } from '../../interface';\r\nimport { fromViewModelToBulkModel } from '../../API/bulk';\r\n\r\ninterface IncludeExcludeTemplateProps {\r\n itemData: ListingGroupGridItemData\r\n}\r\n\r\nexport const styles = (p, core) => {\r\n const { palette } = core;\r\n return {\r\n bold: {\r\n fontWeight: 600,\r\n },\r\n includeExcludeStatusContainer: {\r\n '& .include-exclude-status.disabled': {\r\n cursor: 'default',\r\n },\r\n '& .statusEnabled_icon.parent-node:before': {\r\n color: 'grey',\r\n },\r\n },\r\n includeExcludeCallout: merge(\r\n {\r\n marginTop: 10,\r\n marginLeft: 10,\r\n maxWidth: '90%',\r\n background: palette.white,\r\n '& .statuschangelink': {\r\n padding: '7px 20px',\r\n display: 'block',\r\n cursor: 'pointer',\r\n },\r\n '& .statuschange-icon': {\r\n marginRight: 5,\r\n },\r\n '& ul': {\r\n listStyle: 'none',\r\n paddingLeft: 0,\r\n marginBottom: 0,\r\n marginTop: 0,\r\n '& li': {\r\n cursor: 'pointer',\r\n display: 'list-item',\r\n '&:hover': {\r\n backgroundColor: palette.neutralLight,\r\n },\r\n },\r\n '& .ms-Icon': {\r\n paddingRight: 5,\r\n },\r\n },\r\n },\r\n statusStyle({ palette })\r\n ),\r\n };\r\n};\r\n\r\n\r\nexport const IncludeExcludeTemplate: FC = (props) => {\r\n const styleClassNames: any = useDefaultStyles(styles);\r\n const {\r\n itemData,\r\n } = props;\r\n const [showCallout, setShowCallout] = useState(false);\r\n const [target, setTarget] = useState(null);\r\n const statusIcon = !itemData.IsExcluded ? (\r\n
\r\n
\r\n {itemData.IsLeaf &&
}\r\n
) : (\r\n
\r\n {itemData.IsLeaf && }\r\n {!itemData.IsLeaf &&
}\r\n {itemData.IsLeaf &&
}\r\n
);\r\n\r\n const dismiss = useCallback(() => {\r\n setShowCallout(false);\r\n }, []);\r\n\r\n const show = useCallback((e) => {\r\n if (itemData.IsLeaf) {\r\n const cellEl = e.target.closest('.ms-DetailsRow-cell');\r\n setTarget(cellEl.getBoundingClientRect());\r\n setShowCallout(true);\r\n }\r\n }, [itemData.IsLeaf]);\r\n\r\n\r\n const onSave = useCallback((isInclude) => {\r\n const itemToAdd = _.extend(fromViewModelToBulkModel(itemData), {\r\n Id: -1,\r\n IsExcluded: !isInclude,\r\n });\r\n const itemToDelete = {\r\n Id: itemData.Id,\r\n AssetGroupId: itemData.AssetGroupId,\r\n Status: 'Deleted',\r\n };\r\n const res = createOrUpdateListingGroup([itemToAdd], [itemToDelete])\r\n .then(() => {\r\n itemData.refreshGridData();\r\n });\r\n\r\n return res;\r\n }, [itemData]);\r\n\r\n const onInclude = useCallback(() => {\r\n onSave(true);\r\n }, [onSave]);\r\n\r\n const onExclude = useCallback(() => {\r\n onSave(false);\r\n }, [onSave]);\r\n\r\n return (\r\n
\r\n
\r\n {statusIcon}\r\n
\r\n {showCallout && (\r\n \r\n
    \r\n
  • \r\n \r\n \r\n \r\n {itemData.i18n.getString(_TL_('Include'))}\r\n \r\n \r\n
  • \r\n
  • \r\n \r\n \r\n \r\n {itemData.i18n.getString(_TL_('Exclude'))}\r\n \r\n \r\n
  • \r\n
\r\n )}\r\n
);\r\n};\r\n","/* eslint-disable no-use-before-define */\r\n/* eslint-disable no-nested-ternary */\r\n/* eslint-disable react/prop-types */\r\n/* eslint-disable react/jsx-indent */\r\n/* eslint-disable react/jsx-filename-extension */\r\nimport React from 'react';\r\nimport { assertIsDefined } from '@bingads-webui-campaign-react/debug-assert';\r\nimport { ColumnFormat, I18n, getFormatter } from '@bingads-webui-grid/well-known';\r\nimport { IColumn } from '@fluentui/react';\r\nimport { ListingGroupColumn, AssetGroupNameColumn, IncludeExcludeColumn } from '../../rawColumns';\r\nimport { ListingGroupGridColumnOnRender, ListingGroupGridItemData, } from '../../interface';\r\nimport { getPropertyFromItem, shouldEnableEdit, IsCurrentAccountInactive, IsReadOnlyMode } from '../utils';\r\nimport { columnKeyRawDataMap } from '../../ColumnOdataMap';\r\nimport { Model$Listing } from '../../ApiType';\r\nimport { ConditionTemplate } from './ConditionTemplate';\r\nimport { FlattenConditionTemplate } from './FlattenConditionTemplate';\r\nimport { NameTemplate } from './NameTemplate';\r\nimport { IncludeExcludeTemplate } from './IncludeExcludeTemplate';\r\n\r\nconst PATH_SPLITER = '>';\r\n\r\nconst isEverythingElse = (condition: Model$Listing) =>\r\n !!(!condition.Attribute && condition.Operand);\r\n\r\nconst isAllProduct = (condition: Model$Listing) =>\r\n !!(condition.Operand === '' && !condition.Attribute);\r\n\r\nconst getNearestParentCondition = (parentConditions: Model$Listing[]) => (parentConditions[parentConditions.length - 1]);\r\n\r\nexport const getDisplayName = (condition: Model$Listing, parentConditions:Model$Listing[], i18n: I18n): any => {\r\n if (isAllProduct(condition)) {\r\n return i18n.getString(_TL_('All Products'));\r\n }\r\n const parentCondition = getNearestParentCondition(parentConditions);\r\n if (isEverythingElse(condition)) {\r\n if (isEverythingElse(parentCondition)) {\r\n return i18n.getString(_TL_('Everything else'));\r\n }\r\n return i18n.getString(_TL_(\"Everything else in '{0}'\")).replace('{0}', getDisplayName(parentCondition, parentConditions.slice(0, -1), i18n));\r\n }\r\n return condition.Attribute;\r\n};\r\n\r\nconst getPath = (parentConditions: Model$Listing[], i18n: I18n) => {\r\n if (!parentConditions || parentConditions.length === 0) {\r\n return '';\r\n }\r\n let path = '';\r\n path += getDisplayName(parentConditions[0], [], i18n);\r\n for (let i = 1; i < parentConditions.length; i += 1) {\r\n path += ` ${PATH_SPLITER} ${getDisplayName(parentConditions[i], parentConditions.slice(0, i), i18n)}`;\r\n }\r\n return path;\r\n};\r\n\r\nconst getFullPath = (conditions: Model$Listing[], i18n: I18n) => {\r\n const path: any[] = [];\r\n for (let i = 0; i < conditions.length; i += 1) {\r\n path.push({\r\n ...conditions[i],\r\n Attribute: getDisplayName(conditions[i], conditions.slice(0, i), i18n),\r\n });\r\n }\r\n return path;\r\n};\r\n\r\nexport function getAttributeTextOfConditionTemplate(i18n: I18n, item: ListingGroupGridItemData) {\r\n assertIsDefined(item.treeViewInfo);\r\n assertIsDefined(item.Condition);\r\n const parentItem = item.treeViewInfo.parent;\r\n let attributeText: string;\r\n if (isAllProduct(item.Condition)) {\r\n attributeText = i18n.getString(_TL_('All Products'));\r\n } else if (isEverythingElse(item.Condition)) {\r\n // if item is not root, it must have parent.\r\n assertIsDefined(parentItem?.Condition);\r\n if (isEverythingElse(parentItem.Condition)) {\r\n // Parent node is everything else\r\n attributeText = i18n.getString(_TL_('Everything else'));\r\n } else {\r\n // Everything else in `parent's attribute`\r\n const parentAttribute = parentItem.Condition.Attribute || i18n.getString(_TL_('All Products'));\r\n\r\n attributeText = i18n.getString(_TL_(\"Everything else in '{0}'\")).replace('{0}', parentAttribute);\r\n }\r\n } else {\r\n assertIsDefined(item.Condition.Attribute);\r\n attributeText = item.Condition.Attribute;\r\n }\r\n return attributeText;\r\n}\r\n\r\nconst onListingGroupColumnRender: ListingGroupGridColumnOnRender = (itemData) => {\r\n const isTreeView = !!itemData?.treeViewInfo;\r\n if (isTreeView) {\r\n return onListingGroupColumnTreeViewRender(itemData);\r\n }\r\n return onListingGroupColumnListViewRender(itemData);\r\n};\r\n\r\nconst onAssetGroupNameColumnRender: ListingGroupGridColumnOnRender = (itemData) => {\r\n assertIsDefined(itemData, 'item with no data');\r\n const { i18n, serverContext, scope } = itemData;\r\n const name = itemData.AssetGroupName;\r\n const assetGroupId = itemData.AssetGroupId;\r\n const currentCampaign = serverContext.CurrentCampaign;\r\n // In campaign level, there is no CampaignId in row value\r\n const cmpid = itemData.CampaignId || (currentCampaign && currentCampaign.Id);\r\n const ariaLabel = i18n.getString(_TL_('Click to scope to asset group {{assetGroupName}}'), { assetGroupName: name });\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst onIncludeExcludeColumnRender: ListingGroupGridColumnOnRender = (itemData) => {\r\n assertIsDefined(itemData, 'item with no data');\r\n return ();\r\n};\r\n\r\nconst onListingGroupColumnListViewRender: ListingGroupGridColumnOnRender = (itemData) => {\r\n assertIsDefined(itemData, 'item with no data');\r\n const { i18n, scope } = itemData;\r\n // if (value.$total) {\r\n // return flattenConditionTemplate(value);\r\n // }\r\n const condition = { ...itemData.Condition };\r\n const parentConditions = itemData.ParentConditions;\r\n assertIsDefined(parentConditions);\r\n const attribute = getDisplayName(condition, parentConditions, i18n);\r\n const path = getPath(parentConditions, i18n);\r\n const conditions = itemData.ParentConditions ?\r\n [...itemData.ParentConditions, itemData.Condition] : [itemData.Condition];\r\n const partitionFullPath = getFullPath(conditions, i18n);\r\n return ();\r\n};\r\n\r\nconst onListingGroupColumnTreeViewRender: ListingGroupGridColumnOnRender = (itemData) => {\r\n assertIsDefined(itemData?.treeViewInfo);\r\n assertIsDefined(itemData.treeViewInfo.depth);\r\n assertIsDefined(itemData.treeViewInfo.hasChildren);\r\n const {\r\n serverContext, i18n, total, scope, parentConditions,\r\n treeViewInfo: { hasChildren, depth, isExpanded },\r\n } = itemData;\r\n\r\n const showSelectorIcon = shouldEnableEdit(!IsCurrentAccountInactive(serverContext) &&\r\n !IsReadOnlyMode(serverContext) && (hasChildren || depth < 7), serverContext);\r\n\r\n function onToggleCollapse() {\r\n assertIsDefined(itemData?.eventHandlers.onTreeViewColumnToggleCollapse);\r\n itemData.eventHandlers.onTreeViewColumnToggleCollapse(itemData);\r\n }\r\n\r\n function onAddOrEditTrigger() {\r\n assertIsDefined(itemData?.eventHandlers.onTreeViewColumnAddOrEdit);\r\n itemData.eventHandlers.onTreeViewColumnAddOrEdit(itemData as any); // TODO: not use this trick\r\n }\r\n\r\n const attributeText = getAttributeTextOfConditionTemplate(i18n, itemData);\r\n\r\n assertIsDefined(parentConditions);\r\n const conditions = itemData.ParentConditions ?\r\n [...itemData.ParentConditions, itemData.Condition] : [itemData.Condition];\r\n const partitionFullPath = getFullPath(conditions, i18n);\r\n\r\n return ( onAddOrEditTrigger()}\r\n onToggleCollapse={() => onToggleCollapse()}\r\n attributeText={attributeText}\r\n depth={depth}\r\n hasChildren={hasChildren}\r\n i18n={i18n}\r\n isExpanded={!!isExpanded}\r\n showSelectorIcon={showSelectorIcon}\r\n total={total}\r\n partitionFullPath={partitionFullPath}\r\n scope={scope}\r\n productListingGroupId={itemData.Id}\r\n assetGroupId={itemData.AssetGroupId}\r\n />);\r\n};\r\n\r\n/**\r\n * key is the key of column raw data\r\n *\r\n * value is the render callback of fluentUI\r\n */\r\nconst columnRenderMap: Map = new Map([\r\n [IncludeExcludeColumn.key, onIncludeExcludeColumnRender],\r\n [ListingGroupColumn.key, onListingGroupColumnRender],\r\n [AssetGroupNameColumn.key, onAssetGroupNameColumnRender],\r\n]);\r\n\r\nconst defaultRender: ListingGroupGridColumnOnRender = getFormattedPropertyValueOfItem;\r\n\r\nfunction getFormattedPropertyValueOfItem(itemData: ListingGroupGridItemData | undefined, index: number | undefined, column: IColumn | undefined): string {\r\n assertIsDefined(itemData);\r\n assertIsDefined(column);\r\n const value = getPropertyFromItem(itemData, index, column);\r\n const format = getFormatOfColumn(column);\r\n return tryGetFormatString(value, itemData.i18n, format);\r\n}\r\n\r\nfunction getFormatOfColumn(column: IColumn) {\r\n return columnKeyRawDataMap[column.key].format;\r\n}\r\n\r\nexport function tryGetFormatString(value: string | number, i18n: I18n, format: ColumnFormat | undefined) {\r\n if (format) {\r\n const formatter = getFormatter(format, i18n);\r\n return formatter(value);\r\n }\r\n return value;\r\n}\r\n\r\nexport function getColumnRenderByColumnKey(columnKey: string) {\r\n if (columnRenderMap.has(columnKey)) {\r\n return columnRenderMap.get(columnKey);\r\n }\r\n return defaultRender;\r\n}\r\n","import { ListingGroupColumn, AssetGroupNameColumn } from '../rawColumns';\r\n\r\nconst isColumnSortEnabledMap: Map = new Map([\r\n [ListingGroupColumn.key, true],\r\n [AssetGroupNameColumn.key, true],\r\n]);\r\n\r\nexport function isSortEnabledByColumnKey(columnKey: string): boolean {\r\n if (isColumnSortEnabledMap.has(columnKey)) {\r\n return isColumnSortEnabledMap.get(columnKey)!;\r\n }\r\n return false;\r\n}\r\n","import { useContext, useMemo } from 'react';\r\nimport { InstrumentationContext } from '@bingads-webui-react/hoc-with-instrumentation';\r\n\r\nconst listingGroupActivityName = 'ListingGroupPage';\r\n\r\nconst schema = {\r\n scenario: [\r\n {\r\n name: 'ListingGroup',\r\n value: 'ListingGroup',\r\n activity: [\r\n { name: listingGroupActivityName, value: listingGroupActivityName },\r\n ],\r\n },\r\n ],\r\n};\r\n\r\nfunction getActivity(instrumentation) {\r\n instrumentation.addScenario(schema);\r\n\r\n const scenario = instrumentation.ListingGroup.create();\r\n const activity = scenario[listingGroupActivityName].create();\r\n\r\n return activity;\r\n}\r\n\r\nfunction getLogger(activity) {\r\n function signal(message: string) {\r\n activity.signal(message);\r\n }\r\n return { signal };\r\n}\r\n\r\nexport function useLogger() {\r\n const instrumentation = useContext(InstrumentationContext);\r\n const activity = useMemo(() => getActivity(instrumentation), [instrumentation]);\r\n const logger = useMemo(() => getLogger(activity), [activity]);\r\n return logger;\r\n}\r\n","import _ from 'underscore';\r\nimport { assertIsDefined } from '@bingads-webui-campaign-react/debug-assert';\r\nimport { WithTreeViewData } from '@bingads-webui-grid/well-known';\r\nimport { IDropdownOption } from '@fluentui/react';\r\nimport { Model$ListingGroup } from '../ApiType';\r\nimport { EVERYTHING_ELSE_NODE_ATTRIBUTE, NullPartial } from '../constant';\r\nimport { ListingGroupGridItemData } from '../interface';\r\nimport { ListingGroupTreeViewSelectorGridItem } from './panel-helper';\r\n\r\nfunction getKeyOfHotelListingGroupItem(item: ListingGroupGridItemData) { return `${item.Condition?.Operand ?? ''}-${item.Condition?.Attribute ?? ''}`; }\r\nfunction getAttributeValueOfPanelSelectorItem(item: ListingGroupTreeViewSelectorGridItem) { return item.data.Attribute; }\r\nfunction getKeyOfPanelSelectorItem(item: ListingGroupTreeViewSelectorGridItem, diemnsionKey: string) { return `${diemnsionKey}-${getAttributeValueOfPanelSelectorItem(item) ?? ''}`; }\r\n\r\nexport interface TreeViewSaveWorkerOptions {\r\n selectedItems: ListingGroupTreeViewSelectorGridItem[];\r\n selectedDimension: IDropdownOption;\r\n treeItem: WithTreeViewData;\r\n\r\n // / Need adGroup and campaign info to send request\r\n\r\n assetGroupId: number;\r\n campaignId: number;\r\n\r\n callbackWhenSkipUpdate: () => void;\r\n callbackWhenUpdate: (\r\n listingGroupsToAdd: Partial>[],\r\n listingGroupsToDelete: number[],\r\n ) => Promise;\r\n}\r\n\r\nexport function getAddAndDeleteItem(selectedDimension: IDropdownOption, selectedItems: ListingGroupTreeViewSelectorGridItem[], treeItem: WithTreeViewData) {\r\n // / handle children\r\n // 1. use `${DimensionType}-${DimensionValue}`(.i.e `${Operand}-${Attribute}`) as key\r\n // 2. calculate the difference\r\n // 3. use API to update\r\n assertIsDefined(treeItem);\r\n const childrenOfEidtItem = treeItem.treeViewInfo.children;\r\n\r\n const currentOperandOfChildren: string = selectedDimension.data.operand;\r\n\r\n const dummyEveryThingElse: ListingGroupTreeViewSelectorGridItem = {\r\n key: '_DUMMY_EVERY_THING_ELSE',\r\n data: { Attribute: EVERYTHING_ELSE_NODE_ATTRIBUTE },\r\n } as unknown as ListingGroupTreeViewSelectorGridItem;\r\n\r\n const finalSelectedItems = selectedItems.length === 0 ? selectedItems : [\r\n ...selectedItems,\r\n dummyEveryThingElse,\r\n ];\r\n\r\n const oldItemKeys = new Set(childrenOfEidtItem.map(child =>\r\n getKeyOfHotelListingGroupItem(child)));\r\n\r\n const newItemKeys = new Set(finalSelectedItems.map(item =>\r\n getKeyOfPanelSelectorItem(item, currentOperandOfChildren)));\r\n\r\n // deleted item ids are the difference of oldItemIds and newItemIds\r\n const deleteItemIds = childrenOfEidtItem.filter((child) => {\r\n const key = getKeyOfHotelListingGroupItem(child);\r\n return !newItemKeys.has(key);\r\n }).map(child => child.Id);\r\n\r\n // added item ids are the difference of newItemIds and oldItemIds\r\n const addedItems = finalSelectedItems.filter((item) => {\r\n const key = getKeyOfPanelSelectorItem(item, currentOperandOfChildren);\r\n return !oldItemKeys.has(key);\r\n });\r\n\r\n return { deleteItemIds, addedItems };\r\n}\r\n\r\nexport async function treeViewSaveWorker(params: TreeViewSaveWorkerOptions) {\r\n const {\r\n selectedItems,\r\n selectedDimension,\r\n treeItem,\r\n callbackWhenSkipUpdate,\r\n callbackWhenUpdate,\r\n assetGroupId,\r\n campaignId,\r\n } = params;\r\n\r\n // / handle children\r\n // 1. use `${DimensionType}-${DimensionValue}`(.i.e `${Operand}-${Attribute}`) as key\r\n // 2. calculate the difference\r\n // 3. use API to update\r\n assertIsDefined(treeItem);\r\n const childrenOfEidtItem = treeItem.treeViewInfo.children;\r\n\r\n const prevOperandOfChildren = childrenOfEidtItem.length === 0 ? undefined : childrenOfEidtItem[0].Condition?.Operand;\r\n\r\n const currentOperandOfChildren: string = selectedDimension.data.operand;\r\n\r\n const { addedItems, deleteItemIds } = getAddAndDeleteItem(selectedDimension, selectedItems, treeItem);\r\n\r\n // for all new node, it should have a unique negative ID.\r\n // There should only be one new root, whose ID is `-1`\r\n const rootNodeId = -1;\r\n let negativeId = -2;\r\n const editItemId = treeItem.Id;\r\n const wasEditingNodeLeaf = treeItem.treeViewInfo.children.length === 0;\r\n const isEditingNodeLeaf = selectedItems.length === 0;\r\n\r\n const inheritNode = (() => {\r\n switch (true) {\r\n case wasEditingNodeLeaf && !isEditingNodeLeaf:\r\n // add patition under leaf node, new partition inherits bid from leaf node.\r\n return treeItem;\r\n case !wasEditingNodeLeaf && prevOperandOfChildren === currentOperandOfChildren:\r\n // add partition under non-leaf node,\r\n // new partition inherits bid from everythingElse at the same level.\r\n return treeItem.treeViewInfo.children.find(child => child.Condition?.Attribute === EVERYTHING_ELSE_NODE_ATTRIBUTE);\r\n default:\r\n return undefined;\r\n }\r\n })();\r\n\r\n // children could be add to editing node, which could be\r\n // - parent, children should set parent ID to editing node\r\n // - leaf, editing node will have a dummy ID and all children should set it as parent\r\n const parentIdOfChildren = !wasEditingNodeLeaf ? treeItem.Id : rootNodeId;\r\n assertIsDefined(parentIdOfChildren);\r\n\r\n const listingGroupsToAdd: Partial>[] = addedItems.map(item => buildListingGroupToAdd({\r\n Attribute: getAttributeValueOfPanelSelectorItem(item),\r\n Operand: currentOperandOfChildren,\r\n ParentId: parentIdOfChildren,\r\n isLeaf: true,\r\n inheritNode,\r\n isDeleteAll: false,\r\n }));\r\n\r\n const listingGroupsToDelete = Array.from(deleteItemIds);\r\n\r\n // if nothing is changed, just skip\r\n if (listingGroupsToAdd.length === 0 && listingGroupsToDelete.length === 0) {\r\n callbackWhenSkipUpdate();\r\n return;\r\n }\r\n\r\n // handle current node itself and \"everything else\" node.\r\n switch (true) {\r\n case wasEditingNodeLeaf && !isEditingNodeLeaf:\r\n // if the item is changed from leaf to parent\r\n // - delete it and add it back to make back-end happy(make this item a`Subdivision` rather than`Unit`)\r\n\r\n // item itself\r\n listingGroupsToDelete.push(editItemId);\r\n listingGroupsToAdd.push(buildListingGroupToAdd({\r\n ParentId: treeItem.ParentId ?? undefined,\r\n Attribute: treeItem.Condition?.Attribute ?? null,\r\n Operand: (!treeItem.Condition || treeItem.Condition.Operand === '') ? 'All' : treeItem.Condition.Operand,\r\n isLeaf: false,\r\n inheritNode,\r\n isDeleteAll: _.isEmpty(listingGroupsToAdd),\r\n }));\r\n break;\r\n case isEditingNodeLeaf:\r\n // Note: from leaf to leaf is skipped, for nothing will be changed\r\n // if the item is changed from parent to leaf, delete it and add it back to make back-end happy(make this item a `Unit` rather than `Subdivision`)\r\n listingGroupsToDelete.push(editItemId);\r\n listingGroupsToAdd.push(buildListingGroupToAdd({\r\n ParentId: treeItem.ParentId ?? undefined,\r\n Attribute: treeItem.Condition?.Attribute ?? null,\r\n Operand: (!treeItem.Condition || treeItem.Condition.Operand === '') ? 'All' : treeItem.Condition.Operand,\r\n isLeaf: true,\r\n inheritNode,\r\n isDeleteAll: _.isEmpty(listingGroupsToAdd),\r\n }));\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n // sort the requests to make the root is the first child\r\n listingGroupsToAdd.sort((a, b) => {\r\n assertIsDefined(a.Id);\r\n assertIsDefined(b.Id);\r\n if (a.Id < b.Id) {\r\n return 1;\r\n }\r\n if (a.Id > b.Id) {\r\n return -1;\r\n }\r\n return 0;\r\n });\r\n\r\n await callbackWhenUpdate(listingGroupsToAdd, listingGroupsToDelete);\r\n\r\n interface MetaInfo {\r\n ParentId: number | undefined;\r\n Attribute: string | null;\r\n Operand: string | undefined;\r\n isLeaf: boolean;\r\n inheritNode: WithTreeViewData | undefined;\r\n isDeleteAll: boolean;\r\n }\r\n\r\n function buildListingGroupToAdd(metaInfo: MetaInfo): Partial> {\r\n return {\r\n Id: metaInfo.isLeaf ? negativeId-- : rootNodeId,\r\n ParentId: metaInfo.ParentId,\r\n IsLeaf: metaInfo.isLeaf,\r\n AssetGroupId: assetGroupId, // in tree editor page, we always have AdGroupId\r\n CampaignId: campaignId, // in tree editor page, we always have CampaignId\r\n // IsAutoBidding: false, // TODO: Not enabled for phase 1\r\n Condition: { Attribute: metaInfo.Attribute ?? (null as unknown as undefined), Operand: metaInfo.Operand ?? (null as unknown as undefined) },\r\n IsExcluded: !metaInfo.isDeleteAll && metaInfo.isLeaf && ((metaInfo.Attribute === '' && metaInfo.Operand !== 'All') || (metaInfo.inheritNode?.IsExcluded)),\r\n };\r\n }\r\n}\r\n","/* eslint-disable react/jsx-filename-extension */\r\nimport { isString } from 'underscore';\r\nimport { assertIsDefined } from '@bingads-webui-campaign-react/debug-assert';\r\nimport { clicksColumn, conversionsColumn, impressionsColumn, WithTreeViewData } from '@bingads-webui-grid/well-known';\r\nimport { IColumn, TextField } from '@fluentui/react';\r\nimport React from 'react';\r\nimport { WithBulk } from './PanelSelector';\r\nimport { Model$ProductAttributeStatistic, Model$ListingCondition } from '../ApiType';\r\nimport { ListingGroupGridItemData } from '../interface';\r\nimport { ListingColumn } from '../rawColumns';\r\n\r\nconst conversionsFiledName = 'conversions';\r\nconst impressionsFiledName = 'impressions';\r\nconst clicksFiledName = 'clicks';\r\nconst productsFiledName = 'products';\r\nconst defaultValuePlaceholder = '-';\r\nconst firstColumnName = 'primary';\r\nexport interface ListingGroupTreeViewSelectorGridItem {\r\n key: string;\r\n // fileds\r\n [firstColumnName]: string;\r\n /**\r\n * @default \"-\"\r\n */\r\n [conversionsFiledName]: number | string | undefined | null;\r\n /**\r\n * @default \"-\"\r\n */\r\n [impressionsFiledName]: number | string | undefined | null;\r\n /**\r\n * @default \"-\"\r\n */\r\n [clicksFiledName]: number | string | undefined | null;\r\n /**\r\n * @default \"-\"\r\n */\r\n [productsFiledName]: number | string | undefined | null;\r\n\r\n data: {\r\n Attribute: string;\r\n }\r\n}\r\n\r\nconst dataColumnWidth = 80;\r\n\r\nexport function buildTreeViewSelectorItems(selectedDimension: Model$ListingCondition, selectedDimensionGridData: Model$ProductAttributeStatistic[], childrenOfNode: WithTreeViewData[]): ListingGroupTreeViewSelectorGridItem[] {\r\n const selectedDimensionGridDataMap: { [attributeName: string]: Model$ProductAttributeStatistic } = selectedDimensionGridData.reduce((cur, item) => {\r\n assertIsDefined(item.AttributeName);\r\n // eslint-disable-next-line no-param-reassign\r\n cur[item.AttributeName] = item;\r\n return cur;\r\n }, {});\r\n const domainDataItems: ListingGroupTreeViewSelectorGridItem[] = selectedDimension.DomainData?.map((item) => {\r\n const curItemDataitem = selectedDimensionGridDataMap[item.Id];\r\n assertIsDefined(item.Value);\r\n return {\r\n key: item.Id.toString(),\r\n [firstColumnName]: item.Value,\r\n [clicksFiledName]: curItemDataitem?.PerformanceMetrics.Clicks,\r\n [conversionsFiledName]: curItemDataitem?.PerformanceMetrics.Conversions,\r\n [impressionsFiledName]: curItemDataitem?.PerformanceMetrics.Impressions,\r\n [productsFiledName]: curItemDataitem?.ProductCount,\r\n data: {\r\n Attribute: item.Value,\r\n },\r\n };\r\n }) ?? [];\r\n\r\n const apiDataItems: ListingGroupTreeViewSelectorGridItem[] = selectedDimensionGridData.map((item) => {\r\n assertIsDefined(item.AttributeName);\r\n return {\r\n key: item.Id.toString(),\r\n [firstColumnName]: item.AttributeName,\r\n [clicksFiledName]: item?.PerformanceMetrics.Clicks,\r\n [conversionsFiledName]: item?.PerformanceMetrics.Conversions,\r\n [impressionsFiledName]: item?.PerformanceMetrics.Impressions,\r\n [productsFiledName]: item?.OfferCount,\r\n data: {\r\n Attribute: item.AttributeName,\r\n },\r\n };\r\n }) ?? [];\r\n\r\n const existingItems = buildTreeViewSelectorItemsByChildrenOfNode(selectedDimension, childrenOfNode);\r\n const tempDataItems = mergeTreeViewSelectorItems(domainDataItems, existingItems);\r\n return fillDataFromAPI(tempDataItems, apiDataItems, selectedDimension.HasDomainData);\r\n}\r\n\r\nexport function buildTreeViewSelectorItemsWithoutStatistics(selectedDimension: Model$ListingCondition): ListingGroupTreeViewSelectorGridItem[] {\r\n const domainDataItems: ListingGroupTreeViewSelectorGridItem[] = selectedDimension.DomainData?.map((item) => {\r\n assertIsDefined(item.Value);\r\n return {\r\n key: item.Id.toString(),\r\n [firstColumnName]: item.Value,\r\n [clicksFiledName]: undefined,\r\n [conversionsFiledName]: undefined,\r\n [impressionsFiledName]: undefined,\r\n [productsFiledName]: undefined,\r\n data: {\r\n Attribute: item.Value,\r\n },\r\n };\r\n }) ?? [];\r\n\r\n const existingItems = buildTreeViewSelectorItemsByChildrenOfNode(selectedDimension, []);\r\n const tempDataItems = mergeTreeViewSelectorItems(domainDataItems, existingItems);\r\n return tempDataItems;\r\n}\r\n\r\nfunction fillDataFromAPI(candidateItems: ListingGroupTreeViewSelectorGridItem[], apiDataItems: ListingGroupTreeViewSelectorGridItem[], hasDomainData: boolean) {\r\n return overrideMergeByValue(\r\n candidateItems,\r\n apiDataItems,\r\n x => x.data.Attribute,\r\n (b, index, arr) => {\r\n const newItem = { ...arr[index] };\r\n newItem[clicksFiledName] = b?.[clicksFiledName];\r\n newItem[conversionsFiledName] = b?.[conversionsFiledName];\r\n newItem[impressionsFiledName] = b?.[impressionsFiledName];\r\n newItem[productsFiledName] = b?.[productsFiledName];\r\n // eslint-disable-next-line no-param-reassign\r\n arr[index] = newItem;\r\n },\r\n !hasDomainData\r\n );\r\n}\r\n\r\n/**\r\n * Given two array, \"base\" and \"additional\".\r\n *\r\n * Shadow copy \"base\" array to \"result\" array.\r\n * If found any element in \"additional\" is existed in \"base\", call the callback.\r\n * Else add the element to the \"result\" array.\r\n *\r\n * @param a base array\r\n * @param b additional array\r\n * @param comparator a callback to compare whether two element is same\r\n * @param callback called when two element is the same according to `comparator`\r\n * @returns result array\r\n */\r\nfunction overrideMergeByComparator(a: T[], b: T[], comparator: (x: T, y: T) => boolean, callback: (b: T, index: number, arr: T[]) => void, appendNewItems:boolean) {\r\n const res = [...a];\r\n b.forEach((x) => {\r\n const index = res.findIndex(y => comparator(x, y));\r\n if (index >= 0) {\r\n callback(x, index, res);\r\n } else if (appendNewItems) {\r\n res.push(x);\r\n }\r\n });\r\n return res;\r\n}\r\n\r\nfunction overrideMergeByValue(a: T[], b: T[], valuePicker: (x: T) => unknown, callback: (b: T, index: number, arr: T[]) => void, appendNewItems:boolean) {\r\n const comperator = (x: T, y: T) => {\r\n const xValue = valuePicker(x);\r\n const yValue = valuePicker(y);\r\n\r\n if (isString(xValue) && isString(yValue)) {\r\n return xValue.toLowerCase() === yValue.toLowerCase();\r\n }\r\n\r\n return xValue === yValue;\r\n };\r\n\r\n return overrideMergeByComparator(a, b, comperator, callback, appendNewItems);\r\n}\r\n\r\nexport function mergeTreeViewSelectorItems(oldItems: ListingGroupTreeViewSelectorGridItem[], additionalItems: ListingGroupTreeViewSelectorGridItem[]) {\r\n return overrideMergeByValue(\r\n oldItems,\r\n additionalItems,\r\n x => x.data.Attribute,\r\n // eslint-disable-next-line no-return-assign, no-param-reassign\r\n (b, index, arr) => arr[index] = b,\r\n true\r\n );\r\n}\r\n\r\nexport function buildTreeViewSelectorItemsByChildrenOfNode(selectedDimension: Model$ListingCondition, childrenOfNode: WithTreeViewData[]): ListingGroupTreeViewSelectorGridItem[] {\r\n const res: ListingGroupTreeViewSelectorGridItem[] = [];\r\n childrenOfNode.forEach((child) => {\r\n // filter out everything else\r\n if (child.Condition?.Attribute\r\n && selectedDimension.Operand === child.Condition.Operand\r\n ) {\r\n res.push({\r\n key: child.Id.toString(),\r\n [firstColumnName]: child.Condition.Attribute,\r\n [clicksFiledName]: undefined,\r\n [conversionsFiledName]: undefined,\r\n [impressionsFiledName]: undefined,\r\n [productsFiledName]: undefined,\r\n data: {\r\n Attribute: child.Condition.Attribute,\r\n },\r\n });\r\n }\r\n });\r\n return res;\r\n}\r\n\r\nconst defaultRender: IColumn['onRender'] = (item, index, column) => {\r\n let value = item && column?.fieldName ? item[column.fieldName] : '';\r\n\r\n if (value === null || value === undefined) {\r\n value = defaultValuePlaceholder;\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value.toString();\r\n }\r\n\r\n return (\r\n \r\n {value}\r\n \r\n );\r\n};\r\n\r\nexport function fillDataToBulkAddedItem(item: WithBulk) {\r\n const isAddedByBulkEdit = !!item.__bulk;\r\n if (isAddedByBulkEdit) {\r\n if (!item.data) {\r\n // eslint-disable-next-line no-param-reassign\r\n item.data = {\r\n Attribute: item[firstColumnName],\r\n };\r\n } else {\r\n // eslint-disable-next-line no-param-reassign\r\n item.data.Attribute = item[firstColumnName];\r\n }\r\n }\r\n}\r\n\r\nconst primaryColumnRender: IColumn['onRender'] = (item, index, column) => {\r\n const value = item && column?.fieldName ? item[column.fieldName] : '';\r\n\r\n const isEditableItem = Number.isInteger(item.key) && item.key < 0;\r\n if (!isEditableItem) {\r\n return (\r\n \r\n {value}\r\n );\r\n }\r\n return (\r\n {\r\n assertIsDefined(column?.fieldName);\r\n // eslint-disable-next-line no-param-reassign\r\n item[column.fieldName] = newValue;\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport function buildTreeViewSelectorColumns(primaryColumnId: string, primaryColumnName: string, i18n: any, includeDataColumns: boolean): IColumn[] {\r\n const primaryColumn: IColumn = {\r\n key: primaryColumnId,\r\n name: i18n.getString(`ProductsGrid_Column_${primaryColumnName}`),\r\n minWidth: 180,\r\n fieldName: firstColumnName,\r\n isRowHeader: true,\r\n onRender: primaryColumnRender,\r\n };\r\n if (!includeDataColumns) {\r\n return [primaryColumn];\r\n }\r\n const dataColumns: IColumn[] = [\r\n { ...conversionsColumn, filedName: conversionsFiledName },\r\n { ...impressionsColumn, filedName: impressionsFiledName },\r\n { ...clicksColumn, filedName: clicksFiledName },\r\n { ...ListingColumn, filedName: productsFiledName },\r\n ].map(column => ({\r\n key: column.key,\r\n name: i18n.getString(column.name),\r\n minWidth: dataColumnWidth,\r\n maxWidth: dataColumnWidth,\r\n fieldName: column.filedName,\r\n onRender: defaultRender,\r\n }));\r\n return [primaryColumn, ...dataColumns];\r\n}\r\n","/* eslint-disable */\r\nimport React, { useState, useRef, useCallback, useContext } from 'react';\r\nimport _ from 'underscore';\r\nimport { assertIsDefined } from '@bingads-webui-campaign-react/debug-assert';\r\nimport { IColumn, IDropdownOption } from '@fluentui/react';\r\nimport {WithTreeViewData, I18n } from '@bingads-webui-grid/well-known';\r\nimport { useDateRange } from '@bingads-webui-campaign-react/wizard-shared-components';\r\nimport { PanelSelectorProps, WithBulk } from './treeViewPanelSelector/PanelSelector';\r\nimport { AlertHelper } from '@bingads-webui-campaign/alert-helper';\r\nimport { ServerContext } from '@bingads-webui-campaign-react/server-context';\r\nimport { mergeData } from '@bingads-webui-campaign-react/product-services';\r\nimport { Model$ListingCondition, Model$ListingGroup } from './ApiType';\r\nimport { getValidListingConditions, getValidListingConditionsForWithoutPreselectedTreeNode } from './API/getListingGroupConditions';\r\nimport { useAPIsOfListingGroup } from './API';\r\nimport { ListingGroupGridItemData, TreeViewEventHandler } from './interface';\r\nimport { getAttributeTextOfConditionTemplate } from './render';\r\nimport { getAddAndDeleteItem, treeViewSaveWorker } from './treeViewPanelSelector/panel-callbacks';\r\nimport { buildTreeViewSelectorColumns, buildTreeViewSelectorItems, buildTreeViewSelectorItemsWithoutStatistics, buildTreeViewSelectorItemsByChildrenOfNode, fillDataToBulkAddedItem, ListingGroupTreeViewSelectorGridItem } from './treeViewPanelSelector/panel-helper';\r\nimport { ProductAttrubuteStatisticsResponse } from './API/productAttributeStatistics';\r\nimport { useLogger } from './logger';\r\nimport { getProductData, getProductScopeFromOData } from './API/getProductScope';\r\nimport { useAccountData } from './API/useAccountData';\r\nimport { offerLimitExceededWarningForListingGroup } from './render/utils';\r\n\r\n/**\r\n * default value used in fluent-ui\r\n * reference https://github.com/microsoft/fluentui/blob/31345de30d356731eeb0ac1e658a2652f8f00aa7/packages/react/src/components/DetailsList/DetailsList.base.tsx\r\n */\r\ninterface UseTreeViewPanelSelectorProps {\r\n allRowRawData: Model$ListingGroup[] | undefined;\r\n setAllRowRawData: Function,\r\n scope: { save: Function, values: any };\r\n refreshGridData: Function;\r\n getArguemntsOfUpdateGridDataByCurrentState: Function,\r\n i18n: I18n;\r\n currentCampaign: any;\r\n}\r\n\r\nconst NonSplittableConditions = ['CategoryL1', 'CategoryL2', 'CategoryL3', 'CategoryL4', 'CategoryL5'];\r\n\r\nconst DEFAULT_SALES_COUNTRY = 'US';\r\n\r\nexport const useTreeViewPanelSelector = (props: UseTreeViewPanelSelectorProps) => {\r\n const {\r\n i18n, allRowRawData, setAllRowRawData, scope, currentCampaign,\r\n refreshGridData,getArguemntsOfUpdateGridDataByCurrentState\r\n } = props;\r\n\r\nconst { productAttributeStatistics, getListingGroupConditions, updateListingTree } = useAPIsOfListingGroup();\r\nconst commonEntityPath = {\r\n accountId: scope.values.aid,\r\n campaignId: scope.values.campaignId || currentCampaign.Id,\r\n customerId: scope.values.cid,\r\n assetGroupId: scope.values.assetGroupId\r\n};\r\nconst dataRange = useDateRange();\r\nconst logger = useLogger();\r\n// #region TreeView\r\nconst [expandedItemIds, setExpandedItemIds] = useState(new Set());\r\nconst [isTreeViewSelectorOpen, setIsTreeViewSelectorOpen] = useState(false);\r\n\r\nconst [treeViewSelectorDimensions, setTreeViewSelectorDimensions] = useState[]>([]);\r\nconst [treeViewSelectorHeaderText, setTreeViewSelectorHeaderText] = useState('');\r\nconst [treeViewSelectorInitialSelectedItems, setTreeViewSelectorInitialSelectedItems] = useState([]);\r\nconst [treeViewSelectorItems, setTreeViewSelectorItems] = useState([]);\r\nconst [treeViewSelectorColumns, setTreeViewSelectorColumns] = useState([]);\r\nconst [isTreeViewShimmerEnabled, setIsTreeViewShimmerEnabled] = useState(false);\r\nconst serverContext = useContext(ServerContext);\r\nconst { getAccount } = useAccountData({ scope });\r\nfunction onTreeViewCancel() {\r\n setIsTreeViewSelectorOpen(false);\r\n logger.signal('Cancel button is clicked in tree view selector');\r\n}\r\n\r\nconst ADD_ONCE_LIMIT = 5_000;\r\nconst ADD_ONCE_LIMIT_STRING = \"5,000\";\r\nconst ALL_LIMIT = 20_000;\r\nconst ALL_LIMIT_STRING = \"20,000\";\r\nconst getErrorsForTreeViewSelector: PanelSelectorProps[\"getErrors\"] = (items: WithBulk[], selectedDimension: IDropdownOption) => {\r\n assertIsDefined(currentEditTreeItem.current);\r\n assertIsDefined(allRowRawData);\r\n items.forEach(selectedItem => {\r\n fillDataToBulkAddedItem(selectedItem);\r\n });\r\n const { addedItems, deleteItemIds } = getAddAndDeleteItem(selectedDimension, items, currentEditTreeItem.current);\r\n const totalItemsCount = allRowRawData.length;\r\n const errors: string[] = [];\r\n if (addedItems.length + deleteItemIds.length > ADD_ONCE_LIMIT) {\r\n errors.push(i18n.getString(_TL_(\"Number of updated values should not exceed {{number}}.\"), { number: ADD_ONCE_LIMIT_STRING }));\r\n }\r\n if (totalItemsCount + addedItems.length - deleteItemIds.length > ALL_LIMIT) {\r\n errors.push(i18n.getString(_TL_(\"Change exceeds maximum allowed number of {{number}} Products in a single Asset Group.\"), { number: ALL_LIMIT_STRING }));\r\n }\r\n return errors;\r\n}\r\n\r\nconst onGenericError = useCallback(() => {\r\n const alertHelper = new AlertHelper({ i18n });\r\n alertHelper.showError(i18n.getString(_TL_('We\\'ve encountered an error and can\\'t continue. Please contact support for further assistance.')));\r\n}, [i18n]);\r\n\r\nconst showOfferLimitExceededError = useCallback(() => {\r\n const warning = offerLimitExceededWarningForListingGroup(i18n);\r\n const alertHelper = new AlertHelper({ i18n });\r\n alertHelper.showWarning(warning);\r\n}, [i18n, scope]);\r\n\r\nconst onTreeViewSave: PanelSelectorProps[\"onSave\"] = async (selectedItems: WithBulk[], selectedDimension) => {\r\n logger.signal('Save button is clicked in tree view selector');\r\n assertIsDefined(currentEditTreeItem.current);\r\n assertIsDefined(scope.values.assetGroupId);\r\n assertIsDefined(scope.values.campaignId);\r\n selectedItems.forEach(selectedItem => {\r\n fillDataToBulkAddedItem(selectedItem);\r\n });\r\n await treeViewSaveWorker({\r\n selectedItems,\r\n selectedDimension,\r\n treeItem: currentEditTreeItem.current,\r\n assetGroupId: scope.values.assetGroupId,\r\n campaignId: scope.values.campaignId,\r\n callbackWhenSkipUpdate: () => {\r\n setIsTreeViewSelectorOpen(false);\r\n },\r\n callbackWhenUpdate: async (listingGroupsToAdd, listingGroupsToDelete) => {\r\n setIsTreeViewSelectorOpen(false);\r\n // change to loading state before sending update hotel listing tree API\r\n setAllRowRawData(undefined);\r\n\r\n await updateListingTree({\r\n ListingGroupsToAdd: listingGroupsToAdd,\r\n ListingGroupsToDelete: listingGroupsToDelete,\r\n AssetGroupId: scope.values.assetGroupId\r\n });\r\n\r\n await refreshGridData(getArguemntsOfUpdateGridDataByCurrentState());\r\n }\r\n });\r\n}\r\n\r\n// When updating tree view for Loactions, the 'Attribute' should be LocationID, but they are translated text when getting ListingGroup GridData.\r\n// Tricky thing:\r\n// If we want to add leaves under \"Country\", we also need to change the parent node(whose Operand is \"Country\") from \"leaf\" to \"non-leaf\" by deleting it and creating a new one.\r\n// However, we do not know the LocationID of the parent node. So we have to send another request to get the mapping.\r\nconst currentSelectedDimensionGridDataTask = useRef>();\r\n\r\nconst productAttributeStatisticsHelper = async (productListingGroupId: number, operand: string) => {\r\n return productAttributeStatistics({\r\n entityPath: {\r\n ...commonEntityPath,\r\n assetGroupId: scope.values.assetGroupId,\r\n productListingGroupId,\r\n },\r\n payload: {\r\n gridDataParameters: {\r\n DateRange: {\r\n StartDate: dataRange.StartDate,\r\n EndDate: dataRange.EndDate,\r\n }\r\n },\r\n operand,\r\n },\r\n queryOptions: {\r\n $top: 10000\r\n },\r\n })\r\n}\r\n\r\nasync function updateTreeViewGridByEditTreeItemAndSelectedDimension(treeItem: WithTreeViewData, selectedDimension: Model$ListingCondition) {\r\n assertIsDefined(selectedDimension?.Operand);\r\n setTreeViewSelectorColumns(buildTreeViewSelectorColumns(selectedDimension.Operand, selectedDimension.Operand, i18n, true));\r\n\r\n const task = productAttributeStatisticsHelper(treeItem.Id, selectedDimension.Operand);\r\n currentSelectedDimensionGridDataTask.current = task;\r\n const productAttrubuteStatisticsResponse = await task;\r\n const selectedDimensionGridData = productAttrubuteStatisticsResponse.value;\r\n\r\n const offerLimitExceeded = productAttrubuteStatisticsResponse.headers.get('Offerlimitexceeded');\r\n\r\n if (offerLimitExceeded === 'true') {\r\n showOfferLimitExceededError();\r\n }\r\n\r\n setTreeViewSelectorItems(buildTreeViewSelectorItems(\r\n selectedDimension,\r\n selectedDimensionGridData,\r\n treeItem.treeViewInfo.children));\r\n}\r\n\r\n\r\nfunction updateTreeViewGridByEditTreeItemAndSelectedDimensionWithoutStatistics(treeItem: WithTreeViewData, selectedDimension: Model$ListingCondition) {\r\n assertIsDefined(selectedDimension?.Operand);\r\n setTreeViewSelectorColumns(buildTreeViewSelectorColumns(selectedDimension.Operand, selectedDimension.Operand, i18n, false));\r\n setTreeViewSelectorItems(buildTreeViewSelectorItemsWithoutStatistics(selectedDimension));\r\n}\r\n\r\nasync function onTreeViewSelectedDimensionChange(event: React.FormEvent, option?: IDropdownOption, index?: number) {\r\n logger.signal('Change to another dimension in tree view selector');\r\n assertIsDefined(option);\r\n assertIsDefined(currentEditTreeItem.current);\r\n\r\n setIsTreeViewShimmerEnabled(true);\r\n\r\n const selectedDimension = currentValidListingConditions.current\r\n .find(c => c.Id === option.key);\r\n assertIsDefined(selectedDimension);\r\n\r\n await updateTreeViewGridByEditTreeItemAndSelectedDimension(currentEditTreeItem.current, selectedDimension);\r\n\r\n setIsTreeViewShimmerEnabled(false);\r\n}\r\n\r\nfunction onTreeViewSelectedDimensionChangeWithoutStatistics(event: React.FormEvent, option?: IDropdownOption, index?: number) {\r\n logger.signal('Change to another dimension in tree view selector');\r\n assertIsDefined(option);\r\n assertIsDefined(currentEditTreeItem.current);\r\n\r\n const selectedDimension = currentValidListingConditions.current\r\n .find(c => c.Id === option.key);\r\n assertIsDefined(selectedDimension);\r\n\r\n updateTreeViewGridByEditTreeItemAndSelectedDimensionWithoutStatistics(currentEditTreeItem.current, selectedDimension);\r\n}\r\n\r\n// this data should be shared in different callbacks for one opened data\r\n// use `Ref` rather than `State`, for this is useless for render\r\nconst currentValidListingConditions = useRef([]);\r\n// a quick and dirty way to share editing item\r\nconst currentEditTreeItem = useRef>();\r\n\r\nfunction getInitialSelectedDimension(item: WithTreeViewData, dimensions: Model$ListingCondition[]) {\r\n const DimensionProperties = [\r\n 'Category', 'CategoryL1', 'CategoryL2', 'CategoryL3', 'CategoryL4', 'CategoryL5', 'Condition',\r\n ];\r\n let selectedDimensionName = '';\r\n\r\n if (item.treeViewInfo.children.length) {\r\n assertIsDefined(item.treeViewInfo.children[0].Condition?.Operand);\r\n selectedDimensionName = item.treeViewInfo.children[0].Condition.Operand;\r\n } else {\r\n const operands = dimensions.map(diemnsion => diemnsion.Operand);\r\n const findResult = DimensionProperties.find(dimension => operands.includes(dimension)) || operands[0];\r\n assertIsDefined(findResult);\r\n selectedDimensionName = findResult;\r\n }\r\n\r\n const result = dimensions.find(dimension => dimension.Operand === selectedDimensionName);\r\n assertIsDefined(result);\r\n return result;\r\n}\r\n\r\nasync function getSupportedCountries() {\r\n const isOdataGetProductScopeEnabled = _.get(serverContext, ['DynamicPermissions', 'OdataGetProductScope'], false);\r\n const callStartTime = Date.now();\r\n const pData = isOdataGetProductScopeEnabled ?\r\n await getProductScopeFromOData(serverContext) :\r\n await getProductData({\r\n cid: scope.values.cid,\r\n aid: scope.values.aid,\r\n uid: scope.values.uid,\r\n });\r\n\r\n if (isOdataGetProductScopeEnabled) {\r\n logger.signal(`[PmaxListingGroup][OdataGetProductScopeForPmax] GetProductDataCallTime: ${Date.now() - callStartTime}`);\r\n } else {\r\n logger.signal(`[PmaxListingGroup] GetProductDataCallTime: ${Date.now() - callStartTime}`);\r\n }\r\n\r\n let data = pData;\r\n\r\n if (isOdataGetProductScopeEnabled && _.isArray(data)) {\r\n data = mergeData(pData);\r\n }\r\n\r\n const {\r\n SalesCountryCollection,\r\n } = data;\r\n if (!SalesCountryCollection) {\r\n return new Set();\r\n }\r\n return new Set(SalesCountryCollection.map(({ Value }) => Value.toUpperCase()));\r\n}\r\n\r\n// When FeedLabel is set then SalesCountry is empty, use supported account country, otherwise US\r\nasync function getCountryCode(shoppingSettings: any) {\r\n let countryCode = shoppingSettings?.SalesCountry;\r\n\r\n if (!countryCode) {\r\n const account = await getAccount();\r\n if (account && account.CountryCode) {\r\n const accountCountry = account.CountryCode;\r\n\r\n const supportedCountries = await getSupportedCountries();\r\n const ifAccountryCountrySupported = supportedCountries?.has(accountCountry);\r\n if (ifAccountryCountrySupported) {\r\n countryCode = accountCountry;\r\n }\r\n }\r\n }\r\n return countryCode || DEFAULT_SALES_COUNTRY;\r\n}\r\n\r\nconst onTreeViewColumnAddOrEdit: TreeViewEventHandler = async (item) => {\r\n assertIsDefined(item);\r\n currentEditTreeItem.current = item;\r\n\r\n setIsTreeViewSelectorOpen(true);\r\n setIsTreeViewShimmerEnabled(true);\r\n setTreeViewSelectorHeaderText(getAttributeTextOfConditionTemplate(i18n, item));\r\n const shoppingSettings = currentCampaign?.CampaignSettings?.find(setting => setting['@odata.type'] === '#Model.ShoppingSettings');\r\n let countryCode = await getCountryCode(shoppingSettings);\r\n try {\r\n const getListingGroupConditionsResponseBody = await getListingGroupConditions({\r\n entityPath: commonEntityPath,\r\n queryOptions: {\r\n countryCode,\r\n },\r\n });\r\n assertIsDefined(item.ParentConditions);\r\n assertIsDefined(item.Condition);\r\n let validListingConditions = getValidListingConditions(\r\n getListingGroupConditionsResponseBody,\r\n [...item.ParentConditions, item.Condition],\r\n item);\r\n currentValidListingConditions.current = validListingConditions;\r\n\r\n const dimensionsOfItem = validListingConditions;\r\n const selectedDimension = getInitialSelectedDimension(item, dimensionsOfItem);\r\n const currentDimension = getListingGroupConditionsResponseBody.value.find(dimension => dimension.Operand === item.Condition?.Operand);\r\n const currentAttributeId = currentDimension?.DomainData?.find(domainData => domainData.Value === item.Condition?.Attribute)?.Id;\r\n selectedDimension.DomainData = selectedDimension.DomainData?.filter(domainData => (!currentAttributeId && domainData.ParentId === 0) || domainData.ParentId === currentAttributeId);\r\n\r\n setTreeViewSelectorInitialSelectedItems(buildTreeViewSelectorItemsByChildrenOfNode(selectedDimension, item.treeViewInfo.children));\r\n\r\n setTreeViewSelectorDimensions(dimensionsOfItem.map(dimension => {\r\n return {\r\n key: dimension.Id,\r\n text: i18n.getString(`ProductsGrid_Column_${dimension.Operand}`),\r\n selected: selectedDimension.Id === dimension.Id,\r\n data: {\r\n isBulkAddEnabled: !dimension.HasDomainData,\r\n operand: dimension.Operand,\r\n }\r\n }\r\n }));\r\n\r\n await updateTreeViewGridByEditTreeItemAndSelectedDimension(item, selectedDimension);\r\n } catch (e) {\r\n setIsTreeViewSelectorOpen(false);\r\n onGenericError();\r\n console.error(e);\r\n }\r\n setIsTreeViewShimmerEnabled(false);\r\n}\r\n\r\nconst onFilterProduct: TreeViewEventHandler = async () => {\r\n setIsTreeViewSelectorOpen(true);\r\n setIsTreeViewShimmerEnabled(true);\r\n setTreeViewSelectorHeaderText(i18n.getString(_TL_('All Products')));\r\n const shoppingSettings = currentCampaign?.CampaignSettings[0];\r\n const countryCode = await getCountryCode(shoppingSettings);\r\n const getListingGroupConditionsResponseBody = await getListingGroupConditions({\r\n entityPath: commonEntityPath,\r\n queryOptions: {\r\n countryCode,\r\n },\r\n });\r\n\r\n const validListingConditions = getValidListingConditionsForWithoutPreselectedTreeNode(\r\n getListingGroupConditionsResponseBody,\r\n [{\r\n Attribute: '',\r\n Operand: 'All',\r\n }]);\r\n currentValidListingConditions.current = validListingConditions;\r\n\r\n const dimensionsOfItem = validListingConditions;\r\n const selectedDimension = dimensionsOfItem[0];\r\n\r\n setTreeViewSelectorDimensions(dimensionsOfItem.map(dimension => {\r\n return {\r\n key: dimension.Id,\r\n text: i18n.getString(`ProductsGrid_Column_${dimension.Operand}`),\r\n selected: selectedDimension.Id === dimension.Id,\r\n data: {\r\n isBulkAddEnabled: !dimension.HasDomainData,\r\n operand: dimension.Operand,\r\n }\r\n }\r\n }));\r\n\r\n updateTreeViewGridByEditTreeItemAndSelectedDimensionWithoutStatistics({\r\n Id: 4578228980083101,\r\n treeViewInfo: {\r\n children: [],\r\n depth: 1,\r\n hasChildren: false,\r\n isExpanded: false,\r\n parent: undefined,\r\n },\r\n serverContext: undefined,\r\n scope,\r\n eventHandlers: {\r\n onTreeViewColumnAddOrEdit: undefined,\r\n onTreeViewColumnToggleCollapse: undefined\r\n },\r\n refreshGridData: _.identity,\r\n IsLeaf: false,\r\n IsExcluded: false,\r\n CampaignId: currentCampaign.Id,\r\n i18n: i18n\r\n }, selectedDimension);\r\n\r\n setIsTreeViewShimmerEnabled(false);\r\n}\r\n// #endregion TreeView\r\n return {\r\n expandedItemIds,\r\n setExpandedItemIds,\r\n isTreeViewSelectorOpen,\r\n setIsTreeViewSelectorOpen,\r\n treeViewSelectorColumns,\r\n treeViewSelectorDimensions,\r\n treeViewSelectorInitialSelectedItems,\r\n treeViewSelectorItems,\r\n treeViewSelectorHeaderText,\r\n onTreeViewCancel,\r\n onTreeViewSave,\r\n onTreeViewSelectedDimensionChange,\r\n onTreeViewSelectedDimensionChangeWithoutStatistics,\r\n isTreeViewShimmerEnabled,\r\n getErrorsForTreeViewSelector,\r\n onTreeViewColumnAddOrEdit,\r\n onFilterProduct,\r\n };\r\n};\r\n","import { useJsDataContext } from '@bingads-webui-cc-react/js-data-rest';\r\n\r\nexport const useAccountData = ({\r\n scope,\r\n}) => {\r\n const ccJsData = useJsDataContext();\r\n\r\n return {\r\n getAccount: () => ccJsData.Account.find(scope.values.aid),\r\n };\r\n};\r\n","import { queryify } from '@bingads-webui/url-util';\r\nimport { withDFMCache } from '@bingads-webui/dfm-cache';\r\nimport jsdata from '@bingads-webui-component-legacy/js-data-campaign/index';\r\nimport { getProductScopeData } from '@bingads-webui-campaign-react/product-services';\r\n\r\nexport function getProductData({\r\n cid,\r\n aid,\r\n uid,\r\n}) {\r\n const url = queryify('/Campaign/NewCampaign/GetProductScope', {\r\n cid,\r\n aid,\r\n uid,\r\n });\r\n\r\n return jsdata.Product.find('MetaData', {\r\n url,\r\n adapter: 'legacy',\r\n bypassCache: false,\r\n cacheResponse: true,\r\n });\r\n}\r\n\r\nexport const getProductScopeFromOData = (serverContext) => {\r\n const options = {\r\n dataName: 'MetaData',\r\n bypassCache: false,\r\n cacheResponse: true,\r\n getSalesCountryCollection: true,\r\n noBMCAccounts: true,\r\n };\r\n\r\n const p$GetProductData = () => getProductScopeData(null, serverContext, options);\r\n const getProductDataWithCache = withDFMCache(p$GetProductData, 'getPmaxProductScopeDFM', {}, false);\r\n\r\n return getProductDataWithCache();\r\n};\r\n","import { Model$ListingGroup } from './ApiType';\r\n\r\nexport const isEveryThingElseRow = (item: Model$ListingGroup) =>\r\n !!(item && item.Condition && !item.Condition.Attribute && item.Condition.Operand);\r\n","/* eslint-disable */\r\nimport React, { useMemo, useContext, useState, useRef, useEffect } from 'react';\r\nimport { compose, contains } from 'underscore';\r\nimport classNames from 'classnames';\r\nimport { withDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { mergeI18n } from '@bingads-webui-campaign-react/i18n-merger';\r\nimport { ServerContext } from '@bingads-webui-campaign-react/server-context';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { buildLegacyI18n } from '@bingads-webui/build-legacy-i18n';\r\nimport { FilterService } from '@bingads-webui/filter-service';\r\nimport { ToolbarContainer } from '@bingads-webui-campaign-react/toolbar-container';\r\nimport { useConstructor } from '@bingads-webui-campaign/hooks';\r\nimport { I18nContext, withI18nConsumer } from '@bingads-webui-react/i18n-context';\r\nimport { assertIsDefined, assertNever } from '@bingads-webui-campaign-react/debug-assert';\r\nimport { legacyKeys } from '@bingads-webui-campaign-react/hotel-campaign-shared';\r\nimport { getToolbarEditor } from '@bingads-webui-campaign-react/toolbar-plugin';\r\nimport { CampaignShimmeredDetailsList } from '@bingads-webui-grid/campaign-details-list';\r\nimport { useColumnsWithToolbarColumnChooser } from '@bingads-webui-campaign/hotel-column-chooser';\r\nimport { IColumn, CheckboxVisibility } from '@fluentui/react';\r\nimport { useForceUpdate } from '@fluentui/react-hooks';\r\nimport { buildTreeViewItems, I18n } from '@bingads-webui-grid/well-known';\r\nimport { SelectionMode } from '@bingads-webui-react/fabric-control';\r\nimport { useDateRange } from '@bingads-webui-campaign-react/wizard-shared-components';\r\nimport { DisclaimerBanner } from '@bingads-webui-campaign-react/help';\r\n\r\nimport { PanelSelector } from './treeViewPanelSelector/PanelSelector';\r\nimport { getColumnChooserCategories } from './render/toolbar/ColumnChooser';\r\nimport { convertFilterEntity2$filter } from './legacy-adapter/filter-entity';\r\nimport { legacyI18nOfListingGroup } from './legacyI18nMap';\r\nimport { Model$ListingGroup } from './ApiType';\r\nimport { OdataSystemQueryOptions } from './API/odata';\r\nimport { useAPIsOfListingGroup } from './API';\r\nimport { styles } from './style';\r\nimport { getGridToolbarConfig } from './toolbarConfig';\r\nimport { GridType, GRID_NAME, ScopeLevel, nameColumnOdataPath, LISTING_GROUP_PERF_MARKER,\r\n LISTING_GROUP_LIST_ROUTING, LISTING_GROUP_TREE_ROUTING, treeViewButtonId, listViewButtonId } from './constant';\r\n import { ListingGroupGridItemData } from './interface';\r\nimport { getFilterConfig } from './filter-config';\r\nimport { columnKeyRawDataMap, odataMapOfListingGroupResponse, cpsColumnKeys } from './ColumnOdataMap';\r\nimport { AssetGroupNameColumn, ListingGroupColumn, IncludeExcludeColumn } from './rawColumns';\r\nimport { getColumnRenderByColumnKey } from './render';\r\nimport { isSortEnabledByColumnKey } from './render/sortByHelper';\r\nimport { useLogger } from './logger';\r\nimport { useTreeViewPanelSelector } from './useTreeViewPanelSelector';\r\nimport { isEveryThingElseRow, } from './utils';\r\nimport { getPropertyByPath } from './render/utils';\r\n\r\n/**\r\n * default value used in fluent-ui\r\n * reference https://github.com/microsoft/fluentui/blob/31345de30d356731eeb0ac1e658a2652f8f00aa7/packages/react/src/components/DetailsList/DetailsList.base.tsx\r\n */\r\nconst MIN_COLUMN_WIDTH = 120;\r\nconst FIRST_COLUMN_WIDTH = 40;\r\n\r\ninterface ListingGroupsPageProps {\r\n preferenceService: any;\r\n permissions: any;\r\n gridType: GridType;\r\n scope: { save: Function, values: any };\r\n perfMarker: any;\r\n currentCampaign: any;\r\n}\r\n\r\ninterface BuildItemDataOptions {\r\n rawData: Model$ListingGroup[] | undefined;\r\n gridType: GridType;\r\n serverContext: any;\r\n scope: any;\r\n i18n: I18n;\r\n expandedItemIds: Set;\r\n}\r\n\r\ninterface RefreshGridDataOptions {\r\n gridType?: GridType;\r\n $top: OdataSystemQueryOptions['$top'];\r\n $skip: OdataSystemQueryOptions['$skip'];\r\n $orderby?: OdataSystemQueryOptions['$orderby'];\r\n $select?: OdataSystemQueryOptions['$select'];\r\n $filter?: OdataSystemQueryOptions['$filter'];\r\n}\r\n\r\ntype SortOrder = 'asc' | 'desc';\r\n\r\nenum ToolbarShownItem {\r\n Toolbar,\r\n Download,\r\n ColumnChooser,\r\n FilterView,\r\n BidEditor,\r\n}\r\n\r\nenum InitializationState {\r\n NotStart,\r\n Running,\r\n Done,\r\n}\r\nconst defaultPageIndex = 1;\r\nconst defaultPageSize = 20;\r\nconst maxPageSize = 20000;\r\nconst metaColumnOdataPaths: string[] = [\r\n 'AssetGroupId',\r\n 'AssetGroupName',\r\n 'Condition',\r\n 'Id',\r\n 'IsLeaf',\r\n 'ParentConditions',\r\n 'ParentId',\r\n];\r\n\r\nfunction buildColumns(gridType: GridType, selectedColumnKeys: string[], sortOrder: SortOrder, i18n: I18n, permissions: any): IColumn[] {\r\n const bindSortFunction = permissions?.dynamic?.ListingGroupsAllColumnsSortSupport ? bindSortSupportAll : bindSort;\r\n\r\n const result = selectedColumnKeys\r\n .filter(filterByPermissions)\r\n .map(buildColumnBase)\r\n .map(bindOnRender)\r\n .map(bindSortFunction);\r\n\r\n return result;\r\n\r\n function filterByPermissions(columnKey: string): boolean {\r\n const cpsColumnsEnabled = permissions && permissions.dynamic && permissions.dynamic.SupportCPSForPmax;\r\n\r\n if (!cpsColumnsEnabled) {\r\n return !contains(cpsColumnKeys, columnKey);\r\n }\r\n return true\r\n }\r\n\r\n function buildColumnBase(columnKey: string, index: number): IColumn {\r\n const columnRawData = columnKeyRawDataMap[columnKey];\r\n assertIsDefined(columnRawData, 'Column is not defined in listing groups column raw data map');\r\n const column = {\r\n key: columnKey,\r\n className: columnKey,\r\n minWidth: index !== 0 ? MIN_COLUMN_WIDTH : FIRST_COLUMN_WIDTH,\r\n maxWidth: index !== 0 ? 300 : FIRST_COLUMN_WIDTH,\r\n isResizable: index !== 0,\r\n name: i18n.getString(columnRawData.name),\r\n fieldName: columnKey,\r\n onRenderHeader: index !== 0 ? undefined : () => (
),\r\n };\r\n return column;\r\n }\r\n\r\n function bindOnRender(column: IColumn, index: number): IColumn {\r\n column.onRender = getColumnRenderByColumnKey(column.key);\r\n return column;\r\n }\r\n\r\n function bindSort(column: IColumn): IColumn {\r\n const enhancedColumn = {\r\n ...column,\r\n sortable: isSortEnabledByColumnKey(column.key),\r\n isSortedDescending: sortOrder === 'desc',\r\n };\r\n return enhancedColumn;\r\n }\r\n\r\n function bindSortSupportAll(column: IColumn): IColumn {\r\n const enhancedColumn = {\r\n ...column,\r\n sortable: true,\r\n isSortedDescending: sortOrder === 'desc',\r\n };\r\n return enhancedColumn;\r\n }\r\n}\r\n\r\nconst ListingGroupsPage = (props: ListingGroupsPageProps) => {\r\n const {\r\n preferenceService, permissions, gridType, scope, perfMarker, currentCampaign\r\n } = props;\r\n\r\n const [listingGroupPerfMarker] = useConstructor(() => {\r\n const marker = perfMarker.createChild(LISTING_GROUP_PERF_MARKER);\r\n marker.willInit();\r\n return marker;\r\n });\r\n const defaultColumns = [IncludeExcludeColumn.key, ListingGroupColumn.key, AssetGroupNameColumn.key];\r\n\r\n const [allRowRawData, setAllRowRawData] = useState(undefined);\r\n const serverContext: any = useContext(ServerContext);\r\n\r\n const logger = useLogger();\r\n const i18nWithTL = (useContext(I18nContext) as I18n);\r\n const i18n = useMemo(() => mergeI18n(\r\n buildLegacyI18n(i18nWithTL, [...legacyKeys, legacyI18nOfListingGroup]),\r\n i18nWithTL\r\n ), [i18nWithTL]);\r\n\r\n const scopeLevel = (() => {\r\n if (!scope.values.assetGroupId) {\r\n return ScopeLevel.Campaign;\r\n }\r\n return ScopeLevel.AssetGroup;\r\n })();\r\n\r\n const { toolbarSelectedConfig, toolbarUnselectedConfig } = useMemo(() => getGridToolbarConfig({\r\n scopeLevel,\r\n i18n,\r\n onBidChangeClick: () => {},\r\n permissions: {},\r\n selectedItems: [],\r\n serverContext: {},\r\n }), [i18n, scopeLevel]);\r\n const [toolbarShownItem, setToolbarShownItem] = useState(ToolbarShownItem.Toolbar);\r\n const latestGridDataRequestId = useRef(0);\r\n const styleClassNames: any = useDefaultStyles(styles);\r\n\r\n const toolbarEditor = getToolbarEditor({\r\n toolbarConfig: {\r\n toolbarSelectedConfig,\r\n toolbarUnselectedConfig,\r\n },\r\n updateToolbar: undefined,\r\n overrideWith: undefined,\r\n });\r\n\r\n const filterConfig = useMemo(() => getFilterConfig({ preferenceService, i18n }), [preferenceService, i18n]);\r\n\r\n const filterService = useMemo(() => {\r\n const filterService = new FilterService(filterConfig);\r\n return filterService;\r\n }, [filterConfig]);\r\n const [pageIndex, setPageIndex] = useState(defaultPageIndex);\r\n const [pageSize, setPageSize] = useState(defaultPageSize);\r\n const [sortColumnOdataPath, setSortColumnOdataPath] = useState(nameColumnOdataPath);\r\n const [sortOrder, setSortOrder] = useState('asc');\r\n\r\n const [pageItemsTotal, setPageItemsTotal] = useState(0);\r\n const availablePageSizes = [20, 50, 100, 200];\r\n\r\n const {\r\n expandedItemIds,\r\n setExpandedItemIds,\r\n isTreeViewSelectorOpen,\r\n treeViewSelectorColumns,\r\n treeViewSelectorDimensions,\r\n treeViewSelectorInitialSelectedItems,\r\n treeViewSelectorItems,\r\n treeViewSelectorHeaderText,\r\n onTreeViewCancel,\r\n onTreeViewSave,\r\n onTreeViewSelectedDimensionChange,\r\n isTreeViewShimmerEnabled,\r\n getErrorsForTreeViewSelector,\r\n onTreeViewColumnAddOrEdit,\r\n } = useTreeViewPanelSelector({\r\n i18n, allRowRawData, setAllRowRawData, scope, currentCampaign,\r\n refreshGridData,getArguemntsOfUpdateGridDataByCurrentState\r\n });\r\n\r\n const pager = {\r\n pageNumber: pageIndex,\r\n total: pageItemsTotal,\r\n pageSize,\r\n availablePageSizes,\r\n onPageChange,\r\n onPageSizeChange,\r\n };\r\n\r\n function onPageChange(newPageIndex) {\r\n logger.signal('Page index is changed');\r\n setPageIndex(newPageIndex);\r\n refreshGridData({\r\n ...getArguemntsOfUpdateGridDataByCurrentState(),\r\n ...getOdataSkipAndTop(newPageIndex, pageSize),\r\n });\r\n }\r\n\r\n function onPageSizeChange(newPageSize) {\r\n logger.signal('Page size is changed');\r\n setPageSize(newPageSize);\r\n refreshGridData({\r\n ...getArguemntsOfUpdateGridDataByCurrentState(),\r\n ...getOdataSkipAndTop(pageIndex, newPageSize),\r\n });\r\n }\r\n\r\n function changeToListView() {\r\n scope.save(LISTING_GROUP_LIST_ROUTING);\r\n // setCurrentGridType(GridType.List);\r\n changeActiveViewButton(GridType.List);\r\n logger.signal('change to list view');\r\n }\r\n\r\n function changeToTreeView() {\r\n scope.save(LISTING_GROUP_TREE_ROUTING);\r\n // setCurrentGridType(GridType.Tree);\r\n changeActiveViewButton(GridType.Tree);\r\n logger.signal('change to tree view');\r\n }\r\n\r\n function changeActiveViewButton(gridType: GridType) {\r\n toolbarEditor.update({\r\n id: treeViewButtonId,\r\n classes: ['view-switch-button', gridType === GridType.Tree ? 'btn-primary' : '', gridType === GridType.Tree ? 'active' : 'inactive'],\r\n ariaLabel: gridType === GridType.Tree ? i18n.getString(_TL_('Switch to hierarchy view, selected')) : i18n.getString(_TL_('Switch to hierarchy view, unselected')),\r\n });\r\n toolbarEditor.update({\r\n id: listViewButtonId,\r\n classes: ['view-switch-button', gridType === GridType.List ? 'btn-primary' : '', gridType === GridType.List ? 'active' : 'inactive'],\r\n ariaLabel: gridType === GridType.List ? i18n.getString(_TL_('Switch to list view, selected')) : i18n.getString(_TL_('Switch to list view, unselected')),\r\n });\r\n }\r\n\r\n function buildItemData({\r\n gridType, rawData, i18n, serverContext, expandedItemIds, scope,\r\n }: BuildItemDataOptions): ListingGroupGridItemData[] | undefined {\r\n if (rawData === undefined) {\r\n return undefined;\r\n }\r\n const items = rawData.map(raw => ({\r\n ...raw,\r\n serverContext,\r\n i18n,\r\n scope,\r\n eventHandlers: {},\r\n refreshGridData: () => {\r\n logger.signal('Refresh grid from item');\r\n refreshGridData(getArguemntsOfUpdateGridDataByCurrentState())\r\n }\r\n }));\r\n // registerEventHandlersForInlineEidtor(items);\r\n if (gridType === GridType.Tree) {\r\n const listingGroupGridItemsData = buildTreeViewItems({\r\n expandedItemIds,\r\n getParentKeyOfItem: item => item.ParentId,\r\n getPrimaryKeyOfItem: item => item.Id,\r\n items,\r\n });\r\n registerEventHandlersForTreeView(listingGroupGridItemsData);\r\n return listingGroupGridItemsData;\r\n }\r\n return items;\r\n }\r\n\r\n function registerEventHandlersForTreeView(items: ListingGroupGridItemData[]) {\r\n items.forEach(item => {\r\n item.eventHandlers.onTreeViewColumnAddOrEdit = onTreeViewColumnAddOrEdit;\r\n\r\n item.eventHandlers.onTreeViewColumnToggleCollapse = (item) => {\r\n assertIsDefined(item?.treeViewInfo);\r\n const id = item.Id;\r\n if (item.treeViewInfo.isExpanded)\r\n expandedItemIds.delete(id);\r\n else\r\n expandedItemIds.add(id);\r\n setExpandedItemIds(new Set(expandedItemIds));\r\n }\r\n });\r\n }\r\n\r\n function getSortedColumn() {\r\n const sortColumn = columns.find(c =>\r\n odataMapOfListingGroupResponse.get(c.key) === sortColumnOdataPath);\r\n assertIsDefined(sortColumn);\r\n return sortColumn;\r\n }\r\n\r\n const { listingGroupGridData, createRootListingTree } = useAPIsOfListingGroup();\r\n const {\r\n isOrderByEnabled,\r\n isSelectEnabled,\r\n isFilterEnabled,\r\n } = scope.values;\r\n const commonEntityPath = {\r\n accountId: scope.values.aid,\r\n campaignId: scope.values.campaignId,\r\n customerId: scope.values.cid,\r\n assetGroupId: scope.values.assetGroupId\r\n };\r\n const dataRange = useDateRange();\r\n const dataRangeCacheKey = `${dataRange.StartDate}-${dataRange.EndDate}`;\r\n\r\n function onColumnChooserApply(newColumnKeys: string[]) {\r\n // change to loading state\r\n // columns might update faster than items, in this case it will try to get value that is not existed yet.\r\n setAllRowRawData(undefined);\r\n setToolbarShownItem(ToolbarShownItem.Toolbar);\r\n // logger.signal('choose new columns');\r\n }\r\n\r\n function onColumnChooserCancel() {\r\n setToolbarShownItem(ToolbarShownItem.Toolbar);\r\n // logger.signal('cancel column chooser');\r\n }\r\n function getOdataOrderby(sortColumnOdataPath: string, sortOrder: SortOrder) {\r\n return {\r\n $orderby: isOrderByEnabled !== 'false' ? `${sortColumnOdataPath} ${sortOrder}` : undefined,\r\n };\r\n }\r\n function getOdataSkipAndTop(pageIndex, pageSize) {\r\n return {\r\n $skip: (pageIndex - 1) * pageSize,\r\n $top: pageSize,\r\n };\r\n }\r\n function getOdataSelect(selectedColumnKeys: string[]) {\r\n if (isSelectEnabled === 'false') {\r\n return {\r\n $select: undefined,\r\n };\r\n }\r\n const selectedColumnOdataPaths = selectedColumnKeys.map((selectedColumnKey) => {\r\n const columnOdataPath = odataMapOfListingGroupResponse.get(selectedColumnKey);\r\n assertIsDefined(columnOdataPath);\r\n return columnOdataPath;\r\n });\r\n\r\n return {\r\n $select: selectedColumnOdataPaths.concat(metaColumnOdataPaths).join(','),\r\n };\r\n }\r\n\r\n function getOdataFilter() {\r\n return {\r\n $filter: isFilterEnabled !== 'false' ? $filterContainer.current : undefined,\r\n };\r\n }\r\n\r\n function getArguemntsOfUpdateGridDataByCurrentState() {\r\n return {\r\n ...getOdataSkipAndTop(pageIndex, pageSize),\r\n ...getOdataOrderby(sortColumnOdataPath, sortOrder),\r\n ...getOdataSelect(trickySelectedColumnKeys),\r\n ...getOdataFilter(),\r\n gridType: currentGridType,\r\n };\r\n }\r\n\r\n async function refreshGridData({\r\n $top,\r\n $skip,\r\n $filter,\r\n $orderby = undefined,\r\n $select = undefined,\r\n gridType = currentGridType,\r\n }: RefreshGridDataOptions) {\r\n if (initializationState.current !== InitializationState.Done) {\r\n return;\r\n }\r\n // change to loading state\r\n setAllRowRawData(undefined);\r\n latestGridDataRequestId.current += 1;\r\n const requestId = latestGridDataRequestId.current;\r\n\r\n listingGroupPerfMarker.willFetchData();\r\n\r\n logger.signal(`listing group grid data request #${requestId}`);\r\n\r\n const response = await listingGroupGridData({\r\n queryOptions: {\r\n $top: gridType === GridType.Tree ? maxPageSize : $top,\r\n $skip,\r\n $filter,\r\n $orderby,\r\n $select,\r\n $count: true,\r\n },\r\n entityPath: commonEntityPath,\r\n payload: {\r\n gridDataParameters: {\r\n DateRange: {\r\n StartDate: dataRange.StartDate,\r\n EndDate: dataRange.EndDate,\r\n },\r\n },\r\n },\r\n });\r\n const gridData = response.value;\r\n\r\n if (requestId === latestGridDataRequestId.current) {\r\n listingGroupPerfMarker.willRender();\r\n setAllRowRawData(gridData);\r\n setPageItemsTotal(response['@odata.count']);\r\n }\r\n\r\n if (document.getElementsByClassName('ms-DetailsList-headerWrapper')) {\r\n const gridIndex = document.getElementsByClassName('ms-DetailsList-headerWrapper').length;\r\n document.getElementsByClassName('ms-DetailsList-headerWrapper')[gridIndex - 1].parentElement.setAttribute('aria-busy', 'true');\r\n }\r\n }\r\n\r\n async function initial() {\r\n initialColumns();\r\n }\r\n\r\n function onSort(column: IColumn) {\r\n logger.signal('Sort column or sort order is changed');\r\n const newSortOrder = column.isSortedDescending ? 'desc' : 'asc';\r\n const newSortColumnOdataPath = odataMapOfListingGroupResponse.get(column.key);\r\n assertIsDefined(newSortColumnOdataPath);\r\n setSortColumnOdataPath(newSortColumnOdataPath);\r\n setSortOrder(newSortOrder);\r\n if (currentGridType === GridType.List) {\r\n refreshGridData({\r\n ...getArguemntsOfUpdateGridDataByCurrentState(),\r\n ...getOdataOrderby(newSortColumnOdataPath, newSortOrder),\r\n });\r\n }\r\n }\r\n\r\n const resetToolbarVisibility = ({ forceHideToolbar }: { forceHideToolbar: boolean }) => {\r\n if (forceHideToolbar) {\r\n setToolbarShownItem(ToolbarShownItem.FilterView);\r\n } else {\r\n setToolbarShownItem(ToolbarShownItem.Toolbar);\r\n }\r\n };\r\n const forceUpdate = useForceUpdate();\r\n const currentGridType = gridType;\r\n const initializationState = useRef(InitializationState.NotStart);\r\n const onFilterStateChanged = useRef(() => { });\r\n // Filter is special, generally, it should be a state. However, we are using legacy component, and it's not fully controlled and kind of subtle.\r\n const $filterContainer = useRef('');\r\n\r\n const [isRefreshReady, setIsRefreshReady] = useState(false);\r\n\r\n // reregister the callback to make sure there is no closure issue so that we could get latest state.\r\n // And we could not remove other callbacks. For example, the toolbar component might add callback too.\r\n filterService.off('filter-state-changed', onFilterStateChanged.current);\r\n onFilterStateChanged.current = async () => {\r\n const filterEntity = filterService.getEditableFilter();\r\n const filterString = convertFilterEntity2$filter(filterEntity);\r\n $filterContainer.current = filterString;\r\n let gridType = currentGridType;\r\n\r\n switch (true) {\r\n // as long as there is filter, jump to list view.\r\n // TODO: add a test\r\n case filterString && currentGridType === GridType.Tree:\r\n changeToListView();\r\n gridType = GridType.List;\r\n // no filter --> some filter, not allow change to tree\r\n // some filter --> no filter, allow change to tree\r\n // TODO: add a test\r\n case currentGridType === GridType.List:\r\n // toolbarChangeOnFilterChange(filterString);\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n // tricky, initial here for we only want to send one request to get grid data after everything is initialized.\r\n // but filter is iniitialized by itself.\r\n switch (initializationState.current) {\r\n case InitializationState.NotStart:\r\n initializationState.current = InitializationState.Running;\r\n await initial();\r\n initializationState.current = InitializationState.Done;\r\n setIsRefreshReady(true);\r\n break;\r\n case InitializationState.Running:\r\n break;\r\n case InitializationState.Done:\r\n logger.signal('Refresh grid by filter change');\r\n refreshGridData({ ...getArguemntsOfUpdateGridDataByCurrentState(), gridType });\r\n forceUpdate();\r\n break;\r\n default:\r\n assertNever(initializationState.current);\r\n }\r\n };\r\n\r\n filterService.on('filter-state-changed', onFilterStateChanged.current);\r\n\r\n const {\r\n initialColumns,\r\n columns: selectedColumnKeys,\r\n ColumnChooserTrivia,\r\n ColumnChooser,\r\n } = useColumnsWithToolbarColumnChooser({\r\n defaultColumns,\r\n gridName: GRID_NAME,\r\n toolbarOptions: {\r\n toolbarEditor,\r\n openColumnChooser: () => { setToolbarShownItem(ToolbarShownItem.ColumnChooser); },\r\n },\r\n });\r\n const toolbarEditorUpdate = useMemo(() => toolbarEditor.update.bind(toolbarEditor), [toolbarEditor]);\r\n\r\n const toolbar = (\r\n \r\n {/* campaignContentContainer is for inline-chart. Read code of inline-chart for details :)\r\n
\r\n {inlineChart}\r\n
*/}\r\n {toolbarShownItem === ToolbarShownItem.ColumnChooser &&\r\n \r\n }\r\n \r\n
\r\n );\r\n\r\n let trickySelectedColumnKeys = selectedColumnKeys.filter(k => {\r\n return columnKeyRawDataMap[k]; // only when the key is existed in columnKeyRawDataMap, we keep it.\r\n });\r\n\r\n const listingGroupColumnIndex = trickySelectedColumnKeys.findIndex(k => k === ListingGroupColumn.key);\r\n trickySelectedColumnKeys = trickySelectedColumnKeys.filter(key => key !== AssetGroupNameColumn.key);\r\n if (scopeLevel === ScopeLevel.Campaign) {\r\n trickySelectedColumnKeys.splice(listingGroupColumnIndex + 1, 0, AssetGroupNameColumn.key);\r\n }\r\n\r\n const columns = buildColumns(GridType.List, trickySelectedColumnKeys, sortOrder, i18n, permissions);\r\n\r\n const filteredRowData = (() => {\r\n // when in grid type is tree, we sort the data in front-end\r\n if (currentGridType === GridType.Tree) {\r\n const sortedItems = allRowRawData?.slice()?.sort(compareFn);\r\n return sortOrder === \"desc\" ? sortedItems?.reverse() : sortedItems;\r\n }\r\n return allRowRawData;\r\n\r\n function compareFn(a: Model$ListingGroup, b: Model$ListingGroup) {\r\n if (sortColumnOdataPath === nameColumnOdataPath) {\r\n // direction: -1 for desc, 1 for asc\r\n if (isEveryThingElseRow(a)) {\r\n return 1;\r\n }\r\n\r\n if (isEveryThingElseRow(b)) {\r\n return -1;\r\n }\r\n }\r\n const valueA = getPropertyByPath(a, sortColumnOdataPath);\r\n\r\n const valueB = getPropertyByPath(b, sortColumnOdataPath);\r\n\r\n let v1 = valueA;\r\n let v2 = valueB;\r\n if (typeof valueA === 'string' && typeof valueB === 'string' && sortColumnOdataPath === nameColumnOdataPath) {\r\n v1 = valueA.toLowerCase();\r\n v2 = valueB.toLowerCase();\r\n }\r\n\r\n if (v1 < v2) {\r\n return -1;\r\n }\r\n if (v1 > v2) {\r\n return 1;\r\n }\r\n return 0;\r\n }\r\n })();\r\n\r\n const items = buildItemData({\r\n scope,\r\n serverContext,\r\n i18n,\r\n gridType: currentGridType,\r\n rawData: filteredRowData,\r\n expandedItemIds,\r\n });\r\n\r\n useEffect(() => {\r\n if (isRefreshReady) {\r\n logger.signal('Refresh grid by column/range/type change');\r\n refreshGridData({ ...getArguemntsOfUpdateGridDataByCurrentState() });\r\n }\r\n }, [selectedColumnKeys, dataRangeCacheKey, gridType, scope.values, isRefreshReady]);\r\n\r\n // setup toolbar\r\n useEffect(() => {\r\n toolbarEditor.update({\r\n id: treeViewButtonId,\r\n onClick: changeToTreeView,\r\n });\r\n toolbarEditor.update({\r\n id: listViewButtonId,\r\n onClick: changeToListView,\r\n });\r\n\r\n // initial for the first time mount\r\n changeActiveViewButton(currentGridType);\r\n }, [toolbarSelectedConfig, toolbarUnselectedConfig]);\r\n\r\n const [creatingRootNode, setCreatingRootNode] = useState(false);\r\n\r\n const createFirstListingGroupLink = useMemo(() => {\r\n if (scopeLevel !== ScopeLevel.AssetGroup) {\r\n // do not show create first listing group link when scope is campaign scope\r\n return null;\r\n }\r\n\r\n if (!items || items.length > 0) {\r\n // only show create first listing group link when there is no listing group\r\n return null;\r\n }\r\n\r\n const createRootNode = () => {\r\n setCreatingRootNode(true);\r\n createRootListingTree(scope.values.assetGroupId)\r\n .then(() => {\r\n setCreatingRootNode(false);\r\n refreshGridData(getArguemntsOfUpdateGridDataByCurrentState());\r\n }).catch(() => {\r\n setCreatingRootNode(false);\r\n });\r\n };\r\n\r\n return (\r\n
\r\n
{i18n.getString(_TL_('You haven\\'t created any listing groups for this asset group yet.'))}
\r\n {i18n.getString(_TL_('Create first listing group.'))}\r\n
\r\n )\r\n }, [items, scope.values.assetGroupId, scopeLevel]);\r\n\r\n return (\r\n \r\n {isTreeViewSelectorOpen && item.key}\r\n isBulkAddEnabledForDimension={(d) => d.data.isBulkAddEnabled}\r\n />}\r\n {\r\n if (prev.enableShimmer && items) {\r\n listingGroupPerfMarker.done();\r\n }\r\n }}\r\n onRenderRow={(detailsRowProps, defaultRender) => {\r\n if (detailsRowProps.focusZoneProps) {\r\n detailsRowProps.focusZoneProps.preventFocusRestoration = true;\r\n } else {\r\n detailsRowProps.focusZoneProps = { preventFocusRestoration: true };\r\n }\r\n return defaultRender(detailsRowProps);\r\n }}\r\n />\r\n { createFirstListingGroupLink }\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport const StyledListingGroupsPage = compose(\r\n withI18nConsumer,\r\n WrappedComponent => withDefaultStyles(WrappedComponent, () => ({}))\r\n)(ListingGroupsPage);","import { getCommonFilterConfig } from '@bingads-webui-campaign/common-grid-config';\r\nimport { ProductListingGroup } from '@bingads-webui-campaign/campaign-ui-schemas';\r\nimport sessionStore from '@bingads-webui-component-legacy/js-data-storage/session-storage';\r\nimport jsData from '@bingads-webui-component-legacy/js-data-campaign/index';\r\nimport cacheService from '@bingads-webui-static-legacy/cache-service';\r\nimport dataContextManager from '@bingads-webui-static-legacy/summary/SummaryDataContextManager';\r\nimport * as filterPreferences from '@bingads-webui-component-legacy/bingads-grid/service/filter-preferences';\r\nimport appConfig from '@bingads-webui-component-legacy/config/index';\r\nimport { GRID_NAME } from './constant';\r\n\r\nexport function getFilterConfig({\r\n preferenceService,\r\n i18n,\r\n}) {\r\n const featureName = GRID_NAME;\r\n const enableCampaignWaterfall = false;\r\n const enableAdGroupWaterfall = false;\r\n const entitySchema = ProductListingGroup;\r\n const legacyGlobalI18n = window.globalLegacyI18n.get('component/i18n/loader!legacy/global');\r\n const schemaI18nCampaign = window.globalLegacyI18n.get('$/schema-i18n!campaign');\r\n const preferenceStoreFactory = filterPreferences.getFilters;\r\n\r\n const filterConfig = getCommonFilterConfig({\r\n updatePilot: false,\r\n featureName,\r\n preferenceService,\r\n entitySchema,\r\n i18n,\r\n legacyGlobalI18n,\r\n sessionStore,\r\n preferenceStoreFactory,\r\n globalConfig: appConfig,\r\n schemaI18nCampaign,\r\n cacheService,\r\n dataContextManager,\r\n jsdata: jsData,\r\n editor: {},\r\n enableCampaignWaterfall,\r\n enableAdGroupWaterfall,\r\n // selector: [{\r\n // property: 'Status',\r\n // items: [\r\n // {\r\n // text: i18n.getString('AllAdGroup'),\r\n // value: null,\r\n // },\r\n // {\r\n // text: i18n.getString('AllEnabledAdGroup'),\r\n // value: [\"Enum.AdGroupStatus'Active'\", \"Enum.AdGroupStatus'CampaignBudgetPaused'\"],\r\n // },\r\n // ],\r\n // removable: false,\r\n // defaultValue: null,\r\n // }],\r\n searchbox: {\r\n placeholder: i18n.getString(_TL_('Listing group')),\r\n searchProperty: 'ConditionAttribute',\r\n searchOperator: '$contains',\r\n // maxLength: entitySchema.properties.Name.maxLength,\r\n },\r\n });\r\n\r\n return filterConfig;\r\n}\r\n","import { FilterEntity } from '@bingads-webui/filter-entity';\r\n\r\n// `$filter` is an OData query option\r\nexport function convertFilterEntity2$filter(filterEntity) {\r\n return filterEntity ? FilterEntity.toOdata(filterEntity.query, filterEntity.odataOptions) : undefined;\r\n}\r\n","/* eslint-disable react/sort-comp */\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Route, Switch, Redirect } from '@bingads-webui-campaign-react/router';\r\nimport { withInstrumentation } from '@bingads-webui-react/hoc-with-instrumentation';\r\nimport { withCurrentExpandedScope } from '@bingads-webui-campaign-react/use-current-scope-entity';\r\nimport { LISTING_GROUP_TREE_ROUTING, LISTING_GROUP_LIST_ROUTING } from './constant';\r\nimport { StyledListingGroupsPage } from './listing-groups-page';\r\n\r\nclass ListingGroupsRouterShell extends React.Component {\r\n static propTypes = {\r\n history: PropTypes.shape({\r\n push: PropTypes.func.isRequired,\r\n }).isRequired,\r\n location: PropTypes.shape({\r\n pathname: PropTypes.string.isRequired,\r\n search: PropTypes.string.isRequired,\r\n }).isRequired,\r\n scope: PropTypes.shape({\r\n save: PropTypes.func,\r\n values: PropTypes.shape({\r\n assetGroupId: PropTypes.number,\r\n campaignId: PropTypes.number,\r\n }).isRequired,\r\n }).isRequired,\r\n currentCampaign: PropTypes.shape({\r\n Id: PropTypes.string,\r\n }).isRequired,\r\n currentAdGroup: PropTypes.shape({\r\n Id: PropTypes.string,\r\n }).isRequired,\r\n instrumentation: PropTypes.shape({}).isRequired,\r\n changeLayout: PropTypes.func.isRequired,\r\n };\r\n\r\n static defaultProps = {\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n this.props.changeLayout({ tab: { disableCompare: true } });\r\n }\r\n\r\n componentWillUnmount() {\r\n this.props.changeLayout({ tab: { disableCompare: false } });\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n (\r\n // Will change back to list view when in hierarchy view of campaign scope\r\n this.props.scope.values.assetGroupId\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\nexport const ListingGroupsShell = withInstrumentation(withCurrentExpandedScope(ListingGroupsRouterShell));\r\n"],"names":["getStyles","bidSetting","marginTop","paddingLeft","maxWidth","LegacyBidSetting","React","_ref","container","id","className","onChange","activity","budgetAmount","validateWithBudget","defaultBidValue","view","useRef","useEffect","current","BidSetting","activityLogger","isAudienceCampaign","isMSStoreCampaign","withRealTimeValidation","render","$el","appendTo","remove","classes","useDefaultStyles","_jsx","classnames","children","ref","defaultProps","undefined","theme","palette","arguments","length","budgetContainer","_objectSpread","mergeStyles","color","neutralPrimary","padding","lineHeight","minHeight","marginLeft","border","background","display","paddingRight","fontWeight","paddingTop","fontSize","borderColor","LegacyBudget","campaignId","budget","i18n","validationDailyMinBudget","hideBudgetMinRecommendation","viewListener","useMemo","clone","Backbone","BudgetView","withRealTimeUpdates","model","isForVNext","hideDailyBudgetOptions","showBudgetMinRecommend","PageContext","Permissions","dynamic","BCCBudgetImprovementEnabled","currencySymbol","getCurrencySymbol","AccountCurrencyCode","minimumBudget","Amount","listenTo","stopListening","update","CallToActionAriaText","forwardRef","value","textFieldRef","_React$useState","_React$useState2","_slicedToArray","errorMessage","setErrorMessage","maxLength","ResponsiveAd","properties","legacyI18n","buildLegacyI18n","ValidationStringMap","getErrorMessage","newValue","isString","getString","_TL_","useImperativeHandle","getData","trim","isValid","message","RemainingCharsValidatedTextField","label","placeholder","componentRef","event","_ref2","validationProps","schema","field","alwaysShowError","convertor","fromModel","CallToActionText","defaultValue","validationSchema","type","required","components","callToActionContainer","convertToLocalStyle","actionDropdownStyles","dropdownMinWidthPx","noLeftMargin","searchboxStyle","languageContainer","top","marginBottom","langCodeMapper","ar","bg","bs","cs","da","de","el","en","es","et","fi","fr","hr","hu","is","it","iw","ja","lt","lv","mk","mt","nl","no","pl","pt","ro","ru","sk","sl","sq","sr","sv","tr","zh","getLocalLanguage","locale","split","DEFAULT_LANGUAGE","getLanguage","permissions","supportedLanguages","globalizationModelSetup","culture","LANGUAGES","language","lcLocale","toLocaleLowerCase","localesToTry","i","localeToTry","has","localeToLanguage","contains","IsDomesticSimplifiedChineseEnabled","LegacyCallToAction","setNewCTACallback","languageValue","ctaText","ctaAriaText","isPmaxAd","isBoostScenario","isBoostCustomCTAEnabled","isCustomCTAEnabled","valueText","useContext","I18nContext","languageView","isBoostCTAAriaTextEnabled","IsAmplifyEnabled","IsBoostCTAAriaTextEnabled","_useState","useState","_useState2","cta","setCta","_useState3","_useState4","ctaString","setCtaString","_useState5","_useState6","setLanguage","viewModel","ActionType","ko","isEmpty","Language","CallToAction","CallToActionLanguage","observable","isFunction","actionTypeAdapter","BackboneCallToActionAdapter","callback","selectedOption","updateCTA","defaultActionText","languageAdapter","BackboneCallToActionLanguageAdapter","updateLanguage","onGlobalShortcut","useCallback","e","key","document","getElementsByClassName","preventDefault","click","addEventListener","removeEventListener","_jsxs","_Fragment","concat","noop","LegacyCallToActionWithCustomValidation","updateValidation","restProps","_objectWithoutProperties","_excluded","data","ActivityContext","CallToActionValue","signal","JSON","stringify","ValidatedLegacyCallToAction","withCustomValidation","actionTextLocalization","actionType","ctaInfo","getActionText","CallToActionDescription","isMMAAutomatedCTAOptInEnabled","automatedCTAEnable","isDisplayPlusMMA","isBulk","ReactTemplate","b","text","template","helpLinkElement","HelpLink","query","boldFinalUrlElement","boldEnableMMAAutoElement","LegacyCallToActionWithLanguage","ctaContainer","langContainer","isMultimediaAd","ctaView","langView","_ref3","selectedCta","setSelectedCta","selectedLanguage","setSelectedLanguage","selectedCtaText","setSelectedCtaText","_ref4","BackboneLanguageAdapter","noEntiyCheck","tooltipId","Label","HelpPopup","topic","LegacyCallToActionWithLanguageWithCustomValidation","onChangeFromProps","updates","extraParameters","ValidatedLegacyCallToActionWithLanguage","ValidatedLegacyCallToActionWithLanguageSection","callToAction","rest","ctaValidationProps","ValidatedFixedPanel","title","TextTitle","titleKey","topicKey","icon","CallToActionImg","iconAltText","noOverflowHidden","relativePosition","attentionBeaconProps","getExtraProps","getPanelErrorProps","LegacyDepsContext","withLegacyDeps","AReactComponent","props","Consumer","context","legacyDeps","getRequestFormStyle","_","_ref$palette","requestFormContainer","margin","boxShadow","width","listStyle","neutralSecondary","borderRadius","textAlign","LegacyEditorialAppealRequestForm","appealTitle","infoMsg","appealData","appealIds","EditorView","hideAppealCheckBox","toBulk","LegacyInlineErrorView","InlineErrorView","rowId","useKwCss","LegacyFinalUrlExpansionUnStyled","_React$Component","_this","_classCallCheck","_callSuper","isFinalUrlExpansionEnabled","state","operatorMap","Equals","Contains","operandMap","Url","_inherits","_createClass","this","setViewAndUpdateViewModel","prevProps","isEqual","_this2","AutoTargetView","bind","newData","finalUrlExpansionOptOut","finalUrlExpansionsBulkUpsert","isNegativeAutoTarget","isShowUrlOnly","selectedItem","hideViewSelection","hideWebsiteLabel","isExclude","setFinalUrlExpansionsView","isArray","toAddToViewModel","updateViewModels","cloneDeep","each","target","isExactMatch","conditions","Criterion","WebPage","Parameter","Conditions","results","condition","Operator","push","Operand","ArgumentOperand","DisplayOperator","DisplayOperand","shouldCheckArgumentOperandFormat","selectedTargetsView","viewmodel","addBatch","_this3","finalUrlContainer","Toggle","checked","onText","offText","setState","clear","role","Text","i8n","LegacyFinalUrlExpansion","withDefaultStyles","Object","assign","creationCommonStyle","dsaCampaignStyles","campaignSettingsStyles","adgroupsKeywordsStyles","ValidatedLegacyFinalUrlExpansion","finalUrlExpansions","level","LegacySharedBudget","noApplyBudgetFromSharedLibrary","budgetFactory","SharedBudgetView","newFactory","showInitialUiBlocker","showNoSharedBudgetLink","shoppingSettings","minWidth","LegacyShoppingSettings","shoppingSettingsRef","shoppingSettingOptions","ShoppingSettings","isCPSSelected","LISTING_GROUP_TREE_ROUTING","LISTING_GROUP_LIST_ROUTING","GridType","GRID_NAME","columnChooserId","ScopeLevel","nameColumnOdataPath","treeViewButtonId","listViewButtonId","paginatorStyleClassName","alignItems","marginRight","Paginator","currentPage","onPageIndexChange","onPageSizeChange","pageSize","totalCount","pageSizeLabel","pageSizeOptions","assert","pageCount","Math","ceil","pageSizeSelectorId","useId","pageSizeSelectorOptions","selectedPageSize","includes","map","toString","selected","buildPageSizeOptions","pageIndexSelectorOptions","selectedPageIndex","pageIndexOptions","Array","from","pageIndex","PREVIOUS_BUTTON","NEXT_BUTTON","pageIndexChangeHandler","newPageIndex","htmlFor","Dropdown","option","newPageSize","newMaxPageNum","options","IconButton","iconProps","iconName","disabled","onClick","selectedKey","bulkAddEditorStyleClassName","flexDirection","BulkAddEditor","onCancel","onSubmit","setValue","TextField","multiline","rows","Stack","horizontal","tokens","childrenGap","PrimaryButton","finalValues","values","str","filter","unqiue","Set","res","forEach","v","toLowerCase","add","formatRawString","DefaultButton","panelStyles","main","content","overflow","footerInner","borderTop","overlayProps","styles","root","panelSelectorStyleClassName","flex","height","overflowY","overflowX","onRenderSquareCheckbox","addIcon","PanelSelector","enableShimmer","isOpen","headerText","columns","items","dimensions","onSave","onSelectedDimensionChange","initialSelectedItems","keyOfItem","isBulkAddEnabledForDimension","getErrors","preItems","usePrevious","preColumns","preDimensions","preInitialSelectedItems","finalItems","setFinalItemsImpl","setFinalItems","param","finalValue","pre","defaultSelectedDimension","getDefaultSelectedDimension","selectedDimension","isSelectedDimensionChanged","previousSelectedDimension","isCurrentAllSelected","selection","isAllSelected","isNextAllSelect","isEventSupressed","setChangeEvents","setItems","setSelectedItemKeys","selectedItemKeys","setKeySelected","finalColumns","setFinalColumns","Selection","onSelectionChanged","newSelectedItemKeysCandidate","getSelection","join","getKey","dimension","setSelectedDimension","c","finalColumn","onColumnClick","ev","column","isSortedDescending","isSorted","columnKey","slice","sort","a","aValue","bValue","copyAndSort","fieldName","preColumn","dimensionSelectorId","currentPageSize","setCurrentPageSize","currentPageIndex","setCurrentPageIndex","groups","fill","name","startIndex","count","isCollapsed","onSaveClick","selectedItems","item","isLoading","isBulkAddEditorOpened","setIsBulkAddEditorOpened","errors","customCounter","onClickBulkAddValues","onBulkAddEditorCancel","onBulkAddEditorCommit","newValues","newItems","s","__bulk","newSelectedItemKeys","find","Panel","medium","closeButtonAriaLabel","onDismiss","isFooterAtBottom","onRenderFooterContent","isVisible","index","CommandBarButton","MessageBar","dismissButtonAriaLabel","selectionClearedOnSurfaceClick","ShimmeredDetailsList","setKey","onRenderCheckbox","checkboxVisibility","always","groupProps","onRenderHeader","collapseAllVisibility","hidden","disableSelectionZone","error","ListingGroupColumn","AssetGroupNameColumn","ListingColumn","IncludeExcludeColumn","getColumnChooserCategories","parameters","gridType","scopeLevel","cpsColumnsEnabled","SupportCPSForPmax","getAttributeColumnKeys","o","buildCategoryOptionFromColumnRawData","getPerfColumnKeys","getConvColumnKeys","selectOption","lockColumns","locked","optional","isNotNullOrUndefined","Campaign","colmuns","legacyI18nOfListingGroup","Schema_PerformanceMetrics_Property_Impressions","Schema_PerformanceMetrics_Property_Clicks","Schema_PerformanceMetrics_Property_CTR","Schema_PerformanceMetrics_Property_Spend","Schema_PerformanceMetrics_Property_AverageCPC","Schema_PerformanceMetrics_Property_AverageCPM","Schema_PerformanceMetrics_Property_Conversions","Schema_PerformanceMetrics_Property_ConversionRate","Schema_PerformanceMetrics_Property_RevenueOnAdSpend","Schema_PerformanceMetrics_Property_AdvertiserReportedRevenue","Schema_PerformanceMetrics_Property_CPA","Schema_PerformanceMetrics_Property_AllConversions","Schema_PerformanceMetrics_Property_AllConversionRate","Schema_PerformanceMetrics_Property_AllConversionRevenueOnAdSpend","Schema_PerformanceMetrics_Property_AllConversionAdvertiserReportedRevenue","Schema_PerformanceMetrics_Property_AllConversionCPA","Schema_PerformanceMetrics_Property_AverageCPS","Schema_PerformanceMetrics_Property_SalesCount","Schema_PerformanceMetrics_Property_ViewThroughConversions","Schema_PerformanceMetrics_Property_ViewThroughConversionsRevenue","Schema_PerformanceMetrics_Property_ViewThroughConversionsCPA","Schema_PerformanceMetrics_Property_ViewThroughConversionsReturnOnAdSpend","Schema_PerformanceMetrics_Property_ViewThroughConversionsRate","ProductsGrid_Column_All","ProductsGrid_Column_Brand","ProductsGrid_Column_Category1","ProductsGrid_Column_Category2","ProductsGrid_Column_Category3","ProductsGrid_Column_Category4","ProductsGrid_Column_Category5","ProductsGrid_Column_CategoryL1","ProductsGrid_Column_CategoryL2","ProductsGrid_Column_CategoryL3","ProductsGrid_Column_CategoryL4","ProductsGrid_Column_CategoryL5","ProductsGrid_Column_Channel","ProductsGrid_Column_ChannelExclusivity","ProductsGrid_Column_Condition","ProductsGrid_Column_CountryOfSale","ProductsGrid_Column_CustomLabel0","ProductsGrid_Column_CustomLabel1","ProductsGrid_Column_CustomLabel2","ProductsGrid_Column_CustomLabel3","ProductsGrid_Column_CustomLabel4","ProductsGrid_Column_GTIN","ProductsGrid_Column_Id","ProductsGrid_Column_Language","ProductsGrid_Column_MerchantId","ProductsGrid_Column_MPN","ProductsGrid_Column_Price","ProductsGrid_Column_ProductBought","ProductsGrid_Column_ProductType1","ProductsGrid_Column_ProductType2","ProductsGrid_Column_ProductType3","ProductsGrid_Column_ProductType4","ProductsGrid_Column_ProductType5","ProductsGrid_Column_Title","getFullUrlOfAdsOdata","baseUrl","path","adsOdataParams","queryOptions","entityPath","customerId","accountId","assetGroupId","scopeLevelPath","queryString","entries","reduce","cur","set","URLSearchParams","NonSplittableConditions","filterOutUsedDimensions","listingConditions","pathsToParent","every","p","filterReachableDimensions","reservedIds","currentOperand","currentId","Id","ParentId","getValidListingConditions","response","isFromEverythingElse","Condition","Attribute","ParentConditions","parentConditionOperands","allItemOperands","filterNonSplittableDimensions","async","updateListingTree","payload","ListingGroupsToAdd","ListingGroupsToDelete","AssetGroupId","itemsToAdd","itemsToDelete","Status","then","catch","createRootListingTree","IsLeaf","IsExcluded","useAPIsOfListingGroup","fetch","fetchImpl","listingGroupGridData","params","responsePromise","json","listingGroupGridDataResponseHandler","method","headers","body","listingGroupGridDataRequest","productAttributeStatistics","p$response","productAttrubuteStatisticsResponseHandler","productListingGroupId","productAttrubuteStatisticsRequest","getListingGroupConditions","getListingGroupConditionsResponseHandler","getListingGroupConditionsRequest","getProductOffers","productOfferResponseHandler","productOfferRequest","mergeStyleSets","errorColor","core","helpButtonStyle","helpbuttonStyle","merge","statusStyle","whiteSpace","themePrimary","white","cursor","transitionDuration","opacity","themeDark","getGridToolbarConfig","onBidChangeClick","serverContext","toolbarUnselectedConfig","candidates","AssetGroup","iconLeftGlyphName","ariaLabel","attrs","Map","toolbarItem","toolbarItemsWithoutSelection","toolbarSelectedConfig","toolbarItemsWithSelection","columnKeyRawDataMap","cpsColumnKeys","odataPathOfCommonColumnsIterable","odataPathOfListingGroupColumnIterable","odataMapOfListingGroupResponse","anchorHrefPlaceholder","IsCurrentAccountInactive","CurrentAccountInActive","IsReadOnlyMode","ReadOnlyMode","getPropertyFromItem","itemData","odataPathOfProperty","get","getPropertyByPath","getPropertyFromItemByColumnKey","propertyPath","obj","callout","partitionTrail","currentAttribute","productSampleDescription","productSampleId","link","ProductOffersCallout","fullPath","scope","commonEntityPath","aid","cid","currentCondition","trail","offerCount","setOfferCount","sampleOffers","setSampleOffers","setIsLoading","showOfferLimitExceededError","setShowOfferLimitExceededError","$top","offerLimitExceededContent","offerLimitExceededWarning","Callout","gapSpace","setInitialFocus","UiBlocker","blocking","loadingText","block","offerCountModel","sampleOffer","Title","Link","save","messageBarType","warning","ConditionTemplate","total","depth","hasChildren","showSelectorIcon","attributeText","isExpanded","onToggleCollapse","onAddOrEditTrigger","partitionFullPath","updatedScope","attributeRef","showCallout","setShowCallout","hideCalloutTimer","textPadding","toggleIconMargin","fontFamily","onCollpaseToggleKeyDown","stopPropagation","onCollapseClick","Fragment","style","onKeyDown","tabIndex","onMouseEnter","clearTimeout","onMouseLeave","window","setTimeout","onMouseOver","onFocus","closeTooltip","onBlur","href","FlattenConditionTemplate","NameTemplate","append","fromViewModelToBulkModel","bold","includeExcludeStatusContainer","includeExcludeCallout","backgroundColor","neutralLight","IncludeExcludeTemplate","styleClassNames","setTarget","statusIcon","FontIcon","dismiss","show","cellEl","closest","getBoundingClientRect","isInclude","itemToAdd","itemToDelete","refreshGridData","onInclude","onExclude","coverTarget","directionalHint","isBeakVisible","isEverythingElse","isAllProduct","getDisplayName","parentConditions","parentCondition","getNearestParentCondition","replace","getFullPath","getAttributeTextOfConditionTemplate","treeViewInfo","parentItem","parent","parentAttribute","onListingGroupColumnListViewRender","attribute","getPath","onListingGroupColumnTreeViewRender","enable","shouldEnableEdit","eventHandlers","onTreeViewColumnAddOrEdit","onTreeViewColumnToggleCollapse","columnRenderMap","AssetGroupName","currentCampaign","CurrentCampaign","cmpid","CampaignId","assetGroupName","defaultRender","format","getFormatOfColumn","formatter","tryGetFormatString","isColumnSortEnabledMap","listingGroupActivityName","scenario","useLogger","instrumentation","InstrumentationContext","addScenario","ListingGroup","create","getActivity","logger","getLogger","getKeyOfHotelListingGroupItem","getAttributeValueOfPanelSelectorItem","getKeyOfPanelSelectorItem","diemnsionKey","getAddAndDeleteItem","treeItem","childrenOfEidtItem","currentOperandOfChildren","operand","dummyEveryThingElse","finalSelectedItems","oldItemKeys","child","newItemKeys","deleteItemIds","addedItems","productsFiledName","dataColumnWidth","buildTreeViewSelectorItems","selectedDimensionGridData","childrenOfNode","selectedDimensionGridDataMap","AttributeName","domainDataItems","DomainData","curItemDataitem","Value","PerformanceMetrics","Clicks","Conversions","Impressions","ProductCount","apiDataItems","OfferCount","candidateItems","hasDomainData","overrideMergeByValue","x","arr","newItem","fillDataFromAPI","mergeTreeViewSelectorItems","buildTreeViewSelectorItemsByChildrenOfNode","HasDomainData","buildTreeViewSelectorItemsWithoutStatistics","valuePicker","appendNewItems","comparator","findIndex","y","overrideMergeByComparator","xValue","yValue","oldItems","additionalItems","fillDataToBulkAddedItem","primaryColumnRender","Number","isInteger","buildTreeViewSelectorColumns","primaryColumnId","primaryColumnName","includeDataColumns","primaryColumn","isRowHeader","onRender","filedName","useTreeViewPanelSelector","allRowRawData","setAllRowRawData","getArguemntsOfUpdateGridDataByCurrentState","dataRange","expandedItemIds","setExpandedItemIds","isTreeViewSelectorOpen","setIsTreeViewSelectorOpen","treeViewSelectorDimensions","setTreeViewSelectorDimensions","treeViewSelectorHeaderText","setTreeViewSelectorHeaderText","treeViewSelectorInitialSelectedItems","setTreeViewSelectorInitialSelectedItems","treeViewSelectorItems","setTreeViewSelectorItems","treeViewSelectorColumns","setTreeViewSelectorColumns","isTreeViewShimmerEnabled","setIsTreeViewShimmerEnabled","getAccount","ccJsData","useJsDataContext","Account","useAccountData","onGenericError","showError","offerLimitExceededWarningForListingGroup","showWarning","currentSelectedDimensionGridDataTask","updateTreeViewGridByEditTreeItemAndSelectedDimension","task","gridDataParameters","DateRange","StartDate","EndDate","productAttributeStatisticsHelper","productAttrubuteStatisticsResponse","updateTreeViewGridByEditTreeItemAndSelectedDimensionWithoutStatistics","currentValidListingConditions","currentEditTreeItem","getSupportedCountries","isOdataGetProductScopeEnabled","callStartTime","Date","now","pData","dataName","bypassCache","cacheResponse","getSalesCountryCollection","noBMCAccounts","getProductScopeData","getProductDataWithCache","getProductScopeFromOData","uid","url","queryify","Product","adapter","getProductData","mergeData","SalesCountryCollection","toUpperCase","getCountryCode","countryCode","SalesCountry","account","CountryCode","accountCountry","supportedCountries","onTreeViewCancel","onTreeViewSave","callbackWhenSkipUpdate","callbackWhenUpdate","prevOperandOfChildren","negativeId","editItemId","wasEditingNodeLeaf","isEditingNodeLeaf","inheritNode","parentIdOfChildren","listingGroupsToAdd","buildListingGroupToAdd","isLeaf","isDeleteAll","listingGroupsToDelete","metaInfo","treeViewSaveWorker","onTreeViewSelectedDimensionChange","onTreeViewSelectedDimensionChangeWithoutStatistics","getErrorsForTreeViewSelector","totalItemsCount","number","CampaignSettings","setting","getListingGroupConditionsResponseBody","validListingConditions","dimensionsOfItem","DimensionProperties","selectedDimensionName","operands","diemnsion","findResult","result","getInitialSelectedDimension","currentDimension","currentAttributeId","domainData","isBulkAddEnabled","console","onFilterProduct","getValidListingConditionsForWithoutPreselectedTreeNode","isEveryThingElseRow","ToolbarShownItem","InitializationState","metaColumnOdataPaths","buildColumns","selectedColumnKeys","sortOrder","bindSortFunction","ListingGroupsAllColumnsSortSupport","sortable","columnRawData","isResizable","getColumnRenderByColumnKey","StyledListingGroupsPage","compose","withI18nConsumer","WrappedComponent","preferenceService","perfMarker","listingGroupPerfMarker","marker","createChild","willInit","defaultColumns","i18nWithTL","toolbarShownItem","setToolbarShownItem","Toolbar","latestGridDataRequestId","toolbarEditor","toolbarConfig","updateToolbar","overrideWith","filterConfig","featureName","entitySchema","ProductListingGroup","legacyGlobalI18n","globalLegacyI18n","schemaI18nCampaign","preferenceStoreFactory","filterPreferences","getCommonFilterConfig","updatePilot","sessionStore","globalConfig","appConfig","cacheService","dataContextManager","jsdata","jsData","editor","enableCampaignWaterfall","enableAdGroupWaterfall","searchbox","searchProperty","searchOperator","getFilterConfig","filterService","FilterService","setPageIndex","setPageSize","sortColumnOdataPath","setSortColumnOdataPath","setSortOrder","pageItemsTotal","setPageItemsTotal","pager","pageNumber","availablePageSizes","onPageChange","getOdataSkipAndTop","changeToListView","changeActiveViewButton","List","changeToTreeView","Tree","registerEventHandlersForTreeView","delete","isOrderByEnabled","isSelectEnabled","isFilterEnabled","dataRangeCacheKey","getOdataOrderby","$orderby","$skip","$select","selectedColumnKey","columnOdataPath","getOdataSelect","trickySelectedColumnKeys","$filter","$filterContainer","currentGridType","initializationState","Done","requestId","willFetchData","$count","gridData","willRender","gridIndex","parentElement","setAttribute","forceUpdate","useForceUpdate","NotStart","onFilterStateChanged","isRefreshReady","setIsRefreshReady","off","filterString","filterEntity","FilterEntity","toOdata","odataOptions","convertFilterEntity2$filter","getEditableFilter","Running","initialColumns","initial","on","ColumnChooserTrivia","ColumnChooser","gridName","toolbarOptions","openColumnChooser","toolbar","categories","onApply","newColumnKeys","forceHideToolbar","showToolbarSelected","showToolbarUnselected","k","listingGroupColumnIndex","splice","filteredRowData","sortedItems","valueA","valueB","v1","v2","reverse","rawData","raw","listingGroupGridItemsData","getParentKeyOfItem","getPrimaryKeyOfItem","buildItemData","creatingRootNode","setCreatingRootNode","createFirstListingGroupLink","d","CampaignShimmeredDetailsList","onSort","newSortOrder","newSortColumnOdataPath","sortedColumn","sortColumn","getSortedColumn","selectionMode","SelectionMode","multiple","freezingColumnCount","didUpdate","prev","done","onRenderRow","detailsRowProps","focusZoneProps","preventFocusRestoration","timezone","CurrentAccount","TimeZone","ListingGroupsRouterShell","changeLayout","tab","disableCompare","Switch","Route","exact","_createElement","Redirect","to","ListingGroupsShell","withInstrumentation","withCurrentExpandedScope"],"sourceRoot":""}