{"version":3,"file":"static/js/application.async.landing~fa003125.72e03ca3.chunk.js","mappings":"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","sources":["../../../../reporting-ui/packages/props-reporting/src/index.js","../../../../responsive-search-ad/packages/image-extensions-pane/src/styles/customize-ui-blocker-style.js","../../../../responsive-search-ad/packages/image-extensions-pane/src/styles/image-extensions-pane-style.js","../../../../responsive-search-ad/packages/image-extensions-pane/src/components/description-view.js","../../../../responsive-search-ad/packages/image-extensions-pane/src/components/utils/parser.js","../../../../responsive-search-ad/packages/image-extensions-pane/src/styles/image-extensions-list-style.js","../../../../responsive-search-ad/packages/image-extensions-pane/src/components/image-extension-item-preview.js","../../../../responsive-search-ad/packages/image-extensions-pane/src/components/image-extension-item-see-more-less.js","../../../../responsive-search-ad/packages/image-extensions-pane/src/components/image-extensions-list.js","../../../../responsive-search-ad/packages/image-extensions-pane/src/styles/image-extension-dialog-style.js","../../../../responsive-search-ad/packages/image-extensions-pane/src/components/image-extension-fields-config.js","../../../../responsive-search-ad/packages/image-extensions-pane/src/components/create-image-extension-dialog.js","../../../../responsive-search-ad/packages/image-extensions-pane/src/components/delete-image-extension-dialog.js","../../../../responsive-search-ad/packages/image-extensions-pane/src/components/utils/data-convert.js","../../../../responsive-search-ad/packages/image-extensions-pane/src/components/image-recommendations-panel.js","../../../../responsive-search-ad/packages/image-extensions-pane/src/image-extensions-pane-view.js","../../../../responsive-search-ad/packages/image-extensions-pane/src/image-extensions-pane-container.js","../../../../responsive-search-ad/packages/responsive-search-ad-editor/src/validators.js","../../../../responsive-search-ad/packages/responsive-search-ad-editor/src/controls/error.js","../../../../responsive-search-ad/packages/responsive-search-ad-editor/src/controls/with-error.js","../../../../responsive-search-ad/packages/responsive-search-ad-editor/src/styles.js","../../../../responsive-search-ad/packages/responsive-search-ad-editor/src/controls/dynamic-text-extention.js","../../../../responsive-search-ad/packages/responsive-search-ad-editor/src/controls/base-text-field.js","../../../../responsive-search-ad/packages/responsive-search-ad-editor/src/controls/url-path.js","../../../../responsive-search-ad/packages/responsive-search-ad-editor/src/controls/url-input.js","../../../../responsive-search-ad/packages/responsive-search-ad-preview-uapl/src/defaults.js","../../../../responsive-search-ad/packages/responsive-search-ad-preview-uapl/src/ad-preview.js","../../../../responsive-search-ad/packages/responsive-search-ad-preview-uapl/src/styles.js","../../../../responsive-search-ad/packages/responsive-search-ad-editor/src/utils/format.js","../../../../responsive-search-ad/packages/responsive-search-ad-editor/src/controls/pin-button.js","../../../../responsive-search-ad/packages/responsive-search-ad-editor/src/controls/text-assets-styles.js","../../../../responsive-search-ad/packages/responsive-search-ad-editor/src/controls/text-assets.js","../../../../responsive-search-ad/packages/responsive-search-ad-editor/src/controls/disclaimer.js","../../../../responsive-search-ad/packages/responsive-search-ad-editor/src/config.js","../../../../responsive-search-ad/packages/responsive-search-ad-editor/src/responsive-search-ad-copilot-banner-with-dialog.js","../../../../responsive-search-ad/packages/responsive-search-ad-editor/src/responsive-search-ad-editor.js","../../../../responsive-search-ad/packages/responsive-search-ad-editor/src/use-copilot-for-responsive-search-ad.js","../../../../responsive-search-ad/packages/responsive-search-ad-editor/src/controls/validated-text-field-with-ad-customizer.js","../../../../responsive-search-ad/packages/responsive-search-ad-recommendation/src/style/index.js","../../../../responsive-search-ad/packages/responsive-search-ad-recommendation/src/text-asset-recommendations-panel.js","../../../../responsive-search-ad/packages/responsive-search-ad-recommendation/src/inline-recommendation.js","../../../../responsive-search-ad/packages/responsive-search-ad-recommendation/src/use-circular-buffer-view.js","../../../../responsive-search-ad/packages/responsive-search-ad-recommendation/src/config/text-asset-collection-config.js","../../../../responsive-search-ad/packages/responsive-search-ad-recommendation/src/recommendation-context/util.js","../../../../responsive-search-ad/packages/responsive-search-ad-recommendation/src/recommendation-context/recommendation-context.js","../../../../responsive-search-ad/packages/responsive-search-ad-recommendation/src/recommendation-context/use-copilot-recommendations.js","../../../../responsive-search-ad/packages/responsive-search-ad-recommendation/src/text-asset-collection-with-recommendations.js","../../../../responsive-search-ad/packages/responsive-search-ad-recommendation/src/headline-asset-collection.js","../../../../responsive-search-ad/packages/responsive-search-ad-recommendation/src/description-asset-collection.js","../../../../responsive-search-ad/packages/responsive-search-ad-recommendation/src/format-llm-suggestion.js","../../../../responsive-search-ad/packages/responsive-search-ad-strength/src/ad-strength-helper.js","../../../../responsive-search-ad/packages/responsive-search-ad-strength/src/ad-strength-score.js","../../../../responsive-search-ad/packages/responsive-search-ad-strength/src/ad-strength-repository.js","../../../../responsive-search-ad/packages/responsive-search-ad-strength/src/rsa-ad-strength-suggestion-repository.js","../../../../responsive-search-ad/packages/responsive-search-ad-strength/src/rsa-ad-strength-suggestion-picker.js","../../../../responsive-search-ad/packages/responsive-search-ad-strength/src/rsa-ad-strength-suggestion.js","../../../../responsive-search-ad/packages/responsive-search-ad-strength/src/rsa-ad-strength-suggestion-helper.js","../../../../responsive-search-ad/packages/responsive-search-ad-strength/src/ad-strength-view.js","../../../../responsive-search-ad/packages/responsive-search-ad-strength/src/rsa-ad-strength-view.js","../../../../responsive-search-ad/packages/responsive-search-ad-strength/src/rsa-ad-strength-suggestion-contextual-attribute.js"],"sourcesContent":["import PropTypes from 'prop-types';\r\n\r\nconst ReportingProps = {};\r\n\r\nReportingProps.i18n = PropTypes.shape({\r\n formatDate: PropTypes.func.isRequired,\r\n formatPercent: PropTypes.func.isRequired,\r\n getCurrencySymbol: PropTypes.func.isRequired,\r\n getString: PropTypes.func.isRequired,\r\n isReady: PropTypes.func.isRequired,\r\n parseDate: PropTypes.func.isRequired,\r\n parseDecimal: PropTypes.func.isRequired,\r\n});\r\n\r\nReportingProps.instrumentationSchema = PropTypes.shape({\r\n scenario: PropTypes.arrayOf(PropTypes.shape({\r\n name: PropTypes.string.isRequired,\r\n value: PropTypes.any.isRequired,\r\n activity: PropTypes.arrayOf(PropTypes.shape({\r\n name: PropTypes.string.isRequired,\r\n value: PropTypes.any.isRequired,\r\n })).isRequired,\r\n })).isRequired,\r\n});\r\n\r\nReportingProps.reactRouterLocation = PropTypes.shape({\r\n pathname: PropTypes.string.isRequired,\r\n search: PropTypes.string,\r\n hash: PropTypes.string,\r\n});\r\n\r\nReportingProps.reactRouterMatch = PropTypes.shape({\r\n params: PropTypes.objectOf(PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.number,\r\n ])).isRequired,\r\n path: PropTypes.string.isRequired,\r\n url: PropTypes.string.isRequired,\r\n isExact: PropTypes.bool.isRequired,\r\n});\r\n\r\nReportingProps.reactRouterHistory = PropTypes.shape({\r\n go: PropTypes.func.isRequired,\r\n goBack: PropTypes.func.isRequired,\r\n push: PropTypes.func.isRequired,\r\n});\r\n\r\nReportingProps.instrumentation = PropTypes.object;\r\n\r\nReportingProps.reportList = PropTypes.shape({\r\n reportsTree: PropTypes.shape({\r\n name: PropTypes.string.isRequired,\r\n path: PropTypes.string.isRequired,\r\n children: PropTypes.array,\r\n }).isRequired,\r\n reports: PropTypes.object.isRequired,\r\n isValidCreateReportId: PropTypes.func.isRequired,\r\n isValidCategoryId: PropTypes.func.isRequired,\r\n});\r\n\r\nReportingProps.reportDescription = PropTypes.oneOfType([\r\n PropTypes.string.isRequired,\r\n PropTypes.shape({\r\n what: PropTypes.string.isRequired,\r\n why: PropTypes.string.isRequired,\r\n }).isRequired,\r\n]);\r\n\r\nReportingProps.reportDefinition = PropTypes.shape({\r\n apiKey: PropTypes.string.isRequired,\r\n description: ReportingProps.reportDescription.isRequired,\r\n name: PropTypes.string.isRequired,\r\n});\r\n\r\nReportingProps.logger = PropTypes.shape({\r\n mark: PropTypes.func.isRequired,\r\n trace: PropTypes.func.isRequired,\r\n error: PropTypes.func.isRequired,\r\n});\r\n\r\nReportingProps.identityDetails = PropTypes.shape({\r\n user: PropTypes.shape({\r\n Id: PropTypes.number.isRequired,\r\n Name: PropTypes.string.isRequired,\r\n ParentCustomerId: PropTypes.number.isRequired,\r\n }).isRequired,\r\n customer: PropTypes.shape({\r\n Id: PropTypes.number.isRequired,\r\n Name: PropTypes.string.isRequired,\r\n }).isRequired,\r\n lcid: PropTypes.number.isRequired,\r\n});\r\n\r\nReportingProps.updateId = PropTypes.string;\r\nReportingProps.permissions =\r\n PropTypes.shape({});\r\n\r\nReportingProps.reportSchema = PropTypes.object;\r\n\r\nReportingProps.repository = PropTypes.shape({\r\n getDetailsByExecutionId: PropTypes.func.isRequired,\r\n});\r\n\r\nReportingProps.servicesEndpoints = PropTypes.shape({\r\n CampaignAPI: PropTypes.string.isRequired,\r\n ClientCenterUIAPI: PropTypes.string.isRequired,\r\n Token: PropTypes.string.isRequired,\r\n});\r\n\r\nexport { ReportingProps as default };\r\n","// set opacity to the overlay, so that content under blocker is still visible.\r\nexport const customizedUIBlockerStyle = {\r\n '& .react-block-ui > div:last-child': {\r\n backgroundColor: 'rgba(255, 255, 255, 0.4) !important',\r\n\r\n '& div[class*=blockerIndicator]': {\r\n display: 'inline-flex',\r\n alignItems: 'end',\r\n },\r\n },\r\n};\r\n","import { multiImageInnerCarouselStyles } from '@bingads-webui-campaign-react/shared-image-preview-styles';\r\nimport { floatButtonStyle } from '@bingads-webui-campaign-react/common-styles';\r\nimport { customizedUIBlockerStyle } from './customize-ui-blocker-style';\r\n\r\nexport const getImageExtensionsPaneStyle = (_, { palette, iconFontFamily = 'MsAds MDL2 Assets' }) => {\r\n const border = '1px solid #B3B0AD';\r\n\r\n return {\r\n panelFooter: {\r\n background: 'white',\r\n bottom: 0,\r\n position: 'fixed',\r\n border: 'none',\r\n '& button ~ button': {\r\n marginLeft: 8,\r\n },\r\n },\r\n cropPanel: {\r\n '& .image-crop-editor-container': {\r\n height: 'calc(100% - 60px)',\r\n overflowY: 'auto',\r\n },\r\n '& .extension-images-control': {\r\n '& .image-experience-content': {\r\n marginBottom: '10px',\r\n },\r\n '& .error': {\r\n color: '#a4262c',\r\n },\r\n '& .image-section-label': {\r\n display: 'inline-block',\r\n '& label': {\r\n float: 'left',\r\n },\r\n '& .helpbutton': {\r\n float: 'left',\r\n },\r\n },\r\n '& .add-image-button': {\r\n display: 'block',\r\n background: `${palette.white} !important`,\r\n border: `1px solid ${palette.neutralSecondaryAlt}`,\r\n borderRadius: 2,\r\n boxSizing: 'border-box',\r\n fontWeight: 600,\r\n margin: '0 !important',\r\n\r\n '&:before': {\r\n color: palette.themePrimary,\r\n content: '\"\\\\E710\"',\r\n fontFamily: iconFontFamily,\r\n fontWeight: 'normal',\r\n marginRight: 8,\r\n },\r\n },\r\n '& .new-preview-carousel-container': {\r\n // inner carousel in a carousel\r\n border: '1px solid #C8C8C8',\r\n margin: 0,\r\n width: '100%',\r\n minWidth: 669,\r\n ...multiImageInnerCarouselStyles(palette, iconFontFamily),\r\n\r\n '& .new-responsive-ad-preview-container': {\r\n height: 500,\r\n overflow: 'hidden',\r\n\r\n '& .responsive-ad-preview-content': {\r\n border: '1px solid #C8C8C8',\r\n },\r\n },\r\n\r\n '& .preview-type-string': {\r\n bottom: 25,\r\n fontSize: 14,\r\n lineHeight: '20px',\r\n paddingTop: 12,\r\n position: 'fixed',\r\n textAlign: 'center',\r\n width: '100%',\r\n },\r\n '& .additional-disclaimer': {\r\n fontSize: 12,\r\n lineHeight: '20px',\r\n textAlign: 'left',\r\n bottom: 0,\r\n padding: '0 24px',\r\n position: 'fixed',\r\n },\r\n '& .disclaimer-info': {\r\n fontSize: 12,\r\n lineHeight: '20px',\r\n textAlign: 'left',\r\n padding: '0 24px 20px 24px',\r\n },\r\n },\r\n '& .image-experience-content .image-list-view-content': {\r\n position: 'relative',\r\n '& .image-list': {\r\n '& .image-list-label': {\r\n fontSize: 14,\r\n fontWeight: 600,\r\n lineHeight: '19px',\r\n },\r\n\r\n '& .image-list-content': {\r\n display: 'flex',\r\n border: '1px solid #C8C8C8',\r\n margin: '8px 0 0 0',\r\n padding: '16px 16px 12px 16px',\r\n width: 'fit-content',\r\n\r\n '& .image-list-item': {\r\n float: 'none',\r\n padding: 0,\r\n\r\n '& ~ .image-list-item': {\r\n marginLeft: 8,\r\n },\r\n\r\n '& .dropdown.btn-group': {\r\n display: 'block',\r\n\r\n '&.image-edit-dropdown .dropdown-toggle': {\r\n extend: floatButtonStyle({ palette }).floatButton,\r\n fontFamily: iconFontFamily,\r\n fontSize: 16,\r\n lineHeight: 1,\r\n float: 'right',\r\n margin: 0,\r\n\r\n '&:before': {\r\n content: '\"\\\\E70F\"',\r\n },\r\n },\r\n\r\n '& .caret': {\r\n display: 'none',\r\n },\r\n },\r\n\r\n '& .image-item-ratio-label': {\r\n fontSize: 14,\r\n lineHeight: '20px',\r\n },\r\n },\r\n\r\n '& .remove-all-button': {\r\n background: 'none',\r\n border: 'none',\r\n color: palette.neutralSecondary,\r\n fontFamily: iconFontFamily,\r\n fontSize: 12,\r\n lineHeight: 1,\r\n margin: '-14px -14px 0 0',\r\n padding: 8,\r\n width: 28,\r\n height: 28,\r\n\r\n '&:before': {\r\n content: '\"\\\\E711\"',\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n '& .image-experience-content .image-list-view-content .image-list': {\r\n margin: '10px 0',\r\n '& .image-list-label': {\r\n fontSize: 12,\r\n fontWeight: '700',\r\n },\r\n '& .image-list-item': {\r\n border: 'none',\r\n position: 'relative',\r\n float: 'left',\r\n padding: 5,\r\n fontSize: 12,\r\n '& .image-item-ratio-label': {\r\n marginTop: 5,\r\n height: '20px !important',\r\n textAlign: 'center',\r\n },\r\n '& .empty-image-list-item': {\r\n '& button': {\r\n border: 'dashed',\r\n background: 'white',\r\n borderColor: '#CCCCCC',\r\n borderWidth: 'thin',\r\n color: '#00a2ff',\r\n textAlign: 'center',\r\n },\r\n '& button:focus': {\r\n outline: 'none !important',\r\n },\r\n },\r\n '& .image-list-item-image': {\r\n position: 'relative',\r\n '& .dropdown.btn-group': {\r\n display: 'none',\r\n position: 'absolute',\r\n width: '100%',\r\n bottom: '0',\r\n '& .image-edit-dropdown .dropdown-toggle': {\r\n color: 'white',\r\n background: 'rgba(0,0,0,0.3)',\r\n width: '100%',\r\n border: '0',\r\n padding: 2,\r\n },\r\n '& .dropdown-menu': {\r\n margin: '0',\r\n borderRadius: '0',\r\n border: '2px solid rgba(0,0,0,0.15)',\r\n },\r\n '& .dropdown-menu li': {\r\n float: 'unset',\r\n },\r\n '& .dropdown-menu li a': {\r\n paddingLeft: 10,\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n container: {\r\n margin: '16px 0',\r\n paddingBottom: 10,\r\n borderTop: border,\r\n borderBottom: border,\r\n\r\n ...customizedUIBlockerStyle,\r\n\r\n '& .teaching-bubble-content': {\r\n minWidth: 364,\r\n },\r\n\r\n '& .image-suggestion-carousel-root .panel': {\r\n marginTop: 0,\r\n },\r\n },\r\n addIcon: {\r\n marginRight: 8,\r\n top: 0,\r\n color: palette.themeSecondary,\r\n fontSize: 16,\r\n },\r\n listContainer: {\r\n margin: '16px 0 0 0',\r\n },\r\n alertBanner: {\r\n marginTop: 5,\r\n },\r\n labelContainer: {\r\n fontWeight: 400,\r\n fontSize: 18,\r\n lineHeight: '31px',\r\n },\r\n };\r\n};\r\n\r\nexport const overrideImageRecommendationClasses = {\r\n panelHeading: {\r\n display: 'flex',\r\n },\r\n panelTitle: {\r\n flexGrow: 0,\r\n },\r\n seeAll: {\r\n overflow: 'visible',\r\n maxWidth: '50px',\r\n },\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\n\r\nexport const DescriptionView = ({\r\n i18n,\r\n selectedImgExtensionsForAssociation,\r\n limit,\r\n className,\r\n}) => {\r\n let localizedText;\r\n\r\n if (_.size(selectedImgExtensionsForAssociation) === 0) {\r\n localizedText = i18n.getString(_TL_('You don\\'t have any image extensions associated with this ad group. Increase ad performance by adding images to your ads.'));\r\n } else {\r\n localizedText = i18n.getString(\r\n _TL_('You can preview what your ad will look like with image extensions already associated with this ad group. Max {{limit}} image extensions per ad group.'),\r\n { limit }\r\n );\r\n }\r\n\r\n return (<div className={className}>{localizedText}</div>);\r\n};\r\n\r\nDescriptionView.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n selectedImgExtensionsForAssociation: PropTypes.arrayOf(PropTypes.any),\r\n className: PropTypes.string,\r\n limit: PropTypes.number,\r\n};\r\n\r\nDescriptionView.defaultProps = {\r\n selectedImgExtensionsForAssociation: [],\r\n className: '',\r\n limit: 0,\r\n};\r\n","import _ from 'underscore';\r\n\r\nconst getUriWithParam = (baseUrl, params) => {\r\n const Url = new URL(baseUrl);\r\n const urlParams = new URLSearchParams(Url.search);\r\n\r\n Object.keys(params).forEach((key) => {\r\n urlParams.set(key, params[key]);\r\n });\r\n\r\n Url.search = urlParams.toString();\r\n\r\n return Url.toString();\r\n};\r\n\r\nconst getThumbnailServiceUrl = (bingUrl, w, h) =>\r\n getUriWithParam(bingUrl, { w, h, c: 16 }); // &c=16 means smart crop\r\n\r\nexport const IMAGE_WIDTH_PX = 126;\r\nexport const IMAGE_HEIGHT_PX = 71;\r\n\r\nexport const getImageExtensionItemThumbnailUrl =\r\n (item) => {\r\n // using the 1.78:1 ratio to create the thumbnail\r\n const itemImage = _.find(item.Images, image => image.Asset.SubType === 'ImageMedia178X100');\r\n\r\n if (itemImage) {\r\n return getThumbnailServiceUrl(itemImage.Asset.ImageUrl, IMAGE_WIDTH_PX, IMAGE_HEIGHT_PX);\r\n }\r\n\r\n return null;\r\n };\r\n","import { IMAGE_WIDTH_PX, IMAGE_HEIGHT_PX } from '../components/utils/parser';\r\n\r\nexport const ITEM_MARGIN = 10;\r\n\r\nexport const getImageExtensionListStyles = () => ({\r\n listContainer: ({ cellWidth, cellHeight }) => ({\r\n '& .ms-List-cell': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: cellWidth,\r\n height: cellHeight,\r\n },\r\n '& .ms-List-page': {\r\n display: 'inline-flex',\r\n flexWrap: 'wrap',\r\n gap: '10px',\r\n paddingBottom: '10px',\r\n },\r\n }),\r\n});\r\n\r\nexport const getImageExtensionItemStyles = (components, { palette }) => {\r\n const itemZIndex = 1;\r\n const styles = {\r\n itemContainer: {\r\n position: 'relative',\r\n '&.hovered:not(.disabled), &.selected': {\r\n '& $selectRadio': {\r\n display: 'block',\r\n },\r\n },\r\n\r\n '&.hovered .image-extension-item': {\r\n cursor: 'pointer',\r\n },\r\n\r\n '&.disabled .image-extension-item': {\r\n pointerEvents: 'none',\r\n opacity: 0.4,\r\n },\r\n\r\n // there is a gap because of fractional width in chrome between parent and image.\r\n // so use pseudo class to draw the border\r\n '&.hovered .image-extension-item:after, &.selected .image-extension-item:after': {\r\n content: '\"\"',\r\n borderStyle: 'solid',\r\n borderWidth: 2,\r\n position: 'absolute',\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n top: 0,\r\n borderColor: palette.themePrimary,\r\n borderRadius: '5%',\r\n },\r\n\r\n },\r\n imageExtensionItem: {\r\n position: 'relative',\r\n zIndex: itemZIndex,\r\n width: IMAGE_WIDTH_PX,\r\n height: IMAGE_HEIGHT_PX,\r\n },\r\n\r\n btnItem: {\r\n color: palette.themePrimary,\r\n backgroundColor: palette.white,\r\n border: 'none',\r\n },\r\n textItem: {\r\n textDecoration: 'underline',\r\n },\r\n\r\n selectRadio: {\r\n position: 'absolute',\r\n top: 4,\r\n left: 100,\r\n zIndex: 1,\r\n display: 'none',\r\n\r\n '& :checked': {\r\n display: 'block',\r\n },\r\n },\r\n imageContainer: {\r\n borderRadius: '5%',\r\n boxShadow: '0px 0.3px 0.9px rgba(0, 0, 0, 0.1), 0px 1.6px 3.6px rgba(0, 0, 0, 0.13)',\r\n },\r\n deleteButton: {\r\n fontSize: 16,\r\n padding: 8,\r\n position: 'absolute',\r\n left: 86,\r\n top: 36,\r\n\r\n '&.circular-hover': {\r\n backgroundColor: `${palette.white}d4`,\r\n borderRadius: '50%',\r\n display: 'inline-flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n zIndex: itemZIndex + 1, // need to greater so that it can be clicked\r\n },\r\n\r\n '&.circular-hover:hover': {\r\n backgroundColor: `${palette.themeDarkAlt}ff`,\r\n cursor: 'pointer',\r\n\r\n '&:before': {\r\n color: palette.white,\r\n },\r\n },\r\n },\r\n editButton: {\r\n fontSize: 16,\r\n padding: 8,\r\n position: 'absolute',\r\n left: 8,\r\n top: 36,\r\n\r\n '&.circular-hover': {\r\n backgroundColor: `${palette.white}d4`,\r\n borderRadius: '50%',\r\n display: 'inline-flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n zIndex: itemZIndex + 1,\r\n },\r\n\r\n '&.circular-hover:hover': {\r\n backgroundColor: `${palette.themeDarkAlt}ff`,\r\n cursor: 'pointer',\r\n\r\n '&:before': {\r\n color: palette.white,\r\n },\r\n },\r\n },\r\n noImageFallbackContainer: {\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n justifyItems: 'center',\r\n alignItems: 'center',\r\n backgroundColor: palette.neutralLighter,\r\n\r\n '& svg': {\r\n width: 32,\r\n height: 32,\r\n marginLeft: 'auto',\r\n marginRight: 'auto',\r\n },\r\n },\r\n };\r\n\r\n return styles;\r\n};\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { submitEvent } from '@bingads-webui-universal/accessibility-helper';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { Image } from '@bingads-webui-react/fabric-control';\r\nimport { Glyphicon } from '@bingads-webui-react/primitive';\r\nimport { ConditionalTooltipHost } from '@bingads-webui-campaign-react/conditional-tooltip-host';\r\n\r\nimport { getImageExtensionItemStyles } from '../styles/image-extensions-list-style';\r\nimport { getImageExtensionItemThumbnailUrl } from './utils/parser';\r\n\r\nexport function ImageExtensionItemPreview({\r\n i18n,\r\n onDelete,\r\n onSelect,\r\n onEditImage,\r\n enableEdit,\r\n index,\r\n item,\r\n}) {\r\n const classes = useDefaultStyles(getImageExtensionItemStyles);\r\n const [hovered, setHovered] = useState(false);\r\n const toggleHoverState = () => { setHovered(!hovered); };\r\n const imageUrl = getImageExtensionItemThumbnailUrl(item);\r\n\r\n const disabledToggleToolTip = <div>{i18n.getString(_TL_('To use your image recommendations, you must enable '))}<b>{i18n.getString(_TL_('Automatically pull images from my Final URL.'))}</b></div>;\r\n\r\n return (\r\n <ConditionalTooltipHost\r\n condition={!!item.disabled}\r\n content={disabledToggleToolTip}\r\n calloutProps={{ gapSpace: 8 }}\r\n >\r\n <div\r\n className={classnames(\r\n classes.itemContainer,\r\n 'image-extension-container',\r\n item.selected && 'selected',\r\n item.disabled && 'disabled',\r\n !item.disabled && hovered && 'hovered'\r\n )}\r\n onMouseEnter={hovered ? undefined : toggleHoverState}\r\n onMouseLeave={hovered ? toggleHoverState : undefined}\r\n >\r\n <div\r\n className={classnames(classes.imageExtensionItem, 'image-extension-item')}\r\n onClick={() => onSelect(index)}\r\n key={imageUrl}\r\n role=\"option\"\r\n aria-selected={item.selected}\r\n id={`listbox-image-extension${index + 1}`}\r\n tabIndex={index === 0 ? 0 : -1}\r\n onKeyDown={submitEvent(() => onSelect(index))}\r\n data-is-focusable\r\n >\r\n { imageUrl ?\r\n <Image\r\n className={classes.imageContainer}\r\n src={imageUrl}\r\n alt={item.AltText}\r\n /> :\r\n <div className={classes.noImageFallbackContainer}>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 2048 2048\">\r\n <path d=\"M1408 1600v-320h128v320h-128zm0 192v-128h128v128h-128zM0 128h2048v1434l-128-256V256H128v677l448-447 572 572-60 120-512-512-448 449v421h781l-64 128H0V128zm1600 384q-26 0-45-19t-19-45q0-26 19-45t45-19q26 0 45 19t19 45q0 26-19 45t-45 19zM896 1920l576-1152 576 1152H896zm181-112h790l-395-790-395 790z\" />\r\n </svg>\r\n </div>\r\n }\r\n </div>\r\n <input\r\n aria-label=\"select-extension\"\r\n type=\"radio\"\r\n checked={item.selected}\r\n onChange={() => onSelect(index)}\r\n className={classnames(classes.selectRadio, 'image-extension-select')}\r\n />\r\n <Glyphicon\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onDelete(item);\r\n }}\r\n className={classnames(classes.deleteButton, 'image-extension-delete circular-hover')}\r\n glyph=\"ba-Cancel\"\r\n iconStyle=\"primary\"\r\n data-is-focusable\r\n />\r\n {enableEdit && <Glyphicon\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onEditImage(item, index);\r\n }}\r\n className={classnames(classes.editButton, 'image-extension-edit circular-hover')}\r\n glyph=\"ba-Edit\"\r\n iconStyle=\"primary\"\r\n data-is-focusable\r\n />}\r\n </div>\r\n </ConditionalTooltipHost>\r\n );\r\n}\r\n\r\nImageExtensionItemPreview.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n onDelete: PropTypes.func.isRequired,\r\n onSelect: PropTypes.func.isRequired,\r\n onEditImage: PropTypes.func.isRequired,\r\n enableEdit: PropTypes.bool.isRequired,\r\n item: PropTypes.shape({\r\n AltText: PropTypes.string,\r\n selected: PropTypes.bool,\r\n disabled: PropTypes.bool,\r\n }).isRequired,\r\n index: PropTypes.number.isRequired,\r\n};\r\n\r\nImageExtensionItemPreview.defaultProps = {\r\n};\r\n\r\n","import React 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 { FontIcon } from '@bingads-webui-react/fabric-control';\r\nimport { getImageExtensionItemStyles } from '../styles/image-extensions-list-style';\r\n\r\nexport function ImageExtensionItemSeeMoreLess({\r\n i18n,\r\n onSelectShowAll,\r\n seeMoreItemsCount,\r\n seeLess,\r\n}) {\r\n const classes = useDefaultStyles(getImageExtensionItemStyles);\r\n const text = seeLess\r\n ? i18n.getString(_TL_('See less'))\r\n : `+ ${seeMoreItemsCount} `.concat(i18n.getString(_TL_('more')));\r\n\r\n return (\r\n <div className={classnames(classes.imageExtensionContainer, 'image-extension-container')}>\r\n <button\r\n role=\"link\"\r\n className={classnames(classes.btnItem, seeLess ? `${classes.textItem} see-less-link` : 'see-more-link')}\r\n onClick={() => onSelectShowAll(!seeLess)}\r\n onKeyDown={() => onSelectShowAll(!seeLess)}\r\n aria-label={text}\r\n >\r\n { !seeLess &&\r\n <div className=\"see-more-icon\">\r\n <FontIcon iconName=\"ViewAll\" />\r\n </div>\r\n }\r\n <div>{text}</div>\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\nImageExtensionItemSeeMoreLess.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n onSelectShowAll: PropTypes.func.isRequired,\r\n seeMoreItemsCount: PropTypes.number.isRequired,\r\n seeLess: PropTypes.bool,\r\n};\r\n\r\nImageExtensionItemSeeMoreLess.defaultProps = {\r\n seeLess: false,\r\n};\r\n","import React, { useEffect, useState, useRef, useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport classnames from 'classnames';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { List, FocusZone } from '@bingads-webui-react/fabric-control';\r\nimport { ImageExtensionItemPreview } from './image-extension-item-preview';\r\nimport { ImageExtensionItemSeeMoreLess } from './image-extension-item-see-more-less';\r\nimport { getImageExtensionListStyles, ITEM_MARGIN } from '../styles/image-extensions-list-style';\r\nimport { IMAGE_WIDTH_PX, IMAGE_HEIGHT_PX } from './utils/parser';\r\n\r\nexport const ImageExtensionsList = ({\r\n i18n,\r\n items,\r\n className,\r\n onDelete,\r\n onSelect,\r\n onEditImage,\r\n enableEdit,\r\n}) => {\r\n const classes = useDefaultStyles(getImageExtensionListStyles, {\r\n cellWidth: IMAGE_WIDTH_PX,\r\n cellHeight: IMAGE_HEIGHT_PX,\r\n });\r\n const [imageContainerWidth, setImageContainerWidth] = useState(0);\r\n const imageContainerNode = useRef(null);\r\n const [showAll, setShowAll] = useState(false);\r\n const itemsSize = _.size(items);\r\n const initialItemCount = Math.floor((imageContainerWidth + ITEM_MARGIN)\r\n / (IMAGE_WIDTH_PX + ITEM_MARGIN)) * 2;\r\n const hasSeeMoreLess = itemsSize > initialItemCount;\r\n\r\n useEffect(() => {\r\n const handleResize = () => {\r\n if (imageContainerNode.current) {\r\n setImageContainerWidth(imageContainerNode.current.offsetWidth);\r\n }\r\n };\r\n\r\n window.addEventListener('resize', handleResize);\r\n\r\n return () => {\r\n window.removeEventListener('resize', handleResize);\r\n };\r\n }, []);\r\n\r\n const measuredRef = useCallback((node) => {\r\n if (node) {\r\n imageContainerNode.current = node;\r\n setImageContainerWidth(imageContainerNode.current.offsetWidth);\r\n }\r\n }, []);\r\n\r\n const CELL_TYPE = {\r\n MORE: 'more',\r\n LESS: 'less',\r\n EXTENSION: 'extension',\r\n };\r\n\r\n const getCellType = (index) => {\r\n const isSeeMoreItem = !showAll && index === initialItemCount - 1 && hasSeeMoreLess;\r\n const isSeeLessItem = showAll && index === itemsSize && hasSeeMoreLess;\r\n\r\n if (isSeeMoreItem) {\r\n return CELL_TYPE.MORE;\r\n } else if (isSeeLessItem) {\r\n return CELL_TYPE.LESS;\r\n }\r\n return CELL_TYPE.EXTENSION;\r\n };\r\n\r\n const onRenderCell = (item, index) => {\r\n const cellType = getCellType(index);\r\n switch (cellType) {\r\n case CELL_TYPE.MORE:\r\n return (<ImageExtensionItemSeeMoreLess\r\n i18n={i18n}\r\n onSelectShowAll={setShowAll}\r\n seeMoreItemsCount={(itemsSize - (initialItemCount - 1))}\r\n />);\r\n case CELL_TYPE.LESS:\r\n return (<ImageExtensionItemSeeMoreLess\r\n i18n={i18n}\r\n onSelectShowAll={setShowAll}\r\n seeLess={showAll}\r\n />);\r\n default:\r\n return (<ImageExtensionItemPreview\r\n onDelete={onDelete}\r\n onSelect={onSelect}\r\n onEditImage={onEditImage}\r\n enableEdit={enableEdit}\r\n item={item}\r\n index={index}\r\n i18n={i18n}\r\n />);\r\n }\r\n };\r\n\r\n return (\r\n !_.isEmpty(items) &&\r\n <div className={classnames(className, classes.listContainer)} ref={measuredRef}>\r\n <FocusZone>\r\n <List\r\n className={className}\r\n items={_.compact(_.union(items, [hasSeeMoreLess]))}\r\n onRenderCell={onRenderCell}\r\n renderCount={showAll ? itemsSize + 1 : initialItemCount}\r\n getItemCountForPage={() => initialItemCount}\r\n role=\"listbox\"\r\n aria-label={i18n.getString(_TL_('Image extensions'))}\r\n />\r\n </FocusZone>\r\n </div>\r\n );\r\n};\r\n\r\nImageExtensionsList.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n items: PropTypes.arrayOf(PropTypes.shape({})),\r\n onSelect: PropTypes.func,\r\n onDelete: PropTypes.func,\r\n onEditImage: PropTypes.func.isRequired,\r\n enableEdit: PropTypes.bool,\r\n className: PropTypes.string,\r\n};\r\n\r\nImageExtensionsList.defaultProps = {\r\n items: [],\r\n onSelect: null,\r\n onDelete: null,\r\n className: '',\r\n enableEdit: false,\r\n};\r\n","import { customizedUIBlockerStyle } from './customize-ui-blocker-style';\r\n\r\nexport const getDialogImageExtensionStyle = (components, { palette }) => (\r\n {\r\n labelContainer: {\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n },\r\n description: {\r\n paddingBottom: 5,\r\n },\r\n container: {\r\n ...components.reactUIBlockerStyle(palette),\r\n ...customizedUIBlockerStyle,\r\n },\r\n }\r\n);\r\n","import _ from 'underscore';\r\n\r\nexport const DefaultImageAltText = 'Image';\r\n\r\nexport const FieldType = {\r\n DisplayText: 'DisplayText',\r\n AltText: 'AltText',\r\n};\r\n\r\nexport const FieldLimit = {\r\n DisplayText: 35,\r\n AltText: 90,\r\n};\r\n\r\nconst requiredValidateFunc = val => _.size(val) > 0 && val.trim() !== '';\r\n\r\nexport const fieldsConfig = [\r\n {\r\n type: FieldType.DisplayText,\r\n limit: FieldLimit.DisplayText,\r\n labelKeyForLocalization: _TL_('Name/Display Text'),\r\n helpTopic: 'pop_BA_ImageExtension_Name',\r\n description: _TL_('Display text appears to customers as a caption below images in the multi-image layout.'),\r\n },\r\n {\r\n type: FieldType.AltText,\r\n limit: FieldLimit.AltText,\r\n labelKeyForLocalization: _TL_('Image Alt Text (required)'),\r\n helpTopic: 'pop_BA_NewAdCreate_AltText',\r\n description: _TL_('Alt text appears when customers hover over the image on search results pages.'),\r\n required: true,\r\n validators: [\r\n {\r\n validate: requiredValidateFunc,\r\n msg: _TL_('Image Alt Text is required.'),\r\n },\r\n ],\r\n },\r\n];\r\n\r\nconst runValidators = (value, validators) => {\r\n for (let i = 0; i < _.size(validators); i += 1) {\r\n const { validate, msg } = validators[i];\r\n if (!validate(value)) {\r\n return msg;\r\n }\r\n }\r\n\r\n return '';\r\n};\r\n\r\nexport const validateAllFields = (fieldValues, callback) => {\r\n const errors = {};\r\n _.each(fieldsConfig, ({ validators, type }) => {\r\n const msg = runValidators(fieldValues[type], validators);\r\n\r\n if (msg) {\r\n errors[type] = msg;\r\n }\r\n });\r\n\r\n callback(errors);\r\n\r\n return errors;\r\n};\r\n\r\nexport const validateField = (fieldType, fieldValue, callback) => {\r\n const errors = {};\r\n const fieldConfig = _.find(fieldsConfig, field => field.type === fieldType);\r\n const msg = runValidators(fieldValue, fieldConfig.validators);\r\n\r\n if (msg) {\r\n errors[fieldConfig.type] = msg;\r\n }\r\n\r\n callback(errors);\r\n\r\n return errors;\r\n};\r\n","import React, { useCallback, useState, useMemo, useEffect, Fragment } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport classnames from 'classnames';\r\nimport Promise from 'bluebird';\r\nimport {\r\n Dialog, DialogFooter,\r\n PrimaryButton, DefaultButton,\r\n TextField,\r\n Stack,\r\n} from '@bingads-webui-react/fabric-control';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { HelpPopupInline } from '@bingads-webui-react/help-popup';\r\nimport { UiBlocker } from '@bingads-webui-react/ui-blocker';\r\nimport { getDialogImageExtensionStyle } from '../styles/image-extension-dialog-style';\r\nimport {\r\n fieldsConfig,\r\n validateAllFields,\r\n validateField,\r\n FieldType,\r\n FieldLimit,\r\n DefaultImageAltText,\r\n} from './image-extension-fields-config';\r\n\r\nexport const CreateImageExtensionDialog = ({\r\n i18n,\r\n createImageExtension,\r\n selectedImage,\r\n onCreateSuccess,\r\n onCancel,\r\n adCreatorScenario,\r\n permissions,\r\n}) => {\r\n const isImageAltTextPrefillEnabled = _.result(permissions, ['dynamic', 'ImageAltTextPrefill'], false);\r\n\r\n const dialogContentProps = { title: i18n.getString(_TL_('New image extension')) };\r\n const classes = useDefaultStyles(getDialogImageExtensionStyle);\r\n const [loading, setLoading] = useState(false);\r\n\r\n const [fieldValues, setFieldValues] = useState({});\r\n const [fieldErrors, setFieldErrors] = useState({});\r\n\r\n const [disableCreate, setDisableCreate] = useState(false);\r\n\r\n const logActivity = useMemo(() => {\r\n if (adCreatorScenario && adCreatorScenario.createActivity) {\r\n return adCreatorScenario.createActivity('New image to extension');\r\n }\r\n return null;\r\n }, [adCreatorScenario]);\r\n\r\n const logTrace = useCallback((...args) => {\r\n if (logActivity) {\r\n logActivity.trace(...args);\r\n }\r\n }, [logActivity]);\r\n\r\n const onCreateButtonClicked = useCallback(() => {\r\n const errors = validateAllFields(fieldValues, setFieldErrors);\r\n\r\n if (_.isEmpty(errors)) {\r\n setLoading(true);\r\n // After a design change, createImageExtension is sync. Keep promise to support both modes\r\n Promise.resolve(createImageExtension(fieldValues, selectedImage))\r\n .finally(() => {\r\n setLoading(false);\r\n })\r\n .then(() => {\r\n logTrace('New image extension dialog - Save button clicked');\r\n onCreateSuccess();\r\n });\r\n } else {\r\n logTrace(`New image extension dialog - failed to save, errors: ${JSON.stringify(errors)}`);\r\n setDisableCreate(true);\r\n }\r\n });\r\n\r\n const onFieldChangeFactory = (type, limit) => (e, newValue) => {\r\n if (_.size(newValue) <= limit) {\r\n setFieldValues({\r\n ...fieldValues,\r\n [type]: newValue,\r\n });\r\n }\r\n const errors = validateField(type, newValue, setFieldErrors);\r\n if (_.isEmpty(errors)) {\r\n setDisableCreate(false);\r\n }\r\n };\r\n\r\n const onCancelClick = useCallback(() => {\r\n logTrace('New image extension dialog - Cancel button clicked');\r\n onCancel();\r\n }, [logTrace, onCancel]);\r\n\r\n const onDismiss = useCallback(() => {\r\n logTrace('New image extension dialog - Dialog dismissed');\r\n onCancel();\r\n }, [logTrace, onCancel]);\r\n\r\n useEffect(() => {\r\n logTrace('New image extension dialog - Dialog is shown');\r\n }, [logTrace]);\r\n\r\n useEffect(() => {\r\n if (isImageAltTextPrefillEnabled) {\r\n let prefillAltText = DefaultImageAltText;\r\n const imageName = _.result(selectedImage, ['0', 'text'], null);\r\n if (imageName && _.isString(imageName) && _.size(imageName.trim()) > 0 && _.size(imageName.trim()) <= FieldLimit.AltText) {\r\n prefillAltText = imageName.trim();\r\n }\r\n\r\n setFieldValues({\r\n ...fieldValues,\r\n [FieldType.AltText]: prefillAltText,\r\n });\r\n validateField(FieldType.AltText, prefillAltText, setFieldErrors);\r\n }\r\n // Only prefill image alt text in the beginning\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <Dialog\r\n hidden={false}\r\n onDismiss={onDismiss}\r\n dialogContentProps={dialogContentProps}\r\n modalProps={{\r\n isBlocking: true,\r\n topOffsetFixed: true,\r\n className: classnames(classes.container, 'create-img-ex-dialog'),\r\n }}\r\n minWidth={420}\r\n isClickableOutsideFocusTrap\r\n >\r\n <UiBlocker\r\n blocking={loading}\r\n loadingText={i18n.getString(_TL_('Creating ...'))}\r\n >\r\n <Stack tokens={{ childrenGap: 24 }}>\r\n {\r\n fieldsConfig.map((field) => {\r\n const {\r\n type,\r\n limit,\r\n labelKeyForLocalization,\r\n description,\r\n helpTopic,\r\n required,\r\n } = field;\r\n const placeholder = i18n.getString(_TL_('{{limit}} characters max'), { limit });\r\n\r\n return (\r\n <TextField\r\n className={`property-${type}`}\r\n key={type}\r\n label={i18n.getString(labelKeyForLocalization)}\r\n onRenderLabel={(props, originalRenderer) => (\r\n <Fragment>\r\n <div className={classes.labelContainer}>\r\n {originalRenderer(props)}\r\n <HelpPopupInline topic={helpTopic} ariaLabel={i18n.getString(_TL_('Learn more'))} />\r\n </div>\r\n {description &&\r\n <div className={classes.description}>\r\n {i18n.getString(description)}\r\n </div>\r\n }\r\n </Fragment>\r\n )}\r\n placeholder={placeholder}\r\n onChange={onFieldChangeFactory(type, limit)}\r\n errorMessage={fieldErrors[type] ? i18n.getString(fieldErrors[type]) : ''}\r\n value={fieldValues[type] || ''}\r\n required={required}\r\n />\r\n );\r\n })\r\n }\r\n </Stack>\r\n\r\n <DialogFooter>\r\n <PrimaryButton\r\n onClick={onCreateButtonClicked}\r\n text={i18n.getString(_TL_('Save'))}\r\n disabled={disableCreate}\r\n />\r\n <DefaultButton onClick={onCancelClick} text={i18n.getString(_TL_('Cancel'))} />\r\n </DialogFooter>\r\n </UiBlocker>\r\n </Dialog>\r\n );\r\n};\r\n\r\nCreateImageExtensionDialog.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n createImageExtension: PropTypes.func.isRequired,\r\n selectedImage: PropTypes.arrayOf(PropTypes.any).isRequired,\r\n onCreateSuccess: PropTypes.func.isRequired,\r\n onCancel: PropTypes.func.isRequired,\r\n adCreatorScenario: PropTypes.shape({}),\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({\r\n }),\r\n }),\r\n};\r\n\r\nCreateImageExtensionDialog.defaultProps = {\r\n adCreatorScenario: undefined,\r\n permissions: {},\r\n};\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport Promise from 'bluebird';\r\nimport {\r\n Dialog, DialogFooter,\r\n PrimaryButton, DefaultButton,\r\n} from '@bingads-webui-react/fabric-control';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { UiBlocker } from '@bingads-webui-react/ui-blocker';\r\nimport { getDialogImageExtensionStyle } from '../styles/image-extension-dialog-style';\r\n\r\nexport const DeleteImageExtensionDialog = ({\r\n i18n,\r\n deleteImageExtension,\r\n selectedImageDelete,\r\n onDeleteSuccess,\r\n onCancel,\r\n}) => {\r\n const dialogContentProps = { title: i18n.getString(_TL_('Are you sure?')) };\r\n const classes = useDefaultStyles(getDialogImageExtensionStyle);\r\n const [loading, setLoading] = useState(false);\r\n\r\n const onDeleteButtonClicked = () => {\r\n setLoading(true);\r\n // After a design change, deleteImageExtension is sync. Keep promise to support both modes\r\n Promise.resolve(deleteImageExtension(selectedImageDelete))\r\n .finally(() => {\r\n setLoading(false);\r\n })\r\n .then(() => {\r\n onDeleteSuccess();\r\n });\r\n };\r\n\r\n return (\r\n <Dialog\r\n hidden={false}\r\n onDismiss={onCancel}\r\n dialogContentProps={dialogContentProps}\r\n modalProps={{\r\n isBlocking: true,\r\n topOffsetFixed: true,\r\n className: classnames(classes.container, 'delete-img-ex-dialog'),\r\n }}\r\n minWidth={420}\r\n isClickableOutsideFocusTrap\r\n >\r\n <UiBlocker\r\n blocking={loading}\r\n loadingText={i18n.getString(_TL_('Deleting ...'))}\r\n >\r\n <div>{i18n.getString(_TL_('Deleting this image extension will remove it from all ads in this ad group that use it but will not delete it from your image extension library. Are you sure you want to remove this image extension from your ad?'))}</div>\r\n <DialogFooter>\r\n <PrimaryButton\r\n onClick={onDeleteButtonClicked}\r\n text={i18n.getString(_TL_('Yes, delete'))}\r\n />\r\n <DefaultButton onClick={onCancel} text={i18n.getString(_TL_('Cancel'))} />\r\n </DialogFooter>\r\n </UiBlocker>\r\n </Dialog>\r\n );\r\n};\r\n\r\nDeleteImageExtensionDialog.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n deleteImageExtension: PropTypes.func.isRequired,\r\n selectedImageDelete: PropTypes.shape({\r\n Id: PropTypes.number,\r\n Asset: PropTypes.shape({\r\n Id: PropTypes.number.isRequired,\r\n IdString: PropTypes.string.isRequired,\r\n ImageUrl: PropTypes.string.isRequired,\r\n }),\r\n }).isRequired,\r\n onDeleteSuccess: PropTypes.func.isRequired,\r\n onCancel: PropTypes.func.isRequired,\r\n};\r\n\r\nDeleteImageExtensionDialog.defaultProps = {\r\n};\r\n","import _ from 'underscore';\r\nimport { constants } from '@bingads-webui-campaign-react/image-experience';\r\n\r\nexport const getImagesFromImageList = imageList => (\r\n _.map(imageList, imageObj => (\r\n {\r\n Id: '',\r\n Asset: {\r\n '@odata.type': '#Model.ImageAsset',\r\n Id: imageObj.Id,\r\n IdString: imageObj.IdString,\r\n SubType: constants.aspectRatios[imageObj.Type].associationType,\r\n CropX: imageObj.CropSettings.SourceX,\r\n CropY: imageObj.CropSettings.SourceY,\r\n CropHeight: imageObj.CropSettings.SourceHeight,\r\n CropWidth: imageObj.CropSettings.SourceWidth,\r\n ImageUrl: imageObj.Src,\r\n },\r\n }\r\n ))\r\n);\r\n\r\nexport const createImageExtensionMtModel = (fieldValues, imageList) => ({\r\n AltText: fieldValues.AltText,\r\n DisplayText: fieldValues.DisplayText,\r\n EligibleLayout: 'Single',\r\n Images: getImagesFromImageList(imageList),\r\n Scheduling: {},\r\n});\r\n\r\n// if Id exists, means item is an existing association\r\nexport const isImageExtensionCommitedToServer = item => !!item.Id;\r\n\r\nexport const extractImageExtensionCreationMtFields = model => _.pick(model, [\r\n 'AltText',\r\n 'DisplayText',\r\n 'EligibleLayout',\r\n 'Images',\r\n 'Scheduling',\r\n]);\r\n","import React, { useCallback, useState, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { map, extend, chain } from 'underscore';\r\nimport { DefaultButton, Panel, PanelType, Stack } from '@fluentui/react';\r\nimport { IconButton } from '@bingads-webui-react/fabric-control';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { FluentImagePicker } from '@bingads-webui-campaign-react/fluent-image-picker';\r\nimport { panelStylesProp } from '@bingads-webui-campaign-react/asset-library-shared-add-media-layout';\r\nimport { CopilotTab, CopilotTabItem } from '@bingads-webui/inline-copilot-ui';\r\nimport { FluentProvider, webLightTheme } from '@fluentui/react-components';\r\n\r\nexport const getImageSuggestionPanelStyles = () => ({\r\n panel: {\r\n top: 60,\r\n },\r\n panelHeader: {\r\n paddingLeft: 32,\r\n paddingRight: 24,\r\n alignSelf: 'justify-start',\r\n flexGrow: 1,\r\n },\r\n panelTitle: {\r\n fontSize: 20,\r\n fontWeight: 600,\r\n display: 'inline-block',\r\n lineHeight: '27px',\r\n paddingBottom: 20,\r\n },\r\n backButton: {\r\n display: 'inline-block',\r\n paddingRight: 10,\r\n },\r\n theme: {\r\n marginBottom: 14,\r\n marginLeft: 4,\r\n },\r\n buttonContainer: {\r\n alignItems: 'center',\r\n },\r\n errorMessage: {\r\n marginTop: 16,\r\n },\r\n});\r\n\r\nexport const imageSuggestionPanelWidth = '920px';\r\n\r\nexport const ImageRecommendationsPanel = (props) => {\r\n const {\r\n i18n,\r\n title,\r\n images,\r\n themes,\r\n onSelectImage,\r\n onDismiss,\r\n loadNextPage,\r\n hasMore,\r\n } = props;\r\n\r\n const classes = useDefaultStyles(getImageSuggestionPanelStyles);\r\n const [activeImages, setActiveImages] = useState(images);\r\n const [activeTheme, setActiveTheme] = useState(i18n.getString(_TL_('All')));\r\n const themeNames = useMemo(() => [\r\n ...map(themes, ({ name }) => name),\r\n ], [themes]);\r\n\r\n const onSwitchTheme = useCallback((key) => {\r\n setActiveTheme(key);\r\n if (key === i18n.getString(_TL_('All'))) {\r\n setActiveImages(images);\r\n } else {\r\n const rawImages = chain(themes)\r\n .filter(theme => theme.name === key)\r\n .first()\r\n .result('images')\r\n .map(img => extend({}, img))\r\n .value();\r\n setActiveImages(rawImages);\r\n }\r\n }, [i18n, images, themes]);\r\n\r\n\r\n const onClickCancel = useCallback((e) => {\r\n onDismiss(e);\r\n }, [onDismiss]);\r\n\r\n const onRenderHeader = useCallback(() => (\r\n <div className={classes.panelHeader}>\r\n <div className={classes.backButton}>\r\n <IconButton iconProps={{ iconName: 'Back' }} className=\"back-button\" onClick={onClickCancel} />\r\n </div>\r\n <div className={classes.panelTitle}>\r\n {i18n.getString(title)}\r\n </div>\r\n </div>\r\n ), [classes.backButton, classes.panelHeader, classes.panelTitle, i18n, onClickCancel, title]);\r\n\r\n const onRenderFooterContent = useCallback(() => (\r\n <Stack className={classnames('image-recommendations-panel-buttons', classes.buttonContainer)} horizontal tokens={{ childrenGap: 8 }}>\r\n <Stack.Item key=\"btn-cancel\">\r\n <DefaultButton className=\"btn-cancel\" onClick={onClickCancel}>\r\n {i18n.getString(_TL_('Cancel'))}\r\n </DefaultButton>\r\n </Stack.Item>\r\n\r\n </Stack>\r\n ), [classes.buttonContainer, i18n, onClickCancel]);\r\n\r\n const onSelectImageInternal = useCallback((index) => {\r\n const { fullUrl, suggestionId } = activeImages[index];\r\n onDismiss();\r\n onSelectImage(fullUrl, index, suggestionId);\r\n }, [activeImages, onDismiss, onSelectImage]);\r\n\r\n return (\r\n <Panel\r\n onRenderHeader={onRenderHeader}\r\n isOpen\r\n onDismiss={onClickCancel}\r\n onRenderFooterContent={onRenderFooterContent}\r\n isFooterAtBottom\r\n type={PanelType.custom}\r\n customWidth={imageSuggestionPanelWidth}\r\n styles={panelStylesProp}\r\n className=\"image-recommendations-panel\"\r\n >\r\n <FluentProvider theme={webLightTheme}>\r\n <div className={classes.theme}>\r\n <CopilotTab\r\n active={activeTheme}\r\n onActiveChange={key => onSwitchTheme(key)}\r\n >\r\n <CopilotTabItem tabKey={i18n.getString(_TL_('All'))}>\r\n {i18n.getString(_TL_('All'))}\r\n </CopilotTabItem>\r\n {map(themeNames, name => (\r\n <CopilotTabItem tabKey={name}>\r\n {name}\r\n </CopilotTabItem>\r\n ))}\r\n </CopilotTab>\r\n </div>\r\n </FluentProvider>\r\n <FluentImagePicker\r\n images={activeImages}\r\n pageSize={30}\r\n loadMoreImages={loadNextPage}\r\n onSelectImage={onSelectImageInternal}\r\n hasMoreImages={hasMore}\r\n imageCellWidth={260}\r\n imageCellHeight={243}\r\n />\r\n </Panel>);\r\n};\r\n\r\nImageRecommendationsPanel.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n title: PropTypes.string,\r\n images: PropTypes.arrayOf(PropTypes.shape({\r\n thumbnailSrc: PropTypes.string,\r\n fullUrl: PropTypes.string,\r\n suggestionId: PropTypes.string,\r\n })).isRequired,\r\n themes: PropTypes.arrayOf(PropTypes.shape({})),\r\n hasMore: PropTypes.bool.isRequired,\r\n loadNextPage: PropTypes.func.isRequired,\r\n onSelectImage: PropTypes.func.isRequired,\r\n onDismiss: PropTypes.func.isRequired,\r\n};\r\n\r\nImageRecommendationsPanel.defaultProps = {\r\n title: _TL_('Recommended images'),\r\n themes: [],\r\n};\r\n","import React, { useState, useContext, useMemo, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport _, { size, noop, reject } from 'underscore';\r\nimport { Stack, DefaultButton, Label, PrimaryButton, MessageBarType } from '@bingads-webui-react/fabric-control';\r\nimport { Panel } from '@bingads-webui-campaign-react/panel';\r\n\r\nimport { Glyphicon } from '@bingads-webui-react/primitive';\r\nimport { ExtensionImagesControl } from '@bingads-webui-campaign-react/extension-images-control';\r\nimport { HelpPopupInline } from '@bingads-webui-react/help-popup';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { UiBlocker } from '@bingads-webui-react/ui-blocker';\r\nimport { Alert } from '@bingads-webui-react/alert';\r\nimport { ImageSuggestionCarousel } from '@bingads-webui-campaign-react/image-suggestion-carousel';\r\nimport { getAdCreatorInstrumentation } from '@bingads-webui-campaign/ad-creator-tools-instrumentation';\r\nimport { SuggestionStatus } from '@bingads-webui-campaign/media-repository';\r\nimport { constants } from '@bingads-webui-campaign-react/image-experience-model';\r\nimport { AddImageCrudAdComponent } from '@bingads-webui-campaign-react/add-media-panel-crud-ad';\r\nimport { useImagePicker, useAssetLibraryImagePicker } from '@bingads-webui-campaign-react/add-image-hooks';\r\nimport { RecommendationContext } from '@bingads-webui-campaign/responsive-search-ad-recommendation';\r\nimport { getImageExtensionsPaneStyle, overrideImageRecommendationClasses } from './styles/image-extensions-pane-style';\r\nimport {\r\n DescriptionView,\r\n ImageExtensionsList,\r\n CreateImageExtensionDialog,\r\n DeleteImageExtensionDialog,\r\n ImageRecommendationsPanel,\r\n} from './components/index';\r\n\r\nconst { imageSources } = constants;\r\nconst MaxSuggestionsInCarousel = 15;\r\n\r\nexport const ImageExtensionsPaneView = ({\r\n loading,\r\n setLoading,\r\n selectedImgExtensionsForAssociation,\r\n onImgExtensionSelected,\r\n advertiserCustomerId,\r\n accountId,\r\n createImageExtension,\r\n deleteImageExtension,\r\n updateImageExtension,\r\n legacyI18n,\r\n dataModelUtil,\r\n imagePath,\r\n i18n,\r\n maxImageExtensionsPerAdGroup: limit,\r\n perfMarker,\r\n preferenceService,\r\n permissions,\r\n oDataConfig,\r\n suggestionState,\r\n dispatchSuggestionState,\r\n suggestionPoller,\r\n fullUrl,\r\n urlPrefix,\r\n onUpdateUrlPrefix,\r\n onUpdateUrlValue,\r\n\r\n instrumentation,\r\n adCreatorScenario,\r\n logActivity,\r\n dateFormat,\r\n timeZone,\r\n activityLogger,\r\n isAADUser,\r\n assetLibraryEventHandler,\r\n serverContext,\r\n}) => {\r\n const [addImageChildPerfmarker] = useState(() => perfMarker.createChild('imagePicker'));\r\n const classes = useDefaultStyles(getImageExtensionsPaneStyle);\r\n const {\r\n displayImagePicker,\r\n setDisplayImagePicker,\r\n displayWebsiteSuggestionTab,\r\n selectedMediaPanelSource,\r\n setSelectedMediaPanelSource,\r\n } = useImagePicker();\r\n const [displayCreateImageExtView, setDisplayCreateImageExtView] = useState(false);\r\n const [displayDeleteImageExtView, setDisplayDeleteImageExtView] = useState(false);\r\n const [selectedImage, setSelectedImage] = useState(null);\r\n const [selectedImageDelete, setSelectedImageDelete] = useState(null);\r\n const [selectedImageEligibleLayouts, setSelectedImageEligibleLayouts] = useState('');\r\n const [selectedImageEdit, setSelectedImageEdit] = useState([]);\r\n const [selectedImageEditIndex, setSelectedImageEditIndex] = useState(null);\r\n const [showEditPanel, setShowEditPanel] = useState(false);\r\n const emptyFinalUrl = !fullUrl || fullUrl === `${urlPrefix}://`;\r\n\r\n const reachLimit = limit > 0 && size(selectedImgExtensionsForAssociation) >= limit;\r\n\r\n const { websiteSuggestionCarouselActivity, adCreatorScenario: scenario, editImageActivity } =\r\n getAdCreatorInstrumentation(instrumentation, adCreatorScenario);\r\n\r\n const onEditImage = (item, index) => {\r\n editImageActivity.trace('click edit button for image extension in RSA');\r\n dataModelUtil.getImageListFromMTImagesAsync(item.Images).then((imageList) => {\r\n setSelectedImageEdit(imageList);\r\n setSelectedImageEditIndex(index);\r\n setSelectedImageEligibleLayouts(item.EligibleLayout);\r\n setShowEditPanel(true);\r\n });\r\n };\r\n\r\n const closeEditImageView = () => {\r\n setShowEditPanel(false);\r\n setSelectedImageEdit(null);\r\n setSelectedImageEditIndex(null);\r\n setSelectedImageEligibleLayouts('');\r\n };\r\n\r\n const onUpdateImage = () => {\r\n updateImageExtension(selectedImageEditIndex, selectedImageEdit);\r\n closeEditImageView();\r\n };\r\n\r\n const closeCreateImageExtView = () => {\r\n setDisplayCreateImageExtView(false);\r\n setSelectedImage(null);\r\n };\r\n\r\n const closeDeleteImageExtView = () => {\r\n setDisplayDeleteImageExtView(false);\r\n setSelectedImageDelete(null);\r\n };\r\n\r\n // two sources: add image panel / image recommendation carousel\r\n const onNewImageSelected = ([imagePlacements]) => {\r\n logActivity(`Under Image extensions: selected image from source ${imagePlacements[0].source}`);\r\n setSelectedImage(imagePlacements);\r\n setDisplayImagePicker(false);\r\n setDisplayCreateImageExtView(true);\r\n };\r\n\r\n const onDelete = (id) => {\r\n setSelectedImageDelete(id);\r\n setDisplayDeleteImageExtView(true);\r\n };\r\n\r\n const isAllUploadFlowImageUpscaleEnabled = useMemo(() => _.get(permissions, ['dynamic', 'AllUploadFlowImageUpscale']), [permissions]);\r\n\r\n const {\r\n imagePickerError,\r\n setImagePickerError,\r\n clearImagePickerError,\r\n uploadImage,\r\n processUploadedImage,\r\n onProcessUploadComplete,\r\n minSize,\r\n minUploadSize,\r\n supportImageUpscale,\r\n addImageByUrl,\r\n getStockImages,\r\n onSelectStockImage,\r\n onImageSelected,\r\n onImagesSelected,\r\n socialMediaDataSource,\r\n customMediaSourceConfig,\r\n } = useAssetLibraryImagePicker({\r\n cid: advertiserCustomerId.toString(),\r\n aid: accountId.toString(),\r\n oDataConfig,\r\n onNewImageSelected,\r\n i18n,\r\n permissions,\r\n serverContext,\r\n isAllUploadFlowImageUpscaleEnabled,\r\n });\r\n\r\n const { suggestion = {}, carousel = {} } = suggestionState;\r\n\r\n const { RSAImageExtensionCrop, RSAImageRecommendationReplace } = permissions && permissions.dynamic;\r\n\r\n const [recommendationContext] = useContext(RecommendationContext);\r\n const [imagesToSuggest, setImagesToSuggest] = useState([]);\r\n const [carouselErrorMessage, setCarouselErrorMessage] = useState({});\r\n const [isSuggestionsPanelOpen, setIsSuggestionsPanelOpen] = useState(false);\r\n\r\n const {\r\n imageAssets, themes, copilotTracking,\r\n } = recommendationContext;\r\n\r\n const { carouselState, panelState } = useMemo(() => ({\r\n carouselState: {\r\n carousel: {\r\n isError: _.isEmpty(imageAssets),\r\n images: imageAssets,\r\n },\r\n suggestion: {\r\n images: imageAssets,\r\n },\r\n },\r\n panelState: {\r\n panelImages: imageAssets,\r\n hasMore: false,\r\n },\r\n }), [imageAssets]);\r\n\r\n const { suggestion: suggestionFromCopilot, carousel: carouselFromCopilot } = carouselState || {};\r\n const { images: suggestionImages, inProgress: suggestionInProgress } = suggestionFromCopilot || {};\r\n\r\n useEffect(() => {\r\n const truncatedImages = _.isArray(suggestionImages) && suggestionImages.slice(0, MaxSuggestionsInCarousel);\r\n setImagesToSuggest(truncatedImages || []);\r\n }, [suggestionImages]);\r\n\r\n const messageInfo = RSAImageRecommendationReplace ? carouselErrorMessage : carousel.message;\r\n const isLoading = RSAImageRecommendationReplace ? suggestionInProgress : suggestion.inProgress;\r\n const images = (RSAImageRecommendationReplace ? imagesToSuggest : carousel.images) || [];\r\n const isEmpty = RSAImageRecommendationReplace ? carouselFromCopilot && carouselFromCopilot.isError : !!carousel.isError;\r\n\r\n const onSelectImage = (imageUrl, index, suggestionId) => {\r\n setLoading(true);\r\n\r\n if (RSAImageRecommendationReplace) {\r\n addImageByUrl(imageUrl, 'CopilotRecommendation')\r\n .then((result = {}) => {\r\n if (result && result.errorMessage) {\r\n setCarouselErrorMessage({ type: MessageBarType.error, message: result.errorMessage });\r\n }\r\n if (copilotTracking) {\r\n copilotTracking.trackSelectedImageAssets({ ImageAssets: [{ suggestionId, imageId: result.processedImage && result.processedImage[0].idString }] });\r\n }\r\n })\r\n .finally(() => {\r\n setImagesToSuggest(reject(imagesToSuggest, image => image.fullUrl === imageUrl));\r\n setLoading(false);\r\n });\r\n } else {\r\n websiteSuggestionCarouselActivity.trace(`CarouselImageSelected: ${index};`);\r\n\r\n addImageByUrl(imageUrl, imageSources.WebsiteCarousel)\r\n .then((result = {}) => {\r\n if (result && result.errorMessage) {\r\n dispatchSuggestionState({\r\n type: SuggestionStatus.SelectSuggestionError,\r\n error: { errorMessage: result.errorMessage },\r\n });\r\n }\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n\r\n dispatchSuggestionState({\r\n type: SuggestionStatus.SelectSuggestionComplete,\r\n selectedIndex: index,\r\n });\r\n }\r\n };\r\n\r\n const onSelectSeeAll = () => {\r\n if (RSAImageRecommendationReplace) {\r\n setIsSuggestionsPanelOpen(true);\r\n } else {\r\n displayWebsiteSuggestionTab();\r\n }\r\n };\r\n\r\n return (\r\n <Stack className={classnames('img-ext-pane', classes.container)}>\r\n {RSAImageExtensionCrop && showEditPanel &&\r\n <Panel\r\n isOpen={showEditPanel}\r\n onClose={() => { closeEditImageView(); }}\r\n panelClassName={classnames(classes.cropPanel, 'image-crop-panel')}\r\n i18n={i18n}\r\n title={i18n.getString(_TL_('Edit Image Extension'))}\r\n width={1260}\r\n >\r\n <div className=\"image-crop-editor-container\">\r\n <ExtensionImagesControl\r\n perfMarker={perfMarker}\r\n i18n={legacyI18n}\r\n genericImage={`${imagePath}1.91to1.jpg`}\r\n imageList={selectedImageEdit}\r\n cid={advertiserCustomerId.toString()}\r\n aid={accountId.toString()}\r\n isForVNext\r\n isStockPhotoEnabled\r\n oDataConfig={oDataConfig}\r\n permissions={permissions}\r\n newI18n={i18n}\r\n instrumentation={instrumentation}\r\n preferencesService={preferenceService}\r\n onImageListChanged={(image) => { setSelectedImageEdit(image); }}\r\n eligibleLayouts={selectedImageEligibleLayouts}\r\n />\r\n <div className={classnames('alert-info')}>\r\n <Alert\r\n message={i18n.getString(_TL_('Any edits you make to this image extension will be applied to all campaigns and ad groups that use it.'))}\r\n level=\"Info\"\r\n icon={(<div className=\"alert-image\" />)}\r\n dismissible={false}\r\n />\r\n </div>\r\n </div>\r\n <div className={classnames([classes.panelFooter, 'panel-footer'])}>\r\n <div className=\"action-btn-container\">\r\n <PrimaryButton id=\"crop-save\" onClick={() => { onUpdateImage(); editImageActivity.trace('save for edit image extension in RSA'); }} >{i18n.getString(_TL_('Save'))}</PrimaryButton>\r\n <DefaultButton id=\"crop-cancel\" onClick={() => { closeEditImageView(); editImageActivity.trace('cancel for edit image extension in RSA'); }}>{i18n.getString(_TL_('Cancel'))}</DefaultButton>\r\n </div>\r\n </div>\r\n </Panel>}\r\n <Stack className=\"img-ext-pane-header\" horizontal tokens={{ padding: '0px 0px 6px 0px' }}>\r\n <Label className={classes.labelContainer}>{i18n.getString(_TL_('Image extensions'))}</Label>\r\n <Stack.Item align=\"center\">\r\n <HelpPopupInline topic=\"pop_BA_NewAdCreate_ImageExtensions\" ariaLabel={i18n.getString(_TL_('Learn more'))} />\r\n </Stack.Item>\r\n </Stack>\r\n <UiBlocker\r\n blocking={loading}\r\n loadingText={i18n.getString(_TL_('Loading ...'))}\r\n >\r\n <DescriptionView\r\n i18n={i18n}\r\n selectedImgExtensionsForAssociation={selectedImgExtensionsForAssociation}\r\n limit={limit}\r\n />\r\n\r\n <div>\r\n <ImageExtensionsList\r\n i18n={i18n}\r\n items={selectedImgExtensionsForAssociation}\r\n className={classnames(classes.listContainer, 'image-exts-list')}\r\n onSelect={onImgExtensionSelected}\r\n onDelete={onDelete}\r\n onEditImage={onEditImage}\r\n enableEdit={RSAImageExtensionCrop}\r\n />\r\n <Stack horizontal tokens={{ padding: '16px 0' }}>\r\n <DefaultButton\r\n onRenderIcon={() => <Glyphicon glyph=\"ba-Add\" className={classes.addIcon} />}\r\n text={i18n.getString(_TL_('Add image'))}\r\n disabled={reachLimit}\r\n onClick={() => {\r\n setDisplayImagePicker(true);\r\n }}\r\n className=\"add-image-btn\"\r\n />\r\n </Stack>\r\n </div>\r\n\r\n <ImageSuggestionCarousel\r\n isLoading={isLoading || false}\r\n images={images}\r\n i18n={i18n}\r\n isEmpty={isEmpty}\r\n messageInfo={messageInfo}\r\n onSelectImage={onSelectImage}\r\n onSelectSeeAll={onSelectSeeAll}\r\n isCollapsible\r\n title={_TL_('Recommendations')}\r\n helpTopic=\"pop_BA_NewAdCreate_ImageRecs\"\r\n selectable\r\n hideData={reachLimit}\r\n enablePolicyMessage\r\n showViewAllInHeader={RSAImageRecommendationReplace}\r\n stylingOverrides={RSAImageRecommendationReplace ? {\r\n classOverrides: overrideImageRecommendationClasses,\r\n seeAllLinkText: _TL_('View all'),\r\n } : {}}\r\n\r\n // turn off toggle for now\r\n allowToggleSelectable={false}\r\n />\r\n {isSuggestionsPanelOpen &&\r\n <ImageRecommendationsPanel\r\n i18n={i18n}\r\n title={_TL_('Recommended images')}\r\n images={panelState.panelImages}\r\n themes={themes}\r\n hasMore={panelState.hasMore}\r\n loadNextPage={panelState.getMoreImageSuggestions}\r\n onSelectImage={onSelectImage}\r\n onDismiss={() => setIsSuggestionsPanelOpen(false)}\r\n />\r\n }\r\n\r\n <AddImageCrudAdComponent\r\n isOpen={displayImagePicker}\r\n setIsOpen={(newOpen) => {\r\n setDisplayImagePicker(newOpen);\r\n if (!newOpen) {\r\n clearImagePickerError();\r\n }\r\n }}\r\n uploadImage={uploadImage}\r\n processUploadedImage={processUploadedImage}\r\n onProcessUploadComplete={onProcessUploadComplete}\r\n supportImageUpscale={supportImageUpscale}\r\n minSize={minSize}\r\n minUploadSize={minUploadSize}\r\n maxUploadNum={1}\r\n imageExperienceProps={{\r\n suggestion,\r\n suggestionPoller,\r\n finalUrl: emptyFinalUrl ? '' : fullUrl,\r\n finalUrlProtocol: `${urlPrefix}://`,\r\n onUpdateFinalUrl: onUpdateUrlValue,\r\n onUpdateFinalUrlPrefix: onUpdateUrlPrefix,\r\n isMultimediaAd: false,\r\n imageOption: constants.defaultImageOption,\r\n }}\r\n addImageByUrl={addImageByUrl}\r\n managedViewSelectionState={selectedMediaPanelSource}\r\n updateManagedViewSelectionState={setSelectedMediaPanelSource}\r\n stockImageConfig={{\r\n getStockImages,\r\n onSelectStockImage,\r\n }}\r\n socialImageConfig={{\r\n socialMediaDataSource,\r\n activityLogger,\r\n }}\r\n assetLibraryConfig={{\r\n cid: advertiserCustomerId.toString(),\r\n aid: accountId.toString(),\r\n oDataConfig,\r\n dateFormat,\r\n timeZone,\r\n preferencesService: preferenceService,\r\n activityLogger,\r\n onImageSelected,\r\n onImagesSelected,\r\n onImageAddError: e => setImagePickerError(e),\r\n }}\r\n i18n={i18n}\r\n cid={advertiserCustomerId.toString()}\r\n aid={accountId.toString()}\r\n errorMessage={imagePickerError}\r\n imageType={null}\r\n customMediaSourceConfig={customMediaSourceConfig}\r\n perfMarker={addImageChildPerfmarker}\r\n permissions={permissions}\r\n isAADUser={isAADUser}\r\n eventHandler={assetLibraryEventHandler}\r\n serverContext={serverContext}\r\n />\r\n\r\n { displayCreateImageExtView &&\r\n <CreateImageExtensionDialog\r\n i18n={i18n}\r\n createImageExtension={createImageExtension}\r\n selectedImage={selectedImage}\r\n onCreateSuccess={closeCreateImageExtView}\r\n onCancel={closeCreateImageExtView}\r\n adCreatorScenario={scenario}\r\n permissions={permissions}\r\n />\r\n }\r\n\r\n { displayDeleteImageExtView &&\r\n <DeleteImageExtensionDialog\r\n i18n={i18n}\r\n deleteImageExtension={deleteImageExtension}\r\n selectedImageDelete={selectedImageDelete}\r\n onDeleteSuccess={closeDeleteImageExtView}\r\n onCancel={closeDeleteImageExtView}\r\n />\r\n }\r\n\r\n {reachLimit &&\r\n <div className={classnames('alert-info max-limit', classes.alertBanner)}>\r\n <Alert\r\n message={i18n.getString(\r\n _TL_('You\\'ve reached the max limit of {{limit}} images. Please remove images to see your image recommendations.'),\r\n { limit }\r\n )}\r\n level=\"Info\"\r\n icon={(<div className=\"alert-image\" />)}\r\n dismissible={false}\r\n />\r\n </div>\r\n }\r\n {emptyFinalUrl &&\r\n <div className={classnames('alert-info final-url-extension-banner', classes.alertBanner)}>\r\n <Alert\r\n message={i18n.getString(_TL_('Enter your Final URL to pull images from your website.'))}\r\n level=\"Info\"\r\n icon={(<div className=\"alert-image\" />)}\r\n dismissible={false}\r\n />\r\n </div>\r\n }\r\n <div className={classnames('alert-info preview-disclaimer', classes.alertBanner)}>\r\n <Alert\r\n message={i18n.getString(_TL_('Your image extension may also serve with Search ads that appear in Audience placements. Image extensions are not guaranteed to serve with your ads every time.'))}\r\n level=\"Info\"\r\n icon={(<div className=\"alert-image\" />)}\r\n dismissible={false}\r\n />\r\n </div>\r\n </UiBlocker>\r\n\r\n </Stack>\r\n );\r\n};\r\n\r\nImageExtensionsPaneView.propTypes = {\r\n loading: PropTypes.bool,\r\n setLoading: PropTypes.func,\r\n selectedImgExtensionsForAssociation: PropTypes.arrayOf(PropTypes.shape({})),\r\n onImgExtensionSelected: PropTypes.func,\r\n advertiserCustomerId: PropTypes.number.isRequired,\r\n accountId: PropTypes.number.isRequired,\r\n createImageExtension: PropTypes.func.isRequired,\r\n deleteImageExtension: PropTypes.func.isRequired,\r\n updateImageExtension: PropTypes.func.isRequired,\r\n legacyI18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n dataModelUtil: PropTypes.shape({}),\r\n imagePath: PropTypes.string,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n maxImageExtensionsPerAdGroup: PropTypes.number,\r\n perfMarker: PropTypes.shape({\r\n willFetchFile: PropTypes.func.isRequired,\r\n willInit: PropTypes.func.isRequired,\r\n willFetchData: PropTypes.func.isRequired,\r\n willRender: PropTypes.func.isRequired,\r\n done: PropTypes.func.isRequired,\r\n createChild: PropTypes.func.isRequired,\r\n }).isRequired,\r\n preferenceService: PropTypes.shape({\r\n setAtUserLevel: PropTypes.func,\r\n findByNameAtUserLevel: PropTypes.func,\r\n }).isRequired,\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({\r\n }),\r\n }),\r\n\r\n oDataConfig: PropTypes.shape({\r\n odataRootUrl: PropTypes.string,\r\n odataPath: PropTypes.string,\r\n odataToken: PropTypes.string,\r\n }).isRequired,\r\n\r\n suggestionState: PropTypes.shape({\r\n suggestion: PropTypes.shape({}),\r\n carousel: PropTypes.shape({}),\r\n }).isRequired,\r\n dispatchSuggestionState: PropTypes.func.isRequired,\r\n suggestionPoller: PropTypes.shape({}).isRequired,\r\n\r\n instrumentation: PropTypes.shape({\r\n addScenario: PropTypes.func,\r\n }).isRequired,\r\n adCreatorScenario: PropTypes.shape({\r\n scenarioName: PropTypes.string,\r\n scenarioValue: PropTypes.string,\r\n }),\r\n logActivity: PropTypes.func,\r\n\r\n fullUrl: PropTypes.string,\r\n urlPrefix: PropTypes.string,\r\n onUpdateUrlPrefix: PropTypes.func,\r\n onUpdateUrlValue: PropTypes.func,\r\n dateFormat: PropTypes.string,\r\n timeZone: PropTypes.number,\r\n activityLogger: PropTypes.shape({}),\r\n isAADUser: PropTypes.bool,\r\n assetLibraryEventHandler: PropTypes.shape({}),\r\n serverContext: PropTypes.shape({}),\r\n};\r\n\r\nImageExtensionsPaneView.defaultProps = {\r\n loading: false,\r\n setLoading: noop,\r\n selectedImgExtensionsForAssociation: [],\r\n onImgExtensionSelected: noop,\r\n maxImageExtensionsPerAdGroup: 0,\r\n permissions: {},\r\n adCreatorScenario: undefined,\r\n logActivity: noop,\r\n fullUrl: '',\r\n urlPrefix: '',\r\n onUpdateUrlPrefix: noop,\r\n onUpdateUrlValue: noop,\r\n dateFormat: 'M/d/yyyy',\r\n timeZone: 71,\r\n activityLogger: {},\r\n isAADUser: false,\r\n assetLibraryEventHandler: {},\r\n dataModelUtil: {},\r\n imagePath: '',\r\n serverContext: undefined,\r\n};\r\n","/* eslint-disable react-hooks/exhaustive-deps */\r\nimport React, { useEffect, useState } from 'react';\r\nimport _ from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport { withPreference } from '@bingads-webui-react/preference-context';\r\nimport { cloneDeep } from '@bingads-webui-universal/primitive-utilities';\r\nimport { useWebsiteSuggestion } from '@bingads-webui-campaign-react/add-image-hooks';\r\n\r\nimport { ImageExtensionsPaneView } from './image-extensions-pane-view';\r\nimport {\r\n createImageExtensionMtModel,\r\n extractImageExtensionCreationMtFields,\r\n getImageExtensionItemThumbnailUrl,\r\n isImageExtensionCommitedToServer,\r\n getImagesFromImageList,\r\n} from './components/index';\r\n\r\nconst decorateUIState = (items, { selectedIndex }) => _.map(items, (item, index) => ({\r\n ...item,\r\n selected: index === selectedIndex,\r\n}));\r\n\r\nconst computeNewItemsMtModels = items => _.chain(items)\r\n .filter(item => !isImageExtensionCommitedToServer(item))\r\n .map(item => extractImageExtensionCreationMtFields(item))\r\n .value();\r\n\r\nconst ImageExtensionsPaneContainerBase = ({\r\n imageExtRepository,\r\n adContext,\r\n oDataConfig,\r\n instrumentation,\r\n permissions,\r\n fullUrl,\r\n hasErrorInUrl,\r\n adCreatorScenario,\r\n logActivity,\r\n headlines,\r\n descriptions,\r\n maxImageExtensionsPerAdGroup,\r\n onImageExtensionChanged,\r\n onPreviewImageChanged,\r\n preferenceService,\r\n cachedImageExtensionChanges,\r\n assetLibraryEventHandler,\r\n dataModelUtil,\r\n ...rest\r\n}) => {\r\n const {\r\n suggestionState,\r\n dispatchSuggestionState,\r\n suggestionPoller,\r\n } = useWebsiteSuggestion({\r\n oDataConfig,\r\n adContext,\r\n instrumentation,\r\n logActivity,\r\n permissions,\r\n fullUrl,\r\n hasErrorInUrl,\r\n headlines,\r\n descriptions,\r\n adCreatorScenario,\r\n });\r\n const [loading, setLoading] = useState(true);\r\n const [changes, setChanges] = useState(cachedImageExtensionChanges || {\r\n current: [],\r\n added: [],\r\n removed: [],\r\n updated: [],\r\n });\r\n\r\n useEffect(() => {\r\n setLoading(true);\r\n\r\n imageExtRepository.association\r\n .findAll({\r\n where: { adGroupId: adContext.adGroupId, campaignId: adContext.campaignId },\r\n limit: maxImageExtensionsPerAdGroup,\r\n query: { $orderby: 'Id desc' },\r\n })\r\n .then((data) => {\r\n setChanges(prev => ({\r\n ...prev,\r\n current: decorateUIState([\r\n ...data,\r\n ...(cachedImageExtensionChanges && _.isArray(cachedImageExtensionChanges.current) ? cachedImageExtensionChanges.current : []),\r\n ], { selectedIndex: 0 }),\r\n }));\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }, [adContext.adGroupId, adContext.campaignId, imageExtRepository.association, maxImageExtensionsPerAdGroup]);\r\n\r\n useEffect(() => {\r\n onImageExtensionChanged(changes);\r\n }, [changes, onImageExtensionChanged]);\r\n\r\n useEffect(() => {\r\n const imageExtensionForPreview = _.find(changes.current, item => item.selected);\r\n if (permissions && permissions.dynamic.RSAImageExtensionCrop) {\r\n if (imageExtensionForPreview && dataModelUtil) {\r\n dataModelUtil.getImageListFromMTImagesAsync(imageExtensionForPreview.Images).then((imageList) => {\r\n const previewImage = _.find(imageList, image => image.type === 'Image178x100');\r\n onPreviewImageChanged(previewImage);\r\n });\r\n }\r\n } else {\r\n const previewUrl = imageExtensionForPreview && getImageExtensionItemThumbnailUrl(imageExtensionForPreview);\r\n onPreviewImageChanged({ src: previewUrl });\r\n }\r\n }, [changes, onPreviewImageChanged]);\r\n\r\n const createImageExtension = (fieldValues, selectedImage) => {\r\n const extensionData = createImageExtensionMtModel(fieldValues, selectedImage);\r\n const itemState = _.defaults({\r\n source: selectedImage[0].source,\r\n }, extensionData);\r\n\r\n setChanges(prev => ({\r\n ...prev,\r\n current: decorateUIState(\r\n [itemState, ...prev.current],\r\n { selectedIndex: 0 }\r\n ),\r\n added: [\r\n ...prev.added,\r\n extensionData,\r\n ],\r\n }));\r\n };\r\n\r\n const updateImageExtension = (index, selectedImage) => {\r\n const isItemAssociated = isImageExtensionCommitedToServer(changes.current[index]);\r\n const newCurrent = cloneDeep(changes.current);\r\n newCurrent[index].Images = getImagesFromImageList(selectedImage);\r\n if (isItemAssociated) {\r\n const newUpdateItem = _.filter(newCurrent, item => item.Id === newCurrent[index].Id);\r\n setChanges(prev => ({\r\n ...prev,\r\n current: decorateUIState(\r\n newCurrent,\r\n { selectedIndex: 0 }\r\n ),\r\n updated: [..._.filter(prev.updated, item => item.Id !== newCurrent[index].Id), ...newUpdateItem],\r\n }));\r\n } else {\r\n setChanges(prev => ({\r\n ...prev,\r\n current: decorateUIState(\r\n newCurrent,\r\n { selectedIndex: 0 }\r\n ),\r\n added: computeNewItemsMtModels(newCurrent),\r\n }));\r\n }\r\n };\r\n\r\n\r\n const deleteImageExtension = (item) => {\r\n const isItemAssociated = isImageExtensionCommitedToServer(item);\r\n\r\n setChanges((prev) => {\r\n const current = decorateUIState(\r\n _.without(prev.current, item),\r\n { selectedIndex: 0 }\r\n );\r\n\r\n return {\r\n ...prev,\r\n current,\r\n added: isItemAssociated ? prev.added : computeNewItemsMtModels(current),\r\n removed: isItemAssociated ? [...prev.removed, item] : prev.removed,\r\n };\r\n });\r\n };\r\n\r\n const onImgExtensionSelected = (index) => {\r\n setChanges(prev => ({\r\n ...prev,\r\n current: decorateUIState(prev.current, { selectedIndex: index }),\r\n }));\r\n };\r\n\r\n return (\r\n <div className=\"image-ext-pane-container\">\r\n <ImageExtensionsPaneView\r\n loading={loading}\r\n setLoading={setLoading}\r\n selectedImgExtensionsForAssociation={changes.current}\r\n onImgExtensionSelected={onImgExtensionSelected}\r\n advertiserCustomerId={adContext.advertiserCustomerId}\r\n accountId={adContext.accountId}\r\n createImageExtension={createImageExtension}\r\n deleteImageExtension={deleteImageExtension}\r\n updateImageExtension={updateImageExtension}\r\n suggestionState={suggestionState}\r\n dispatchSuggestionState={dispatchSuggestionState}\r\n suggestionPoller={suggestionPoller}\r\n adContext={adContext}\r\n oDataConfig={oDataConfig}\r\n instrumentation={instrumentation}\r\n permissions={permissions}\r\n fullUrl={fullUrl}\r\n adCreatorScenario={adCreatorScenario}\r\n maxImageExtensionsPerAdGroup={maxImageExtensionsPerAdGroup}\r\n preferenceService={preferenceService}\r\n logActivity={logActivity}\r\n assetLibraryEventHandler={assetLibraryEventHandler}\r\n dataModelUtil={dataModelUtil}\r\n {...rest}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nImageExtensionsPaneContainerBase.propTypes = {\r\n imageExtRepository: PropTypes.shape({}).isRequired,\r\n adContext: PropTypes.shape({\r\n campaignId: PropTypes.number,\r\n adGroupId: PropTypes.number,\r\n advertiserCustomerId: PropTypes.number,\r\n accountId: PropTypes.number,\r\n }).isRequired,\r\n oDataConfig: PropTypes.shape({\r\n odataRootUrl: PropTypes.string,\r\n odataPath: PropTypes.string,\r\n odataToken: PropTypes.string,\r\n }).isRequired,\r\n instrumentation: PropTypes.shape({\r\n addScenario: PropTypes.func,\r\n }).isRequired,\r\n adCreatorScenario: PropTypes.shape({\r\n scenarioName: PropTypes.string,\r\n scenarioValue: PropTypes.string,\r\n }),\r\n logActivity: PropTypes.func,\r\n permissions: PropTypes.shape({}).isRequired,\r\n fullUrl: PropTypes.string,\r\n headlines: PropTypes.arrayOf(PropTypes.string),\r\n descriptions: PropTypes.arrayOf(PropTypes.string),\r\n hasErrorInUrl: PropTypes.bool,\r\n maxImageExtensionsPerAdGroup: PropTypes.number,\r\n onImageExtensionChanged: PropTypes.func,\r\n onPreviewImageChanged: PropTypes.func,\r\n preferenceService: PropTypes.shape({\r\n setAtUserLevel: PropTypes.func,\r\n findByNameAtUserLevel: PropTypes.func,\r\n }).isRequired,\r\n activityLogger: PropTypes.shape({}),\r\n assetLibraryEventHandler: PropTypes.shape({}),\r\n dataModelUtil: PropTypes.shape({}),\r\n};\r\n\r\nImageExtensionsPaneContainerBase.defaultProps = {\r\n adCreatorScenario: undefined,\r\n logActivity: _.noop,\r\n fullUrl: '',\r\n hasErrorInUrl: false,\r\n headlines: [],\r\n descriptions: [],\r\n maxImageExtensionsPerAdGroup: 0,\r\n onImageExtensionChanged: _.noop,\r\n onPreviewImageChanged: _.noop,\r\n activityLogger: {},\r\n assetLibraryEventHandler: {},\r\n dataModelUtil: {},\r\n};\r\n\r\nexport const ImageExtensionsPaneContainer =\r\n React.memo(withPreference(ImageExtensionsPaneContainerBase));\r\n","import _ from 'underscore';\r\nimport { getUrlProtocolAndDomain } from '@bingads-webui/url-util';\r\nimport { getCharCountExcludingAdCustomizers } from '@bingads-webui-campaign/ad-customizers-next';\r\nimport { validateAdUrl } from '@bingads-webui-campaign-react/url-input-fluent';\r\n\r\nconst textFieldErrorMessage = _TL_('This field is required');\r\nconst lengthLimitErrorMessage = _TL_('The number of characters in this field cannot exceed {{lengthLimit}}');\r\nconst requirePath1ErrorMessage = _TL_('In order to use path 2, path 1 must also be used.');\r\nconst pathLengthLimitErrorMessages = [\r\n _TL_('Path 1 cannot exceed 15 characters.'),\r\n _TL_('Path 2 cannot exceed 15 characters.'),\r\n];\r\n\r\nexport const URL_COLON_SLASH_SLASH = '://';\r\nexport const DEFAULT_URL_PREFIX = 'https';\r\nexport const IS_DISTINGUISH_WIDE_CHAR = true;\r\nexport const AD_TYPE_RSA = 'ResponsiveSearchAd';\r\n\r\nexport const adsFields = {\r\n DESTINATION_URL: 'FinalUrls',\r\n DISPLAY_URL: 'DisplayUrl',\r\n PATH1: 'Path1',\r\n PATH2: 'Path2',\r\n MOBILE_URL: 'MobileFinalUrls',\r\n HEADLINES: 'Headlines',\r\n DESCRIPTIONS: 'Descriptions',\r\n TRACKING_URL_TEMPLATE: 'TrackingUrlTemplate',\r\n FINAL_URL_SUFFIX: 'FinalUrlSuffix',\r\n URL_CUSTOM_PARAMETERS: 'UrlCustomParameters',\r\n};\r\n\r\nexport const adsFieldAlias = {\r\n [adsFields.HEADLINES]: 'AdHeadlines',\r\n [adsFields.DESCRIPTIONS]: 'AdDescriptions',\r\n};\r\n\r\nexport const adsFieldLengthLimitMap = {\r\n FinalUrls: 2048,\r\n Path1: 15,\r\n Path2: 15,\r\n DisplayUrl: 2048,\r\n MobileFinalUrls: 2048,\r\n Headlines: 30,\r\n LongHeadlines: 90,\r\n Descriptions: 90,\r\n TrackingUrlTemplate: 2048,\r\n FinalUrlSuffix: 1024,\r\n UrlCustomParametersKey: 16,\r\n UrlCustomParametersValue: 2048,\r\n};\r\n\r\n// This was used to bypass the requirement to use the actual i18n object\r\n// in scenarios where we only want to determine if a given field passes\r\n// validation - i.e., we don't care about the actual error message itself.\r\nexport const notI18n = {\r\n getString: _.identity,\r\n};\r\n\r\n/**\r\n * Calculate the max length for the destination URL without prefix.\r\n * @param {String} urlPrefix - URL prefix.\r\n * @returns {Number} - Max length for the destination URL without prefix.\r\n */\r\nexport function getDestinationUrlWithoutPrefixLengthLimit(urlPrefix) {\r\n const key = adsFields.DESTINATION_URL;\r\n\r\n return adsFieldLengthLimitMap[key] - urlPrefix.length - URL_COLON_SLASH_SLASH.length;\r\n}\r\n\r\n/**\r\n * Validates a text field value.\r\n * @param {String} value - Value of the text field.\r\n * @param {Number} lengthLimit - Max length allowed for the value.\r\n * @param {Object} [i18n] - i18n library.\r\n * @param {String} field - field.\r\n * @param {Boolean} [optional=false] - If true, value is allowed to be empty.\r\n * @param {String} [adType] - ResponsiveSearchAd or ResponsiveAd.\r\n * @returns {String} - Null if value is valid. Error message if invalid.\r\n */\r\nexport function validateTextFieldValue(\r\n value, lengthLimit, i18n = notI18n, field,\r\n optional = false, adType = AD_TYPE_RSA\r\n) {\r\n const size = getCharCountExcludingAdCustomizers({\r\n text: value,\r\n adType,\r\n field,\r\n });\r\n\r\n if (!optional && size === 0) {\r\n return i18n.getString(textFieldErrorMessage);\r\n }\r\n\r\n if (size > lengthLimit) {\r\n // character count exceeds limit\r\n return i18n.getString(lengthLimitErrorMessage, { lengthLimit });\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function validateTextField(fieldName, i18n, optional, adType = AD_TYPE_RSA) {\r\n return (value) => {\r\n const lengthLimit = adsFieldLengthLimitMap[fieldName];\r\n const errMsg = validateTextFieldValue(value, lengthLimit, i18n, fieldName, optional, adType);\r\n return errMsg || '';\r\n };\r\n}\r\n\r\nexport function validateDestinationUrl(urlPrefix, campaignWebsite, i18n, optional = false) {\r\n const campaignUrlProtocolAndDomain = getUrlProtocolAndDomain(campaignWebsite);\r\n\r\n return (value) => {\r\n if (optional && _.isEmpty(value)) {\r\n return '';\r\n }\r\n\r\n const selectedUrlPrefix = urlPrefix || DEFAULT_URL_PREFIX;\r\n const url = `${selectedUrlPrefix}${URL_COLON_SLASH_SLASH}${value}`;\r\n\r\n const errMsg = validateAdUrl(url, campaignUrlProtocolAndDomain, i18n);\r\n\r\n return errMsg || '';\r\n };\r\n}\r\n\r\nexport function validateTextAssets(assets, config, i18n) {\r\n let error;\r\n const { minSize, errorMap } = config;\r\n\r\n const availableAssets = _.filter(assets, a => !_.isEmpty(a.Asset.Text.trim()))\r\n .map(a => ({\r\n Text: a.Asset.Text.trim(),\r\n PinnedField: a.PinnedField,\r\n }));\r\n\r\n if (_.size(availableAssets) < minSize) {\r\n error = errorMap.lessThanRequired;\r\n } else if (_.size(_.uniq(availableAssets, 'Text')) < _.size(availableAssets)) {\r\n error = errorMap.duplicate;\r\n } else {\r\n const unpinnedSize = _.size(_.filter(availableAssets, a => a.PinnedField === 'None'));\r\n if (unpinnedSize < minSize) {\r\n const pinnedSize = _.size(_.uniq(availableAssets, 'PinnedField')) - (unpinnedSize ? 1 : 0);\r\n if (pinnedSize < minSize - unpinnedSize) {\r\n error = errorMap.lessPosition;\r\n }\r\n }\r\n }\r\n\r\n return error ? i18n.getString(error) : '';\r\n}\r\n\r\nexport function validatePath(values, i18n) {\r\n const errors = [];\r\n\r\n if (_.isEmpty(values[0]) && !_.isEmpty(values[1])) {\r\n errors.push({\r\n Property: adsFields.PATH1,\r\n Message: i18n.getString(requirePath1ErrorMessage),\r\n });\r\n }\r\n\r\n _.each([\r\n adsFields.PATH1,\r\n adsFields.PATH2,\r\n ], (field, index) => {\r\n const error =\r\n validateTextFieldValue(values[index], adsFieldLengthLimitMap[field], i18n, field, true);\r\n if (error) {\r\n errors.push({\r\n Property: field,\r\n Message: i18n.getString(pathLengthLimitErrorMessages[index]),\r\n });\r\n }\r\n });\r\n\r\n return errors;\r\n}\r\n","import _ from 'underscore';\r\nimport React, { useMemo, useContext, useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { adsFieldAlias } from '../validators';\r\n\r\nexport const ErrorContext = React.createContext([]);\r\n\r\nexport function Error(props) {\r\n const {\r\n filter,\r\n property,\r\n index,\r\n } = props;\r\n\r\n const { errors, onFirstErrorHandler } = useContext(ErrorContext);\r\n const alertRef = useRef(null);\r\n\r\n const filteredErrors = useMemo(() => {\r\n if (_.isFunction(filter)) {\r\n return _.filter(errors, error => filter(error));\r\n } else if (!_.isEmpty(property)) {\r\n return _.filter(errors, error => (error.Property === property ||\r\n error.Property === adsFieldAlias[property]) &&\r\n (index === null || index === error.Index));\r\n }\r\n return errors;\r\n }, [errors, filter, index, property]);\r\n\r\n useEffect(() => {\r\n if (filteredErrors && filteredErrors.length > 0 && errors[0].Property === filteredErrors[0].Property) {\r\n onFirstErrorHandler(alertRef.current);\r\n }\r\n }, [errors, filteredErrors, onFirstErrorHandler]);\r\n\r\n return filteredErrors && filteredErrors.length > 0 ? (\r\n <div\r\n role=\"alert\"\r\n className=\"rsa-errors\"\r\n ref={alertRef}\r\n >\r\n { _.map(filteredErrors, error => (\r\n <div key={error.Message} className=\"error\">\r\n {error.Message || error.Code}\r\n </div>\r\n ))}\r\n </div>\r\n ) : null;\r\n}\r\n\r\nError.propTypes = {\r\n filter: PropTypes.func,\r\n\r\n property: PropTypes.string,\r\n\r\n index: PropTypes.number,\r\n};\r\n\r\nError.defaultProps = {\r\n filter: null,\r\n property: null,\r\n index: null,\r\n};\r\n","import _ from 'underscore';\r\nimport React, { useContext, useMemo } from 'react';\r\nimport { ErrorContext } from './error';\r\nimport { adsFieldAlias } from '../validators';\r\n\r\nexport const withError = (WrappedComponent, property) => (\r\n React.memo((props) => {\r\n const { errors } = useContext(ErrorContext);\r\n\r\n const filteredErrors = useMemo(() => {\r\n if (!_.isEmpty(property)) {\r\n return _.filter(errors, error => error.Property === property ||\r\n error.Property === adsFieldAlias[property]);\r\n }\r\n return errors;\r\n }, [errors]);\r\n\r\n const errorMessage = _.isEmpty(filteredErrors) ? undefined : _.map(filteredErrors, error => error.Message || error.Code).join('\\n');\r\n\r\n return (\r\n <WrappedComponent\r\n errorMessage={errorMessage}\r\n {...props}\r\n />\r\n );\r\n })\r\n);\r\n","export const contentStyles = {\r\n contentContainerStackToken: {\r\n childrenGap: 16,\r\n },\r\n urlFieldStackToken: {\r\n childrenGap: 16,\r\n },\r\n pathFieldStackToken: {\r\n childrenGap: 6,\r\n },\r\n actionStackToken: {\r\n childrenGap: 16,\r\n },\r\n errorStackToken: {\r\n childrenGap: 6,\r\n },\r\n};\r\n\r\nexport const textFieldStyles = (props) => {\r\n const { inputClassName } = props;\r\n const noInlineError = inputClassName === 'no-inline-error';\r\n\r\n return {\r\n charCountDescription: {\r\n root: {\r\n textAlign: 'right',\r\n fontWeight: 'normal',\r\n fontSize: 14,\r\n },\r\n },\r\n dynamicLinkContainer: {\r\n marginLeft: '5px',\r\n },\r\n dynamicLink: {\r\n root: {\r\n padding: '5px',\r\n selectors: {\r\n '&:focus': {\r\n boxShadow: 'none !important',\r\n outline: '1px solid rgb(96, 94, 92) !important',\r\n },\r\n },\r\n },\r\n },\r\n errorMessage: noInlineError ? { display: 'none' } : {},\r\n };\r\n};\r\n\r\nexport const containerStyles = {\r\n container: {\r\n root: {\r\n width: '100%',\r\n minHeight: '100%',\r\n position: 'relative',\r\n selectors: {\r\n '& .rsa-left-copilot-column': {\r\n maxWidth: 600,\r\n '& .rsa-card-title': {\r\n fontSize: '18px',\r\n display: 'inline',\r\n },\r\n },\r\n '& .rsa-right-column': {\r\n '& .fixed': {\r\n position: 'sticky',\r\n top: 0,\r\n },\r\n },\r\n '& .rsa-left-column': {\r\n maxWidth: 592,\r\n minWidth: 460,\r\n width: '100%',\r\n '& .collapse-panel .img-ext-pane': {\r\n borderTop: 'none',\r\n borderBottom: 'none',\r\n },\r\n '& .collapse-panel .img-ext-pane-header': {\r\n display: 'none',\r\n },\r\n '& .collapse-panel .title-item': {\r\n width: 'auto',\r\n },\r\n '& .copilot-banner-container': {\r\n marginBottom: 8,\r\n },\r\n },\r\n\r\n '& .rsa-errors': {\r\n color: '#A80000',\r\n fontSize: 12,\r\n },\r\n\r\n '& .rsa-errors .error': {\r\n margin: 0,\r\n },\r\n '& .rsa-field-path1, & .rsa-field-path2': {\r\n width: '30%',\r\n },\r\n },\r\n },\r\n },\r\n input: {\r\n root: {\r\n padding: 16,\r\n overflow: 'hidden',\r\n },\r\n },\r\n preview: {\r\n root: {\r\n padding: '0 32px',\r\n },\r\n },\r\n contentContainer: {\r\n root: {\r\n overflowY: 'auto',\r\n overflowX: 'hidden',\r\n },\r\n },\r\n urlPath: {\r\n root: {\r\n flexFlow: 'row wrap',\r\n wordBreak: 'break-all',\r\n '& .rsa-field-display-url': {\r\n paddingBottom: '8px',\r\n },\r\n },\r\n },\r\n};\r\n\r\nexport const stickyAdPreviewStyles = {\r\n position: 'sticky',\r\n top: 50,\r\n};\r\n","/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useCallback, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { ContextualMenu, Link } from '@fluentui/react';\r\nimport { textFieldStyles } from '../styles';\r\n\r\nexport function DynamicTextExtention(props) {\r\n const { i18n, onTextFieldChange, cachedValue } = props;\r\n\r\n const [showContextualMenu, setShowContextualMenu] = useState(false);\r\n const [target, setTarget] = useState(null);\r\n const linkRef = React.useRef(null);\r\n const onShowContextualMenu = useCallback((e) => {\r\n e.preventDefault();\r\n setShowContextualMenu(true);\r\n setTarget(e.target);\r\n }, []);\r\n const onHideContextualMenu = useCallback(() => setShowContextualMenu(false), []);\r\n\r\n const menuItems = [{\r\n key: '{param1}',\r\n text: ` ${i18n.getString(_TL_('Placeholder {param1}'))}`,\r\n onClick: e => onTextFieldChange(e, `${cachedValue}{param1}`),\r\n }, {\r\n key: '{param2}',\r\n text: ` ${i18n.getString(_TL_('Placeholder {param2}'))}`,\r\n onClick: e => onTextFieldChange(e, `${cachedValue}{param2}`),\r\n }, {\r\n key: '{param3}',\r\n text: ` ${i18n.getString(_TL_('Placeholder {param3}'))}`,\r\n onClick: e => onTextFieldChange(e, `${cachedValue}{param3}`),\r\n }];\r\n\r\n return (\r\n <React.Fragment>\r\n <Link\r\n componentRef={linkRef}\r\n onClick={onShowContextualMenu}\r\n styles={textFieldStyles({}).dynamicLink}\r\n aria-expanded={showContextualMenu}\r\n >\r\n {i18n.getString(_TL_('dynamic text'))}\r\n </Link>\r\n <ContextualMenu\r\n items={menuItems}\r\n hidden={!showContextualMenu}\r\n target={target}\r\n onItemClick={onHideContextualMenu}\r\n onDismiss={onHideContextualMenu}\r\n />\r\n </React.Fragment>\r\n );\r\n}\r\n\r\nDynamicTextExtention.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n onTextFieldChange: PropTypes.func.isRequired,\r\n cachedValue: PropTypes.string.isRequired,\r\n};\r\n","import _ from 'underscore';\r\nimport React, { useMemo, useCallback, useState, useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { TextField, Label, Stack } from '@fluentui/react';\r\nimport { useAdCustomizers, getCharCountExcludingAdCustomizers } from '@bingads-webui-campaign/ad-customizers-next';\r\nimport { useAdStrengthSuggestion } from '@bingads-webui-campaign-react/responsive-search-ad-suggestion';\r\nimport { DynamicTextExtention } from './dynamic-text-extention';\r\n\r\nimport {\r\n validateTextField,\r\n adsFieldLengthLimitMap,\r\n AD_TYPE_RSA,\r\n} from '../validators';\r\nimport { textFieldStyles } from '../styles';\r\n\r\n// Bug 2751598: Cursor jump on edit text ads, updateItem() runs for too long\r\nconst UPDATE_ITEM_WAIT_IN_MS = 100;\r\n\r\nexport function BaseTextField(props) {\r\n const {\r\n configProps,\r\n value,\r\n updateItem,\r\n i18n,\r\n optional,\r\n adsFieldId,\r\n allowNewLines,\r\n showCharRemaining,\r\n showErrorMessage,\r\n errorMessage,\r\n isForVnext,\r\n assets,\r\n index,\r\n updateSuggestionMeasurement,\r\n showDynamicTextExtention,\r\n inputClassName,\r\n onBlur,\r\n llmAssetsSuggestions,\r\n adType,\r\n containerSelector,\r\n enableDKI,\r\n DKIThemeName,\r\n } = props;\r\n\r\n const [cachedValue, setCachedValue] = useState(value);\r\n const {\r\n key,\r\n ...restProps\r\n } = configProps;\r\n\r\n const charLimit = useMemo(() => adsFieldLengthLimitMap[key], [key]);\r\n\r\n const [charRemaining, setCharRemaining] =\r\n useState(charLimit - getCharCountExcludingAdCustomizers({\r\n text: cachedValue,\r\n adType,\r\n field: key,\r\n }));\r\n\r\n useEffect(() => {\r\n setCachedValue(value);\r\n setCharRemaining(charLimit - getCharCountExcludingAdCustomizers({\r\n text: value,\r\n adType,\r\n field: key,\r\n }));\r\n }, [adType, charLimit, key, value]);\r\n\r\n const inputRef = useRef(null);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const setComponentRef = (component) => {\r\n // eslint-disable-next-line no-underscore-dangle\r\n inputRef.current = component ? _.result(component._textElement, 'current', null) : null;\r\n };\r\n\r\n const debouncedUpdateItem = useMemo(() =>\r\n _.debounce(updateItem, UPDATE_ITEM_WAIT_IN_MS), [updateItem]);\r\n\r\n const onTextFieldChange = useCallback((event, textValue, populatedWithFullValue) => {\r\n // if we don't allow new lines, we translate new line chararter to single space\r\n // so we have better format when user copy paste text with new lines in the middle\r\n const newValue = allowNewLines ? textValue : textValue.replace(/(\\r\\n|\\n|\\r)+/mg, ' ');\r\n setCachedValue(newValue);\r\n setCharRemaining(charLimit - getCharCountExcludingAdCustomizers({\r\n text: newValue,\r\n adType,\r\n field: key,\r\n }));\r\n\r\n debouncedUpdateItem(newValue, key, populatedWithFullValue);\r\n }, [allowNewLines, charLimit, adType, key, debouncedUpdateItem]);\r\n\r\n const dynamicErrorMessage = useMemo(\r\n () => validateTextField(key, i18n, optional, adType)(cachedValue),\r\n [key, i18n, optional, adType, cachedValue]\r\n );\r\n\r\n useEffect(() => {\r\n if (key === 'FinalUrls' && inputRef) {\r\n inputRef.current.focus();\r\n }\r\n }, [key, cachedValue]);\r\n\r\n const onBlurCheck = useCallback(() => {\r\n if (key === 'FinalUrls' && document.activeElement === inputRef.current) {\r\n return;\r\n }\r\n onBlur();\r\n }, [key, onBlur]);\r\n\r\n const onRenderDescription = useCallback(() => (\r\n showCharRemaining ? (\r\n <Stack horizontal horizontalAlign=\"end\">\r\n <Label className=\"char-counter\" styles={textFieldStyles({}).charCountDescription}>\r\n {charRemaining >= 0 ? i18n.getString(_TL_('{{charRemaining}} characters remaining'), { charRemaining }) :\r\n i18n.getString(_TL_('Exceeded by {{charRemaining}} characters'), { charRemaining: -charRemaining })}\r\n </Label>\r\n {showDynamicTextExtention ?\r\n <div style={textFieldStyles({}).dynamicLinkContainer}>|\r\n <DynamicTextExtention\r\n i18n={i18n}\r\n onTextFieldChange={onTextFieldChange}\r\n cachedValue={cachedValue}\r\n />\r\n </div> : null\r\n }\r\n\r\n </Stack>\r\n ) : null\r\n ), [cachedValue, charRemaining, i18n, onTextFieldChange,\r\n showCharRemaining, showDynamicTextExtention]);\r\n\r\n useAdCustomizers({\r\n ref: inputRef,\r\n updateAction: (val) => {\r\n setCachedValue(val);\r\n setCharRemaining(charLimit - getCharCountExcludingAdCustomizers({\r\n text: val,\r\n adType,\r\n field: key,\r\n }));\r\n debouncedUpdateItem(val, key);\r\n },\r\n adType,\r\n container: containerSelector,\r\n field: key,\r\n });\r\n\r\n useAdStrengthSuggestion({\r\n container: containerSelector,\r\n i18n,\r\n ref: inputRef,\r\n llmAssetsSuggestions,\r\n assets,\r\n assetType: configProps.key,\r\n updateItem: val => onTextFieldChange(null, val, true),\r\n isForVnext,\r\n index,\r\n updateSuggestionMeasurement,\r\n enableDKI,\r\n DKIThemeName,\r\n });\r\n\r\n return (\r\n <TextField\r\n autoComplete=\"off\"\r\n componentRef={setComponentRef}\r\n {...restProps}\r\n onRenderDescription={onRenderDescription}\r\n validateOnLoad\r\n value={cachedValue}\r\n onChange={onTextFieldChange}\r\n onBlur={onBlurCheck}\r\n styles={textFieldStyles}\r\n adsFieldId={adsFieldId}\r\n gapCompensation={20}\r\n errorMessage={showErrorMessage ? (errorMessage || dynamicErrorMessage) : undefined}\r\n inputClassName={inputClassName}\r\n />\r\n );\r\n}\r\n\r\nBaseTextField.propTypes = {\r\n inputClassName: PropTypes.string,\r\n\r\n configProps: PropTypes.shape({\r\n key: PropTypes.string.isRequired,\r\n }).isRequired,\r\n\r\n updateItem: PropTypes.func.isRequired,\r\n\r\n value: PropTypes.string,\r\n\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n\r\n optional: PropTypes.bool,\r\n\r\n campaignWebsite: PropTypes.string,\r\n\r\n adsFieldId: PropTypes.string,\r\n\r\n allowNewLines: PropTypes.bool,\r\n\r\n isAutoAdsEnabled: PropTypes.bool,\r\n\r\n showCharRemaining: PropTypes.bool,\r\n\r\n showErrorMessage: PropTypes.bool,\r\n\r\n errorMessage: PropTypes.string,\r\n\r\n assets: PropTypes.arrayOf(PropTypes.shape({\r\n Asset: PropTypes.shape({\r\n Text: PropTypes.string.isRequired,\r\n }).isRequired,\r\n PinnedField: PropTypes.string.isRequired,\r\n })),\r\n\r\n isForVnext: PropTypes.bool,\r\n\r\n index: PropTypes.number,\r\n\r\n updateSuggestionMeasurement: PropTypes.func,\r\n\r\n showDynamicTextExtention: PropTypes.bool,\r\n\r\n onBlur: PropTypes.func,\r\n\r\n llmAssetsSuggestions: PropTypes.shape({\r\n Suggestions: PropTypes.arrayOf(PropTypes.shape({\r\n SuggestionId: PropTypes.string,\r\n Asset: PropTypes.string,\r\n })),\r\n }),\r\n adType: PropTypes.string,\r\n containerSelector: PropTypes.string,\r\n enableDKI: PropTypes.bool,\r\n DKIThemeName: PropTypes.string,\r\n};\r\n\r\nBaseTextField.defaultProps = {\r\n inputClassName: '',\r\n value: '',\r\n optional: true,\r\n campaignWebsite: undefined,\r\n adsFieldId: undefined,\r\n allowNewLines: true,\r\n isAutoAdsEnabled: true,\r\n showCharRemaining: false,\r\n showErrorMessage: false,\r\n errorMessage: undefined,\r\n isForVnext: false,\r\n assets: [],\r\n index: -1,\r\n updateSuggestionMeasurement: _.noop,\r\n showDynamicTextExtention: false,\r\n onBlur: _.noop,\r\n llmAssetsSuggestions: {},\r\n adType: AD_TYPE_RSA,\r\n containerSelector: '.rsa-content-container',\r\n enableDKI: false,\r\n DKIThemeName: '',\r\n};\r\n","import { noop, partial, isString } from 'underscore';\r\nimport React, { useCallback, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Stack } from '@fluentui/react';\r\nimport { getDomain } from '@bingads-webui/url-util';\r\n\r\nimport { Error } from './error';\r\nimport { withError } from './with-error';\r\nimport { BaseTextField } from './base-text-field';\r\nimport { containerStyles, contentStyles } from '../styles';\r\n\r\nconst Path1Field = withError(BaseTextField, 'Path1');\r\nconst Path2Field = withError(BaseTextField, 'Path2');\r\nconst DisplayUrlField = withError(BaseTextField, 'DisplayUrl');\r\nexport function UrlPath(props) {\r\n const {\r\n config,\r\n value,\r\n url,\r\n i18n,\r\n onChange,\r\n IsVanityUrlEnabled,\r\n DisplayUrl,\r\n } = props;\r\n const [Path1, Path2] = value;\r\n\r\n const urlDomain = useMemo(() => getDomain(url), [url]);\r\n\r\n const onTextChange = useCallback((path, newValue) => {\r\n onChange(newValue, path);\r\n }, [onChange]);\r\n\r\n return (\r\n <Stack className=\"url-path\" tokens={contentStyles.errorStackToken}>\r\n <Stack\r\n horizontal\r\n verticalAlign=\"baseline\"\r\n styles={containerStyles.urlPath}\r\n tokens={contentStyles.pathFieldStackToken}\r\n >\r\n {\r\n IsVanityUrlEnabled ?\r\n <DisplayUrlField\r\n configProps={config.DisplayUrl}\r\n value={DisplayUrl || ''}\r\n updateItem={partial(onTextChange, 'DisplayUrl')}\r\n i18n={i18n}\r\n /> :\r\n <div className=\"display-url-text\">\r\n {isString(urlDomain) && urlDomain.length > 0 ?\r\n urlDomain :\r\n 'www.example.com'\r\n }\r\n </div>\r\n }\r\n <div className=\"url-separator\">/</div>\r\n <Path1Field\r\n configProps={config.Path1}\r\n value={Path1}\r\n updateItem={partial(onTextChange, 'Path1')}\r\n i18n={i18n}\r\n optional\r\n />\r\n <div className=\"url-separator\">/</div>\r\n <Path2Field\r\n configProps={config.Path2}\r\n value={Path2}\r\n updateItem={partial(onTextChange, 'Path2')}\r\n i18n={i18n}\r\n optional\r\n />\r\n </Stack>\r\n <Error property=\"DisplayUrl\" />\r\n <Error property=\"Path1\" />\r\n <Error property=\"Path2\" />\r\n </Stack>\r\n );\r\n}\r\n\r\nUrlPath.propTypes = {\r\n config: PropTypes.shape({\r\n }).isRequired,\r\n\r\n value: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n\r\n url: PropTypes.string.isRequired,\r\n\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n\r\n onChange: PropTypes.func,\r\n\r\n IsVanityUrlEnabled: PropTypes.bool,\r\n\r\n DisplayUrl: PropTypes.string,\r\n};\r\n\r\nUrlPath.defaultProps = {\r\n onChange: noop,\r\n IsVanityUrlEnabled: false,\r\n DisplayUrl: '',\r\n};\r\n","import { noop } from 'underscore';\r\nimport React, { useCallback, useMemo, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Dropdown, Stack } from '@fluentui/react';\r\nimport {\r\n getUrlPrefixAndDestination,\r\n getUpdatedFullUrlOnPrefixUpdate,\r\n getUpdatedFullUrlOnTextUpdate,\r\n} from '@bingads-webui-campaign-react/url-input-fluent';\r\n\r\nimport { BaseTextField } from './base-text-field';\r\nimport { Error } from './error';\r\nimport { withError } from './with-error';\r\nimport { contentStyles } from '../styles';\r\n\r\nconst urlPrefixOptions = [\r\n { key: 'https', text: 'https://', title: 'https://' },\r\n { key: 'http', text: 'http://', title: 'http://' },\r\n];\r\n\r\nexport function UrlInput(props) {\r\n const {\r\n config,\r\n url,\r\n i18n,\r\n onChange,\r\n onBlur,\r\n } = props;\r\n const UrlTextField = useMemo(() =>\r\n withError(BaseTextField, config.key), [config.key]);\r\n\r\n const [urlPrefix, urlWithoutPrefix] = useMemo(\r\n () => getUrlPrefixAndDestination(url),\r\n [url]\r\n );\r\n\r\n const [key, setKey] = useState(0);\r\n\r\n const onUrlPrefixChanged = useCallback(\r\n (event, newItem) =>\r\n onChange([getUpdatedFullUrlOnPrefixUpdate(urlWithoutPrefix, newItem.key)], config.key),\r\n [config.key, onChange, urlWithoutPrefix]\r\n );\r\n\r\n const onTextChange = useCallback((value) => {\r\n const newValue = getUpdatedFullUrlOnTextUpdate(urlPrefix, value);\r\n\r\n if (newValue) {\r\n if (newValue === value) { // this means value contains protocol\r\n // forceUpdate UrlTextField, need to ensure the prefix removed. https://msasg.visualstudio.com/Bing_Ads/_workitems/edit/4027143/\r\n setKey(key + 1);\r\n }\r\n onChange([getUpdatedFullUrlOnTextUpdate(urlPrefix, value)], config.key);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [config.key, onChange, urlPrefix]);\r\n\r\n return (\r\n <Stack\r\n className={config.className}\r\n tokens={contentStyles.errorStackToken}\r\n >\r\n <Stack\r\n horizontal\r\n tokens={contentStyles.urlFieldStackToken}\r\n >\r\n <Dropdown\r\n options={urlPrefixOptions}\r\n selectedKey={urlPrefix}\r\n onChange={onUrlPrefixChanged}\r\n ariaLabel={i18n.getString(config.dropdownLabel)}\r\n className=\"url-protocol\"\r\n />\r\n <Stack.Item grow>\r\n <UrlTextField\r\n key={key}\r\n configProps={config}\r\n i18n={i18n}\r\n value={urlWithoutPrefix}\r\n updateItem={onTextChange}\r\n onBlur={onBlur}\r\n optional={config.optional}\r\n inputClassName=\"url-field\"\r\n />\r\n </Stack.Item>\r\n </Stack>\r\n <Error property={config.key} />\r\n </Stack>\r\n );\r\n}\r\n\r\nUrlInput.propTypes = {\r\n config: PropTypes.shape({\r\n className: PropTypes.string,\r\n key: PropTypes.string.isRequired,\r\n }).isRequired,\r\n\r\n url: PropTypes.string.isRequired,\r\n\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n\r\n onChange: PropTypes.func,\r\n\r\n onBlur: PropTypes.func,\r\n};\r\n\r\nUrlInput.defaultProps = {\r\n onChange: noop,\r\n onBlur: noop,\r\n};\r\n","export const defaultUrl = 'https://www.example.com';\r\nexport const urlPrefix = ['https://', 'http://'];\r\n","import { contains, isEmpty, noop } from 'underscore';\r\nimport React, { useEffect, useMemo, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useGroupsPreviewerLayout } from '@bingads-webui-campaign-react/ad-placement-factory';\r\nimport { evaluateAdCustomizers } from '@bingads-webui-campaign/ad-customizers-next';\r\nimport { withDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { getDomain } from '@bingads-webui/url-util';\r\nimport { getTitlePreview, getDescPreview } from '@bingads-webui-campaign-react/ad-common';\r\nimport { defaultUrl, urlPrefix } from './defaults';\r\nimport { getPreviewStyles } from './styles';\r\n\r\nconst adType = 'ResponsiveSearchAd';\r\n\r\nconst RSAPreviewGroupType = 'responsiveSearchAd';\r\n\r\nconst AdPlacementKeys = {\r\n TopView: 'responsive_search_desktop',\r\n SideView: 'responsive_search',\r\n MobileView: 'responsive_search_mobile',\r\n};\r\n\r\nconst previewLayoutConfig = {\r\n groupsDefinitions: [\r\n {\r\n key: 'topView',\r\n groupType: RSAPreviewGroupType,\r\n label: _TL_('Top view'),\r\n placementFilterPredicate: tmp => tmp.key === AdPlacementKeys.TopView,\r\n },\r\n {\r\n key: 'sideView',\r\n groupType: RSAPreviewGroupType,\r\n label: _TL_('Side view'),\r\n placementFilterPredicate: tmp => tmp.key === AdPlacementKeys.SideView,\r\n },\r\n {\r\n key: 'mobileView',\r\n groupType: RSAPreviewGroupType,\r\n label: _TL_('Mobile view'),\r\n placementFilterPredicate: tmp => tmp.key === AdPlacementKeys.MobileView,\r\n },\r\n ],\r\n};\r\n\r\nconst ResponsiveSearchAdPreviewUAPLUnstyled = ({\r\n data: {\r\n Headlines,\r\n Descriptions,\r\n FinalUrls,\r\n DisplayUrl,\r\n Path1,\r\n Path2,\r\n },\r\n classes,\r\n disclaimerInfo,\r\n image,\r\n permissions,\r\n}) => {\r\n const [headline, setHeadline] = useState('');\r\n const [description, setDescription] = useState('');\r\n const [urlPath1, setUrlPath1] = useState('');\r\n const [urlPath2, setUrlPath2] = useState('');\r\n\r\n const finalUrl = useMemo(() => ((isEmpty(FinalUrls) || contains(urlPrefix, FinalUrls[0])) ? defaultUrl : FinalUrls[0]), [FinalUrls]);\r\n const urlDomain = useMemo(() => getDomain(finalUrl), [finalUrl]);\r\n const displayUrl = useMemo(() => `${DisplayUrl || urlDomain}${urlPath1}${urlPath2}`, [DisplayUrl, urlDomain, urlPath1, urlPath2]);\r\n\r\n const { GroupsPreviewer } = useGroupsPreviewerLayout(previewLayoutConfig);\r\n\r\n const headerButtonProps = useMemo(() => ({\r\n onEdit: noop,\r\n onAddAspectRatio: noop,\r\n onRemoveAspectRatio: noop,\r\n }), []);\r\n\r\n useEffect(() => {\r\n evaluateAdCustomizers({\r\n adType,\r\n field: 'Headlines',\r\n text: getTitlePreview(Headlines),\r\n }).then((evaluatedText) => {\r\n setHeadline(evaluatedText);\r\n });\r\n }, [Headlines]);\r\n\r\n useEffect(() => {\r\n evaluateAdCustomizers({\r\n adType,\r\n field: 'Descriptions',\r\n text: getDescPreview(Descriptions, disclaimerInfo ? disclaimerInfo.LineText : ''),\r\n }).then((evaluatedText) => {\r\n setDescription(evaluatedText);\r\n });\r\n }, [Descriptions, disclaimerInfo]);\r\n\r\n useEffect(() => {\r\n evaluateAdCustomizers({\r\n adType,\r\n field: 'Path1',\r\n text: Path1,\r\n }).then((evaluatedText) => {\r\n setUrlPath1(evaluatedText ? `/${evaluatedText}` : '');\r\n });\r\n }, [Path1]);\r\n\r\n useEffect(() => {\r\n evaluateAdCustomizers({\r\n adType,\r\n field: 'Path2',\r\n text: Path2,\r\n }).then((evaluatedText) => {\r\n setUrlPath2(evaluatedText ? `/${evaluatedText}` : '');\r\n });\r\n }, [Path2]);\r\n\r\n const adData = useMemo(() => ({\r\n longHeadline: headline,\r\n description,\r\n url: finalUrl,\r\n displayUrl,\r\n }), [headline, description, finalUrl, displayUrl]);\r\n\r\n const decoratorsData = useMemo(() => ({\r\n disclaimer: disclaimerInfo,\r\n imageExtension: {\r\n image,\r\n enableCrop: permissions && permissions.dynamic && permissions.dynamic.RSAImageExtensionCrop,\r\n },\r\n }), [disclaimerInfo, image, permissions]);\r\n\r\n return (\r\n <div className={classes.adPreviewContainer}>\r\n <GroupsPreviewer\r\n headerButtonProps={headerButtonProps}\r\n adData={adData}\r\n decoratorsData={decoratorsData}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nResponsiveSearchAdPreviewUAPLUnstyled.propTypes = {\r\n data: PropTypes.shape({\r\n Headlines: PropTypes.arrayOf(PropTypes.string),\r\n Descriptions: PropTypes.arrayOf(PropTypes.string),\r\n FinalUrls: PropTypes.arrayOf(PropTypes.string),\r\n DisplayUrl: PropTypes.string,\r\n Path1: PropTypes.string,\r\n Path2: PropTypes.string,\r\n }),\r\n classes: PropTypes.shape({\r\n adPreviewContainer: PropTypes.string,\r\n }).isRequired,\r\n disclaimerInfo: PropTypes.shape({}) || null,\r\n image: PropTypes.shape({}) || null,\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({\r\n RSAImageExtensionCrop: PropTypes.bool,\r\n }),\r\n }),\r\n};\r\n\r\nResponsiveSearchAdPreviewUAPLUnstyled.defaultProps = {\r\n data: {},\r\n disclaimerInfo: null,\r\n image: null,\r\n permissions: {},\r\n};\r\n\r\nexport const ResponsiveSearchAdPreviewUAPL =\r\n withDefaultStyles(ResponsiveSearchAdPreviewUAPLUnstyled, getPreviewStyles);\r\n","export const getPreviewStyles = () => ({\r\n adPreviewContainer: {\r\n '& .new-preview-carousel-container-adprelib': {\r\n width: '610px',\r\n minWidth: '610px',\r\n },\r\n },\r\n});\r\n","import _ from 'underscore';\r\n\r\nexport function formatRSAObject(adItem) {\r\n let adObject = _.pick(adItem, [\r\n 'FinalUrls',\r\n 'DisplayUrl',\r\n 'MobileFinalUrls',\r\n 'Path1',\r\n 'Path2',\r\n 'TrackingUrlTemplate',\r\n 'FinalUrlSuffix',\r\n ]);\r\n\r\n adObject = _.extend(\r\n adObject,\r\n {\r\n '@odata.type': 'Model.ResponsiveSearchAd',\r\n Type: 'ResponsiveSearch',\r\n Headlines: _.map(\r\n _.filter(adItem.Headlines, h => !_.isEmpty(h.Asset.Text.trim())),\r\n h => ({\r\n Asset: {\r\n '@odata.type': '#Model.TextAsset',\r\n AssetType: 'Text',\r\n Name: null,\r\n Text: h.Asset.Text.trim(),\r\n },\r\n PinnedField: h.PinnedField,\r\n })\r\n ),\r\n Descriptions: _.map(\r\n _.filter(adItem.Descriptions, d => !_.isEmpty(d.Asset.Text.trim())),\r\n d => ({\r\n Asset: {\r\n '@odata.type': '#Model.TextAsset',\r\n AssetType: 'Text',\r\n Name: null,\r\n Text: d.Asset.Text.trim(),\r\n },\r\n PinnedField: d.PinnedField,\r\n })\r\n ),\r\n UrlCustomParameters: _.filter(adItem.UrlCustomParameters, ({ Key }) => !_.isEmpty(Key)),\r\n },\r\n adItem.Campaign ? {\r\n Campaign: { Id: adItem.Campaign.Id },\r\n } : {},\r\n adItem.AdGroup ? {\r\n AdGroup: { Id: adItem.AdGroup.Id },\r\n } : {},\r\n _.first(adItem.MobileFinalUrls) === 'https://' || _.first(adItem.MobileFinalUrls) === 'http://' ? {\r\n MobileFinalUrls: [],\r\n } : {}\r\n );\r\n\r\n return adObject;\r\n}\r\n\r\nfunction formatAssetRankingTexts(assetValues) {\r\n const textArr = _.map(assetValues, item => item && item.Asset && item.Asset.Text);\r\n\r\n return _.uniq(_.compact(textArr));\r\n}\r\n\r\nexport function formatRankingTexts(assets) {\r\n return _.mapObject(\r\n assets,\r\n assetValues => formatAssetRankingTexts(assetValues)\r\n );\r\n}\r\n\r\nexport function computeRankingTextsUpdates(currentAssets, prevAssetsRankingTexts) {\r\n const rankingTexts = formatRankingTexts(currentAssets);\r\n\r\n return {\r\n needUpdate: !_.isEqual(rankingTexts, prevAssetsRankingTexts),\r\n value: rankingTexts,\r\n };\r\n}\r\n","import { find, noop } from 'underscore';\r\nimport React, { useCallback, useMemo } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { CommandButton, registerIcons } from '@fluentui/react';\r\nimport pinIcon from '../media/pin.svg';\r\n\r\nregisterIcons({\r\n icons: {\r\n 'pin-icon': (<img style={{ position: 'absolute', left: -4 }} src={pinIcon} alt=\"chatgpt-logo\" />),\r\n },\r\n});\r\nexport function PinButton(props) {\r\n const {\r\n getPinItems,\r\n pinnedPosition,\r\n styles,\r\n onChange,\r\n className,\r\n i18n,\r\n } = props;\r\n const pinItems = getPinItems(i18n);\r\n const selectedText = useMemo(() => {\r\n const item = find(pinItems, c => c.key === pinnedPosition);\r\n return item.value;\r\n }, [pinItems, pinnedPosition]);\r\n\r\n const onMenuItemClick = useCallback((event, item) => {\r\n onChange(item.key);\r\n }, [onChange]);\r\n const onMenuClick = useCallback(() => {\r\n const pickerContainer = document.querySelector('.ad-strength-suggestion-container');\r\n if (pickerContainer) {\r\n ReactDOM.unmountComponentAtNode(pickerContainer);\r\n }\r\n }, []);\r\n return (\r\n <CommandButton\r\n className={`rsa-pin-button ${className}`}\r\n text={selectedText}\r\n menuIconProps={{ iconName: '' }}\r\n iconProps={{ iconName: 'pin-icon' }}\r\n menuProps={{\r\n items: pinItems,\r\n onItemClick: onMenuItemClick,\r\n }}\r\n onMenuClick={onMenuClick}\r\n styles={styles}\r\n />\r\n );\r\n}\r\n\r\nPinButton.propTypes = {\r\n getPinItems: PropTypes.func.isRequired,\r\n\r\n styles: PropTypes.shape({}),\r\n\r\n pinnedPosition: PropTypes.string,\r\n\r\n onChange: PropTypes.func,\r\n\r\n className: PropTypes.string.isRequired,\r\n\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n};\r\n\r\nPinButton.defaultProps = {\r\n pinnedPosition: 'None',\r\n onChange: noop,\r\n styles: {},\r\n};\r\n","// TextAssets is styled separately so that it can be exported as a shared component.\r\nexport const textAssetsStyles = {\r\n deleteButton: {\r\n root: {\r\n height: 32,\r\n '& .ms-Button-label': {\r\n display: 'none',\r\n },\r\n },\r\n },\r\n newPositionDeleteButton: {\r\n root: {\r\n padding: 0,\r\n marginLeft: '5px !important',\r\n marginRight: '5px !important',\r\n height: 32,\r\n '& .ms-Button-label': {\r\n display: 'none',\r\n },\r\n '& img': {\r\n position: 'static !important',\r\n },\r\n },\r\n },\r\n newDeleteButton: {\r\n root: {\r\n marginLeft: '10px !important',\r\n marginRight: '5px !important',\r\n height: 32,\r\n '& .ms-Button-label': {\r\n display: 'none',\r\n },\r\n },\r\n },\r\n newPositionPinButton: {\r\n root: {\r\n height: 32,\r\n selectors: {\r\n '& .ms-Button-menuIcon': {\r\n display: 'none',\r\n },\r\n '& img': {\r\n position: 'static !important',\r\n },\r\n '& i': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n },\r\n },\r\n },\r\n newPinButton: {\r\n root: {\r\n height: 32,\r\n selectors: {\r\n '& .ms-Button-menuIcon': {\r\n display: 'none',\r\n },\r\n '& i': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n },\r\n },\r\n },\r\n pinButton: {\r\n root: {\r\n height: 32,\r\n selectors: {\r\n '& .ms-Button-menuIcon': {\r\n display: 'none',\r\n },\r\n },\r\n },\r\n },\r\n\r\n textAssetsStackToken: {\r\n childrenGap: 16,\r\n },\r\n};\r\n","import _ from 'underscore';\r\nimport React, { useCallback, useEffect, useState, useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {\r\n ActionButton,\r\n Stack,\r\n CommandButton,\r\n registerIcons\r\n} from '@fluentui/react';\r\nimport classNames from 'classnames';\r\nimport { CopilotTextAssetRecommendation } from '@bingads-webui/inline-copilot';\r\nimport { getCharCountExcludingAdCustomizers } from '@bingads-webui-campaign/ad-customizers-next';\r\nimport { useEventLog, EMPTY_ASSET_HINTS, NO_FINAL_URL_HINT } from '@bingads-webui-campaign-react/copilot-common';\r\nimport { RecommendationContext } from '@bingads-webui-campaign/responsive-search-ad-recommendation';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { BaseTextField } from './base-text-field';\r\nimport { Error } from './error';\r\nimport { withError } from './with-error';\r\nimport { PinButton } from './pin-button';\r\nimport { textAssetsStyles } from './text-assets-styles';\r\nimport deleteIcon from '../media/delete.svg';\r\n\r\nconst TextAssetFields = {\r\n Headline: _.map(_.range(15), i => withError(BaseTextField, `Headline${i}`)),\r\n Description: _.map(_.range(4), i => withError(BaseTextField, `Description${i}`)),\r\n};\r\n\r\nregisterIcons({\r\n icons: {\r\n 'delete-icon': (<img style={{ position: 'absolute', left: -4 }} src={deleteIcon} alt=\"chatgpt-logo\" />),\r\n },\r\n});\r\n\r\nconst recommendationAssetTypeMap = {\r\n Headlines: 'headline',\r\n Descriptions: 'description',\r\n};\r\n\r\nconst recommendationAssetTypePluralMap = {\r\n Headlines: 'headlines',\r\n Descriptions: 'descriptions',\r\n};\r\n\r\nconst getStyles = () => ({\r\n copilotButton: {\r\n marginLeft: '8px',\r\n '& .text-asset-copilot > button': {\r\n height: '32px',\r\n },\r\n },\r\n});\r\n\r\nexport function TextAssets(props) {\r\n const {\r\n config,\r\n assets,\r\n i18n,\r\n onChange,\r\n onBlur,\r\n isForVnext,\r\n updateSuggestionMeasurement,\r\n showDynamicTextExtention,\r\n llmAssetsSuggestions,\r\n showDeleteButton,\r\n showCopilotButton,\r\n finalUrlWithoutPrefix,\r\n existingAssets,\r\n onSuggestionsRendered,\r\n isNewTextAssetsButtonStyle,\r\n permissions,\r\n } = props;\r\n\r\n const {\r\n copilotButtonLabel,\r\n defaultSize,\r\n deleteButtonLabel,\r\n getPinItems,\r\n inputLabel,\r\n itemProperty,\r\n maxSize,\r\n property,\r\n enableDKI,\r\n DKIThemeName,\r\n } = config;\r\n\r\n const [recommendationContext] = useContext(RecommendationContext);\r\n const { postAssetEventLog = _.noop, themes, copilotTracking } = recommendationContext;\r\n const {\r\n logTextAssetMenuOpen,\r\n logTextAssetDialogOpen,\r\n logRefineTextAsset,\r\n logTextAssetApplied,\r\n logRemoveSingleAsset,\r\n logEditSingleAsset,\r\n } = useEventLog(postAssetEventLog);\r\n\r\n const [cachedAssets, setCachedAssets] = useState(assets);\r\n const classes = useDefaultStyles(getStyles);\r\n\r\n useEffect(() => setCachedAssets(assets), [assets]);\r\n\r\n useEffect(() => {\r\n if (_.size(cachedAssets) > maxSize) {\r\n setCachedAssets(cachedAssets.slice(0, maxSize));\r\n } else if (_.size(cachedAssets) < defaultSize) {\r\n const filledAssets = [...cachedAssets];\r\n for (let i = 0; i < defaultSize - _.size(cachedAssets); i += 1) {\r\n filledAssets.push({\r\n Asset: {\r\n '@odata.type': '#Model.TextAsset',\r\n AssetType: 'Text',\r\n Name: null,\r\n Text: '',\r\n },\r\n PinnedField: 'None',\r\n });\r\n }\r\n setCachedAssets(filledAssets);\r\n }\r\n }, [cachedAssets, maxSize, defaultSize]);\r\n\r\n const onAddAsset = useCallback(() => {\r\n if (cachedAssets.length < maxSize) {\r\n const newAssets = [\r\n ...cachedAssets,\r\n {\r\n Asset: {\r\n '@odata.type': '#Model.TextAsset',\r\n AssetType: 'Text',\r\n Name: null,\r\n Text: '',\r\n },\r\n PinnedField: 'None',\r\n },\r\n ];\r\n setCachedAssets(newAssets);\r\n onChange(newAssets, property);\r\n }\r\n }, [cachedAssets, maxSize, onChange, property]);\r\n\r\n const onTextChange = useCallback((index, value, key, populatedWithFullValue) => {\r\n const newAssets = [...cachedAssets];\r\n const deletedAsset = newAssets[index].Asset.Text;\r\n const pluralAssetType = recommendationAssetTypePluralMap[property];\r\n\r\n newAssets[index].Asset.Text = value;\r\n setCachedAssets(newAssets);\r\n onChange(newAssets, `${itemProperty}${index}`);\r\n\r\n if (copilotTracking.isInRemainingInitialSuggestions(itemProperty, deletedAsset)) {\r\n copilotTracking.removeInitialSuggestion(itemProperty, deletedAsset);\r\n\r\n const recommendationId = _.chain(themes)\r\n .map(theme => _.chain(theme)\r\n .get(pluralAssetType, [])\r\n .find(asset => asset.Text === deletedAsset)\r\n .get('RecommendationId')\r\n .value())\r\n .compact()\r\n .first()\r\n .value();\r\n\r\n if (recommendationId) {\r\n logEditSingleAsset(itemProperty, recommendationId);\r\n }\r\n }\r\n\r\n // populating suggestion will not trigger onBlur, so needs to handle specially.\r\n if (populatedWithFullValue) {\r\n onBlur(newAssets, `${itemProperty}${index}`);\r\n }\r\n }, [cachedAssets, property, onChange, itemProperty, copilotTracking, themes, logEditSingleAsset, onBlur]);\r\n\r\n const onTextBlur = useCallback((index) => {\r\n onBlur(cachedAssets, `${itemProperty}${index}`);\r\n }, [cachedAssets, itemProperty, onBlur]);\r\n\r\n const onPinChange = useCallback((index, value) => {\r\n const newAssets = [...cachedAssets];\r\n newAssets[index].PinnedField = value;\r\n setCachedAssets(newAssets);\r\n onChange(newAssets, property);\r\n }, [cachedAssets, onChange, property]);\r\n\r\n const onDeleteAsset = useCallback((index) => {\r\n const newAssets = [...cachedAssets];\r\n const deletedAsset = newAssets[index].Asset.Text;\r\n const pluralAssetType = recommendationAssetTypePluralMap[property];\r\n\r\n if (cachedAssets.length > defaultSize) {\r\n newAssets.splice(index, 1);\r\n } else {\r\n for (let i = index; i < newAssets.length - 1; i += 1) {\r\n newAssets[i].Asset.Text = newAssets[i + 1].Asset.Text;\r\n }\r\n newAssets[newAssets.length - 1].Asset.Text = '';\r\n }\r\n setCachedAssets(newAssets);\r\n onChange(newAssets, property);\r\n\r\n if (!copilotTracking.isInRemainingInitialSuggestions(itemProperty, deletedAsset)) { return; }\r\n copilotTracking.removeInitialSuggestion(itemProperty, deletedAsset);\r\n\r\n const recommendationId = _.chain(themes)\r\n .map(theme => _.chain(theme)\r\n .get(pluralAssetType, [])\r\n .find(asset => asset.Text === deletedAsset)\r\n .get('RecommendationId')\r\n .value())\r\n .compact()\r\n .first()\r\n .value();\r\n\r\n if (recommendationId) {\r\n logRemoveSingleAsset(itemProperty, recommendationId);\r\n }\r\n }, [cachedAssets, property, defaultSize, onChange, themes, logRemoveSingleAsset, itemProperty, copilotTracking]);\r\n\r\n const isPinningEnabled = !_.isUndefined(getPinItems);\r\n\r\n const assetType = recommendationAssetTypeMap[property];\r\n const calculateDisableReason = (text) => {\r\n if (_.isEmpty(text.trim())) {\r\n return i18n.getString(EMPTY_ASSET_HINTS[assetType]);\r\n }\r\n if (!finalUrlWithoutPrefix) {\r\n return i18n.getString(NO_FINAL_URL_HINT);\r\n }\r\n if (getCharCountExcludingAdCustomizers({\r\n text,\r\n adType: 'ResponsiveSearchAd',\r\n field: property,\r\n }) !== text.length) {\r\n return i18n.getString(_TL_('Microsoft Advertising can\\'t use dynamic texts for generating asset recommendations. Please enter static text and try again.'));\r\n }\r\n return null;\r\n };\r\n\r\n return (\r\n <Stack\r\n className={config.className}\r\n tokens={textAssetsStyles.textAssetsStackToken}\r\n >\r\n {_.map(cachedAssets, (asset, index) => {\r\n const TextAsset = TextAssetFields[itemProperty][index];\r\n\r\n return (\r\n <Stack key={`asset-${property}-${index}`}>\r\n <Stack horizontal>\r\n <Stack.Item grow>\r\n <TextAsset\r\n assets={cachedAssets}\r\n configProps={{\r\n key: property,\r\n className: config.itemClassName,\r\n ariaLabel: i18n.getString(inputLabel, { index: index + 1 }),\r\n }}\r\n value={asset.Asset.Text}\r\n updateItem={_.partial(onTextChange, index)}\r\n i18n={i18n}\r\n optional\r\n showCharRemaining\r\n showErrorMessage\r\n isForVnext={isForVnext}\r\n index={index}\r\n updateSuggestionMeasurement={updateSuggestionMeasurement}\r\n showDynamicTextExtention={showDynamicTextExtention}\r\n onBlur={_.partial(onTextBlur, index)}\r\n llmAssetsSuggestions={llmAssetsSuggestions}\r\n enableDKI={permissions && permissions.dynamic && permissions.dynamic.CopilotDKIRecommendation && enableDKI}\r\n DKIThemeName={DKIThemeName}\r\n />\r\n </Stack.Item>\r\n {showCopilotButton && (\r\n <div className={classNames('copilot-button', classes.copilotButton)}>\r\n <CopilotTextAssetRecommendation\r\n assetType={assetType}\r\n currentIndex={index}\r\n disableReason={calculateDisableReason(cachedAssets[index].Asset.Text)}\r\n existingAssets={existingAssets}\r\n menuButtonAriaLabel={i18n.getString(copilotButtonLabel, { index: index + 1 })}\r\n onMenuOpen={logTextAssetMenuOpen}\r\n onOperationDialogOpen={logTextAssetDialogOpen}\r\n onFetch={logRefineTextAsset}\r\n onSelect={(newAsset, operationName) => {\r\n const text = _.get(newAsset, ['value', 0, 'text']);\r\n logTextAssetApplied(assetType, operationName);\r\n onTextChange(index, text, property);\r\n }}\r\n onSuggestionsRendered={onSuggestionsRendered}\r\n />\r\n </div>\r\n )}\r\n {showDeleteButton && (\r\n <CommandButton\r\n className={`rsa-delete-button ${property}-${index}`}\r\n iconProps={{ iconName: 'delete-icon' }}\r\n styles={isNewTextAssetsButtonStyle ? textAssetsStyles.newPositionDeleteButton : textAssetsStyles.newDeleteButton}\r\n onClick={() => onDeleteAsset(index)}\r\n ariaLabel={i18n.getString(deleteButtonLabel, { index: index + 1 })}\r\n />\r\n )}\r\n\r\n {isPinningEnabled && (\r\n <PinButton\r\n className={`asset-pin-btn ${property}-${index}`}\r\n getPinItems={getPinItems}\r\n pinnedPosition={asset.PinnedField}\r\n styles={isNewTextAssetsButtonStyle ? textAssetsStyles.newPositionPinButton : textAssetsStyles.newPinButton}\r\n i18n={i18n}\r\n onChange={_.partial(onPinChange, index)}\r\n />\r\n )}\r\n </Stack>\r\n </Stack>\r\n );\r\n })}\r\n\r\n <Error property={property} />\r\n\r\n <ActionButton\r\n className=\"add-asset-btn\"\r\n iconProps={{ iconName: 'Add' }}\r\n allowDisabledFocus\r\n disabled={cachedAssets.length >= maxSize}\r\n onClick={onAddAsset}\r\n >\r\n {i18n.getString(config.addLabel)}\r\n </ActionButton>\r\n </Stack>\r\n );\r\n}\r\n\r\nTextAssets.propTypes = {\r\n config: PropTypes.shape({\r\n addLabel: PropTypes.string.isRequired,\r\n className: PropTypes.string,\r\n copilotButtonLabel: PropTypes.string.isRequired,\r\n defaultSize: PropTypes.number.isRequired,\r\n deleteButtonLabel: PropTypes.string.isRequired,\r\n getPinItems: PropTypes.func,\r\n inputLabel: PropTypes.string,\r\n itemClassName: PropTypes.string,\r\n itemProperty: PropTypes.string,\r\n maxSize: PropTypes.number.isRequired,\r\n property: PropTypes.string,\r\n enableDKI: PropTypes.bool,\r\n DKIThemeName: PropTypes.string,\r\n }).isRequired,\r\n\r\n assets: PropTypes.arrayOf(PropTypes.shape({\r\n Asset: PropTypes.shape({\r\n Text: PropTypes.string.isRequired,\r\n }).isRequired,\r\n PinnedField: PropTypes.string.isRequired,\r\n })),\r\n\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n\r\n onChange: PropTypes.func,\r\n onBlur: PropTypes.func,\r\n\r\n isForVnext: PropTypes.bool.isRequired,\r\n\r\n updateSuggestionMeasurement: PropTypes.func.isRequired,\r\n\r\n showDynamicTextExtention: PropTypes.bool.isRequired,\r\n\r\n llmAssetsSuggestions: PropTypes.shape({\r\n Suggestions: PropTypes.arrayOf(PropTypes.shape({\r\n SuggestionId: PropTypes.string,\r\n Asset: PropTypes.string,\r\n })),\r\n }),\r\n showDeleteButton: PropTypes.bool,\r\n finalUrlWithoutPrefix: PropTypes.string,\r\n showCopilotButton: PropTypes.bool,\r\n existingAssets: PropTypes.shape({}),\r\n onSuggestionsRendered: PropTypes.func,\r\n isNewTextAssetsButtonStyle: PropTypes.bool,\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({\r\n CopilotDKIRecommendation: PropTypes.bool,\r\n }),\r\n }),\r\n};\r\n\r\nTextAssets.defaultProps = {\r\n assets: [],\r\n onChange: _.noop,\r\n onBlur: _.noop,\r\n llmAssetsSuggestions: {},\r\n showDeleteButton: false,\r\n finalUrlWithoutPrefix: '',\r\n showCopilotButton: false,\r\n existingAssets: {},\r\n onSuggestionsRendered: _.noop,\r\n isNewTextAssetsButtonStyle: false,\r\n permissions: {},\r\n};\r\n","import React from 'react';\r\nimport _ from 'underscore';\r\nimport PropTypes from 'prop-types';\r\n\r\nexport const Disclaimer = (props) => {\r\n const { disclaimerInfo, i18n, permissions } = props;\r\n const showAdvancedInformation = permissions && permissions.dynamic && permissions.dynamic.SearchCampaignCreationRevamp;\r\n\r\n if (!_.isEmpty(disclaimerInfo)) {\r\n if (disclaimerInfo.DisclaimerLayout === 'Popup') {\r\n return (\r\n <p className=\"disclaimer-text\">\r\n {showAdvancedInformation ?\r\n i18n.getString(_TL_('Campaign level disclaimer: {{name}}'), { name: disclaimerInfo.Name }) :\r\n i18n.getString(_TL_('Campaign level disclaimer'))}\r\n </p>\r\n );\r\n }\r\n if (disclaimerInfo.DisclaimerLayout === 'AdditionalLine') {\r\n return (\r\n <p className=\"disclaimer-text\">\r\n {showAdvancedInformation ?\r\n i18n.getString(_TL_('Campaign level disclaimer: {{name}}\\n(Note: Additional line layout disclaimers will not have description 2.)'), { name: disclaimerInfo.Name }) :\r\n i18n.getString(_TL_('Campaign level disclaimer (Note: Additional line layout disclaimers will not have description 2.)'))}\r\n </p>\r\n );\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nDisclaimer.propTypes = {\r\n disclaimerInfo: PropTypes.shape({\r\n DisclaimerLayout: PropTypes.string,\r\n Name: PropTypes.string,\r\n }),\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({\r\n SearchCampaignCreationRevamp: PropTypes.bool,\r\n }),\r\n }),\r\n};\r\n\r\nDisclaimer.defaultProps = {\r\n disclaimerInfo: null,\r\n permissions: {\r\n dynamic: {\r\n SearchCampaignCreationRevamp: false,\r\n },\r\n },\r\n};\r\n","import { adsFields } from './validators';\r\n\r\nexport const headlinesConfig = {\r\n property: 'Headlines',\r\n itemProperty: 'Headline',\r\n className: 'rsa-field-headlines',\r\n itemClassName: 'rsa-field-headline',\r\n minSize: 3,\r\n maxSize: 15,\r\n defaultSize: 5,\r\n addLabel: _TL_('Add headline'),\r\n inputLabel: _TL_('Headline {{index}}'),\r\n copilotButtonLabel: _TL_('Get recommendations for headline {{index}}'),\r\n deleteButtonLabel: _TL_('Delete headline {{index}}'),\r\n getPinItems: i18n => [\r\n {\r\n key: 'None',\r\n text: i18n.getString(_TL_('Show this headline in any unpinned position')),\r\n value: i18n.getString(_TL_('Pin')),\r\n },\r\n {\r\n key: 'Headline1',\r\n text: i18n.getString(_TL_('Show this headline only in position 1')),\r\n value: i18n.getString(_TL_('1')),\r\n },\r\n {\r\n key: 'Headline2',\r\n text: i18n.getString(_TL_('Show this headline only in position 2')),\r\n value: i18n.getString(_TL_('2')),\r\n },\r\n {\r\n key: 'Headline3',\r\n text: i18n.getString(_TL_('Show this headline only in position 3')),\r\n value: i18n.getString(_TL_('3')),\r\n },\r\n ],\r\n errorMap: {\r\n lessThanRequired: _TL_('Please add at least three headlines, excluding headlines containing countdowns or location insertions.'),\r\n duplicate: _TL_('Remove duplicate headline.'),\r\n lessPosition: _TL_('You do not have enough headlines. Add at least 3 headlines or pin headlines to each position.'),\r\n },\r\n enableDKI: true,\r\n DKIThemeName: _TL_('Headline with dynamic keyword'),\r\n};\r\n\r\nexport const descriptionsConfig = {\r\n property: 'Descriptions',\r\n itemProperty: 'Description',\r\n className: 'rsa-field-descriptions',\r\n itemClassName: 'rsa-field-description',\r\n minSize: 2,\r\n maxSize: 4,\r\n defaultSize: 2,\r\n addLabel: _TL_('Add description'),\r\n inputLabel: _TL_('Description {{index}}'),\r\n copilotButtonLabel: _TL_('Get recommendations for description {{index}}'),\r\n deleteButtonLabel: _TL_('Delete description {{index}}'),\r\n getPinItems: i18n => [\r\n {\r\n key: 'None',\r\n text: i18n.getString(_TL_('Show this description in any unpinned position')),\r\n value: i18n.getString(_TL_('Pin')),\r\n },\r\n {\r\n key: 'Description1',\r\n text: i18n.getString(_TL_('Show this description only in position 1')),\r\n value: i18n.getString(_TL_('1')),\r\n },\r\n {\r\n key: 'Description2',\r\n text: i18n.getString(_TL_('Show this description only in position 2')),\r\n value: i18n.getString(_TL_('2')),\r\n },\r\n ],\r\n errorMap: {\r\n lessThanRequired: _TL_('Please add at least two descriptions, excluding descriptions containing countdowns or location insertions.'),\r\n duplicate: _TL_('Remove duplicate description.'),\r\n lessPosition: _TL_('You do not have enough descriptions. Add at least 2 descriptions or pin descriptions to each position.'),\r\n },\r\n};\r\n\r\nexport const adFieldsConfig = {\r\n Headlines: {\r\n key: adsFields.HEADLINES,\r\n className: 'rsa-field-headline',\r\n assetsConfig: headlinesConfig,\r\n },\r\n Descriptions: {\r\n key: adsFields.DESCRIPTIONS,\r\n className: 'rsa-field-description',\r\n assetsConfig: descriptionsConfig,\r\n },\r\n DestinationUrl: {\r\n key: adsFields.DESTINATION_URL,\r\n className: 'rsa-field-final-url',\r\n inputClassName: 'no-inline-error',\r\n ariaLabel: _TL_('Final URL'),\r\n dropdownLabel: _TL_('Final URL options'),\r\n optional: false,\r\n },\r\n DisplayUrl: {\r\n key: adsFields.DISPLAY_URL,\r\n className: 'rsa-field-display-url',\r\n inputClassName: 'no-inline-error',\r\n ariaLabel: _TL_('Display URL'),\r\n optional: false,\r\n },\r\n Path1: {\r\n key: adsFields.PATH1,\r\n className: 'rsa-field-path1',\r\n inputClassName: 'no-inline-error',\r\n ariaLabel: _TL_('Path 1'),\r\n },\r\n Path2: {\r\n key: adsFields.PATH2,\r\n className: 'rsa-field-path2',\r\n inputClassName: 'no-inline-error',\r\n ariaLabel: _TL_('Path 2'),\r\n },\r\n MobileUrl: {\r\n key: adsFields.MOBILE_URL,\r\n className: 'rsa-field-mobile-url',\r\n inputClassName: 'no-inline-error',\r\n ariaLabel: _TL_('Mobile URL'),\r\n dropdownLabel: _TL_('Mobile URL options'),\r\n optional: true,\r\n },\r\n TrackingUrlTemplate: {\r\n key: adsFields.TRACKING_URL_TEMPLATE,\r\n className: 'rsa-field-url-tracking-template',\r\n inputClassName: 'no-inline-error',\r\n ariaLabel: _TL_('Tracking template'),\r\n optional: true,\r\n },\r\n FinalUrlSuffix: {\r\n key: adsFields.FINAL_URL_SUFFIX,\r\n className: 'rsa-field-final-url-suffix',\r\n inputClassName: 'no-inline-error',\r\n ariaLabel: _TL_('Final URL suffix'),\r\n optional: true,\r\n },\r\n UrlCustomParameters: {\r\n key: adsFields.URL_CUSTOM_PARAMETERS,\r\n className: 'rsa-field-url-custom-parameters',\r\n inputClassName: 'no-inline-error',\r\n optional: true,\r\n },\r\n};\r\n","import React, { useCallback, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { CopilotRecommendationBanner, CopilotThemesRecommendationDialog } from '@bingads-webui/inline-copilot';\r\n\r\nexport function ResponsiveSearchAdCopilotBannerWithDialog(props) {\r\n const {\r\n eventLog,\r\n isCopilotEnabled,\r\n onApply,\r\n onDialogFetchAssetsSucceeded,\r\n onFetch,\r\n onFetchFailed,\r\n onFetchSucceeded,\r\n onReset,\r\n } = props;\r\n\r\n const {\r\n logBannerRefresh,\r\n logBannerRefreshCompleted,\r\n logFetch,\r\n logFetchSucceeded,\r\n } = eventLog;\r\n\r\n const [showCopilotDialog, setShowCopilotDialog] = useState(false);\r\n\r\n const handleCopilotDialogClose = useCallback(() => {\r\n setShowCopilotDialog(false);\r\n }, []);\r\n\r\n const handleRefresh = useCallback(() => {\r\n setShowCopilotDialog(true);\r\n logBannerRefresh();\r\n }, [logBannerRefresh]);\r\n\r\n const handleFetchThemesSucceeded = useCallback((url, themesList) => {\r\n logFetchSucceeded(url, themesList);\r\n }, [logFetchSucceeded]);\r\n\r\n const handleApply = useCallback((selectedThemes, selectedThemesAndAssets) => {\r\n onApply(selectedThemes, selectedThemesAndAssets);\r\n handleCopilotDialogClose();\r\n }, [handleCopilotDialogClose, onApply]);\r\n\r\n if (!isCopilotEnabled) {\r\n // copilot is not enabled, do not display the banner or fetch any recommendations\r\n return null;\r\n }\r\n\r\n return (\r\n <React.Fragment>\r\n <CopilotRecommendationBanner\r\n isToastEnabled={false}\r\n onRefresh={handleRefresh}\r\n onReset={onReset}\r\n onBannerRefreshCompleted={logBannerRefreshCompleted}\r\n shouldFetchRecommendations\r\n onFetch={onFetch}\r\n onFetchFailed={onFetchFailed}\r\n onFetchSucceeded={onFetchSucceeded}\r\n />\r\n {showCopilotDialog && (\r\n <CopilotThemesRecommendationDialog\r\n onApply={handleApply}\r\n onClosed={handleCopilotDialogClose}\r\n onFetch={logFetch}\r\n onFetchAssetsSucceeded={onDialogFetchAssetsSucceeded}\r\n onFetchSucceeded={handleFetchThemesSucceeded}\r\n open\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n}\r\n\r\nResponsiveSearchAdCopilotBannerWithDialog.propTypes = {\r\n eventLog: PropTypes.shape({\r\n logBannerRefresh: PropTypes.func,\r\n logBannerRefreshCompleted: PropTypes.func,\r\n logFetch: PropTypes.func,\r\n logFetchSucceeded: PropTypes.func,\r\n }).isRequired,\r\n isCopilotEnabled: PropTypes.bool,\r\n onApply: PropTypes.func.isRequired,\r\n onDialogFetchAssetsSucceeded: PropTypes.func.isRequired,\r\n onFetch: PropTypes.func.isRequired,\r\n onFetchFailed: PropTypes.func.isRequired,\r\n onFetchSucceeded: PropTypes.func.isRequired,\r\n onReset: PropTypes.func.isRequired,\r\n};\r\n\r\nResponsiveSearchAdCopilotBannerWithDialog.defaultProps = {\r\n isCopilotEnabled: false,\r\n};\r\n","import _ from 'underscore';\r\nimport React, { useCallback, useEffect, useState, useContext, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {\r\n DefaultButton,\r\n Label,\r\n PrimaryButton,\r\n Stack,\r\n getId,\r\n} from '@fluentui/react';\r\nimport { FluentProvider, makeStyles, webLightTheme } from '@fluentui/react-components';\r\nimport { HelpPopupInline } from '@bingads-webui-react/help-popup';\r\nimport {\r\n AssetEventFeature,\r\n AssetPropertyName,\r\n getCopilotRecommendationIdsFromThemes,\r\n getFormattedThemeForApplying,\r\n getUniqueAssetsFromThemes,\r\n useCopilotRecommendationSurvey,\r\n useAssetLibraryEventHandler,\r\n getFormattedImage,\r\n logCopilotRecommendations,\r\n} from '@bingads-webui-campaign-react/copilot-common';\r\nimport { ResponsiveSearchAdPreviewUAPL } from '@bingads-webui-campaign-react/responsive-search-ad-preview-uapl';\r\nimport { ResponsiveSearchAdStrength } from '@bingads-webui-campaign-react/responsive-search-ad-suggestion';\r\nimport {\r\n UrlOptionsParameters,\r\n validateTrackingUrlTemplate,\r\n validateFinalUrlSuffix,\r\n validateUrlCustomParameters,\r\n} from '@bingads-webui-campaign-react/url-options';\r\nimport { PermissionsContext } from '@bingads-webui-react/hoc-with-permissions';\r\nimport { initializeAdCustomizer } from '@bingads-webui-campaign/ad-customizers-next';\r\nimport { HeadlineAssetCollection, DescriptionAssetCollection, useCopilotRecommendations, RecommendationContext, withRecommendationContext, formatToLLMSuggestion, MAX_INLINE_RECOMMENDATIONS_PER_PAGE } from '@bingads-webui-campaign/responsive-search-ad-recommendation';\r\nimport { InstrumentationContext } from '@bingads-webui-react/hoc-with-instrumentation';\r\nimport {\r\n getUrlPrefixAndDestination,\r\n getUpdatedFullUrlOnPrefixUpdate,\r\n getUpdatedFullUrlOnTextUpdate,\r\n validateAdUrl\r\n} from '@bingads-webui-campaign-react/url-input-fluent';\r\nimport { Collapse, TextTitle } from '@bingads-webui-campaign/wizard-jumbo-card';\r\nimport { setClarityTag } from '@bingads-webui-universal/clarity';\r\nimport { CopilotRepositoryProvider, withBannerService } from '@bingads-webui/inline-copilot';\r\nimport { withActivityContext } from '@bingads-webui-react/hoc-with-signal';\r\n\r\nimport {\r\n adsFields,\r\n adsFieldAlias,\r\n adsFieldLengthLimitMap,\r\n validateTextFieldValue,\r\n validateTextAssets,\r\n validatePath,\r\n AD_TYPE_RSA,\r\n} from './validators';\r\nimport { containerStyles, contentStyles, stickyAdPreviewStyles } from './styles';\r\nimport { ErrorContext } from './controls/error';\r\nimport { UrlInput } from './controls/url-input';\r\nimport { UrlPath } from './controls/url-path';\r\nimport { formatRankingTexts, computeRankingTextsUpdates } from './utils/format';\r\nimport { TextAssets } from './controls/text-assets';\r\nimport { Disclaimer } from './controls/disclaimer';\r\nimport { adFieldsConfig, headlinesConfig, descriptionsConfig } from './config';\r\nimport { useCopilotForResponsiveSearchAd } from './use-copilot-for-responsive-search-ad';\r\nimport { ResponsiveSearchAdCopilotBannerWithDialog } from './responsive-search-ad-copilot-banner-with-dialog';\r\nimport UrlIcon from './media/url.svg';\r\nimport TextIcon from './media/text.svg';\r\nimport ImageIcon from './media/image.svg';\r\nimport DisclaimerIcon from './media/disclaimer.svg';\r\n\r\n// keep the order to ensure the focus order when errors are present\r\nconst adsFieldsToValidate = [\r\n adsFields.DESTINATION_URL,\r\n adsFields.MOBILE_URL,\r\n adsFields.PATH1,\r\n adsFields.PATH2,\r\n adsFields.HEADLINES,\r\n adsFields.DESCRIPTIONS,\r\n adsFields.TRACKING_URL_TEMPLATE,\r\n adsFields.FINAL_URL_SUFFIX,\r\n adsFields.URL_CUSTOM_PARAMETERS,\r\n];\r\n\r\nconst optionalFields = [\r\n adsFields.HEADLINES,\r\n adsFields.DESCRIPTIONS,\r\n adsFields.PATH1,\r\n adsFields.PATH2,\r\n adsFields.MOBILE_URL,\r\n adsFields.TRACKING_URL_TEMPLATE,\r\n adsFields.FINAL_URL_SUFFIX,\r\n adsFields.URL_CUSTOM_PARAMETERS,\r\n];\r\n\r\nconst requiredCompoundFields = [\r\n adsFields.HEADLINES,\r\n adsFields.DESCRIPTIONS,\r\n];\r\n\r\nconst textAssets = [\r\n adsFields.HEADLINES,\r\n adsFields.DESCRIPTIONS,\r\n];\r\n\r\nconst isSingleFieldOptional = field => _.contains(optionalFields, field);\r\nconst isCompoundFieldRequired = field => _.contains(requiredCompoundFields, field);\r\n\r\nconst isFieldEmpty = (field, fieldValue) => {\r\n switch (field) {\r\n case adsFields.HEADLINES:\r\n case adsFields.DESCRIPTIONS:\r\n return _.every(fieldValue, value => _.isEmpty(_.property(['Asset', 'Text'])(value)));\r\n default:\r\n break;\r\n }\r\n return _.isEmpty(fieldValue);\r\n};\r\n\r\nconst fieldMappings = {};\r\n_.each(_.range(15), (i) => { fieldMappings[`Headline${i}`] = 'Headlines'; });\r\n_.each(_.range(4), (i) => { fieldMappings[`Description${i}`] = 'Descriptions'; });\r\n\r\nconst fieldDependencies = {\r\n ...fieldMappings,\r\n [adsFields.PATH1]: adsFields.PATH2,\r\n [adsFields.PATH2]: adsFields.PATH1,\r\n};\r\n\r\nconst validators = {\r\n [adsFields.PATH1]: validatePath,\r\n [adsFields.PATH2]: validatePath,\r\n [adsFields.TRACKING_URL_TEMPLATE]: validateTrackingUrlTemplate,\r\n [adsFields.FINAL_URL_SUFFIX]: validateFinalUrlSuffix,\r\n [adsFields.URL_CUSTOM_PARAMETERS]: validateUrlCustomParameters,\r\n};\r\n\r\nconst useStyles = makeStyles({\r\n theme: {\r\n backgroundColor: 'transparent',\r\n },\r\n});\r\n\r\nexport function ResponsiveSearchAdEditorBase(props) {\r\n const {\r\n item,\r\n errors,\r\n i18n,\r\n onSave,\r\n onCancel,\r\n onChanged,\r\n onFetchAdStrengthV2,\r\n onFetchDisclaimerInfo,\r\n showActionBar,\r\n showInitialErrors,\r\n timeZone,\r\n AdPreviewComponent,\r\n permissions,\r\n token,\r\n triggerTestUurl,\r\n showUurlTestTool,\r\n showFinalUrlSuffix,\r\n showAdCustomizers,\r\n showDynamicTextExtention,\r\n isForVnext,\r\n updateSuggestionMeasurement,\r\n edmCampaign,\r\n jsDataCampaign,\r\n renderImageExtension,\r\n injectSetPreviewImage,\r\n perfMarker,\r\n serverContext,\r\n scope,\r\n editMode,\r\n saveLogAppliedSuggestionsFunc,\r\n saveAssetLibraryEventHandler,\r\n isSaving,\r\n isCanceling,\r\n onFirstErrorHandler,\r\n isNewTextAssetsButtonStyle,\r\n activityLogger,\r\n } = props;\r\n const instrumentation = useContext(InstrumentationContext);\r\n\r\n const styles = useStyles();\r\n\r\n initializeAdCustomizer({\r\n deps: {\r\n i18n,\r\n permissions,\r\n instrumentation,\r\n timeZone,\r\n showAdCustomizers,\r\n edmCampaign,\r\n jsDataCampaign,\r\n scope,\r\n },\r\n adType: AD_TYPE_RSA,\r\n });\r\n\r\n if (permissions.IsVanityUrlEnabled && !_.contains(adsFieldsToValidate, adsFields.DISPLAY_URL)) {\r\n adsFieldsToValidate.push(adsFields.DISPLAY_URL);\r\n }\r\n const [cachedAd, setCachedAd] = useState(item);\r\n const [cachedValuesForImageSuggestions, setCachedValuesForImageSuggestions] = useState(() =>\r\n formatRankingTexts({\r\n Headlines: item.data.Headlines,\r\n Descriptions: item.data.Descriptions,\r\n }));\r\n\r\n const {\r\n data,\r\n errors: clientErrors,\r\n } = cachedAd;\r\n\r\n const {\r\n Headlines,\r\n Descriptions,\r\n Path1,\r\n Path2,\r\n FinalUrls,\r\n DisplayUrl,\r\n MobileFinalUrls,\r\n TrackingUrlTemplate,\r\n FinalUrlSuffix,\r\n UrlCustomParameters,\r\n Id,\r\n } = data;\r\n\r\n const [formErrors, setFormErrors] = useState(clientErrors);\r\n const errorContextValue = useMemo(() => ({ errors: formErrors, onFirstErrorHandler }), [formErrors, onFirstErrorHandler]);\r\n const hasErrorInUrl = useMemo(() => _.some(formErrors, ({\r\n Property,\r\n }) => Property === adFieldsConfig.DestinationUrl.key), [formErrors]);\r\n\r\n const finalUrl = useMemo(() => _.first(FinalUrls) || '', [FinalUrls]);\r\n const [finalUrlPrefix, finalUrlWithoutPrefix] = useMemo(() => getUrlPrefixAndDestination(finalUrl), [finalUrl]);\r\n\r\n const finalUrlForRecommendation = _.isEmpty(finalUrlWithoutPrefix) || hasErrorInUrl ? '' : finalUrl;\r\n\r\n const urlField = getId(adsFields.DESTINATION_URL);\r\n const mobileUrlField = getId(adsFields.MOBILE_URL);\r\n const pathField = getId(adsFields.PATH1);\r\n const displayUrlField = getId(adsFields.DISPLAY_URL);\r\n\r\n const [isInExclusionList, setIsInExclusionList] = useState(true);\r\n const [disclaimerInfo, setDisclaimerInfo] = useState(null);\r\n const [hasDisclaimer, setHasDisclaimer] = useState(false);\r\n const [previewImage, setPreviewImage] = useState(null);\r\n const [llmAssetsSuggestions, setLLMAssetsSuggestions] = useState({});\r\n const [activeKeys, setActiveKeys] = useState([\r\n 'url',\r\n 'headlines',\r\n 'descriptions',\r\n 'imageExtensions',\r\n 'disclaimer',\r\n ]);\r\n\r\n const existingAssets = useMemo(() => ({\r\n shortHeadlines: Object.values(_.result(data, 'Headlines', {})).map(singleItem => singleItem.Asset.Text),\r\n descriptions: Object.values(_.result(data, 'Descriptions', {})).map(singleItem => singleItem.Asset.Text),\r\n }), [data]);\r\n\r\n const campaignId = scope && scope.campaignId;\r\n const adGroupId = scope && scope.adGroupId;\r\n\r\n const [recommendationContext, setRecommendationContext] = useContext(RecommendationContext);\r\n\r\n const { logRecommendationsAPIError, resetRecommendations } = useCopilotRecommendations({\r\n campaignId,\r\n serverContext,\r\n editMode,\r\n entityId: Id,\r\n instrumentation,\r\n activityLogger,\r\n });\r\n\r\n const {\r\n copilotTracking, themes, postAssetEventLog = _.noop,\r\n } = recommendationContext;\r\n\r\n const {\r\n eventLog,\r\n isCopilotEnabled,\r\n sendCopilotBannerNotification,\r\n } = useCopilotForResponsiveSearchAd({ permissions, postAssetEventLog, serverContext });\r\n const assetLibraryEventHandler = useAssetLibraryEventHandler(postAssetEventLog);\r\n\r\n const {\r\n logEnterFlow,\r\n logBannerGenerated,\r\n logFetchAssetsSucceeded,\r\n logApplyThemes,\r\n logSuggestionsViewed,\r\n logSuggestionsApplied,\r\n logRefineTextAssetSucceeded,\r\n logPrefillAssets,\r\n logPrefillAssetsApplied,\r\n logPrefilledAdStrength,\r\n logRemoveAssets,\r\n } = eventLog;\r\n\r\n const {\r\n triggerSurveyOnSubmit,\r\n triggerSurveyOnCancel,\r\n } = useCopilotRecommendationSurvey(AssetEventFeature.RSA);\r\n\r\n useEffect(() => {\r\n if (isSaving) {\r\n triggerSurveyOnSubmit();\r\n }\r\n }, [isSaving, triggerSurveyOnSubmit]);\r\n\r\n useEffect(() => {\r\n if (isCanceling && _.size(themes) > 0) {\r\n triggerSurveyOnCancel();\r\n }\r\n }, [isCanceling, triggerSurveyOnCancel, themes]);\r\n\r\n useEffect(() => {\r\n logEnterFlow();\r\n }, [logEnterFlow]);\r\n\r\n const [isPrefilled, setIsPrefilled] = useState(false);\r\n const [shouldLogPrefilledAdStrength, setShouldLogPrefilledAdStrength] = useState(false);\r\n\r\n const [applyHeadlinesCallback, setApplyHeadlinesCallback] = useState(_.noop);\r\n const [applyDescriptionsCallback, setApplyDescriptionsCallback] = useState(_.noop);\r\n\r\n const logPrefilledAdStrengthCallback = useCallback((adStrength) => {\r\n // Only log the ad strength once after prefilling\r\n if (shouldLogPrefilledAdStrength) {\r\n logPrefilledAdStrength(adStrength, copilotTracking.initialSuggestionsData);\r\n setShouldLogPrefilledAdStrength(false);\r\n }\r\n }, [shouldLogPrefilledAdStrength, logPrefilledAdStrength, copilotTracking.initialSuggestionsData]);\r\n\r\n useEffect(() => {\r\n if (themes && themes.length > 0 && copilotTracking) {\r\n const {\r\n descriptionRecommendationIds, headlineRecommendationIds,\r\n } = getCopilotRecommendationIdsFromThemes(themes);\r\n\r\n if (permissions && !permissions.dynamic.AdStrengthTestingNoPrefill && !isInExclusionList && cachedAd.data && !cachedAd.data.Headlines && !cachedAd.data.Descriptions) {\r\n // text assets are empty, prefill with copilot recommendations\r\n setIsPrefilled(true);\r\n\r\n sendCopilotBannerNotification('Apply');\r\n if (applyHeadlinesCallback) {\r\n // prefill with the first 12 headlines\r\n let newThems = themes;\r\n if (permissions && permissions.dynamic && permissions.dynamic.CopilotDKIRecommendation) {\r\n // prefill with the max 2 DKI headlines\r\n const DKITheme = _.first(themes.filter(theme => theme.name === 'Asset_Theme_For_DKI'));\r\n const normalThemes = themes.filter(theme => theme.name !== 'Asset_Theme_For_DKI');\r\n if (DKITheme && DKITheme.headlines) {\r\n newThems = [{ ...DKITheme, headlines: DKITheme.headlines.slice(0, 2) }, ...normalThemes];\r\n }\r\n }\r\n const newHeadlines = getUniqueAssetsFromThemes(newThems, 'headlines', 12);\r\n copilotTracking.trackInitialSuggestions(AssetPropertyName.HEADLINE, newHeadlines);\r\n\r\n applyHeadlinesCallback(newHeadlines);\r\n }\r\n if (applyDescriptionsCallback) {\r\n // prefill with the first 3 descriptions\r\n const newDescriptions = getUniqueAssetsFromThemes(themes, 'descriptions', 3);\r\n copilotTracking.trackInitialSuggestions(AssetPropertyName.DESCRIPTION, newDescriptions);\r\n\r\n applyDescriptionsCallback(newDescriptions);\r\n }\r\n setShouldLogPrefilledAdStrength(true);\r\n sendCopilotBannerNotification('ApplySucceeded');\r\n logPrefillAssets();\r\n }\r\n\r\n // By default, user views first 5 copilot text recommendations when they are returned\r\n const displayedDescriptions = _.first(descriptionRecommendationIds, MAX_INLINE_RECOMMENDATIONS_PER_PAGE);\r\n const displayedHeadlines = _.first(headlineRecommendationIds, MAX_INLINE_RECOMMENDATIONS_PER_PAGE);\r\n const displayedTextAssets = _.flatten([displayedDescriptions, displayedHeadlines]);\r\n const viewedTextSuggestionIds = copilotTracking.getUntrackedViewedSuggestionIds(displayedTextAssets);\r\n if (viewedTextSuggestionIds.length > 0) {\r\n logSuggestionsViewed(viewedTextSuggestionIds);\r\n copilotTracking.trackViewedSuggestionIds(viewedTextSuggestionIds);\r\n }\r\n }\r\n }, [\r\n applyDescriptionsCallback,\r\n applyHeadlinesCallback,\r\n isInExclusionList,\r\n cachedAd.data,\r\n copilotTracking,\r\n logPrefillAssets,\r\n logSuggestionsViewed,\r\n sendCopilotBannerNotification,\r\n themes,\r\n permissions,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (saveAssetLibraryEventHandler) {\r\n saveAssetLibraryEventHandler(assetLibraryEventHandler);\r\n }\r\n }, [saveAssetLibraryEventHandler, assetLibraryEventHandler]);\r\n\r\n\r\n useEffect(() => {\r\n if (saveLogAppliedSuggestionsFunc) {\r\n saveLogAppliedSuggestionsFunc(({\r\n headlines,\r\n descriptions,\r\n entityId,\r\n suggestedAdExtensions = [],\r\n }) => {\r\n logCopilotRecommendations({\r\n recommendationContext,\r\n assetGroup: {\r\n Headlines: headlines,\r\n Descriptions: descriptions,\r\n Images: {\r\n ImageList: suggestedAdExtensions.map(ext => ({ id: ext.Images && ext.Images[0] && ext.Images[0].Asset.Id })),\r\n },\r\n Id: entityId,\r\n },\r\n campaignId,\r\n isEditing: editMode,\r\n });\r\n });\r\n }\r\n }, [saveLogAppliedSuggestionsFunc, logSuggestionsApplied, logPrefillAssetsApplied, recommendationContext, editMode, campaignId, copilotTracking, isPrefilled]);\r\n\r\n const handleCopilotBannerFetchSucceeded = useCallback((url, assetsResponse) => {\r\n const { IsCustomerIdInExclusionList } = assetsResponse;\r\n if (IsCustomerIdInExclusionList !== isInExclusionList) {\r\n setIsInExclusionList(IsCustomerIdInExclusionList);\r\n }\r\n logBannerGenerated(url, assetsResponse);\r\n if (copilotTracking) {\r\n copilotTracking.trackReturnedTextAssets(assetsResponse.RecommendedAssets);\r\n }\r\n\r\n const formattedThemesAndAssets = _.map(assetsResponse.RecommendedAssets.Themes, getFormattedThemeForApplying);\r\n setRecommendationContext({ themes: formattedThemesAndAssets, imageAssets: _.map(assetsResponse.RecommendedAssets.ImageAssets, getFormattedImage) });\r\n }, [copilotTracking, isInExclusionList, logBannerGenerated, setRecommendationContext]);\r\n\r\n const onApplyCopilotRecommendation = useCallback((selectedThemes, selectedThemesAndAssets) => {\r\n logApplyThemes(selectedThemes);\r\n\r\n const formattedThemesAndAssets = _.map(selectedThemesAndAssets, getFormattedThemeForApplying);\r\n\r\n sendCopilotBannerNotification('Apply');\r\n setRecommendationContext({ themes: [...formattedThemesAndAssets] });\r\n\r\n if (applyHeadlinesCallback) {\r\n applyHeadlinesCallback(getUniqueAssetsFromThemes(formattedThemesAndAssets, 'headlines'));\r\n }\r\n\r\n if (applyDescriptionsCallback) {\r\n applyDescriptionsCallback(getUniqueAssetsFromThemes(formattedThemesAndAssets, 'descriptions'));\r\n }\r\n\r\n sendCopilotBannerNotification('ApplySucceeded');\r\n }, [sendCopilotBannerNotification, setRecommendationContext, applyHeadlinesCallback, applyDescriptionsCallback, logApplyThemes]);\r\n\r\n const handleFetchAssetsSucceeded = useCallback((url, assetsRecommendationData) => {\r\n logFetchAssetsSucceeded(url, assetsRecommendationData);\r\n if (copilotTracking) {\r\n copilotTracking.trackReturnedTextAssets(assetsRecommendationData.RecommendedAssets);\r\n }\r\n }, [logFetchAssetsSucceeded, copilotTracking]);\r\n\r\n const handleTextAssetSuggestionsRendered = useCallback((url, params, textSuggestions) => {\r\n const textSuggestionIds = _.pluck(textSuggestions, 'RecommendationId');\r\n logRefineTextAssetSucceeded(url, params, textSuggestionIds);\r\n\r\n if (copilotTracking) {\r\n copilotTracking.trackReturnedTextAssets({ TextAssets: textSuggestions });\r\n copilotTracking.trackViewedSuggestionIds(textSuggestionIds);\r\n }\r\n }, [copilotTracking, logRefineTextAssetSucceeded]);\r\n\r\n const formatRecommendationsToLLMSuggestions = useCallback(() => {\r\n if (!recommendationContext.themes || recommendationContext.themes.length === 0) return {};\r\n return formatToLLMSuggestion(recommendationContext, data);\r\n }, [data, recommendationContext]);\r\n\r\n useEffect(() => {\r\n injectSetPreviewImage(setPreviewImage);\r\n }, [injectSetPreviewImage]);\r\n\r\n const onValidate = useCallback((value, activeField = null) => {\r\n const shouldValidateAllFields = activeField === null;\r\n\r\n let newErrors;\r\n let errorFields;\r\n if (shouldValidateAllFields) {\r\n // validating all fields, start with an empty list\r\n errorFields = [];\r\n newErrors = [];\r\n } else {\r\n // validating activeField only, remove any pre-existing error for activeField only\r\n errorFields = _.filter(value.errorFields, f => f !== activeField);\r\n newErrors = _.filter(value.errors, e => e.Property !== activeField);\r\n }\r\n // also validate dependant fields\r\n const dependantField = fieldDependencies[activeField];\r\n if (dependantField) {\r\n errorFields = _.without(errorFields, dependantField);\r\n newErrors = _.filter(newErrors, e => e.Property !== dependantField);\r\n\r\n // also validate fields with alias, currently only dependant fields have aliases\r\n const aliasField = adsFieldAlias[dependantField];\r\n if (aliasField) {\r\n errorFields = _.without(errorFields, aliasField);\r\n newErrors = _.filter(newErrors, e => e.Property !== aliasField);\r\n }\r\n }\r\n\r\n let incomplete = false;\r\n\r\n _.each(adsFieldsToValidate, (adField) => {\r\n const isOptional = isSingleFieldOptional(adField);\r\n\r\n if (shouldValidateAllFields || adField === (dependantField || activeField)) {\r\n let fieldValue = value.data[adField];\r\n const maxLength = adsFieldLengthLimitMap[adField];\r\n\r\n let hasError;\r\n switch (adField) {\r\n case adsFields.DESTINATION_URL:\r\n case adsFields.MOBILE_URL: {\r\n // validate URL\r\n const url = _.first(fieldValue);\r\n const [, destination] = getUrlPrefixAndDestination(url);\r\n\r\n if (isOptional && !destination) {\r\n hasError = false;\r\n } else {\r\n const error = validateAdUrl(url, '', i18n);\r\n if (!_.isEmpty(error)) {\r\n newErrors.push({\r\n Property: adField,\r\n Message: error,\r\n });\r\n }\r\n hasError = !fieldValue || error;\r\n }\r\n break;\r\n }\r\n case adsFields.DISPLAY_URL: {\r\n if (permissions.IsVanityUrlEnabled) {\r\n const displayUrlError =\r\n validateTextFieldValue(fieldValue, maxLength, i18n, adField, isOptional);\r\n hasError = displayUrlError !== null;\r\n if (hasError) {\r\n newErrors.push({\r\n Property: adField,\r\n Message: displayUrlError,\r\n });\r\n errorFields.push(adField);\r\n }\r\n }\r\n break;\r\n }\r\n case adsFields.HEADLINES:\r\n case adsFields.DESCRIPTIONS: {\r\n hasError = _.any(\r\n fieldValue,\r\n h => validateTextFieldValue(h.Asset.Text, maxLength, i18n, adField, isOptional)\r\n );\r\n\r\n // eslint-disable-next-line max-len\r\n const error = validateTextAssets(fieldValue, adFieldsConfig[adField].assetsConfig, i18n);\r\n\r\n if (!_.isEmpty(error)) {\r\n hasError = true;\r\n newErrors.push({\r\n Property: adField,\r\n Message: error,\r\n });\r\n }\r\n break;\r\n }\r\n case adsFields.PATH1:\r\n case adsFields.PATH2: {\r\n if (shouldValidateAllFields && adField === adsFields.PATH2) {\r\n break;\r\n }\r\n\r\n fieldValue = [value.data.Path1, value.data.Path2];\r\n // fallthrough\r\n }\r\n // eslint-disable-next-line no-fallthrough\r\n case adsFields.TRACKING_URL_TEMPLATE:\r\n case adsFields.FINAL_URL_SUFFIX:\r\n case adsFields.URL_CUSTOM_PARAMETERS: {\r\n const errorList = validators[adField](fieldValue, i18n);\r\n if (!_.isEmpty(errorList)) {\r\n hasError = true;\r\n newErrors.push(...errorList);\r\n }\r\n break;\r\n }\r\n default: {\r\n hasError = validateTextFieldValue(fieldValue, maxLength, i18n, adField, isOptional);\r\n }\r\n }\r\n\r\n if (hasError) {\r\n errorFields.push(adField);\r\n }\r\n } else if ((!isOptional || isCompoundFieldRequired(adField)) && isFieldEmpty(adField, value.data[adField])) {\r\n // if not validating all fields, still need to check if ad is incomplete\r\n incomplete = true;\r\n }\r\n });\r\n\r\n // if there are any errors, ad is not complete yet\r\n if (!_.isEmpty(errorFields)) {\r\n incomplete = true;\r\n errorFields = _.uniq(errorFields);\r\n }\r\n\r\n setFormErrors(newErrors);\r\n\r\n return {\r\n ...value,\r\n errorFields,\r\n errors: newErrors,\r\n incomplete,\r\n };\r\n }, [i18n, permissions.IsVanityUrlEnabled]);\r\n\r\n const onClearTextAssets = useCallback(() => {\r\n const validatedItem = onValidate({\r\n ...cachedAd,\r\n data: {\r\n ...data,\r\n ...textAssets.reduce((acc, key) => {\r\n acc[key] = [];\r\n return acc;\r\n }, {}),\r\n },\r\n });\r\n setCachedAd(validatedItem);\r\n\r\n copilotTracking.removeAllInitialSuggestions();\r\n logRemoveAssets();\r\n }, [cachedAd, data, onValidate, logRemoveAssets, copilotTracking]);\r\n\r\n const onUpdateItemByKey = useCallback((value, key) => {\r\n setCachedAd((prevCachedAd) => {\r\n const updatedData = {\r\n ...prevCachedAd.data,\r\n [fieldMappings[key] || key]: value,\r\n };\r\n\r\n const validatedItem = onValidate({\r\n ...prevCachedAd,\r\n data: updatedData,\r\n }, key);\r\n\r\n return validatedItem;\r\n });\r\n }, [onValidate]);\r\n\r\n const onDebouncedUpdateItemByKey = useCallback(_.debounce((value, key) => {\r\n setCachedAd((prevCachedAd) => {\r\n const updatedData = {\r\n ...prevCachedAd.data,\r\n [fieldMappings[key] || key]: value,\r\n };\r\n\r\n const validatedItem = onValidate({\r\n ...prevCachedAd,\r\n data: updatedData,\r\n }, key);\r\n\r\n return validatedItem;\r\n });\r\n }, 1000), [onValidate]);\r\n\r\n const onItemBlurBykey = useCallback((newValue, key) => {\r\n if (renderImageExtension) {\r\n const fieldToUpdate = fieldMappings[key] || key;\r\n\r\n if (_.contains([\r\n adsFields.HEADLINES, adsFields.DESCRIPTIONS,\r\n ], fieldToUpdate)) {\r\n setCachedValuesForImageSuggestions((prev) => {\r\n const { needUpdate, value } = computeRankingTextsUpdates({\r\n Headlines,\r\n Descriptions,\r\n [fieldToUpdate]: newValue,\r\n }, prev);\r\n\r\n if (needUpdate) {\r\n return value;\r\n }\r\n return prev;\r\n });\r\n }\r\n }\r\n }, [Descriptions, Headlines, renderImageExtension]);\r\n\r\n const onUpdateFinalUrlPrefix = useCallback((evt, newPrefix) => {\r\n const newValue = getUpdatedFullUrlOnPrefixUpdate(finalUrlWithoutPrefix, newPrefix);\r\n\r\n onUpdateItemByKey([newValue], adFieldsConfig.DestinationUrl.key);\r\n }, [finalUrlWithoutPrefix, onUpdateItemByKey]);\r\n\r\n const onUpdateFinalUrlValue = useCallback((evt) => {\r\n const newValue = getUpdatedFullUrlOnTextUpdate(finalUrlPrefix, evt.target.value);\r\n\r\n if (newValue) {\r\n onUpdateItemByKey([newValue], adFieldsConfig.DestinationUrl.key);\r\n }\r\n }, [finalUrlPrefix, onUpdateItemByKey]);\r\n\r\n const onSaveClicked = useCallback(() => {\r\n const validatedItem = onValidate(cachedAd);\r\n\r\n setCachedAd(validatedItem);\r\n if (!validatedItem.incomplete && _.isEmpty(validatedItem.errorFields)) {\r\n onSave(validatedItem);\r\n }\r\n }, [cachedAd, onSave, onValidate]);\r\n\r\n const onCancelClicked = () => {\r\n onCancel();\r\n };\r\n\r\n useEffect(() => {\r\n onChanged(cachedAd);\r\n }, [cachedAd]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n useEffect(() => {\r\n const validatedItem = onValidate(cachedAd);\r\n if (!showInitialErrors) {\r\n setCachedAd({\r\n ...validatedItem,\r\n errorFields: [],\r\n errors: [],\r\n });\r\n } else {\r\n setCachedAd(validatedItem);\r\n }\r\n\r\n if (!showInitialErrors) {\r\n setFormErrors([]);\r\n }\r\n }, [showInitialErrors]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n useEffect(() => {\r\n setFormErrors(_.extend([], formErrors, errors));\r\n }, [errors]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n useEffect(() => {\r\n if (!hasErrorInUrl) {\r\n const copilotSuggestions = formatRecommendationsToLLMSuggestions();\r\n setLLMAssetsSuggestions(copilotSuggestions);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [finalUrlForRecommendation, recommendationContext]);\r\n\r\n useEffect(() => {\r\n if (isForVnext && onFetchDisclaimerInfo) {\r\n onFetchDisclaimerInfo().then((disclaimer) => {\r\n const {\r\n disclaimerData,\r\n } = disclaimer;\r\n if (disclaimer.hasDisclaimer) {\r\n setDisclaimerInfo(disclaimerData);\r\n setHasDisclaimer(disclaimer.hasDisclaimer);\r\n }\r\n });\r\n }\r\n }, [isForVnext, onFetchDisclaimerInfo]);\r\n\r\n useEffect(() => {\r\n setClarityTag({ RSANewCopilotUI: 'true' });\r\n }, []);\r\n\r\n const renderLeftColumnWithNewCopilotUI = () => {\r\n const errorProperties = (formErrors || []).map(error => error.Property);\r\n const renderCardError = properties => (_.some(properties, property => _.contains(errorProperties, property)) ? _TL_(\"* Something's wrong\") : null);\r\n const renderCardTitle = (name, icon, helpId) => <TextTitle titleKey={name} icon={icon} iconAltText={i18n.getString(name)} topicKey={helpId} as=\"h3\" headingClassName=\"rsa-card-title\" />;\r\n const imageExtension = renderImageExtension && renderImageExtension({\r\n fullUrl: finalUrl,\r\n hasErrorInUrl,\r\n urlPrefix: finalUrlPrefix,\r\n onUpdateUrlPrefix: onUpdateFinalUrlPrefix,\r\n onUpdateUrlValue: onUpdateFinalUrlValue,\r\n headlines: cachedValuesForImageSuggestions.Headlines,\r\n descriptions: cachedValuesForImageSuggestions.Descriptions,\r\n });\r\n\r\n return (\r\n <FluentProvider theme={webLightTheme} className={styles.theme}>\r\n <CopilotRepositoryProvider\r\n campaignId={campaignId}\r\n finalUrl={finalUrlForRecommendation}\r\n locale={i18n.getLocale()}\r\n recommendationType=\"RSA\"\r\n perfMarker={perfMarker}\r\n serverContext={serverContext}\r\n >\r\n <Stack className=\"asset-group-assets-section rsa-left-copilot-column\">\r\n <Collapse activeKeys={activeKeys} setActiveKeys={setActiveKeys}>\r\n <Collapse.Panel key=\"url\" title={renderCardTitle(_TL_('URL'), UrlIcon)} error={renderCardError(['FinalUrls', 'MobileFinalUrls', 'DisplayUrl', 'Path1', 'Path2'])}>\r\n <Stack>\r\n <Label htmlFor={urlField}>\r\n <Stack horizontal verticalAlign=\"center\" >\r\n {i18n.getString(_TL_('Final URL'))}\r\n <HelpPopupInline topic=\"pop_BA_NewAdCreate_FinalURL\" ariaLabel={i18n.getString(_TL_('Click to learn more about Final URL'))} />\r\n </Stack>\r\n </Label>\r\n <UrlInput\r\n config={adFieldsConfig.DestinationUrl}\r\n url={finalUrl}\r\n onChange={onDebouncedUpdateItemByKey}\r\n i18n={i18n}\r\n />\r\n </Stack>\r\n <Stack>\r\n <Label htmlFor={mobileUrlField}>\r\n <Stack horizontal verticalAlign=\"center\" >\r\n {i18n.getString(_TL_('Mobile URL'))}\r\n <HelpPopupInline topic=\"pop_BA_NewCampaignCreate_Ad_MobileURL\" ariaLabel={i18n.getString(_TL_('Click to learn more about Mobile URL'))} />\r\n </Stack>\r\n </Label>\r\n <UrlInput\r\n config={adFieldsConfig.MobileUrl}\r\n url={_.first(MobileFinalUrls) || ''}\r\n onChange={onDebouncedUpdateItemByKey}\r\n i18n={i18n}\r\n />\r\n </Stack>\r\n <Stack>\r\n {permissions.IsVanityUrlEnabled ?\r\n <Label htmlFor={displayUrlField}>\r\n <Stack horizontal verticalAlign=\"center\" >\r\n {i18n.getString(_TL_('Display URL'))}\r\n <HelpPopupInline topic=\"pop_BA_NewAdCreate_VanityURL\" ariaLabel={i18n.getString(_TL_('Click to learn more about Display URL'))} />\r\n </Stack>\r\n </Label> :\r\n <Label htmlFor={pathField}>\r\n <Stack horizontal verticalAlign=\"center\" >\r\n {i18n.getString(_TL_('Path'))}\r\n <HelpPopupInline topic=\"pop_BA_NewAdCreate_Path\" ariaLabel={i18n.getString(_TL_('Click to learn more about Path'))} />\r\n </Stack>\r\n </Label>\r\n }\r\n <UrlPath\r\n config={adFieldsConfig}\r\n value={[Path1, Path2]}\r\n url={_.first(FinalUrls)}\r\n onChange={onUpdateItemByKey}\r\n DisplayUrl={DisplayUrl}\r\n i18n={i18n}\r\n IsVanityUrlEnabled={permissions.IsVanityUrlEnabled}\r\n />\r\n </Stack>\r\n </Collapse.Panel>\r\n </Collapse>\r\n <ResponsiveSearchAdCopilotBannerWithDialog\r\n eventLog={eventLog}\r\n isCopilotEnabled={isCopilotEnabled}\r\n onApply={onApplyCopilotRecommendation}\r\n onDialogFetchAssetsSucceeded={handleFetchAssetsSucceeded}\r\n onFetch={resetRecommendations}\r\n onFetchFailed={logRecommendationsAPIError}\r\n onFetchSucceeded={handleCopilotBannerFetchSucceeded}\r\n onReset={onClearTextAssets}\r\n />\r\n <Collapse activeKeys={activeKeys} setActiveKeys={setActiveKeys}>\r\n <Collapse.Panel key=\"headlines\" title={renderCardTitle(_TL_('Headlines'), TextIcon, 'pop_BA_RSA_Headlines')} error={renderCardError(['Headlines'])}>\r\n <Stack>\r\n <TextAssets\r\n isForVnext={isForVnext}\r\n config={headlinesConfig}\r\n assets={Headlines}\r\n minSize={5}\r\n maxSize={15}\r\n finalUrlWithoutPrefix={finalUrlWithoutPrefix}\r\n existingAssets={existingAssets}\r\n i18n={i18n}\r\n onChange={onUpdateItemByKey}\r\n onBlur={onItemBlurBykey}\r\n updateSuggestionMeasurement={updateSuggestionMeasurement}\r\n showDynamicTextExtention={showDynamicTextExtention}\r\n llmAssetsSuggestions={llmAssetsSuggestions}\r\n permissions={permissions}\r\n onSuggestionsRendered={handleTextAssetSuggestionsRendered}\r\n showDeleteButton\r\n showCopilotButton={isCopilotEnabled}\r\n isNewTextAssetsButtonStyle={isNewTextAssetsButtonStyle}\r\n />\r\n <HeadlineAssetCollection\r\n data={data}\r\n onChange={onUpdateItemByKey}\r\n updateSuggestionMeasurement={updateSuggestionMeasurement}\r\n setApplyHeadlinesCallback={setApplyHeadlinesCallback}\r\n />\r\n </Stack>\r\n </Collapse.Panel>\r\n <Collapse.Panel key=\"descriptions\" title={renderCardTitle(_TL_('Descriptions'), TextIcon, 'pop_BA_RSA_Descriptions')} error={renderCardError(['Descriptions'])}>\r\n <Stack>\r\n <TextAssets\r\n isForVnext={isForVnext}\r\n config={descriptionsConfig}\r\n assets={Descriptions}\r\n minSize={2}\r\n maxSize={4}\r\n finalUrlWithoutPrefix={finalUrlWithoutPrefix}\r\n existingAssets={existingAssets}\r\n i18n={i18n}\r\n onChange={onUpdateItemByKey}\r\n onBlur={onItemBlurBykey}\r\n updateSuggestionMeasurement={updateSuggestionMeasurement}\r\n showDynamicTextExtention={showDynamicTextExtention}\r\n llmAssetsSuggestions={llmAssetsSuggestions}\r\n permissions={permissions}\r\n onSuggestionsRendered={handleTextAssetSuggestionsRendered}\r\n showDeleteButton\r\n showCopilotButton={isCopilotEnabled}\r\n isNewTextAssetsButtonStyle={isNewTextAssetsButtonStyle}\r\n />\r\n <DescriptionAssetCollection\r\n data={data}\r\n onChange={onUpdateItemByKey}\r\n updateSuggestionMeasurement={updateSuggestionMeasurement}\r\n setApplyDescriptionsCallback={setApplyDescriptionsCallback}\r\n />\r\n </Stack>\r\n </Collapse.Panel>\r\n {imageExtension &&\r\n <Collapse.Panel key=\"imageExtensions\" title={renderCardTitle(_TL_('Image extensions'), ImageIcon, 'pop_BA_NewAdCreate_ImageExtensions')} >\r\n {imageExtension}\r\n </Collapse.Panel>\r\n }\r\n {hasDisclaimer &&\r\n <Collapse.Panel key=\"disclaimer\" title={renderCardTitle(_TL_('Disclaimer'), DisclaimerIcon, 'pop_BA_DisclaimerAd')} >\r\n <Stack>\r\n <Disclaimer disclaimerInfo={disclaimerInfo} i18n={i18n} permissions={permissions} />\r\n </Stack>\r\n </Collapse.Panel>\r\n }\r\n <Collapse.Panel key=\"adUrlOptions\" title={renderCardTitle(_TL_('Ad URL options (optional)'), UrlIcon)} error={renderCardError(['TrackingUrlTemplate', 'FinalUrlSuffix', 'UrlCustomParameters'])}>\r\n <UrlOptionsParameters\r\n trackingUrlTemplate={TrackingUrlTemplate}\r\n finalUrlSuffix={FinalUrlSuffix}\r\n urlCustomParameters={UrlCustomParameters}\r\n errors={formErrors}\r\n onChange={onUpdateItemByKey}\r\n i18n={i18n}\r\n token={token}\r\n triggerTestUurl={triggerTestUurl}\r\n showUurlTestTool={showUurlTestTool}\r\n showFinalUrlSuffix={showFinalUrlSuffix}\r\n instrumentation={instrumentation}\r\n />\r\n </Collapse.Panel>\r\n </Collapse>\r\n {showActionBar &&\r\n <Stack\r\n horizontal\r\n id={getId('actionStack')}\r\n tokens={contentStyles.actionStackToken}\r\n >\r\n <PrimaryButton\r\n className=\"rsa-editor-save-button\"\r\n onClick={onSaveClicked}\r\n disabled={!_.isEmpty(item.errorFields)}\r\n >\r\n {i18n.getString(_TL_('Save'))}\r\n </PrimaryButton>\r\n\r\n <DefaultButton\r\n className=\"rsa-editor-cancel-button\"\r\n onClick={onCancelClicked}\r\n >\r\n {i18n.getString(_TL_('Cancel'))}\r\n </DefaultButton>\r\n </Stack>\r\n }\r\n </Stack>\r\n </CopilotRepositoryProvider>\r\n </FluentProvider>\r\n );\r\n };\r\n\r\n return (\r\n <ErrorContext.Provider value={errorContextValue}>\r\n <PermissionsContext.Provider value={permissions}>\r\n <Stack\r\n horizontal\r\n className=\"rsa-content-container\"\r\n styles={containerStyles.container}\r\n >\r\n {renderLeftColumnWithNewCopilotUI()}\r\n <Stack\r\n className=\"rsa-right-column\"\r\n styles={containerStyles.preview}\r\n >\r\n <div className=\"right-columns fixed\">\r\n { permissions && permissions.dynamic && !permissions.dynamic.AdStrengthTestingNoPanel &&\r\n <ResponsiveSearchAdStrength\r\n adItem={data}\r\n adGroupId={adGroupId}\r\n campaignId={campaignId}\r\n onFetchAdStrength={onFetchAdStrengthV2}\r\n i18n={i18n}\r\n isForVnext={isForVnext}\r\n logAdStrength={logPrefilledAdStrengthCallback}\r\n />\r\n }\r\n <div style={stickyAdPreviewStyles}>\r\n {renderImageExtension ?\r\n <AdPreviewComponent\r\n key={cachedAd.key || 'dummy'}\r\n data={cachedAd.data || {}}\r\n i18n={i18n}\r\n disclaimerInfo={disclaimerInfo}\r\n image={previewImage}\r\n permissions={permissions}\r\n />\r\n :\r\n <AdPreviewComponent\r\n key={cachedAd.key || 'dummy'}\r\n data={cachedAd.data || {}}\r\n i18n={i18n}\r\n disclaimerInfo={disclaimerInfo}\r\n />\r\n }\r\n </div>\r\n </div>\r\n </Stack>\r\n </Stack>\r\n </PermissionsContext.Provider>\r\n </ErrorContext.Provider>\r\n );\r\n}\r\n\r\nResponsiveSearchAdEditorBase.propTypes = {\r\n\r\n item: PropTypes.shape({\r\n data: PropTypes.shape({\r\n Headlines: PropTypes.arrayOf(PropTypes.shape({})),\r\n Descriptions: PropTypes.arrayOf(PropTypes.shape({})),\r\n }).isRequired,\r\n errorFields: PropTypes.arrayOf(PropTypes.string),\r\n }),\r\n\r\n errors: PropTypes.arrayOf(PropTypes.shape({\r\n Property: PropTypes.string,\r\n Code: PropTypes.string,\r\n Message: PropTypes.string.isRequired,\r\n })),\r\n\r\n i18n: PropTypes.shape({\r\n getLocale: PropTypes.func.isRequired,\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n\r\n isNewTextAssetsButtonStyle: PropTypes.bool,\r\n\r\n onSave: PropTypes.func,\r\n\r\n onCancel: PropTypes.func,\r\n\r\n onChanged: PropTypes.func,\r\n\r\n onFetchAdStrengthV2: PropTypes.func,\r\n\r\n onFetchDisclaimerInfo: PropTypes.func,\r\n\r\n showActionBar: PropTypes.bool,\r\n\r\n showInitialErrors: PropTypes.bool,\r\n\r\n timeZone: PropTypes.number,\r\n\r\n AdPreviewComponent: PropTypes.elementType,\r\n\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({\r\n AdStrengthTestingNoPanel: PropTypes.bool,\r\n AdStrengthTestingNoPrefill: PropTypes.bool,\r\n CopilotDKIRecommendation: PropTypes.bool,\r\n }),\r\n IsVanityUrlEnabled: PropTypes.bool,\r\n }),\r\n\r\n urlOptionsElement: PropTypes.shape({}),\r\n\r\n token: PropTypes.string,\r\n\r\n triggerTestUurl: PropTypes.func,\r\n\r\n showUurlTestTool: PropTypes.bool,\r\n\r\n showFinalUrlSuffix: PropTypes.bool,\r\n\r\n showAdCustomizers: PropTypes.bool,\r\n\r\n showDynamicTextExtention: PropTypes.bool,\r\n\r\n isForVnext: PropTypes.bool,\r\n\r\n updateSuggestionMeasurement: PropTypes.func,\r\n\r\n edmCampaign: PropTypes.shape({}),\r\n\r\n jsDataCampaign: PropTypes.shape({}),\r\n\r\n renderImageExtension: PropTypes.func,\r\n\r\n injectSetPreviewImage: PropTypes.func,\r\n\r\n perfMarker: PropTypes.shape({\r\n createChild: PropTypes.func,\r\n }),\r\n\r\n serverContext: PropTypes.shape({}),\r\n scope: PropTypes.shape({\r\n campaignId: PropTypes.number,\r\n adGroupId: PropTypes.number,\r\n }),\r\n editMode: PropTypes.bool,\r\n saveLogAppliedSuggestionsFunc: PropTypes.func,\r\n isSaving: PropTypes.bool,\r\n isCanceling: PropTypes.bool,\r\n onFirstErrorHandler: PropTypes.func,\r\n saveAssetLibraryEventHandler: PropTypes.func,\r\n activityLogger: PropTypes.shape({}),\r\n};\r\n\r\nResponsiveSearchAdEditorBase.defaultProps = {\r\n showActionBar: true,\r\n showInitialErrors: true,\r\n item: { data: {} },\r\n errors: [],\r\n isNewTextAssetsButtonStyle: false,\r\n onSave: _.noop,\r\n onCancel: _.noop,\r\n onChanged: _.noop,\r\n onFetchAdStrengthV2: _.noop,\r\n onFetchDisclaimerInfo: null,\r\n timeZone: null,\r\n AdPreviewComponent: ResponsiveSearchAdPreviewUAPL,\r\n urlOptionsElement: null,\r\n token: '',\r\n triggerTestUurl: _.noop,\r\n showUurlTestTool: false,\r\n showFinalUrlSuffix: false,\r\n showAdCustomizers: false,\r\n showDynamicTextExtention: false,\r\n isForVnext: false,\r\n updateSuggestionMeasurement: _.noop,\r\n edmCampaign: {},\r\n jsDataCampaign: {},\r\n renderImageExtension: undefined,\r\n injectSetPreviewImage: _.noop,\r\n perfMarker: {},\r\n serverContext: {},\r\n scope: {},\r\n editMode: false,\r\n saveLogAppliedSuggestionsFunc: _.noop,\r\n saveAssetLibraryEventHandler: _.noop,\r\n isSaving: false,\r\n isCanceling: false,\r\n onFirstErrorHandler: _.noop,\r\n permissions: {\r\n dynamic: {\r\n AdStrengthTestingNoPanel: false,\r\n AdStrengthTestingNoPrefill: false,\r\n CopilotDKIRecommendation: false,\r\n },\r\n IsVanityUrlEnabled: false,\r\n },\r\n activityLogger: undefined,\r\n};\r\n\r\nexport const ResponsiveSearchAdEditor = _.compose(\r\n withActivityContext,\r\n withBannerService,\r\n withRecommendationContext\r\n)(ResponsiveSearchAdEditorBase);\r\n","import { useEffect, useState } from 'react';\r\nimport { isCopilotRegionRestricted } from '@bingads-webui-react/copilot-utils';\r\nimport { useBannerService } from '@bingads-webui/inline-copilot';\r\nimport { useEventLog } from '@bingads-webui-campaign-react/copilot-common';\r\n\r\nexport function useCopilotForResponsiveSearchAd({\r\n permissions,\r\n postAssetEventLog,\r\n serverContext,\r\n}) {\r\n const [isCopilotEnabled, setIsCopilotEnabled] = useState();\r\n const { send: sendCopilotBannerNotification } = useBannerService();\r\n const eventLog = useEventLog(postAssetEventLog);\r\n\r\n useEffect(() => {\r\n isCopilotRegionRestricted({\r\n feature: 'Recommendations',\r\n permissions,\r\n serverContext,\r\n }).then(isRestricted => setIsCopilotEnabled(!isRestricted));\r\n }, [permissions, serverContext]);\r\n\r\n return {\r\n eventLog,\r\n isCopilotEnabled,\r\n sendCopilotBannerNotification,\r\n };\r\n}\r\n","import React from 'react';\r\nimport classnames from 'classnames';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { withError, withValidation, AdapterFactory } from '@bingads-webui-react/validation';\r\nimport { withControlErrorHandling, withUnvalidatedControlErrors } from '@bingads-webui-campaign-react/error-handling';\r\nimport { BaseTextField } from './base-text-field';\r\nimport { validateTextField } from '../validators';\r\n\r\nconst Adapter = AdapterFactory({ convertEventToValue: value => value, functionToInject: 'updateItem' });\r\nconst validatedTextField = withValidation(BaseTextField, Adapter);\r\nconst ValidatedTextFieldWithErrors = withControlErrorHandling(withUnvalidatedControlErrors(withError(validatedTextField)));\r\n\r\nconst getTextInputContainerStyles = () => ({\r\n TextInputContainer: {\r\n width: '435px',\r\n '& div .error': {\r\n color: '#A80000',\r\n },\r\n },\r\n});\r\n\r\nexport const TextFieldWithAdCustomizerInternal = React.memo((props) => {\r\n const {\r\n i18n, adType, containerSelector, configProps, validationProps,\r\n } = props;\r\n\r\n const classes = useDefaultStyles(getTextInputContainerStyles);\r\n const customizedValidator = (newData) => {\r\n const isRequired = _.property(['schema', 'properties', configProps.id, 'required'])(validationProps);\r\n if (isRequired && _.isEmpty(newData)) {\r\n return [i18n.getString(_TL_('Required field'))];\r\n }\r\n const errorMessage = validateTextField(configProps.key, i18n, true, adType)(newData);\r\n return errorMessage === '' ? [] : [errorMessage];\r\n };\r\n const newValidationProps = {\r\n ...validationProps,\r\n validator: customizedValidator,\r\n };\r\n\r\n return (\r\n <div className={classnames('text-input-container', classes.TextInputContainer)}>\r\n <ValidatedTextFieldWithErrors\r\n {...props}\r\n showCharRemaining\r\n adType={adType}\r\n containerSelector={containerSelector}\r\n showErrorMessage={false}\r\n updateItem={_.noop}\r\n validationProps={newValidationProps}\r\n />\r\n </div>\r\n );\r\n});\r\n\r\nTextFieldWithAdCustomizerInternal.propTypes = {\r\n updateValidation: PropTypes.func.isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n adType: PropTypes.string,\r\n containerSelector: PropTypes.string,\r\n configProps: PropTypes.shape({\r\n id: PropTypes.string,\r\n key: PropTypes.string,\r\n }).isRequired,\r\n validationProps: PropTypes.shape({\r\n data: PropTypes.shape({}),\r\n field: PropTypes.string,\r\n }).isRequired,\r\n};\r\n\r\nTextFieldWithAdCustomizerInternal.defaultProps = {\r\n adType: 'ResponsiveAd',\r\n containerSelector: 'div.crud-multimedia-ad-react .ad-edit-and-preview-container',\r\n};\r\n\r\nexport const ValidatedTextFieldWithAdCustomizer = (TextFieldWithAdCustomizerInternal);\r\n","export const getTextAssetRecommendationsStyles = () => ({\r\n textAssetRecommendationsContent: {\r\n '& .collapsible-content': {\r\n '& .suggested-item-add': {\r\n '& .ms-Button-label': {\r\n height: '30px',\r\n lineHeight: '30px',\r\n },\r\n },\r\n },\r\n },\r\n textAssetRecommendationsPanel: {\r\n '& .ms-Panel-content': {\r\n paddingTop: '20px',\r\n '& .selectable-suggested-item-toggle': {\r\n height: 'auto',\r\n padding: '6px 0',\r\n '& .ms-Button-label': {\r\n lineHeight: '120%',\r\n },\r\n },\r\n },\r\n },\r\n});\r\n","import { chain, contains, filter, isEmpty, isFunction, map, negate, noop, property, size, values } from 'underscore';\r\nimport React, { useCallback, useState, useMemo, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { DefaultButton, PrimaryButton, Panel, PanelType, Stack } from '@fluentui/react';\r\nimport { FluentProvider, makeStyles, webLightTheme } from '@fluentui/react-components';\r\nimport { SuggestedItemsMultiSelect } from '@bingads-webui-campaign-react/pill-item-components';\r\nimport { CopilotTab, CopilotTabItem } from '@bingads-webui/inline-copilot-ui';\r\nimport { HelpButton } from '@bingads-webui-react/help-popup';\r\n\r\nconst useInlineCopilotUIStyles = makeStyles({\r\n header: {\r\n display: 'flex',\r\n fontSize: '20px',\r\n fontWeight: '600',\r\n lineHeight: '27px',\r\n justifyContent: 'flex-start',\r\n paddingLeft: '24px',\r\n paddingRight: '24px',\r\n width: '100%',\r\n\r\n '& button': {\r\n marginLeft: '8px',\r\n },\r\n },\r\n theme: {\r\n marginTop: '10px',\r\n marginBottom: '16px',\r\n },\r\n summary: {\r\n marginLeft: '16px',\r\n },\r\n});\r\n\r\nconst deriveSuggestedItems = (recommendations, fieldValues) => () =>\r\n chain(recommendations)\r\n .map(({ name, assets }) => ({\r\n assets: map(assets, asset => ({\r\n key: asset,\r\n itemText: asset,\r\n theme: name,\r\n })),\r\n }))\r\n .pluck('assets')\r\n .flatten()\r\n .filter(({ itemText }) => !contains(fieldValues, itemText))\r\n .value();\r\n\r\nexport const TextAssetRecommendationsWithThemesPanel = ({\r\n i18n,\r\n onSave,\r\n onCancel,\r\n collection,\r\n availableRecommendations,\r\n maxCollectionSize,\r\n title,\r\n topicKey,\r\n topicAriaLabel,\r\n disabledSuggestionTooltip,\r\n reportDisplayedRecommendations,\r\n DKIThemeName,\r\n}) => {\r\n const [activeTheme, setActiveTheme] = useState(i18n.getString(_TL_('All')));\r\n\r\n const fieldValues = useMemo(() => values(collection), [collection]);\r\n const [allSuggestedItems, setAllSuggestedItems] = useState(deriveSuggestedItems(availableRecommendations, fieldValues));\r\n const [suggestedItems, setSuggestedItems] = useState(allSuggestedItems);\r\n\r\n const selectedItemsCount = useMemo(() => size(allSuggestedItems.filter(property('isSelected'))), [allSuggestedItems]);\r\n const emptyFieldsCount = useMemo(() => maxCollectionSize - size(filter(fieldValues, negate(isEmpty))), [maxCollectionSize, fieldValues]);\r\n const remaningItemsCount = useMemo(() => emptyFieldsCount - selectedItemsCount, [emptyFieldsCount, selectedItemsCount]);\r\n\r\n const styles = useInlineCopilotUIStyles();\r\n\r\n useEffect(() => {\r\n if (!isEmpty(availableRecommendations) && isFunction(reportDisplayedRecommendations)) {\r\n // TODO: Logging\r\n // reportDisplayedRecommendations(availableRecommendations);\r\n }\r\n }, [availableRecommendations, reportDisplayedRecommendations]);\r\n\r\n const onSwitchTheme = useCallback((theme) => {\r\n setActiveTheme(theme);\r\n if (theme === i18n.getString(_TL_('All'))) {\r\n setSuggestedItems(allSuggestedItems);\r\n } else {\r\n setSuggestedItems(filter(allSuggestedItems, item => item.theme === theme));\r\n }\r\n }, [allSuggestedItems, i18n]);\r\n\r\n const onSuggestedItemToggle = useCallback((itemIndex, itemText) => {\r\n setSuggestedItems(suggestedItems.map(item => ({\r\n ...item,\r\n isSelected: item.itemText === itemText ? !item.isSelected : item.isSelected,\r\n })));\r\n setAllSuggestedItems(allSuggestedItems.map(item => ({\r\n ...item,\r\n isSelected: item.itemText === itemText ? !item.isSelected : item.isSelected,\r\n })));\r\n }, [allSuggestedItems, suggestedItems]);\r\n\r\n const onSaveClick = useCallback(() => {\r\n onSave(allSuggestedItems.filter(property('isSelected')).map(item => item.itemText));\r\n }, [allSuggestedItems, onSave]);\r\n\r\n const onCancelClick = useCallback(() => {\r\n onCancel();\r\n }, [onCancel]);\r\n\r\n const onRenderHeader = useCallback(() => (\r\n <div className={styles.header}>\r\n <span>{title}</span>\r\n { HelpButton && <HelpButton\r\n topic={topicKey}\r\n aria-label={topicAriaLabel}\r\n /> }\r\n </div>\r\n ), [styles.header, title, topicAriaLabel, topicKey]);\r\n\r\n const onRenderFooterContent = useCallback(() => (\r\n <Stack className=\"text-asset-recommendations-panel-buttons\" horizontal tokens={{ childrenGap: 8 }}>\r\n <Stack.Item key=\"btn-add\">\r\n <PrimaryButton className=\"btn-add\" onClick={onSaveClick} disabled={!(selectedItemsCount > 0)}>\r\n {i18n.getString(_TL_('Add'))}\r\n </PrimaryButton>\r\n </Stack.Item>\r\n <Stack.Item key=\"btn-cancel\">\r\n <DefaultButton className=\"btn-cancel\" onClick={onCancelClick}>\r\n {i18n.getString(_TL_('Cancel'))}\r\n </DefaultButton>\r\n </Stack.Item>\r\n <Stack.Item key=\"selection-summary\" className=\"selection-summary\" align=\"center\">\r\n <span className={styles.summary}>\r\n {i18n.getString(_TL_('{{count}} selected'), { count: selectedItemsCount })}\r\n </span>\r\n </Stack.Item>\r\n </Stack>\r\n ), [onSaveClick, selectedItemsCount, i18n, onCancelClick, styles.summary]);\r\n\r\n return (\r\n <Panel\r\n className={classNames('text-asset-recommendations-panel')}\r\n closeButtonAriaLabel={i18n.getString(_TL_('Close'))}\r\n onDismiss={onCancelClick}\r\n onOuterClick={noop}\r\n onRenderHeader={onRenderHeader}\r\n onRenderFooterContent={onRenderFooterContent}\r\n isFooterAtBottom\r\n isOpen\r\n type={PanelType.medium}\r\n focusTrapZoneProps={{\r\n disableFirstFocus: true,\r\n }}\r\n >\r\n <FluentProvider theme={webLightTheme}>\r\n <div className={styles.theme}>\r\n <CopilotTab\r\n active={activeTheme}\r\n onActiveChange={key => onSwitchTheme(key)}\r\n >\r\n <CopilotTabItem tabKey={i18n.getString(_TL_('All'))}>\r\n {i18n.getString(_TL_('All'))}\r\n </CopilotTabItem>\r\n {map(availableRecommendations, ({ name }) => (\r\n <CopilotTabItem tabKey={name}>\r\n {name === DKIThemeName ? i18n.getString(DKIThemeName) : name}\r\n </CopilotTabItem>\r\n ))}\r\n </CopilotTab>\r\n </div>\r\n <SuggestedItemsMultiSelect\r\n key={activeTheme}\r\n suggestedItems={suggestedItems}\r\n onSuggestedItemToggle={onSuggestedItemToggle}\r\n disableAllUnselectedSuggestions={!(remaningItemsCount > 0)}\r\n disabledSuggestionTooltip={disabledSuggestionTooltip}\r\n />\r\n </FluentProvider>\r\n </Panel>\r\n );\r\n};\r\n\r\nTextAssetRecommendationsWithThemesPanel.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n onSave: PropTypes.func.isRequired,\r\n onCancel: PropTypes.func.isRequired,\r\n collection: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.shape({}))).isRequired,\r\n availableRecommendations: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\r\n maxCollectionSize: PropTypes.number.isRequired,\r\n title: PropTypes.string.isRequired,\r\n topicKey: PropTypes.string.isRequired,\r\n topicAriaLabel: PropTypes.string.isRequired,\r\n disabledSuggestionTooltip: PropTypes.string.isRequired,\r\n reportDisplayedRecommendations: PropTypes.func,\r\n DKIThemeName: PropTypes.string,\r\n};\r\n\r\nTextAssetRecommendationsWithThemesPanel.defaultProps = {\r\n reportDisplayedRecommendations: undefined,\r\n DKIThemeName: '',\r\n};\r\n","import { chain, findKey, isEmpty, isFunction, result, size } from 'underscore';\r\nimport React, { useCallback, useState, useEffect, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Separator } from '@fluentui/react';\r\nimport { SuggestionSectionCollapse } from '@bingads-webui-campaign-react/pill-item-components';\r\nimport RecommendationsSectionIcon from './media/recommendations-section.svg';\r\nimport { useCircularBufferView } from './use-circular-buffer-view';\r\nimport { TextAssetRecommendationsWithThemesPanel } from './text-asset-recommendations-panel';\r\n\r\nexport const MAX_INLINE_RECOMMENDATIONS_PER_PAGE = 5;\r\nexport const MAX_DKI_INLINE_RECOMMENDATIONS_PER_PAGE = 1;\r\n\r\nconst keyIsEmpty = ([text]) => isEmpty(text);\r\n\r\nexport const InlineRecommendations = ({\r\n i18n, collection, maxCollectionSize, availableRecommendations, singleAssetValidationPropsField,\r\n inlineRecommendationsHelpTopicKey, inlineRecommendationsHelpTopicAriaLabel, inlineRecommendationsTitle,\r\n inlineRecommendationsDisabledItemTooltip, applyRecommendation, applyRecommendations,\r\n reportDisplayedRecommendations, enableDKI, DKIThemeName,\r\n}) => {\r\n const flattenedAvailableRecommendations = useMemo(() => chain(availableRecommendations)\r\n .map(theme => result(theme, 'assets'))\r\n .flatten()\r\n .compact()\r\n .uniq() // dedup\r\n .value(), [availableRecommendations]);\r\n\r\n const flattenedAllAvailableRecommendations = useMemo(() => {\r\n if (enableDKI) {\r\n const flattenedAvailableDKIRecommendations = chain(availableRecommendations.filter(theme => theme.name === DKIThemeName))\r\n .map(theme => result(theme, 'assets'))\r\n .flatten()\r\n .compact()\r\n .uniq() // dedup\r\n .value();\r\n\r\n const flattenedAvailableNoDKIRecommendations = chain(availableRecommendations.filter(theme => theme.name !== DKIThemeName))\r\n .map(theme => result(theme, 'assets'))\r\n .flatten()\r\n .compact()\r\n .uniq() // dedup\r\n .value();\r\n return [...flattenedAvailableDKIRecommendations.slice(0, MAX_DKI_INLINE_RECOMMENDATIONS_PER_PAGE), ...flattenedAvailableNoDKIRecommendations];\r\n }\r\n return flattenedAvailableRecommendations;\r\n }, [DKIThemeName, availableRecommendations, enableDKI, flattenedAvailableRecommendations]);\r\n\r\n const [availableInlineRecommendations, canMoveNext, moveNext] = useCircularBufferView(flattenedAllAvailableRecommendations, MAX_INLINE_RECOMMENDATIONS_PER_PAGE);\r\n\r\n useEffect(() => {\r\n if (!isEmpty(availableInlineRecommendations) && isFunction(reportDisplayedRecommendations)) {\r\n reportDisplayedRecommendations(availableInlineRecommendations);\r\n }\r\n }, [availableInlineRecommendations, reportDisplayedRecommendations]);\r\n\r\n let firstAvailableKey = findKey(collection, keyIsEmpty);\r\n if (!firstAvailableKey && size(collection) < maxCollectionSize) {\r\n firstAvailableKey = `${singleAssetValidationPropsField}${size(collection)}`;\r\n }\r\n\r\n const [prevAvailbleKeyWasDefined, setPrevAvailbleKeyWasDefined] = useState(!!firstAvailableKey);\r\n const [shouldForceCloseCollapse, setShouldForceCloseCollapse] = useState(!firstAvailableKey);\r\n useEffect(() => {\r\n const firstAvailableKeyIsDefined = !!firstAvailableKey;\r\n if (prevAvailbleKeyWasDefined !== firstAvailableKeyIsDefined) {\r\n if (!shouldForceCloseCollapse && (prevAvailbleKeyWasDefined && !firstAvailableKeyIsDefined)) {\r\n setShouldForceCloseCollapse(true);\r\n } else if (shouldForceCloseCollapse && (!prevAvailbleKeyWasDefined && firstAvailableKeyIsDefined)) {\r\n setShouldForceCloseCollapse(false);\r\n }\r\n setPrevAvailbleKeyWasDefined(firstAvailableKeyIsDefined);\r\n }\r\n }, [firstAvailableKey, prevAvailbleKeyWasDefined, shouldForceCloseCollapse]);\r\n\r\n const onAddSuggestedItem = useCallback(\r\n (itemIndex, itemText) => firstAvailableKey && applyRecommendation(firstAvailableKey, itemText),\r\n [firstAvailableKey, applyRecommendation]\r\n );\r\n\r\n const onAddAllSuggestedItems = useCallback(\r\n () => applyRecommendations(availableInlineRecommendations),\r\n [availableInlineRecommendations, applyRecommendations]\r\n );\r\n\r\n const [isSuggestionsPanelOpen, setIsSuggestionsPanelOpen] = useState(false);\r\n const onMoreSuggestionsButtonClick = useCallback(() => {\r\n setIsSuggestionsPanelOpen(true);\r\n reportDisplayedRecommendations(flattenedAvailableRecommendations);\r\n }, [flattenedAvailableRecommendations, reportDisplayedRecommendations]);\r\n\r\n const onCancelAddingMultipleRecommendations = useCallback(\r\n () => setIsSuggestionsPanelOpen(false),\r\n []\r\n );\r\n\r\n const onAddMultipleRecommendations = useCallback(\r\n (recommendations) => {\r\n applyRecommendations(recommendations);\r\n setIsSuggestionsPanelOpen(false);\r\n },\r\n [applyRecommendations]\r\n );\r\n\r\n if (!isEmpty(availableInlineRecommendations)) {\r\n return (\r\n <>\r\n <Separator styles={{ root: { marginBottom: 6 } }} />\r\n <SuggestionSectionCollapse\r\n className=\"rsa-suggestion-section-collapse\"\r\n topicKey={inlineRecommendationsHelpTopicKey}\r\n topicAriaLabel={i18n.getString(inlineRecommendationsHelpTopicAriaLabel)}\r\n icon={RecommendationsSectionIcon}\r\n iconAltText={inlineRecommendationsTitle}\r\n suggestedItems={availableInlineRecommendations.map(itemText => ({ itemText, key: itemText }))}\r\n onAddSuggestedItem={onAddSuggestedItem}\r\n onAddAllSuggestedItems={onAddAllSuggestedItems}\r\n suggestedSectionTitle={i18n.getString(inlineRecommendationsTitle)}\r\n showSuggestionsSectionShimmer={false}\r\n showMoreSuggestionsInlineButton={canMoveNext}\r\n onMoreSuggestionsInlineButtonClick={moveNext}\r\n showAddAllSuggestionsButton={!!firstAvailableKey}\r\n addAllSuggestionsButtonText={i18n.getString(_TL_('Add all'))}\r\n showMoreSuggestionsButton={canMoveNext}\r\n moreSuggestionsButtonText={i18n.getString(_TL_('View more'))}\r\n disableAllSuggestions={!firstAvailableKey}\r\n disabledSuggestionTooltip={i18n.getString(inlineRecommendationsDisabledItemTooltip)}\r\n useStyleFluent2\r\n onMoreSuggestionsButtonClick={onMoreSuggestionsButtonClick}\r\n forceClose={shouldForceCloseCollapse}\r\n />\r\n {isSuggestionsPanelOpen &&\r\n <TextAssetRecommendationsWithThemesPanel\r\n i18n={i18n}\r\n collection={collection}\r\n availableRecommendations={availableRecommendations}\r\n allRecommendations={flattenedAvailableRecommendations}\r\n maxCollectionSize={maxCollectionSize}\r\n title={i18n.getString(inlineRecommendationsTitle)}\r\n topicKey={inlineRecommendationsHelpTopicKey}\r\n topicAriaLabel={i18n.getString(inlineRecommendationsHelpTopicAriaLabel)}\r\n onSave={onAddMultipleRecommendations}\r\n onCancel={onCancelAddingMultipleRecommendations}\r\n disabledSuggestionTooltip={i18n.getString(inlineRecommendationsDisabledItemTooltip)}\r\n reportDisplayedRecommendations={reportDisplayedRecommendations}\r\n DKIThemeName={DKIThemeName}\r\n />\r\n }\r\n </>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nInlineRecommendations.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n collection: PropTypes.objectOf(PropTypes.string).isRequired,\r\n maxCollectionSize: PropTypes.number.isRequired,\r\n availableRecommendations: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n singleAssetValidationPropsField: PropTypes.string.isRequired,\r\n inlineRecommendationsHelpTopicKey: PropTypes.string.isRequired,\r\n inlineRecommendationsHelpTopicAriaLabel: PropTypes.string.isRequired,\r\n inlineRecommendationsTitle: PropTypes.string.isRequired,\r\n inlineRecommendationsDisabledItemTooltip: PropTypes.string.isRequired,\r\n applyRecommendation: PropTypes.func.isRequired,\r\n applyRecommendations: PropTypes.func.isRequired,\r\n reportDisplayedRecommendations: PropTypes.func,\r\n enableDKI: PropTypes.bool,\r\n DKIThemeName: PropTypes.string,\r\n};\r\n\r\nInlineRecommendations.defaultProps = {\r\n reportDisplayedRecommendations: undefined,\r\n enableDKI: false,\r\n DKIThemeName: '',\r\n};\r\n","import { useCallback, useEffect, useState } from 'react';\r\n\r\nexport const useCircularBufferView = (collection, pageSize) => {\r\n const [page, setPage] = useState([]);\r\n const [currentIndex, setCurrentIndex] = useState(0);\r\n\r\n useEffect(() => {\r\n if (collection.length === 0) {\r\n setPage([]);\r\n return;\r\n }\r\n\r\n const newPage = [];\r\n let index = currentIndex % collection.length;\r\n let count = 0;\r\n while (count < pageSize && count < collection.length) {\r\n newPage.push(collection[index]);\r\n index = (index + 1) % collection.length;\r\n count += 1;\r\n }\r\n setPage(newPage);\r\n }, [collection, currentIndex, pageSize]);\r\n\r\n const canMoveNext = collection.length > pageSize;\r\n\r\n const moveNext = useCallback(() => {\r\n setCurrentIndex((currentIndex + pageSize) % collection.length);\r\n }, [currentIndex, collection.length, pageSize]);\r\n\r\n return [page, canMoveNext, moveNext];\r\n};\r\n","import _ from 'underscore';\r\n\r\nexport const maxHeadlineCount = 15;\r\nexport const maxDescriptionCount = 4;\r\nexport const DKIThemeDefaultName = 'Asset_Theme_For_DKI';\r\n\r\nconst rsaCollectionConfig = {\r\n headlines: {\r\n singleAssetValidationPropsField: 'Headline',\r\n validationPropsField: 'Headlines',\r\n minCollectionSize: 3,\r\n maxCollectionSize: maxHeadlineCount,\r\n inlineRecommendationsTitle: _TL_('Headlines from your website'),\r\n inlineRecommendationsHelpTopicKey: 'pop_BA_Recommendations_AI_ChatGPT_Headlines',\r\n inlineRecommendationsHelpTopicAriaLabel: _TL_('Click to learn more about headlines recommendations'),\r\n inlineRecommendationsDisabledItemTooltip: _TL_('You have entered the maximum number of descriptions. To add another description, remove an existing one.'),\r\n enableDKI: true,\r\n DKIThemeName: _TL_('Headline with dynamic keyword'),\r\n },\r\n descriptions: {\r\n singleAssetValidationPropsField: 'Description',\r\n validationPropsField: 'Descriptions',\r\n minCollectionSize: 2,\r\n maxCollectionSize: maxDescriptionCount,\r\n inlineRecommendationsTitle: _TL_('Descriptions from your website'),\r\n inlineRecommendationsHelpTopicKey: 'pop_BA_Recommendations_AI_ChatGPT_Descriptions',\r\n inlineRecommendationsHelpTopicAriaLabel: _TL_('Click to learn more about descriptions recommendations'),\r\n inlineRecommendationsDisabledItemTooltip: _TL_('You have entered the maximum number of descriptions. To add another description, remove an existing one.'),\r\n },\r\n};\r\n\r\nexport const getTextAssetCollectionConfig = (collectionName) => {\r\n const unlocalizedArgs = _.result(rsaCollectionConfig, collectionName, undefined);\r\n\r\n if (!unlocalizedArgs) {\r\n throw new Error(`Invalid text asset collection name: ${collectionName}`);\r\n }\r\n\r\n const localizedArgs = {\r\n ...unlocalizedArgs,\r\n };\r\n\r\n return localizedArgs;\r\n};\r\n\r\n","import _ from 'underscore';\r\n\r\nexport const getEmptyRecommendationsContext = finalUrl => ({\r\n finalUrl,\r\n themes: [],\r\n});\r\n\r\nexport class SuggestionsTracker {\r\n constructor() {\r\n this.trackingData = {};\r\n }\r\n\r\n add(finalUrl, suggestions, suggestionsReport) {\r\n this.trackingData = this.trackingData || {};\r\n this.trackingData.finalUrl = finalUrl;\r\n this.trackingData.allTextSuggestions = this.trackingData.allTextSuggestions || {\r\n themes: [],\r\n };\r\n\r\n if (suggestions) {\r\n this.trackingData.allTextSuggestions = {\r\n themes: _.uniq((this.trackingData.allTextSuggestions.themes).concat(suggestions.themes)),\r\n };\r\n }\r\n if (_.isArray(suggestionsReport.view)) {\r\n this.trackingData.view = _.uniq((this.trackingData.view || []).concat(suggestionsReport.view));\r\n }\r\n if (_.isArray(suggestionsReport.apply)) {\r\n this.trackingData.apply = _.uniq((this.trackingData.apply || []).concat(suggestionsReport.apply));\r\n }\r\n if (_.isArray(suggestionsReport.returned)) {\r\n this.trackingData.returned = _.uniq((this.trackingData.returned || []).concat(suggestionsReport.returned));\r\n }\r\n }\r\n}\r\n","import _ from 'underscore';\r\nimport React, { useCallback, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport hoistNonReactStatics from 'hoist-non-react-statics';\r\nimport { CopilotSuggestionsTracker } from '@bingads-webui-campaign-react/copilot-common';\r\nimport { getDisplayName } from '@bingads-webui-react/hoc-utils';\r\nimport { SuggestionsTracker } from './util';\r\n\r\nexport const RecommendationContext = React.createContext([\r\n {},\r\n _.noop,\r\n _.noop,\r\n]);\r\n\r\nexport function RecommendationContextProvider(props) {\r\n const { children } = props;\r\n const [recommendationContext, setRecommendationContext] = useState({\r\n finalUrl: undefined,\r\n finalUrls: [],\r\n themes: [],\r\n tracking: new SuggestionsTracker(),\r\n copilotTracking: new CopilotSuggestionsTracker(),\r\n });\r\n const updateRecommendationContext = useCallback((delta) => {\r\n setRecommendationContext(currentContext => ({\r\n ...currentContext,\r\n ...delta,\r\n }));\r\n }, []);\r\n\r\n const reportRecommendations = useCallback((recommendationsReport) => {\r\n setRecommendationContext((currentContext) => {\r\n const {\r\n finalUrl,\r\n tracking,\r\n themes,\r\n } = currentContext;\r\n const recommendations = {\r\n themes,\r\n };\r\n tracking.add(finalUrl, recommendations, recommendationsReport);\r\n return currentContext;\r\n });\r\n }, []);\r\n\r\n return (\r\n <RecommendationContext.Provider value={[\r\n recommendationContext,\r\n updateRecommendationContext,\r\n reportRecommendations,\r\n ]}\r\n >\r\n {children}\r\n </RecommendationContext.Provider>\r\n );\r\n}\r\n\r\nRecommendationContextProvider.propTypes = {\r\n children: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]).isRequired,\r\n};\r\n\r\nexport const withRecommendationContext = (WrappedComponent) => {\r\n const HoC = props => (\r\n <RecommendationContextProvider>\r\n <WrappedComponent {...props} />\r\n </RecommendationContextProvider>\r\n );\r\n HoC.displayName = `WithRecommendationContext(${getDisplayName(WrappedComponent)})`;\r\n\r\n hoistNonReactStatics(HoC, WrappedComponent);\r\n\r\n return HoC;\r\n};\r\n","import _ from 'underscore';\r\nimport { useEffect, useContext, useCallback, useMemo, useState } from 'react';\r\nimport { ActivityContext } from '@bingads-webui-react/hoc-with-signal';\r\nimport { AssetEventFeature, useLogRecommendationsApiError } from '@bingads-webui-campaign-react/copilot-common';\r\nimport { usePostAssetEvent, AssetChannel, AssetScenario } from '@bingads-webui-react/copilot-event-provider';\r\nimport { isCopilotRegionRestricted } from '@bingads-webui-react/copilot-utils';\r\nimport { RecommendationContext } from './recommendation-context';\r\nimport { getEmptyRecommendationsContext } from './util';\r\n\r\nexport function useCopilotRecommendations({\r\n campaignId,\r\n serverContext,\r\n editMode,\r\n entityId,\r\n instrumentation,\r\n activityLogger,\r\n}) {\r\n const activity = useContext(ActivityContext);\r\n\r\n const logRecommendationsAPIError = useLogRecommendationsApiError(activity || activityLogger);\r\n\r\n const logTrace = useMemo(() => {\r\n if (activity && activity.trace) {\r\n return activity.trace;\r\n }\r\n if (activityLogger && activityLogger.trace) {\r\n return activityLogger.trace;\r\n }\r\n if (instrumentation && instrumentation.AdsCopilot) {\r\n const scenario = instrumentation.AdsCopilot.create();\r\n return scenario.createActivity('AssetEvent').trace;\r\n }\r\n return null;\r\n }, [activity, activityLogger, instrumentation]);\r\n\r\n const [, setRecommendationContext] = useContext(RecommendationContext);\r\n\r\n const { Permissions, DynamicPermissions } = serverContext || { };\r\n const permissions = useMemo(() => ({ dynamic: { ...DynamicPermissions }, ...Permissions }), [DynamicPermissions, Permissions]);\r\n\r\n const [isRegionRestricted, setIsRegionRestricted] = useState(true);\r\n useEffect(() => {\r\n isCopilotRegionRestricted({\r\n feature: 'Recommendations',\r\n permissions,\r\n serverContext,\r\n }).then(setIsRegionRestricted);\r\n }, [permissions, serverContext]);\r\n\r\n const postAssetEventLog = usePostAssetEvent({\r\n shouldLog: _.isFunction(logTrace) && !isRegionRestricted,\r\n serverContext,\r\n channel: AssetChannel.WEB_UI,\r\n feature: AssetEventFeature.RSA,\r\n scenario: editMode ? AssetScenario.EDIT_WORK_FLOW : AssetScenario.CREATE_WORK_FLOW,\r\n campaignId,\r\n assetGroupId: editMode ? entityId : undefined,\r\n logTrace,\r\n });\r\n\r\n useEffect(() => {\r\n // create the postAssetEventLog function and save it in the context\r\n setRecommendationContext({ postAssetEventLog });\r\n }, [postAssetEventLog, setRecommendationContext]);\r\n\r\n const resetRecommendations = useCallback((newFinalUrl) => {\r\n setRecommendationContext(getEmptyRecommendationsContext(newFinalUrl));\r\n }, [setRecommendationContext]);\r\n\r\n return {\r\n logRecommendationsAPIError,\r\n resetRecommendations,\r\n };\r\n}\r\n","import React, { useCallback, useMemo, useContext, useEffect, useState } from 'react';\r\nimport _ from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { ThemeProvider } from 'react-jss';\r\nimport { AssetEventRecordType, AssetType, POST_ASSET_EVENT_NAME } from '@bingads-webui-campaign-react/copilot-common';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { ComponentSettings, ThemeFluent } from '@bingads-webui-theme-2018/theme-fluent';\r\nimport { cloneDeep } from '@bingads-webui-universal/primitive-utilities';\r\nimport { setClarityTag } from '@bingads-webui-universal/clarity';\r\nimport { PermissionsContext } from '@bingads-webui-react/hoc-with-permissions';\r\n\r\nimport { getTextAssetRecommendationsStyles } from './style';\r\nimport { InlineRecommendations } from './inline-recommendation';\r\nimport { maxHeadlineCount, maxDescriptionCount, DKIThemeDefaultName } from './config/text-asset-collection-config';\r\nimport { RecommendationContext } from './recommendation-context';\r\n\r\nconst recommendationFieldMap = {\r\n Headlines: 'headlines',\r\n Descriptions: 'descriptions',\r\n};\r\nconst assetCountMap = {\r\n Headlines: maxHeadlineCount,\r\n Descriptions: maxDescriptionCount,\r\n};\r\n\r\nexport const TextAssetCollectionWithRecommendations = React.memo((props) => {\r\n const {\r\n validationPropsField,\r\n maxCollectionSize,\r\n inlineRecommendationsTitle,\r\n inlineRecommendationsHelpTopicKey,\r\n inlineRecommendationsHelpTopicAriaLabel,\r\n inlineRecommendationsDisabledItemTooltip,\r\n singleAssetValidationPropsField,\r\n i18n,\r\n withInlineRecommendations,\r\n data,\r\n onChange,\r\n updateSuggestionMeasurement,\r\n setApplyTextAssetCallback,\r\n enableDKI,\r\n DKIThemeName,\r\n } = props;\r\n\r\n const permissions = useContext(PermissionsContext);\r\n const classes = useDefaultStyles(getTextAssetRecommendationsStyles);\r\n const currentCollection = _.result(data, validationPropsField, []); // Currently filled headlines\r\n const currentCollectionAsset = _.pluck(currentCollection, 'Asset').filter(item => (item !== undefined && !_.isNull(item)));\r\n const currentCollectionAssetText = _.pluck(currentCollectionAsset, 'Text');\r\n const [viewedCopilotSuggestions, setViewedCopilotSuggestions] = useState();\r\n\r\n const collection = {};\r\n currentCollectionAssetText.forEach((item, index) => { collection[`Headline${index}`] = item; });\r\n\r\n const [recommendationContext, , reportRecommendations] = useContext(RecommendationContext);\r\n const { postAssetEventLog = _.noop, copilotTracking } = recommendationContext;\r\n\r\n const logCopilotSuggestions = useCallback((suggestionIds) => {\r\n if (copilotTracking) {\r\n const suggestionsToLog = copilotTracking.getUntrackedViewedSuggestionIds(suggestionIds);\r\n if (suggestionsToLog.length > 0) {\r\n postAssetEventLog({\r\n EventName: POST_ASSET_EVENT_NAME,\r\n EventValue: {\r\n AssetType: _.map(suggestionsToLog, () => AssetType.TEXT),\r\n SuggestionIds: suggestionsToLog,\r\n RecordType: AssetEventRecordType.VIEWED,\r\n },\r\n });\r\n copilotTracking.trackViewedSuggestionIds(suggestionsToLog);\r\n }\r\n }\r\n }, [copilotTracking, postAssetEventLog]);\r\n\r\n const recommendationsField = recommendationFieldMap[validationPropsField];\r\n const collectionRecommendations = useMemo(() => {\r\n const { themes } = recommendationContext;\r\n return _.map(themes, theme => ({\r\n name: theme.name,\r\n assets: _.result(theme, recommendationsField),\r\n }));\r\n }, [recommendationContext, recommendationsField]);\r\n\r\n const availableRecommendations = useMemo(\r\n () => {\r\n let availableCollectionRecommendations = collectionRecommendations.filter(theme => theme.name !== DKIThemeDefaultName);\r\n if (permissions && permissions.dynamic && permissions.dynamic.CopilotDKIRecommendation && enableDKI) {\r\n const DKItheme = collectionRecommendations.filter(theme => theme.name === DKIThemeDefaultName);\r\n availableCollectionRecommendations = [...DKItheme, ...availableCollectionRecommendations];\r\n }\r\n return _.chain(availableCollectionRecommendations)\r\n .map(theme => ({\r\n name: theme.name === DKIThemeDefaultName ? DKIThemeName : theme.name,\r\n assets: _.chain(theme.assets)\r\n .map(_.property('Text'))\r\n .filter(recommendation => !_.contains(currentCollectionAssetText, recommendation))\r\n .value(),\r\n }))\r\n .filter(theme => !_.isEmpty(theme.assets))\r\n .value();\r\n },\r\n [DKIThemeName, collectionRecommendations, currentCollectionAssetText, enableDKI, permissions]\r\n );\r\n\r\n const flattenedCollectionRecommendations = useMemo(() => _.chain(collectionRecommendations)\r\n .map(theme => _.result(theme, 'assets'))\r\n .flatten()\r\n .compact()\r\n .value(), [collectionRecommendations]);\r\n\r\n const recommendationsMap = useMemo(\r\n () => _.chain(flattenedCollectionRecommendations)\r\n .map(recommendation => [\r\n recommendation.Text,\r\n {\r\n ...recommendation,\r\n SuggestionId: recommendation.RecommendationId,\r\n },\r\n ])\r\n .object()\r\n .value(),\r\n [flattenedCollectionRecommendations]\r\n );\r\n\r\n const getSuggestionIds = useCallback((recommendations) => {\r\n const displayedRecommendations = _.chain(recommendations)\r\n .map(recommendation => recommendationsMap[recommendation])\r\n .compact()\r\n .value();\r\n if (!_.isEmpty(displayedRecommendations)) {\r\n return _.pluck(displayedRecommendations, 'SuggestionId');\r\n }\r\n return [];\r\n }, [recommendationsMap]);\r\n\r\n const reportDisplayedRecommendations = useCallback((recommendations) => {\r\n const displayedRecommendationsIds = getSuggestionIds(recommendations);\r\n reportRecommendations({\r\n view: displayedRecommendationsIds,\r\n });\r\n logCopilotSuggestions(displayedRecommendationsIds);\r\n }, [getSuggestionIds, logCopilotSuggestions, reportRecommendations]);\r\n\r\n const addAssetSuggestion = useCallback((assets, text) => {\r\n const applySuggestionIds = getSuggestionIds([text]);\r\n if (_.isEmpty(assets)) {\r\n onChange([{\r\n Asset: {\r\n '@odata.type': '#Model.TextAsset',\r\n AssetType: 'Text',\r\n Name: null,\r\n Text: text,\r\n },\r\n PinnedField: 'None',\r\n }], validationPropsField);\r\n return;\r\n }\r\n const index = _.findIndex(_.range(assets.length), i =>\r\n _.isEmpty(assets[i].Asset.Text));\r\n\r\n // add suggestion to empty field first; if no empty field, try to add a new field\r\n if (index !== -1) {\r\n const newAssets = [...assets];\r\n newAssets[index].Asset.Text = text;\r\n onChange(newAssets, validationPropsField);\r\n } else if (assets.length < assetCountMap[validationPropsField]) {\r\n const newAssets = [\r\n ...assets,\r\n {\r\n Asset: {\r\n '@odata.type': '#Model.TextAsset',\r\n AssetType: 'Text',\r\n Name: null,\r\n Text: text,\r\n },\r\n PinnedField: 'None',\r\n },\r\n ];\r\n onChange(newAssets, validationPropsField);\r\n }\r\n updateSuggestionMeasurement({ applySuggestionIds }); // todo: get real id\r\n }, [validationPropsField, getSuggestionIds, onChange, updateSuggestionMeasurement]);\r\n\r\n const applyRecommendation = useCallback((key, text) => {\r\n const collectionData = cloneDeep(currentCollection);\r\n addAssetSuggestion(collectionData, text);\r\n }, [addAssetSuggestion, currentCollection]);\r\n\r\n const isAbleToAddSuggestion = useCallback(() => {\r\n if (_.isEmpty(currentCollection)) return true;\r\n // has at least one empty field\r\n return _.some(currentCollection, asset => _.isEmpty(asset.Asset.Text)) ||\r\n // not reach the asset count limit\r\n currentCollection.length < assetCountMap[validationPropsField];\r\n }, [validationPropsField, currentCollection]);\r\n\r\n useEffect(() => {\r\n if (viewedCopilotSuggestions && recommendationContext) {\r\n reportDisplayedRecommendations(viewedCopilotSuggestions);\r\n }\r\n }, [recommendationContext, reportDisplayedRecommendations, viewedCopilotSuggestions]);\r\n\r\n useEffect(() => {\r\n setClarityTag({ RSANewCopilotUI: 'true' });\r\n }, []);\r\n\r\n const addAllAssetSuggestion = useCallback((assets, texts) => {\r\n let newAssets = [...assets];\r\n const applySuggestionIds = getSuggestionIds(texts);\r\n\r\n // Track which auto-filled suggestions have been viewed\r\n const newViewedCopilotSuggestions = [];\r\n _.each(texts, (text) => {\r\n if (!isAbleToAddSuggestion()) { return; }\r\n // dedup\r\n if (_.some(newAssets, asset => _.result(asset, ['Asset', 'Text']) === text)) { return; }\r\n if (_.isEmpty(newAssets)) {\r\n newAssets = [{\r\n Asset: {\r\n '@odata.type': '#Model.TextAsset',\r\n AssetType: 'Text',\r\n Name: null,\r\n Text: text,\r\n },\r\n PinnedField: 'None',\r\n }];\r\n return;\r\n }\r\n const index = _.findIndex(_.range(newAssets.length), i =>\r\n _.isEmpty(newAssets[i].Asset.Text));\r\n\r\n // add suggestion to empty field first; if no empty field, try to add a new field\r\n if (index !== -1) {\r\n newAssets[index].Asset.Text = text;\r\n newViewedCopilotSuggestions.push(text);\r\n } else if (newAssets.length < assetCountMap[validationPropsField]) {\r\n newAssets = [\r\n ...newAssets,\r\n {\r\n Asset: {\r\n '@odata.type': '#Model.TextAsset',\r\n AssetType: 'Text',\r\n Name: null,\r\n Text: text,\r\n },\r\n PinnedField: 'None',\r\n },\r\n ];\r\n newViewedCopilotSuggestions.push(text);\r\n }\r\n });\r\n onChange(newAssets, validationPropsField);\r\n updateSuggestionMeasurement({ applySuggestionIds });\r\n setViewedCopilotSuggestions(newViewedCopilotSuggestions);\r\n }, [getSuggestionIds, onChange, validationPropsField, updateSuggestionMeasurement, isAbleToAddSuggestion]);\r\n\r\n const applyRecommendations = useCallback((recommendations) => {\r\n const collectionData = cloneDeep(currentCollection);\r\n addAllAssetSuggestion(collectionData, recommendations);\r\n }, [addAllAssetSuggestion, currentCollection]);\r\n\r\n useEffect(() => {\r\n if (_.isFunction(setApplyTextAssetCallback)) {\r\n setApplyTextAssetCallback(() => (recommendations) => {\r\n applyRecommendations(recommendations);\r\n });\r\n }\r\n }, [setApplyTextAssetCallback, applyRecommendations]);\r\n\r\n return (\r\n <ThemeProvider theme={{ components: ComponentSettings, core: ThemeFluent }}>\r\n <div className={classnames('text-asset-recommendation-content', classes.textAssetRecommendationsContent)}>\r\n {withInlineRecommendations &&\r\n <InlineRecommendations\r\n i18n={i18n}\r\n collection={collection}\r\n collectionRecommendations={collectionRecommendations}\r\n maxCollectionSize={maxCollectionSize}\r\n availableRecommendations={availableRecommendations}\r\n singleAssetValidationPropsField={singleAssetValidationPropsField}\r\n inlineRecommendationsHelpTopicKey={inlineRecommendationsHelpTopicKey}\r\n inlineRecommendationsHelpTopicAriaLabel={inlineRecommendationsHelpTopicAriaLabel}\r\n inlineRecommendationsTitle={inlineRecommendationsTitle}\r\n inlineRecommendationsDisabledItemTooltip={inlineRecommendationsDisabledItemTooltip}\r\n applyRecommendation={applyRecommendation}\r\n applyRecommendations={applyRecommendations}\r\n reportDisplayedRecommendations={reportDisplayedRecommendations}\r\n enableDKI={permissions && permissions.dynamic && permissions.dynamic.CopilotDKIRecommendation && enableDKI}\r\n DKIThemeName={DKIThemeName}\r\n />\r\n }\r\n </div>\r\n </ThemeProvider>\r\n );\r\n});\r\n\r\nTextAssetCollectionWithRecommendations.propTypes = {\r\n validationPropsField: PropTypes.string.isRequired,\r\n data: PropTypes.shape({}).isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n singleAssetValidationPropsField: PropTypes.string.isRequired,\r\n maxCollectionSize: PropTypes.number.isRequired,\r\n inlineRecommendationsTitle: PropTypes.string.isRequired,\r\n inlineRecommendationsHelpTopicKey: PropTypes.string.isRequired,\r\n inlineRecommendationsHelpTopicAriaLabel: PropTypes.string.isRequired,\r\n inlineRecommendationsDisabledItemTooltip: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.element,\r\n PropTypes.arrayOf(PropTypes.element),\r\n ]).isRequired,\r\n withInlineRecommendations: PropTypes.bool,\r\n onChange: PropTypes.func.isRequired,\r\n updateSuggestionMeasurement: PropTypes.func.isRequired,\r\n setApplyTextAssetCallback: PropTypes.func,\r\n enableDKI: PropTypes.bool,\r\n DKIThemeName: PropTypes.string,\r\n};\r\n\r\nTextAssetCollectionWithRecommendations.defaultProps = {\r\n withInlineRecommendations: false,\r\n setApplyTextAssetCallback: _.noop,\r\n enableDKI: false,\r\n DKIThemeName: '',\r\n};\r\n","import React, { useContext, useMemo } from 'react';\r\nimport { noop } from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { TextAssetCollectionWithRecommendations } from './text-asset-collection-with-recommendations';\r\nimport { getTextAssetCollectionConfig } from './config/text-asset-collection-config';\r\n\r\nexport const HeadlineAssetCollection = React.memo((props) => {\r\n const {\r\n data,\r\n onChange,\r\n updateSuggestionMeasurement,\r\n setApplyHeadlinesCallback,\r\n } = props;\r\n const i18n = useContext(I18nContext);\r\n const headlineConfig = useMemo(() => getTextAssetCollectionConfig('headlines'), []);\r\n\r\n return (\r\n <div className=\"headline-asset-collection\">\r\n <TextAssetCollectionWithRecommendations\r\n {...headlineConfig}\r\n i18n={i18n}\r\n data={data}\r\n onChange={onChange}\r\n updateSuggestionMeasurement={updateSuggestionMeasurement}\r\n withInlineRecommendations\r\n setApplyTextAssetCallback={setApplyHeadlinesCallback}\r\n />\r\n </div>);\r\n});\r\n\r\nHeadlineAssetCollection.propTypes = {\r\n data: PropTypes.shape({}).isRequired,\r\n onChange: PropTypes.func.isRequired,\r\n updateSuggestionMeasurement: PropTypes.func.isRequired,\r\n setApplyHeadlinesCallback: PropTypes.func,\r\n};\r\n\r\nHeadlineAssetCollection.defaultProps = {\r\n setApplyHeadlinesCallback: noop,\r\n};\r\n\r\n","import React, { useContext, useMemo } from 'react';\r\nimport { noop } from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { TextAssetCollectionWithRecommendations } from './text-asset-collection-with-recommendations';\r\nimport { getTextAssetCollectionConfig } from './config/text-asset-collection-config';\r\n\r\nexport const DescriptionAssetCollection = React.memo((props) => {\r\n const {\r\n data,\r\n onChange,\r\n updateSuggestionMeasurement,\r\n setApplyDescriptionsCallback,\r\n } = props;\r\n const i18n = useContext(I18nContext);\r\n const headlineConfig = useMemo(() => getTextAssetCollectionConfig('descriptions'), []);\r\n\r\n return (\r\n <div className=\"description-asset-collection\">\r\n <TextAssetCollectionWithRecommendations\r\n {...headlineConfig}\r\n i18n={i18n}\r\n data={data}\r\n onChange={onChange}\r\n updateSuggestionMeasurement={updateSuggestionMeasurement}\r\n withInlineRecommendations\r\n setApplyTextAssetCallback={setApplyDescriptionsCallback}\r\n />\r\n </div>);\r\n});\r\n\r\nDescriptionAssetCollection.propTypes = {\r\n data: PropTypes.shape({}).isRequired,\r\n onChange: PropTypes.func.isRequired,\r\n updateSuggestionMeasurement: PropTypes.func.isRequired,\r\n setApplyDescriptionsCallback: PropTypes.func,\r\n};\r\n\r\nDescriptionAssetCollection.defaultProps = {\r\n setApplyDescriptionsCallback: noop,\r\n};\r\n\r\n","import _ from 'underscore';\r\n\r\n\r\nfunction getCollectionAsset(data, validationPropsField) {\r\n const currentCollection = _.result(data, validationPropsField, []); // Currently filled headlines\r\n const currentCollectionAsset = _.pluck(currentCollection, 'Asset').filter(item => (item !== undefined && !_.isNull(item)));\r\n const currentCollectionAssetText = _.pluck(currentCollectionAsset, 'Text');\r\n return currentCollectionAssetText;\r\n}\r\n\r\nfunction getAvailableRecommendations(collectionRecommendations, currentCollectionAssetText) {\r\n return _.filter(collectionRecommendations, recommendation => recommendation && recommendation.Text && !_.contains(currentCollectionAssetText, recommendation.Text));\r\n}\r\n// TODO: will remodify when the data layer is ready\r\nexport function formatToLLMSuggestion(recommendationContext, data) {\r\n if (!recommendationContext.themes) return {};\r\n\r\n const llmSuggestions = {\r\n Perspectives: [], SuggestionLanguage: '', Suggestions: [], SummaryReason: 'summarized_reason',\r\n };\r\n const currentCollectionHeadlines = getCollectionAsset(data, 'Headlines');\r\n const currentCollectionDescriptions = getCollectionAsset(data, 'Descriptions');\r\n\r\n _.each(recommendationContext.themes, (theme) => {\r\n let { headlines, descriptions } = theme;\r\n const { name: Perspective } = theme;\r\n headlines = getAvailableRecommendations(headlines, currentCollectionHeadlines);\r\n descriptions = getAvailableRecommendations(descriptions, currentCollectionDescriptions);\r\n const headlineSuggestions = _.map(headlines, (headline) => {\r\n const { Text, SuggestionId } = headline;\r\n return {\r\n Asset: Text,\r\n AssetType: 'Headline',\r\n Perspective,\r\n Reason: '',\r\n SrcId: '',\r\n SuggestionId,\r\n };\r\n });\r\n const descriptionSuggestions = _.map(descriptions, (description) => {\r\n const { Text, SuggestionId } = description;\r\n return {\r\n Asset: Text,\r\n AssetType: 'Description',\r\n Perspective,\r\n Reason: '',\r\n SrcId: '',\r\n SuggestionId,\r\n };\r\n });\r\n llmSuggestions.Perspectives.push({ Perspective, PitchingPoint: '' });\r\n llmSuggestions.Suggestions.push(...headlineSuggestions, ...descriptionSuggestions);\r\n });\r\n return llmSuggestions;\r\n}\r\n","import _ from 'underscore';\r\n\r\nconst Order = {\r\n 'AddMoreHeadlines-not-met': 1,\r\n 'AddMoreDescriptions-not-met': 2,\r\n 'AddMoreHeadlines-half-met': 3,\r\n 'AddMoreDescriptions-half-met': 4,\r\n 'LongerHeadlines-not-met': 5,\r\n 'LongerDescriptions-not-met': 6,\r\n 'DistinctHeadlines-not-met': 7,\r\n 'DistinctDescriptions-not-met': 8,\r\n 'UnpinHeadlinePositions-not-met': 9,\r\n 'UnpinDescriptionPositions-not-met': 10,\r\n 'LongerHeadlines-half-met': 11,\r\n 'LongerDescriptions-half-met': 12,\r\n 'DistinctHeadlines-half-met': 13,\r\n 'DistinctDescriptions-half-met': 14,\r\n 'UnpinHeadlinePositions-half-met': 15,\r\n 'UnpinDescriptionPositions-half-met': 16,\r\n 'MoreCombinations-not-met': 17,\r\n 'MoreCombinations-half-met': 18,\r\n 'AddMoreHeadlines-met': 19,\r\n 'AddMoreDescriptions-met': 20,\r\n 'LongerHeadlines-met': 21,\r\n 'LongerDescriptions-met': 22,\r\n 'DistinctHeadlines-met': 23,\r\n 'DistinctDescriptions-met': 24,\r\n 'UnpinHeadlinePositions-met': 25,\r\n 'UnpinDescriptionPositions-met': 26,\r\n 'MoreCombinations-met': 27,\r\n};\r\n\r\nconst SuggestionState = {\r\n Met: 'met',\r\n HalfMet: 'half-met',\r\n NotMet: 'not-met',\r\n};\r\n\r\nconst StrengthScore = {\r\n Poor: 25,\r\n Average: 50,\r\n Good: 75,\r\n Excellent: 100,\r\n};\r\n\r\nexport const maxHeadlineCount = 15;\r\n\r\nexport const maxDescriptionCount = 4;\r\n\r\nexport const ViewSuggestionType = {\r\n None: 'none',\r\n Headline: 'headline',\r\n Description: 'description',\r\n};\r\n\r\nexport function getStrengthScore(strength) {\r\n return StrengthScore[strength] || 0;\r\n}\r\n\r\nexport function generateSuggestion({\r\n i18n,\r\n assets,\r\n actionItem,\r\n strength,\r\n}) {\r\n const suggestion = i18n.getString(`Ad_Strength_Suggestion_${actionItem}`);\r\n let state = 'not-met';\r\n let suggestionType = ViewSuggestionType.None;\r\n\r\n switch (actionItem) {\r\n case 'AddMoreHeadlines': {\r\n const headlineCount = assets.headlines.length;\r\n if (headlineCount < 5) {\r\n state = SuggestionState.NotMet;\r\n } else if (headlineCount >= maxHeadlineCount\r\n || (headlineCount > 8 && getStrengthScore(strength) >= StrengthScore.Good)) {\r\n state = SuggestionState.Met;\r\n } else {\r\n state = SuggestionState.HalfMet;\r\n }\r\n suggestionType = ViewSuggestionType.Headline;\r\n break;\r\n }\r\n case 'AddMoreDescriptions': {\r\n const descriptionCount = assets.descriptions.length;\r\n if (descriptionCount < 2) {\r\n state = SuggestionState.NotMet;\r\n } else if (descriptionCount >= maxDescriptionCount\r\n || (descriptionCount > 3 && getStrengthScore(strength) >= StrengthScore.Good)) {\r\n state = SuggestionState.Met;\r\n } else {\r\n state = SuggestionState.HalfMet;\r\n }\r\n suggestionType = ViewSuggestionType.Description;\r\n break;\r\n }\r\n case 'DistinctHeadlines': {\r\n state = _.uniq(assets.headlines).length === assets.headlines.length\r\n ? SuggestionState.HalfMet\r\n : SuggestionState.NotMet;\r\n suggestionType = ViewSuggestionType.Headline;\r\n break;\r\n }\r\n case 'DistinctDescriptions':\r\n state = _.uniq(assets.descriptions).length === assets.descriptions.length\r\n ? SuggestionState.HalfMet\r\n : SuggestionState.NotMet;\r\n suggestionType = ViewSuggestionType.Description;\r\n break;\r\n case 'LongerHeadlines':\r\n state = (_.size(assets.headlines) === 0\r\n || _.any(assets.headlines, headline => _.size(headline) < 10))\r\n ? SuggestionState.NotMet\r\n : SuggestionState.HalfMet;\r\n suggestionType = ViewSuggestionType.Headline;\r\n break;\r\n case 'LongerDescriptions':\r\n state = (_.size(assets.descriptions) === 0\r\n || _.any(assets.descriptions, description => _.size(description) < 10))\r\n ? SuggestionState.NotMet\r\n : SuggestionState.HalfMet;\r\n suggestionType = ViewSuggestionType.Description;\r\n break;\r\n case 'UnpinHeadlinePositions': {\r\n const pinCount = assets.headlinePins.length;\r\n if (pinCount > 0) {\r\n state = pinCount === assets.headlines.length\r\n ? SuggestionState.NotMet\r\n : SuggestionState.HalfMet;\r\n } else {\r\n state = SuggestionState.Met;\r\n }\r\n suggestionType = ViewSuggestionType.None;\r\n break;\r\n }\r\n case 'UnpinDescriptionPositions': {\r\n const pinCount = assets.descriptionPins.length;\r\n if (pinCount > 0) {\r\n state = pinCount === assets.descriptions.length\r\n ? SuggestionState.NotMet\r\n : SuggestionState.HalfMet;\r\n } else {\r\n state = SuggestionState.Met;\r\n }\r\n suggestionType = ViewSuggestionType.None;\r\n break;\r\n }\r\n case 'MoreCombinations':\r\n if (assets.headlines.length < 5 || assets.descriptions.length < 3) {\r\n state = SuggestionState.NotMet;\r\n } else {\r\n state = SuggestionState.HalfMet;\r\n }\r\n if (assets.headlines.length < 10) {\r\n suggestionType = ViewSuggestionType.Headline;\r\n } else if (assets.descriptions.length < maxDescriptionCount) {\r\n suggestionType = ViewSuggestionType.Description;\r\n } else {\r\n suggestionType = ViewSuggestionType.None;\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n return {\r\n action: actionItem,\r\n state,\r\n suggestion,\r\n suggestionType,\r\n };\r\n}\r\n\r\nexport function sortSuggestions(suggestions) {\r\n return _.sortBy(suggestions, suggestion => Order[`${suggestion.action}-${suggestion.state}`] || 100);\r\n}\r\n","import $ from 'jquery';\r\nimport PropTypes from 'prop-types';\r\nimport React from 'react';\r\nimport { HighchartReactWrapper } from '@bingads-webui-react/highchart-react-wrapper';\r\nimport { getStrengthScore } from './ad-strength-helper';\r\n\r\nexport function AdStrengthScore({\r\n isForVNext = false,\r\n label,\r\n strength,\r\n}) {\r\n const score = getStrengthScore(strength);\r\n let options = {\r\n chart: {\r\n marginBottom: 15,\r\n marginTop: 0,\r\n plotBackgroundColor: null,\r\n plotBorderWidth: 0,\r\n plotShadow: false,\r\n type: 'pie',\r\n height: 110,\r\n width: 110,\r\n },\r\n colors: ['#4285f4', '#e8f0fe'],\r\n credits: {\r\n enabled: false,\r\n },\r\n plotOptions: {\r\n pie: {\r\n allowPointSelect: false,\r\n dataLabels: {\r\n enabled: false,\r\n },\r\n endAngle: 360,\r\n startAngle: 0,\r\n size: '100%',\r\n },\r\n series: {\r\n animation: false,\r\n },\r\n },\r\n series: [{\r\n type: 'pie',\r\n name: 'Ad Strength',\r\n data: [score, 100 - score],\r\n innerSize: '75%',\r\n showInLegend: false,\r\n states: {\r\n hover: {\r\n enabled: false,\r\n },\r\n inactive: {\r\n enabled: false,\r\n },\r\n },\r\n }],\r\n title: {\r\n text: label,\r\n align: 'center',\r\n verticalAlign: 'bottom',\r\n style: {\r\n fontSize: 14,\r\n fontWeight: 'bold',\r\n },\r\n },\r\n tooltip: {\r\n enabled: false,\r\n },\r\n };\r\n\r\n if (isForVNext) {\r\n options = $.extend(true, options, {\r\n chart: {\r\n height: 150,\r\n width: 150,\r\n },\r\n colors: ['#0078D4', '#C7E0F4'],\r\n series: [{\r\n innerSize: '80%',\r\n }],\r\n title: {\r\n y: 30,\r\n },\r\n });\r\n }\r\n\r\n return (\r\n <HighchartReactWrapper\r\n className=\"ad-strength-score\"\r\n options={options}\r\n />\r\n );\r\n}\r\n\r\nAdStrengthScore.propTypes = {\r\n isForVNext: PropTypes.bool,\r\n label: PropTypes.string.isRequired,\r\n strength: PropTypes.string.isRequired,\r\n};\r\n\r\nAdStrengthScore.defaultProps = {\r\n isForVNext: false,\r\n};\r\n","import _ from 'underscore';\r\n\r\nfunction getTextAsset(text, pinPosition) {\r\n return {\r\n Asset: {\r\n '@odata.type': '#Model.TextAsset',\r\n AssetType: 'Text',\r\n Text: text,\r\n },\r\n PinnedField: pinPosition,\r\n };\r\n}\r\n\r\nfunction getAssets(assets) {\r\n const availableAssets = _.filter(assets, asset => asset.text !== '');\r\n return _.map(availableAssets, asset => getTextAsset(asset.text, asset.pinPosition));\r\n}\r\n\r\nexport class AdStrengthRepository {\r\n constructor({\r\n adId,\r\n edm,\r\n jsdata,\r\n }) {\r\n this.adId = adId;\r\n this.edm = edm;\r\n this.jsdata = jsdata;\r\n }\r\n\r\n fetchAdStrength(viewModel) {\r\n const headlines = _.map(_.range(15), i => ({\r\n text: _.result(viewModel, `Headline${i}`),\r\n pinPosition: _.result(viewModel, `Headline${i}Position`),\r\n }));\r\n const descriptions = _.map(_.range(4), i => ({\r\n text: _.result(viewModel, `Description${i}`),\r\n pinPosition: _.result(viewModel, `Description${i}Position`),\r\n }));\r\n\r\n const params = this.edm.currentAccount ? {\r\n query: {\r\n entitySet: this.edm.currentAccount\r\n .Ads['Default.GetAdStrengthAndActionItems']\r\n .$call({\r\n ad: {\r\n '@odata.type': '#Model.ResponsiveSearchAd',\r\n Type: 'ResponsiveSearch',\r\n adId: this.adId,\r\n Headlines: getAssets(headlines),\r\n Descriptions: getAssets(descriptions),\r\n },\r\n })\r\n .toJSON(),\r\n },\r\n } : {\r\n query: {\r\n entitySet: this.edm.currentCustomer\r\n .Accounts.$withKey(viewModel.accountId)\r\n .Ads['Default.GetAdStrengthAndActionItems']\r\n .$call({\r\n ad: {\r\n '@odata.type': '#Model.ResponsiveSearchAd',\r\n Type: 'ResponsiveSearch',\r\n adId: this.adId,\r\n Headlines: getAssets(headlines),\r\n Descriptions: getAssets(descriptions),\r\n },\r\n })\r\n .toJSON(),\r\n },\r\n };\r\n const options = {\r\n cacheResponse: false,\r\n };\r\n return this.jsdata.Ad.findAll(params, options);\r\n }\r\n}\r\n","import Promise from 'bluebird';\r\nimport _ from 'underscore';\r\nimport $ from 'jquery';\r\nimport { stringifySync } from '@bingads-webui/safe-json';\r\n\r\nconst adStrengthSuggestionEndpoint = '{odataPath}AdInsight/V2/Customers({customer_id})/Accounts({account_id})/Campaigns({campaign_id})/AdGroups({adgroup_id})/RSAV2.GetRSAV2AssetsSuggestions';\r\n\r\nconst formatUrl = (url, odataPath, appState, campaignId, adGroupId, accountId = 0) => url\r\n .replace('{odataPath}', odataPath)\r\n .replace('{account_id}', !_.isUndefined(appState.get('account_id')) ? appState.get('account_id') : accountId)\r\n .replace('{customer_id}', appState.get('customer_id'))\r\n .replace('{campaign_id}', campaignId)\r\n .replace('{adgroup_id}', adGroupId);\r\n\r\nexport class AdStrengthSuggestionRepository {\r\n constructor({\r\n viewModel,\r\n appState,\r\n token,\r\n odataPath,\r\n }) {\r\n this.viewModel = viewModel;\r\n this.appState = appState;\r\n this.token = token;\r\n this.odataPath = odataPath;\r\n }\r\n\r\n fetchAdStrengthSuggestion() {\r\n const {\r\n viewModel,\r\n appState,\r\n token,\r\n odataPath,\r\n } = this;\r\n\r\n let currentFinalUrl = null;\r\n if (!_.isEmpty(this.viewModel.FinalUrls()) && !_.isUndefined(this.viewModel.FinalUrls()) && !_.isEmpty(_.first(this.viewModel.FinalUrls()))) {\r\n currentFinalUrl = _.first(this.viewModel.FinalUrls());\r\n } else {\r\n return Promise.resolve({ data: [] });\r\n }\r\n\r\n const requestBody = {\r\n finalUrl: currentFinalUrl,\r\n };\r\n\r\n const option = {\r\n url: formatUrl(\r\n adStrengthSuggestionEndpoint,\r\n odataPath,\r\n appState,\r\n viewModel.scope().campaignId,\r\n viewModel.scope().adGroupId,\r\n viewModel.accountId\r\n ),\r\n contentType: 'application/json',\r\n headers: {\r\n authorization: `CCMTSmallToken ${token}`,\r\n },\r\n type: 'POST',\r\n data: stringifySync(requestBody),\r\n };\r\n\r\n const fetchDataPromise = new Promise((resolve, reject) => {\r\n $.ajax(option).then((rawData) => {\r\n resolve(rawData);\r\n }, reject);\r\n });\r\n\r\n return fetchDataPromise.then(rawData => ({\r\n data: rawData,\r\n }));\r\n }\r\n}\r\n","/* eslint-disable jsx-a11y/anchor-is-valid, no-param-reassign, max-len */\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport _ from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport $ from 'jquery';\r\nimport classnames from 'classnames';\r\nimport { AdStrengthSuggestionRepository } from './rsa-ad-strength-suggestion-repository';\r\nimport { ViewSuggestionType } from './ad-strength-helper';\r\n\r\nimport { viewSuggestionMeasurement,\r\n applySuggestionMeasurement,\r\n returnSuggestionMeasurement,\r\n isViewSuggestionApplied,\r\n containerExists } from './rsa-ad-strength-suggestion-helper';\r\n\r\nexport class AdStrengthSuggestionPicker extends React.Component {\r\n static defaultProps = {\r\n itemsToDisplay: [],\r\n container: $(document.body),\r\n };\r\n\r\n getDisplayPosition(target, container) {\r\n const $target = $(target);\r\n const targetOffset = $target.offset();\r\n const containerOffset = container.offset();\r\n\r\n // Calculate the position of the popup relative to the container.\r\n // The container needs to be non-statically positioned, either fixed, relative or absolute,\r\n // because the popup is position: absolute.\r\n return {\r\n top: (targetOffset.top - containerOffset.top) + $target.outerHeight(),\r\n left: targetOffset.left - containerOffset.left,\r\n };\r\n }\r\n\r\n addAssetSuggestion(event, target, description, suggestionId) {\r\n const { viewModel, pickerContainer } = this.props;\r\n if (!_.isEmpty(target)) {\r\n viewModel[target.name](description);\r\n if (!_.isEmpty(suggestionId)) {\r\n applySuggestionMeasurement(viewModel, suggestionId);\r\n }\r\n }\r\n event.stopPropagation();\r\n event.preventDefault();\r\n // Hide picker\r\n ReactDOM.unmountComponentAtNode(pickerContainer);\r\n }\r\n\r\n render() {\r\n const {\r\n container, i18n, target, itemsToDisplay, assetType,\r\n } = this.props;\r\n\r\n const position = this.getDisplayPosition(target, container);\r\n\r\n const containerStyle = {\r\n display: 'block', left: `${position.left}px`, top: `${position.top}px`, zIndex: 1001,\r\n };\r\n\r\n const pickerTitle = assetType === ViewSuggestionType.Headline ?\r\n i18n.getString('Ad_Strength_Suggestion_Picker_Title_Headline') :\r\n i18n.getString('Ad_Strength_Suggestion_Picker_Title_Description');\r\n\r\n let contentView = null;\r\n const contentClasses = ['picker-list'];\r\n contentView = itemsToDisplay.map(({ SuggestionId, Asset }, index) => (\r\n <li>\r\n <a\r\n role=\"menuitem\"\r\n arial-label={Asset}\r\n href=\"#\"\r\n onClick={event => this.addAssetSuggestion(event, target, Asset, SuggestionId)}\r\n key={SuggestionId}\r\n data-index={index}\r\n >\r\n { Asset ? <div className=\"type-normal\">{Asset}</div> : null}\r\n </a>\r\n </li>), this);\r\n\r\n // The title in picker needs a specific style.\r\n const pickerTitleStyle = { padding: '10px 10px 3px 10px', 'font-weight': 'bold' };\r\n return (\r\n <ul className={classnames('dropdown-menu', ...contentClasses)} role=\"menu\" style={containerStyle}>\r\n <li className=\"ad-strength-suggestion-picker-title\" style={pickerTitleStyle}>\r\n {pickerTitle}\r\n </li>\r\n {contentView}\r\n </ul>\r\n );\r\n }\r\n}\r\n\r\nAdStrengthSuggestionPicker.propTypes = {\r\n itemsToDisplay: PropTypes.arrayOf(PropTypes.shape({\r\n name: PropTypes.string,\r\n description: PropTypes.string,\r\n })),\r\n target: PropTypes.shape({}).isRequired,\r\n container: PropTypes.shape({ offset: PropTypes.func }),\r\n pickerContainer: PropTypes.objectOf(PropTypes.any).isRequired,\r\n viewModel: PropTypes.objectOf(PropTypes.any).isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n assetType: PropTypes.string.isRequired,\r\n};\r\n\r\nexport class AdStrengthSuggestionController {\r\n constructor({\r\n container,\r\n appState,\r\n token,\r\n odataPath,\r\n i18n,\r\n }) {\r\n this.container = container;\r\n this.appState = appState;\r\n this.token = token;\r\n this.odataPath = odataPath;\r\n this.i18n = i18n;\r\n this.cachedSuggestions = [];\r\n this.cachedAdGroupId = -1;\r\n this.cachedFinalUrl = null;\r\n }\r\n\r\n keydown(event) {\r\n switch (event.key) {\r\n case 'Escape':\r\n this.hidePicker();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n updateDisplayPosition(target) {\r\n const $target = $(target);\r\n const targetOffset = $target.offset();\r\n const containerOffset = this.container.offset();\r\n $('.dropdown-menu.picker-list').css('top', `${(targetOffset.top - containerOffset.top) + $target.outerHeight()}px`);\r\n }\r\n\r\n handelScroll(target) {\r\n const existingPickerContainer = $('.dropdown-menu.picker-list');\r\n const header = $('.sticky-header.table-bordered');\r\n const focused = $(':focus');\r\n if (containerExists(existingPickerContainer) && containerExists(header) && containerExists(focused)) {\r\n this.updateDisplayPosition(target);\r\n if (existingPickerContainer[0].getBoundingClientRect().top < header[0].getBoundingClientRect().bottom) {\r\n this.hidePicker();\r\n focused[0].blur();\r\n }\r\n }\r\n }\r\n\r\n registerGlobalEvents(target) {\r\n $('.recommend-ad-editor-panel').on('click', event => this.clickedAway(event));\r\n $('.recommendation-grid-page').on('scroll', () => this.handelScroll(target));\r\n $(target).on('keydown', event => this.keydown(event));\r\n }\r\n\r\n hidePicker() {\r\n const existingPickerContainer = $('.ad-strength-suggestion-container');\r\n if (containerExists(existingPickerContainer)) {\r\n ReactDOM.unmountComponentAtNode(_.first(existingPickerContainer));\r\n }\r\n $('.ad-strength-suggestion-container').remove();\r\n $('.recommend-ad-editor-panel').off('click');\r\n $('.recommendation-grid-page').off('scroll', this.handelScroll);\r\n $(this.target).off('keydown', this.keydown);\r\n }\r\n\r\n clickedAway(event) {\r\n const target = $(event.target);\r\n if (target.closest('.ad-strength-suggestion-helper-area').length === 0 &&\r\n target.closest('.ad-strength-suggestion-container').length === 0) {\r\n this.hidePicker();\r\n }\r\n }\r\n\r\n renderPicker(target, suggestions, viewModel, assetType) {\r\n const { container, i18n } = this;\r\n if (!containerExists($('.ad-strength-suggestion-container'))) {\r\n const containerToUse = $('<div class=\"ad-strength-suggestion-container open\"/>');\r\n containerToUse.appendTo(container);\r\n }\r\n const existingPickerContainer = $('.ad-strength-suggestion-container');\r\n if (!_.isEmpty(suggestions) && containerExists(existingPickerContainer)) {\r\n const pickerContainer = _.first(existingPickerContainer);\r\n // render latest picker\r\n ReactDOM.render(React.createElement(AdStrengthSuggestionPicker, {\r\n itemsToDisplay: suggestions,\r\n target,\r\n container,\r\n pickerContainer,\r\n viewModel,\r\n i18n,\r\n assetType,\r\n }), pickerContainer);\r\n this.registerGlobalEvents(target);\r\n } else {\r\n this.hidePicker();\r\n }\r\n }\r\n\r\n isSuggestionCached(adGroupId, finalUrl) {\r\n const {\r\n cachedAdGroupId, cachedFinalUrl,\r\n } = this;\r\n\r\n return (cachedAdGroupId !== -1 && !_.isEmpty(cachedFinalUrl)\r\n && cachedAdGroupId === adGroupId && finalUrl === cachedFinalUrl);\r\n }\r\n\r\n filterSuggestion(viewModel, assetType, input) {\r\n const viewSuggestionIds = [];\r\n const returnSuggestionIds = [];\r\n const filteredSuggestions = _.filter(this.cachedSuggestions, (suggestion) => {\r\n returnSuggestionIds.push(suggestion.SuggestionId);\r\n if (suggestion.AssetType.toLowerCase() !== assetType || _.isEmpty(suggestion.Asset)) {\r\n return false;\r\n }\r\n const suggestionContent = suggestion.Asset.toLowerCase();\r\n // If the input field is not empty, provide suggestions which start with the inputted text.\r\n if (!_.isEmpty(input) && !suggestionContent.startsWith(input.toLowerCase())) {\r\n return false;\r\n }\r\n\r\n const isViewSuggestionNotApplied =\r\n !isViewSuggestionApplied(viewModel, assetType, suggestionContent);\r\n\r\n if (isViewSuggestionNotApplied) {\r\n viewSuggestionIds.push(suggestion.SuggestionId);\r\n }\r\n return isViewSuggestionNotApplied;\r\n });\r\n viewSuggestionMeasurement(viewModel, viewSuggestionIds);\r\n returnSuggestionMeasurement(viewModel, returnSuggestionIds);\r\n return filteredSuggestions;\r\n }\r\n\r\n getAdStrengthSuggestion({\r\n assetType,\r\n target,\r\n input,\r\n viewModel,\r\n isInitPicker,\r\n }) {\r\n const {\r\n appState, token, odataPath,\r\n } = this;\r\n\r\n const repository = new AdStrengthSuggestionRepository({\r\n viewModel,\r\n appState,\r\n token,\r\n odataPath,\r\n });\r\n\r\n const { adGroupId } = viewModel.scope();\r\n const finalUrl = !_.isEmpty(viewModel.FinalUrls()) ?\r\n _.first(viewModel.FinalUrls()) : null;\r\n\r\n if (isInitPicker && !this.isSuggestionCached(viewModel.scope().adGroupId, finalUrl)) {\r\n // When ad group id or final url is changed, need to get suggestion from MT again.\r\n repository.fetchAdStrengthSuggestion().then(({ data }) => {\r\n this.cachedAdGroupId = adGroupId;\r\n this.cachedFinalUrl = finalUrl;\r\n this.cachedSuggestions = []; // clean up cached suggestions\r\n if (!_.isEmpty(data)) {\r\n const {\r\n ErrorCode,\r\n RSAV2AssetsSuggestions,\r\n } = data;\r\n if (ErrorCode === 'Success' && !_.isEmpty(RSAV2AssetsSuggestions)) {\r\n this.cachedSuggestions = _.first(RSAV2AssetsSuggestions).Suggestions;\r\n const filteredSuggestions\r\n = this.filterSuggestion(viewModel, assetType, input);\r\n this.renderPicker(target, filteredSuggestions, viewModel, assetType);\r\n }\r\n }\r\n });\r\n } else {\r\n const filteredSuggestions\r\n = this.filterSuggestion(viewModel, assetType, input);\r\n this.renderPicker(target, filteredSuggestions, viewModel, assetType);\r\n }\r\n }\r\n}\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport $ from 'jquery';\r\nimport _ from 'underscore';\r\nimport { ViewSuggestionType, maxHeadlineCount, maxDescriptionCount } from './ad-strength-helper';\r\nimport { AdStrengthSuggestionRepository } from './rsa-ad-strength-suggestion-repository';\r\nimport { updateAdStrengthSuggestion,\r\n containerExists,\r\n renderContainer,\r\n viewSuggestionMeasurement,\r\n applySuggestionMeasurement,\r\n returnSuggestionMeasurement,\r\n isViewSuggestionApplied,\r\n renderNoSuggestion } from './rsa-ad-strength-suggestion-helper';\r\n\r\nlet currentFinalUrl = '';\r\n\r\nconst TIPS_CATEGORIES = [\r\n { name: 'Product', numItems: 4 },\r\n { name: 'Benefits', numItems: 4 },\r\n { name: 'Brand', numItems: 4 },\r\n { name: 'Action', numItems: 4 },\r\n { name: 'Inventory', numItems: 4 },\r\n { name: 'Pricing', numItems: 4 },\r\n { name: 'Promotion', numItems: 4 },\r\n];\r\n\r\nconst manageVisiblity = (e, targetContainer, expandingIcon) => {\r\n const target = $(e.target);\r\n const detailContainer = target.parent().parent().find(targetContainer);\r\n const expendingContainer = target.parent().parent().find(expandingIcon);\r\n const isDetailSuggestionVisible = detailContainer.is(':visible');\r\n // Hide all tips items\r\n $(targetContainer).hide();\r\n // Change all expending icon to expander\r\n $(expandingIcon).removeClass('expandedImage');\r\n $(expandingIcon).addClass('expanderImage');\r\n\r\n if (isDetailSuggestionVisible) {\r\n detailContainer.hide();\r\n return false;\r\n }\r\n detailContainer.show();\r\n expendingContainer.removeClass('expanderImage');\r\n expendingContainer.addClass('expandedImage');\r\n return true;\r\n};\r\n\r\nconst viewHeadlineSuggestionTipCategoryItems = (category, i18n, e) => {\r\n manageVisiblity(e, '.ad-strength-suggestion-detail-tips-item-container', '.ad-strength-suggestion-detail-tips-expending');\r\n const target = $(e.target);\r\n const container = target.parent().parent().find('.ad-strength-suggestion-detail-tips-item-container');\r\n const items = _.map(_.range(1, category.numItems + 1), num => (\r\n <div className=\"ad-strength-suggestion-detail-tips-item\">{i18n.getString(`Ad_Strength_Suggestion_Tips_Category_${category.name}_Item${num}`)}</div>\r\n ));\r\n const itemsWithSubtitle = (\r\n <div>\r\n <div className=\"ad-strength-suggestion-detail-tips-subtitle\">{i18n.getString(`Ad_Strength_Suggestion_Tips_Category_${category.name}_Subtitle`)}</div>\r\n {items}\r\n </div>\r\n );\r\n renderContainer(itemsWithSubtitle, container);\r\n};\r\n\r\nconst viewHeadlineSuggestionTips = (i18n) => {\r\n const categoryItems = _.map(TIPS_CATEGORIES, category => (\r\n <div className=\"ad-strength-suggestion-detail-tips-category\">\r\n <span\r\n className=\"ad-strength-suggestion-detail-tips-title\"\r\n aria-label={i18n.getString(`Ad_Strength_Suggestion_Tips_Category_${category.name}_Title`)}\r\n role=\"button\"\r\n tabIndex=\"0\"\r\n onClick={e => viewHeadlineSuggestionTipCategoryItems(category, i18n, e)}\r\n onKeyPress={e => viewHeadlineSuggestionTipCategoryItems(category, i18n, e)}\r\n >\r\n <span className=\"ad-strength-suggestion-detail-tips-expending expanderImage\" />\r\n <div className=\"ad-strength-suggestion-detail-tips-category-title\">{i18n.getString(`Ad_Strength_Suggestion_Tips_Category_${category.name}_Title`)}</div>\r\n </span>\r\n <div className=\"ad-strength-suggestion-detail-tips-item-container\" />\r\n </div>\r\n ));\r\n const tips = (\r\n <div className=\"ad-strength-suggestion-detail-tips-container\">\r\n <div className=\"ad-strength-suggestion-detail-tips-header\">{i18n.getString('Ad_Strength_Suggestion_Tips_Header')}</div>\r\n <div className=\"ad-strength-suggestion-detail-tips-header-desc\">{i18n.getString('Ad_Strength_Suggestion_Tips_Header_Desc')}</div>\r\n {categoryItems}\r\n </div>\r\n );\r\n return tips;\r\n};\r\n\r\nconst addAssetSuggestion = (assetType, viewModel, e) => {\r\n let target = $(e.target);\r\n if (_.first(target).className === `ad-strength-suggestion-detail-suggestion-add-symbol ${assetType}`\r\n || _.first(target).className === `ad-strength-suggestion-detail-suggestion-content ${assetType}`) {\r\n target = target.parent();\r\n }\r\n if (_.first(target).className === `ad-strength-suggestion-detail-suggestion-disabled ${assetType}`) {\r\n return;\r\n }\r\n const content = _.first(target.find(`.ad-strength-suggestion-detail-suggestion-content.${assetType}`));\r\n if (_.isEmpty(content)) {\r\n return;\r\n }\r\n const suggestionId = _.first(target.find(`.ad-strength-suggestion-detail-suggestion-id.${assetType}`));\r\n if (!_.isEmpty(suggestionId)) {\r\n applySuggestionMeasurement(viewModel, suggestionId.textContent);\r\n }\r\n const suggestionToAdd = content.textContent;\r\n if (assetType === ViewSuggestionType.Headline) {\r\n const index = _.findIndex(_.range(viewModel.showHeadlineCount()), i =>\r\n _.isEmpty(`${viewModel[`Headline${i}`]()}`));\r\n if (index !== -1) {\r\n viewModel[`Headline${index}`](suggestionToAdd);\r\n } else if (viewModel.showHeadlineCount() < maxHeadlineCount) {\r\n viewModel.showHeadlineCount(viewModel.showHeadlineCount() + 1);\r\n viewModel[`Headline${viewModel.showHeadlineCount() - 1}`](suggestionToAdd);\r\n }\r\n } else if (assetType === ViewSuggestionType.Description) {\r\n const index = _.findIndex(_.range(viewModel.showDescriptionCount()), i =>\r\n _.isEmpty(`${viewModel[`Description${i}`]()}`));\r\n if (index !== -1) {\r\n viewModel[`Description${index}`](suggestionToAdd);\r\n } else if (viewModel.showDescriptionCount() < maxDescriptionCount) {\r\n viewModel.showDescriptionCount(viewModel.showDescriptionCount() + 1);\r\n viewModel[`Description${viewModel.showDescriptionCount() - 1}`](suggestionToAdd);\r\n }\r\n }\r\n};\r\n\r\n\r\nconst renderSuggestionContent = (\r\n container,\r\n content,\r\n repository,\r\n i18n,\r\n assetType,\r\n viewModel,\r\n isForVNext\r\n) => {\r\n // Show suggestion\r\n _.first(container).style.display = 'block';\r\n\r\n // Render suggestion static content in advance\r\n renderContainer(content, container);\r\n\r\n if (currentFinalUrl === _.first(viewModel.FinalUrls())) {\r\n return;\r\n }\r\n\r\n currentFinalUrl = _.first(viewModel.FinalUrls());\r\n\r\n // Get suggestion from AdInsight MT\r\n repository.fetchAdStrengthSuggestion().then(({ data }) => {\r\n currentFinalUrl = '';\r\n\r\n const suggestionContainers = container.find(`.ad-strength-suggestion-detail-suggestions-container.${assetType}`);\r\n const noSuggestionContainers = container.find(`.ad-strength-suggestion-detail-nosuggestion-container.${assetType}`);\r\n // Empty suggestions\r\n renderContainer([], suggestionContainers);\r\n\r\n if (!_.isEmpty(data)) {\r\n const {\r\n ErrorCode,\r\n RSAV2AssetsSuggestions,\r\n } = data;\r\n if (ErrorCode !== 'Success' || _.isEmpty(RSAV2AssetsSuggestions)) {\r\n renderNoSuggestion(noSuggestionContainers, i18n);\r\n } else {\r\n const allSuggestions = _.first(RSAV2AssetsSuggestions).Suggestions;\r\n const suggestions = _.filter(allSuggestions, suggestion =>\r\n suggestion.AssetType.toLowerCase() === assetType && !_.isEmpty(suggestion.Asset));\r\n const viewSuggestionIds = [];\r\n const returnSuggestionIds = [];\r\n const items = _.map(suggestions, (suggestion) => {\r\n returnSuggestionIds.push(suggestion.SuggestionId);\r\n const suggestionAssetType = suggestion.AssetType.toLowerCase();\r\n const suggestionClassName = `ad-strength-suggestion-detail-suggestion ${suggestionAssetType}`;\r\n const addSymbolClassName = `ad-strength-suggestion-detail-suggestion-add-symbol ${suggestionAssetType}`;\r\n const idClassName = `ad-strength-suggestion-detail-suggestion-id ${suggestionAssetType}`;\r\n const contentClassName = `ad-strength-suggestion-detail-suggestion-content ${suggestionAssetType}`;\r\n if (!isViewSuggestionApplied(viewModel, assetType, suggestion.Asset)) {\r\n viewSuggestionIds.push(suggestion.SuggestionId);\r\n }\r\n return (\r\n <div\r\n className={suggestionClassName}\r\n role=\"button\"\r\n tabIndex=\"0\"\r\n onClick={e => addAssetSuggestion(assetType, viewModel, e)}\r\n onKeyPress={e => addAssetSuggestion(assetType, viewModel, e)}\r\n >\r\n <div className={addSymbolClassName}>+</div>\r\n <div className={idClassName}>{suggestion.SuggestionId}</div>\r\n <div className={contentClassName}>{suggestion.Asset}</div>\r\n </div>);\r\n });\r\n\r\n viewSuggestionMeasurement(viewModel, viewSuggestionIds);\r\n returnSuggestionMeasurement(viewModel, returnSuggestionIds);\r\n if (!_.isEmpty(items) && containerExists(suggestionContainers)) {\r\n let suggestionContent = [];\r\n const header = (\r\n <div className=\"ad-strength-suggestion-detail-sub-title\">\r\n { assetType === ViewSuggestionType.Headline ?\r\n i18n.getString('Ad_Strength_Suggestion_HeadlineSuggestions_Subtitle') :\r\n i18n.getString('Ad_Strength_Suggestion_DescriptionSuggestions_Subtitle')\r\n }\r\n </div>);\r\n const noAvailableNewAssetContentClassName = `ad-strength-suggestion-detail-no-new-asset-content ${assetType}`;\r\n const noAvailableNewAssetContainerClassName = `alert alert-info form-group ad-strength-suggestion-detail-no-new-asset-container ${assetType}`;\r\n const noAvailableNewAsset = (\r\n <div className={noAvailableNewAssetContainerClassName}>\r\n <div className=\"alert-image\" />\r\n <div className={noAvailableNewAssetContentClassName} />\r\n </div>);\r\n suggestionContent.push(header);\r\n suggestionContent.push(noAvailableNewAsset);\r\n suggestionContent = suggestionContent.concat(items);\r\n renderContainer(suggestionContent, suggestionContainers);\r\n updateAdStrengthSuggestion(i18n, viewModel);\r\n } else {\r\n renderNoSuggestion(noSuggestionContainers, i18n);\r\n }\r\n }\r\n } else if (_.isEmpty(viewModel.FinalUrls())) {\r\n const warningIconClassName = isForVNext ?\r\n 'status-icon iconba iconba-Warning' :\r\n 'status_warning status ad-strength-suggestion-detail-warning';\r\n const warningIconStyle = isForVNext ?\r\n { paddingRight: '5px', color: 'red' } :\r\n { paddingRight: '5px' };\r\n const noFinalUrl = (\r\n <div>\r\n <span className={warningIconClassName} style={warningIconStyle} />\r\n {i18n.getString('Ad_Strength_Suggestion_NoSuggestion_Add_Final_URL')}\r\n </div>\r\n );\r\n // Add a final URL to see more recommendations.\r\n renderContainer(noFinalUrl, noSuggestionContainers);\r\n } else {\r\n renderNoSuggestion(noSuggestionContainers, i18n);\r\n }\r\n });\r\n};\r\n\r\nconst hideAdStrengthSuggestionContainer = () => {\r\n const container = $('.ad-strength-suggestions-detail');\r\n if (containerExists(container)) {\r\n _.first(container).style.display = 'none';\r\n }\r\n};\r\n\r\nexport const viewInlineSuggestion = (\r\n i18n,\r\n viewModel,\r\n repository,\r\n assetType,\r\n action,\r\n isForVNext\r\n) => {\r\n const suggestionContanerClassName = `ad-strength-suggestion-detail-suggestions-container ${assetType}`;\r\n const noSuggestionContainerClassName = `ad-strength-suggestion-detail-nosuggestion-container ${assetType}`;\r\n const currentActionClasName = 'ad-strength-suggestion-current-action';\r\n\r\n let combinedClickViewIdeas = viewModel.clickViewIdeas || [];\r\n combinedClickViewIdeas = combinedClickViewIdeas.concat([action]);\r\n // eslint-disable-next-line no-param-reassign\r\n viewModel.clickViewIdeas = _.uniq(combinedClickViewIdeas);\r\n\r\n let title = assetType === ViewSuggestionType.Headline ?\r\n i18n.getString('Ad_Strength_Suggestion_HeadlineSuggestions') :\r\n i18n.getString('Ad_Strength_Suggestion_DescriptionSuggestions');\r\n switch (action) {\r\n case 'LongerHeadlines':\r\n title = i18n.getString('Ad_Strength_Suggestion_HeadlineSuggestions_LongerHeadlines');\r\n break;\r\n case 'LongerDescriptions':\r\n title = i18n.getString('Ad_Strength_Suggestion_DescriptionSuggestions_LongerDescriptions');\r\n break;\r\n case 'DistinctHeadlines':\r\n title = i18n.getString('Ad_Strength_Suggestion_HeadlineSuggestions_DistinctHeadlines');\r\n break;\r\n case 'DistinctDescriptions':\r\n title = i18n.getString('Ad_Strength_Suggestion_DescriptionSuggestions_DistinctDescriptions');\r\n break;\r\n default:\r\n break;\r\n }\r\n const content = (\r\n <div>\r\n <span\r\n className=\"closeimage ad-strength-suggestions-detail-close-button\"\r\n role=\"button\"\r\n tabIndex=\"0\"\r\n aria-label={i18n.getString('Ad_Strength_Suggestion_Close')}\r\n onClick={() => hideAdStrengthSuggestionContainer()}\r\n onKeyPress={() => hideAdStrengthSuggestionContainer()}\r\n />\r\n <div className=\"ad-strength-suggestion-detail-title\">\r\n { title }\r\n </div>\r\n <div className={suggestionContanerClassName} />\r\n <div className={noSuggestionContainerClassName} />\r\n <div className={currentActionClasName} style={{ display: 'none' }}>{action}</div>\r\n { assetType === ViewSuggestionType.Headline ? viewHeadlineSuggestionTips(i18n) : null }\r\n </div>\r\n );\r\n const container = $('.ad-strength-suggestions-detail');\r\n if (containerExists(container)) {\r\n renderSuggestionContent(\r\n container,\r\n content,\r\n repository,\r\n i18n,\r\n assetType,\r\n viewModel,\r\n isForVNext\r\n );\r\n }\r\n};\r\n\r\nexport const AdStrengthSuggestion = ({\r\n i18n,\r\n inlineSuggestionsEnabled,\r\n suggestion,\r\n viewModel,\r\n appState,\r\n token,\r\n odataPath,\r\n isForVNext,\r\n}) => {\r\n const { action, suggestionType } = suggestion;\r\n const repository = new AdStrengthSuggestionRepository({\r\n viewModel,\r\n appState,\r\n token,\r\n odataPath,\r\n });\r\n\r\n if (!inlineSuggestionsEnabled || suggestionType === ViewSuggestionType.None) {\r\n return '';\r\n }\r\n\r\n return (\r\n <span\r\n className=\"ad-strength-suggestion-view\"\r\n role=\"button\"\r\n tabIndex=\"0\"\r\n aria-label={i18n.getString('Ad_Strength_Suggestion_ViewSuggestions_Label', { suggestion: suggestion.suggestion })}\r\n onClick={() =>\r\n viewInlineSuggestion(i18n, viewModel, repository, suggestionType, action, isForVNext)}\r\n onKeyPress={() =>\r\n viewInlineSuggestion(i18n, viewModel, repository, suggestionType, action, isForVNext)}\r\n >\r\n <span>{i18n.getString('Ad_Strength_Suggestion_ViewSuggestions')}</span>\r\n </span>\r\n );\r\n};\r\n\r\nAdStrengthSuggestion.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n inlineSuggestionsEnabled: PropTypes.bool.isRequired,\r\n suggestion: PropTypes.shape({\r\n suggestion: PropTypes.string.isRequired,\r\n suggestionType: PropTypes.string.isRequired,\r\n action: PropTypes.string.isRequired,\r\n }).isRequired,\r\n viewModel: PropTypes.objectOf(PropTypes.any).isRequired,\r\n appState: PropTypes.objectOf(PropTypes.any).isRequired,\r\n token: PropTypes.string.isRequired,\r\n odataPath: PropTypes.string.isRequired,\r\n isForVNext: PropTypes.bool.isRequired,\r\n};\r\n","/* eslint-disable no-param-reassign */\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport $ from 'jquery';\r\nimport _ from 'underscore';\r\nimport { ViewSuggestionType, maxHeadlineCount, maxDescriptionCount } from './ad-strength-helper';\r\nimport { AdStrengthSuggestionController } from './rsa-ad-strength-suggestion-picker';\r\nimport { AdStrengthSuggestionRepository } from './rsa-ad-strength-suggestion-repository';\r\nimport { viewInlineSuggestion } from './rsa-ad-strength-suggestion';\r\n\r\nlet controller;\r\n\r\nexport const containerExists = container => (!_.isEmpty(container) && container.length > 0);\r\n\r\nexport const renderContainer = (content, container) => {\r\n if (containerExists(container)) {\r\n ReactDOM.render(\r\n content,\r\n _.first(container)\r\n );\r\n }\r\n};\r\n\r\nexport const renderNoSuggestion = (container, i18n) => {\r\n const noSuggestion = (\r\n <div>\r\n {i18n.getString('Ad_Strength_Suggestion_NoSuggestion')}\r\n <span> </span>\r\n <a\r\n className=\"HelpTopic\"\r\n query=\"help:app54711\"\r\n href=\"#!\"\r\n aria-label={i18n.getString('Ad_Strength_Suggestion_NoSuggestion_Help')}\r\n >\r\n {i18n.getString('Ad_Strength_Suggestion_NoSuggestion_Help')}\r\n </a>\r\n </div>\r\n );\r\n renderContainer(noSuggestion, container);\r\n};\r\n\r\nconst renderUpdateSuggestion = (i18n, viewModel, assetType) => {\r\n let suggestions = $(`.ad-strength-suggestion-detail-suggestion.${assetType}`);\r\n if (!containerExists(suggestions)) {\r\n suggestions = $(`.ad-strength-suggestion-detail-suggestion-disabled.${assetType}`);\r\n }\r\n if (!containerExists(suggestions)) {\r\n return;\r\n }\r\n let hiddenSuggestionCount = 0;\r\n let viewModelShowCount = 0;\r\n let availableNewAsset = true;\r\n if (assetType === ViewSuggestionType.Headline) {\r\n viewModelShowCount = viewModel.showHeadlineCount();\r\n availableNewAsset = viewModelShowCount < maxHeadlineCount;\r\n } else if (assetType === ViewSuggestionType.Description) {\r\n viewModelShowCount = viewModel.showDescriptionCount();\r\n availableNewAsset = viewModelShowCount < maxDescriptionCount;\r\n } else {\r\n return;\r\n }\r\n const type = assetType === ViewSuggestionType.Headline ? 'Headline' : 'Description';\r\n _.each(suggestions, (suggestion) => {\r\n const content = suggestion.lastChild;\r\n if (!_.isEmpty(content)) {\r\n const suggestionContent = content.textContent.toLowerCase();\r\n const index = _.findIndex(_.range(viewModelShowCount), i =>\r\n suggestionContent === `${viewModel[`${type}${i}`]()}`.toLowerCase());\r\n if (index !== -1) {\r\n suggestion.style.display = 'none';\r\n hiddenSuggestionCount += 1;\r\n } else {\r\n suggestion.style.display = 'inline-block';\r\n }\r\n }\r\n });\r\n\r\n const noAvailableNewAssetContainer = $(`.ad-strength-suggestion-detail-no-new-asset-container.${assetType}`);\r\n\r\n const index = assetType === ViewSuggestionType.Headline ?\r\n _.findIndex(\r\n _.range(viewModel.showHeadlineCount()),\r\n i => _.isEmpty(`${viewModel[`Headline${i}`]()}`)\r\n ) :\r\n _.findIndex(\r\n _.range(viewModel.showDescriptionCount()),\r\n i => _.isEmpty(`${viewModel[`Description${i}`]()}`)\r\n );\r\n const hasEmptyAssetToAdd = index !== -1;\r\n\r\n if (!hasEmptyAssetToAdd && !availableNewAsset && hiddenSuggestionCount < suggestions.length) {\r\n const noAvailableNewAssetContent = assetType === ViewSuggestionType.Headline ?\r\n i18n.getString('Ad_Strength_Suggestion_NoSuggestion_Headline_Number_Limit') :\r\n i18n.getString('Ad_Strength_Suggestion_NoSuggestion_Description_Number_Limit');\r\n if (containerExists(noAvailableNewAssetContainer)) {\r\n _.first(noAvailableNewAssetContainer).style.display = 'flex';\r\n }\r\n const noAvailableNewAssetContentContainer = $(`.ad-strength-suggestion-detail-no-new-asset-content.${assetType}`);\r\n renderContainer(noAvailableNewAssetContent, noAvailableNewAssetContentContainer);\r\n\r\n // Disable all suggestions\r\n _.each(suggestions, (suggestion) => {\r\n suggestion.className = `ad-strength-suggestion-detail-suggestion-disabled ${assetType}`;\r\n });\r\n } else {\r\n if (containerExists(noAvailableNewAssetContainer)) {\r\n _.first(noAvailableNewAssetContainer).style.display = 'none';\r\n }\r\n\r\n // Enable all suggestions\r\n _.each(suggestions, (suggestion) => {\r\n suggestion.className = `ad-strength-suggestion-detail-suggestion ${assetType}`;\r\n });\r\n }\r\n\r\n // No recommendations available.\r\n const noSuggestionContainers = $(`.ad-strength-suggestion-detail-nosuggestion-container.${assetType}`);\r\n if (hiddenSuggestionCount === suggestions.length) {\r\n renderNoSuggestion(noSuggestionContainers, i18n);\r\n } else {\r\n renderContainer('', noSuggestionContainers);\r\n }\r\n};\r\n\r\nexport const updateAdStrengthSuggestion = (i18n, viewModel) => {\r\n const container = $('.ad-strength-suggestions-detail');\r\n if (containerExists(container)\r\n && _.first(container).style.display === 'block') {\r\n renderUpdateSuggestion(i18n, viewModel, ViewSuggestionType.Headline);\r\n renderUpdateSuggestion(i18n, viewModel, ViewSuggestionType.Description);\r\n }\r\n};\r\n\r\nexport const renewAdStrengthSuggestion = (options) => {\r\n const {\r\n i18n, viewModel, appState, token, odataPath, isForVNext,\r\n } = options;\r\n const container = $('.ad-strength-suggestions-detail');\r\n // Renew the suggestions when suggestion pannel is open\r\n if (containerExists(container)\r\n && _.first(container).style.display === 'block') {\r\n const headlineConatiner = container.find('.ad-strength-suggestion-detail-suggestions-container.headline');\r\n const descriptionConatiner = container.find('.ad-strength-suggestion-detail-suggestions-container.description');\r\n let suggestionType = null;\r\n if (containerExists(headlineConatiner)) {\r\n suggestionType = ViewSuggestionType.Headline;\r\n } else if (containerExists(descriptionConatiner)) {\r\n suggestionType = ViewSuggestionType.Description;\r\n }\r\n\r\n let action = null;\r\n const currentActionContainer = container.find('.ad-strength-suggestion-current-action');\r\n if (containerExists(currentActionContainer)) {\r\n action = _.first(currentActionContainer).textContent;\r\n }\r\n\r\n if (!_.isEmpty(suggestionType)) {\r\n const repository = new AdStrengthSuggestionRepository({\r\n viewModel,\r\n appState,\r\n token,\r\n odataPath,\r\n });\r\n viewInlineSuggestion(i18n, viewModel, repository, suggestionType, action, isForVNext);\r\n }\r\n }\r\n};\r\nexport const isViewSuggestionApplied = (viewModel, assetType, suggestionContent = '') => {\r\n let viewModelShowCount = 0;\r\n let type;\r\n if (assetType === ViewSuggestionType.Headline) {\r\n viewModelShowCount = viewModel.showHeadlineCount() > maxHeadlineCount ?\r\n maxHeadlineCount : viewModel.showHeadlineCount();\r\n type = 'Headline';\r\n } else if (assetType === ViewSuggestionType.Description) {\r\n viewModelShowCount = viewModel.showDescriptionCount() > maxDescriptionCount ?\r\n maxDescriptionCount : viewModel.showDescriptionCount();\r\n type = 'Description';\r\n }\r\n const index = _.findIndex(_.range(viewModelShowCount), i =>\r\n suggestionContent.toLowerCase() === `${viewModel[`${type}${i}`]()}`.toLowerCase());\r\n\r\n return (index !== -1);\r\n};\r\n\r\nexport const viewSuggestionMeasurement = (viewModel, viewSuggestionIds) => {\r\n let combinedViewSuggestionIds = viewModel.viewSuggestionIds || [];\r\n combinedViewSuggestionIds = combinedViewSuggestionIds.concat(viewSuggestionIds);\r\n viewModel.viewSuggestionIds = _.uniq(combinedViewSuggestionIds);\r\n};\r\n\r\nexport const applySuggestionMeasurement = (viewModel, suggestionId) => {\r\n const combinedApplySuggestionIds = viewModel.applySuggestionIds || [];\r\n combinedApplySuggestionIds.push(suggestionId);\r\n viewModel.applySuggestionIds = _.uniq(combinedApplySuggestionIds);\r\n};\r\n\r\nexport const returnSuggestionMeasurement = (viewModel, returnSuggestionIds) => {\r\n let combinedReturnSuggestionIds = viewModel.returnSuggestionIds || [];\r\n combinedReturnSuggestionIds = combinedReturnSuggestionIds.concat(returnSuggestionIds);\r\n viewModel.returnSuggestionIds = _.uniq(combinedReturnSuggestionIds);\r\n};\r\n\r\n/*\r\n * Attaches focus, input event listeners to ad text fields\r\n */\r\nexport const attachAdStrengthSuggestionHelpers = ({\r\n element,\r\n viewModel,\r\n appState,\r\n token,\r\n odataPath,\r\n assetType,\r\n i18n,\r\n}) => {\r\n // add the class so that click in the input will not trigger picker to be hidden\r\n element.addClass('ad-strength-suggestion-helper-area');\r\n\r\n element.on('input keyup focus', (event) => {\r\n const { type, target, key } = event;\r\n\r\n const {\r\n selectionStart, selectionEnd,\r\n } = target;\r\n // Ignore if any text is selected, we are only interested in the cursor\r\n if (selectionStart !== selectionEnd) {\r\n return;\r\n }\r\n\r\n // Ignore escape key up since it shouldn't prompt any helper\r\n if (type === 'keyup' && key === 'Escape') {\r\n return;\r\n }\r\n\r\n if (_.isEmpty(controller)) {\r\n controller = new AdStrengthSuggestionController({\r\n container: $(document.body),\r\n appState,\r\n token,\r\n odataPath,\r\n i18n,\r\n });\r\n }\r\n\r\n controller.getAdStrengthSuggestion({\r\n assetType,\r\n target,\r\n input: target.value,\r\n viewModel,\r\n isInitPicker: type === 'focus',\r\n });\r\n });\r\n};\r\n","/* eslint-disable jsx-a11y/label-has-for */\r\nimport _ from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport React from 'react';\r\nimport { HelpPopup } from '@bingads-webui-react/help-popup';\r\nimport { AdStrengthScore } from './ad-strength-score';\r\nimport { AdStrengthRepository } from './ad-strength-repository';\r\nimport { generateSuggestion, sortSuggestions } from './ad-strength-helper';\r\nimport { updateAdStrengthSuggestion, renewAdStrengthSuggestion } from './rsa-ad-strength-suggestion-helper';\r\n\r\nexport class AdStrengthView extends React.Component {\r\n static propTypes = {\r\n className: PropTypes.string,\r\n adId: PropTypes.number.isRequired,\r\n edm: PropTypes.objectOf(PropTypes.any).isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n jsdata: PropTypes.objectOf(PropTypes.any).isRequired,\r\n viewModel: PropTypes.objectOf(PropTypes.any).isRequired,\r\n isForVNext: PropTypes.bool,\r\n inlineSuggestionsEnabled: PropTypes.bool,\r\n };\r\n\r\n static defaultProps = {\r\n className: 'responsive-search-ad-strength-view',\r\n isForVNext: false,\r\n inlineSuggestionsEnabled: false,\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {};\r\n this.subscriptions = {};\r\n this.repository = new AdStrengthRepository({\r\n adId: props.adId,\r\n edm: props.edm,\r\n jsdata: props.jsdata,\r\n });\r\n }\r\n\r\n componentDidMount() {\r\n this.fetchData();\r\n\r\n const lazyFetchData = _.debounce(() => this.fetchData(), 1000);\r\n\r\n _.each(_.range(15), (i) => {\r\n this.subscriptions[`Headline${i}`] = this.props.viewModel[`Headline${i}`].subscribe(() => {\r\n lazyFetchData();\r\n });\r\n this.subscriptions[`Headline${i}Position`] = this.props.viewModel[`Headline${i}Position`].subscribe(() => {\r\n lazyFetchData();\r\n });\r\n });\r\n _.each(_.range(4), (i) => {\r\n this.subscriptions[`Description${i}`] = this.props.viewModel[`Description${i}`].subscribe(() => {\r\n lazyFetchData();\r\n });\r\n this.subscriptions[`Description${i}Position`] = this.props.viewModel[`Description${i}Position`].subscribe(() => {\r\n lazyFetchData();\r\n });\r\n });\r\n if (this.props.inlineSuggestionsEnabled) {\r\n this.props.viewModel.FinalUrls.extend({\r\n rateLimit: 1000,\r\n });\r\n this.subscriptions.FinalUrls = this.props.viewModel.FinalUrls.subscribe(() => {\r\n renewAdStrengthSuggestion(_.pick(this.props, 'i18n', 'viewModel', 'appState', 'token', 'odataPath', 'isForVNext'));\r\n });\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n _.each(this.subscriptions, subscription => subscription.dispose());\r\n this.subscriptions = {};\r\n }\r\n\r\n fetchData() {\r\n if (!_.isNull(this.props.edm.currentAccount) || !_.isNull(this.props.viewModel.accountId)) {\r\n this.repository.fetchAdStrength(this.props.viewModel)\r\n .then((response) => {\r\n this.parseAdStrengthActionItems(response);\r\n });\r\n }\r\n }\r\n\r\n parseAdStrengthActionItems(response) {\r\n const {\r\n i18n,\r\n viewModel,\r\n } = this.props;\r\n const {\r\n Strength,\r\n ActionItems,\r\n } = response;\r\n\r\n const assets = {\r\n headlines: _.filter(_.map(_.range(15), i => _.result(viewModel, `Headline${i}`)), i => _.size(i) > 0),\r\n descriptions: _.filter(_.map(_.range(4), i => _.result(viewModel, `Description${i}`)), i => _.size(i) > 0),\r\n headlinePins: _.filter(_.range(15), i => _.result(viewModel, `Headline${i}Position`) !== 'None'),\r\n descriptionPins: _.filter(_.range(4), i => _.result(viewModel, `Description${i}Position`) !== 'None'),\r\n };\r\n const suggestions = _.map(ActionItems, item => generateSuggestion({\r\n i18n,\r\n assets,\r\n actionItem: item,\r\n strength: Strength,\r\n }));\r\n const sortedSuggestions = sortSuggestions(suggestions);\r\n\r\n this.setState({\r\n label: i18n.getString(`Ad_Strength_Score_${Strength}`),\r\n strength: Strength,\r\n suggestions: sortedSuggestions.slice(0, 4),\r\n });\r\n\r\n if (this.props.inlineSuggestionsEnabled) {\r\n // Update the corresponding suggestions when all ad strengthes are updated\r\n updateAdStrengthSuggestion(i18n, viewModel);\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n <div className={this.props.className}>\r\n <div>\r\n <label>\r\n {this.props.i18n.getString('Ad_Strength_Title')}\r\n <HelpPopup\r\n aria-label={this.props.i18n.getString('Click to learn more about {{item}}', {\r\n item: this.props.i18n.getString('Ad_Strength_Title'),\r\n })}\r\n topic=\"pop_BA_RSA_AdStrength\"\r\n />\r\n </label>\r\n </div>\r\n <div className=\"ad-strength-content\">\r\n <AdStrengthScore\r\n isForVNext={this.props.isForVNext}\r\n label={this.state.label}\r\n strength={this.state.strength}\r\n />\r\n <div className=\"ad-strength-suggestions\">\r\n <ul className=\"ad-strength-actions\">\r\n {_.map(this.state.suggestions, suggestion => (\r\n <li>\r\n <span className={`ad-strength-action-${suggestion.state}`} />\r\n {suggestion.suggestion}\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n </div>\r\n <div className=\"ad-strength-suggestions-detail\" />\r\n </div>\r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { DeterministicView } from '@bingads-webui/deterministic-view';\r\nimport { AdStrengthView } from './ad-strength-view';\r\n\r\nexport class ResponsiveSearchAdStrengthView extends DeterministicView {\r\n initialize({\r\n adId,\r\n edm,\r\n i18n,\r\n jsdata,\r\n scope,\r\n viewModel,\r\n isForVNext,\r\n inlineSuggestionsEnabled,\r\n appState,\r\n token,\r\n odataPath,\r\n }) {\r\n super.initialize();\r\n\r\n this.viewRef = React.createRef();\r\n this.view = (\r\n <AdStrengthView\r\n ref={this.viewRef}\r\n adId={adId}\r\n edm={edm}\r\n i18n={i18n}\r\n jsdata={jsdata}\r\n scope={scope}\r\n viewModel={viewModel}\r\n isForVNext={isForVNext}\r\n inlineSuggestionsEnabled={inlineSuggestionsEnabled}\r\n appState={appState}\r\n token={token}\r\n odataPath={odataPath}\r\n />\r\n );\r\n }\r\n\r\n setState(state) {\r\n if (this.viewRef.current) {\r\n this.viewRef.current.setState(state);\r\n }\r\n return this;\r\n }\r\n\r\n renderTrunk() {\r\n ReactDOM.render(this.view, this.el);\r\n return this;\r\n }\r\n\r\n remove() {\r\n ReactDOM.unmountComponentAtNode(this.el);\r\n return super.remove();\r\n }\r\n}\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport $ from 'jquery';\r\nimport _ from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport { containerExists } from './rsa-ad-strength-suggestion-helper';\r\n\r\nexport class AIGenAssetContextualAttribute extends React.Component {\r\n static defaultProps = {\r\n container: $(document.body),\r\n improveMMAOption: {},\r\n newI18n: {\r\n getString: _.noop,\r\n },\r\n };\r\n\r\n getDisplayPosition(target, container) {\r\n const $target = $(target);\r\n const targetOffset = $target.offset();\r\n const containerOffset = container.offset();\r\n\r\n return {\r\n top: (targetOffset.top - containerOffset.top) - ($target.outerHeight() - 35),\r\n left: targetOffset.left - containerOffset.left - 103,\r\n };\r\n }\r\n\r\n render() {\r\n const {\r\n container, i18n, target, isAIGeneratedAsset, improveMMAOption, newI18n,\r\n } = this.props;\r\n\r\n const position = this.getDisplayPosition(target, container);\r\n\r\n const containerStyle = {\r\n display: 'block',\r\n left: `${position.left}px`,\r\n top: `${position.top}px`,\r\n width: '220px',\r\n };\r\n\r\n let content = i18n.getString('Ad_Strength_Improve_RSA_Contextual_Content');\r\n\r\n if (improveMMAOption && improveMMAOption.type) {\r\n if (improveMMAOption.type === 'Text') {\r\n content = newI18n.getString(_TL_('We\\'ve made these recommendations based on text generated from your websites.'));\r\n } else if (improveMMAOption.type === 'Image') {\r\n content = newI18n.getString(_TL_('Our recommendations are based on the images generated from your websites.'));\r\n }\r\n } else if (isAIGeneratedAsset) {\r\n content = i18n.getString('Ad_Strength_RSA_AI_Generated_Asset_Contextual_Content');\r\n }\r\n\r\n return (\r\n <div id=\"contextual-attribute\" role=\"tooltip\" className=\"fade in bingads-webui-react-callout-popover popover bottom\" style={containerStyle}>\r\n <div className=\"arrow\" />\r\n <div className=\"popover-content\">\r\n <div className=\"ba-backbone-instance-wrapper\">\r\n <div>\r\n <div className=\"popover-paged-content__body\">\r\n <div className=\"popover-content\">\r\n <div className=\"contextual-tooltip-container\">\r\n <div className=\"contextual-content\">\r\n <span className=\"line-height-normal\">{content}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"popover-paged-content__pager\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nAIGenAssetContextualAttribute.propTypes = {\r\n target: PropTypes.shape({}).isRequired,\r\n container: PropTypes.shape({ offset: PropTypes.func }),\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n isAIGeneratedAsset: PropTypes.bool.isRequired,\r\n improveMMAOption: PropTypes.shape({\r\n type: PropTypes.string,\r\n }),\r\n newI18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }),\r\n};\r\n\r\n/*\r\n * Attaches event listeners to on the light bulb icon to show contextual attribute\r\n */\r\nexport const attachAIGenAssetContextualAttribute = ({\r\n element,\r\n i18n,\r\n isAIGeneratedAsset,\r\n improveMMAOption,\r\n newI18n,\r\n}) => {\r\n if (!containerExists($('.rsa-ai-generated-asset-container'))) {\r\n const aiGendAssetCAContainer = $('<div class=\"rsa-ai-generated-asset-container\"/>');\r\n aiGendAssetCAContainer.appendTo($(document.body));\r\n }\r\n\r\n element.on('mouseenter mouseout keydown', (event) => {\r\n const { key, target, type } = event;\r\n const existingContextualAttributeContainer = $('.rsa-ai-generated-asset-container');\r\n if (containerExists(existingContextualAttributeContainer)) {\r\n if (type === 'mouseenter' || (type === 'keydown' && key === 'Enter')) {\r\n // Hide previous contextual attribute pop-up\r\n ReactDOM.unmountComponentAtNode(_.first(existingContextualAttributeContainer));\r\n\r\n // Show current contextual attribute pop-up\r\n const contextualAttributeContainer = _.first(existingContextualAttributeContainer);\r\n ReactDOM.render(React.createElement(AIGenAssetContextualAttribute, {\r\n target,\r\n i18n,\r\n isAIGeneratedAsset,\r\n improveMMAOption,\r\n newI18n,\r\n }), contextualAttributeContainer);\r\n } else if (type === 'mouseout') {\r\n // Hide current contextual attribute pop-up\r\n ReactDOM.unmountComponentAtNode(_.first(existingContextualAttributeContainer));\r\n }\r\n }\r\n });\r\n};\r\n"],"names":["ReportingProps","i18n","PropTypes","formatDate","isRequired","formatPercent","getCurrencySymbol","getString","isReady","parseDate","parseDecimal","instrumentationSchema","scenario","name","value","activity","reactRouterLocation","pathname","search","hash","reactRouterMatch","params","path","url","isExact","reactRouterHistory","go","goBack","push","instrumentation","reportList","reportsTree","children","reports","isValidCreateReportId","isValidCategoryId","reportDescription","what","why","reportDefinition","apiKey","description","logger","mark","trace","error","identityDetails","user","Id","Name","ParentCustomerId","customer","lcid","updateId","permissions","reportSchema","repository","getDetailsByExecutionId","servicesEndpoints","CampaignAPI","ClientCenterUIAPI","Token","customizedUIBlockerStyle","backgroundColor","display","alignItems","getImageExtensionsPaneStyle","_","_ref","palette","_ref$iconFontFamily","iconFontFamily","border","panelFooter","background","bottom","position","marginLeft","cropPanel","height","overflowY","marginBottom","color","float","concat","white","neutralSecondaryAlt","borderRadius","boxSizing","fontWeight","margin","themePrimary","content","fontFamily","marginRight","_objectSpread","width","minWidth","multiImageInnerCarouselStyles","overflow","fontSize","lineHeight","paddingTop","textAlign","padding","extend","floatButtonStyle","floatButton","neutralSecondary","marginTop","borderColor","borderWidth","outline","paddingLeft","container","paddingBottom","borderTop","borderBottom","addIcon","top","themeSecondary","listContainer","alertBanner","labelContainer","overrideImageRecommendationClasses","panelHeading","panelTitle","flexGrow","seeAll","maxWidth","DescriptionView","localizedText","selectedImgExtensionsForAssociation","limit","className","_TL_","_jsx","defaultProps","getThumbnailServiceUrl","bingUrl","w","h","baseUrl","Url","URL","urlParams","URLSearchParams","Object","keys","forEach","key","set","toString","getUriWithParam","c","IMAGE_WIDTH_PX","getImageExtensionItemThumbnailUrl","item","itemImage","Images","image","Asset","SubType","ImageUrl","getImageExtensionListStyles","justifyContent","cellWidth","cellHeight","flexWrap","gap","getImageExtensionItemStyles","components","_ref2","itemContainer","cursor","pointerEvents","opacity","borderStyle","left","right","imageExtensionItem","zIndex","btnItem","textItem","textDecoration","selectRadio","imageContainer","boxShadow","deleteButton","itemZIndex","themeDarkAlt","editButton","noImageFallbackContainer","justifyItems","neutralLighter","ImageExtensionItemPreview","onDelete","onSelect","onEditImage","enableEdit","index","classes","useDefaultStyles","_useState","useState","_useState2","_slicedToArray","hovered","setHovered","toggleHoverState","imageUrl","disabledToggleToolTip","_jsxs","ConditionalTooltipHost","condition","disabled","calloutProps","gapSpace","classnames","selected","onMouseEnter","undefined","onMouseLeave","onClick","role","id","tabIndex","onKeyDown","submitEvent","Image","src","alt","AltText","xmlns","viewBox","d","type","checked","onChange","Glyphicon","e","stopPropagation","glyph","iconStyle","ImageExtensionItemSeeMoreLess","onSelectShowAll","seeMoreItemsCount","seeLess","text","imageExtensionContainer","FontIcon","iconName","ImageExtensionsList","items","imageContainerWidth","setImageContainerWidth","imageContainerNode","useRef","_useState3","_useState4","showAll","setShowAll","itemsSize","initialItemCount","Math","floor","hasSeeMoreLess","useEffect","handleResize","current","offsetWidth","window","addEventListener","removeEventListener","measuredRef","useCallback","node","CELL_TYPE","ref","FocusZone","List","onRenderCell","cellType","getCellType","renderCount","getItemCountForPage","getDialogImageExtensionStyle","reactUIBlockerStyle","FieldType","FieldLimit","fieldsConfig","labelKeyForLocalization","helpTopic","required","validators","validate","val","trim","msg","runValidators","i","_validators$i","validateField","fieldType","fieldValue","callback","errors","fieldConfig","field","CreateImageExtensionDialog","createImageExtension","selectedImage","onCreateSuccess","onCancel","adCreatorScenario","isImageAltTextPrefillEnabled","dialogContentProps","title","loading","setLoading","fieldValues","setFieldValues","_useState5","_useState6","fieldErrors","setFieldErrors","_useState7","_useState8","disableCreate","setDisableCreate","logActivity","useMemo","createActivity","logTrace","apply","arguments","onCreateButtonClicked","validateAllFields","Promise","finally","then","JSON","stringify","onFieldChangeFactory","newValue","_defineProperty","onCancelClick","onDismiss","prefillAltText","imageName","Dialog","hidden","modalProps","isBlocking","topOffsetFixed","isClickableOutsideFocusTrap","UiBlocker","blocking","loadingText","Stack","tokens","childrenGap","map","placeholder","TextField","label","onRenderLabel","props","originalRenderer","Fragment","HelpPopupInline","topic","ariaLabel","errorMessage","DialogFooter","PrimaryButton","DefaultButton","DeleteImageExtensionDialog","deleteImageExtension","selectedImageDelete","onDeleteSuccess","getImagesFromImageList","imageList","imageObj","IdString","constants","aspectRatios","Type","associationType","CropX","CropSettings","SourceX","CropY","SourceY","CropHeight","SourceHeight","CropWidth","SourceWidth","Src","isImageExtensionCommitedToServer","getImageSuggestionPanelStyles","panel","panelHeader","paddingRight","alignSelf","backButton","theme","buttonContainer","ImageRecommendationsPanel","images","themes","onSelectImage","loadNextPage","hasMore","activeImages","setActiveImages","activeTheme","setActiveTheme","themeNames","_toConsumableArray","onSwitchTheme","rawImages","chain","filter","first","result","img","onClickCancel","onRenderHeader","IconButton","iconProps","onRenderFooterContent","horizontal","Item","onSelectImageInternal","_activeImages$index","fullUrl","suggestionId","Panel","isOpen","isFooterAtBottom","PanelType","custom","customWidth","styles","panelStylesProp","FluentProvider","webLightTheme","CopilotTab","active","onActiveChange","CopilotTabItem","tabKey","FluentImagePicker","pageSize","loadMoreImages","hasMoreImages","imageCellWidth","imageCellHeight","imageSources","ImageExtensionsPaneView","onImgExtensionSelected","advertiserCustomerId","accountId","updateImageExtension","legacyI18n","dataModelUtil","imagePath","maxImageExtensionsPerAdGroup","perfMarker","preferenceService","oDataConfig","suggestionState","dispatchSuggestionState","suggestionPoller","urlPrefix","onUpdateUrlPrefix","onUpdateUrlValue","dateFormat","timeZone","activityLogger","isAADUser","assetLibraryEventHandler","serverContext","createChild","addImageChildPerfmarker","_useImagePicker","useImagePicker","displayImagePicker","setDisplayImagePicker","displayWebsiteSuggestionTab","selectedMediaPanelSource","setSelectedMediaPanelSource","displayCreateImageExtView","setDisplayCreateImageExtView","displayDeleteImageExtView","setDisplayDeleteImageExtView","setSelectedImage","_useState9","_useState10","setSelectedImageDelete","_useState11","_useState12","selectedImageEligibleLayouts","setSelectedImageEligibleLayouts","_useState13","_useState14","selectedImageEdit","setSelectedImageEdit","_useState15","_useState16","selectedImageEditIndex","setSelectedImageEditIndex","_useState17","_useState18","showEditPanel","setShowEditPanel","emptyFinalUrl","reachLimit","size","_getAdCreatorInstrume","getAdCreatorInstrumentation","websiteSuggestionCarouselActivity","editImageActivity","closeEditImageView","closeCreateImageExtView","closeDeleteImageExtView","isAllUploadFlowImageUpscaleEnabled","_useAssetLibraryImage","useAssetLibraryImagePicker","cid","aid","onNewImageSelected","imagePlacements","source","imagePickerError","setImagePickerError","clearImagePickerError","uploadImage","processUploadedImage","onProcessUploadComplete","minSize","minUploadSize","supportImageUpscale","addImageByUrl","getStockImages","onSelectStockImage","onImageSelected","onImagesSelected","socialMediaDataSource","customMediaSourceConfig","_suggestionState$sugg","suggestion","_suggestionState$caro","carousel","_ref4","dynamic","RSAImageExtensionCrop","RSAImageRecommendationReplace","_useContext","useContext","RecommendationContext","recommendationContext","_useState19","_useState20","imagesToSuggest","setImagesToSuggest","_useState21","_useState22","carouselErrorMessage","setCarouselErrorMessage","_useState23","_useState24","isSuggestionsPanelOpen","setIsSuggestionsPanelOpen","imageAssets","copilotTracking","_useMemo","carouselState","isError","panelState","panelImages","_ref5","suggestionFromCopilot","carouselFromCopilot","_ref6","suggestionImages","suggestionInProgress","inProgress","truncatedImages","slice","messageInfo","message","isLoading","isEmpty","length","MessageBarType","trackSelectedImageAssets","ImageAssets","imageId","processedImage","idString","reject","WebsiteCarousel","SuggestionStatus","SelectSuggestionError","SelectSuggestionComplete","selectedIndex","onClose","panelClassName","ExtensionImagesControl","genericImage","isForVNext","isStockPhotoEnabled","newI18n","preferencesService","onImageListChanged","eligibleLayouts","Alert","level","icon","dismissible","Label","align","getImageListFromMTImagesAsync","EligibleLayout","onRenderIcon","ImageSuggestionCarousel","onSelectSeeAll","isCollapsible","selectable","hideData","enablePolicyMessage","showViewAllInHeader","stylingOverrides","classOverrides","seeAllLinkText","allowToggleSelectable","getMoreImageSuggestions","AddImageCrudAdComponent","setIsOpen","newOpen","maxUploadNum","imageExperienceProps","finalUrl","finalUrlProtocol","onUpdateFinalUrl","onUpdateFinalUrlPrefix","isMultimediaAd","imageOption","defaultImageOption","managedViewSelectionState","updateManagedViewSelectionState","stockImageConfig","socialImageConfig","assetLibraryConfig","onImageAddError","imageType","eventHandler","noop","decorateUIState","computeNewItemsMtModels","model","ImageExtensionsPaneContainerBase","imageExtRepository","adContext","hasErrorInUrl","headlines","descriptions","onImageExtensionChanged","onPreviewImageChanged","cachedImageExtensionChanges","rest","_objectWithoutProperties","_excluded","_useWebsiteSuggestion","useWebsiteSuggestion","added","removed","updated","changes","setChanges","association","findAll","where","adGroupId","campaignId","query","$orderby","data","prev","imageExtensionForPreview","previewImage","previewUrl","extensionData","DisplayText","Scheduling","createImageExtensionMtModel","itemState","isItemAssociated","newCurrent","cloneDeep","newUpdateItem","ImageExtensionsPaneContainer","React","withPreference","pathLengthLimitErrorMessages","AD_TYPE_RSA","adsFields","adsFieldAlias","adsFieldLengthLimitMap","FinalUrls","Path1","Path2","DisplayUrl","MobileFinalUrls","Headlines","LongHeadlines","Descriptions","TrackingUrlTemplate","FinalUrlSuffix","UrlCustomParametersKey","UrlCustomParametersValue","notI18n","validateTextFieldValue","lengthLimit","optional","adType","getCharCountExcludingAdCustomizers","validateTextField","fieldName","validatePath","values","Property","Message","ErrorContext","Error","property","onFirstErrorHandler","alertRef","filteredErrors","Index","Code","withError","WrappedComponent","join","contentStyles","contentContainerStackToken","urlFieldStackToken","pathFieldStackToken","actionStackToken","errorStackToken","textFieldStyles","charCountDescription","root","dynamicLinkContainer","dynamicLink","selectors","inputClassName","containerStyles","minHeight","input","preview","contentContainer","overflowX","urlPath","flexFlow","wordBreak","stickyAdPreviewStyles","DynamicTextExtention","onTextFieldChange","cachedValue","showContextualMenu","setShowContextualMenu","target","setTarget","linkRef","onShowContextualMenu","preventDefault","onHideContextualMenu","menuItems","Link","componentRef","ContextualMenu","onItemClick","BaseTextField","configProps","updateItem","adsFieldId","allowNewLines","showCharRemaining","showErrorMessage","isForVnext","assets","updateSuggestionMeasurement","showDynamicTextExtention","onBlur","llmAssetsSuggestions","containerSelector","enableDKI","DKIThemeName","setCachedValue","restProps","charLimit","charRemaining","setCharRemaining","inputRef","debouncedUpdateItem","event","textValue","populatedWithFullValue","replace","dynamicErrorMessage","focus","onBlurCheck","document","activeElement","onRenderDescription","horizontalAlign","style","useAdCustomizers","updateAction","useAdStrengthSuggestion","assetType","autoComplete","component","_textElement","validateOnLoad","gapCompensation","campaignWebsite","isAutoAdsEnabled","Path1Field","Path2Field","DisplayUrlField","UrlPath","config","IsVanityUrlEnabled","_value","urlDomain","getDomain","onTextChange","verticalAlign","partial","isString","urlPrefixOptions","UrlInput","UrlTextField","getUrlPrefixAndDestination","_useMemo2","urlWithoutPrefix","setKey","onUrlPrefixChanged","newItem","getUpdatedFullUrlOnPrefixUpdate","getUpdatedFullUrlOnTextUpdate","Dropdown","options","selectedKey","dropdownLabel","grow","RSAPreviewGroupType","AdPlacementKeys","previewLayoutConfig","groupsDefinitions","groupType","placementFilterPredicate","tmp","ResponsiveSearchAdPreviewUAPLUnstyled","_ref$data","disclaimerInfo","headline","setHeadline","setDescription","urlPath1","setUrlPath1","urlPath2","setUrlPath2","contains","displayUrl","GroupsPreviewer","useGroupsPreviewerLayout","headerButtonProps","onEdit","onAddAspectRatio","onRemoveAspectRatio","evaluateAdCustomizers","getTitlePreview","evaluatedText","getDescPreview","LineText","adData","longHeadline","decoratorsData","disclaimer","imageExtension","enableCrop","adPreviewContainer","ResponsiveSearchAdPreviewUAPL","withDefaultStyles","formatRSAObject","adItem","adObject","Text","AssetType","PinnedField","UrlCustomParameters","Key","Campaign","AdGroup","formatRankingTexts","assetValues","textArr","formatAssetRankingTexts","PinButton","getPinItems","pinnedPosition","pinItems","selectedText","find","onMenuItemClick","onMenuClick","pickerContainer","querySelector","ReactDOM","CommandButton","menuIconProps","menuProps","registerIcons","icons","pinIcon","textAssetsStyles","newPositionDeleteButton","newDeleteButton","newPositionPinButton","newPinButton","pinButton","textAssetsStackToken","TextAssetFields","Headline","Description","deleteIcon","recommendationAssetTypeMap","recommendationAssetTypePluralMap","getStyles","copilotButton","TextAssets","showDeleteButton","showCopilotButton","finalUrlWithoutPrefix","existingAssets","onSuggestionsRendered","isNewTextAssetsButtonStyle","copilotButtonLabel","defaultSize","deleteButtonLabel","inputLabel","itemProperty","maxSize","_recommendationContex","postAssetEventLog","_useEventLog","useEventLog","logTextAssetMenuOpen","logTextAssetDialogOpen","logRefineTextAsset","logTextAssetApplied","logRemoveSingleAsset","logEditSingleAsset","cachedAssets","setCachedAssets","filledAssets","onAddAsset","newAssets","deletedAsset","pluralAssetType","isInRemainingInitialSuggestions","removeInitialSuggestion","recommendationId","get","asset","compact","onTextBlur","onPinChange","onDeleteAsset","splice","isPinningEnabled","TextAsset","itemClassName","CopilotDKIRecommendation","classNames","CopilotTextAssetRecommendation","currentIndex","disableReason","EMPTY_ASSET_HINTS","NO_FINAL_URL_HINT","menuButtonAriaLabel","onMenuOpen","onOperationDialogOpen","onFetch","newAsset","operationName","ActionButton","allowDisabledFocus","addLabel","Disclaimer","showAdvancedInformation","SearchCampaignCreationRevamp","DisclaimerLayout","headlinesConfig","errorMap","lessThanRequired","duplicate","lessPosition","descriptionsConfig","adFieldsConfig","assetsConfig","DestinationUrl","MobileUrl","ResponsiveSearchAdCopilotBannerWithDialog","eventLog","isCopilotEnabled","onApply","onDialogFetchAssetsSucceeded","onFetchFailed","onFetchSucceeded","onReset","logBannerRefresh","logBannerRefreshCompleted","logFetch","logFetchSucceeded","showCopilotDialog","setShowCopilotDialog","handleCopilotDialogClose","handleRefresh","handleFetchThemesSucceeded","themesList","handleApply","selectedThemes","selectedThemesAndAssets","CopilotRecommendationBanner","isToastEnabled","onRefresh","onBannerRefreshCompleted","shouldFetchRecommendations","CopilotThemesRecommendationDialog","onClosed","onFetchAssetsSucceeded","open","adsFieldsToValidate","optionalFields","requiredCompoundFields","textAssets","fieldMappings","fieldDependencies","validateTrackingUrlTemplate","validateFinalUrlSuffix","validateUrlCustomParameters","useStyles","makeStyles","ResponsiveSearchAdEditorBase","onSave","onChanged","onFetchAdStrengthV2","onFetchDisclaimerInfo","showActionBar","showInitialErrors","AdPreviewComponent","token","triggerTestUurl","showUurlTestTool","showFinalUrlSuffix","showAdCustomizers","edmCampaign","jsDataCampaign","renderImageExtension","injectSetPreviewImage","scope","editMode","saveLogAppliedSuggestionsFunc","saveAssetLibraryEventHandler","isSaving","isCanceling","InstrumentationContext","initializeAdCustomizer","deps","cachedAd","setCachedAd","cachedValuesForImageSuggestions","setCachedValuesForImageSuggestions","clientErrors","formErrors","setFormErrors","errorContextValue","finalUrlPrefix","finalUrlForRecommendation","urlField","getId","mobileUrlField","pathField","displayUrlField","isInExclusionList","setIsInExclusionList","setDisclaimerInfo","hasDisclaimer","setHasDisclaimer","setPreviewImage","setLLMAssetsSuggestions","activeKeys","setActiveKeys","shortHeadlines","singleItem","_useContext2","setRecommendationContext","_useCopilotRecommenda","useCopilotRecommendations","entityId","logRecommendationsAPIError","resetRecommendations","_useCopilotForRespons","setIsCopilotEnabled","sendCopilotBannerNotification","useBannerService","send","isCopilotRegionRestricted","feature","isRestricted","useCopilotForResponsiveSearchAd","useAssetLibraryEventHandler","logEnterFlow","logBannerGenerated","logFetchAssetsSucceeded","logApplyThemes","logSuggestionsViewed","logSuggestionsApplied","logRefineTextAssetSucceeded","logPrefillAssets","logPrefillAssetsApplied","logPrefilledAdStrength","logRemoveAssets","_useCopilotRecommenda2","useCopilotRecommendationSurvey","AssetEventFeature","RSA","triggerSurveyOnSubmit","triggerSurveyOnCancel","isPrefilled","setIsPrefilled","shouldLogPrefilledAdStrength","setShouldLogPrefilledAdStrength","applyHeadlinesCallback","setApplyHeadlinesCallback","_useState25","_useState26","applyDescriptionsCallback","setApplyDescriptionsCallback","logPrefilledAdStrengthCallback","adStrength","initialSuggestionsData","_getCopilotRecommenda","getCopilotRecommendationIdsFromThemes","descriptionRecommendationIds","headlineRecommendationIds","AdStrengthTestingNoPrefill","newThems","DKITheme","normalThemes","newHeadlines","getUniqueAssetsFromThemes","trackInitialSuggestions","AssetPropertyName","HEADLINE","newDescriptions","DESCRIPTION","displayedDescriptions","MAX_INLINE_RECOMMENDATIONS_PER_PAGE","displayedHeadlines","displayedTextAssets","viewedTextSuggestionIds","getUntrackedViewedSuggestionIds","trackViewedSuggestionIds","_ref2$suggestedAdExte","suggestedAdExtensions","logCopilotRecommendations","assetGroup","ImageList","ext","isEditing","handleCopilotBannerFetchSucceeded","assetsResponse","IsCustomerIdInExclusionList","trackReturnedTextAssets","RecommendedAssets","formattedThemesAndAssets","Themes","getFormattedThemeForApplying","getFormattedImage","onApplyCopilotRecommendation","handleFetchAssetsSucceeded","assetsRecommendationData","handleTextAssetSuggestionsRendered","textSuggestions","textSuggestionIds","formatRecommendationsToLLMSuggestions","formatToLLMSuggestion","onValidate","newErrors","errorFields","activeField","shouldValidateAllFields","f","dependantField","aliasField","incomplete","adField","isOptional","hasError","maxLength","_getUrlPrefixAndDesti","destination","validateAdUrl","displayUrlError","availableAssets","a","unpinnedSize","validateTextAssets","_newErrors","errorList","isCompoundFieldRequired","isFieldEmpty","onClearTextAssets","validatedItem","reduce","acc","removeAllInitialSuggestions","onUpdateItemByKey","prevCachedAd","updatedData","onDebouncedUpdateItemByKey","onItemBlurBykey","fieldToUpdate","_computeRankingTextsU","currentAssets","prevAssetsRankingTexts","rankingTexts","needUpdate","computeRankingTextsUpdates","evt","newPrefix","onUpdateFinalUrlValue","onSaveClicked","onCancelClicked","copilotSuggestions","disclaimerData","setClarityTag","RSANewCopilotUI","Provider","PermissionsContext","errorProperties","renderCardError","properties","renderCardTitle","helpId","TextTitle","titleKey","iconAltText","topicKey","as","headingClassName","CopilotRepositoryProvider","locale","getLocale","recommendationType","Collapse","UrlIcon","htmlFor","TextIcon","HeadlineAssetCollection","DescriptionAssetCollection","ImageIcon","DisclaimerIcon","UrlOptionsParameters","trackingUrlTemplate","finalUrlSuffix","urlCustomParameters","renderLeftColumnWithNewCopilotUI","AdStrengthTestingNoPanel","ResponsiveSearchAdStrength","onFetchAdStrength","logAdStrength","urlOptionsElement","ResponsiveSearchAdEditor","withActivityContext","withBannerService","withRecommendationContext","Adapter","AdapterFactory","convertEventToValue","functionToInject","validatedTextField","withValidation","ValidatedTextFieldWithErrors","withControlErrorHandling","withUnvalidatedControlErrors","getTextInputContainerStyles","TextInputContainer","TextFieldWithAdCustomizerInternal","validationProps","newValidationProps","validator","newData","ValidatedTextFieldWithAdCustomizer","getTextAssetRecommendationsStyles","textAssetRecommendationsContent","textAssetRecommendationsPanel","useInlineCopilotUIStyles","header","summary","TextAssetRecommendationsWithThemesPanel","_ref3","collection","availableRecommendations","maxCollectionSize","topicAriaLabel","disabledSuggestionTooltip","reportDisplayedRecommendations","recommendations","itemText","pluck","flatten","deriveSuggestedItems","allSuggestedItems","setAllSuggestedItems","suggestedItems","setSuggestedItems","selectedItemsCount","emptyFieldsCount","negate","remaningItemsCount","isFunction","onSuggestedItemToggle","itemIndex","isSelected","onSaveClick","HelpButton","count","closeButtonAriaLabel","onOuterClick","medium","focusTrapZoneProps","disableFirstFocus","SuggestedItemsMultiSelect","disableAllUnselectedSuggestions","keyIsEmpty","InlineRecommendations","singleAssetValidationPropsField","inlineRecommendationsHelpTopicKey","inlineRecommendationsHelpTopicAriaLabel","inlineRecommendationsTitle","inlineRecommendationsDisabledItemTooltip","applyRecommendation","applyRecommendations","flattenedAvailableRecommendations","uniq","_useCircularBufferVie","page","setPage","setCurrentIndex","newPage","useCircularBufferView","flattenedAvailableDKIRecommendations","flattenedAvailableNoDKIRecommendations","_useCircularBufferVie2","availableInlineRecommendations","canMoveNext","moveNext","firstAvailableKey","findKey","prevAvailbleKeyWasDefined","setPrevAvailbleKeyWasDefined","shouldForceCloseCollapse","setShouldForceCloseCollapse","firstAvailableKeyIsDefined","onAddSuggestedItem","onAddAllSuggestedItems","onMoreSuggestionsButtonClick","onCancelAddingMultipleRecommendations","onAddMultipleRecommendations","_Fragment","Separator","SuggestionSectionCollapse","RecommendationsSectionIcon","suggestedSectionTitle","showSuggestionsSectionShimmer","showMoreSuggestionsInlineButton","onMoreSuggestionsInlineButtonClick","showAddAllSuggestionsButton","addAllSuggestionsButtonText","showMoreSuggestionsButton","moreSuggestionsButtonText","disableAllSuggestions","useStyleFluent2","forceClose","allRecommendations","DKIThemeDefaultName","rsaCollectionConfig","validationPropsField","minCollectionSize","getTextAssetCollectionConfig","collectionName","unlocalizedArgs","getEmptyRecommendationsContext","SuggestionsTracker","_createClass","_classCallCheck","this","trackingData","suggestions","suggestionsReport","allTextSuggestions","view","returned","RecommendationContextProvider","finalUrls","tracking","CopilotSuggestionsTracker","updateRecommendationContext","delta","currentContext","reportRecommendations","recommendationsReport","add","HoC","displayName","getDisplayName","hoistNonReactStatics","ActivityContext","useLogRecommendationsApiError","AdsCopilot","create","Permissions","DynamicPermissions","isRegionRestricted","setIsRegionRestricted","usePostAssetEvent","shouldLog","channel","AssetChannel","WEB_UI","AssetScenario","EDIT_WORK_FLOW","CREATE_WORK_FLOW","assetGroupId","newFinalUrl","recommendationFieldMap","assetCountMap","TextAssetCollectionWithRecommendations","withInlineRecommendations","setApplyTextAssetCallback","currentCollection","currentCollectionAsset","currentCollectionAssetText","viewedCopilotSuggestions","setViewedCopilotSuggestions","logCopilotSuggestions","suggestionIds","suggestionsToLog","EventName","POST_ASSET_EVENT_NAME","EventValue","TEXT","SuggestionIds","RecordType","AssetEventRecordType","VIEWED","recommendationsField","collectionRecommendations","availableCollectionRecommendations","DKItheme","recommendation","flattenedCollectionRecommendations","recommendationsMap","SuggestionId","RecommendationId","object","getSuggestionIds","displayedRecommendations","displayedRecommendationsIds","addAssetSuggestion","applySuggestionIds","collectionData","isAbleToAddSuggestion","addAllAssetSuggestion","texts","newViewedCopilotSuggestions","ThemeProvider","ComponentSettings","core","ThemeFluent","I18nContext","headlineConfig","getCollectionAsset","getAvailableRecommendations","llmSuggestions","Perspectives","SuggestionLanguage","Suggestions","SummaryReason","currentCollectionHeadlines","currentCollectionDescriptions","_llmSuggestions$Sugge","Perspective","headlineSuggestions","Reason","SrcId","descriptionSuggestions","PitchingPoint","Order","SuggestionState","StrengthScore","Poor","Average","Good","Excellent","ViewSuggestionType","getStrengthScore","strength","AdStrengthScore","_ref$isForVNext","score","chart","plotBackgroundColor","plotBorderWidth","plotShadow","colors","credits","enabled","plotOptions","pie","allowPointSelect","dataLabels","endAngle","startAngle","series","animation","innerSize","showInLegend","states","hover","inactive","tooltip","$","y","HighchartReactWrapper","getAssets","pinPosition","AdStrengthRepository","adId","edm","jsdata","viewModel","currentAccount","entitySet","Ads","$call","ad","toJSON","currentCustomer","Accounts","$withKey","Ad","cacheResponse","formatUrl","odataPath","appState","AdStrengthSuggestionRepository","requestBody","option","contentType","headers","authorization","stringifySync","resolve","rawData","AdStrengthSuggestionPicker","_React$Component","_callSuper","_inherits","$target","targetOffset","offset","containerOffset","outerHeight","_this$props","applySuggestionMeasurement","contentView","_this","_this$props2","itemsToDisplay","getDisplayPosition","containerStyle","pickerTitle","href","body","currentFinalUrl","TIPS_CATEGORIES","numItems","viewHeadlineSuggestionTipCategoryItems","category","targetContainer","expandingIcon","detailContainer","parent","expendingContainer","isDetailSuggestionVisible","is","hide","removeClass","addClass","show","manageVisiblity","num","itemsWithSubtitle","renderContainer","viewHeadlineSuggestionTips","categoryItems","onKeyPress","textContent","suggestionToAdd","showHeadlineCount","showDescriptionCount","hideAdStrengthSuggestionContainer","containerExists","viewInlineSuggestion","action","suggestionContanerClassName","noSuggestionContainerClassName","combinedClickViewIdeas","clickViewIdeas","fetchAdStrengthSuggestion","suggestionContainers","noSuggestionContainers","warningIconClassName","warningIconStyle","noFinalUrl","renderNoSuggestion","ErrorCode","RSAV2AssetsSuggestions","allSuggestions","toLowerCase","viewSuggestionIds","returnSuggestionIds","suggestionAssetType","suggestionClassName","addSymbolClassName","idClassName","contentClassName","isViewSuggestionApplied","viewSuggestionMeasurement","returnSuggestionMeasurement","suggestionContent","noAvailableNewAssetContentClassName","noAvailableNewAssetContainerClassName","noAvailableNewAsset","updateAdStrengthSuggestion","renderSuggestionContent","noSuggestion","renderUpdateSuggestion","hiddenSuggestionCount","viewModelShowCount","availableNewAsset","lastChild","noAvailableNewAssetContainer","noAvailableNewAssetContent","noAvailableNewAssetContentContainer","combinedViewSuggestionIds","combinedApplySuggestionIds","combinedReturnSuggestionIds","AdStrengthView","state","subscriptions","_this2","fetchData","lazyFetchData","subscribe","inlineSuggestionsEnabled","rateLimit","headlineConatiner","descriptionConatiner","suggestionType","currentActionContainer","renewAdStrengthSuggestion","subscription","dispose","_this3","fetchAdStrength","response","parseAdStrengthActionItems","Strength","ActionItems","headlinePins","descriptionPins","actionItem","headlineCount","descriptionCount","pinCount","generateSuggestion","sortedSuggestions","sortSuggestions","setState","HelpPopup","ResponsiveSearchAdStrengthView","_DeterministicView","_superPropGet","viewRef","el","DeterministicView","AIGenAssetContextualAttribute","isAIGeneratedAsset","improveMMAOption","attachAIGenAssetContextualAttribute","element","appendTo","on","existingContextualAttributeContainer","contextualAttributeContainer"],"sourceRoot":""}