{"version":3,"file":"static/js/application.async.landing~5a7900f6.92bab582.chunk.js","mappings":"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","sources":["../../../node_modules/@bingads-webui-grid/campaign-data-source/src/index.js","../../../node_modules/@bingads-webui-grid/campaignui-common-columns/src/strings.js","../../../node_modules/@bingads-webui-grid/campaignui-common-columns/src/shared.js","../../../node_modules/@bingads-webui-grid/campaignui-common-columns/src/fluctuation-columns.js","../../../node_modules/@bingads-webui-grid/campaignui-common-columns/src/performance-columns.js","../../../node_modules/@bingads-webui-grid/campaignui-common-columns/src/conversion-columns.js","../../../node_modules/@bingads-webui-grid/campaignui-common-columns/src/competitive-columns.js","../../../node_modules/@bingads-webui-grid/campaignui-common-columns/src/attribute-columns/status-icon-column.js","../../../node_modules/@bingads-webui-grid/perf-marker-middleware/src/perf-marker-middleware.js","../../../node_modules/@bingads-webui-grid/well-known/well-known-type/column.ts","../../../node_modules/@bingads-webui-grid/well-known/well-known-type/project-grid-plugin-column-chooser.ts","../../../node_modules/@bingads-webui-grid/well-known/well-known-data/columns/index.ts","../../../node_modules/@bingads-webui-grid/well-known/well-known-data/aggregated-rows/index.ts","../../../node_modules/@bingads-webui-grid/well-known/well-known-helper/columnFormatter.ts","../../../node_modules/@bingads-webui-grid/well-known/well-known-helper/CSharpPort/UriHelper.cs.ts","../../../node_modules/@bingads-webui-grid/well-known/well-known-helper/CSharpPort/Uri.cs.ts","../../../node_modules/@bingads-webui-grid/well-known/well-known-helper/validator/DestinationUrlValidator.ts","../../../node_modules/@bingads-webui-grid/well-known/tree-view/treeViewHelper.ts","../../../node_modules/@bingads-webui-grid/well-known/tree-view/TreeViewSelectionZone.tsx","../../../node_modules/@bingads-webui-grid/well-known/tree-view/useTreeViewSelection.tsx","../../../node_modules/@bingads-webui-grid/well-known/tree-view/ListViewSelectionZone.tsx"],"sourcesContent":["import { useEffect, useContext, useRef } from 'react';\r\nimport _ from 'underscore';\r\nimport { GridContext } from '@bingads-webui-grid/grid-context';\r\n\r\nasync function defaultMakeCall(state, edm, odataParams) {\r\n const {\r\n pagination, editableFilter, sortedColumn, selectedColumns,\r\n } = state;\r\n const $select = _.compact(_.union(['Id'], selectedColumns.map(column => column.fieldName)));\r\n const $expand = _.compact(_.flatten(selectedColumns.map(column => column.expandProperties)));\r\n const sortKey = sortedColumn.sortKey || sortedColumn.fieldName;\r\n const query = {\r\n count: true,\r\n top: pagination.pageSize || 20,\r\n skip: ((pagination.pageNumber - 1) * pagination.pageSize) || 0,\r\n filter: { where: editableFilter },\r\n select: _.union($select, $expand),\r\n orderby: sortKey ? { [sortKey]: sortedColumn.isSortedDescending ? -1 : 1 } : undefined,\r\n };\r\n const parmas = {\r\n ...odataParams,\r\n query: {\r\n ...query,\r\n ...odataParams.query,\r\n },\r\n };\r\n const response = await edm.$makeCall(parmas).toPromise();\r\n return response;\r\n}\r\n\r\nexport async function defaultMakeCollectionGetCall(state, edm, odataParams) {\r\n const {\r\n pagination, editableFilter, sortedColumn,\r\n } = state;\r\n const sortKey = sortedColumn.sortKey || sortedColumn.fieldName;\r\n const query = {\r\n count: true,\r\n top: pagination.pageSize || 20,\r\n skip: ((pagination.pageNumber - 1) * pagination.pageSize) || 0,\r\n filter: { where: editableFilter },\r\n orderby: sortKey ? { [sortKey]: sortedColumn.isSortedDescending ? -1 : 1 } : undefined,\r\n ...odataParams,\r\n };\r\n const response = await edm.get(query).toPromise();\r\n return response;\r\n}\r\n\r\nexport const useCampaignGridDataSource = ({\r\n edm,\r\n makeCall = defaultMakeCall,\r\n odataParams = {},\r\n beforeCall = () => {},\r\n afterCall = () => {},\r\n onError = () => {},\r\n formatResponse = response => ({\r\n items: response.value,\r\n totalCount: response['@odata.count'],\r\n // We pass raw response to generate additional property like aggregatedItems in reducers, and keep logic outside reducers clean.\r\n response,\r\n }),\r\n shouldMakeCall = () => true,\r\n}) => {\r\n const { state, dispatch } = useContext(GridContext);\r\n const apiIdForRereshGridData = useRef(0); // This is used for make sure render data of latest api call\r\n\r\n const {\r\n selectedColumns, sortedColumn, editableFilter, pagination, dataRefreshId,\r\n } = state;\r\n\r\n useEffect(() => {\r\n async function fetchData() {\r\n dispatch({ type: 'START_LOAD_DATA' });\r\n try {\r\n apiIdForRereshGridData.current += 1;\r\n const requestId = apiIdForRereshGridData.current;\r\n await beforeCall(state);\r\n const response = await makeCall(state, edm, odataParams);\r\n if (response && response.value) {\r\n if (requestId === apiIdForRereshGridData.current) {\r\n dispatch({ type: 'FINISH_LOAD_DATA', payload: formatResponse(response) });\r\n }\r\n } else {\r\n onError(response);\r\n dispatch({ type: 'FINISH_LOAD_DATA', payload: { items: [], totalCount: 0 } });\r\n }\r\n } catch (error) {\r\n dispatch({ type: 'FINISH_LOAD_DATA', payload: { items: [], totalCount: 0 } });\r\n onError(error);\r\n } finally {\r\n afterCall(state);\r\n }\r\n }\r\n\r\n if (selectedColumns && selectedColumns.length > 0 && shouldMakeCall(state)) {\r\n fetchData();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [selectedColumns, sortedColumn, editableFilter, pagination, dataRefreshId]);\r\n};\r\n","export const columnNames = {\r\n AbsoluteTopImpressionRate: _TL_('Abs. top impr. rate'),\r\n AbsoluteTopImpressionShareLostToBudget: _TL_('Abs. top IS lost to budget'),\r\n AbsoluteTopImpressionShareLostToRank: _TL_('Abs. top IS lost to rank'),\r\n AbsoluteTopImpressionSharePercent: _TL_('Abs. top impr. share'),\r\n AdvertiserReportedRevenue: _TL_('Revenue'),\r\n AllConversionAdvertiserReportedRevenue: _TL_('All conv. revenue'),\r\n AllConversionCPA: _TL_('All conv. CPA'),\r\n AllConversionRate: _TL_('All conv. rate'),\r\n AllConversionRevenueOnAdSpend: _TL_('All conv. return on ad spend'),\r\n AllConversions: _TL_('All conv.'),\r\n AllConversionsCredit: _TL_('All conv.'),\r\n AllPartialConversionCPA: _TL_('All conv. CPA'),\r\n AllPartialConversionRate: _TL_('All conv. rate'),\r\n AuctionLostToAdQualityPercent: _TL_('IS lost to expected CTR'),\r\n AuctionLostToBidPercent: _TL_('IS lost to bid'),\r\n AuctionLostToBudgetPercent: _TL_('IS lost to budget'),\r\n AuctionLostToLandingPercent: _TL_('IS lost to ad relevance'),\r\n AuctionLostToRankPercent: _TL_('IS lost to rank'),\r\n AuctionWonPercent: _TL_('Impr. share (IS)'),\r\n AudienceImpressionShare: _TL_('Audience impr. share'),\r\n AudienceImpressionShareLostToBudget: _TL_('Audience is lost to budget'),\r\n AudienceImpressionShareLostToRank: _TL_('Audience is lost to rank'),\r\n AverageCPC: _TL_('Avg. CPC'),\r\n AverageCPM: _TL_('Avg. CPM'),\r\n AverageCPS: _TL_('Avg. CPS'),\r\n AverageCPV: _TL_('Avg. CPV'),\r\n AveragePosition: _TL_('Avg. pos.'),\r\n AverageWatchTimePerImpression: _TL_('Avg. watch time per impr.'),\r\n AverageWatchTimePerVideoView: _TL_('Avg. watch time per video view'),\r\n CPA: _TL_('CPA'),\r\n CTR: _TL_('CTR'),\r\n ClickAndPhoneSpend: _TL_('Total spend'),\r\n ClickSharePercent: _TL_('Click share'),\r\n Clicks: _TL_('Clicks'),\r\n CompletedVideoViews: _TL_('Completed video views'),\r\n ConversionRate: _TL_('Conv. rate'),\r\n Conversions: _TL_('Conv.'),\r\n ConversionsCredit: _TL_('Conv.'),\r\n CostPerDownload: _TL_('Cost per download'),\r\n CostPerFirstLaunch: _TL_('CPI'),\r\n CostPerPurchase: _TL_('Cost per purchase'),\r\n CostPerSubscription: _TL_('Cost per subscription'),\r\n Downloads: _TL_('Downloads'),\r\n EligibleImpressions: _TL_('Eligible impr.'),\r\n ExactMatchImpressionSharePercent: _TL_('Exact match impr. share'),\r\n FirstLaunches: _TL_('Installs'),\r\n ImpressionShare: _TL_('Impression share'),\r\n Impressions: _TL_('Impr.'),\r\n ManualCalls: _TL_('Manual calls'),\r\n MissedImpressions: _TL_('Missed impr.'),\r\n MissedImpressionsInsufficientBid: _TL_('Missed impr. insufficient bid'),\r\n MissedImpressionsNoBid: _TL_('Missed impr. no bid'),\r\n MissedImpressionsNoTax: _TL_('Missed impr. no tax'),\r\n MissedImpressionsOther: _TL_('Missed impr. other'),\r\n MissedImpressionsSpendingCapReached: _TL_('Missed impr. spending cap reached'),\r\n PTR: _TL_('PTR'),\r\n PartialConversionCPA: _TL_('CPA'),\r\n PartialConversionRate: _TL_('Conv. rate'),\r\n PhoneImpressions: _TL_('Phone impr.'),\r\n PostClickDownloadRate: _TL_('Post-click download rate'),\r\n PostClickFirstLaunchRate: _TL_('Post-click install rate'),\r\n PostInstallPurchaseRate: _TL_('Post-install purchase rate'),\r\n PostInstallSubscriptionRate: _TL_('Post-install subscription rate'),\r\n Purchases: _TL_('Purchases'),\r\n RelativeCTR: _TL_('Relative CTR'),\r\n ReturnOnAdSpend: _TL_('Return on ad spend'),\r\n RevenueOnAdSpend: _TL_('Return on ad spend'),\r\n SalesCount: _TL_('Sales Count'),\r\n Spend: _TL_('Spend'),\r\n Subscriptions: _TL_('Subscriptions'),\r\n TopImpressionRate: _TL_('Top impr. rate'),\r\n TopImpressionShareLostToBudget: _TL_('Top IS lost to budget'),\r\n TopImpressionShareLostToRank: _TL_('Top IS lost to rank'),\r\n TopImpressionSharePercent: _TL_('Top impr. share'),\r\n TotalWatchTimeInMS: _TL_('Total watch time'),\r\n VideoCompletionRate: _TL_('Video completion rate'),\r\n VideoViews: _TL_('Video views'),\r\n VideoViewsAt25Percent: _TL_('Video views at 25%'),\r\n VideoViewsAt50Percent: _TL_('Video views at 50%'),\r\n VideoViewsAt75Percent: _TL_('Video views at 75%'),\r\n ViewThroughConversions: _TL_('View-through conv.'),\r\n ViewThroughConversionsCPA: _TL_('View-through conv. CPA'),\r\n ViewThroughConversionsCredit: _TL_('View-through conv.'),\r\n ViewThroughConversionsRate: _TL_('View-through conv. rate'),\r\n ViewThroughConversionsReturnOnAdSpend: _TL_('View-through conv. return on ad spend'),\r\n ViewThroughConversionsRevenue: _TL_('View-through conv. revenue'),\r\n ViewThroughPartialConversionsCPA: _TL_('View-through conv. CPA'),\r\n ViewThroughPartialConversionsRate: _TL_('View-through conv. rate'),\r\n ViewThroughRate: _TL_('View through rate'),\r\n NetRevenue: _TL_('Net revenue'),\r\n};\r\n\r\nexport const callTrackingStatusEnums = {\r\n NotApplicable: _TL_('Not applicable'),\r\n Eligible: _TL_('Eligible'),\r\n NotEligible: _TL_('Pending / ineligible'),\r\n ProvisioningPending: _TL_('Provisioning pending'),\r\n Provisioned: _TL_('Provisioned'),\r\n};\r\n\r\nexport const bidStrategies = {\r\n InheritFromParent: _TL_('Inherit from parent'),\r\n MaxClicks: _TL_('Auto: Max Clicks'),\r\n MaxConversions: _TL_('Auto: Max Conversions'),\r\n TargetCpa: _TL_('Auto: Target CPA'),\r\n TargetRoas: _TL_('Auto: Target ROAS'),\r\n EnhancedCpc: _TL_('Enhanced CPC'),\r\n MaxConversionValue: _TL_('Auto: Maximize Conversion Value'),\r\n TargetImpressionShare: _TL_('Auto: Target Impression Share'),\r\n ManualCpa: _TL_('Manual CPA'),\r\n ManualCpc: _TL_('Manual CPC'),\r\n ManualCpv: _TL_('Manual CPV'),\r\n ManualCpm: _TL_('Manual CPM'),\r\n Commission: _TL_('Commission'),\r\n PercentCpc: _TL_('Percent CPC'),\r\n CostPerSale: _TL_('Auto: Cost Per Sale'),\r\n ViewableCpm: _TL_('CPM for maximizing reach'),\r\n Cpcv: _TL_('CPCV'),\r\n};\r\n\r\nexport const bidStrategyTypes = {\r\n Commission: _TL_('Commission'),\r\n CostPerSale: _TL_('Auto: Cost Per Sale'),\r\n EnhancedCpc: _TL_('Enhanced CPC'),\r\n EnhancedCPC: _TL_('Enhanced CPC'),\r\n InheritFromParent: _TL_('Inherit from parent'),\r\n Manual: _TL_('Manual'),\r\n ManualCpa: _TL_('Manual CPA'),\r\n ManualCPA: _TL_('Manual CPA'),\r\n ManualCpc: _TL_('Manual CPC'),\r\n ManualCpi: _TL_('Manual CPI'),\r\n ManualCpm: _TL_('Manual CPM'),\r\n ManualCPM: _TL_('Manual CPM'),\r\n ManualCpv: _TL_('Manual CPV'),\r\n ManualCPV: _TL_('Manual CPV'),\r\n MaxClicks: _TL_('Auto: Max Clicks'),\r\n MaxConversions: _TL_('Auto: Max Conversions'),\r\n MaxConversionValue: _TL_('Auto: Maximize Conversion Value'),\r\n MaxImpressions: _TL_('Auto: Maximize Impressions'),\r\n MaxReach: _TL_('Auto: Maximize Reach'),\r\n MaxRoas: _TL_('Auto: Maximize ROAS'),\r\n MaximizeClicks: _TL_('Auto: Max Clicks'),\r\n MaximizeConversions: _TL_('Auto: Max Conversions'),\r\n PercentCpc: _TL_('Percent CPC'),\r\n TargetCpa: _TL_('Auto: Target CPA'),\r\n TargetCPA: _TL_('Auto: Target CPA'),\r\n TargetImpressionShare: _TL_('Auto: Target Impression Share'),\r\n TargetRoas: _TL_('Auto: Target ROAS'),\r\n UsePortfolioBidStrategyType: _TL_('Use portfolio bid strategy type'),\r\n};\r\n","import _ from 'underscore';\r\nimport React from 'react';\r\nimport { mergeStyles } from '@fluentui/react';\r\nimport { HelpIcon } from '@bingads-webui-campaign-react/help';\r\n\r\nexport const formatFuncs = {\r\n integer: i18n => _.compose(\r\n i18n.decimalToIntegerFormatter(),\r\n Number\r\n ),\r\n percentage: () => _.compose(\r\n v => `${v.toFixed(2)}%`,\r\n Number\r\n ),\r\n decimal: i18n => _.compose(\r\n i18n.decimalToFixedFormatter(),\r\n Number\r\n ),\r\n thousandth: i18n => _.compose(\r\n i18n.decimalToFixedFormatter(),\r\n value => value / 1000,\r\n Number\r\n ),\r\n};\r\n\r\n\r\nexport const generateHelpId = ({ name, helpId }) => {\r\n if (_.isFunction(helpId)) {\r\n return helpId(name);\r\n }\r\n // String help ID\r\n if (_.isString(helpId)) {\r\n return helpId;\r\n }\r\n // No help ID\r\n if (_.isNull(helpId)) {\r\n return null;\r\n }\r\n // Default performance metrics help ID\r\n return `Page_CampaignGrids_${name}`;\r\n};\r\n\r\nexport const headerTextStyle = hasHelpIcon => ({\r\n overflow: 'hidden',\r\n maxWidth: hasHelpIcon ? 'calc(100% - 22px)' : '100%',\r\n textOverflow: 'ellipsis',\r\n display: 'inline-block',\r\n verticalAlign: 'middle',\r\n});\r\n\r\nexport const buildColumn = ({\r\n key, name, helpId, title, fieldName, minWidth, maxWidth, sortable = true,\r\n}) => ({\r\n key,\r\n className: key,\r\n minWidth: minWidth || 120,\r\n maxWidth: maxWidth || 300,\r\n isResizable: true,\r\n name,\r\n fieldName: fieldName || key,\r\n sortable,\r\n title,\r\n onRenderHeader: () => {\r\n const helpIcon = helpId ? (\r\n \r\n \r\n \r\n ) : null;\r\n return (\r\n
\r\n \r\n {title}\r\n \r\n {helpIcon}\r\n
\r\n );\r\n },\r\n onRender: (item) => {\r\n const property = fieldName || key;\r\n const properties = property.split('/');\r\n return _.get(item, [properties], '-');\r\n },\r\n});\r\n\r\nexport const FluctuationType = {\r\n Default: 0,\r\n Impression: 1,\r\n Click: 2,\r\n Spend: 3,\r\n Conversion: 4,\r\n Max: 500,\r\n};\r\n\r\nexport const FluctuationEnumToStringMap = (() => {\r\n const keyList = _.keys(FluctuationType);\r\n return _.object(keyList, keyList);\r\n})();\r\n\r\nexport const ColumnNameToFluctuationTypeEnum = {\r\n Clicks: FluctuationEnumToStringMap.Click,\r\n Impressions: FluctuationEnumToStringMap.Impression,\r\n Spend: FluctuationEnumToStringMap.Spend,\r\n Conversions: FluctuationEnumToStringMap.Conversion,\r\n};\r\n\r\nexport const hasFluctuations = ({\r\n propertyName,\r\n availableInsightTypeIds,\r\n} = {}) => {\r\n if (!_.isEmpty(propertyName) && availableInsightTypeIds) {\r\n return _.contains(\r\n availableInsightTypeIds,\r\n ColumnNameToFluctuationTypeEnum[propertyName]\r\n );\r\n }\r\n return false;\r\n};\r\n\r\n","import React from 'react';\r\nimport { columnNames } from './strings';\r\nimport { buildColumn, formatFuncs, ColumnNameToFluctuationTypeEnum, hasFluctuations } from './shared';\r\n\r\nexport function buildFluctuationColumn(options = {}) {\r\n const {\r\n name, i18n, format, title, helpId,\r\n } = options;\r\n const key = options.key || name;\r\n const columnTitle = options.title || columnNames[key];\r\n const localizedTitle = i18n ? i18n.getString(columnTitle) : columnTitle;\r\n return {\r\n ...buildColumn({\r\n ...options, title: localizedTitle, helpId, key,\r\n }),\r\n className: `performance-metrics performance-metrics-${options.name}`,\r\n onRender: (item) => {\r\n const { PerformanceMetrics, AvailableInsightTypeIds } = item;\r\n const value = PerformanceMetrics[options.name];\r\n\r\n const metricType = ColumnNameToFluctuationTypeEnum[name];\r\n const metricName = title;\r\n const metricValue = format(i18n)(value);\r\n const hasFluctuation = hasFluctuations({\r\n propertyName: name,\r\n availableInsightTypeIds: AvailableInsightTypeIds,\r\n IsOverall: item.$total && item.$total.type === 'overall',\r\n });\r\n return (\r\n <>\r\n {metricValue || '-'}\r\n \r\n {hasFluctuation && }\r\n \r\n \r\n );\r\n },\r\n };\r\n}\r\n\r\nexport const ColumnClicksWithFluctuation = ({ i18n, helpId }) => buildFluctuationColumn({\r\n i18n,\r\n name: 'Clicks',\r\n format: formatFuncs.integer,\r\n helpId,\r\n});\r\n\r\nexport const ColumnImpressionsWithFluctuation = ({ i18n, helpId = 'Page_CampaignGrids_Impr' }) => buildFluctuationColumn({\r\n i18n,\r\n name: 'Impressions',\r\n format: formatFuncs.integer,\r\n helpId,\r\n});\r\n\r\nexport const ColumnSpendWithFluctuation = ({ i18n, helpId }) => buildFluctuationColumn({\r\n i18n,\r\n name: 'Spend',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n","import _ from 'underscore';\r\nimport { DefaultSortDirection } from '@bingads-webui-grid/campaign-details-list';\r\nimport { columnNames } from './strings';\r\nimport { buildColumn, formatFuncs } from './shared';\r\nimport { ColumnClicksWithFluctuation, ColumnImpressionsWithFluctuation, ColumnSpendWithFluctuation } from './fluctuation-columns';\r\n\r\nconst PerformanceMetricBaseColumnScope = 'PerformanceMetrics';\r\nconst PhonePerformanceMetricBaseColumnScope = 'PhonePerformanceMetrics';\r\n\r\nexport function buildPerformanceColumn(options = {}) {\r\n const {\r\n scope = PerformanceMetricBaseColumnScope, name, i18n, format, helpId, sortable,\r\n } = options;\r\n const key = options.key || options.name;\r\n const title = options.title || columnNames[key];\r\n const localizedTitle = i18n ? i18n.getString(title) : title;\r\n const property = options.property || `${scope}/${name}`;\r\n const onRenderPerformanceColumns = (item) => {\r\n const value = _.property([scope, name])(item);\r\n if (_.isUndefined(value) || _.isNull(value)) {\r\n return i18n ? i18n.getString(_TL_('-')) : '-';\r\n }\r\n if (format && typeof format === 'function') {\r\n return format(i18n)(value);\r\n }\r\n return value;\r\n };\r\n\r\n return {\r\n ...buildColumn({\r\n ...options, title: localizedTitle, helpId, key, sortable,\r\n }),\r\n defaultSortDirection: DefaultSortDirection.Descending,\r\n fieldName: property,\r\n onRenderAggregatedRow: onRenderPerformanceColumns,\r\n onRender: onRenderPerformanceColumns,\r\n };\r\n}\r\n\r\nexport const ColumnClicks = ({ i18n, helpId = 'Page_CampaignGrids_Clicks' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'Clicks',\r\n format: formatFuncs.integer,\r\n helpId,\r\n});\r\n\r\nexport const ColumnImpressions = ({ i18n, helpId = 'Page_CampaignGrids_Impr' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'Impressions',\r\n format: formatFuncs.integer,\r\n helpId,\r\n});\r\n\r\nexport const ColumnCTR = ({ i18n, helpId = 'Page_CampaignGrids_CTR' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'CTR',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAverageCPC = ({ i18n, helpId = 'Page_CampaignGrids_AvgCPC' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'AverageCPC',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAveragePosition = ({ i18n, helpId = 'Page_CampaignGrids_AvgPosition' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'AveragePosition',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAverageCPM = ({ i18n, helpId = 'Page_CampaignGrids_AvgCPM' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'AverageCPM',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnVideoViews = ({ i18n, helpId = 'Page_CampaignGrids_VideoViews' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'VideoViews',\r\n format: formatFuncs.integer,\r\n helpId,\r\n});\r\n\r\nexport const ColumnViewThroughRate = ({ i18n, helpId = 'Page_CampaignGrids_ViewThroughRate' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'ViewThroughRate',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAverageCPV = ({ i18n, helpId = 'Page_CampaignGrids_AverageCPV' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'AverageCPV',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnTotalWatchTimeInMS = ({ i18n, helpId = 'Page_CampaignGrids_TotalWatchTime' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'TotalWatchTimeInMS',\r\n format: formatFuncs.thousandth,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAverageWatchTimePerImpression = ({ i18n, helpId = 'Page_CampaignGrids_AverageWatchTimePerImpression' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'AverageWatchTimePerImpression',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAverageWatchTimePerVideoView = ({ i18n, helpId = 'Page_CampaignGrids_AverageWatchTimePerVideoView' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'AverageWatchTimePerVideoView',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnVideoViewsAt25Percent = ({ i18n, helpId = 'Page_CampaignGrids_VideoViewsAt25Percent' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'VideoViewsAt25Percent',\r\n format: formatFuncs.integer,\r\n helpId,\r\n});\r\n\r\nexport const ColumnVideoViewsAt50Percent = ({ i18n, helpId = 'Page_CampaignGrids_VideoViewsAt50Percent' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'VideoViewsAt50Percent',\r\n format: formatFuncs.integer,\r\n helpId,\r\n});\r\n\r\nexport const ColumnVideoViewsAt75Percent = ({ i18n, helpId = 'Page_CampaignGrids_VideoViewsAt75Percent' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'VideoViewsAt75Percent',\r\n format: formatFuncs.integer,\r\n helpId,\r\n});\r\n\r\nexport const ColumnCompletedVideoViews = ({ i18n, helpId = 'Page_CampaignGrids_CompletedVideoViews' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'CompletedVideoViews',\r\n format: formatFuncs.integer,\r\n helpId,\r\n});\r\n\r\nexport const ColumnVideoCompletionRate = ({ i18n, helpId = 'Page_CampaignGrids_VideoCompletionRate' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'VideoCompletionRate',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnSpend = ({ i18n, helpId = 'Page_CampaignGrids_Spend' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'Spend',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnTotalSpend = ({ i18n, helpId }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PhonePerformanceMetricBaseColumnScope,\r\n name: 'ClickAndPhoneSpend',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnDownloads = ({ i18n, helpId = 'pop_BA_AppAds_Downloads' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'Downloads',\r\n format: formatFuncs.integer,\r\n helpId,\r\n});\r\n\r\nexport const ColumnFirstLaunches = ({ i18n, helpId = 'pop_BA_AppAds_Installs' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'FirstLaunches',\r\n format: formatFuncs.integer,\r\n helpId,\r\n});\r\n\r\nexport const ColumnPurchases = ({ i18n, helpId = 'pop_BA_AppAds_InAppPurchase' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'Purchases',\r\n format: formatFuncs.integer,\r\n helpId,\r\n});\r\n\r\nexport const ColumnSubscriptions = ({ i18n, helpId = 'pop_BA_AppAds_InAppSubscription' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'Subscriptions',\r\n format: formatFuncs.integer,\r\n helpId,\r\n});\r\n\r\nexport const ColumnPostClickDownloadRate = ({ i18n, helpId = 'pop_BA_AppAds_DownloadRate' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'PostClickDownloadRate',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnCostPerDownload = ({ i18n, helpId = 'pop_BA_AppAds_CostPerDownload' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'CostPerDownload',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnPostClickFirstLaunchRate = ({ i18n, helpId = 'pop_BA_AppAds_InstallRate' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'PostClickFirstLaunchRate',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnCostPerFirstLaunch = ({ i18n, helpId = 'pop_BA_AppAds_CostPerInstall' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'CostPerFirstLaunch',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnPostInstallPurchaseRate = ({ i18n, helpId = 'pop_BA_AppAds_PostInstallPurchase' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'PostInstallPurchaseRate',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnCostPerPurchase = ({ i18n, helpId = 'pop_BA_AppAds_CostPerInAppPurchase' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'CostPerPurchase',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnPostInstallSubscriptionRate = ({ i18n, helpId = 'pop_BA_AppAds_PostInstallSubscription' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'PostInstallSubscriptionRate',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnCostPerSubscription = ({ i18n, helpId = 'pop_BA_AppAds_CostPerInAppSubscription' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'CostPerSubscription',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnTopImpressionRate = ({ i18n, helpId = 'pop_BA_Reporting_Clarity_TopImpressionRate' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'TopImpressionRate',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAbsoluteTopImpressionRate = ({ i18n, helpId = 'pop_BA_Reporting_Clarity_AbsoluteTopImpressionRate' }) => buildPerformanceColumn({\r\n i18n,\r\n scope: PerformanceMetricBaseColumnScope,\r\n name: 'AbsoluteTopImpressionRate',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAverageCPS = ({ i18n, helpId = 'pop_BA_CampaignGrids_CostPerSale' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AverageCPS',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const getPerformanceColumns = ({\r\n withFluctuations,\r\n IsVideoAdsPerfMetricsEnabled,\r\n} = {}) =>\r\n _.compact([\r\n withFluctuations ? ColumnClicksWithFluctuation : ColumnClicks,\r\n withFluctuations ? ColumnImpressionsWithFluctuation : ColumnImpressions,\r\n ColumnCTR,\r\n ColumnAverageCPC,\r\n withFluctuations ? ColumnSpendWithFluctuation : ColumnSpend,\r\n ColumnAveragePosition,\r\n ColumnAverageCPM,\r\n IsVideoAdsPerfMetricsEnabled && ColumnVideoViews,\r\n IsVideoAdsPerfMetricsEnabled && ColumnViewThroughRate,\r\n IsVideoAdsPerfMetricsEnabled && ColumnAverageCPV,\r\n IsVideoAdsPerfMetricsEnabled && ColumnTotalWatchTimeInMS,\r\n IsVideoAdsPerfMetricsEnabled && ColumnAverageWatchTimePerImpression,\r\n IsVideoAdsPerfMetricsEnabled && ColumnAverageWatchTimePerVideoView,\r\n IsVideoAdsPerfMetricsEnabled && ColumnVideoViewsAt25Percent,\r\n IsVideoAdsPerfMetricsEnabled && ColumnVideoViewsAt50Percent,\r\n IsVideoAdsPerfMetricsEnabled && ColumnVideoViewsAt75Percent,\r\n IsVideoAdsPerfMetricsEnabled && ColumnCompletedVideoViews,\r\n IsVideoAdsPerfMetricsEnabled && ColumnVideoCompletionRate,\r\n ColumnTotalSpend,\r\n ]);\r\n","import _ from 'underscore';\r\nimport { buildPerformanceColumn } from './performance-columns';\r\nimport { buildFluctuationColumn } from './fluctuation-columns';\r\nimport { formatFuncs } from './shared';\r\n\r\nexport const ColumnCPA = ({ i18n, helpId = 'Page_CampaignGrids_CPA' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'CPA',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnPartialConversionCPA = ({ i18n, helpId = 'Page_CampaignGrids_CPA' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'PartialConversionCPA',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnConversions = ({ i18n, helpId = 'Page_CampaignGrids_Conv' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'Conversions',\r\n format: formatFuncs.integer,\r\n helpId,\r\n});\r\n\r\nexport const ColumnConversionsCredit = ({ i18n, helpId = 'Page_CampaignGrids_Conv' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'ConversionsCredit',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnRevenueOnAdSpend = ({ i18n, helpId = 'Page_CampaignGrids_ReturnAdSpend' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'RevenueOnAdSpend',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAdvertiserReportedRevenue = ({ i18n, helpId = 'Page_CampaignGrids_Revenue' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AdvertiserReportedRevenue',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnConversionRate = ({ i18n, helpId = 'Page_CampaignGrids_ConvRate' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'ConversionRate',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnPartialConversionRate = ({ i18n, helpId = 'Page_CampaignGrids_ConvRate' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'PartialConversionRate',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAllConversionCPA = ({ i18n, helpId = 'pop_BA_CampaignGrids_AllConvCPA' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AllConversionCPA',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAllPartialConversionCPA = ({ i18n, helpId = 'pop_BA_CampaignGrids_AllConvCPA' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AllPartialConversionCPA',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAllConversions = ({ i18n, helpId = 'pop_BA_CampaignGrids_AllConv' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AllConversions',\r\n format: formatFuncs.integer,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAllConversionsCredit = ({ i18n, helpId = 'pop_BA_CampaignGrids_AllConv' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AllConversionsCredit',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAllConversionRevenueOnAdSpend = ({ i18n, helpId = 'pop_BA_CampaignGrids_AllConvROAS' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AllConversionRevenueOnAdSpend',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAllConversionAdvertiserReportedRevenue = ({ i18n, helpId = 'pop_BA_CampaignGrids_AllConvRevenue' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AllConversionAdvertiserReportedRevenue',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAllConversionRate = ({ i18n, helpId = 'pop_BA_CampaignGrids_AllConvRate' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AllConversionRate',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAllPartialConversionRate = ({ i18n, helpId = 'pop_BA_CampaignGrids_AllConvRate' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AllPartialConversionRate',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnViewThroughConversions = ({ i18n, helpId = 'pop_BA_CampaignGrids_ViewThrough' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'ViewThroughConversions',\r\n format: formatFuncs.integer,\r\n helpId,\r\n});\r\n\r\nexport const ColumnViewThroughConversionsCredit = ({ i18n, helpId = 'pop_BA_CampaignGrids_ViewThrough' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'ViewThroughConversionsCredit',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnViewThroughConversionsRevenue = ({ i18n, helpId = 'pop_BA_Reporting_Clarity_ViewThroughConvRevenue' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'ViewThroughConversionsRevenue',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnViewThroughConversionsCPA = ({ i18n, helpId = 'pop_BA_Reporting_Clarity_ViewThroughConvCPA' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'ViewThroughConversionsCPA',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnViewThroughPartialConversionsCPA = ({ i18n, helpId = 'pop_BA_Reporting_Clarity_ViewThroughConvCPA' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'ViewThroughPartialConversionsCPA',\r\n format: formatFuncs.decimal,\r\n helpId,\r\n});\r\n\r\nexport const ColumnViewThroughConversionsReturnOnAdSpend = ({ i18n, helpId = 'pop_BA_Reporting_Clarity_ViewThroughConvReturnOnAdSpend' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'ViewThroughConversionsReturnOnAdSpend',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnViewThroughConversionsRate = ({ i18n, helpId = 'pop_BA_Reporting_Clarity_ViewThroughConvRate' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'ViewThroughConversionsRate',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnViewThroughPartialConversionsRate = ({ i18n, helpId = 'pop_BA_Reporting_Clarity_ViewThroughConvRate' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'ViewThroughPartialConversionsRate',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnNetRevenue = ({ i18n, helpId, permissions }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'NetRevenue',\r\n format: formatFuncs.decimal,\r\n permissions,\r\n helpId,\r\n});\r\n\r\nexport const ColumnConversionsWithFluctuation = ({ i18n, helpId = 'Page_CampaignGrids_Conv', permissions }) => buildFluctuationColumn({\r\n i18n,\r\n name: 'Conversions',\r\n format: formatFuncs.integer,\r\n permissions,\r\n helpId,\r\n});\r\n\r\nexport const ColumnConversionsCreditWithFluctuation = ({ i18n, helpId = 'Page_CampaignGrids_Conv', permissions }) => buildFluctuationColumn({\r\n i18n,\r\n name: 'ConversionsCredit',\r\n format: formatFuncs.decimal,\r\n permissions,\r\n helpId,\r\n});\r\n\r\nexport const ColumnReturnOnAdSpendColumn = ({ i18n, helpId = 'Page_CampaignGrids_ReturnAdSpend', permissions }) => buildFluctuationColumn({\r\n i18n,\r\n name: 'ReturnOnAdSpend',\r\n format: formatFuncs.percentage,\r\n permissions,\r\n helpId,\r\n});\r\n\r\nexport const ColumnSalesCount = ({ i18n, helpId = 'pop_BA_CampaignGrids_Sale' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'SalesCount',\r\n format: formatFuncs.integer,\r\n helpId,\r\n});\r\n\r\nexport const getConversionColumns = ({\r\n withFluctuations = false,\r\n withPartialConversions = false,\r\n} = {}) => _.compact([\r\n withPartialConversions ? ColumnPartialConversionCPA : ColumnCPA,\r\n withFluctuations && withPartialConversions && ColumnConversionsCreditWithFluctuation,\r\n withFluctuations && !withPartialConversions && ColumnConversionsWithFluctuation,\r\n !withFluctuations && withPartialConversions && ColumnConversionsCredit,\r\n !withFluctuations && !withPartialConversions && ColumnConversions,\r\n withPartialConversions ? ColumnPartialConversionRate : ColumnConversionRate,\r\n ColumnAdvertiserReportedRevenue,\r\n ColumnRevenueOnAdSpend,\r\n withPartialConversions ? ColumnAllPartialConversionCPA : ColumnAllConversionCPA,\r\n withPartialConversions ? ColumnAllConversionsCredit : ColumnAllConversions,\r\n withPartialConversions ? ColumnAllPartialConversionRate : ColumnAllConversionRate,\r\n ColumnAllConversionAdvertiserReportedRevenue,\r\n ColumnAllConversionRevenueOnAdSpend,\r\n]);\r\n\r\nexport const conversionsColumns = getConversionColumns();\r\nexport const conversionsColumnsWithFluctuation = getConversionColumns({ withFluctuations: true });\r\n","import { buildPerformanceColumn } from './performance-columns';\r\nimport { formatFuncs } from './shared';\r\n\r\nexport const ColumnAuctionWonPercent = ({ i18n, helpId = 'pop_BA_CampaignGrids_IS' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AuctionWonPercent',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAuctionLostToBudgetPercent = ({ i18n, helpId = 'pop_BA_CampaignGrids_ISBudget' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AuctionLostToBudgetPercent',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAuctionLostToRankPercent = ({ i18n, helpId = 'pop_BA_CampaignGrids_ISRank' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AuctionLostToRankPercent',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAuctionLostToAdQualityPercent = ({ i18n, helpId = 'pop_BA_CampaignGrids_ISctr' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AuctionLostToAdQualityPercent',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAuctionLostToLandingPercent = ({ i18n, helpId = 'pop_BA_CampaignGrids_ISRelv' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AuctionLostToLandingPercent',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAuctionLostToBidPercent = ({ i18n, helpId = 'pop_BA_CampaignGrids_ISBid' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AuctionLostToBidPercent',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnExactMatchImpressionSharePercent = ({ i18n, helpId = 'pop_BA_Reporting_Clarity_ExactMatchImpressionShare' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'ExactMatchImpressionSharePercent',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnTopImpressionSharePercent = ({ i18n, helpId = 'pop_BA_Reporting_Clarity_TopImpressionShare' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'TopImpressionSharePercent',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnTopImpressionShareLostToBudget = ({ i18n, helpId = 'pop_BA_Reporting_Clarity_TopImpressionLosttoBudget' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'TopImpressionShareLostToBudget',\r\n format: formatFuncs.percentage,\r\n property: 'PerformanceMetrics/TopISLostToBudgetPercent',\r\n helpId,\r\n});\r\n\r\nexport const ColumnTopImpressionShareLostToRank = ({ i18n, helpId = 'pop_BA_Reporting_Clarity_TopImpressionLosttoRank' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'TopImpressionShareLostToRank',\r\n property: 'PerformanceMetrics/TopISLostToRankPercent',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAbsoluteTopImpressionSharePercent = ({ i18n, helpId = 'pop_BA_Reporting_ProductAds_AbsoluteTopImpShare' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AbsoluteTopImpressionSharePercent',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAbsoluteTopImpressionShareLostToBudget = ({ i18n, helpId = 'pop_BA_Reporting_Clarity_AbsoluteTopISLosttoBudget' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AbsoluteTopImpressionShareLostToBudget',\r\n property: 'PerformanceMetrics/AbsoluteTopISLostToBudgetPercent',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAbsoluteTopImpressionShareLostToRank = ({ i18n, helpId = 'pop_BA_Reporting_Clarity_AbsoluteTopISLosttoRank' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AbsoluteTopImpressionShareLostToRank',\r\n property: 'PerformanceMetrics/AbsoluteTopISLostToRankPercent',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnClickSharePercent = ({ i18n, helpId = 'pop_BA_Reporting_ProductAds_ClickSharePercent' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'ClickSharePercent',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAudienceAuctionWonPercent = ({ i18n, helpId = 'pop_BA_Reporting_Clarity_AudienceNetwork_ImpressionShare' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AudienceImpressionShare',\r\n property: 'PerformanceMetrics/AudienceAuctionWonPercent',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAudienceTopISLostToBudgetPercent = ({ i18n, helpId = 'pop_BA_Reporting_Clarity_AudienceNetwork_ImpressionShare_LostBudget' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AudienceImpressionShareLostToBudget',\r\n property: 'PerformanceMetrics/AudienceTopISLostToBudgetPercent',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnAudienceTopISLostToRankPercent = ({ i18n, helpId = 'pop_BA_Reporting_Clarity_AudienceNetwork_ImpressionShare_LostRank' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'AudienceImpressionShareLostToRank',\r\n property: 'PerformanceMetrics/AudienceTopISLostToRankPercent',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnRelativeCTR = ({ i18n, helpId = 'pop_BA_Reporting_Clarity_RelativeCTR' }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'RelativeCTR',\r\n format: formatFuncs.percentage,\r\n helpId,\r\n});\r\n\r\nexport const ColumnEligibleImpressions = ({ i18n, helpId }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'EligibleImpressions',\r\n helpId,\r\n sortable: false,\r\n});\r\n\r\nexport const ColumnMissedImpressions = ({ i18n, helpId }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'MissedImpressions',\r\n helpId,\r\n sortable: false,\r\n});\r\n\r\nexport const ColumnImpressionShare = ({ i18n, helpId }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'ImpressionShare',\r\n helpId,\r\n sortable: false,\r\n});\r\n\r\nexport const ColumnMissedImpressionsNoBid = ({ i18n, helpId }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'MissedImpressionsNoBid',\r\n helpId,\r\n sortable: false,\r\n});\r\n\r\nexport const ColumnMissedImpressionsSpendingCapReached = ({ i18n, helpId }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'MissedImpressionsSpendingCapReached',\r\n helpId,\r\n sortable: false,\r\n});\r\n\r\nexport const ColumnMissedImpressionsInsufficientBid = ({ i18n, helpId }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'MissedImpressionsInsufficientBid',\r\n helpId,\r\n sortable: false,\r\n});\r\n\r\nexport const ColumnMissedImpressionsNoTax = ({ i18n, helpId }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'MissedImpressionsNoTax',\r\n helpId,\r\n sortable: false,\r\n});\r\n\r\nexport const ColumnMissedImpressionsOther = ({ i18n, helpId }) => buildPerformanceColumn({\r\n i18n,\r\n name: 'MissedImpressionsOther',\r\n helpId,\r\n sortable: false,\r\n});\r\n\r\nexport const competitiveColumns = [\r\n ColumnAuctionWonPercent,\r\n ColumnAuctionLostToBudgetPercent,\r\n ColumnAuctionLostToRankPercent,\r\n ColumnAuctionLostToAdQualityPercent,\r\n ColumnAuctionLostToLandingPercent,\r\n ColumnAuctionLostToBidPercent,\r\n ColumnClickSharePercent,\r\n];\r\n\r\n","import React from 'react';\r\nimport { IconButton, mergeStyles } from '@fluentui/react';\r\n\r\n\r\nconst defaultMenus = [\r\n {\r\n key: 'Active',\r\n text: _TL_('Enabled'),\r\n color: '#107C10',\r\n className: 'statis-enabled',\r\n icon: 'StatusCircleInner',\r\n },\r\n {\r\n key: 'Paused',\r\n text: _TL_('Paused'),\r\n color: '#323130',\r\n className: 'statis-paused',\r\n icon: 'Pause',\r\n },\r\n];\r\n\r\n\r\nconst selectedStyle = {\r\n '.ms-ContextualMenu-itemText': {\r\n fontWeight: 'bold',\r\n },\r\n};\r\n\r\nconst buttonStyle = color => ({\r\n height: 'auto',\r\n '.ms-Button-icon': {\r\n fontSize: 12,\r\n color,\r\n },\r\n '&:hover': {\r\n background: 'transparent',\r\n color: 'inherit',\r\n },\r\n});\r\n\r\nconst iconStyle = color => ({\r\n '.ms-ContextualMenu-icon': {\r\n fontSize: 12,\r\n color,\r\n },\r\n});\r\n\r\nexport const ColumnStatusIcon = ({\r\n i18n, readOnly = false, menus = defaultMenus, onEditStatus = () => {},\r\n}) => ({\r\n key: 'Status',\r\n name: i18n.getString(_TL_('Status')),\r\n fieldName: 'Status',\r\n className: 'column-status',\r\n headerClassName: 'header-status',\r\n minWidth: 35,\r\n maxWidth: 35,\r\n sortable: true,\r\n isResizable: false,\r\n onRenderHeader: () => (\r\n
\r\n ),\r\n onRender: (item) => {\r\n const { Status } = item;\r\n const selectedItem = menus.find(menu => menu.key === Status);\r\n return (\r\n (\r\n ({\r\n key: menu.key,\r\n text: i18n.getString(menu.text),\r\n className: `${menu.className} ${mergeStyles(iconStyle(menu.color))} ${Status === menu.key && mergeStyles(selectedStyle)}`,\r\n iconProps: { iconName: menu.icon },\r\n onClick: () => onEditStatus(menu.key, item),\r\n })),\r\n }}\r\n />\r\n )\r\n );\r\n },\r\n});\r\n","import { extend, size } from 'underscore';\r\nimport { PageReady } from '@bingads-webui/page-ready';\r\n\r\n// Only log the navigation timing info for first grid data load for Grid performance measurement during page load.\r\nlet isInitialGridDataLoad = true;\r\nlet isPageReadyFulfilled = false;\r\n\r\nPageReady.afterPageReady().then(() => {\r\n isPageReadyFulfilled = true;\r\n});\r\n\r\nexport function perfMarkerMiddlewareFactory(perfMarker, gridName) {\r\n const logNavTiming = isInitialGridDataLoad;\r\n isInitialGridDataLoad = false;\r\n\r\n let isDataLoaded = false;\r\n\r\n let gridMarker = perfMarker.createChild(`cdl-${gridName}-load`);\r\n gridMarker.willInit();\r\n\r\n return function perfMarkerMiddleware(action, state) {\r\n const { type } = action;\r\n if (type === 'START_LOAD_DATA') {\r\n // If grid marker is already marked done\r\n // then it means this grid load is from some action on grid\r\n // actions like, sort, filter, column selection etc.\r\n // Create a new marker under parent in that case to capture user action.\r\n if (gridMarker && gridMarker.isDone && gridMarker.parentMarker) {\r\n gridMarker = gridMarker.parentMarker.createChild(`cdl-${gridName}-action`);\r\n gridMarker.willInit();\r\n }\r\n\r\n gridMarker.willFetchData();\r\n gridMarker.parentMarker.willFetchData();\r\n } else if (type === 'FINISH_LOAD_DATA') {\r\n isDataLoaded = true;\r\n gridMarker.willRender();\r\n gridMarker.parentMarker.willRender();\r\n } else if (type === 'TABLE_DID_UPDATE') {\r\n if (isDataLoaded) {\r\n const payload = {\r\n Version: 'campaign-details-list@1.0.0',\r\n GridName: gridName,\r\n IsPageReadyFulfilled: isPageReadyFulfilled,\r\n // IsVirtualized: TODO\r\n TotalRows: size(state.items),\r\n TotalServerSideRows: state.totalCount,\r\n // TotalVisibleRows: TODO\r\n TotalColumns: state.selectedColumns.length,\r\n };\r\n\r\n if (logNavTiming) {\r\n // Add navigation timing info to indicate this is first Grid load\r\n extend(payload, {\r\n PageNavStartTime: performance.timing.navigationStart,\r\n PageFetchStartTime: performance.timing.fetchStart,\r\n LandingPageUrl: location.href, // TODO: is there a better way to get it?\r\n });\r\n }\r\n\r\n gridMarker.done(JSON.stringify(payload));\r\n\r\n isDataLoaded = false;\r\n }\r\n }\r\n };\r\n}\r\n","// exported from @bingads-webui/projection-grid-base-column\r\nexport enum ColumnFormat {\r\n /**\r\n * Convert a float to a percentage. E.g.: .07 => 7%, .15 => 15%\r\n */\r\n Percentage = 'percentage',\r\n /**\r\n * Formats a float as percentage. E.g.: 42.07 => 42.07%, 0.15 => 0.15%\r\n */\r\n PercentageValue = 'percentage-value',\r\n /**\r\n * Formats value as integer.\r\n */\r\n Integer = 'integer',\r\n /**\r\n * A positive non-zero integer: 1,2,3..Number.MAX_VALUE\r\n */\r\n Natural = 'natural-integer',\r\n /**\r\n * A number with two decimal points.\r\n */\r\n Decimal = 'decimal',\r\n Thousandth = 'thousandth',\r\n}\r\n\r\n/**\r\n * Raw Data of a column\r\n * Note that data and UI is independent, however, due to historic reason, this data structure might still have some UI data.\r\n */\r\nexport interface ColumnRawData {\r\n /**\r\n * a unique key of the column\r\n */\r\n key: string;\r\n /**\r\n * key of friendly name, only during runtime it could be translated to real i18n name\r\n *\r\n * define example: _TL_('a friendly name')\r\n *\r\n * use example: i18n.getString(column.name)\r\n */\r\n name: string;\r\n\r\n /**\r\n * used for help link\r\n */\r\n helpId?: string;\r\n /**\r\n *\r\n */\r\n format?: ColumnFormat;\r\n title?: string;\r\n}\r\n\r\n/**\r\n * used for get property from odata\r\n *\r\n * The separator must be '/'\r\n *\r\n * @example 'XX/YY/ZZ'\r\n */\r\nexport type ColumnOdataPath = string;\r\n\r\n/**\r\n * `Key` is the key of column\r\n *\r\n * `Value` is the correspond odata path of the column in the response(There is no guarantee of response, you should create differnt map for each response if possible)\r\n */\r\nexport type ColumnKeyOdataPathMap = Map;\r\n","export enum SelectOption {\r\n mandatory = 'mandatory',\r\n locked = 'locked',\r\n optional = 'optional',\r\n}\r\n\r\nexport type TimeAggregationEnum = string;\r\n\r\nexport interface ColumnChooserColumnOption {\r\n key: string;\r\n name: string;\r\n type?: string;\r\n helpTopic?: string;\r\n forbiddenTimeGrains?: TimeAggregationEnum[];\r\n selectOption?: SelectOption;\r\n}\r\n\r\nexport interface ColumnChooserCategory {\r\n name: string;\r\n type: string;\r\n options: ColumnChooserColumnOption[];\r\n}\r\n","import { ColumnFormat, ColumnRawData } from '../../well-known-type';\r\n\r\n// Not official, but according to my search result, you could reference\r\n// key of column: {AdsAppsMT}/private/Campaign/MT/Source/Interface/Entity/Aggregator2/GridColumn.cs\r\n// name of column: {AdsAppsMT}/private/Campaign/MT/Source/Shared/InlineDownload/Source/Helpers/ServiceHelpers.cs\r\n// name of column: {AdsAppsCampaignUI}/private/ui-legacy/Localization/CampaignUIClientSide/strings.resx\r\n\r\nexport const spendColumn: ColumnRawData = {\r\n key: 'Spend',\r\n name: _TL_('Spend'),\r\n helpId: 'Page_CampaignGrids_Spend',\r\n};\r\n\r\nexport const clicksColumn: ColumnRawData = {\r\n key: 'Clicks',\r\n name: _TL_('Clicks'),\r\n format: ColumnFormat.Integer,\r\n helpId: 'Page_CampaignGrids_Clicks',\r\n};\r\n\r\nexport const impressionsColumn: ColumnRawData = {\r\n key: 'Impressions',\r\n name: _TL_('Impr.'),\r\n format: ColumnFormat.Integer,\r\n helpId: 'Page_CampaignGrids_Impr',\r\n};\r\n\r\nexport const CTRColumn: ColumnRawData = {\r\n key: 'CTR',\r\n name: _TL_('CTR'),\r\n format: ColumnFormat.PercentageValue,\r\n helpId: 'Page_CampaignGrids_CTR',\r\n};\r\n\r\nexport const averageCPCColumn: ColumnRawData = {\r\n key: 'AverageCPC',\r\n name: _TL_('Avg. CPC'),\r\n helpId: 'Page_CampaignGrids_AvgCPC',\r\n};\r\n\r\nexport const averageCPMColumn: ColumnRawData = {\r\n key: 'AverageCPM',\r\n name: _TL_('Avg. CPM'),\r\n helpId: 'Page_CampaignGrids_AvgCPM',\r\n};\r\n\r\nexport const conversionsColumn: ColumnRawData = {\r\n key: 'Conversions',\r\n name: _TL_('Conv.'),\r\n format: ColumnFormat.Integer,\r\n helpId: 'Page_CampaignGrids_Conv',\r\n};\r\n\r\nexport const conversionRateColumn: ColumnRawData = {\r\n key: 'ConversionRate',\r\n name: _TL_('Conv. rate'),\r\n format: ColumnFormat.PercentageValue,\r\n helpId: 'Page_CampaignGrids_ConvRate',\r\n};\r\n\r\nexport const grossRevenueColumn: ColumnRawData = {\r\n key: 'GrossRevenue',\r\n name: _TL_('Gross revenue'),\r\n format: ColumnFormat.Decimal,\r\n};\r\n\r\nexport const grossRevenuePerConvColumn: ColumnRawData = {\r\n key: 'GrossRevenuePerConv',\r\n name: _TL_('Gross revenue per conv.'),\r\n format: ColumnFormat.Decimal,\r\n};\r\n\r\nexport const grossRevenuePerClickColumn: ColumnRawData = {\r\n key: 'GrossRevenuePerClick',\r\n name: _TL_('Gross revenue per click'),\r\n format: ColumnFormat.Decimal,\r\n};\r\n\r\nexport const grossROASColumn: ColumnRawData = {\r\n key: 'GrossROAS',\r\n name: _TL_('Gross ROAS'),\r\n format: ColumnFormat.Decimal,\r\n};\r\n\r\nexport const netRevenueColumn: ColumnRawData = {\r\n key: 'NetRevenue',\r\n name: _TL_('Net revenue'),\r\n format: ColumnFormat.Decimal,\r\n};\r\n\r\nexport const netRevenueConvColumn: ColumnRawData = {\r\n key: 'NetRevenueConv',\r\n name: _TL_('Net revenue per conv.'),\r\n format: ColumnFormat.Decimal,\r\n};\r\n\r\nexport const netRevenuePerClickColumn: ColumnRawData = {\r\n key: 'NetRevenuePerClick',\r\n name: _TL_('Net revenue per click'),\r\n format: ColumnFormat.Decimal,\r\n};\r\n\r\nexport const netROASColumn: ColumnRawData = {\r\n key: 'NetROAS',\r\n name: _TL_('Net ROAS'),\r\n format: ColumnFormat.Decimal,\r\n};\r\n\r\nexport const totalBookedNightsColumn: ColumnRawData = {\r\n key: 'TotalBookedNights',\r\n name: _TL_('Booked length of stay'),\r\n format: ColumnFormat.Integer,\r\n};\r\n\r\nexport const avgBookedABWColumn: ColumnRawData = {\r\n key: 'AvgBookedABW',\r\n name: _TL_('Avg booked ABW'),\r\n format: ColumnFormat.Decimal,\r\n};\r\n\r\nexport const bookedABWColumn: ColumnRawData = {\r\n key: 'BookedABW',\r\n name: _TL_('Booked ABW'),\r\n format: ColumnFormat.Integer,\r\n};\r\n\r\nexport const returnOnAdSpendColumn: ColumnRawData = {\r\n key: 'RevenueOnAdSpend',\r\n name: _TL_('Return on ad spend'),\r\n format: ColumnFormat.PercentageValue,\r\n helpId: 'Page_CampaignGrids_ReturnAdSpend',\r\n};\r\n\r\nexport const absoluteTopImpressionRateColumn: ColumnRawData = {\r\n key: 'AbsoluteTopImpressionRate',\r\n name: _TL_('Abs. top impr. rate'),\r\n format: ColumnFormat.PercentageValue,\r\n helpId: 'pop_BA_Reporting_Clarity_AbsoluteTopImpressionRate',\r\n};\r\n\r\nexport const advertiserReportedRevenue: ColumnRawData = {\r\n key: 'AdvertiserReportedRevenue',\r\n name: _TL_('Revenue'),\r\n helpId: 'Page_CampaignGrids_Revenue',\r\n};\r\n\r\nexport const CPAColumn: ColumnRawData = {\r\n key: 'CPA',\r\n name: _TL_('CPA'),\r\n helpId: 'Page_CampaignGrids_CPA',\r\n};\r\n\r\nexport const allConversionsColumn: ColumnRawData = {\r\n key: 'AllConversions',\r\n name: _TL_('All conv.'),\r\n format: ColumnFormat.Integer,\r\n helpId: 'pop_BA_CampaignGrids_AllConv',\r\n};\r\n\r\nexport const allConversionRateColumn: ColumnRawData = {\r\n key: 'AllConversionRate',\r\n name: _TL_('All conv. rate'),\r\n format: ColumnFormat.PercentageValue,\r\n helpId: 'pop_BA_CampaignGrids_AllConvRate',\r\n};\r\n\r\nexport const allConversionRevenueOnAdSpendColumn: ColumnRawData = {\r\n key: 'AllConversionRevenueOnAdSpend',\r\n name: _TL_('All conv. return on ad spend'),\r\n format: ColumnFormat.PercentageValue,\r\n helpId: 'pop_BA_CampaignGrids_AllConvROAS',\r\n};\r\n\r\nexport const allConversionAdvertiserReportedRevenue: ColumnRawData = {\r\n key: 'AllConversionAdvertiserReportedRevenue',\r\n name: _TL_('All conv. revenue'),\r\n format: ColumnFormat.Decimal,\r\n helpId: 'pop_BA_CampaignGrids_AllConvRevenue',\r\n};\r\n\r\nexport const allConversionCPAColumn: ColumnRawData = {\r\n key: 'AllConversionCPA',\r\n name: _TL_('All conv. CPA'),\r\n format: ColumnFormat.Decimal,\r\n helpId: 'pop_BA_CampaignGrids_AllConvCPA',\r\n};\r\n\r\nexport const averagePositionColumn: ColumnRawData = {\r\n key: 'AveragePosition',\r\n name: _TL_('Average Position'),\r\n helpId: 'Page_CampaignGrids_AvgPosition',\r\n format: ColumnFormat.Decimal,\r\n};\r\n\r\nexport const submittedOfferCountColumn: ColumnRawData = {\r\n key: 'ProductsSubmitted',\r\n name: _TL_('Products Submitted'),\r\n format: ColumnFormat.Integer,\r\n helpId: 'pop_BA_BSC_ProductsSubmitted',\r\n};\r\n\r\nexport const servableOfferCountColumn: ColumnRawData = {\r\n key: 'ProductsReadyToServe',\r\n name: _TL_('Products Ready to Serve'),\r\n format: ColumnFormat.Integer,\r\n helpId: 'pop_BA_BSC_ProductReadyToServe',\r\n};\r\n\r\nexport const targetedOfferCountColumn: ColumnRawData = {\r\n key: 'ProductsTargeted',\r\n name: _TL_('Products Targeted'),\r\n format: ColumnFormat.Integer,\r\n helpId: 'pop_BA_BSC_ProductTargeted',\r\n};\r\n\r\nexport const targetedOfferPercentageColumn: ColumnRawData = {\r\n key: 'ProductsTargeted_Percentage',\r\n name: _TL_('% Products Targeted'),\r\n format: ColumnFormat.PercentageValue,\r\n helpId: 'pop_BA_BSC_ProductsTargetPercentage',\r\n};\r\n\r\nexport const urlCustomParametersColumn: ColumnRawData = {\r\n key: 'CustomParameters',\r\n name: _TL_('Custom parameters'),\r\n helpId: 'Page_CampaignsGrid_URLCustomParameters',\r\n};\r\n\r\nexport const finalUrlSuffixColumn: ColumnRawData = {\r\n key: 'FinalUrlSuffix',\r\n name: _TL_('Final URL suffix'),\r\n helpId: 'pop_BA_NewAdCreate_FinalURLSuffix',\r\n};\r\n\r\nexport const trackingUrlTemplateColumn: ColumnRawData = {\r\n key: 'TrackingTemplate',\r\n name: _TL_('Tracking template'),\r\n helpId: 'Page_CampaignsGrid_TrackingTemplate',\r\n};\r\n\r\nexport const destinationUrlColumn: ColumnRawData = {\r\n key: 'DestinationUrl',\r\n name: _TL_('Destination URL'),\r\n helpId: 'Page_CampaignGrids_DestinationUrl',\r\n};\r\n\r\nexport const eligibleImpressionsColumn: ColumnRawData = {\r\n key: 'EligibleImpressions',\r\n name: _TL_('Eligible impr.'),\r\n};\r\n\r\nexport const missedImpressionsColumn: ColumnRawData = {\r\n key: 'MissedImpressions',\r\n name: _TL_('Missed impr.'),\r\n};\r\n\r\nexport const impressionShareColumn: ColumnRawData = {\r\n key: 'ImpressionShare',\r\n name: _TL_('Impr. share'),\r\n};\r\n\r\nexport const missedImpressionsNoBidColumn: ColumnRawData = {\r\n key: 'MissedImpressionsNoBid',\r\n name: _TL_('Missed impr. no bid'),\r\n};\r\n\r\nexport const missedImpressionsSpendingCapReachedColumn: ColumnRawData = {\r\n key: 'MissedImpressionsSpendingCapReached',\r\n name: _TL_('Missed impr. spending cap reached'),\r\n};\r\n\r\nexport const missedImpressionsInsufficientBidColumn: ColumnRawData = {\r\n key: 'MissedImpressionsInsufficientBid',\r\n name: _TL_('Missed impr. insufficient bid'),\r\n};\r\n\r\nexport const missedImpressionsNoTaxColumn: ColumnRawData = {\r\n key: 'MissedImpressionsNoTax',\r\n name: _TL_('Missed impr. no tax'),\r\n};\r\n\r\nexport const missedImpressionsOtherColumn: ColumnRawData = {\r\n key: 'MissedImpressionsOther',\r\n name: _TL_('Missed impr. other'),\r\n};\r\n\r\nexport const averageCPSColumn: ColumnRawData = {\r\n key: 'AverageCPS',\r\n name: _TL_('Avg. CPS'),\r\n format: ColumnFormat.Decimal,\r\n helpId: 'pop_BA_CampaignGrids_CostPerSale',\r\n};\r\n\r\nexport const salesCountColumn: ColumnRawData = {\r\n key: 'SalesCount',\r\n name: _TL_('Sales Count'),\r\n format: ColumnFormat.Integer,\r\n helpId: 'pop_BA_CampaignGrids_Sale',\r\n};\r\n","export const getAggregatedRowConfigs = ({\r\n i18n,\r\n showFilter,\r\n showWaterFall,\r\n showSearchRow,\r\n showAudienceRow,\r\n showPmaxRow,\r\n showNativeRow,\r\n showLinkedInRow,\r\n showDeletedRow,\r\n showUnknown,\r\n showOther,\r\n showOverall,\r\n}) => {\r\n const configs = [\r\n {\r\n type: 'filtered',\r\n dataKey: '@ns.filtered.totals',\r\n text: i18n.getString(_TL_('Filtered total - {{number}} {{entity}}')),\r\n number: '@odata.count',\r\n ignore: !showFilter,\r\n },\r\n {\r\n type: 'waterfallFilter',\r\n dataKey: '@ns.filtered.totals',\r\n number: '@odata.count',\r\n ignore: !showWaterFall,\r\n },\r\n {\r\n type: 'search',\r\n dataKey: '@ns.search.non.deleted.totals',\r\n text: i18n.getString(_TL_('Search ads total')),\r\n helpId: 'pop_BA_CampaignGrids_SearchTotal',\r\n ignore: !showSearchRow,\r\n },\r\n {\r\n type: 'audience',\r\n dataKey: '@ns.audience.non.deleted.totals',\r\n text: i18n.getString(_TL_('Audience ads total')),\r\n helpId: 'pop_BA_CampaignGrids_AudienceTotal',\r\n ignore: !showAudienceRow,\r\n },\r\n {\r\n type: 'pmax',\r\n dataKey: '@ns.pmax.non.deleted.totals',\r\n text: i18n.getString(_TL_('Performance Max campaigns total')),\r\n ignore: !showPmaxRow,\r\n },\r\n {\r\n type: 'native',\r\n dataKey: '@ns.native.non.deleted.totals',\r\n text: i18n.getString(_TL_('Native total')),\r\n ignore: !showNativeRow,\r\n },\r\n {\r\n type: 'linkedin',\r\n dataKey: '@ns.linkedin.non.deleted.totals',\r\n text: i18n.getString(_TL_('LinkedIn campaigns total')),\r\n ignore: !showLinkedInRow,\r\n },\r\n {\r\n type: 'deleted',\r\n dataKey: '@ns.deleted.totals',\r\n text: i18n.getString(_TL_('Deleted items total')),\r\n helpId: 'pop_BA_CampaignGrids_DeletedTotal',\r\n ignore: !showDeletedRow,\r\n },\r\n {\r\n type: 'unknownDevices',\r\n dataKey: '@ns.unknown.totals',\r\n ignore: !showUnknown,\r\n },\r\n {\r\n type: 'other',\r\n dataKey: '@ns.other.totals',\r\n ignore: !showOther,\r\n },\r\n {\r\n type: 'overall',\r\n dataKey: '@ns.unfiltered.totals',\r\n text: i18n.getString(_TL_('Overall total - {{number}} {{entity}}')),\r\n number: '@ns.unfiltered.count',\r\n ignore: !showOverall,\r\n },\r\n ];\r\n\r\n return configs.filter(row => !row.ignore);\r\n};\r\n\r\n","import _ from 'underscore';\r\nimport { ColumnFormat, I18n } from '../well-known-type';\r\n\r\nconst { identity, compose } = _;\r\n\r\n// exported from `@bingads-webui/projection-grid-base-column`\r\nexport function getFormatter(format: ColumnFormat, i18n: I18n, placeholder: string = '-') {\r\n let formatter: Function = identity;\r\n\r\n if (!format) {\r\n return formatter;\r\n }\r\n\r\n switch (format) {\r\n case ColumnFormat.Percentage:\r\n formatter = compose(\r\n i18n.percentFormatter(),\r\n Number\r\n );\r\n break;\r\n case ColumnFormat.PercentageValue:\r\n formatter = compose(\r\n i18n.percentToFixedFormatter({ digits: 2 }),\r\n (value: number) => value / 100,\r\n Number\r\n );\r\n break;\r\n case ColumnFormat.Integer:\r\n formatter = compose(\r\n i18n.decimalToIntegerFormatter(),\r\n Number\r\n );\r\n break;\r\n case ColumnFormat.Natural:\r\n formatter = (() => {\r\n const fmt = compose(\r\n i18n.decimalToIntegerFormatter(),\r\n Number\r\n );\r\n return (value: number) => (Number.isFinite(value) && value >= 1 ? fmt(value) : placeholder);\r\n })();\r\n break;\r\n case ColumnFormat.Decimal:\r\n formatter = compose(\r\n i18n.decimalToFixedFormatter(),\r\n Number\r\n );\r\n break;\r\n case ColumnFormat.Thousandth:\r\n formatter = compose(\r\n i18n.decimalToFixedFormatter(),\r\n (value: number) => value / 1000,\r\n Number\r\n );\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n return (value: any) => (value === null\r\n || value === undefined\r\n || (Object.values(ColumnFormat).includes(format) && value === '') ?\r\n placeholder :\r\n formatter(value));\r\n}\r\n","export abstract class UriHelper {\r\n static IsAsciiLetter(character: string): boolean {\r\n const characterAscii = character.charCodeAt(0);\r\n return (characterAscii - 'A'.charCodeAt(0) & ~0x20) < 26;\r\n }\r\n\r\n static IsAsciiLetterOrDigit(character: string): boolean {\r\n const characterAscii = character.charCodeAt(0);\r\n return (((characterAscii - 'A'.charCodeAt(0)) & ~0x20) < 26) ||\r\n ((characterAscii - '0'.charCodeAt(0)) < 10);\r\n }\r\n}\r\n","import { UriHelper } from './UriHelper.cs';\r\n\r\n// abstract for we do not implement it but helper functions\r\nexport abstract class Uri {\r\n static readonly UriSchemeHttp = 'http';\r\n static readonly UriSchemeHttps = 'https';\r\n static readonly SchemeDelimiter = '://';\r\n\r\n static CheckSchemeName(schemeName: string) {\r\n if (!schemeName || !UriHelper.IsAsciiLetter(schemeName[0])) {\r\n return false;\r\n }\r\n for (let i = schemeName.length; i > 0; --i) {\r\n if (!(UriHelper.IsAsciiLetterOrDigit(schemeName[i])\r\n || (schemeName[i] === '+')\r\n || (schemeName[i] === '-')\r\n || (schemeName[i] === '.'))) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n}\r\n","// Note: We could not just use `New URL(xxx)` to check, for the back-end allows omit protocal. See `FixProtocol` for more information\r\n// You might notice there is not any useful comment -- this is by design! You should read the origional C# code.\r\n\r\nimport { Uri } from '../CSharpPort/Uri.cs';\r\n\r\nenum MarkerMatchType {\r\n NoMarkers = 0,\r\n MatchingMarkers = 1,\r\n NonMatchingMarkers = 2\r\n}\r\n\r\nexport enum UrlValidationError {\r\n InvalidUrlProtocol,\r\n NonMatchingBracesInUrl,\r\n InvalidUrlFormat,\r\n LoopbackUrl\r\n}\r\n\r\nconst UriProtocolSeparator = Uri.SchemeDelimiter;\r\nconst HttpPrefix = Uri.UriSchemeHttp + UriProtocolSeparator;\r\nconst HttpsProtocolPrefix = Uri.UriSchemeHttps + UriProtocolSeparator;\r\n\r\nconst DecimalNumberRegex: RegExp = new RegExp('^(\\\\d+\\\\.){0,2}\\\\d+$');\r\n\r\nconst OpeningMarker = '{';\r\nconst ClosingMarker = '}';\r\n\r\nconst separator = ['\\u002E', '\\u3002', '\\uFF61', '\\uFF0E'];\r\n\r\n// ATTENTION!!!!\r\n// The function signature and implementation is different with origin c# function, only try to keep same logic\r\n// Origin function is `IsValidUrl`\r\nexport function ValidUrl(inputUrl: string): UrlValidationError | undefined {\r\n const match = GetBraceMatchStatus(inputUrl);\r\n if (match === MarkerMatchType.MatchingMarkers) {\r\n return undefined;\r\n }\r\n if (DecimalNumberRegex.test(inputUrl)) {\r\n return UrlValidationError.InvalidUrlFormat;\r\n }\r\n // eslint-disable-next-line no-param-reassign\r\n inputUrl = FixProtocol(inputUrl);\r\n let resultUri: URL | undefined;\r\n try {\r\n resultUri = new URL(inputUrl)\r\n // eslint-disable-next-line no-empty\r\n } catch (error) { }\r\n if (resultUri) {\r\n if (resultUri.protocol !== (`${Uri.UriSchemeHttp}:`) && resultUri.protocol !== (`${Uri.UriSchemeHttps}:`)) {\r\n return UrlValidationError.InvalidUrlProtocol;\r\n }\r\n\r\n // NOT CHECK LOOPBACK ON FRONT-END NOW.\r\n\r\n const labels = resultUri.host.split(new RegExp(`${separator.map(s => `\\\\${s}`).join('|')}`));\r\n if (labels.length === 1) {\r\n return UrlValidationError.InvalidUrlFormat;\r\n }\r\n\r\n return undefined;\r\n }\r\n return UrlValidationError.InvalidUrlFormat;\r\n}\r\n\r\nfunction GetBraceMatchStatus(word: string): MarkerMatchType {\r\n let openingMarkercount: number = 0;\r\n let closingMarkerCount: number = 0;\r\n if (word) {\r\n for (let index = 0; index < word.length && openingMarkercount >= closingMarkerCount; index++) {\r\n const char = word[index];\r\n if (char === OpeningMarker) openingMarkercount += 1;\r\n else if (char === ClosingMarker) closingMarkerCount += 1;\r\n }\r\n if (openingMarkercount > 0 || closingMarkerCount > 0) {\r\n return openingMarkercount === closingMarkerCount ? MarkerMatchType.MatchingMarkers : MarkerMatchType.NonMatchingMarkers;\r\n }\r\n }\r\n\r\n return MarkerMatchType.NoMarkers;\r\n}\r\n\r\nfunction FixProtocol(inputURL: string): string {\r\n if (inputURL != null\r\n && !inputURL.toLowerCase().startsWith(HttpPrefix)\r\n && !inputURL.toLowerCase().startsWith(HttpsProtocolPrefix)\r\n ) {\r\n let prefixDefaultProtocol = false;\r\n const protocolIndex = inputURL.indexOf(UriProtocolSeparator);\r\n if (protocolIndex !== -1) {\r\n const scheme: string = inputURL.substring(0, protocolIndex);\r\n if (!Uri.CheckSchemeName(scheme)) {\r\n prefixDefaultProtocol = true;\r\n }\r\n } else {\r\n prefixDefaultProtocol = true;\r\n }\r\n\r\n if (prefixDefaultProtocol) {\r\n // eslint-disable-next-line no-param-reassign\r\n inputURL = HttpPrefix + inputURL;\r\n }\r\n }\r\n return inputURL;\r\n}\r\n","interface BuildTreeViewParams {\r\n items: T[];\r\n getPrimaryKeyOfItem: (item: T) => number;\r\n // return `undefined` iff it is the root\r\n getParentKeyOfItem: (item: T) => number | undefined | null;\r\n expandedItemIds: Set;\r\n}\r\n\r\nexport interface TreeViewInfo {\r\n // whether this row has children\r\n hasChildren: boolean;\r\n // the depth of this row\r\n depth: number;\r\n // whether this row is expanded, `undefined` iff `hasChildren` is false\r\n // Note: This does mean we do not need `hasChildren`, but we choose to have that for better semantic\r\n isExpanded?: boolean;\r\n // The parent node of current node. `undefined` iff current node is root.\r\n parent: WithTreeViewData | undefined;\r\n children: WithTreeViewData[];\r\n}\r\n\r\nexport type WithTreeViewData = T & {\r\n treeViewInfo: TreeViewInfo;\r\n}\r\n\r\nconst dummyRootId = 0;\r\n\r\n/**\r\n * Limitation: The tree view should not have pagination\r\n *\r\n * Assuming, Why and How it works: We rebuild a tree from an array of nodes.\r\n * To do this, we need to know\r\n * 1. The ID of the node.\r\n * 2. The ID of the parent node of the node.\r\n * Why ID: To build the tree from the response, reference equal is impossiable to use. ID is necessary.\r\n * Why parent node ID: to rebuild a tree, we need either the children of a node, or the parent of the node.\r\n *\r\n * The function is not pure.\r\n *\r\n * Not use `IGroup` of the DetailsList, we do want to show data for group row.\r\n */\r\nexport function buildTreeViewItems(params: BuildTreeViewParams): WithTreeViewData[] {\r\n const {\r\n items, getParentKeyOfItem, getPrimaryKeyOfItem, expandedItemIds,\r\n } = params;\r\n const nodeById = new Map();\r\n\r\n if (items.length === 0) { return []; }\r\n\r\n items.forEach((item) => {\r\n nodeById.set(getPrimaryKeyOfItem(item), item);\r\n });\r\n\r\n const childrenIdByNodeId = getNodesWithChildren();\r\n\r\n // now root and children of keys are known, return data by order\r\n\r\n // The real root should be the only child of dummy root.\r\n const rootId = childrenIdByNodeId.get(dummyRootId)![0];\r\n\r\n const res: WithTreeViewData[] = [];\r\n\r\n // always traverse the whole tree to attach extra data to all nodes\r\n function buildTree(nodeId: number, parentNode: T | undefined, currentLevel: number) {\r\n const rootNode = nodeById.get(nodeId)!;\r\n (rootNode as any as WithTreeViewData).treeViewInfo = {\r\n depth: currentLevel,\r\n hasChildren: childrenIdByNodeId.has(nodeId),\r\n isExpanded: childrenIdByNodeId.has(nodeId) ? expandedItemIds.has(nodeId) : undefined,\r\n parent: parentNode as WithTreeViewData,\r\n children: [],\r\n };\r\n\r\n // root node is always visiable\r\n // if node's parent is expanded, the node is visible.\r\n const isCurrentNodeVisiable = !getParentKeyOfItem(rootNode) || expandedItemIds.has(getParentKeyOfItem(rootNode)!);\r\n\r\n if (isCurrentNodeVisiable) {\r\n res.push(rootNode as any as WithTreeViewData);\r\n }\r\n\r\n const childrenIds = childrenIdByNodeId.get(nodeId);\r\n\r\n childrenIds?.forEach((childId) => {\r\n (rootNode as any as WithTreeViewData).treeViewInfo.children.push(nodeById.get(childId) as any);\r\n buildTree(childId, rootNode, currentLevel + 1);\r\n });\r\n }\r\n\r\n buildTree(rootId, undefined, 1);\r\n\r\n return res;\r\n\r\n // Return a map whose key is the ID of the node, the value is an array of IDs of its children nodes.\r\n // leaf does not have correspond key.\r\n function getNodesWithChildren() {\r\n const map = new Map();\r\n items.forEach((item) => {\r\n const primaryKey = getPrimaryKeyOfItem(item);\r\n // 0 is the dummy root\r\n const parentKey = getParentKeyOfItem(item) ?? dummyRootId;\r\n\r\n // initial\r\n if (!map.has(parentKey)) {\r\n map.set(parentKey, []);\r\n }\r\n\r\n // insert children\r\n const childrenKeys = map.get(parentKey);\r\n\r\n childrenKeys!.push(primaryKey);\r\n })\r\n return map;\r\n }\r\n}\r\n\r\nexport function isLeaf(item: WithTreeViewData): boolean { return item.treeViewInfo.children.length === 0; }\r\n\r\nexport function isRoot(item: WithTreeViewData): boolean { return item.treeViewInfo.parent === undefined; }\r\n\r\nexport function getRootOfNode(item: WithTreeViewData): WithTreeViewData {\r\n let node = item;\r\n while (!isRoot(node)) {\r\n node = node.treeViewInfo.parent!;\r\n }\r\n return node;\r\n}\r\n\r\nexport function getSiblingsOfNode(item: WithTreeViewData): WithTreeViewData[] | undefined {\r\n if (isRoot(item)) { return undefined; }\r\n return item.treeViewInfo.parent!.treeViewInfo.children.filter(child => child !== item);\r\n}\r\n\r\nexport function getAllChildrenOfNode(item: WithTreeViewData): WithTreeViewData[] {\r\n const res: WithTreeViewData[] = [];\r\n traverseTreeByPreOrder(item, currentItem => res.push(currentItem));\r\n return res.filter(cur => cur !== item);\r\n}\r\n\r\nexport function traverseTreeByPreOrder(root: WithTreeViewData, action: (item: WithTreeViewData) => void) {\r\n action(root);\r\n root.treeViewInfo.children.forEach((child) => {\r\n traverseTreeByPreOrder(child, action);\r\n });\r\n}\r\n","/* eslint-disable no-param-reassign */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable no-undef */\r\n/* eslint-disable react/sort-comp */\r\n/* eslint-disable react/require-default-props */\r\n/* eslint-disable react/no-unused-prop-types */\r\n// / The whole file is a fork of SelectionZone.tsx from fluentui\r\n// / The main purpose is to provide more controls to support tree view selection\r\n\r\nimport {\r\n Async,\r\n EventGroup,\r\n KeyCodes,\r\n elementContains,\r\n findScrollableParent,\r\n getParent,\r\n getDocument,\r\n getWindow,\r\n isElementTabbable,\r\n initializeComponentRef,\r\n FocusRects,\r\n ISelection,\r\n IObjectWithKey,\r\n SelectionMode,\r\n} from '@fluentui/react';\r\nimport * as React from 'react';\r\n\r\n// Selection definitions:\r\n//\r\n// Anchor index: the point from which a range selection starts.\r\n// Focus index: the point from which layout movement originates from.\r\n//\r\n// These two can differ. Tests:\r\n//\r\n// If you start at index 5\r\n// Shift click to index 10\r\n// The focus is 10, the anchor is 5.\r\n// If you shift click at index 0\r\n// The anchor remains at 5, the items between 0 and 5 are selected and everything else is cleared.\r\n// If you click index 8\r\n// The anchor and focus are set to 8.\r\n\r\nconst SELECTION_DISABLED_ATTRIBUTE_NAME = 'data-selection-disabled';\r\nconst SELECTION_INDEX_ATTRIBUTE_NAME = 'data-selection-index';\r\nconst SELECTION_TOGGLE_ATTRIBUTE_NAME = 'data-selection-toggle';\r\nconst SELECTION_INVOKE_ATTRIBUTE_NAME = 'data-selection-invoke';\r\nconst SELECTION_INVOKE_TOUCH_ATTRIBUTE_NAME = 'data-selection-touch-invoke';\r\nconst SELECTALL_TOGGLE_ALL_ATTRIBUTE_NAME = 'data-selection-all-toggle';\r\nconst SELECTION_SELECT_ATTRIBUTE_NAME = 'data-selection-select';\r\n\r\n/**\r\n * {@docCategory Selection}\r\n */\r\nexport interface ITreeViewSelectionZoneProps extends React.ClassAttributes {\r\n /**\r\n * Reference to the component interface.\r\n */\r\n componentRef?: () => void;\r\n /**\r\n * Required {@link ISelection} instance bound to the {@link TreeViewSelectionZone}.\r\n */\r\n selection: ISelection;\r\n /**\r\n * @deprecated No longer in use, focus is now managed by {@link FocusZone}.\r\n */\r\n layout?: {};\r\n /**\r\n * The mode of Selection, where the value is one of\r\n * 'none', 'single', or 'multiple'.\r\n *\r\n * @defaultvalue {@link SelectionMode.multiple}\r\n */\r\n selectionMode?: SelectionMode;\r\n /**\r\n * If true, selection is preserved on outer click.\r\n */\r\n selectionPreservedOnEmptyClick?: boolean;\r\n /**\r\n * If true, disables automatic selection on input elements.\r\n */\r\n disableAutoSelectOnInputElements?: boolean;\r\n /**\r\n * If true, modal selection is enabled on touch event.\r\n */\r\n enterModalOnTouch?: boolean;\r\n /**\r\n * Determines whether elements with the attribute `data-selection-touch-invoke` should be used as invocation targets\r\n * for an item if the user is using touch.\r\n *\r\n * @defaultvalue false\r\n */\r\n enableTouchInvocationTarget?: boolean;\r\n /**\r\n * Determines if an item is selected on focus.\r\n *\r\n * @defaultvalue true\r\n */\r\n isSelectedOnFocus?: boolean;\r\n /**\r\n * Determines if elements within the selection zone that DO NOT have the 'data-selection-toggle' or\r\n * 'data-selection-all-toggle' attribute are clickable and can alter the selection.\r\n *\r\n * @defaultvalue true\r\n */\r\n selectionClearedOnSurfaceClick?: boolean;\r\n /**\r\n * Optional callback for when an item is\r\n * invoked via ENTER or double-click.\r\n */\r\n onItemInvoked?: (item?: IObjectWithKey, index?: number, ev?: Event) => void;\r\n /**\r\n * Optional callback for when an\r\n * item's contextual menu action occurs.\r\n */\r\n onItemContextMenu?: (item?: any, index?: number, ev?: Event) => void | boolean;\r\n /**\r\n * Additional CSS class(es) to apply to the TreeViewSelectionZone.\r\n */\r\n className?: string;\r\n\r\n // NEW ADDED:\r\n onToggleSelected?: (selection: ISelection, index: number, ev: React.SyntheticEvent) => void;\r\n}\r\n\r\n/**\r\n * {@docCategory Selection}\r\n */\r\nexport interface ITreeViewSelectionZoneState {\r\n isModal: boolean | undefined;\r\n}\r\n\r\n/**\r\n * {@docCategory Selection}\r\n */\r\nexport class TreeViewSelectionZone extends React.Component {\r\n public static defaultProps = {\r\n isSelectedOnFocus: true,\r\n selectionMode: SelectionMode.multiple,\r\n };\r\n\r\n private _async: Async;\r\n private _events: EventGroup;\r\n private _root = React.createRef();\r\n private _isCtrlPressed: boolean = false;\r\n private _isShiftPressed: boolean = false;\r\n private _isMetaPressed: boolean = false;\r\n private _isTabPressed: boolean = false;\r\n private _shouldHandleFocus: boolean = false;\r\n private _shouldHandleFocusTimeoutId: number | undefined;\r\n private _isTouch: boolean = false;\r\n private _isTouchTimeoutId: number | undefined;\r\n\r\n public static getDerivedStateFromProps(\r\n nextProps: ITreeViewSelectionZoneProps,\r\n prevState: ITreeViewSelectionZoneState\r\n ): ITreeViewSelectionZoneState {\r\n const isModal = nextProps.selection.isModal && nextProps.selection.isModal();\r\n\r\n return {\r\n ...prevState,\r\n isModal,\r\n };\r\n }\r\n\r\n constructor(props: ITreeViewSelectionZoneProps) {\r\n super(props);\r\n\r\n this._events = new EventGroup(this);\r\n this._async = new Async(this);\r\n initializeComponentRef(this);\r\n\r\n const { selection } = this.props;\r\n\r\n // Reflect the initial modal state of selection into the state.\r\n const isModal = selection.isModal && selection.isModal();\r\n\r\n this.state = {\r\n isModal,\r\n };\r\n }\r\n\r\n public componentDidMount(): void {\r\n const win = getWindow(this._root.current);\r\n\r\n // Track the latest modifier keys globally.\r\n this._events.on(win, 'keydown, keyup', this._updateModifiers, true);\r\n this._events.on(document, 'click', this._findScrollParentAndTryClearOnEmptyClick);\r\n this._events.on(document.body, 'touchstart', this._onTouchStartCapture, true);\r\n this._events.on(document.body, 'touchend', this._onTouchStartCapture, true);\r\n\r\n // Subscribe to the selection to keep modal state updated.\r\n this._events.on(this.props.selection, 'change', this._onSelectionChange);\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { isModal } = this.state;\r\n\r\n return (\r\n \r\n {this.props.children}\r\n \r\n
\r\n );\r\n }\r\n\r\n public componentDidUpdate(previousProps: ITreeViewSelectionZoneProps): void {\r\n const { selection } = this.props;\r\n\r\n if (selection !== previousProps.selection) {\r\n // Whenever selection changes, update the subscripton to keep modal state updated.\r\n this._events.off(previousProps.selection);\r\n this._events.on(selection, 'change', this._onSelectionChange);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n this._events.dispose();\r\n this._async.dispose();\r\n }\r\n\r\n /**\r\n * In some cases, the consuming scenario requires to set focus on a row without having TreeViewSelectionZone\r\n * react to the event. Note that focus events in IE \\<= 11 will occur asynchronously after .focus() has\r\n * been called on an element, so we need a flag to store the idea that we will bypass the \"next\"\r\n * focus event that occurs. This method does that.\r\n */\r\n public ignoreNextFocus = (): void => {\r\n this._handleNextFocus(false);\r\n };\r\n\r\n private _onSelectionChange = (): void => {\r\n const { selection } = this.props;\r\n\r\n const isModal = selection.isModal && selection.isModal();\r\n\r\n this.setState({\r\n isModal,\r\n });\r\n };\r\n\r\n private _onMouseDownCapture = (ev: React.MouseEvent): void => {\r\n let target = ev.target as HTMLElement;\r\n\r\n if (document.activeElement !== target && !elementContains(document.activeElement as HTMLElement, target)) {\r\n this.ignoreNextFocus();\r\n return;\r\n }\r\n\r\n if (!elementContains(target, this._root.current)) {\r\n return;\r\n }\r\n\r\n while (target !== this._root.current) {\r\n if (this._hasAttribute(target, SELECTION_INVOKE_ATTRIBUTE_NAME)) {\r\n this.ignoreNextFocus();\r\n break;\r\n }\r\n\r\n target = getParent(target) as HTMLElement;\r\n }\r\n };\r\n\r\n /**\r\n * When we focus an item, for single/multi select scenarios, we should try to select it immediately\r\n * as long as the focus did not originate from a mouse down/touch event. For those cases, we handle them\r\n * specially.\r\n */\r\n private _onFocus = (ev: React.FocusEvent): void => {\r\n const target = ev.target as HTMLElement;\r\n const { selection } = this.props;\r\n const isToggleModifierPressed = this._isCtrlPressed || this._isMetaPressed;\r\n\r\n const selectionMode = this._getSelectionMode();\r\n\r\n if (this._shouldHandleFocus && selectionMode !== SelectionMode.none) {\r\n const isToggle = this._hasAttribute(target, SELECTION_TOGGLE_ATTRIBUTE_NAME);\r\n const itemRoot = this._findItemRoot(target);\r\n\r\n if (!isToggle && itemRoot) {\r\n const index = this._getItemIndex(itemRoot);\r\n\r\n if (isToggleModifierPressed) {\r\n // set anchor only.\r\n selection.setIndexSelected(index, selection.isIndexSelected(index), true);\r\n if (this.props.enterModalOnTouch && this._isTouch && selection.setModal) {\r\n selection.setModal(true);\r\n this._setIsTouch(false);\r\n }\r\n } else if (this.props.isSelectedOnFocus) {\r\n this._onItemSurfaceClick(ev, index);\r\n }\r\n }\r\n }\r\n\r\n this._handleNextFocus(false);\r\n };\r\n\r\n private _onMouseDown = (ev: React.MouseEvent): void => {\r\n this._updateModifiers(ev);\r\n\r\n let target = ev.target as HTMLElement;\r\n const itemRoot = this._findItemRoot(target);\r\n\r\n // No-op if selection is disabled\r\n if (this._isSelectionDisabled(target)) {\r\n return;\r\n }\r\n\r\n while (target !== this._root.current) {\r\n if (this._hasAttribute(target, SELECTALL_TOGGLE_ALL_ATTRIBUTE_NAME)) {\r\n break;\r\n } else if (itemRoot) {\r\n if (this._hasAttribute(target, SELECTION_TOGGLE_ATTRIBUTE_NAME)) {\r\n break;\r\n } else if (this._hasAttribute(target, SELECTION_INVOKE_ATTRIBUTE_NAME)) {\r\n break;\r\n } else if (\r\n (target === itemRoot || this._shouldAutoSelect(target)) &&\r\n !this._isShiftPressed &&\r\n !this._isCtrlPressed &&\r\n !this._isMetaPressed\r\n ) {\r\n this._onInvokeMouseDown(ev, this._getItemIndex(itemRoot));\r\n break;\r\n } else if (\r\n this.props.disableAutoSelectOnInputElements &&\r\n (target.tagName === 'A' || target.tagName === 'BUTTON' || target.tagName === 'INPUT')\r\n ) {\r\n return;\r\n }\r\n }\r\n\r\n target = getParent(target) as HTMLElement;\r\n }\r\n };\r\n\r\n private _onTouchStartCapture = (ev: React.TouchEvent): void => {\r\n this._setIsTouch(true);\r\n };\r\n\r\n private _onClick = (ev: React.MouseEvent): void => {\r\n const { enableTouchInvocationTarget = false } = this.props;\r\n\r\n this._updateModifiers(ev);\r\n\r\n let target = ev.target as HTMLElement;\r\n const itemRoot = this._findItemRoot(target);\r\n\r\n const isSelectionDisabled = this._isSelectionDisabled(target);\r\n\r\n while (target !== this._root.current) {\r\n if (this._hasAttribute(target, SELECTALL_TOGGLE_ALL_ATTRIBUTE_NAME)) {\r\n if (!isSelectionDisabled) {\r\n this._onToggleAllClick(ev);\r\n }\r\n break;\r\n } else if (itemRoot) {\r\n const index = this._getItemIndex(itemRoot);\r\n\r\n if (this._hasAttribute(target, SELECTION_TOGGLE_ATTRIBUTE_NAME)) {\r\n if (!isSelectionDisabled) {\r\n if (this._isShiftPressed) {\r\n this._onItemSurfaceClick(ev, index);\r\n } else {\r\n this._onToggleClick(ev, index);\r\n }\r\n }\r\n break;\r\n } else if (\r\n (this._isTouch &&\r\n enableTouchInvocationTarget &&\r\n this._hasAttribute(target, SELECTION_INVOKE_TOUCH_ATTRIBUTE_NAME)) ||\r\n this._hasAttribute(target, SELECTION_INVOKE_ATTRIBUTE_NAME)\r\n ) {\r\n // Items should be invokable even if selection is disabled.\r\n this._onInvokeClick(ev, index);\r\n break;\r\n } else if (target === itemRoot) {\r\n if (!isSelectionDisabled) {\r\n this._onItemSurfaceClick(ev, index);\r\n }\r\n break;\r\n } else if (target.tagName === 'A' || target.tagName === 'BUTTON' || target.tagName === 'INPUT') {\r\n return;\r\n }\r\n }\r\n\r\n target = getParent(target) as HTMLElement;\r\n }\r\n };\r\n\r\n private _onContextMenu = (ev: React.MouseEvent): void => {\r\n const target = ev.target as HTMLElement;\r\n\r\n const { onItemContextMenu, selection } = this.props;\r\n if (onItemContextMenu) {\r\n const itemRoot = this._findItemRoot(target);\r\n\r\n if (itemRoot) {\r\n const index = this._getItemIndex(itemRoot);\r\n\r\n this._onInvokeMouseDown(ev, index);\r\n\r\n const skipPreventDefault = onItemContextMenu(selection.getItems()[index], index, ev.nativeEvent);\r\n\r\n // In order to keep back compat, if the value here is undefined, then we should still\r\n // call preventDefault(). Only in the case where true is explicitly returned should\r\n // the call be skipped.\r\n if (!skipPreventDefault) {\r\n ev.preventDefault();\r\n }\r\n }\r\n }\r\n };\r\n\r\n private _isSelectionDisabled(target: HTMLElement): boolean {\r\n if (this._getSelectionMode() === SelectionMode.none) {\r\n return true;\r\n }\r\n\r\n while (target !== this._root.current) {\r\n if (this._hasAttribute(target, SELECTION_DISABLED_ATTRIBUTE_NAME)) {\r\n return true;\r\n }\r\n target = getParent(target) as HTMLElement;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * In multi selection, if you double click within an item's root (but not within the invoke element or\r\n * input elements), we should execute the invoke handler.\r\n */\r\n private _onDoubleClick = (ev: React.MouseEvent): void => {\r\n let target = ev.target as HTMLElement;\r\n\r\n const { onItemInvoked } = this.props;\r\n const itemRoot = this._findItemRoot(target);\r\n\r\n if (itemRoot && onItemInvoked && !this._isInputElement(target)) {\r\n const index = this._getItemIndex(itemRoot);\r\n\r\n while (target !== this._root.current) {\r\n if (\r\n this._hasAttribute(target, SELECTION_TOGGLE_ATTRIBUTE_NAME) ||\r\n this._hasAttribute(target, SELECTION_INVOKE_ATTRIBUTE_NAME)\r\n ) {\r\n break;\r\n } else if (target === itemRoot) {\r\n this._onInvokeClick(ev, index);\r\n break;\r\n }\r\n\r\n target = getParent(target) as HTMLElement;\r\n }\r\n\r\n target = getParent(target) as HTMLElement;\r\n }\r\n };\r\n\r\n private _onKeyDownCapture = (ev: React.KeyboardEvent): void => {\r\n this._updateModifiers(ev);\r\n\r\n this._handleNextFocus(true);\r\n };\r\n\r\n private _onKeyDown = (ev: React.KeyboardEvent): boolean | undefined => {\r\n this._updateModifiers(ev);\r\n\r\n let target = ev.target as HTMLElement;\r\n\r\n const isSelectionDisabled = this._isSelectionDisabled(target);\r\n\r\n const { selection } = this.props;\r\n const isSelectAllKey = ev.which === KeyCodes.a && (this._isCtrlPressed || this._isMetaPressed);\r\n const isClearSelectionKey = ev.which === KeyCodes.escape;\r\n\r\n // Ignore key downs from input elements.\r\n if (this._isInputElement(target)) {\r\n // A key was pressed while an item in this zone was focused.\r\n return;\r\n }\r\n\r\n const selectionMode = this._getSelectionMode();\r\n\r\n // If ctrl-a is pressed, select all (if all are not already selected.)\r\n if (isSelectAllKey && selectionMode === SelectionMode.multiple && !selection.isAllSelected()) {\r\n if (!isSelectionDisabled) {\r\n selection.setAllSelected(true);\r\n }\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n return;\r\n }\r\n\r\n // If escape is pressed, clear selection (if any are selected.)\r\n if (isClearSelectionKey && selection.getSelectedCount() > 0) {\r\n if (!isSelectionDisabled) {\r\n selection.setAllSelected(false);\r\n }\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n return;\r\n }\r\n\r\n const itemRoot = this._findItemRoot(target);\r\n\r\n // If a key was pressed within an item, we should treat \"enters\" as invokes and \"space\" as toggle\r\n if (itemRoot) {\r\n const index = this._getItemIndex(itemRoot);\r\n\r\n while (target !== this._root.current) {\r\n if (this._hasAttribute(target, SELECTION_TOGGLE_ATTRIBUTE_NAME)) {\r\n // For toggle elements, assuming they are rendered as buttons, they will generate a click event,\r\n // so we can no-op for any keydowns in this case.\r\n break;\r\n } else if (this._shouldAutoSelect(target)) {\r\n if (!isSelectionDisabled) {\r\n // If the event went to an element which should trigger auto-select, select it and then let\r\n // the default behavior kick in.\r\n this._onInvokeMouseDown(ev, index);\r\n }\r\n break;\r\n } else if (\r\n (ev.which === KeyCodes.enter || ev.which === KeyCodes.space) &&\r\n (target.tagName === 'BUTTON' || target.tagName === 'A' || target.tagName === 'INPUT')\r\n ) {\r\n // eslint-disable-next-line consistent-return\r\n return false;\r\n } else if (target === itemRoot) {\r\n if (ev.which === KeyCodes.enter) {\r\n // Items should be invokable even if selection is disabled.\r\n this._onInvokeClick(ev, index);\r\n ev.preventDefault();\r\n return;\r\n } else if (ev.which === KeyCodes.space) {\r\n if (!isSelectionDisabled) {\r\n this._onToggleClick(ev, index);\r\n }\r\n ev.preventDefault();\r\n return;\r\n }\r\n break;\r\n }\r\n\r\n target = getParent(target) as HTMLElement;\r\n }\r\n }\r\n };\r\n\r\n private _onToggleAllClick(ev: React.MouseEvent): void {\r\n const { selection } = this.props;\r\n\r\n const selectionMode = this._getSelectionMode();\r\n\r\n if (selectionMode === SelectionMode.multiple) {\r\n selection.toggleAllSelected();\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n }\r\n }\r\n\r\n private _onToggleClick(ev: React.MouseEvent | React.KeyboardEvent, index: number): void {\r\n const { selection, onToggleSelected } = this.props;\r\n\r\n const selectionMode = this._getSelectionMode();\r\n\r\n selection.setChangeEvents(false);\r\n\r\n if (this.props.enterModalOnTouch && this._isTouch && !selection.isIndexSelected(index) && selection.setModal) {\r\n selection.setModal(true);\r\n this._setIsTouch(false);\r\n }\r\n\r\n if (selectionMode === SelectionMode.multiple) {\r\n const items = selection.getItems();\r\n if (onToggleSelected) {\r\n onToggleSelected(selection, index, ev);\r\n } else {\r\n selection.toggleIndexSelected(index);\r\n }\r\n } else if (selectionMode === SelectionMode.single) {\r\n const isSelected = selection.isIndexSelected(index);\r\n const isModal = selection.isModal && selection.isModal();\r\n selection.setAllSelected(false);\r\n selection.setIndexSelected(index, !isSelected, true);\r\n if (isModal && selection.setModal) {\r\n // Since the above call to setAllSelected(false) clears modal state,\r\n // restore it. This occurs because the SelectionMode of the Selection\r\n // may differ from the TreeViewSelectionZone.\r\n selection.setModal(true);\r\n }\r\n } else {\r\n selection.setChangeEvents(true);\r\n return;\r\n }\r\n\r\n selection.setChangeEvents(true);\r\n\r\n ev.stopPropagation();\r\n\r\n // NOTE: ev.preventDefault is not called for toggle clicks, because this will kill the browser behavior\r\n // for checkboxes if you use a checkbox for the toggle.\r\n }\r\n\r\n private _onInvokeClick(ev: React.MouseEvent | React.KeyboardEvent, index: number): void {\r\n const { selection, onItemInvoked } = this.props;\r\n\r\n if (onItemInvoked) {\r\n onItemInvoked(selection.getItems()[index], index, ev.nativeEvent);\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n }\r\n }\r\n\r\n private _onItemSurfaceClick(ev: React.SyntheticEvent, index: number): void {\r\n const { selection, onToggleSelected } = this.props;\r\n const isToggleModifierPressed = this._isCtrlPressed || this._isMetaPressed;\r\n\r\n const selectionMode = this._getSelectionMode();\r\n\r\n if (selectionMode === SelectionMode.multiple) {\r\n if (this._isShiftPressed && !this._isTabPressed) {\r\n selection.selectToIndex(index, !isToggleModifierPressed);\r\n } else if (onToggleSelected) {\r\n onToggleSelected(selection, index, ev);\r\n } else {\r\n selection.toggleIndexSelected(index);\r\n }\r\n } else if (selectionMode === SelectionMode.single) {\r\n this._clearAndSelectIndex(index);\r\n }\r\n }\r\n\r\n private _onInvokeMouseDown(\r\n ev: React.MouseEvent | React.KeyboardEvent,\r\n index: number\r\n ): void {\r\n const { selection } = this.props;\r\n\r\n // Only do work if item is not selected.\r\n if (selection.isIndexSelected(index)) {\r\n return;\r\n }\r\n\r\n this._clearAndSelectIndex(index);\r\n }\r\n\r\n /**\r\n * To avoid high startup cost of traversing the DOM on component mount,\r\n * defer finding the scrollable parent until a click interaction.\r\n *\r\n * The styles will probably already calculated since we're running in a click handler,\r\n * so this is less likely to cause layout thrashing then doing it in mount.\r\n */\r\n private _findScrollParentAndTryClearOnEmptyClick(ev: MouseEvent) {\r\n const scrollParent = findScrollableParent(this._root.current) as HTMLElement;\r\n // unbind this handler and replace binding with a binding on the actual scrollable parent\r\n this._events.off(document, 'click', this._findScrollParentAndTryClearOnEmptyClick);\r\n this._events.on(scrollParent, 'click', this._tryClearOnEmptyClick);\r\n\r\n // If we clicked inside the scrollable parent, call through to the handler on this click.\r\n if ((scrollParent && ev.target instanceof Node && scrollParent.contains(ev.target)) || scrollParent === ev.target) {\r\n this._tryClearOnEmptyClick(ev);\r\n }\r\n }\r\n\r\n private _tryClearOnEmptyClick(ev: MouseEvent): void {\r\n if (!this.props.selectionPreservedOnEmptyClick && this._isNonHandledClick(ev.target as HTMLElement)) {\r\n this.props.selection.setAllSelected(false);\r\n }\r\n }\r\n\r\n private _clearAndSelectIndex(index: number): void {\r\n const { selection, selectionClearedOnSurfaceClick = true } = this.props;\r\n const isAlreadySingleSelected = selection.getSelectedCount() === 1 && selection.isIndexSelected(index);\r\n\r\n if (!isAlreadySingleSelected && selectionClearedOnSurfaceClick) {\r\n const isModal = selection.isModal && selection.isModal();\r\n selection.setChangeEvents(false);\r\n selection.setAllSelected(false);\r\n selection.setIndexSelected(index, true, true);\r\n if (isModal || (this.props.enterModalOnTouch && this._isTouch)) {\r\n if (selection.setModal) {\r\n selection.setModal(true);\r\n }\r\n if (this._isTouch) {\r\n this._setIsTouch(false);\r\n }\r\n }\r\n selection.setChangeEvents(true);\r\n }\r\n }\r\n\r\n /**\r\n * We need to track the modifier key states so that when focus events occur, which do not contain\r\n * modifier states in the Event object, we know how to behave.\r\n */\r\n private _updateModifiers(ev: React.KeyboardEvent | React.MouseEvent): void {\r\n this._isShiftPressed = ev.shiftKey;\r\n this._isCtrlPressed = ev.ctrlKey;\r\n this._isMetaPressed = ev.metaKey;\r\n\r\n const { keyCode } = (ev as React.KeyboardEvent);\r\n this._isTabPressed = keyCode ? keyCode === KeyCodes.tab : false;\r\n }\r\n\r\n private _findItemRoot(target: HTMLElement): HTMLElement | undefined {\r\n const { selection } = this.props;\r\n\r\n while (target !== this._root.current) {\r\n const indexValue = target.getAttribute(SELECTION_INDEX_ATTRIBUTE_NAME);\r\n const index = Number(indexValue);\r\n\r\n if (indexValue !== null && index >= 0 && index < selection.getItems().length) {\r\n break;\r\n }\r\n\r\n target = getParent(target) as HTMLElement;\r\n }\r\n\r\n if (target === this._root.current) {\r\n return undefined;\r\n }\r\n\r\n return target;\r\n }\r\n\r\n private _getItemIndex(itemRoot: HTMLElement): number {\r\n return Number(itemRoot.getAttribute(SELECTION_INDEX_ATTRIBUTE_NAME));\r\n }\r\n\r\n private _shouldAutoSelect(element: HTMLElement): boolean {\r\n return this._hasAttribute(element, SELECTION_SELECT_ATTRIBUTE_NAME);\r\n }\r\n\r\n private _hasAttribute(element: HTMLElement, attributeName: string): boolean {\r\n let isToggle = false;\r\n\r\n while (!isToggle && element !== this._root.current) {\r\n isToggle = element.getAttribute(attributeName) === 'true';\r\n element = getParent(element) as HTMLElement;\r\n }\r\n\r\n return isToggle;\r\n }\r\n\r\n private _isInputElement(element: HTMLElement): boolean {\r\n return element.tagName === 'INPUT' || element.tagName === 'TEXTAREA';\r\n }\r\n\r\n private _isNonHandledClick(element: HTMLElement): boolean {\r\n const doc = getDocument();\r\n\r\n if (doc && element) {\r\n while (element && element !== doc.documentElement) {\r\n if (isElementTabbable(element)) {\r\n return false;\r\n }\r\n\r\n element = getParent(element) as HTMLElement;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _handleNextFocus(handleFocus: boolean): void {\r\n if (this._shouldHandleFocusTimeoutId) {\r\n this._async.clearTimeout(this._shouldHandleFocusTimeoutId);\r\n this._shouldHandleFocusTimeoutId = undefined;\r\n }\r\n\r\n this._shouldHandleFocus = handleFocus;\r\n\r\n if (handleFocus) {\r\n this._async.setTimeout(() => {\r\n this._shouldHandleFocus = false;\r\n }, 100);\r\n }\r\n }\r\n\r\n private _setIsTouch(isTouch: boolean): void {\r\n if (this._isTouchTimeoutId) {\r\n this._async.clearTimeout(this._isTouchTimeoutId);\r\n this._isTouchTimeoutId = undefined;\r\n }\r\n\r\n this._isTouch = true;\r\n\r\n if (isTouch) {\r\n this._async.setTimeout(() => {\r\n this._isTouch = false;\r\n }, 300);\r\n }\r\n }\r\n\r\n private _getSelectionMode(): SelectionMode {\r\n const { selection } = this.props;\r\n\r\n const { selectionMode = selection ? selection.mode : SelectionMode.none } = this.props;\r\n\r\n return selectionMode;\r\n }\r\n}\r\n","import React, { useMemo, useState } from 'react';\r\nimport { Selection, } from '@fluentui/react';\r\nimport { getAllChildrenOfNode, getRootOfNode, getSiblingsOfNode, isLeaf, WithTreeViewData } from './treeViewHelper';\r\nimport { TreeViewSelectionZone } from './TreeViewSelectionZone';\r\n\r\ninterface Item {\r\n Id: number;\r\n [custom: string]: any;\r\n}\r\n\r\ntype UseTreeViewSelectionProps = {\r\n isTreeView: false;\r\n items: Item[];\r\n} | {\r\n isTreeView: true;\r\n items: WithTreeViewData[];\r\n}\r\n\r\nfunction getKey(item: Item) { return item.Id }\r\n\r\nexport function useTreeViewSelection(props: UseTreeViewSelectionProps) {\r\n const { isTreeView, items } = props;\r\n const [selectedRowIds, setSelectedRowIds] = useState(new Set());\r\n\r\n const selection = useMemo(() => new Selection({\r\n getKey,\r\n }), [isTreeView]);\r\n\r\n // update selections\r\n if (isTreeView) {\r\n const isSelectionZoneAllSelected = selection.isAllSelected();\r\n // TODO: remove this `as any` after upgrade TS to a new version.\r\n const rootId = items.length !== 0 ? getKey(getRootOfNode(items[0] as any)) : undefined;\r\n const isAllReallySelected = rootId ? selectedRowIds.has(rootId) : false;\r\n // if the state not match, need to trigger the event to update `SelectAll Checkbox` in the grid\r\n const isEventTriggered = isSelectionZoneAllSelected !== isAllReallySelected;\r\n selection.setChangeEvents(false);\r\n selection.setItems(items);\r\n selectedRowIds.forEach((id) => {\r\n selection.setKeySelected(id.toString(), true, false);\r\n })\r\n selection.setChangeEvents(true, !isEventTriggered);\r\n }\r\n\r\n const finalSelection: any = isTreeView ? selection : undefined;\r\n\r\n return {\r\n selection: finalSelection,\r\n disableSelectionZone: isTreeView,\r\n listProps: !isTreeView ? undefined : {\r\n // eslint-disable-next-line @typescript-eslint/no-shadow\r\n onRenderRoot: (props) => {\r\n const { rootRef, surfaceElement, divProps } = props;\r\n return (\r\n {\r\n const item = items[index];\r\n const selectionKeyOfItem = getKey(item);\r\n // Trigger click event on the checkbox to imitate `Group` in DetailsList.\r\n // We could not use `Group` directly, for the group row is unable to show data.\r\n // Behaviors:\r\n // 1. If parent is clicked, from unchecked to checked -- all children should be checked\r\n // 2. If parent is clicked, from checked to unchecked -- all children should be unchecked\r\n // 3. If child is clicked, from checked to unchecked, if parent is checked, set parent to uncheck, this should be recursive\r\n // 4. If child is clicked, from unchecked to checked, if all other children are checked, set parent to check, this should be recursive\r\n // one node mighe be child/parent at the same time.\r\n setSelectedRowIds((pre) => {\r\n // toggle clicked item itself\r\n if (pre.has(selectionKeyOfItem)) {\r\n pre.delete(selectionKeyOfItem);\r\n } else {\r\n pre.add(selectionKeyOfItem);\r\n }\r\n\r\n if (!isLeaf(item as any)) {\r\n const children = getAllChildrenOfNode(item as any);\r\n // situation 1\r\n if (pre.has(selectionKeyOfItem)) {\r\n children.forEach((child) => {\r\n pre.add(child.Id);\r\n });\r\n // eslint-disable-next-line brace-style\r\n }\r\n // situation 2\r\n else {\r\n children.forEach((child) => {\r\n pre.delete(child.Id);\r\n });\r\n }\r\n }\r\n\r\n let currentItem = item;\r\n while (true) {\r\n const siblings = getSiblingsOfNode(currentItem as any);\r\n if (!siblings) {\r\n break;\r\n }\r\n // situation 3\r\n if (!pre.has(selectionKeyOfItem)) {\r\n if (currentItem.treeViewInfo.parent) {\r\n pre.delete(currentItem.treeViewInfo.parent.Id);\r\n currentItem = currentItem.treeViewInfo.parent;\r\n } else {\r\n break;\r\n }\r\n // eslint-disable-next-line brace-style\r\n }\r\n // situation 4\r\n else if (currentItem.treeViewInfo.parent\r\n && siblings.every(sibling => pre.has(sibling.Id))\r\n ) {\r\n pre.add(currentItem.treeViewInfo.parent.Id);\r\n currentItem = currentItem.treeViewInfo.parent;\r\n } else {\r\n break;\r\n }\r\n }\r\n return new Set(pre);\r\n })\r\n }\r\n }\r\n >\r\n
\r\n {surfaceElement}\r\n
\r\n \r\n );\r\n },\r\n },\r\n }\r\n}\r\n","/* eslint-disable no-param-reassign */\r\n/* eslint-disable react/sort-comp */\r\n/* eslint-disable react/no-unused-prop-types */\r\n/* eslint-disable react/require-default-props */\r\n// / The whole file is a copy of SelectionZone.tsx from fluentui\r\n// No need to use this if we update FluentUI to a version that has `selectionClearedOnSurfaceClick` in `IListViewSelectionZoneProps`\r\n// There might be some strange bugs, due to inconsistent\r\n\r\nimport * as React from 'react';\r\nimport {\r\n Async,\r\n EventGroup,\r\n KeyCodes,\r\n elementContains,\r\n findScrollableParent,\r\n getParent,\r\n getDocument,\r\n getWindow,\r\n isElementTabbable,\r\n css,\r\n initializeComponentRef,\r\n FocusRects,\r\n SelectionMode,\r\n} from '@fluentui/react';\r\nimport type { ISelection, IObjectWithKey } from '@fluentui/react';\r\n\r\n// Selection definitions:\r\n//\r\n// Anchor index: the point from which a range selection starts.\r\n// Focus index: the point from which layout movement originates from.\r\n//\r\n// These two can differ. Tests:\r\n//\r\n// If you start at index 5\r\n// Shift click to index 10\r\n// The focus is 10, the anchor is 5.\r\n// If you shift click at index 0\r\n// The anchor remains at 5, the items between 0 and 5 are selected and everything else is cleared.\r\n// If you click index 8\r\n// The anchor and focus are set to 8.\r\n\r\nconst SELECTION_DISABLED_ATTRIBUTE_NAME = 'data-selection-disabled';\r\nconst SELECTION_INDEX_ATTRIBUTE_NAME = 'data-selection-index';\r\nconst SELECTION_SPAN_ATTRIBUTE_NAME = 'data-selection-span';\r\nconst SELECTION_TOGGLE_ATTRIBUTE_NAME = 'data-selection-toggle';\r\nconst SELECTION_INVOKE_ATTRIBUTE_NAME = 'data-selection-invoke';\r\nconst SELECTION_INVOKE_TOUCH_ATTRIBUTE_NAME = 'data-selection-touch-invoke';\r\nconst SELECTALL_TOGGLE_ALL_ATTRIBUTE_NAME = 'data-selection-all-toggle';\r\nconst SELECTION_SELECT_ATTRIBUTE_NAME = 'data-selection-select';\r\n\r\n/**\r\n * {@docCategory Selection}\r\n */\r\nexport interface ISelectionZone {\r\n /**\r\n * Method to ignore subsequent focus.\r\n */\r\n ignoreNextFocus: () => void;\r\n}\r\n\r\n/**\r\n * {@docCategory Selection}\r\n */\r\nexport interface IListViewSelectionZoneProps extends React.ClassAttributes {\r\n children?: React.ReactNode;\r\n /**\r\n * Reference to the component interface.\r\n */\r\n componentRef?: () => void;\r\n /**\r\n * Required {@link ISelection} instance bound to the {@link SelectionZone}.\r\n */\r\n selection: ISelection;\r\n /**\r\n * @deprecated No longer in use, focus is now managed by {@link FocusZone}.\r\n */\r\n layout?: {};\r\n /**\r\n * The mode of Selection, where the value is one of\r\n * 'none', 'single', or 'multiple'.\r\n *\r\n * @defaultvalue {@link SelectionMode.multiple}\r\n */\r\n selectionMode?: SelectionMode;\r\n /**\r\n * If true, selection is preserved on outer click.\r\n */\r\n selectionPreservedOnEmptyClick?: boolean;\r\n /**\r\n * If true, disables automatic selection on input elements.\r\n */\r\n disableAutoSelectOnInputElements?: boolean;\r\n /**\r\n * If true, modal selection is enabled on touch event.\r\n */\r\n enterModalOnTouch?: boolean;\r\n /**\r\n * Determines whether elements with the attribute `data-selection-touch-invoke` should be used as invocation targets\r\n * for an item if the user is using touch.\r\n *\r\n * @defaultvalue false\r\n */\r\n enableTouchInvocationTarget?: boolean;\r\n /**\r\n * Determines if an item is selected on focus.\r\n *\r\n * @defaultvalue true\r\n */\r\n isSelectedOnFocus?: boolean;\r\n /**\r\n * Determines if elements within the selection zone that DO NOT have the 'data-selection-toggle' or\r\n * 'data-selection-all-toggle' attribute are clickable and can alter the selection.\r\n *\r\n * @defaultvalue true\r\n */\r\n selectionClearedOnSurfaceClick?: boolean;\r\n\r\n /**\r\n * Determines if pressing the Escape clears the selection.\r\n *\r\n * @defaultvalue true\r\n */\r\n selectionClearedOnEscapePress?: boolean;\r\n\r\n /**\r\n * Allows the default toggle behavior to be overridden.\r\n * When set to `true` users do not have press a modifier key (e.g., ctrl or meta)\r\n * to toggle values.\r\n *\r\n * @default false\r\n */\r\n toggleWithoutModifierPressed?: boolean;\r\n\r\n /**\r\n * Optional callback for when an item is\r\n * invoked via ENTER or double-click.\r\n */\r\n onItemInvoked?: (item?: IObjectWithKey, index?: number, ev?: Event) => void;\r\n /**\r\n * Optional callback for when an\r\n * item's contextual menu action occurs.\r\n */\r\n onItemContextMenu?: (item?: any, index?: number, ev?: Event) => void | boolean;\r\n /**\r\n * Additional CSS class(es) to apply to the SelectionZone.\r\n */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * {@docCategory Selection}\r\n */\r\nexport interface IListViewSelectionZoneState {\r\n isModal: boolean | undefined;\r\n}\r\n\r\n/**\r\n * {@docCategory Selection}\r\n */\r\nexport class ListViewSelectionZone extends React.Component {\r\n public static defaultProps = {\r\n isSelectedOnFocus: true,\r\n toggleWithoutModifierPressed: false,\r\n selectionMode: SelectionMode.multiple,\r\n selectionClearedOnEscapePress: true,\r\n };\r\n\r\n private _async: Async;\r\n private _events: EventGroup;\r\n private _root = React.createRef();\r\n private _isCtrlPressed: boolean = false;\r\n private _isShiftPressed: boolean = false;\r\n private _isMetaPressed: boolean = false;\r\n private _isTabPressed: boolean = false;\r\n private _shouldHandleFocus: boolean = false;\r\n private _shouldHandleFocusTimeoutId: number | undefined;\r\n private _isTouch: boolean = false;\r\n private _isTouchTimeoutId: number | undefined;\r\n\r\n public static getDerivedStateFromProps(\r\n nextProps: IListViewSelectionZoneProps,\r\n prevState: IListViewSelectionZoneState\r\n ): IListViewSelectionZoneState {\r\n const isModal = nextProps.selection.isModal && nextProps.selection.isModal();\r\n\r\n return {\r\n ...prevState,\r\n isModal,\r\n };\r\n }\r\n\r\n constructor(props: IListViewSelectionZoneProps) {\r\n super(props);\r\n\r\n this._events = new EventGroup(this);\r\n this._async = new Async(this);\r\n initializeComponentRef(this);\r\n\r\n const { selection } = this.props;\r\n\r\n // Reflect the initial modal state of selection into the state.\r\n const isModal = selection.isModal && selection.isModal();\r\n\r\n this.state = {\r\n isModal,\r\n };\r\n }\r\n\r\n public componentDidMount(): void {\r\n const win = getWindow(this._root.current);\r\n\r\n // Track the latest modifier keys globally.\r\n this._events.on(win, 'keydown, keyup', this._updateModifiers, true);\r\n this._events.on(document, 'click', this._findScrollParentAndTryClearOnEmptyClick);\r\n this._events.on(document.body, 'touchstart', this._onTouchStartCapture, true);\r\n this._events.on(document.body, 'touchend', this._onTouchStartCapture, true);\r\n\r\n // Subscribe to the selection to keep modal state updated.\r\n this._events.on(this.props.selection, 'change', this._onSelectionChange);\r\n }\r\n\r\n // eslint-disable-next-line no-undef\r\n public render(): JSX.Element {\r\n const { isModal } = this.state;\r\n\r\n return (\r\n \r\n {this.props.children}\r\n \r\n \r\n );\r\n }\r\n\r\n public componentDidUpdate(previousProps: IListViewSelectionZoneProps): void {\r\n const { selection } = this.props;\r\n\r\n if (selection !== previousProps.selection) {\r\n // Whenever selection changes, update the subscripton to keep modal state updated.\r\n this._events.off(previousProps.selection);\r\n this._events.on(selection, 'change', this._onSelectionChange);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n this._events.dispose();\r\n this._async.dispose();\r\n }\r\n\r\n /**\r\n * In some cases, the consuming scenario requires to set focus on a row without having SelectionZone\r\n * react to the event. Note that focus events in IE \\<= 11 will occur asynchronously after .focus() has\r\n * been called on an element, so we need a flag to store the idea that we will bypass the \"next\"\r\n * focus event that occurs. This method does that.\r\n */\r\n public ignoreNextFocus = (): void => {\r\n this._handleNextFocus(false);\r\n };\r\n\r\n private _onSelectionChange = (): void => {\r\n const { selection } = this.props;\r\n\r\n const isModal = selection.isModal && selection.isModal();\r\n\r\n this.setState({\r\n isModal,\r\n });\r\n };\r\n\r\n private _onMouseDownCapture = (ev: React.MouseEvent): void => {\r\n let target = ev.target as HTMLElement;\r\n\r\n if (document.activeElement !== target && !elementContains(document.activeElement as HTMLElement, target)) {\r\n this.ignoreNextFocus();\r\n return;\r\n }\r\n\r\n if (!elementContains(target, this._root.current)) {\r\n return;\r\n }\r\n\r\n while (target !== this._root.current) {\r\n if (this._hasAttribute(target, SELECTION_INVOKE_ATTRIBUTE_NAME)) {\r\n this.ignoreNextFocus();\r\n break;\r\n }\r\n\r\n target = getParent(target) as HTMLElement;\r\n }\r\n };\r\n\r\n /**\r\n * When we focus an item, for single/multi select scenarios, we should try to select it immediately\r\n * as long as the focus did not originate from a mouse down/touch event. For those cases, we handle them\r\n * specially.\r\n */\r\n private _onFocus = (ev: React.FocusEvent): void => {\r\n const target = ev.target as HTMLElement;\r\n const { selection } = this.props;\r\n const isToggleModifierPressed = this._isCtrlPressed || this._isMetaPressed;\r\n\r\n const selectionMode = this._getSelectionMode();\r\n\r\n if (this._shouldHandleFocus && selectionMode !== SelectionMode.none) {\r\n const isToggle = this._hasAttribute(target, SELECTION_TOGGLE_ATTRIBUTE_NAME);\r\n const itemRoot = this._findItemRoot(target);\r\n\r\n if (!isToggle && itemRoot) {\r\n const index = this._getItemIndex(itemRoot);\r\n const span = this._getItemSpan(itemRoot);\r\n\r\n if (span === undefined) {\r\n if (isToggleModifierPressed) {\r\n // set anchor only.\r\n selection.setIndexSelected(index, selection.isIndexSelected(index), true);\r\n if (this.props.enterModalOnTouch && this._isTouch && selection.setModal) {\r\n selection.setModal(true);\r\n this._setIsTouch(false);\r\n }\r\n } else if (this.props.isSelectedOnFocus) {\r\n this._onItemSurfaceClick('focus', index);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._handleNextFocus(false);\r\n };\r\n\r\n private _onMouseDown = (ev: React.MouseEvent): void => {\r\n this._updateModifiers(ev);\r\n\r\n const { toggleWithoutModifierPressed } = this.props;\r\n\r\n let target = ev.target as HTMLElement;\r\n const itemRoot = this._findItemRoot(target);\r\n\r\n // No-op if selection is disabled\r\n if (this._isSelectionDisabled(target)) {\r\n return;\r\n }\r\n\r\n while (target !== this._root.current) {\r\n if (this._hasAttribute(target, SELECTALL_TOGGLE_ALL_ATTRIBUTE_NAME)) {\r\n break;\r\n } else if (itemRoot) {\r\n if (this._hasAttribute(target, SELECTION_TOGGLE_ATTRIBUTE_NAME)) {\r\n break;\r\n } else if (this._hasAttribute(target, SELECTION_INVOKE_ATTRIBUTE_NAME)) {\r\n break;\r\n } else if (\r\n (target === itemRoot || this._shouldAutoSelect(target)) &&\r\n !this._isShiftPressed &&\r\n !this._isCtrlPressed &&\r\n !this._isMetaPressed &&\r\n !toggleWithoutModifierPressed\r\n ) {\r\n this._onInvokeMouseDown(ev, this._getItemIndex(itemRoot), this._getItemSpan(itemRoot));\r\n\r\n break;\r\n } else if (\r\n this.props.disableAutoSelectOnInputElements &&\r\n (target.tagName === 'A' || target.tagName === 'BUTTON' || target.tagName === 'INPUT')\r\n ) {\r\n return;\r\n }\r\n }\r\n\r\n target = getParent(target) as HTMLElement;\r\n }\r\n };\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _onTouchStartCapture = (ev: React.TouchEvent): void => {\r\n this._setIsTouch(true);\r\n };\r\n\r\n private _onClick = (ev: React.MouseEvent): void => {\r\n const { enableTouchInvocationTarget = false } = this.props;\r\n\r\n this._updateModifiers(ev);\r\n\r\n let target = ev.target as HTMLElement;\r\n const itemRoot = this._findItemRoot(target);\r\n\r\n const isSelectionDisabled = this._isSelectionDisabled(target);\r\n\r\n while (target !== this._root.current) {\r\n if (this._hasAttribute(target, SELECTALL_TOGGLE_ALL_ATTRIBUTE_NAME)) {\r\n if (!isSelectionDisabled) {\r\n this._onToggleAllClick(ev);\r\n }\r\n break;\r\n } else if (itemRoot) {\r\n const index = this._getItemIndex(itemRoot);\r\n const span = this._getItemSpan(itemRoot);\r\n\r\n if (this._hasAttribute(target, SELECTION_TOGGLE_ATTRIBUTE_NAME)) {\r\n if (!isSelectionDisabled) {\r\n if (this._isShiftPressed) {\r\n this._onItemSurfaceClick('click', index, span);\r\n } else {\r\n this._onToggleClick(ev, index, span);\r\n }\r\n }\r\n break;\r\n } else if (\r\n (this._isTouch &&\r\n enableTouchInvocationTarget &&\r\n this._hasAttribute(target, SELECTION_INVOKE_TOUCH_ATTRIBUTE_NAME)) ||\r\n this._hasAttribute(target, SELECTION_INVOKE_ATTRIBUTE_NAME)\r\n ) {\r\n if (span === undefined) {\r\n // Items should be invokable even if selection is disabled.\r\n this._onInvokeClick(ev, index);\r\n }\r\n break;\r\n } else if (target === itemRoot) {\r\n if (!isSelectionDisabled) {\r\n this._onItemSurfaceClick('click', index, span);\r\n }\r\n break;\r\n } else if (target.tagName === 'A' || target.tagName === 'BUTTON' || target.tagName === 'INPUT') {\r\n return;\r\n }\r\n }\r\n\r\n target = getParent(target) as HTMLElement;\r\n }\r\n };\r\n\r\n private _onContextMenu = (ev: React.MouseEvent): void => {\r\n const target = ev.target as HTMLElement;\r\n\r\n const { onItemContextMenu, selection } = this.props;\r\n if (onItemContextMenu) {\r\n const itemRoot = this._findItemRoot(target);\r\n\r\n if (itemRoot) {\r\n const index = this._getItemIndex(itemRoot);\r\n\r\n this._onInvokeMouseDown(ev, index);\r\n\r\n const skipPreventDefault = onItemContextMenu(selection.getItems()[index], index, ev.nativeEvent);\r\n\r\n // In order to keep back compat, if the value here is undefined, then we should still\r\n // call preventDefault(). Only in the case where true is explicitly returned should\r\n // the call be skipped.\r\n if (!skipPreventDefault) {\r\n ev.preventDefault();\r\n }\r\n }\r\n }\r\n };\r\n\r\n private _isSelectionDisabled(target: HTMLElement): boolean {\r\n if (this._getSelectionMode() === SelectionMode.none) {\r\n return true;\r\n }\r\n\r\n while (target !== this._root.current) {\r\n if (this._hasAttribute(target, SELECTION_DISABLED_ATTRIBUTE_NAME)) {\r\n return true;\r\n }\r\n target = getParent(target) as HTMLElement;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * In multi selection, if you double click within an item's root (but not within the invoke element or\r\n * input elements), we should execute the invoke handler.\r\n */\r\n private _onDoubleClick = (ev: React.MouseEvent): void => {\r\n let target = ev.target as HTMLElement;\r\n\r\n const { onItemInvoked } = this.props;\r\n const itemRoot = this._findItemRoot(target);\r\n\r\n if (itemRoot && onItemInvoked && !this._isInputElement(target)) {\r\n const index = this._getItemIndex(itemRoot);\r\n\r\n while (target !== this._root.current) {\r\n if (\r\n this._hasAttribute(target, SELECTION_TOGGLE_ATTRIBUTE_NAME) ||\r\n this._hasAttribute(target, SELECTION_INVOKE_ATTRIBUTE_NAME)\r\n ) {\r\n break;\r\n } else if (target === itemRoot) {\r\n this._onInvokeClick(ev, index);\r\n break;\r\n }\r\n\r\n target = getParent(target) as HTMLElement;\r\n }\r\n\r\n target = getParent(target) as HTMLElement;\r\n }\r\n };\r\n\r\n private _onKeyDownCapture = (ev: React.KeyboardEvent): void => {\r\n this._updateModifiers(ev);\r\n\r\n this._handleNextFocus(true);\r\n };\r\n\r\n private _onKeyDown = (ev: React.KeyboardEvent): boolean | undefined => {\r\n this._updateModifiers(ev);\r\n\r\n let target = ev.target as HTMLElement;\r\n\r\n const isSelectionDisabled = this._isSelectionDisabled(target);\r\n\r\n const { selection, selectionClearedOnEscapePress } = this.props;\r\n\r\n const isSelectAllKey = ev.which === KeyCodes.a && (this._isCtrlPressed || this._isMetaPressed);\r\n\r\n const isClearSelectionKey = ev.which === KeyCodes.escape;\r\n\r\n // Ignore key downs from input elements.\r\n if (this._isInputElement(target)) {\r\n // A key was pressed while an item in this zone was focused.\r\n return;\r\n }\r\n\r\n const selectionMode = this._getSelectionMode();\r\n\r\n // If ctrl-a is pressed, select all (if all are not already selected.)\r\n if (isSelectAllKey && selectionMode === SelectionMode.multiple && !selection.isAllSelected()) {\r\n if (!isSelectionDisabled) {\r\n selection.setAllSelected(true);\r\n }\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n return;\r\n }\r\n\r\n // If escape is pressed and the component is configured to clear on escape press,\r\n // clear selection (if any are selected.)\r\n if (selectionClearedOnEscapePress && isClearSelectionKey && selection.getSelectedCount() > 0) {\r\n if (!isSelectionDisabled) {\r\n selection.setAllSelected(false);\r\n }\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n return;\r\n }\r\n\r\n const itemRoot = this._findItemRoot(target);\r\n\r\n // If a key was pressed within an item, we should treat \"enters\" as invokes and \"space\" as toggle\r\n if (itemRoot) {\r\n const index = this._getItemIndex(itemRoot);\r\n const span = this._getItemSpan(itemRoot);\r\n\r\n while (target !== this._root.current) {\r\n if (this._hasAttribute(target, SELECTION_TOGGLE_ATTRIBUTE_NAME)) {\r\n // For toggle elements, assuming they are rendered as buttons, they will generate a click event,\r\n // so we can no-op for any keydowns in this case.\r\n break;\r\n } else if (this._shouldAutoSelect(target)) {\r\n if (!isSelectionDisabled && span === undefined) {\r\n // If the event went to an element which should trigger auto-select, select it and then let\r\n // the default behavior kick in.\r\n this._onInvokeMouseDown(ev, index, span);\r\n }\r\n break;\r\n } else if (\r\n\r\n (ev.which === KeyCodes.enter || ev.which === KeyCodes.space) &&\r\n (target.tagName === 'BUTTON' || target.tagName === 'A' || target.tagName === 'INPUT')\r\n ) {\r\n // eslint-disable-next-line consistent-return\r\n return false;\r\n } else if (target === itemRoot) {\r\n if (ev.which === KeyCodes.enter) {\r\n if (span === undefined) {\r\n // Items should be invokable even if selection is disabled.\r\n this._onInvokeClick(ev, index);\r\n ev.preventDefault();\r\n }\r\n return;\r\n } else if (ev.which === KeyCodes.space) {\r\n if (!isSelectionDisabled) {\r\n this._onToggleClick(ev, index, span);\r\n }\r\n ev.preventDefault();\r\n return;\r\n }\r\n break;\r\n }\r\n\r\n target = getParent(target) as HTMLElement;\r\n }\r\n }\r\n };\r\n\r\n private _onToggleAllClick(ev: React.MouseEvent): void {\r\n const { selection } = this.props;\r\n\r\n const selectionMode = this._getSelectionMode();\r\n\r\n if (selectionMode === SelectionMode.multiple) {\r\n selection.toggleAllSelected();\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n }\r\n }\r\n\r\n private _onToggleClick(\r\n ev: React.MouseEvent | React.KeyboardEvent,\r\n index: number,\r\n span?: number\r\n ): void {\r\n const { selection } = this.props;\r\n\r\n const selectionMode = this._getSelectionMode();\r\n\r\n selection.setChangeEvents(false);\r\n\r\n if (\r\n this.props.enterModalOnTouch &&\r\n this._isTouch &&\r\n (span !== undefined ? !selection.isRangeSelected(index, span) : !selection.isIndexSelected(index)) &&\r\n selection.setModal\r\n ) {\r\n selection.setModal(true);\r\n this._setIsTouch(false);\r\n }\r\n\r\n if (selectionMode === SelectionMode.multiple) {\r\n if (span !== undefined) {\r\n selection.toggleRangeSelected(index, span);\r\n } else {\r\n selection.toggleIndexSelected(index);\r\n }\r\n } else if (selectionMode === SelectionMode.single) {\r\n if (span === undefined || span === 1) {\r\n const isSelected = selection.isIndexSelected(index);\r\n const isModal = selection.isModal && selection.isModal();\r\n selection.setAllSelected(false);\r\n selection.setIndexSelected(index, !isSelected, true);\r\n if (isModal && selection.setModal) {\r\n // Since the above call to setAllSelected(false) clears modal state,\r\n // restore it. This occurs because the SelectionMode of the Selection\r\n // may differ from the SelectionZone.\r\n selection.setModal(true);\r\n }\r\n }\r\n } else {\r\n selection.setChangeEvents(true);\r\n return;\r\n }\r\n\r\n selection.setChangeEvents(true);\r\n\r\n ev.stopPropagation();\r\n\r\n // NOTE: ev.preventDefault is not called for toggle clicks, because this will kill the browser behavior\r\n // for checkboxes if you use a checkbox for the toggle.\r\n }\r\n\r\n private _onInvokeClick(ev: React.MouseEvent | React.KeyboardEvent, index: number): void {\r\n const { selection, onItemInvoked } = this.props;\r\n\r\n if (onItemInvoked) {\r\n onItemInvoked(selection.getItems()[index], index, ev.nativeEvent);\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n }\r\n }\r\n\r\n private _onItemSurfaceClick(type: 'focus' | 'click', index: number, span?: number): void {\r\n const { selection, toggleWithoutModifierPressed } = this.props;\r\n const isToggleModifierPressed = this._isCtrlPressed || this._isMetaPressed;\r\n\r\n const selectionMode = this._getSelectionMode();\r\n\r\n if (selectionMode === SelectionMode.multiple) {\r\n if (this._isShiftPressed && !this._isTabPressed) {\r\n if (span !== undefined) {\r\n // @ts-ignore\r\n selection.selectToRange(index, span, !isToggleModifierPressed);\r\n } else {\r\n selection.selectToIndex(index, !isToggleModifierPressed);\r\n }\r\n } else if (type === 'click' && (isToggleModifierPressed || toggleWithoutModifierPressed)) {\r\n if (span !== undefined) {\r\n selection.toggleRangeSelected(index, span);\r\n } else {\r\n selection.toggleIndexSelected(index);\r\n }\r\n } else {\r\n this._clearAndSelectIndex(index, span);\r\n }\r\n } else if (selectionMode === SelectionMode.single) {\r\n this._clearAndSelectIndex(index, span);\r\n }\r\n }\r\n\r\n private _onInvokeMouseDown(\r\n ev: React.MouseEvent | React.KeyboardEvent,\r\n index: number,\r\n span?: number\r\n ): void {\r\n const { selection } = this.props;\r\n\r\n if (span !== undefined) {\r\n if (selection.isRangeSelected(index, span)) {\r\n return;\r\n }\r\n } else {\r\n // Only do work if item is not selected.\r\n // eslint-disable-next-line no-lonely-if\r\n if (selection.isIndexSelected(index)) {\r\n return;\r\n }\r\n }\r\n\r\n this._clearAndSelectIndex(index, span);\r\n }\r\n\r\n /**\r\n * To avoid high startup cost of traversing the DOM on component mount,\r\n * defer finding the scrollable parent until a click interaction.\r\n *\r\n * The styles will probably already calculated since we're running in a click handler,\r\n * so this is less likely to cause layout thrashing then doing it in mount.\r\n */\r\n private _findScrollParentAndTryClearOnEmptyClick(ev: MouseEvent) {\r\n const scrollParent = findScrollableParent(this._root.current) as HTMLElement;\r\n // unbind this handler and replace binding with a binding on the actual scrollable parent\r\n this._events.off(document, 'click', this._findScrollParentAndTryClearOnEmptyClick);\r\n this._events.on(scrollParent, 'click', this._tryClearOnEmptyClick);\r\n\r\n // If we clicked inside the scrollable parent, call through to the handler on this click.\r\n if ((scrollParent && ev.target instanceof Node && scrollParent.contains(ev.target)) || scrollParent === ev.target) {\r\n this._tryClearOnEmptyClick(ev);\r\n }\r\n }\r\n\r\n private _tryClearOnEmptyClick(ev: MouseEvent): void {\r\n if (!this.props.selectionPreservedOnEmptyClick && this._isNonHandledClick(ev.target as HTMLElement)) {\r\n this.props.selection.setAllSelected(false);\r\n }\r\n }\r\n\r\n private _clearAndSelectIndex(index: number, span?: number): void {\r\n const { selection, selectionClearedOnSurfaceClick = true } = this.props;\r\n const isAlreadySingleSelected =\r\n (span === undefined || span === 1) && selection.getSelectedCount() === 1 && selection.isIndexSelected(index);\r\n\r\n if (!isAlreadySingleSelected && selectionClearedOnSurfaceClick) {\r\n const isModal = selection.isModal && selection.isModal();\r\n selection.setChangeEvents(false);\r\n selection.setAllSelected(false);\r\n if (span !== undefined) {\r\n // @ts-ignore\r\n selection.setRangeSelected(index, span, true, true);\r\n } else {\r\n selection.setIndexSelected(index, true, true);\r\n }\r\n if (isModal || (this.props.enterModalOnTouch && this._isTouch)) {\r\n if (selection.setModal) {\r\n selection.setModal(true);\r\n }\r\n if (this._isTouch) {\r\n this._setIsTouch(false);\r\n }\r\n }\r\n selection.setChangeEvents(true);\r\n }\r\n }\r\n\r\n /**\r\n * We need to track the modifier key states so that when focus events occur, which do not contain\r\n * modifier states in the Event object, we know how to behave.\r\n */\r\n private _updateModifiers(ev: React.KeyboardEvent | React.MouseEvent): void {\r\n this._isShiftPressed = ev.shiftKey;\r\n this._isCtrlPressed = ev.ctrlKey;\r\n this._isMetaPressed = ev.metaKey;\r\n\r\n\r\n const { keyCode } = (ev as React.KeyboardEvent);\r\n this._isTabPressed = keyCode ? keyCode === KeyCodes.tab : false;\r\n }\r\n\r\n private _findItemRoot(target: HTMLElement): HTMLElement | undefined {\r\n const { selection } = this.props;\r\n\r\n while (target !== this._root.current) {\r\n const indexValue = target.getAttribute(SELECTION_INDEX_ATTRIBUTE_NAME);\r\n const index = Number(indexValue);\r\n\r\n if (indexValue !== null && index >= 0 && index < selection.getItems().length) {\r\n break;\r\n }\r\n\r\n target = getParent(target) as HTMLElement;\r\n }\r\n\r\n if (target === this._root.current) {\r\n return undefined;\r\n }\r\n\r\n return target;\r\n }\r\n\r\n private _getItemIndex(itemRoot: HTMLElement): number {\r\n const indexValue = parseInt(itemRoot.getAttribute(SELECTION_INDEX_ATTRIBUTE_NAME) ?? '', 10);\r\n\r\n return isNaN(indexValue) ? -1 : indexValue;\r\n }\r\n\r\n private _getItemSpan(itemRoot: HTMLElement): number | undefined {\r\n const spanValue = parseInt(itemRoot.getAttribute(SELECTION_SPAN_ATTRIBUTE_NAME) ?? '', 10);\r\n\r\n return isNaN(spanValue) ? undefined : spanValue;\r\n }\r\n\r\n private _shouldAutoSelect(element: HTMLElement): boolean {\r\n return this._hasAttribute(element, SELECTION_SELECT_ATTRIBUTE_NAME);\r\n }\r\n\r\n private _hasAttribute(element: HTMLElement, attributeName: string): boolean {\r\n let isToggle = false;\r\n\r\n while (!isToggle && element !== this._root.current) {\r\n const value = element.getAttribute(attributeName);\r\n if (value === 'false') {\r\n isToggle = false;\r\n break;\r\n }\r\n isToggle = value === 'true';\r\n element = getParent(element) as HTMLElement;\r\n }\r\n\r\n return isToggle;\r\n }\r\n\r\n private _isInputElement(element: HTMLElement): boolean {\r\n return (\r\n element.tagName === 'INPUT' ||\r\n element.tagName === 'TEXTAREA' ||\r\n element.getAttribute('contenteditable') === 'true' ||\r\n element.getAttribute('contenteditable') === ''\r\n );\r\n }\r\n\r\n private _isNonHandledClick(element: HTMLElement): boolean {\r\n const doc = getDocument();\r\n\r\n if (doc && element) {\r\n while (element && element !== doc.documentElement) {\r\n if (isElementTabbable(element)) {\r\n return false;\r\n }\r\n\r\n element = getParent(element) as HTMLElement;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _handleNextFocus(handleFocus: boolean): void {\r\n if (this._shouldHandleFocusTimeoutId) {\r\n this._async.clearTimeout(this._shouldHandleFocusTimeoutId);\r\n this._shouldHandleFocusTimeoutId = undefined;\r\n }\r\n\r\n this._shouldHandleFocus = handleFocus;\r\n\r\n if (handleFocus) {\r\n this._async.setTimeout(() => {\r\n this._shouldHandleFocus = false;\r\n }, 100);\r\n }\r\n }\r\n\r\n private _setIsTouch(isTouch: boolean): void {\r\n if (this._isTouchTimeoutId) {\r\n this._async.clearTimeout(this._isTouchTimeoutId);\r\n this._isTouchTimeoutId = undefined;\r\n }\r\n\r\n this._isTouch = true;\r\n\r\n if (isTouch) {\r\n this._async.setTimeout(() => {\r\n this._isTouch = false;\r\n }, 300);\r\n }\r\n }\r\n\r\n private _getSelectionMode(): SelectionMode {\r\n const { selection } = this.props;\r\n\r\n const { selectionMode = selection ? selection.mode : SelectionMode.none } = this.props;\r\n\r\n return selectionMode;\r\n }\r\n}\r\n"],"names":["defaultMakeCall","_x","_x2","_x3","_defaultMakeCall","apply","arguments","_asyncToGenerator","_regeneratorRuntime","mark","_callee2","state","edm","odataParams","pagination","editableFilter","sortedColumn","selectedColumns","$select","$expand","sortKey","query","parmas","response","wrap","_context2","prev","next","_","map","column","fieldName","expandProperties","count","top","pageSize","skip","pageNumber","filter","where","select","orderby","_defineProperty","isSortedDescending","undefined","_objectSpread","$makeCall","toPromise","sent","abrupt","stop","defaultMakeCollectionGetCall","_x4","_x5","_x6","_defaultMakeCollectionGetCall","_callee3","_context3","get","useCampaignGridDataSource","_ref","_ref$makeCall","makeCall","_ref$odataParams","_ref$beforeCall","beforeCall","_ref$afterCall","afterCall","_ref$onError","onError","_ref$formatResponse","formatResponse","items","value","totalCount","_ref$shouldMakeCall","shouldMakeCall","_useContext","useContext","GridContext","dispatch","apiIdForRereshGridData","useRef","dataRefreshId","useEffect","_fetchData","_callee","requestId","_context","type","current","payload","t0","finish","length","fetchData","columnNames","AbsoluteTopImpressionRate","_TL_","AbsoluteTopImpressionShareLostToBudget","AbsoluteTopImpressionShareLostToRank","AbsoluteTopImpressionSharePercent","AdvertiserReportedRevenue","AllConversionAdvertiserReportedRevenue","AllConversionCPA","AllConversionRate","AllConversionRevenueOnAdSpend","AllConversions","AllConversionsCredit","AllPartialConversionCPA","AllPartialConversionRate","AuctionLostToAdQualityPercent","AuctionLostToBidPercent","AuctionLostToBudgetPercent","AuctionLostToLandingPercent","AuctionLostToRankPercent","AuctionWonPercent","AudienceImpressionShare","AudienceImpressionShareLostToBudget","AudienceImpressionShareLostToRank","AverageCPC","AverageCPM","AverageCPS","AverageCPV","AveragePosition","AverageWatchTimePerImpression","AverageWatchTimePerVideoView","CPA","CTR","ClickAndPhoneSpend","ClickSharePercent","Clicks","CompletedVideoViews","ConversionRate","Conversions","ConversionsCredit","CostPerDownload","CostPerFirstLaunch","CostPerPurchase","CostPerSubscription","Downloads","EligibleImpressions","ExactMatchImpressionSharePercent","FirstLaunches","ImpressionShare","Impressions","ManualCalls","MissedImpressions","MissedImpressionsInsufficientBid","MissedImpressionsNoBid","MissedImpressionsNoTax","MissedImpressionsOther","MissedImpressionsSpendingCapReached","PTR","PartialConversionCPA","PartialConversionRate","PhoneImpressions","PostClickDownloadRate","PostClickFirstLaunchRate","PostInstallPurchaseRate","PostInstallSubscriptionRate","Purchases","RelativeCTR","ReturnOnAdSpend","RevenueOnAdSpend","SalesCount","Spend","Subscriptions","TopImpressionRate","TopImpressionShareLostToBudget","TopImpressionShareLostToRank","TopImpressionSharePercent","TotalWatchTimeInMS","VideoCompletionRate","VideoViews","VideoViewsAt25Percent","VideoViewsAt50Percent","VideoViewsAt75Percent","ViewThroughConversions","ViewThroughConversionsCPA","ViewThroughConversionsCredit","ViewThroughConversionsRate","ViewThroughConversionsReturnOnAdSpend","ViewThroughConversionsRevenue","ViewThroughPartialConversionsCPA","ViewThroughPartialConversionsRate","ViewThroughRate","NetRevenue","bidStrategyTypes","Commission","CostPerSale","EnhancedCpc","EnhancedCPC","InheritFromParent","Manual","ManualCpa","ManualCPA","ManualCpc","ManualCpi","ManualCpm","ManualCPM","ManualCpv","ManualCPV","MaxClicks","MaxConversions","MaxConversionValue","MaxImpressions","MaxReach","MaxRoas","MaximizeClicks","MaximizeConversions","PercentCpc","TargetCpa","TargetCPA","TargetImpressionShare","TargetRoas","UsePortfolioBidStrategyType","formatFuncs","integer","i18n","decimalToIntegerFormatter","Number","percentage","v","concat","toFixed","decimal","decimalToFixedFormatter","thousandth","generateHelpId","name","helpId","buildColumn","_ref2","key","title","minWidth","maxWidth","_ref2$sortable","sortable","className","isResizable","onRenderHeader","hasHelpIcon","helpIcon","_jsx","children","HelpIcon","topic","disabled","_jsxs","mergeStyles","overflow","textOverflow","display","verticalAlign","onRender","item","properties","split","FluctuationType","Default","Impression","Click","Conversion","Max","FluctuationEnumToStringMap","keyList","ColumnNameToFluctuationTypeEnum","buildFluctuationColumn","options","format","columnTitle","localizedTitle","getString","PerformanceMetrics","AvailableInsightTypeIds","metricType","metricName","metricValue","hasFluctuation","_ref3","propertyName","availableInsightTypeIds","hasFluctuations","IsOverall","$total","_Fragment","tabIndex","role","PerformanceMetricBaseColumnScope","buildPerformanceColumn","_options$scope","scope","property","onRenderPerformanceColumns","defaultSortDirection","DefaultSortDirection","Descending","onRenderAggregatedRow","ColumnClicks","_ref$helpId","ColumnImpressions","_ref2$helpId","ColumnCTR","_ref3$helpId","ColumnAverageCPC","_ref4","_ref4$helpId","ColumnAverageCPM","_ref6","_ref6$helpId","ColumnSpend","_ref18","_ref18$helpId","ColumnDownloads","_ref20","_ref20$helpId","ColumnFirstLaunches","_ref21","_ref21$helpId","ColumnPurchases","_ref22","_ref22$helpId","ColumnSubscriptions","_ref23","_ref23$helpId","ColumnPostClickDownloadRate","_ref24","_ref24$helpId","ColumnCostPerDownload","_ref25","_ref25$helpId","ColumnPostClickFirstLaunchRate","_ref26","_ref26$helpId","ColumnCostPerFirstLaunch","_ref27","_ref27$helpId","ColumnPostInstallPurchaseRate","_ref28","_ref28$helpId","ColumnCostPerPurchase","_ref29","_ref29$helpId","ColumnPostInstallSubscriptionRate","_ref30","_ref30$helpId","ColumnCostPerSubscription","_ref31","_ref31$helpId","ColumnAbsoluteTopImpressionRate","_ref33","_ref33$helpId","ColumnAverageCPS","_ref34","_ref34$helpId","ColumnCPA","ColumnPartialConversionCPA","ColumnConversions","ColumnConversionsCredit","ColumnRevenueOnAdSpend","_ref5","_ref5$helpId","ColumnAdvertiserReportedRevenue","ColumnConversionRate","_ref7","_ref7$helpId","ColumnPartialConversionRate","_ref8","_ref8$helpId","ColumnAllConversionCPA","_ref9","_ref9$helpId","ColumnAllPartialConversionCPA","_ref10","_ref10$helpId","ColumnAllConversions","_ref11","_ref11$helpId","ColumnAllConversionsCredit","_ref12","_ref12$helpId","ColumnAllConversionRevenueOnAdSpend","_ref13","_ref13$helpId","ColumnAllConversionAdvertiserReportedRevenue","_ref14","_ref14$helpId","ColumnAllConversionRate","_ref15","_ref15$helpId","ColumnAllPartialConversionRate","_ref16","_ref16$helpId","ColumnConversionsWithFluctuation","permissions","ColumnConversionsCreditWithFluctuation","ColumnSalesCount","getConversionColumns","_ref30$withFluctuatio","withFluctuations","_ref30$withPartialCon","withPartialConversions","ColumnEligibleImpressions","_ref19","ColumnMissedImpressions","ColumnImpressionShare","ColumnMissedImpressionsNoBid","ColumnMissedImpressionsSpendingCapReached","ColumnMissedImpressionsInsufficientBid","ColumnMissedImpressionsNoTax","ColumnMissedImpressionsOther","defaultMenus","text","color","icon","selectedStyle","fontWeight","iconStyle","fontSize","ColumnStatusIcon","_ref$readOnly","readOnly","_ref$menus","menus","_ref$onEditStatus","onEditStatus","headerClassName","Status","selectedItem","find","menu","IconButton","height","background","ariaLabel","iconProps","iconName","menuProps","onClick","isInitialGridDataLoad","isPageReadyFulfilled","perfMarkerMiddlewareFactory","perfMarker","gridName","logNavTiming","isDataLoaded","gridMarker","createChild","willInit","action","isDone","parentMarker","willFetchData","willRender","Version","GridName","IsPageReadyFulfilled","TotalRows","size","TotalServerSideRows","TotalColumns","extend","PageNavStartTime","performance","timing","navigationStart","PageFetchStartTime","fetchStart","LandingPageUrl","location","href","done","JSON","stringify","PageReady","afterPageReady","then","ColumnFormat","SelectOption","spendColumn","clicksColumn","Integer","impressionsColumn","CTRColumn","PercentageValue","averageCPCColumn","averageCPMColumn","conversionsColumn","conversionRateColumn","netRevenueColumn","Decimal","returnOnAdSpendColumn","absoluteTopImpressionRateColumn","advertiserReportedRevenue","CPAColumn","allConversionsColumn","allConversionRateColumn","allConversionRevenueOnAdSpendColumn","allConversionAdvertiserReportedRevenue","allConversionCPAColumn","urlCustomParametersColumn","finalUrlSuffixColumn","trackingUrlTemplateColumn","destinationUrlColumn","eligibleImpressionsColumn","missedImpressionsColumn","impressionShareColumn","missedImpressionsNoBidColumn","missedImpressionsSpendingCapReachedColumn","missedImpressionsInsufficientBidColumn","missedImpressionsNoTaxColumn","missedImpressionsOtherColumn","averageCPSColumn","salesCountColumn","getAggregatedRowConfigs","showFilter","showWaterFall","showSearchRow","showAudienceRow","showPmaxRow","showNativeRow","showLinkedInRow","showDeletedRow","showUnknown","showOther","showOverall","dataKey","number","ignore","row","identity","compose","getFormatter","placeholder","formatter","Percentage","percentFormatter","percentToFixedFormatter","digits","Natural","fmt","isFinite","Thousandth","Object","values","includes","UriHelper","IsAsciiLetter","character","charCodeAt","IsAsciiLetterOrDigit","characterAscii","Uri","CheckSchemeName","schemeName","i","MarkerMatchType","UrlValidationError","UriSchemeHttp","UriSchemeHttps","SchemeDelimiter","UriProtocolSeparator","HttpPrefix","HttpsProtocolPrefix","DecimalNumberRegex","RegExp","OpeningMarker","ClosingMarker","separator","ValidUrl","inputUrl","word","openingMarkercount","closingMarkerCount","index","char","MatchingMarkers","NonMatchingMarkers","NoMarkers","GetBraceMatchStatus","test","InvalidUrlFormat","resultUri","inputURL","toLowerCase","startsWith","prefixDefaultProtocol","protocolIndex","indexOf","scheme","substring","FixProtocol","URL","error","protocol","InvalidUrlProtocol","host","s","join","dummyRootId","buildTreeViewItems","params","getParentKeyOfItem","getPrimaryKeyOfItem","expandedItemIds","nodeById","Map","forEach","set","childrenIdByNodeId","primaryKey","parentKey","has","push","getNodesWithChildren","rootId","res","buildTree","nodeId","parentNode","currentLevel","rootNode","treeViewInfo","depth","hasChildren","isExpanded","parent","childrenIds","childId","isRoot","getSiblingsOfNode","child","getAllChildrenOfNode","traverseTreeByPreOrder","currentItem","cur","root","SELECTION_INDEX_ATTRIBUTE_NAME","SELECTION_TOGGLE_ATTRIBUTE_NAME","SELECTION_INVOKE_ATTRIBUTE_NAME","SELECTALL_TOGGLE_ALL_ATTRIBUTE_NAME","TreeViewSelectionZone","getDerivedStateFromProps","nextProps","prevState","isModal","selection","constructor","props","super","_root","_isCtrlPressed","_isShiftPressed","_isMetaPressed","_isTabPressed","_shouldHandleFocus","_isTouch","ignoreNextFocus","this","_handleNextFocus","_onSelectionChange","setState","_onMouseDownCapture","ev","target","document","activeElement","elementContains","_hasAttribute","getParent","_onFocus","isToggleModifierPressed","selectionMode","_getSelectionMode","none","isToggle","itemRoot","_findItemRoot","_getItemIndex","setIndexSelected","isIndexSelected","enterModalOnTouch","setModal","_setIsTouch","isSelectedOnFocus","_onItemSurfaceClick","_onMouseDown","_updateModifiers","_isSelectionDisabled","_shouldAutoSelect","_onInvokeMouseDown","disableAutoSelectOnInputElements","tagName","_onTouchStartCapture","_onClick","enableTouchInvocationTarget","isSelectionDisabled","_onToggleAllClick","_onToggleClick","_onInvokeClick","_onContextMenu","onItemContextMenu","getItems","nativeEvent","preventDefault","_onDoubleClick","onItemInvoked","_isInputElement","_onKeyDownCapture","_onKeyDown","isSelectAllKey","which","KeyCodes","a","isClearSelectionKey","escape","multiple","isAllSelected","setAllSelected","stopPropagation","getSelectedCount","enter","space","_events","EventGroup","_async","Async","initializeComponentRef","componentDidMount","win","getWindow","on","_findScrollParentAndTryClearOnEmptyClick","body","render","ref","onKeyDown","onMouseDown","onKeyDownCapture","onDoubleClick","onContextMenu","onMouseDownCapture","onFocusCapture","componentDidUpdate","previousProps","off","componentWillUnmount","dispose","toggleAllSelected","onToggleSelected","setChangeEvents","toggleIndexSelected","single","isSelected","selectToIndex","_clearAndSelectIndex","scrollParent","_tryClearOnEmptyClick","Node","contains","selectionPreservedOnEmptyClick","_isNonHandledClick","selectionClearedOnSurfaceClick","shiftKey","ctrlKey","metaKey","keyCode","tab","indexValue","getAttribute","element","attributeName","doc","getDocument","documentElement","handleFocus","_shouldHandleFocusTimeoutId","clearTimeout","setTimeout","isTouch","_isTouchTimeoutId","mode","getKey","Id","useTreeViewSelection","isTreeView","selectedRowIds","setSelectedRowIds","useState","Set","useMemo","Selection","isSelectionZoneAllSelected","node","getRootOfNode","isEventTriggered","setItems","id","setKeySelected","toString","finalSelection","disableSelectionZone","listProps","onRenderRoot","rootRef","surfaceElement","divProps","selectionKeyOfItem","pre","delete","add","isLeaf","siblings","every","sibling","defaultProps","ListViewSelectionZone","_getItemSpan","toggleWithoutModifierPressed","span","selectionClearedOnEscapePress","css","isRangeSelected","toggleRangeSelected","selectToRange","setRangeSelected","parseInt","isNaN","spanValue"],"sourceRoot":""}