{
  "version": 3,
  "sources": ["apps/business-center-client/src/app/reputation/index.ts", "apps/business-center-client/src/app/shared/filter-service.service.ts", "apps/business-center-client/src/app/brands/brand-filter-container/brand-filter-container.service.ts", "apps/business-center-client/src/app/metrics/helpers.ts", "apps/business-center-client/src/app/metrics/query.service.ts", "apps/business-center-client/src/app/metrics/account-group.service.ts", "apps/business-center-client/src/app/brands/brand-filter-container/brand-geography-dialog/brand-geography-dialog.component.ts", "apps/business-center-client/src/app/brands/brand-filter-container/brand-geography-dialog/brand-geography-dialog.component.html", "apps/business-center-client/src/app/brands/brand-filter-container/brand-group-dialog/brand-group-dialog.component.ts", "apps/business-center-client/src/app/brands/brand-filter-container/brand-group-dialog/brand-group-dialog.component.html", "apps/business-center-client/src/app/brands/brand-filter-container/brand-location-dialog/brand-location-dialog.component.ts", "apps/business-center-client/src/app/brands/brand-filter-container/brand-location-dialog/brand-location-dialog.component.html", "apps/business-center-client/src/app/brands/brand-filter-container/brand-source-dialog/brand-source-dialog.component.ts", "apps/business-center-client/src/app/brands/brand-filter-container/brand-source-dialog/brand-source-dialog.component.html", "apps/business-center-client/src/app/brands/brand-filter-container/brand-taxonomy-dialog/brand-taxonomy-dialog.component.ts", "apps/business-center-client/src/app/brands/brand-filter-container/brand-taxonomy-dialog/brand-taxonomy-dialog.component.html", "apps/business-center-client/src/app/brands/brand-filter-container/brand-filter-container.component.ts", "apps/business-center-client/src/app/brands/brand-filter-container/brand-filter-container.component.html"],
  "sourcesContent": ["export { ReputationService } from './reputation.service';\n", "import { Injectable } from '@angular/core';\nimport { BehaviorSubject, combineLatest, Observable } from 'rxjs';\nimport {\n  FieldFilterOperator,\n  FieldFilterOperatorFunction,\n  Filter,\n  PropertyType,\n} from '@vendasta/multi-location-analytics';\nimport { distinctUntilChanged, map } from 'rxjs/operators';\n\n@Injectable({ providedIn: 'root' })\nexport class FilterService {\n  private filters$$ = new BehaviorSubject(new Array<Filter>());\n  public filters$: Observable<Filter[]>;\n  public sourceFilter$: Observable<Filter>;\n  private enabledSources$$: BehaviorSubject<string[]> = new BehaviorSubject([]);\n  public enabledSources$: Observable<string[]>;\n  private filteredSources$$: BehaviorSubject<string[]> = new BehaviorSubject([]);\n  public filteredSources$: Observable<string[]>;\n  public filtersQuantity$: Observable<number>;\n  private subgroup$$: BehaviorSubject<string[]> = new BehaviorSubject(null);\n  public subgroup$: Observable<string[]>;\n\n  constructor() {\n    this.filters$ = this.filters$$.asObservable().pipe(map((r) => [...r]));\n    this.enabledSources$ = this.enabledSources$$.asObservable();\n    this.filteredSources$ = this.filteredSources$$.asObservable();\n    this.subgroup$ = this.subgroup$$.asObservable();\n    this.sourceFilter$ = combineLatest([this.enabledSources$$, this.filteredSources$]).pipe(\n      map(([enabled, filtered]) => {\n        if ((!filtered || filtered.length < 1) && (!enabled || enabled.length < 1)) {\n          return null;\n        }\n        const sourceIds = filtered && filtered.length > 0 ? filtered : enabled;\n        return new Filter({\n          fieldFilter: {\n            operator: FieldFilterOperator.EQUAL,\n            operatorFunction: FieldFilterOperatorFunction.ANY,\n            dimension: 'source',\n            value: {\n              value: sourceIds,\n              valueType: PropertyType.PROPERTY_TYPE_STRING,\n            },\n          },\n        });\n      }),\n      distinctUntilChanged(),\n    );\n    this.filtersQuantity$ = combineLatest([this.filters$, this.filteredSources$, this.subgroup$]).pipe(\n      map(([filters, filteredSources, subgroup]) => {\n        let qty = 0;\n        if (filters) {\n          qty += filters.length;\n        }\n        if (filteredSources && filteredSources.length > 0) {\n          qty += 1;\n        }\n        if (subgroup) {\n          qty += 1;\n        }\n        return qty;\n      }),\n    );\n  }\n\n  public setFilters(filters: Filter[]): void {\n    this.filters$$.next(filters);\n  }\n\n  public setEnabledSources(sourceIds: string[]): void {\n    this.enabledSources$$.next(sourceIds);\n  }\n\n  public setFilteredSources(sourceIds: string[]): void {\n    this.filteredSources$$.next(sourceIds);\n  }\n\n  public setSubgroup(groupId: string[]): void {\n    this.subgroup$$.next(groupId);\n  }\n}\n", "import { Injectable } from '@angular/core';\nimport { ActivationEnd, Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject, Observable, Subject, combineLatest } from 'rxjs';\nimport { filter, map, shareReplay, startWith } from 'rxjs/operators';\nimport { getLocation } from '../../account-group/account-group';\nimport { LocationsService } from '../../locations';\nimport { PageId } from '../../page-access';\nimport { ReputationService } from '../../reputation';\nimport { FilterService } from '../../shared/filter-service.service';\nimport { AvailableTimeRangeOptions, TimeRangeService } from '../../shared/time-range.service';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nexport const COUNTRIES_LABEL = 'PERFORMANCE.MULTI_LOCATION.FILTERS.GEOGRAPHY.COUNTRIES';\nexport const STATEPROV_LABEL = 'PERFORMANCE.MULTI_LOCATION.FILTERS.GEOGRAPHY.REGION';\nexport const CITIES_LABEL = 'PERFORMANCE.MULTI_LOCATION.FILTERS.GEOGRAPHY.CITIES';\n\nexport interface DisplayFilter {\n  filterId: string;\n  filterTypeTranslateKey?: string;\n  displayName: string;\n  displayName$?: Observable<string>;\n  icon?: string;\n}\n\nexport interface FilterDisplaySettings {\n  textColor: string;\n  backgroundColor: string;\n}\n\nexport interface LocationGroup {\n  name: string;\n  options: Location[];\n}\nexport interface Location {\n  id: string;\n  name: string;\n  parent: string[];\n  locationCount: number;\n}\n\nexport type DialogOpenTypes = 'location';\n\n@Injectable({ providedIn: 'root' })\nexport class BrandFilterContainerService {\n  private readonly dateFilterUsed$$ = new BehaviorSubject<boolean>(false);\n  public readonly dateFilterUsed$ = this.dateFilterUsed$$.asObservable();\n  public readonly dateFilterDisplay$: Observable<string>;\n\n  private readonly selectedAccountGroupIds$$ = new BehaviorSubject<string[]>([]);\n  public readonly selectedAccountGroupIds$ = this.selectedAccountGroupIds$$.asObservable();\n  public readonly locationFilterDisplay$: Observable<string>;\n\n  private readonly selectedSourceIds$$ = new BehaviorSubject<string[]>([]);\n  public readonly selectedSourceIds$ = this.selectedSourceIds$$.asObservable();\n  // TODO: Number if what I want most of the time but I've reached for a string (5+) when I didn't know exactly how many\n  // TODO: ie, when filter for listings with name error OR website error -- overlapping counts with OR\n  // TODO: Perhaps this isn't worth trying to put up here, let it be used in the locations that visualize better?\n  private readonly sourceIdCounts$$ = new BehaviorSubject<Map<string, number>>(null);\n  public readonly sourceIdCounts$ = this.sourceIdCounts$$.asObservable();\n  public readonly sourceFilterDisplay$: Observable<string>;\n  public readonly sourceOptions$: Observable<any[]>;\n\n  openDialog$: Subject<DialogOpenTypes> = new Subject();\n  // TODO: This is set in several places but never read. Missed in feature removal?\n  private minimised$$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\n  public minimised$: Observable<boolean> = this.minimised$$.asObservable();\n\n  shouldHaveShadow$: Observable<boolean>;\n\n  constructor(\n    private readonly timeRangeService: TimeRangeService,\n    private readonly translate: TranslateService,\n    private readonly filterService: FilterService,\n    private readonly router: Router,\n    private readonly reputationService: ReputationService,\n    private readonly locationsService: LocationsService,\n  ) {\n    // Watch the selection to produce the english version of the selection\n    this.dateFilterDisplay$ = this.timeRangeService.selectedTimeRangeKey$.pipe(\n      map((timeRangeKey) => {\n        const timeRangeSelected = AvailableTimeRangeOptions.find(\n          (timeRangeOption) => timeRangeOption.key === timeRangeKey,\n        );\n        return `${timeRangeSelected.name}`;\n      }),\n    );\n\n    this.locationFilterDisplay$ = combineLatest([\n      // Loaded, as we need to know if the selection is in the next load to carry it over\n      this.locationsService.currentAccountGroups$.pipe(filter((ls) => !!ls)),\n      this.selectedAccountGroupIds$,\n      this.translate.stream('COMMON.LOCATIONS'),\n    ]).pipe(\n      map(([brandLocations, accountGroupIds, locationsTranslated]) => {\n        const locs = accountGroupIds.map((accountGroupId) => brandLocations[accountGroupId]);\n        const locsInside = locs.filter((loc) => loc);\n        // If not all are present, set to just present\n        if (locs.length - locsInside.length) {\n          this.setAccountGroupIds(locsInside.map((loc) => loc.accountGroupId));\n          return '';\n        }\n\n        if (locsInside.length > 1) {\n          return `${locsInside.length} ${locationsTranslated}`;\n        } else {\n          return locsInside.map((loc) => `${loc.companyName} ${getLocation(loc)}`).join(', ');\n        }\n      }),\n    );\n\n    this.sourceFilterDisplay$ = combineLatest([\n      // Loaded, as we need to know if the selection is in the next load to carry it over\n      this.reputationService.brandSourcesFull$.pipe(filter((sourceMap) => !!sourceMap)),\n      this.selectedSourceIds$,\n      this.sourceIdCounts$,\n      this.translate.stream('COMMON.REVIEW_OR_LISTING_SOURCES'),\n    ]).pipe(\n      map(([brandSources, selectedSourceIds, sourceIdCounts, sourcesTranslated]) => {\n        const sources = selectedSourceIds.map((sourceId) => brandSources.get(sourceId));\n        const sourcesInside = sources.filter((source) => source);\n        // If not all are present, set to just present and exit early\n        if (sources.length - sourcesInside.length) {\n          this.setSourceIds(sourcesInside.map((source) => source.sourceId + ''));\n          return '';\n        }\n\n        // If there's more than X, just display the count of selected\n        if (sourcesInside.length > 2) {\n          return `${sourcesInside.length} ${sourcesTranslated}`;\n        } else {\n          // Use counts if present\n          if (sourceIdCounts) {\n            return sourcesInside\n              .map((source) => `${source.name} ${sourceIdCounts.get(source.sourceId + '')}`)\n              .join(', ');\n          } else {\n            return sourcesInside.map((source) => `${source.name}`).join(', ');\n          }\n        }\n      }),\n    );\n\n    this.sourceOptions$ = combineLatest([this.sourceIdCounts$$, this.reputationService.brandSourcesFull$]).pipe(\n      map(([countMap, sourceMap]) => {\n        if (!sourceMap) {\n          return [];\n        }\n        return (\n          Array.from(sourceMap.keys())\n            .map((sourceId) => {\n              const source = sourceMap.get(sourceId + '');\n              const count = countMap ? countMap.get(sourceId + '') : null;\n              return {\n                value: sourceId,\n                valueCount: count,\n                name: count !== null ? `${source.name} (${count})` : `${source.name}`,\n              };\n            })\n            // TODO: Sort by count?\n            .sort((a, b) => a.name.localeCompare(b.name))\n        );\n      }),\n    );\n\n    this.reputationService.brandSources$\n      .pipe(takeUntilDestroyed())\n      .subscribe((sourceIds) => this.filterService.setEnabledSources(sourceIds.map((sourceId) => sourceId.toString())));\n    this.selectedSourceIds$\n      .pipe(takeUntilDestroyed())\n      .subscribe((sourceIds) => this.filterService.setFilteredSources(sourceIds));\n\n    this.shouldHaveShadow$ = this.router.events.pipe(\n      filter((event) => event instanceof ActivationEnd && event.snapshot.children.length === 0),\n      map((event: ActivationEnd) => {\n        return event.snapshot.data['pageId'] !== PageId.multi_location_report;\n      }),\n      startWith(\n        (function (_this): boolean {\n          let route = _this.router.routerState.root;\n          while (route.firstChild) {\n            route = route.firstChild;\n          }\n          if (route.snapshot) {\n            return route.snapshot.data['pageId'] !== PageId.multi_location_report;\n          }\n        })(this),\n      ),\n      shareReplay({ refCount: true, bufferSize: 1 }),\n    );\n  }\n\n  setMinimizedStatus(status: boolean): void {\n    this.minimised$$.next(status);\n  }\n\n  openDialog(dialog: DialogOpenTypes): void {\n    this.openDialog$.next(dialog);\n  }\n\n  getAccountGroupIds(): string[] {\n    return this.selectedAccountGroupIds$$.getValue();\n  }\n  setAccountGroupIds(accountGroupIds: string[]): void {\n    this.selectedAccountGroupIds$$.next(accountGroupIds);\n  }\n  clearAccountGroupIds(): void {\n    this.selectedAccountGroupIds$$.next([]);\n  }\n\n  getSourceIds(): string[] {\n    return this.selectedSourceIds$$.getValue();\n  }\n  setSourceIds(sourceIds: string[]): void {\n    this.selectedSourceIds$$.next(sourceIds);\n  }\n  addSourceId(sourceId: string): void {\n    const sources = this.selectedSourceIds$$.getValue();\n    if (sources.includes(sourceId)) {\n      return;\n    }\n    this.selectedSourceIds$$.next([...sources, sourceId]);\n  }\n  removeSourceId(sourceId: string): void {\n    const sources = this.selectedSourceIds$$.getValue();\n    const newSources = sources.filter((id) => id !== sourceId);\n    if (sources.length !== newSources.length) {\n      this.selectedSourceIds$$.next(newSources);\n    }\n  }\n  clearSourceIds(): void {\n    this.selectedSourceIds$$.next([]);\n  }\n}\n", "import { DecimalPipe } from '@angular/common';\nimport { Observable } from 'rxjs';\nimport { MetricResult, QueryMetricsResponse, ResourceMetricResult } from '@vendasta/multi-location-analytics';\nimport { map } from 'rxjs/operators';\n\nconst rounderPipe = new DecimalPipe(`en-US`);\n\n// round uses an angular decimal pipe for consistent rounding logic\nexport function round(value: number, pipeOpts: string): number | null {\n  const val = rounderPipe.transform(value, pipeOpts);\n  return val === null ? null : +val.replace(',', '');\n}\n\nexport class Row {\n  constructor(\n    public values: any[],\n    public measures: any[],\n  ) {}\n}\n\nexport function rowify(r: ResourceMetricResult): Row[] {\n  if (!r.metrics || !r.metrics.metrics) {\n    return [];\n  }\n  const res = r.metrics.metrics.map(function (m: MetricResult): Row[] {\n    return parse(m, new Row([], []));\n  });\n  const rows = [];\n  res.forEach((singleDayMeasureValues) => {\n    rows.push(singleDayMeasureValues[0]);\n  });\n  return rows;\n}\n\nfunction parse(m: MetricResult, r: Row): Row[] {\n  r.values.push(m.dimension);\n  if (!m.results || !m.results.metrics) {\n    r.measures.push(m.measures);\n    return [r];\n  }\n  const all = m.results.metrics.map(function (val: MetricResult): Row[] {\n    return parse(val, r);\n  });\n  return all.reduce((acc, val) => acc.concat(val), []);\n}\n\nexport class QueryMetricsResponseDelta {\n  readonly currentPeriodRows$: Observable<Row[]>;\n  readonly previousPeriodRows$: Observable<Row[]>;\n  constructor(\n    public currentPeriod$: Observable<QueryMetricsResponse>,\n    public prevPeriod$: Observable<QueryMetricsResponse>,\n  ) {\n    this.currentPeriodRows$ = this.currentPeriod$.pipe(\n      map((r) => {\n        if (!r) {\n          return null;\n        }\n        return rowify(r.metricResults[0]);\n      }),\n    );\n    this.previousPeriodRows$ = this.prevPeriod$.pipe(\n      map((r) => {\n        if (!r) {\n          return null;\n        }\n        return rowify(r.metricResults[0]);\n      }),\n    );\n  }\n}\n", "import { Injectable } from '@angular/core';\nimport {\n  Alignment,\n  AlignmentPeriod,\n  AlignmentPeriodCalendar,\n  AnalyticsApiService,\n  BusinessResourceId,\n  CompositeFilter,\n  CompositeFilterOperator,\n  DateRange,\n  FieldFilter,\n  FieldFilterOperator,\n  FieldFilterOperatorFunction,\n  Filter,\n  GroupBy,\n  GroupByDimension,\n  GroupByExcludeCombination,\n  GroupByOperator,\n  GroupResourceId,\n  Measure,\n  MeasureAggregate,\n  MeasureAggregateOperator,\n  Order,\n  PropertyType,\n  QueryMetricsRequest,\n  QueryMetricsResponse,\n  ResourceId,\n  TypedValue,\n  UnaryFilter,\n  UnaryFilterOperator,\n} from '@vendasta/multi-location-analytics';\nimport dayjs from 'dayjs';\nimport utc from 'dayjs/plugin/utc';\nimport moment from 'moment/moment';\nimport { Observable, combineLatest, of } from 'rxjs';\nimport { debounceTime, filter, map, shareReplay, startWith, switchMap } from 'rxjs/operators';\nimport { partnerId } from '../../globals';\nimport { BrandFilterContainerService } from '../brands/brand-filter-container/brand-filter-container.service';\nimport { BrandsService } from '../brands/brands.service';\nimport { LocationsService, isAccountGroup, isBrand } from '../locations';\nimport { ReputationService } from '../reputation';\nimport { FilterService } from '../shared/filter-service.service';\nimport {\n  alignUTCDateToLocal,\n  generateDates,\n  getAlignmentPeriodForRange,\n  getGranularityForRange,\n  previousPeriodMoment,\n} from '../shared/time-range-shared';\nimport { CUSTOM_TIME_RANGE_KEYS, TimeRangeService } from '../shared/time-range.service';\nimport { QueryMetricsResponseDelta } from './helpers';\ndayjs.extend(utc);\n\nexport class StatByTime<T> {\n  public localAlignedTime: Date;\n\n  constructor(\n    public time: Date,\n    public stat: T,\n  ) {\n    this.localAlignedTime = alignUTCDateToLocal(time);\n  }\n}\n\nexport class BrandContext {\n  public readonly sourceIdsSet: Set<string>;\n\n  constructor(\n    public resourceIds: ResourceId[],\n    public startDate: Date,\n    public endDate: Date,\n    public timeRange: string,\n    public filters: Filter[],\n    // The brand's self-declared relevant sources, masking the data potentially present for irrelevant sources\n    public activeSources: number[] = [],\n    // The sources selected to filter to -- overrides the default of activeSources\n    public selectedSourceIds: string[] = [],\n    public groupBy: string[],\n  ) {\n    if (this.selectedSourceIds || this.activeSources) {\n      const sourceIds =\n        this.selectedSourceIds && this.selectedSourceIds.length\n          ? this.selectedSourceIds\n          : this.activeSources.map((num) => num + '');\n      this.sourceIdsSet = new Set(sourceIds);\n    }\n  }\n\n  public previousPeriod(): [Date, Date] {\n    const prevRange = previousPeriodMoment([dayjs(this.startDate), dayjs(this.endDate)]);\n    return [prevRange[0].toDate(), prevRange[1].toDate()];\n  }\n\n  public dateRange(forCurrentPeriod: boolean): [Date, Date] {\n    if (forCurrentPeriod) {\n      return [this.startDate, this.endDate];\n    }\n    return this.previousPeriod();\n  }\n\n  // GMB data is censored on API, this accounts for it\n  public GMBDateRange(forCurrentPeriod: boolean): [Date, Date] {\n    let [startDate, endDate] = this.dateRange(forCurrentPeriod);\n    startDate = dayjs.utc(startDate).toDate();\n    if (endDate >= dayjs.utc(dayjs().format('YYYY-MM-DD')).toDate()) {\n      endDate = dayjs.utc(endDate).subtract(5, 'days').toDate();\n    }\n    return [startDate, endDate];\n  }\n\n  // Review data is typically delayed, this accounts for it\n  public ReviewDateRange(forCurrentPeriod: boolean, onlyOffsetStartDate?: boolean): [Date, Date] {\n    // don't offset when timeRange is custom, month, quarter\n    if (CUSTOM_TIME_RANGE_KEYS.includes(this.timeRange)) {\n      return this.dateRange(forCurrentPeriod);\n    }\n    // TODO: only offset if end is today, and handle displaying that conditionally.\n    // TODO: this is currently implicit due to non-custom options always being `Last X`\n    let [startDate, endDate] = this.dateRange(forCurrentPeriod);\n    startDate = dayjs.utc(startDate).subtract(1, 'days').toDate();\n    if (!onlyOffsetStartDate) {\n      endDate = dayjs.utc(endDate).subtract(1, 'days').toDate();\n    }\n    return [startDate, endDate];\n  }\n\n  // AdIntel data is delayed, this accounts for it\n  public adIntelDateRange(forCurrentPeriod: boolean): [Date, Date] {\n    if (this.timeRange === 'custom') {\n      let [startDate, endDate] = this.dateRange(forCurrentPeriod);\n      startDate = dayjs.utc(startDate).subtract(0, 'days').toDate();\n      endDate = dayjs.utc(endDate).subtract(0, 'days').toDate();\n      return [startDate, endDate];\n    }\n    let [startDate, endDate] = this.dateRange(forCurrentPeriod);\n    startDate = dayjs.utc(startDate).subtract(0, 'days').toDate();\n    endDate = dayjs.utc(endDate).subtract(0, 'days').toDate();\n    return [startDate, endDate];\n  }\n\n  public alignmentPeriod(): AlignmentPeriodCalendar {\n    return getAlignmentPeriodForRange(this.startDate, this.endDate);\n  }\n\n  public buildFilter(filters?: Filter[]): Filter {\n    if ((!this.filters || this.filters.length === 0) && (!filters || filters.length === 0)) {\n      return null;\n    }\n\n    if (!filters) {\n      filters = [];\n    }\n    if (this.filters && this.filters.length > 0) {\n      filters = filters.concat(this.filters);\n    }\n\n    return new Filter({\n      compositeFilter: {\n        op: CompositeFilterOperator.AND,\n        filters: filters,\n      },\n    });\n  }\n\n  public buildActiveSourcesFilter(field = 'source_id'): Filter {\n    return new Filter({\n      fieldFilter: {\n        dimension: field,\n        operator: FieldFilterOperator.EQUAL,\n        operatorFunction: FieldFilterOperatorFunction.ANY,\n        value: {\n          value: Array.from(this.sourceIdsSet),\n          valueType: PropertyType.PROPERTY_TYPE_INT64,\n        },\n      },\n    });\n  }\n\n  public buildActualActiveSourcesFilter(field = 'source_id'): Filter {\n    return new Filter({\n      fieldFilter: {\n        dimension: field,\n        operator: FieldFilterOperator.EQUAL,\n        operatorFunction: FieldFilterOperatorFunction.ANY,\n        value: {\n          value: this.activeSources.map((n) => n + ''),\n          valueType: PropertyType.PROPERTY_TYPE_INT64,\n        },\n      },\n    });\n  }\n}\n\nfunction boolValue(value: boolean): TypedValue {\n  return new TypedValue({\n    value: value,\n    valueType: PropertyType.PROPERTY_TYPE_BOOL,\n  });\n}\n\nfunction stringValue(value: string): TypedValue {\n  return new TypedValue({\n    value: value,\n    valueType: PropertyType.PROPERTY_TYPE_STRING,\n  });\n}\n\nexport const isAccurateFilter = new Filter({\n  fieldFilter: new FieldFilter({\n    dimension: 'match_quality',\n    operator: FieldFilterOperator.EQUAL,\n    value: new TypedValue({\n      value: 'good',\n      valueType: PropertyType.PROPERTY_TYPE_STRING,\n    }),\n  }),\n});\nexport const isInaccurateFilter = new Filter({\n  fieldFilter: {\n    dimension: 'match_quality',\n    operator: FieldFilterOperator.NOT_EQUAL,\n    value: {\n      value: 'good',\n      valueType: PropertyType.PROPERTY_TYPE_STRING,\n    },\n  },\n});\nexport const isVerifiedFilter = new Filter({\n  fieldFilter: new FieldFilter({\n    dimension: 'is_verified',\n    operator: FieldFilterOperator.EQUAL,\n    value: boolValue(true),\n  }),\n});\nexport const isNotVerifiedFilter = new Filter({\n  fieldFilter: new FieldFilter({\n    dimension: 'is_verified',\n    operator: FieldFilterOperator.EQUAL,\n    value: boolValue(false),\n  }),\n});\nexport const isMissingFilter = new Filter({\n  unaryFilter: new UnaryFilter({\n    dimension: 'listing_id',\n    op: UnaryFilterOperator.IS_NULL,\n  }),\n});\nexport const isPotentialMissingFilter = new Filter({\n  fieldFilter: new FieldFilter({\n    dimension: 'is_missing',\n    operator: FieldFilterOperator.EQUAL,\n    value: boolValue(true),\n  }),\n});\n\ntype RequestBuilder = (brandsContext: BrandContext, curPeriod: boolean, groupBy: string[]) => QueryMetricsRequest;\n\n// Builds measures of error counts by field, error counts by accuracy level, and count of missing\nfunction buildListingCountMeasures(): Measure[] {\n  // Count wrong fields\n  const fields = [\n    'match_detail_name',\n    'match_detail_street_address',\n    'match_detail_locality',\n    'match_detail_region',\n    'match_detail_postal_code',\n    'match_detail_phone',\n    'match_detail_website',\n  ];\n  let measures = fields.map((field) => {\n    const fieldErrorFilter = new Filter({\n      fieldFilter: new FieldFilter({\n        dimension: field,\n        operator: FieldFilterOperator.EQUAL,\n        value: stringValue('not match'),\n      }),\n    });\n    return new Measure({\n      aggregate: new MeasureAggregate({\n        measure: '*',\n        aggOp: MeasureAggregateOperator.COUNT,\n        filter: new Filter({\n          compositeFilter: {\n            op: CompositeFilterOperator.AND,\n            filters: [fieldErrorFilter, isNotVerifiedFilter, isInaccurateFilter],\n          },\n        }),\n        alias: field,\n      }),\n    });\n  });\n\n  measures = measures.concat([\n    new Measure({\n      aggregate: new MeasureAggregate({\n        measure: '*',\n        aggOp: MeasureAggregateOperator.COUNT,\n        alias: 'num_accurate',\n        filter: {\n          compositeFilter: {\n            filters: [isAccurateFilter, isVerifiedFilter],\n            op: CompositeFilterOperator.OR,\n          },\n        },\n      }),\n    }),\n    new Measure({\n      aggregate: new MeasureAggregate({\n        measure: '*',\n        aggOp: MeasureAggregateOperator.COUNT,\n        alias: 'num_inaccurate',\n        filter: new Filter({\n          compositeFilter: {\n            filters: [isInaccurateFilter, isNotVerifiedFilter],\n            op: CompositeFilterOperator.AND,\n          },\n        }),\n      }),\n    }),\n    new Measure({\n      aggregate: new MeasureAggregate({\n        measure: '*',\n        aggOp: MeasureAggregateOperator.COUNT,\n        alias: 'num_missing',\n        filter: new Filter({\n          unaryFilter: new UnaryFilter({\n            dimension: 'listing_id',\n            op: UnaryFilterOperator.IS_NULL,\n          }),\n        }),\n      }),\n    }),\n    new Measure({\n      aggregate: new MeasureAggregate({\n        measure: '*',\n        aggOp: MeasureAggregateOperator.COUNT,\n        filter: isPotentialMissingFilter,\n        alias: 'num_potential_missing',\n      }),\n    }),\n    new Measure({\n      aggregate: new MeasureAggregate({\n        measure: '*',\n        aggOp: MeasureAggregateOperator.COUNT,\n        alias: 'num_ignoring_errors',\n        filter: isVerifiedFilter,\n      }),\n    }),\n  ]);\n  return measures;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class QueryService {\n  // BrandContext which is watched with minimal scoping, to trigger reactive querying of the following\n  public brandsContext$: Observable<BrandContext>;\n\n  // TODO: The following react to changes after being subscribed to, regardless of current subscribers, due to shareReplay.\n\n  // GMB: insights and the presence of connections\n  readonly insights$s: Map<string, QueryMetricsResponseDelta>;\n  readonly insightsTotals$: Map<string, QueryMetricsResponseDelta>;\n  readonly searchKeywords: QueryMetricsResponseDelta;\n  readonly gmbConnections$: Observable<QueryMetricsResponse>;\n\n  // AdIntel: view, open, click counts\n  readonly adIntelStats$: QueryMetricsResponseDelta;\n\n  // Reviews: Comparison counts rolled up by time for location and source. Average rating derived.\n  readonly reviews$s: Map<string, QueryMetricsResponseDelta>;\n  // ResponseTimes: Review response times\n  readonly responseTimes$s: Map<string, QueryMetricsResponseDelta>;\n  // Counts by status, source, and rating, for presenting manage scoping\n  readonly reviewCounts$: Observable<QueryMetricsResponse>;\n\n  // Listings: Listing Scores Data by time for location and source. Listing Score % derived.\n  readonly listingScore$: QueryMetricsResponseDelta;\n  // The latest, for presenting now vs then delta\n  readonly latestListingScore$: QueryMetricsResponseDelta;\n  // Counts by time and source, and by time, source, and quality. Used for presence over time and score over time.\n  readonly listingQuality$: QueryMetricsResponseDelta;\n  // Count of accurate listing fields by field on current listings\n  readonly listingMatchQuality$: Observable<QueryMetricsResponse>;\n  readonly listingMatchQualityTotals$: Observable<QueryMetricsResponse>;\n  // Counts by source, for filters, for presenting manage scoping\n  readonly listingsBySource$: Observable<QueryMetricsResponse>;\n  // Counts by source, presence/acccuracy ad field match, for filters, for presenting manage scoping\n  readonly listingCounts$: Observable<QueryMetricsResponse>;\n  // Counts by account group of listing accuracy\n  readonly listingAccuracyCountsByLocation$: QueryMetricsResponseDelta;\n  // Counts by  source of listing accuracy\n  readonly listingAccuracyCountsBySource$: QueryMetricsResponseDelta;\n\n  readonly listingAccuracyTotals$: QueryMetricsResponseDelta;\n\n  // Account Group: The ids in scope of filters, to be inflated and visualized.\n  readonly accountGroup$: Observable<QueryMetricsResponse>;\n  // Counts by Geo, for geo filter options\n  readonly accountGroupGeography$: Observable<QueryMetricsResponse>;\n  // Counts by Taxonomies (sets, not unnested), for taxonomy filter options\n  readonly accountGroupTaxonomies$: Observable<QueryMetricsResponse>;\n\n  // Social Connections: Service IDs, auth and token statuses. Filtered to authed and good token statuses.\n  readonly socialConnections$: Observable<QueryMetricsResponse>;\n  readonly facebookConnections$: Observable<QueryMetricsResponse>;\n\n  readonly reviewRequests: QueryMetricsResponseDelta;\n  readonly repReviewRequest$: QueryMetricsResponseDelta;\n\n  readonly resourceIds$ = this.locationsService.currentLocation$.pipe(\n    switchMap((location) => {\n      if (isBrand(location)) {\n        return this.brandsService.path$.pipe(\n          map((path) => {\n            return [\n              new ResourceId({\n                groupId: new GroupResourceId({\n                  groupPathNodes: path,\n                }),\n              }),\n            ];\n          }),\n        );\n      }\n      if (isAccountGroup(location)) {\n        return of([\n          new ResourceId({\n            businessId: new BusinessResourceId({\n              businessId: location.accountGroupId,\n            }),\n          }),\n        ]);\n      }\n      return of([]);\n    }),\n  );\n\n  constructor(\n    private readonly analyticsService: AnalyticsApiService,\n    private readonly timeRangeService: TimeRangeService,\n    private readonly filterService: FilterService,\n    private readonly brandFiltersService: BrandFilterContainerService,\n    private readonly reputationService: ReputationService,\n    private readonly locationsService: LocationsService,\n    private readonly brandsService: BrandsService,\n  ) {\n    this.brandsContext$ = combineLatest([\n      this.resourceIds$,\n      this.timeRangeService.utcAlignedDateRange$.pipe(filter(([startDate, endDate]) => !!startDate && !!endDate)),\n      this.filterService.filters$,\n      this.reputationService.brandSources$,\n      this.brandFiltersService.selectedSourceIds$,\n      this.timeRangeService.selectedTimeRangeKey$,\n    ]).pipe(\n      debounceTime(10),\n      map(([resourceIds, [startDate, endDate], filters, activatedSources, selectedSourceIds, timeRange]) => {\n        return new BrandContext(\n          resourceIds,\n          startDate,\n          endDate,\n          timeRange,\n          filters,\n          activatedSources,\n          selectedSourceIds,\n          ['source_id'],\n        );\n      }),\n      shareReplay({ refCount: true, bufferSize: 1 }),\n    );\n\n    this.insights$s = new Map<string, QueryMetricsResponseDelta>([\n      [\n        'account_group_id',\n        this.fetchMetric(\n          this.buildBrandContext$(['partnerId', 'path', 'dateRange', 'timeRange', 'filters']),\n          this.buildGMBInsightsRequest,\n          ['account_group_id'],\n        ),\n      ],\n    ]);\n\n    this.insightsTotals$ = new Map<string, QueryMetricsResponseDelta>([\n      [\n        'account_group_id',\n        this.fetchMetric(\n          this.buildBrandContext$(['partnerId', 'path', 'dateRange', 'timeRange', 'filters']),\n          this.buildGMBInsightsTotalsRequest,\n          ['account_group_id'],\n        ),\n      ],\n    ]);\n\n    this.searchKeywords = this.fetchMetric(\n      this.buildBrandContext$(['partnerId', 'path', 'dateRange', 'timeRange', 'filters']),\n      this.buildGMBSearchKeywordsRequest,\n      ['account_group_id'],\n    );\n\n    const reviewContext$ = this.buildBrandContext$([\n      'partnerId',\n      'path',\n      'dateRange',\n      'timeRange',\n      'activeSources',\n      'selectedSourceIds',\n      'filters',\n    ]);\n    this.reviews$s = new Map<string, QueryMetricsResponseDelta>([\n      ['account_group_id', this.fetchMetric(reviewContext$, this.buildReviewsRequest, ['account_group_id'])],\n      [\n        'account_group_id|allTime',\n        this.fetchMetric(reviewContext$, this.buildAlltimeReviewsRequest, ['account_group_id']),\n      ],\n      ['source_id', this.fetchMetric(reviewContext$, this.buildReviewsRequest, ['source_id'])],\n      [\n        'account_group_id|source_id',\n        this.fetchMetric(reviewContext$, this.buildReviewsRequest, ['account_group_id', 'source_id']),\n      ],\n      [\n        // 50 is an arbitrary limit, due to doing some processing and filtering on the front end the number of\n        // rows received is larger then the rows displayed, so by setting the limit to 50 the queries tended to\n        // be fast enough for the preview, while being large enough that the preview usually has a sufficient\n        // quantity of data to look good.\n        'account_group_id|source_id|preview',\n        this.fetchMetric(reviewContext$, this.buildReviewsRequest, ['account_group_id', 'source_id'], 50),\n      ],\n    ]);\n\n    this.responseTimes$s = new Map<string, QueryMetricsResponseDelta>([\n      ['account_group_id', this.fetchMetric(reviewContext$, this.buildResponseTimeRequest, ['account_group_id'])],\n      [\n        'account_group_id|allTime',\n        this.fetchMetric(reviewContext$, this.buildAllTimeResponseTimeRequest, ['account_group_id']),\n      ],\n      ['source_id', this.fetchMetric(reviewContext$, this.buildResponseTimeRequest, ['source_id'])],\n    ]);\n\n    // Does not respond to *source* filters -- provided to give context to filter options which include sources\n    this.reviewCounts$ = this.buildBrandContext$([\n      'partnerId',\n      'path',\n      'dateRange',\n      'timeRange',\n      'activeSources',\n      'filters',\n    ]).pipe(\n      switchMap((brandsContext: BrandContext) => {\n        // Only offset the start so that we match\n        const [startDate, endDate] = brandsContext.ReviewDateRange(true, true);\n        return this.analyticsService.queryMetrics(\n          new QueryMetricsRequest({\n            partnerId,\n            metricName: 'reviews',\n            resourceIds: brandsContext.resourceIds,\n            timeRange: inclusiveExclusive(startDate, endDate),\n            measures: [\n              new Measure({\n                aggregate: new MeasureAggregate({\n                  measure: '*',\n                  aggOp: MeasureAggregateOperator.COUNT,\n                }),\n              }),\n            ],\n            filter: brandsContext.buildFilter([brandsContext.buildActualActiveSourcesFilter()]),\n            groupBy: new GroupBy({\n              dimension: [\n                { dimension: 'action_status' },\n                { dimension: 'source_id' },\n                { dimension: 'rating' },\n                { dimension: 'edited' },\n                { dimension: 'deleted_status' },\n              ],\n              groupByOperator: GroupByOperator.OPERATOR_GROUP_BY,\n            }),\n          }),\n        );\n      }),\n      shareReplay({ refCount: true, bufferSize: 1 }),\n    );\n\n    // Does not respond to filters -- provided to give context to filter options\n    this.accountGroupGeography$ = this.buildBrandContext$(['partnerId', 'path']).pipe(\n      switchMap((brandsContext: BrandContext) => {\n        return this.analyticsService\n          .queryMetrics(this.buildAccountGroupGeographyRequest(brandsContext))\n          .pipe(startWith(null as QueryMetricsResponse));\n      }),\n      shareReplay({ refCount: true, bufferSize: 1 }),\n    );\n\n    // Does not respond to filters -- provided to give context to filter options\n    this.accountGroupTaxonomies$ = this.buildBrandContext$(['partnerId', 'path']).pipe(\n      switchMap((brandsContext: BrandContext) => {\n        return this.analyticsService\n          .queryMetrics(this.buildAccountGroupTaxonomyRequest(brandsContext))\n          .pipe(startWith(null as QueryMetricsResponse));\n      }),\n      shareReplay({ refCount: true, bufferSize: 1 }),\n    );\n\n    this.accountGroup$ = this.buildBrandContext$(['partnerId', 'path', 'dateRange', 'filters']).pipe(\n      switchMap((brandsContext: BrandContext) => {\n        return this.analyticsService\n          .queryMetrics(this.buildAccountGroupRequest(brandsContext))\n          .pipe(startWith(null as QueryMetricsResponse));\n      }),\n      shareReplay({ refCount: true, bufferSize: 1 }),\n    );\n\n    this.listingScore$ = this.fetchMetric(\n      this.buildBrandContext$(['partnerId', 'path', 'dateRange', 'timeRange', 'filters']),\n      this.buildListingScoreRequest,\n      [],\n    );\n\n    this.latestListingScore$ = this.fetchMetric(\n      this.buildBrandContext$(['partnerId', 'path', 'dateRange', 'filters']),\n      this.buildLatestListingScoreRequest,\n      [],\n    );\n\n    this.listingQuality$ = this.fetchMetric(\n      this.buildBrandContext$([\n        'partnerId',\n        'path',\n        'dateRange',\n        'timeRange',\n        'activeSources',\n        'selectedSourceIds',\n        'filters',\n      ]),\n      this.buildListingQualityRequest,\n      [],\n    );\n\n    this.listingMatchQuality$ = this.buildBrandContext$([\n      'partnerId',\n      'path',\n      'activeSources',\n      'selectedSourceIds',\n      'filters',\n    ]).pipe(\n      switchMap((brandsContext: BrandContext) => {\n        return this.analyticsService\n          .queryMetrics(\n            this.buildListingMatchQualityRequest(\n              brandsContext,\n              new GroupBy({\n                dimension: [\n                  new GroupByDimension({\n                    dimension: 'resource__account_group_id',\n                  }),\n                  new GroupByDimension({\n                    dimension: 'join__source_id',\n                  }),\n                ],\n              }),\n            ),\n          )\n          .pipe(startWith(null as QueryMetricsResponse));\n      }),\n      shareReplay({ refCount: true, bufferSize: 1 }),\n    );\n\n    this.listingMatchQualityTotals$ = this.buildBrandContext$([\n      'partnerId',\n      'path',\n      'activeSources',\n      'selectedSourceIds',\n      'filters',\n    ]).pipe(\n      switchMap((brandsContext: BrandContext) => {\n        return this.analyticsService\n          .queryMetrics(this.buildListingMatchQualityRequest(brandsContext, new GroupBy()))\n          .pipe(startWith(null as QueryMetricsResponse));\n      }),\n      shareReplay({ refCount: true, bufferSize: 1 }),\n    );\n\n    // Does not respond to *source* filters -- provided to give context to filter options which include sources\n    this.listingCounts$ = this.fetchUnboundedMetric(\n      this.buildBrandContext$(['partnerId', 'path', 'activeSources', 'filters']),\n      this.buildListingCountRequest,\n    );\n\n    this.listingAccuracyCountsByLocation$ = this.fetchMetric(\n      this.buildBrandContext$(['partnerId', 'path', 'activeSources', 'filters', 'selectedSourceIds', 'dateRange']),\n      this.buildBusinessDataListingCountRequest,\n      ['resource__account_group_id'],\n    );\n\n    this.listingAccuracyCountsBySource$ = this.fetchMetric(\n      this.buildBrandContext$(['partnerId', 'path', 'activeSources', 'filters', 'selectedSourceIds', 'dateRange']),\n      this.buildBusinessDataListingCountRequest,\n      ['join__source_id'],\n    );\n\n    this.listingAccuracyTotals$ = this.fetchMetric(\n      this.buildBrandContext$(['partnerId', 'path', 'activeSources', 'filters', 'selectedSourceIds', 'dateRange']),\n      this.buildBusinessDataListingCountRequest,\n      [],\n    );\n\n    this.adIntelStats$ = this.fetchMetric(\n      this.buildBrandContext$(['partnerId', 'path', 'dateRange', 'timeRange', 'filters']),\n      this.buildAdIntelStatsRequest,\n      [],\n    );\n\n    // Does not react to filters -- provided solely for review response UI\n    this.gmbConnections$ = this.buildBrandContext$(['partnerId', 'path']).pipe(\n      switchMap((brandsContext: BrandContext) => {\n        return this.analyticsService\n          .queryMetrics(this.buildGMBLocationsRequest(brandsContext))\n          .pipe(startWith(null as QueryMetricsResponse));\n      }),\n      shareReplay({ refCount: true, bufferSize: 1 }),\n    );\n\n    // Does not react to filters -- provided solely for connection UI\n    this.socialConnections$ = this.buildBrandContext$(['partnerId', 'path', 'dateRange']).pipe(\n      switchMap((brandsContext) => {\n        return this.analyticsService\n          .queryMetrics(this.buildSocialRequest(brandsContext, true, false))\n          .pipe(startWith(null as QueryMetricsResponse));\n      }),\n      shareReplay({ refCount: true, bufferSize: 1 }),\n    );\n\n    this.facebookConnections$ = this.buildBrandContext$(['partnerId', 'path', 'dateRange']).pipe(\n      switchMap((brandsContext) => {\n        return this.analyticsService\n          .queryMetrics(this.buildSocialRequest(brandsContext, true, true))\n          .pipe(startWith(null as QueryMetricsResponse));\n      }),\n      shareReplay({ refCount: true, bufferSize: 1 }),\n    );\n\n    const reviewsRequestContext$ = this.buildBrandContext$(['partnerId', 'path', 'dateRange', 'filters']);\n    this.reviewRequests = this.fetchMetric(reviewsRequestContext$, this.buildReviewRequestsRequest, ['event_type']);\n    this.repReviewRequest$ = this.fetchMetric(reviewsRequestContext$, this.buildRepReviewRequestsRequest, []);\n  }\n\n  fetchMetric(\n    brandsContext$: Observable<BrandContext>,\n    requestBuilder: RequestBuilder,\n    groupBy: string[],\n    limit?: number,\n  ): QueryMetricsResponseDelta {\n    const current = brandsContext$.pipe(\n      switchMap((brandsContext: BrandContext) => {\n        const req = requestBuilder(brandsContext, true, groupBy);\n        req.limit = limit;\n        return this.analyticsService.queryMetrics(req);\n      }),\n      shareReplay({ refCount: true, bufferSize: 1 }),\n    );\n    const prev = brandsContext$.pipe(\n      switchMap((brandsContext: BrandContext) => {\n        const req = requestBuilder(brandsContext, false, groupBy);\n        req.limit = limit;\n        return this.analyticsService.queryMetrics(req);\n      }),\n      shareReplay({ refCount: true, bufferSize: 1 }),\n    );\n    return new QueryMetricsResponseDelta(current, prev);\n  }\n\n  fetchUnboundedMetric(\n    brandsContext$: Observable<BrandContext>,\n    requestBuilder: RequestBuilder,\n  ): Observable<QueryMetricsResponse> {\n    return brandsContext$.pipe(\n      switchMap((brandsContext: BrandContext) => {\n        return this.analyticsService.queryMetrics(requestBuilder(brandsContext, true, []));\n      }),\n      shareReplay({ refCount: true, bufferSize: 1 }),\n    );\n  }\n\n  buildReviewsRequest(brandsContext: BrandContext, forCurrentPeriod: boolean, groupBy: string[]): QueryMetricsRequest {\n    const [startDate, endDate] = brandsContext.ReviewDateRange(forCurrentPeriod);\n    return new QueryMetricsRequest({\n      partnerId,\n      metricName: 'reviews',\n      resourceIds: brandsContext.resourceIds,\n      timeRange: inclusiveExclusive(startDate, endDate),\n      measures: [\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'rating_one_star',\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            filter: new Filter({\n              fieldFilter: {\n                dimension: 'rating',\n                operator: FieldFilterOperator.EQUAL,\n                value: {\n                  value: '1',\n                },\n              },\n            }),\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'rating_two_star',\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            filter: new Filter({\n              fieldFilter: {\n                dimension: 'rating',\n                operator: FieldFilterOperator.EQUAL,\n                value: {\n                  value: '2',\n                },\n              },\n            }),\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'rating_three_star',\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            filter: new Filter({\n              fieldFilter: {\n                dimension: 'rating',\n                operator: FieldFilterOperator.EQUAL,\n                value: {\n                  value: '3',\n                },\n              },\n            }),\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'rating_four_star',\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            filter: new Filter({\n              fieldFilter: {\n                dimension: 'rating',\n                operator: FieldFilterOperator.EQUAL,\n                value: {\n                  value: '4',\n                },\n              },\n            }),\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'rating_five_star',\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            filter: new Filter({\n              fieldFilter: {\n                dimension: 'rating',\n                operator: FieldFilterOperator.EQUAL,\n                value: {\n                  value: '5',\n                },\n              },\n            }),\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'rating_none',\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            filter: new Filter({\n              fieldFilter: {\n                dimension: 'rating',\n                operator: FieldFilterOperator.EQUAL,\n                value: {\n                  value: 'none',\n                },\n              },\n            }),\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'responded',\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            filter: new Filter({\n              compositeFilter: {\n                op: CompositeFilterOperator.OR,\n                filters: [\n                  new Filter({\n                    fieldFilter: {\n                      dimension: 'action_status',\n                      operator: FieldFilterOperator.EQUAL,\n                      value: {\n                        value: 'owner-responded',\n                      },\n                    },\n                  }),\n                  new Filter({\n                    fieldFilter: {\n                      dimension: 'action_status',\n                      operator: FieldFilterOperator.EQUAL,\n                      value: {\n                        value: 'digital-agent-responded',\n                      },\n                    },\n                  }),\n                ],\n              },\n            }),\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'unresponded',\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            filter: new Filter({\n              fieldFilter: {\n                dimension: 'action_status',\n                operator: FieldFilterOperator.EQUAL,\n                value: {\n                  value: 'action-required',\n                },\n              },\n            }),\n          }),\n        }),\n      ],\n      filter: brandsContext.buildFilter([brandsContext.buildActiveSourcesFilter()]),\n      groupBy: new GroupBy({\n        dimension: groupBy\n          .map((dim) => {\n            return { dimension: dim };\n          })\n          .concat([{ dimension: 'published' }]),\n        groupByOperator: GroupByOperator.OPERATOR_CUBE,\n      }),\n      alignment: Alignment.ALIGN_DELTA,\n      alignmentPeriod: new AlignmentPeriod({\n        // This data is not shown over time, so having less unnecessary buckets makes performance better, if\n        // higher granularity is needed in the future this can be set to `brandsContext.alignmentPeriod()`\n        calendar: AlignmentPeriodCalendar.CALENDAR_YEAR,\n      }),\n    });\n  }\n\n  buildAlltimeReviewsRequest(brandsContext: BrandContext, _: boolean, groupBy: string[]): QueryMetricsRequest {\n    return new QueryMetricsRequest({\n      partnerId,\n      metricName: 'reviews',\n      resourceIds: brandsContext.resourceIds,\n      measures: [\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'rating_one_star',\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            filter: new Filter({\n              fieldFilter: {\n                dimension: 'rating',\n                operator: FieldFilterOperator.EQUAL,\n                value: {\n                  value: '1',\n                },\n              },\n            }),\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'rating_two_star',\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            filter: new Filter({\n              fieldFilter: {\n                dimension: 'rating',\n                operator: FieldFilterOperator.EQUAL,\n                value: {\n                  value: '2',\n                },\n              },\n            }),\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'rating_three_star',\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            filter: new Filter({\n              fieldFilter: {\n                dimension: 'rating',\n                operator: FieldFilterOperator.EQUAL,\n                value: {\n                  value: '3',\n                },\n              },\n            }),\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'rating_four_star',\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            filter: new Filter({\n              fieldFilter: {\n                dimension: 'rating',\n                operator: FieldFilterOperator.EQUAL,\n                value: {\n                  value: '4',\n                },\n              },\n            }),\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'rating_five_star',\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            filter: new Filter({\n              fieldFilter: {\n                dimension: 'rating',\n                operator: FieldFilterOperator.EQUAL,\n                value: {\n                  value: '5',\n                },\n              },\n            }),\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'rating_none',\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            filter: new Filter({\n              fieldFilter: {\n                dimension: 'rating',\n                operator: FieldFilterOperator.EQUAL,\n                value: {\n                  value: 'none',\n                },\n              },\n            }),\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'responded',\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            filter: new Filter({\n              compositeFilter: {\n                op: CompositeFilterOperator.OR,\n                filters: [\n                  new Filter({\n                    fieldFilter: {\n                      dimension: 'action_status',\n                      operator: FieldFilterOperator.EQUAL,\n                      value: {\n                        value: 'owner-responded',\n                      },\n                    },\n                  }),\n                  new Filter({\n                    fieldFilter: {\n                      dimension: 'action_status',\n                      operator: FieldFilterOperator.EQUAL,\n                      value: {\n                        value: 'digital-agent-responded',\n                      },\n                    },\n                  }),\n                ],\n              },\n            }),\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'unresponded',\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            filter: new Filter({\n              fieldFilter: {\n                dimension: 'action_status',\n                operator: FieldFilterOperator.EQUAL,\n                value: {\n                  value: 'action-required',\n                },\n              },\n            }),\n          }),\n        }),\n      ],\n      filter: brandsContext.buildFilter([brandsContext.buildActiveSourcesFilter()]),\n      groupBy: new GroupBy({\n        dimension: groupBy\n          .map((dim) => {\n            return { dimension: dim };\n          })\n          .concat([{ dimension: 'published' }]),\n        groupByOperator: GroupByOperator.OPERATOR_CUBE,\n      }),\n    });\n  }\n\n  buildResponseTimeRequest(\n    brandsContext: BrandContext,\n    forCurrentPeriod: boolean,\n    groupBy: string[],\n  ): QueryMetricsRequest {\n    const [startDate, endDate] = brandsContext.ReviewDateRange(forCurrentPeriod);\n    const req = new QueryMetricsRequest({\n      partnerId,\n      metricName: 'review_response_time',\n      resourceIds: brandsContext.resourceIds,\n    });\n    req.measures = [\n      new Measure({\n        aggregate: new MeasureAggregate({\n          measure: 'response_time',\n          aggOp: MeasureAggregateOperator.AVG,\n          alias: 'response_time',\n        }),\n      }),\n    ];\n    req.groupBy = new GroupBy({\n      dimension: groupBy.map((dim) => {\n        return { dimension: dim };\n      }),\n    });\n    req.timeRange = inclusiveExclusive(startDate, endDate);\n    return req;\n  }\n\n  buildAllTimeResponseTimeRequest(\n    brandsContext: BrandContext,\n    forCurrentPeriod: boolean,\n    groupBy: string[],\n  ): QueryMetricsRequest {\n    const req = new QueryMetricsRequest({\n      partnerId,\n      metricName: 'review_response_time',\n      resourceIds: brandsContext.resourceIds,\n    });\n    req.measures = [\n      new Measure({\n        aggregate: new MeasureAggregate({\n          measure: 'response_time',\n          aggOp: MeasureAggregateOperator.AVG,\n          alias: 'response_time',\n        }),\n      }),\n    ];\n    req.groupBy = new GroupBy({\n      dimension: groupBy.map((dim) => {\n        return { dimension: dim };\n      }),\n    });\n    return req;\n  }\n\n  buildGMBInsightsRequest(\n    brandsContext: BrandContext,\n    forCurrentPeriod: boolean,\n    groupBy: string[] = ['account_group_id'],\n  ): QueryMetricsRequest {\n    const [startDate, endDate] = brandsContext.GMBDateRange(forCurrentPeriod);\n    return new QueryMetricsRequest({\n      partnerId,\n      metricName: 'gmb_insights',\n      resourceIds: brandsContext.resourceIds,\n      timeRange: inclusiveExclusive(startDate, endDate),\n      measures: [\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'views_maps',\n            measure: 'views_maps',\n            aggOp: MeasureAggregateOperator.SUM,\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'views_search',\n            measure: 'views_search',\n            aggOp: MeasureAggregateOperator.SUM,\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'actions_website',\n            measure: 'actions_website',\n            aggOp: MeasureAggregateOperator.SUM,\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'actions_phone',\n            measure: 'actions_phone',\n            aggOp: MeasureAggregateOperator.SUM,\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'actions_driving_directions',\n            measure: 'actions_driving_directions',\n            aggOp: MeasureAggregateOperator.SUM,\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'actions_bookings',\n            measure: 'actions_bookings',\n            aggOp: MeasureAggregateOperator.SUM,\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'actions_conversations',\n            measure: 'actions_conversations',\n            aggOp: MeasureAggregateOperator.SUM,\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'actions_food_orders',\n            measure: 'actions_food_orders',\n            aggOp: MeasureAggregateOperator.SUM,\n          }),\n        }),\n      ],\n      filter: brandsContext.buildFilter(null),\n      groupBy: new GroupBy({\n        dimension: groupBy\n          .map((dim) => {\n            return { dimension: dim };\n          })\n          .concat([{ dimension: 'start_time' }]),\n        groupByOperator: GroupByOperator.OPERATOR_CUBE,\n        excludeCombination: [\n          new GroupByExcludeCombination({\n            dimensions: ['account_group_id', 'start_time'],\n          }),\n        ],\n      }),\n      alignment: Alignment.ALIGN_DELTA,\n      alignmentPeriod: new AlignmentPeriod({\n        calendar: brandsContext.alignmentPeriod(),\n      }),\n    });\n  }\n\n  buildGMBInsightsTotalsRequest(\n    brandsContext: BrandContext,\n    forCurrentPeriod: boolean,\n    groupBy: string[] = ['account_group_id'],\n  ): QueryMetricsRequest {\n    const [startDate, endDate] = brandsContext.GMBDateRange(forCurrentPeriod);\n    return new QueryMetricsRequest({\n      partnerId,\n      metricName: 'gmb_insights',\n      resourceIds: brandsContext.resourceIds,\n      timeRange: inclusiveInclusive(startDate, endDate),\n      measures: [\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'photos_count_customers',\n            measure: 'photos_count_customers',\n            aggOp: MeasureAggregateOperator.MAX,\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            alias: 'photos_count_merchant',\n            measure: 'photos_count_merchant',\n            aggOp: MeasureAggregateOperator.MAX,\n          }),\n        }),\n      ],\n      filter: brandsContext.buildFilter(null),\n      groupBy: new GroupBy({\n        dimension: groupBy\n          .map((dim) => {\n            return { dimension: dim };\n          })\n          .concat([\n            new GroupByDimension({\n              limitDimension: {\n                dimension: 'start_time',\n                order: Order.ORDER_DESC,\n                limit: 4,\n              },\n            }),\n          ]),\n        groupByOperator: GroupByOperator.OPERATOR_GROUP_BY,\n      }),\n    });\n  }\n\n  buildGMBSearchKeywordsRequest(\n    brandsContext: BrandContext,\n    forCurrentPeriod: boolean,\n    groupBy: string[] = ['account_group_id'],\n  ): QueryMetricsRequest {\n    const [startDate, endDate] = brandsContext.dateRange(forCurrentPeriod);\n\n    const start = moment(startDate).utc().date(1);\n\n    return new QueryMetricsRequest({\n      partnerId: partnerId,\n      metricName: 'gmb_search_keywords',\n      resourceIds: brandsContext.resourceIds,\n      timeRange: inclusiveInclusive(start.toDate(), endDate),\n      measures: [\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: 'value',\n            aggOp: MeasureAggregateOperator.SUM,\n          }),\n        }),\n      ],\n      filter: brandsContext.buildFilter(null),\n      groupBy: new GroupBy({\n        dimension: groupBy\n          .map((dim) => {\n            return { dimension: dim };\n          })\n          .concat([{ dimension: 'month_date' }]),\n        groupByOperator: GroupByOperator.OPERATOR_CUBE,\n        excludeCombination: [\n          new GroupByExcludeCombination({\n            dimensions: ['account_group_id', 'month_date'],\n          }),\n        ],\n      }),\n      alignment: Alignment.ALIGN_DELTA,\n      alignmentPeriod: new AlignmentPeriod({\n        calendar: AlignmentPeriodCalendar.CALENDAR_MONTH,\n      }),\n    });\n  }\n\n  private buildAccountGroupGeographyRequest(brandContext: BrandContext): QueryMetricsRequest {\n    return new QueryMetricsRequest({\n      partnerId,\n      metricName: 'account_group',\n      resourceIds: brandContext.resourceIds,\n      measures: [\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n          }),\n        }),\n      ],\n      groupBy: new GroupBy({\n        dimension: [\n          { dimension: 'account_group__country' },\n          { dimension: 'account_group__state' },\n          { dimension: 'account_group__city' },\n        ],\n        groupByOperator: GroupByOperator.OPERATOR_ROLLUP,\n      }),\n    });\n  }\n\n  private buildAccountGroupTaxonomyRequest(brandContext: BrandContext): QueryMetricsRequest {\n    // TODO: This could be bundled with the Geo query -- we want to count in multiple contexts'\n    // TODO: We could accomplish this with a cube and exclude, but it would be good to get proper grouping sets support for it\n    return new QueryMetricsRequest({\n      partnerId,\n      metricName: 'account_group',\n      resourceIds: brandContext.resourceIds,\n      measures: [\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n          }),\n        }),\n      ],\n      groupBy: new GroupBy({\n        dimension: [{ dimension: 'account_group__tax_ids' }],\n        groupByOperator: GroupByOperator.OPERATOR_GROUP_BY,\n      }),\n    });\n  }\n\n  private buildAccountGroupRequest(brandsContext: BrandContext): QueryMetricsRequest {\n    return new QueryMetricsRequest({\n      partnerId,\n      metricName: 'account_group',\n      resourceIds: brandsContext.resourceIds,\n      measures: [\n        new Measure({\n          measure: 'account_group__account_group_id',\n        }),\n      ],\n      filter: brandsContext.buildFilter(null),\n    });\n  }\n\n  private buildListingScoreRequest(brandsContext: BrandContext, curPeriod: boolean): QueryMetricsRequest {\n    const [startDate, endDate] = brandsContext.dateRange(curPeriod);\n    return new QueryMetricsRequest({\n      partnerId,\n      metricName: 'listing_score',\n      resourceIds: brandsContext.resourceIds,\n      timeRange: inclusiveExclusive(startDate, endDate),\n      measures: [\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: 'score',\n            aggOp: MeasureAggregateOperator.AVG,\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: 'score',\n            aggOp: MeasureAggregateOperator.MAX,\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n          }),\n        }),\n      ],\n      groupBy: new GroupBy({\n        dimension: [\n          new GroupByDimension({\n            dimension: 'timestamp',\n          }),\n        ],\n        groupByOperator: GroupByOperator.OPERATOR_GROUP_BY,\n      }),\n      alignmentPeriod: new AlignmentPeriod({\n        calendar: brandsContext.alignmentPeriod(),\n      }),\n      alignment: Alignment.ALIGN_EXACT,\n      filter: brandsContext.buildFilter(null),\n    });\n  }\n\n  private buildLatestListingScoreRequest(brandsContext: BrandContext, curPeriod: boolean): QueryMetricsRequest {\n    const [startDate, endDate] = brandsContext.dateRange(curPeriod);\n    return new QueryMetricsRequest({\n      partnerId,\n      metricName: 'listing_score',\n      resourceIds: brandsContext.resourceIds,\n      timeRange: new DateRange({ start: startDate, end: endDate }),\n      measures: [\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: 'score',\n            aggOp: MeasureAggregateOperator.MAX,\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: 'source_list',\n            aggOp: MeasureAggregateOperator.MAX,\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: 'quality_list',\n            aggOp: MeasureAggregateOperator.MAX,\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: 'timestamp',\n            aggOp: MeasureAggregateOperator.MAX,\n          }),\n        }),\n      ],\n      groupBy: new GroupBy({\n        dimension: [\n          new GroupByDimension({\n            dimension: 'account_group_id',\n          }),\n          new GroupByDimension({\n            limitDimension: {\n              dimension: 'timestamp',\n              order: Order.ORDER_DESC,\n              limit: 1,\n            },\n          }),\n        ],\n        groupByOperator: GroupByOperator.OPERATOR_GROUP_BY,\n      }),\n      filter: brandsContext.buildFilter(null),\n    });\n  }\n\n  private buildListingQualityRequest(brandsContext: BrandContext, curPeriod: boolean): QueryMetricsRequest {\n    const [startDate, endDate] = brandsContext.dateRange(curPeriod);\n\n    return new QueryMetricsRequest({\n      partnerId,\n      metricName: 'listing_presence_over_time',\n      resourceIds: brandsContext.resourceIds,\n      timeRange: inclusiveExclusive(startDate, endDate),\n      measures: [\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n          }),\n        }),\n      ],\n      groupBy: new GroupBy({\n        dimension: [\n          new GroupByDimension({\n            dimension: 'timestamp',\n          }),\n          new GroupByDimension({\n            dimension: 'source',\n          }),\n          new GroupByDimension({\n            dimension: 'quality',\n          }),\n        ],\n        groupByOperator: GroupByOperator.OPERATOR_CUBE,\n        excludeCombination: [\n          // we need timestamp, source for presence overtime\n          // we need timestamp, source, quality for score overtime, could use for accuracy over time\n          // right now we're filtering on the frontend so all will require source, and time rollups aren't relevant\n          new GroupByExcludeCombination({ dimensions: [] }),\n          new GroupByExcludeCombination({ dimensions: ['source'] }),\n          new GroupByExcludeCombination({ dimensions: ['quality'] }),\n          new GroupByExcludeCombination({ dimensions: ['timestamp'] }),\n          new GroupByExcludeCombination({\n            dimensions: ['timestamp', 'quality'],\n          }),\n          new GroupByExcludeCombination({ dimensions: ['source', 'quality'] }),\n        ],\n      }),\n      alignmentPeriod: new AlignmentPeriod({\n        calendar: brandsContext.alignmentPeriod(),\n      }),\n      alignment: Alignment.ALIGN_EXACT,\n      // Filter doesn't seem to effect speed but will reduce response size in some cases.\n      // Results are also filtered when parsing downstream\n      filter: brandsContext.buildFilter([brandsContext.buildActiveSourcesFilter('source')]),\n    });\n  }\n\n  private buildListingMatchQualityRequest(brandsContext: BrandContext, groupBy: GroupBy): QueryMetricsRequest {\n    return new QueryMetricsRequest({\n      partnerId,\n      metricName: 'business_data_listings',\n      resourceIds: brandsContext.resourceIds,\n      filter: new Filter({\n        compositeFilter: {\n          op: CompositeFilterOperator.AND,\n          filters: [\n            brandsContext.buildActiveSourcesFilter('join__source_id'),\n            new Filter({\n              fieldFilter: new FieldFilter({\n                dimension: 'join__source_id',\n                operator: FieldFilterOperator.NOT_EQUAL,\n                value: {\n                  value: '12000',\n                  valueType: PropertyType.PROPERTY_TYPE_STRING,\n                },\n              }),\n            }),\n          ],\n        },\n      }),\n      measures: buildListingCountMeasures(),\n      groupBy: groupBy,\n      timeRange: { end: new Date() },\n    });\n  }\n\n  private buildListingCountRequest(brandsContext: BrandContext): QueryMetricsRequest {\n    return new QueryMetricsRequest({\n      partnerId,\n      metricName: 'business_data_listings',\n      resourceIds: brandsContext.resourceIds,\n      filter: new Filter({\n        compositeFilter: {\n          op: CompositeFilterOperator.AND,\n          filters: [\n            brandsContext.buildFilter([brandsContext.buildActiveSourcesFilter('join__source_id')]),\n            new Filter({\n              fieldFilter: new FieldFilter({\n                dimension: 'join__source_id',\n                operator: FieldFilterOperator.NOT_EQUAL,\n                value: {\n                  value: '12000',\n                  valueType: PropertyType.PROPERTY_TYPE_STRING,\n                },\n              }),\n            }),\n          ],\n        },\n      }),\n      measures: buildListingCountMeasures(),\n      groupBy: new GroupBy({\n        dimension: [\n          new GroupByDimension({\n            dimension: 'join__source_id',\n          }),\n        ],\n      }),\n      timeRange: { end: new Date() },\n    });\n  }\n\n  private buildBusinessDataListingCountRequest(\n    brandsContext: BrandContext,\n    forCurrentPeriod: boolean,\n    groupBy: string[],\n  ): QueryMetricsRequest {\n    const [, endDate] = brandsContext.dateRange(forCurrentPeriod);\n\n    return new QueryMetricsRequest({\n      partnerId,\n      metricName: 'business_data_listings',\n      resourceIds: brandsContext.resourceIds,\n      timeRange: new DateRange({\n        end: dayjs(endDate).toDate(),\n      }),\n      filter: brandsContext.buildFilter([\n        brandsContext.buildActiveSourcesFilter('join__source_id'),\n        new Filter({\n          fieldFilter: new FieldFilter({\n            dimension: 'join__source_id',\n            operator: FieldFilterOperator.NOT_EQUAL,\n            value: {\n              value: '12000',\n              valueType: PropertyType.PROPERTY_TYPE_STRING,\n            },\n          }),\n        }),\n      ]),\n      measures: [\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            alias: 'accurate',\n            filter: {\n              compositeFilter: {\n                filters: [isAccurateFilter, isVerifiedFilter],\n                op: CompositeFilterOperator.OR,\n              },\n            },\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            alias: 'inaccurate',\n            filter: new Filter({\n              compositeFilter: {\n                filters: [isInaccurateFilter, isNotVerifiedFilter],\n                op: CompositeFilterOperator.AND,\n              },\n            }),\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n            alias: 'missing',\n            filter: isMissingFilter,\n          }),\n        }),\n      ],\n      groupBy: new GroupBy({\n        dimension: groupBy.map((dim) => {\n          return { dimension: dim };\n        }),\n      }),\n    });\n  }\n\n  buildGMBLocationsRequest(brandsContext: BrandContext): QueryMetricsRequest {\n    return new QueryMetricsRequest({\n      partnerId,\n      metricName: 'gmb_locations_connected',\n      resourceIds: brandsContext.resourceIds,\n      measures: [\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: '*',\n            aggOp: MeasureAggregateOperator.COUNT,\n          }),\n        }),\n      ],\n      groupBy: new GroupBy({\n        dimension: [\n          new GroupByDimension({\n            dimension: 'account_group_id',\n          }),\n        ],\n        groupByOperator: GroupByOperator.OPERATOR_GROUP_BY,\n      }),\n    });\n  }\n\n  private buildAdIntelStatsRequest(brandsContext: BrandContext, curPeriod: boolean): QueryMetricsRequest {\n    const [startDate, endDate] = brandsContext.adIntelDateRange(curPeriod);\n    return new QueryMetricsRequest({\n      partnerId,\n      metricName: 'advertising_intel_channel_stats',\n      resourceIds: brandsContext.resourceIds,\n      timeRange: inclusiveExclusive(startDate, endDate),\n      measures: [\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: 'impressions',\n            aggOp: MeasureAggregateOperator.SUM,\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: 'clicks',\n            aggOp: MeasureAggregateOperator.SUM,\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: 'conversions',\n            aggOp: MeasureAggregateOperator.SUM,\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: 'spend_micros',\n            aggOp: MeasureAggregateOperator.SUM,\n          }),\n        }),\n      ],\n      groupBy: new GroupBy({\n        dimension: [\n          new GroupByDimension({\n            dimension: 'account_group_id',\n          }),\n          new GroupByDimension({\n            dimension: 'time_stamp',\n          }),\n        ],\n        groupByOperator: GroupByOperator.OPERATOR_CUBE,\n        excludeCombination: [\n          new GroupByExcludeCombination({\n            dimensions: ['account_group_id', 'time_stamp'],\n          }),\n        ],\n      }),\n      alignmentPeriod: new AlignmentPeriod({\n        calendar: brandsContext.alignmentPeriod(),\n      }),\n      alignment: Alignment.ALIGN_DELTA,\n      filter: brandsContext.buildFilter(),\n    });\n  }\n\n  private buildSocialRequest(\n    brandsContext: BrandContext,\n    groupByAccount: boolean,\n    fbPageOnly: boolean,\n  ): QueryMetricsRequest {\n    const measures = [new Measure({ measure: 'account_group_id' })];\n    let groupBy = null;\n    if (!groupByAccount) {\n      measures.concat([\n        new Measure({ measure: 'social_service_id' }),\n        new Measure({ measure: 'token_broken' }),\n        new Measure({ measure: 'authed_by_user' }),\n      ]);\n    } else {\n      groupBy = new GroupBy({\n        dimension: [\n          new GroupByDimension({\n            dimension: 'account_group_id',\n          }),\n        ],\n        groupByOperator: GroupByOperator.OPERATOR_GROUP_BY,\n      });\n    }\n    const filters = [\n      new Filter({\n        fieldFilter: new FieldFilter({\n          dimension: 'token_broken',\n          value: new TypedValue({\n            value: false,\n            valueType: PropertyType.PROPERTY_TYPE_BOOL,\n          }),\n          operator: FieldFilterOperator.EQUAL,\n        }),\n      }),\n      new Filter({\n        fieldFilter: new FieldFilter({\n          dimension: 'authed_by_user',\n          value: new TypedValue({\n            value: true,\n            valueType: PropertyType.PROPERTY_TYPE_BOOL,\n          }),\n          operator: FieldFilterOperator.EQUAL,\n        }),\n      }),\n    ];\n    if (fbPageOnly) {\n      filters.push(\n        new Filter({\n          fieldFilter: new FieldFilter({\n            dimension: 'is_facebook_page',\n            value: new TypedValue({\n              value: true,\n              valueType: PropertyType.PROPERTY_TYPE_BOOL,\n            }),\n            operator: FieldFilterOperator.EQUAL,\n          }),\n        }),\n      );\n    }\n    return new QueryMetricsRequest({\n      partnerId,\n      metricName: 'social_connections',\n      measures,\n      resourceIds: brandsContext.resourceIds,\n      filter: new Filter({\n        compositeFilter: new CompositeFilter({\n          op: CompositeFilterOperator.AND,\n          filters: filters,\n        }),\n      }),\n      groupBy,\n    });\n  }\n\n  private buildReviewRequestsRequest(\n    brandsContext: BrandContext,\n    forCurrentPeriod: boolean,\n    groupBy: string[],\n  ): QueryMetricsRequest {\n    const [startDate, endDate] = brandsContext.dateRange(forCurrentPeriod);\n    return new QueryMetricsRequest({\n      partnerId,\n      metricName: 'review_request_email_performance',\n      resourceIds: brandsContext.resourceIds,\n      timeRange: inclusiveExclusive(startDate, endDate),\n      measures: [\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: 'notification_id',\n            aggOp: MeasureAggregateOperator.COUNT,\n          }),\n        }),\n      ],\n      filter: brandsContext.buildFilter(brandsContext.filters),\n      groupBy: new GroupBy({\n        dimension: groupBy.map((dim) => {\n          return { dimension: dim };\n        }),\n      }),\n    });\n  }\n\n  private buildRepReviewRequestsRequest(brandsContext: BrandContext, forCurrentPeriod: boolean): QueryMetricsRequest {\n    const [startDate, endDate] = brandsContext.dateRange(forCurrentPeriod);\n    return new QueryMetricsRequest({\n      partnerId,\n      metricName: 'review_request_metrics',\n      resourceIds: brandsContext.resourceIds,\n      timeRange: inclusiveExclusive(startDate, endDate),\n      measures: [\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: 'status',\n            aggOp: MeasureAggregateOperator.COUNT,\n            alias: 'requests_sent',\n            filter: new Filter({\n              fieldFilter: new FieldFilter({\n                dimension: 'status',\n                operator: FieldFilterOperator.EQUAL,\n                value: new TypedValue({\n                  value: ['Clicked', 'Opened', 'Sent', 'Delivered'],\n                  valueType: PropertyType.PROPERTY_TYPE_STRING,\n                }),\n                operatorFunction: FieldFilterOperatorFunction.ANY,\n              }),\n            }),\n          }),\n        }),\n        new Measure({\n          aggregate: new MeasureAggregate({\n            measure: 'status',\n            aggOp: MeasureAggregateOperator.COUNT,\n            alias: 'links_clicked',\n            filter: new Filter({\n              fieldFilter: new FieldFilter({\n                dimension: 'status',\n                operator: FieldFilterOperator.EQUAL,\n                value: new TypedValue({\n                  value: ['Clicked', 'Opened'],\n                  valueType: PropertyType.PROPERTY_TYPE_STRING,\n                }),\n                operatorFunction: FieldFilterOperatorFunction.ANY,\n              }),\n            }),\n          }),\n        }),\n      ],\n      filter: brandsContext.buildFilter(brandsContext.filters),\n    });\n  }\n\n  public buildBrandContext$(fieldMask: string[]): Observable<BrandContext> {\n    const fieldMaskObj = fieldMask.reduce((o, f) => {\n      o[f] = true;\n      return o;\n    }, {});\n    return combineLatest([\n      this.resourceIds$,\n      fieldMaskObj['dateRange']\n        ? this.timeRangeService.utcAlignedDateRange$.pipe(filter(([startDate, endDate]) => !!startDate && !!endDate))\n        : of([null, null]),\n      fieldMaskObj['timeRange'] ? this.timeRangeService.selectedTimeRangeKey$ : of(null),\n      fieldMaskObj['selectedSourceIds'] ? this.brandFiltersService.selectedSourceIds$ : of(null),\n      fieldMaskObj['activeSources'] ? this.reputationService.brandSources$ : of(null),\n      fieldMaskObj['filters'] ? this.filterService.filters$ : of(null),\n    ]).pipe(\n      debounceTime(10),\n      map(([resourceIds, [startDate, endDate], timeRange, selectedSourceIds, activatedSources, filters]) => {\n        return new BrandContext(\n          resourceIds,\n          startDate,\n          endDate,\n          timeRange,\n          filters,\n          activatedSources,\n          selectedSourceIds,\n          [],\n        );\n      }),\n      shareReplay({ bufferSize: 1, refCount: true }),\n    );\n  }\n}\n\nexport function fillByTime<T>(\n  stats: StatByTime<T>[],\n  startDate: Date,\n  endDate: Date,\n  defaultStat: (startDate: Date) => StatByTime<T>,\n): StatByTime<T>[] {\n  // Exit early if we're missing any of the pieces required\n  if (!stats || !startDate || !endDate) {\n    return stats;\n  }\n  // Figure out the expected times\n  const granularity = getGranularityForRange(startDate, endDate);\n  const expectedTimeBucketStarts = generateDates(startDate, endDate, granularity);\n\n  // Build map of stats by time\n  const statsByTime = stats.reduce((obj, stat) => {\n    obj[stat.localAlignedTime.valueOf()] = stat;\n    return obj;\n  }, {});\n\n  // Build filled stats by plucking from map or building a default with provided function\n  return expectedTimeBucketStarts.map((start) => {\n    return statsByTime[start.valueOf()] || defaultStat(start);\n  });\n}\n\nexport function inclusiveExclusive(start: Date, end: Date): DateRange {\n  return new DateRange({ start: start, endExclusive: end });\n}\n\nexport function inclusiveInclusive(start: Date, end: Date): DateRange {\n  return new DateRange({ start: start, end: end });\n}\n", "import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { QueryMetricsResponse } from '@vendasta/multi-location-analytics';\nimport { TaxonomyOption, TaxonomyService } from '@vendasta/taxonomy';\nimport { Observable, combineLatest, forkJoin, of } from 'rxjs';\nimport { filter, map, shareReplay, switchMap } from 'rxjs/operators';\nimport { AccountGroup } from '../account-group';\nimport { LocationsService } from '../locations';\nimport { Row, rowify } from './helpers';\nimport { QueryService } from './query.service';\n\nclass TaxonomyOptionWithCount {\n  constructor(public taxonomyOption: TaxonomyOption, public numLocations: number) {}\n}\n\nclass GeoWithCount {\n  constructor(\n    public countryCode: string,\n    public country: string,\n    public state: string,\n    public stateCode: string,\n    public city: string,\n    public numLocations: number,\n  ) {}\n}\n\nclass Country {\n  constructor(public countryCode: string, public countryName: string, public stateCodeToName: Map<string, string>) {}\n\n  stateName(stateCode: string): string {\n    const val = this.stateCodeToName.get(stateCode);\n    if (!val) {\n      return stateCode;\n    }\n    return val;\n  }\n}\n\nclass CountryDetails {\n  constructor(public countryCodeToCountry: Map<string, Country>) {}\n\n  public countryName(countryCode: string): string {\n    const val = this.countryCodeToCountry.get(countryCode);\n    if (!val) {\n      return countryCode;\n    }\n    return val.countryName;\n  }\n\n  public stateName(countryCode: string, stateCode: string): string {\n    const val = this.countryCodeToCountry.get(countryCode);\n    if (!val) {\n      return stateCode;\n    }\n    return val.stateName(stateCode);\n  }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AccountGroupMetricService {\n  readonly filteredAccountGroupIdsForPath$: Observable<Set<string>>;\n  readonly filteredLocationsForPath$: Observable<{\n    [key: string]: AccountGroup;\n  }>;\n\n  readonly allTaxonomyOptions$: Observable<TaxonomyOption[]>;\n  private brandTaxonomyRows$: Observable<Row[]>;\n  readonly brandTaxonomyOptions$: Observable<Map<string, TaxonomyOptionWithCount>>;\n\n  constructor(\n    private queryService: QueryService,\n    private httpClient: HttpClient,\n    private locationsService: LocationsService,\n    private taxonomyService: TaxonomyService,\n  ) {\n    this.filteredAccountGroupIdsForPath$ = this.getAccountGroupIds$();\n\n    this.filteredLocationsForPath$ = combineLatest([\n      this.locationsService.currentAccountGroups$,\n      this.filteredAccountGroupIdsForPath$,\n    ]).pipe(\n      map(([locations, filteredAgids]) => {\n        if (locations == null || filteredAgids == null) {\n          return null;\n        }\n        const filtered = {};\n        Object.keys(locations)\n          .map((k) => locations[k])\n          .forEach((ag: AccountGroup) => {\n            if (!filteredAgids.has(ag.accountGroupId)) {\n              return;\n            }\n            filtered[ag.accountGroupId] = ag;\n          });\n        return filtered;\n      }),\n      shareReplay({ refCount: true, bufferSize: 1 }),\n    );\n\n    this.allTaxonomyOptions$ = this.taxonomyService\n      .getTaxonomyIds()\n      .pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n    this.brandTaxonomyRows$ = this.queryService.accountGroupTaxonomies$.pipe(\n      map((r: QueryMetricsResponse) => {\n        if (r == null) {\n          return null;\n        }\n        return rowify(r.metricResults[0]);\n      }),\n    );\n    this.brandTaxonomyOptions$ = combineLatest([this.allTaxonomyOptions$, this.brandTaxonomyRows$]).pipe(\n      map(([allTax, brandRows]) => {\n        if (!allTax || !brandRows) {\n          return null;\n        }\n        const allTaxMap = new Map<string, TaxonomyOption>();\n        allTax.forEach((tax) => {\n          allTaxMap.set(tax.id, tax);\n        });\n        const brandTaxMap = new Map<string, TaxonomyOptionWithCount>();\n        // TODO: Flip this so that we're only getting/inflating what we have? (probably way faster/lighter?)\n        brandRows.forEach((row) => {\n          // Some accounts have the same taxId multiple times, so reduce to the set before counting\n          Array.from<string>(new Set(row.values[0])).forEach((taxId) => {\n            const existing = brandTaxMap.get(taxId);\n            if (existing) {\n              // Update count\n              existing.numLocations += +row.measures[0];\n              brandTaxMap.set(taxId, existing);\n            } else {\n              // Get tax and set count\n              brandTaxMap.set(taxId, new TaxonomyOptionWithCount(allTaxMap.get(taxId), +row.measures[0]));\n            }\n          });\n        });\n        return brandTaxMap;\n      }),\n      shareReplay({ refCount: true, bufferSize: 1 }),\n    );\n  }\n\n  private getAccountGroupIds$(): Observable<Set<string>> {\n    return this.queryService.accountGroup$.pipe(\n      filter((r) => !!r),\n      map((r: QueryMetricsResponse) => {\n        const s = new Set<string>();\n        if (r) {\n          rowify(r.metricResults[0]).forEach((row) => {\n            s.add(row.measures[0][0]);\n          });\n        }\n        return s;\n      }),\n      shareReplay({ refCount: true, bufferSize: 1 }),\n    );\n  }\n\n  public getGeographicBreakdown$(): Observable<GeoWithCount[]> {\n    const rows$ = this.queryService.accountGroupGeography$.pipe(\n      map((r: QueryMetricsResponse) => {\n        if (r == null) {\n          return null;\n        }\n        return rowify(r.metricResults[0]);\n      }),\n    );\n    const countyInfo$ = rows$.pipe(\n      switchMap((i) => {\n        if (!i) {\n          return of(null);\n        }\n        const countries = new Set<string>();\n        i.forEach((c) => {\n          if (!c.values[0]) {\n            return;\n          }\n          countries.add(c.values[0]);\n        });\n        return this.getCountryAndStateInformation(Array.from(countries.keys()));\n      }),\n    );\n\n    return combineLatest([rows$, countyInfo$]).pipe(\n      map(([rows, countryInfo]: [Row[], CountryDetails]) => {\n        if (!rows || !countryInfo) {\n          return [];\n        }\n        return rows.map(function (dataRow: Row): GeoWithCount {\n          return new GeoWithCount(\n            dataRow.values[0],\n            countryInfo.countryName(dataRow.values[0]),\n            countryInfo.stateName(dataRow.values[0], dataRow.values[1]),\n            dataRow.values[1],\n            dataRow.values[2],\n            Number(dataRow.measures[0][0]),\n          );\n        });\n      }),\n    );\n  }\n\n  private getCountryAndStateInformation(countries: string[]): Observable<CountryDetails> {\n    return forkJoin(\n      countries.map((c) => {\n        return this.httpClient\n          .get('https://www.gstatic.com/chrome/autofill/libaddressinput/chromium-i18n/ssl-address/data/' + c)\n          .pipe(\n            map((r) => {\n              const subKeys = String(r['sub_keys']).split('~');\n              const subNames = String(r['sub_names']).split('~');\n\n              const states = new Map<string, string>();\n              subKeys.forEach(function (key, i): void {\n                states.set(key, subNames[i]);\n              });\n\n              return new Country(String(r['key']), capitalizeFirstLetters(String(r['name'])), states);\n            }),\n          );\n      }),\n    ).pipe(\n      map((r) => {\n        const m = new Map<string, Country>();\n        r.forEach((c) => {\n          m.set(c.countryCode, c);\n        });\n        return new CountryDetails(m);\n      }),\n    );\n  }\n}\n\nfunction capitalizeFirstLetters(a: string): string {\n  return a\n    .split(' ')\n    .map((c) => c.charAt(0).toUpperCase() + c.slice(1).toLowerCase())\n    .join(' ');\n}\n", "import { Component, Inject, OnInit } from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { Observable } from 'rxjs';\nimport { map, startWith, take } from 'rxjs/operators';\nimport {\n  CITIES_LABEL,\n  COUNTRIES_LABEL,\n  FilterDisplaySettings,\n  Location,\n  LocationGroup,\n  STATEPROV_LABEL,\n} from '../brand-filter-container.service';\n\nexport interface GeographyData {\n  availableLocations: LocationGroup[];\n  selectedCountries: Location[];\n  selectedStateProvinces: Location[];\n  selectedCities: Location[];\n  filterSettings: FilterDisplaySettings;\n}\n\n@Component({\n  selector: 'bc-brand-geography-dialog',\n  templateUrl: './brand-geography-dialog.component.html',\n  styleUrls: ['./brand-geography-dialog.component.scss'],\n  standalone: false,\n})\nexport class BrandGeographyDialogComponent implements OnInit {\n  locationControl = new UntypedFormControl();\n\n  filteredLocations$: Observable<any[]>;\n\n  selectedOptions: string[] = [];\n  selectedCountries: Location[] = [];\n  selectedStateProvinces: Location[] = [];\n  selectedCities: Location[] = [];\n\n  constructor(\n    public dialogRef: MatDialogRef<BrandGeographyDialogComponent>,\n    @Inject(MAT_DIALOG_DATA) public data: GeographyData,\n  ) {}\n\n  ngOnInit(): void {\n    this.selectedCountries = this.data.selectedCountries;\n    this.selectedStateProvinces = this.data.selectedStateProvinces;\n    this.selectedCities = this.data.selectedCities;\n    this.updateSelectedInformation();\n    this.filteredLocations$ = this.locationControl.valueChanges.pipe(\n      startWith(''),\n      map((value) => this.filterLocationGroup(value)),\n    );\n  }\n\n  private filterLocationGroup(value: string): any[] {\n    if (!value) {\n      value = '';\n    }\n    return this.data.availableLocations\n      .map((group) => ({\n        name: group.name,\n        options: this.filterLocations(group.options, value),\n      }))\n      .filter((group) => group.options.length > 0);\n  }\n\n  private filterLocations(locations: Location[], value: string): any[] {\n    const filterValue = value.toString().toLowerCase();\n    return locations.filter((location) => {\n      return (\n        location.name.toLowerCase().indexOf(filterValue) > -1 &&\n        this.selectedOptions.indexOf(location.id) === -1 &&\n        !this.selectedOptions.some((r) => location.parent.includes(r))\n      );\n    });\n  }\n\n  addLocationOpt(event: MatAutocompleteSelectedEvent): void {\n    // Find the selected option\n    this.filteredLocations$\n      .pipe(\n        take(1),\n        map((groups) => {\n          for (const group of groups) {\n            for (const location of group.options) {\n              if (location.id === event.option.value.id) {\n                if (location.parent.length === event.option.value.parent.length) {\n                  let sameParents = true;\n                  let i = 0;\n                  while (i < location.parent.length) {\n                    if (location.parent[i] !== event.option.value.parent[i]) {\n                      sameParents = false;\n                      break;\n                    }\n                    i = i + 1;\n                  }\n                  if (sameParents) {\n                    return [group, location];\n                  }\n                }\n              }\n            }\n          }\n        }),\n      )\n      .subscribe(([group, location]) => {\n        this.addLocation(group.name, location.id);\n      });\n  }\n\n  addLocation(locationType: string, locationName?: string): void {\n    const locationValue = locationName ? locationName : this.locationControl.value.trim();\n    if (locationValue !== '') {\n      this.locationControl.setValue('');\n\n      if (locationType === COUNTRIES_LABEL) {\n        const countryObject = this.data.availableLocations\n          .filter((locationGroup) => locationGroup.name === COUNTRIES_LABEL)\n          .map((locationGroup) =>\n            locationGroup.options.filter((country) => country.id.toLowerCase() === locationValue.toLowerCase()),\n          )[0][0];\n        this.selectedCountries.push(countryObject);\n      }\n      if (locationType === STATEPROV_LABEL) {\n        const stateprovObject = this.data.availableLocations\n          .filter((locationGroup) => locationGroup.name === STATEPROV_LABEL)\n          .map((locationGroup) =>\n            locationGroup.options.filter((country) => country.id.toLowerCase() === locationValue.toLowerCase()),\n          )[0][0];\n        this.selectedStateProvinces.push(stateprovObject);\n      }\n      if (locationType === CITIES_LABEL) {\n        const cityObject = this.data.availableLocations\n          .filter((locationGroup) => locationGroup.name === CITIES_LABEL)\n          .map((locationGroup) =>\n            locationGroup.options.filter((country) => country.id.toLowerCase() === locationValue.toLowerCase()),\n          )[0][0];\n        this.selectedCities.push(cityObject);\n      }\n      this.updateSelectedInformation();\n    }\n  }\n\n  removeLocation(locationType: number, locationName: string): void {\n    if (locationType === 1) {\n      this.selectedCountries = this.selectedCountries.filter((country) => country.id !== locationName);\n    }\n    if (locationType === 2) {\n      this.selectedStateProvinces = this.selectedStateProvinces.filter((statProv) => statProv.id !== locationName);\n    }\n    if (locationType === 3) {\n      this.selectedCities = this.selectedCities.filter((city) => city.id !== locationName);\n    }\n    this.updateSelectedInformation();\n  }\n\n  private updateSelectedInformation(): void {\n    const selectedCountries = [...this.selectedCountries.map((country) => country.id)];\n    this.selectedStateProvinces = this.selectedStateProvinces.filter(\n      (location) => !selectedCountries.some((r) => location.parent.includes(r)),\n    );\n    const selectedStateProvinces = [...this.selectedStateProvinces.map((stateProv) => stateProv.id)];\n    this.selectedCities = this.selectedCities.filter(\n      (city) =>\n        !selectedStateProvinces.some((r) => city.parent.includes(r)) &&\n        !selectedCountries.some((r) => city.parent.includes(r)),\n    );\n\n    this.selectedOptions = [\n      ...selectedCountries,\n      ...selectedStateProvinces,\n      ...this.selectedCities.map((city) => city.id),\n    ];\n    this.locationControl.setValue('');\n  }\n\n  close(newData: boolean): void {\n    if (!newData) {\n      this.dialogRef.close();\n      return;\n    }\n    this.dialogRef.close({\n      selectedCountries: this.selectedCountries,\n      selectedStateProvinces: this.selectedStateProvinces,\n      selectedCities: this.selectedCities,\n    });\n  }\n}\n", "<h2\n  mat-dialog-title\n  [ngStyle]=\"{\n    color: data.filterSettings.textColor,\n    background: data.filterSettings.backgroundColor\n  }\"\n>\n  {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.TITLES.GEOGRAPHY' | translate }}\n</h2>\n<mat-dialog-content>\n  <div class=\"selected-locations\">\n    <h2>\n      {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.GEOGRAPHY.LOCATIONS_IN_FILTER' | translate }}\n    </h2>\n    @if (selectedCountries.length > 0) {\n      <div class=\"selected-group\">\n        <h3>\n          {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.GEOGRAPHY.COUNTRIES' | translate }}\n        </h3>\n        <div class=\"options\">\n          @for (data of selectedCountries; track data) {\n            <div class=\"option\">\n              {{ data.name }}\n              <span class=\"count\">\n                {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.LOCATION_COUNT' | translate: { count: data.locationCount } }}\n              </span>\n              <button mat-icon-button (click)=\"removeLocation(1, data.id)\">\n                <mat-icon>clear</mat-icon>\n              </button>\n            </div>\n          }\n        </div>\n      </div>\n    }\n    @if (selectedStateProvinces.length > 0) {\n      <div class=\"selected-group\">\n        <h3>\n          {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.GEOGRAPHY.REGION' | translate }}\n        </h3>\n        <div class=\"options\">\n          @for (data of selectedStateProvinces; track data) {\n            <div class=\"option\">\n              {{ data.name }}\n              <span class=\"count\">\n                {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.LOCATION_COUNT' | translate: { count: data.locationCount } }}\n              </span>\n              <button mat-icon-button (click)=\"removeLocation(2, data.id)\">\n                <mat-icon>clear</mat-icon>\n              </button>\n            </div>\n          }\n        </div>\n      </div>\n    }\n    @if (selectedCities.length > 0) {\n      <div class=\"selected-group\">\n        <h3>\n          {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.GEOGRAPHY.CITIES' | translate }}\n        </h3>\n        <div class=\"options\">\n          @for (data of selectedCities; track data) {\n            <div class=\"option\">\n              {{ data.name }}\n              <span class=\"count\">\n                {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.LOCATION_COUNT' | translate: { count: data.locationCount } }}\n              </span>\n              <button mat-icon-button (click)=\"removeLocation(3, data.id)\">\n                <mat-icon>clear</mat-icon>\n              </button>\n            </div>\n          }\n        </div>\n      </div>\n    }\n  </div>\n  <div class=\"location-selector\">\n    <mat-form-field>\n      <input\n        matInput\n        [placeholder]=\"'PERFORMANCE.MULTI_LOCATION.FILTERS.GEOGRAPHY.ADD_AREAS' | translate\"\n        cdkFocusInitial\n        [matAutocomplete]=\"auto\"\n        [formControl]=\"locationControl\"\n      />\n      <mat-autocomplete #auto=\"matAutocomplete\" autoActiveFirstOption (optionSelected)=\"addLocationOpt($event)\">\n        @for (group of filteredLocations$ | async; track group) {\n          <mat-optgroup [label]=\"group.name | translate\">\n            @for (option of group.options; track option) {\n              <mat-option [value]=\"option\">\n                {{ option.name }}\n                <span class=\"location-style\">\n                  {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.LOCATION_COUNT' | translate: { count: option.locationCount } }}\n                </span>\n              </mat-option>\n            }\n          </mat-optgroup>\n        }\n      </mat-autocomplete>\n    </mat-form-field>\n  </div>\n</mat-dialog-content>\n\n<mat-dialog-actions align=\"end\">\n  <button mat-stroked-button (click)=\"close(false)\">\n    {{ 'COMMON.ACTION_LABELS.CANCEL' | translate }}\n  </button>\n  <button mat-flat-button color=\"primary\" (click)=\"close(true)\">\n    {{ 'COMMON.ACTION_LABELS.SAVE' | translate }}\n  </button>\n</mat-dialog-actions>\n", "import { Component, OnInit, Inject } from '@angular/core';\nimport { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { UntypedFormControl } from '@angular/forms';\nimport { combineLatest, Observable } from 'rxjs';\nimport { map, startWith, take } from 'rxjs/operators';\nimport { FilterDisplaySettings } from '../brand-filter-container.service';\nimport { BrandsService } from '../../brands.service';\nimport { Group } from '../../brands.api.service';\n\nexport interface GroupData {\n  selectedGroup: GroupWithDisplayName;\n  filterSettings: FilterDisplaySettings;\n}\n\nexport class GroupWithDisplayName {\n  constructor(\n    public name: string,\n    public group: Group,\n  ) {}\n}\n\n@Component({\n  selector: 'bc-brand-group-dialog',\n  templateUrl: './brand-group-dialog.component.html',\n  styleUrls: ['./brand-group-dialog.component.scss'],\n  standalone: false,\n})\nexport class BrandGroupDialogComponent implements OnInit {\n  groupControl = new UntypedFormControl();\n\n  filteredOptions$: Observable<GroupWithDisplayName[]>;\n\n  selectedGroup: GroupWithDisplayName;\n  options$: Observable<GroupWithDisplayName[]>;\n\n  constructor(\n    public dialogRef: MatDialogRef<BrandGroupDialogComponent>,\n    @Inject(MAT_DIALOG_DATA) public data: GroupData,\n    private brandsService: BrandsService,\n  ) {\n    this.selectedGroup = data.selectedGroup;\n    this.options$ = this.brandsService.allGroups$.pipe(\n      map((groups) => {\n        if (!groups) {\n          return [];\n        }\n        const paths = new Map<string, Group>();\n        groups.forEach((g) => {\n          paths.set(g.pathNodes.join('|'), g);\n        });\n\n        return groups\n          .map((g) => {\n            return new GroupWithDisplayName(this.buildGroupName(paths, g), g);\n          })\n          .sort((a, b) => a.name.localeCompare(b.name));\n      }),\n    );\n  }\n\n  buildGroupName(groupsByPath: Map<string, Group>, group: Group): string {\n    const parent = groupsByPath.get(group.pathNodes.slice(0, -1).join('|'));\n    if (!parent) {\n      return group.name;\n    } else {\n      const parentName = this.buildGroupName(groupsByPath, parent);\n      return `${parentName} / ${group.name}`;\n    }\n  }\n\n  ngOnInit(): void {\n    this.filteredOptions$ = combineLatest([this.groupControl.valueChanges.pipe(startWith('')), this.options$]).pipe(\n      map(([value, options]) => this._filter(value, options)),\n    );\n  }\n\n  private _filter(value: string, options: GroupWithDisplayName[]): GroupWithDisplayName[] {\n    const filterValue = value.toLowerCase();\n\n    return options.filter((option) => option.name.toLowerCase().includes(filterValue));\n  }\n\n  close(newData: boolean): void {\n    if (!newData) {\n      this.dialogRef.close();\n      return;\n    }\n    this.dialogRef.close({\n      selectedGroup: this.selectedGroup,\n    });\n  }\n\n  setGroupOpt(event: MatAutocompleteSelectedEvent): void {\n    // Find the selected option\n    this.filteredOptions$\n      .pipe(\n        take(1),\n        map((options) => {\n          for (const option of options) {\n            if (option.name === event.option.value) {\n              return option;\n            }\n          }\n        }),\n      )\n      .subscribe((option) => {\n        this.setGroup(option);\n      });\n  }\n\n  setGroup(id: any): void {\n    this.selectedGroup = id;\n  }\n}\n", "<h2\n  mat-dialog-title\n  [ngStyle]=\"{\n    color: data.filterSettings.textColor,\n    background: data.filterSettings.backgroundColor\n  }\"\n>\n  {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.TITLES.GROUP' | translate }}\n</h2>\n<mat-dialog-content>\n  <div class=\"location-selector\">\n    <mat-form-field>\n      <input matInput cdkFocusInitial [matAutocomplete]=\"auto\" [formControl]=\"groupControl\" />\n      <mat-autocomplete #auto=\"matAutocomplete\" autoActiveFirstOption (optionSelected)=\"setGroupOpt($event)\">\n        @for (option of filteredOptions$ | async; track option) {\n          <mat-option [value]=\"option.name\">\n            {{ option.name }}\n          </mat-option>\n        }\n      </mat-autocomplete>\n    </mat-form-field>\n  </div>\n</mat-dialog-content>\n<mat-dialog-actions align=\"end\">\n  <button mat-stroked-button (click)=\"close(false)\">\n    {{ 'COMMON.ACTION_LABELS.CANCEL' | translate }}\n  </button>\n  <button mat-flat-button color=\"primary\" (click)=\"close(true)\">\n    {{ 'COMMON.ACTION_LABELS.SAVE' | translate }}\n  </button>\n</mat-dialog-actions>\n", "import { Component, Inject, OnInit } from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { BehaviorSubject, Observable, combineLatest } from 'rxjs';\nimport { debounceTime, map, tap } from 'rxjs/operators';\nimport { getLocation } from '../../../account-group/account-group';\nimport { LocationsService } from '../../../locations';\nimport { BrandFilterContainerService, FilterDisplaySettings } from '../brand-filter-container.service';\n\nexport interface LocationData {\n  filterSettings: FilterDisplaySettings;\n}\n\nexport interface LocationDisplay {\n  accountGroupId: string;\n  name: string;\n  address: string;\n}\n\n@Component({\n  selector: 'bc-brand-geography-dialog',\n  templateUrl: './brand-location-dialog.component.html',\n  styleUrls: ['./brand-location-dialog.component.scss'],\n  standalone: false,\n})\nexport class BrandLocationDialogComponent implements OnInit {\n  accountGroupFilterControl = new UntypedFormControl();\n\n  options$: Observable<LocationDisplay[]>;\n  filteredOptions$: Observable<LocationDisplay[]>;\n\n  selectedOptionsDetails$: Observable<LocationDisplay[]>;\n  selectedOptions$$: BehaviorSubject<string[]> = new BehaviorSubject<string[]>([]);\n  selectedOptions$: Observable<string[]> = this.selectedOptions$$.asObservable();\n\n  noResultsFound = false;\n\n  constructor(\n    public dialogRef: MatDialogRef<BrandLocationDialogComponent>,\n    private brandFiltersService: BrandFilterContainerService,\n    @Inject(MAT_DIALOG_DATA) public data: LocationData,\n    private locationsService: LocationsService,\n  ) {}\n\n  ngOnInit(): void {\n    this.selectedOptions$$.next(this.brandFiltersService.getAccountGroupIds());\n\n    this.options$ = this.locationsService.currentAccountGroups$.pipe(\n      map((locationMap) => {\n        if (!locationMap) {\n          return [];\n        }\n        this.accountGroupFilterControl.setValue('');\n        return Object.keys(locationMap)\n          .map((accountGroupId) => {\n            const accountGroup = locationMap[accountGroupId];\n            return {\n              accountGroupId,\n              name: accountGroup.companyName,\n              address: getLocation(accountGroup),\n            };\n          })\n          .sort((a, b) => a.name.localeCompare(b.name));\n      }),\n    );\n\n    this.filteredOptions$ = combineLatest([\n      this.options$,\n      this.accountGroupFilterControl.valueChanges,\n      this.selectedOptions$,\n    ]).pipe(\n      debounceTime(500),\n      map(([options, value, selectedOptions]) => this._filter(options, value, selectedOptions)),\n      tap((options) => {\n        this.noResultsFound = options.length === 0;\n      }),\n    );\n\n    this.selectedOptionsDetails$ = combineLatest([this.options$, this.selectedOptions$]).pipe(\n      map(([options, selected]) => {\n        return options.filter((o) => selected.indexOf(o.accountGroupId) > -1);\n      }),\n    );\n  }\n\n  private _filter(options: LocationDisplay[], value: string, selectedOptions: string[]): LocationDisplay[] {\n    if (value.trim() === '') {\n      return options.filter((option) => selectedOptions.indexOf(option.accountGroupId) === -1);\n    }\n    const filterValue = value.toUpperCase();\n    return options\n      .filter(\n        (option) =>\n          option.name.toUpperCase().includes(filterValue) || option.address.toUpperCase().includes(filterValue),\n      )\n      .filter((option) => selectedOptions.indexOf(option.accountGroupId) === -1);\n  }\n\n  selectFilterLocation(option: HTMLElement, accountGroupId: string): void {\n    option.remove();\n    const currentSelected = this.selectedOptions$$.getValue();\n    if (currentSelected.indexOf(accountGroupId) === -1) {\n      currentSelected.push(accountGroupId);\n    }\n    this.selectedOptions$$.next(currentSelected);\n  }\n\n  removeLocation(accountGroupId: string): void {\n    this.selectedOptions$$.next(this.selectedOptions$$.getValue().filter((o) => o !== accountGroupId));\n  }\n\n  close(newData: boolean): void {\n    if (!newData) {\n      this.dialogRef.close();\n      return;\n    }\n    this.dialogRef.close({\n      selectedAccountGroupIds: this.selectedOptions$$.getValue(),\n    });\n  }\n}\n", "<h2\n  mat-dialog-title\n  [ngStyle]=\"{\n    color: data.filterSettings.textColor,\n    background: data.filterSettings.backgroundColor\n  }\"\n>\n  {{ 'COMMON.LOCATION' | translate }}\n</h2>\n\n<mat-dialog-content class=\"account-selection-container\">\n  <div class=\"search-container\">\n    <mat-form-field appearance=\"outline\">\n      <input\n        type=\"text\"\n        matInput\n        placeholder=\"{{ 'BRANDS.LISTINGS.SEARCH_FOR_LOCATION' | translate }}\"\n        [formControl]=\"accountGroupFilterControl\"\n        autocomplete=\"off\"\n      />\n    </mat-form-field>\n    <cdk-virtual-scroll-viewport itemSize=\"57\" minBufferPx=\"500px\" maxBufferPx=\"500px\" class=\"available-options\">\n      @if (filteredOptions$ | async; as options) {\n        @if (noResultsFound && !!accountGroupFilterControl.value && accountGroupFilterControl.value.trim() !== '') {\n          <div class=\"no-results-found\">\n            {{ 'BRANDS.LOCATIONS_MODAL.NO_RESULTS' | translate }}\n          </div>\n        }\n        <div #optionEl class=\"option\" *cdkVirtualFor=\"let option of options\">\n          <div class=\"option-details\">\n            <div class=\"address-option-container\">\n              <div class=\"name\">{{ option.name }}</div>\n              <div class=\"address\">{{ option.address }}</div>\n            </div>\n          </div>\n          <div class=\"option-actions\">\n            <button color=\"primary\" mat-icon-button (click)=\"selectFilterLocation(optionEl, option.accountGroupId)\">\n              <mat-icon>add</mat-icon>\n            </button>\n          </div>\n        </div>\n      }\n    </cdk-virtual-scroll-viewport>\n  </div>\n  <div class=\"selection-container\">\n    @if (selectedOptionsDetails$ | async; as options) {\n      <div class=\"title\">\n        <span>\n          {{ 'BRANDS.LOCATIONS_MODAL.SELECTED_LOCATIONS' | translate }}\n        </span>\n        @if (options.length > 0) {\n          <span>\n            ({{ options.length }} {{ (options.length === 1 ? 'COMMON.LOCATION' : 'COMMON.LOCATIONS') | translate }})\n          </span>\n        }\n      </div>\n      <div class=\"options-container\">\n        @if (options.length === 0) {\n          <div class=\"no-results-found\">\n            {{ 'BRANDS.LOCATIONS_MODAL.NO_LOCATIONS' | translate }}\n          </div>\n        }\n        @for (item of options; track item) {\n          <mat-card appearance=\"outlined\">\n            <div class=\"address-option-container\">\n              <div class=\"name\">{{ item.name }}</div>\n              <div class=\"address\">{{ item.address }}</div>\n            </div>\n            <div class=\"action\">\n              <mat-icon (click)=\"removeLocation(item.accountGroupId)\">cancel</mat-icon>\n            </div>\n          </mat-card>\n        }\n      </div>\n    }\n  </div>\n</mat-dialog-content>\n\n<mat-dialog-actions align=\"end\">\n  <button mat-stroked-button (click)=\"close(false)\">\n    {{ 'COMMON.ACTION_LABELS.CANCEL' | translate }}\n  </button>\n  <button mat-flat-button color=\"primary\" (click)=\"close(true)\">\n    {{ 'COMMON.ACTION_LABELS.SAVE' | translate }}\n  </button>\n</mat-dialog-actions>\n", "import { Component, OnInit, Inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { UntypedFormControl } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { FilterDisplaySettings, BrandFilterContainerService } from '../brand-filter-container.service';\nimport { BrandsService } from '../../brands.service';\n\nexport interface Data {\n  selectedSourceIds: string[];\n  filterSettings: FilterDisplaySettings;\n}\n\n@Component({\n  selector: 'bc-brand-geography-dialog',\n  templateUrl: './brand-source-dialog.component.html',\n  styleUrls: ['./brand-source-dialog.component.scss'],\n  standalone: false,\n})\nexport class BrandSourceDialogComponent implements OnInit {\n  formControl = new UntypedFormControl();\n\n  options$: Observable<any[]>;\n\n  constructor(\n    private brandService: BrandsService,\n    public dialogRef: MatDialogRef<BrandSourceDialogComponent>,\n    private readonly brandFiltersService: BrandFilterContainerService,\n    @Inject(MAT_DIALOG_DATA) public data: Data,\n  ) {}\n\n  ngOnInit(): void {\n    this.formControl.setValue(this.data.selectedSourceIds);\n\n    this.options$ = this.brandFiltersService.sourceOptions$;\n  }\n\n  close(newData: boolean): void {\n    if (!newData) {\n      this.dialogRef.close();\n      return;\n    }\n    this.dialogRef.close({\n      selectedSourceIds: this.formControl.value || [],\n    });\n  }\n}\n", "<h2\n  mat-dialog-title\n  [ngStyle]=\"{\n    color: data.filterSettings.textColor,\n    background: data.filterSettings.backgroundColor\n  }\"\n>\n  {{ 'COMMON.REVIEW_OR_LISTING_SOURCE' | translate }}\n</h2>\n<mat-dialog-content>\n  <div class=\"location-selector\">\n    <forms-va-input-tags [formControl]=\"formControl\" [options]=\"options$ | async\"></forms-va-input-tags>\n  </div>\n</mat-dialog-content>\n<mat-dialog-actions align=\"end\">\n  <button mat-stroked-button color=\"primary\" (click)=\"close(false)\">\n    {{ 'COMMON.ACTION_LABELS.CANCEL' | translate }}\n  </button>\n  <button mat-flat-button color=\"primary\" (click)=\"close(true)\">\n    {{ 'COMMON.ACTION_LABELS.SAVE' | translate }}\n  </button>\n</mat-dialog-actions>\n", "import { Component, OnInit, Inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { UntypedFormControl } from '@angular/forms';\nimport { combineLatest, Observable } from 'rxjs';\nimport { map, take } from 'rxjs/operators';\nimport { FilterDisplaySettings } from '../brand-filter-container.service';\nimport { AccountGroupMetricService } from '../../../metrics/account-group.service';\nimport { TaxonomyOption } from '@vendasta/taxonomy';\nimport { TranslateService } from '@ngx-translate/core';\n\nexport interface TaxonomyData {\n  selectedTaxonomies: TaxonomyOption[];\n  filterSettings: FilterDisplaySettings;\n}\n\n@Component({\n  selector: 'bc-brand-geography-dialog',\n  templateUrl: './brand-taxonomy-dialog.component.html',\n  styleUrls: ['./brand-taxonomy-dialog.component.scss'],\n  standalone: false,\n})\nexport class BrandTaxonomyDialogComponent implements OnInit {\n  taxonomyFormControl = new UntypedFormControl();\n\n  taxonomyOptions$: Observable<any[]>;\n\n  constructor(\n    private accountGroupService: AccountGroupMetricService,\n    private translateService: TranslateService,\n    public dialogRef: MatDialogRef<BrandTaxonomyDialogComponent>,\n    @Inject(MAT_DIALOG_DATA) public data: TaxonomyData,\n  ) {}\n\n  ngOnInit(): void {\n    const selectedTaxonomyIds = this.data.selectedTaxonomies.map((taxOpts) => taxOpts.id);\n    this.taxonomyFormControl.setValue(selectedTaxonomyIds);\n\n    this.taxonomyOptions$ = combineLatest([\n      this.accountGroupService.brandTaxonomyOptions$,\n      this.translateService.stream('FRONTEND.TAXONOMY'),\n    ]).pipe(\n      map(([brandTaxMap, taxonomyTranslations]) => {\n        if (!brandTaxMap) {\n          return [];\n        }\n        const locationsTemplate = this.translateService.instant('PERFORMANCE.MULTI_LOCATION.FILTERS.LOCATION_COUNT', {\n          count: 'NUM',\n        });\n        return Array.from(brandTaxMap)\n          .map(([fullTaxId, taxWithCount]) => {\n            const taxNames = fullTaxId.split(':').map((taxId) => {\n              return Object.prototype.hasOwnProperty.call(taxonomyTranslations, taxId)\n                ? taxonomyTranslations[taxId]\n                : taxId;\n            });\n            const taxName = taxNames.join(' > ');\n            const numLocations = locationsTemplate.replace('NUM', taxWithCount.numLocations);\n            return {\n              value: fullTaxId,\n              name: `${taxName} ${numLocations}`,\n            };\n          })\n          .sort((a, b) => a.name.localeCompare(b.name));\n      }),\n    );\n  }\n\n  close(newData: boolean): void {\n    if (!newData) {\n      this.dialogRef.close();\n      return;\n    }\n    // Get the actual tax options back from the ids\n    this.accountGroupService.brandTaxonomyOptions$\n      .pipe(\n        take(1),\n        map((taxOptions) => {\n          return (this.taxonomyFormControl.value || []).map((taxId) => {\n            return taxOptions.get(taxId).taxonomyOption;\n          });\n        }),\n      )\n      .subscribe((selectedTaxonomies) => {\n        this.dialogRef.close({\n          selectedTaxonomies: selectedTaxonomies,\n        });\n      });\n  }\n}\n", "<h2\n  mat-dialog-title\n  [ngStyle]=\"{\n    color: data.filterSettings.textColor,\n    background: data.filterSettings.backgroundColor\n  }\"\n>\n  {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.TITLES.CATEGORY' | translate }}\n</h2>\n<mat-dialog-content>\n  <div class=\"location-selector\">\n    <forms-va-input-tags [formControl]=\"taxonomyFormControl\" [options]=\"taxonomyOptions$ | async\"></forms-va-input-tags>\n  </div>\n</mat-dialog-content>\n<mat-dialog-actions align=\"end\">\n  <button mat-stroked-button (click)=\"close(false)\">\n    {{ 'COMMON.ACTION_LABELS.CANCEL' | translate }}\n  </button>\n  <button mat-flat-button color=\"primary\" (click)=\"close(true)\">\n    {{ 'COMMON.ACTION_LABELS.SAVE' | translate }}\n  </button>\n</mat-dialog-actions>\n", "import { Component, DestroyRef, input, OnInit } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatDialog } from '@angular/material/dialog';\nimport { AddressAPIService, CountryConfiguration } from '@vendasta/address';\nimport {\n  CompositeFilterOperator,\n  FieldFilterOperator,\n  FieldFilterOperatorFunction,\n  Filter,\n  PropertyType,\n} from '@vendasta/multi-location-analytics';\nimport { TaxonomyOption } from '@vendasta/taxonomy';\nimport { asyncScheduler, combineLatest, Observable } from 'rxjs';\nimport { map, observeOn, switchMap, withLatestFrom } from 'rxjs/operators';\nimport { LanguageService } from '../../core/language-service.service';\nimport { isMobile } from '../../core/mobile';\nimport { AccountGroupMetricService } from '../../metrics/account-group.service';\nimport { Mode, SidepanelService, Size, SizePixels } from '../../navigation/sidepanel.service';\nimport { FilterService } from '../../shared/filter-service.service';\nimport { TimeRangeService } from '../../shared/time-range.service';\nimport { BrandsService } from '../brands.service';\nimport {\n  BrandFilterContainerService,\n  CITIES_LABEL,\n  COUNTRIES_LABEL,\n  DisplayFilter,\n  FilterDisplaySettings,\n  Location,\n  LocationGroup,\n  STATEPROV_LABEL,\n} from './brand-filter-container.service';\nimport { BrandGeographyDialogComponent } from './brand-geography-dialog/brand-geography-dialog.component';\nimport { BrandGroupDialogComponent, GroupWithDisplayName } from './brand-group-dialog/brand-group-dialog.component';\nimport { BrandLocationDialogComponent } from './brand-location-dialog/brand-location-dialog.component';\nimport { BrandSourceDialogComponent } from './brand-source-dialog/brand-source-dialog.component';\nimport { BrandTaxonomyDialogComponent } from './brand-taxonomy-dialog/brand-taxonomy-dialog.component';\n\n@Component({\n  selector: 'bc-brand-filter-container',\n  templateUrl: './brand-filter-container.component.html',\n  styleUrls: ['./brand-filter-container.component.scss'],\n  standalone: false,\n})\nexport class BrandFilterContainerComponent implements OnInit {\n  filterItems: DisplayFilter[] = [];\n  filterSettings: FilterDisplaySettings = {\n    textColor: '',\n    backgroundColor: '',\n  };\n  filterQuantity$: Observable<number>;\n\n  availableLocations: LocationGroup[];\n  selectedCountries: Location[] = [];\n  selectedStateProvinces: Location[] = [];\n  selectedCities: Location[] = [];\n\n  selectedGroup: GroupWithDisplayName;\n\n  selectedTaxonomies: TaxonomyOption[] = [];\n\n  filterBarOffset$: Observable<string>;\n\n  sidenavOpened$ = this.sidepanelService.visible$;\n  dateText$: Observable<string>;\n\n  geographyFilter$: Observable<boolean>;\n  busCategoryFilter$: Observable<boolean>;\n  groupFilter$: Observable<boolean>;\n  locationFilter$: Observable<boolean>;\n  sourceFilter$: Observable<boolean>;\n\n  displaySourceFilter = input<boolean>(true);\n\n  constructor(\n    private dialog: MatDialog,\n    private accountGroupMetricService: AccountGroupMetricService,\n    private filterService: FilterService,\n    private timeRangeService: TimeRangeService,\n    private brandsService: BrandsService,\n    private sidepanelService: SidepanelService,\n    public brandFiltersService: BrandFilterContainerService,\n    private languageService: LanguageService,\n    private addressService: AddressAPIService,\n    private destroyRef: DestroyRef,\n  ) {}\n\n  ngOnInit(): void {\n    this.brandFiltersService.openDialog$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe({\n      next: (dialog) => {\n        switch (dialog) {\n          case 'location':\n            this.openLocationDialog();\n        }\n      },\n    });\n\n    // Add Location filter which displays only if locations are selected\n    this.addOrUpdateFilterItem(\n      'location-filter',\n      'COMMON.LOCATION',\n      null,\n      this.brandFiltersService.locationFilterDisplay$,\n    );\n    // But still watch the selection to update the filters..\n    this.brandFiltersService.selectedAccountGroupIds$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n      this.calculateFilters();\n    });\n\n    // Add Source filter which displays only if sources are selected\n    this.addOrUpdateFilterItem(\n      'source-filter',\n      'COMMON.REVIEW_OR_LISTING_SOURCE',\n      null,\n      this.brandFiltersService.sourceFilterDisplay$,\n    );\n\n    const geographicBreakdown$ = this.accountGroupMetricService.getGeographicBreakdown$();\n    combineLatest([this.languageService.currentLocale$, geographicBreakdown$])\n      .pipe(\n        switchMap(([currentLocale, geographicBreakdown]) => {\n          const countryCodes = geographicBreakdown.reduce((codes, location) => {\n            if (location.countryCode && codes.indexOf(location.countryCode) === -1) {\n              codes.push(location.countryCode);\n            }\n            return codes;\n          }, []);\n          return combineLatest(\n            countryCodes.map((code) => this.addressService.getCountryConfiguration(code, currentLocale)),\n          );\n        }),\n        map((countryConfigs: CountryConfiguration[]) => {\n          return countryConfigs.reduce(\n            (options: Record<string, CountryConfiguration>, country: CountryConfiguration) => {\n              options[country.code] = country;\n              return options;\n            },\n            {},\n          );\n        }),\n        withLatestFrom(geographicBreakdown$),\n        takeUntilDestroyed(this.destroyRef),\n      )\n      .subscribe(([countryOptions, geographicBreakdown]) => {\n        if (typeof geographicBreakdown === 'undefined' || geographicBreakdown === null) {\n          return;\n        }\n        this.clearAvailableLocations();\n        geographicBreakdown.forEach((location) => {\n          if (location.country && !location.state) {\n            this.availableLocations[0].options.push({\n              id: location.countryCode,\n              name: countryOptions[location.countryCode].name,\n              parent: [],\n              locationCount: location.numLocations,\n            });\n          }\n          if (location.country && location.state && !location.city) {\n            const state = countryOptions[location.countryCode].zones?.find((zone) => {\n              return zone.code === location.stateCode;\n            });\n            this.availableLocations[1].options.push({\n              id: location.stateCode,\n              name: state?.name,\n              parent: [location.countryCode],\n              locationCount: location.numLocations,\n            });\n          }\n          if (location.country && location.state && location.city) {\n            this.availableLocations[2].options.push({\n              id: location.city,\n              name: `${location.city}, ${location.stateCode}`,\n              parent: [location.countryCode, location.stateCode],\n              locationCount: location.numLocations,\n            });\n          }\n        });\n        this.availableLocations[0].options.sort(this.sortName);\n        this.availableLocations[1].options.sort(this.sortName);\n        this.availableLocations[2].options.sort(this.sortName);\n      });\n\n    this.filterBarOffset$ = combineLatest([\n      this.sidepanelService.mode$,\n      this.sidepanelService.size$,\n      this.sidepanelService.visible$,\n    ]).pipe(\n      observeOn(asyncScheduler),\n      map(([mode, size, visible]) => {\n        if (mode !== Mode.SIDE || isMobile()) {\n          return '0';\n        }\n        if (!visible) {\n          return '0';\n        }\n        if (size === Size.SMALL) {\n          return `${SizePixels.SMALL}px`;\n        } else if (size === Size.REGULAR) {\n          return `${SizePixels.REGULAR}px`;\n        } else {\n          return `${SizePixels.LARGE}px`;\n        }\n      }),\n    );\n\n    this.dateText$ = combineLatest([\n      this.brandFiltersService.dateFilterDisplay$,\n      this.timeRangeService.dateRange$,\n      this.languageService.currentLocale$,\n    ]).pipe(\n      map(([type, [start, end], locale]) => {\n        if (type === 'Custom' && start && end) {\n          return start.toLocaleDateString(locale) + ' - ' + end.toLocaleDateString(locale);\n        } else {\n          return type;\n        }\n      }),\n    );\n    this.filterQuantity$ = this.filterService.filtersQuantity$;\n    this.groupFilter$ = this.filterService.subgroup$.pipe(map((r) => r != null));\n    this.locationFilter$ = this.brandFiltersService.locationFilterDisplay$.pipe(map((r) => r.length > 0));\n    this.sourceFilter$ = this.filterService.filteredSources$.pipe(map((r) => r.length > 0));\n    this.geographyFilter$ = this.filterQuantity$.pipe(\n      map(() => this.selectedCities.concat(this.selectedStateProvinces).concat(this.selectedCountries).length > 0),\n    );\n    this.busCategoryFilter$ = this.filterQuantity$.pipe(map(() => this.selectedTaxonomies.length > 0));\n  }\n\n  private clearAvailableLocations(): void {\n    this.availableLocations = [\n      {\n        name: COUNTRIES_LABEL,\n        options: [],\n      },\n      {\n        name: STATEPROV_LABEL,\n        options: [],\n      },\n      {\n        name: CITIES_LABEL,\n        options: [],\n      },\n    ];\n  }\n\n  private sortName(a: Location, b: Location): number {\n    return a.name?.localeCompare(b.name);\n  }\n\n  addOrUpdateFilterItem(\n    filterId: string,\n    filterTypeTranslateKey: string,\n    value: string,\n    value$?: Observable<string>,\n  ): void {\n    const foundFilter = this.filterItems.filter((item) => item.filterId === filterId);\n    if (foundFilter.length > 0) {\n      foundFilter[0].displayName = value;\n      this.filterItems[this.filterItems.findIndex((el) => el.filterId === filterId)] = foundFilter[0];\n      return;\n    }\n    this.filterItems.push({\n      filterId: filterId,\n      filterTypeTranslateKey: filterTypeTranslateKey,\n      displayName: value,\n      displayName$: value$,\n    });\n  }\n\n  removeFilterItem(filterId: string): void {\n    if (filterId === 'location-filter') {\n      // This will no longer display the chip and recalculate the filters\n      this.brandFiltersService.clearAccountGroupIds();\n      return;\n    } else if (filterId === 'source-filter') {\n      // This will no longer display the chip and recalculate the filters\n      this.brandFiltersService.clearSourceIds();\n      return;\n    }\n    this.filterItems = this.filterItems.filter((filter) => filter.filterId !== filterId);\n    if (filterId === 'geography-filter') {\n      this.selectedCountries = [];\n      this.selectedStateProvinces = [];\n      this.selectedCities = [];\n      this.calculateFilters();\n    } else if (filterId === 'group-filter') {\n      this.brandsService.clearPath();\n      this.selectedGroup = null;\n      this.filterService.setSubgroup(null);\n    } else if (filterId === 'category-filter') {\n      this.selectedTaxonomies = [];\n      this.calculateFilters();\n    }\n  }\n\n  selectFilterItem(filterId: string): void {\n    if (filterId === 'geography-filter') {\n      this.openGeographyDialog();\n    } else if (filterId === 'group-filter') {\n      this.openGroupDialog();\n    } else if (filterId === 'category-filter') {\n      this.openTaxonomyDialog();\n    } else if (filterId === 'location-filter') {\n      this.openLocationDialog();\n    } else if (filterId === 'source-filter') {\n      this.openSourceDialog();\n    }\n  }\n\n  private calculateGeographyFilter(): string {\n    if (this.selectedCountries.length + this.selectedStateProvinces.length + this.selectedCities.length > 1) {\n      let displayValue = '';\n      if (this.selectedCountries.length === 1) {\n        displayValue += '1 Country';\n      } else if (this.selectedCountries.length > 1) {\n        displayValue += `${this.selectedCountries.length} Countries`;\n      }\n\n      if (this.selectedCountries.length > 0 && this.selectedStateProvinces.length > 0) {\n        displayValue += this.selectedCities.length > 0 ? ', ' : ' and ';\n      }\n\n      if (this.selectedStateProvinces.length === 1) {\n        displayValue += '1 State/Province';\n      } else if (this.selectedStateProvinces.length > 1) {\n        displayValue += `${this.selectedStateProvinces.length} States/Provinces`;\n      }\n\n      if (\n        (this.selectedCountries.length > 0 || this.selectedStateProvinces.length > 0) &&\n        this.selectedCities.length > 0\n      ) {\n        displayValue += ' and ';\n      }\n\n      if (this.selectedCities.length === 1) {\n        displayValue += '1 City';\n      } else if (this.selectedCities.length > 1) {\n        displayValue += `${this.selectedCities.length} Cities`;\n      }\n      return displayValue;\n    }\n    if (this.selectedCountries.length > 0) {\n      return this.selectedCountries[0].id;\n    }\n    if (this.selectedStateProvinces.length > 0) {\n      return this.selectedStateProvinces[0].id;\n    }\n    if (this.selectedCities.length > 0) {\n      return this.selectedCities[0].id;\n    }\n  }\n\n  private calculateGroupFilter(): string {\n    if (this.selectedGroup) {\n      return this.selectedGroup.name;\n    }\n  }\n\n  private calculateTaxonomyFilter(): string {\n    // Take the last part of the tax ids and join them\n    return '' + this.selectedTaxonomies.map((taxOpt) => taxOpt.name.split(' > ').pop()).join(', ');\n  }\n\n  private calculatePartnerColor(theme: string, primaryColor?: string): void {\n    let selectedColor = this.filterSettings.textColor;\n    if (theme === 'dark' && primaryColor) {\n      selectedColor = '#FFFFFF';\n    }\n    this.filterSettings = {\n      textColor: selectedColor,\n      backgroundColor: primaryColor ? `#${primaryColor}` : '#EAEAEA',\n    };\n  }\n\n  openGeographyDialog(): void {\n    const dialogRef = this.dialog.open(BrandGeographyDialogComponent, {\n      data: {\n        availableLocations: this.availableLocations,\n        selectedCountries: this.selectedCountries,\n        selectedStateProvinces: this.selectedStateProvinces,\n        selectedCities: this.selectedCities,\n        filterSettings: this.filterSettings,\n      },\n      id: 'brand-geography-container',\n    });\n    dialogRef.afterClosed().subscribe((results) => {\n      if (typeof results !== 'undefined') {\n        this.selectedCountries = results.selectedCountries;\n        this.selectedStateProvinces = results.selectedStateProvinces;\n        this.selectedCities = results.selectedCities;\n\n        // Empty selection should clear filter chip\n        if (\n          this.selectedCountries.length === 0 &&\n          this.selectedStateProvinces.length === 0 &&\n          this.selectedCities.length === 0\n        ) {\n          this.removeFilterItem('geography-filter');\n          this.calculateFilters();\n          return;\n        }\n\n        this.addOrUpdateFilterItem(\n          'geography-filter',\n          'PERFORMANCE.MULTI_LOCATION.FILTERS.TITLES.GEOGRAPHY',\n          this.calculateGeographyFilter(),\n        );\n        this.calculateFilters();\n      }\n    });\n  }\n\n  openGroupDialog(): void {\n    const dialogRef = this.dialog.open(BrandGroupDialogComponent, {\n      data: {\n        selectedGroup: this.selectedGroup,\n        filterSettings: this.filterSettings,\n      },\n      id: 'brand-group-container',\n    });\n    dialogRef.afterClosed().subscribe((results) => {\n      if (typeof results !== 'undefined') {\n        this.selectedGroup = <GroupWithDisplayName>results.selectedGroup;\n        this.filterService.setSubgroup(this.selectedGroup.group.pathNodes);\n\n        this.addOrUpdateFilterItem(\n          'group-filter',\n          'PERFORMANCE.MULTI_LOCATION.FILTERS.TITLES.GROUP',\n          this.calculateGroupFilter(),\n        );\n\n        this.brandsService.setPath(this.selectedGroup.group.pathNodes);\n      } else {\n        this.selectedGroup = null;\n        this.filterService.setSubgroup(null);\n        this.brandsService.clearPath();\n      }\n    });\n  }\n\n  openTaxonomyDialog(): void {\n    const dialogRef = this.dialog.open(BrandTaxonomyDialogComponent, {\n      data: {\n        selectedTaxonomies: this.selectedTaxonomies,\n        filterSettings: this.filterSettings,\n      },\n      id: 'brand-taxonomies-container',\n    });\n    dialogRef.afterClosed().subscribe((results) => {\n      if (typeof results !== 'undefined') {\n        this.selectedTaxonomies = results.selectedTaxonomies as TaxonomyOption[];\n\n        // Empty selection should clear filter chip\n        if (this.selectedTaxonomies.length === 0) {\n          this.removeFilterItem('category-filter');\n          this.calculateFilters();\n          return;\n        }\n\n        this.addOrUpdateFilterItem(\n          'category-filter',\n          'PERFORMANCE.MULTI_LOCATION.FILTERS.TITLES.CATEGORY',\n          this.calculateTaxonomyFilter(),\n        );\n        this.calculateFilters();\n      }\n    });\n  }\n\n  openLocationDialog(): void {\n    const dialogRef = this.dialog.open(BrandLocationDialogComponent, {\n      data: {\n        filterSettings: this.filterSettings,\n      },\n      id: 'brand-location-filter-container',\n      panelClass: ['mobile-full-width'],\n    });\n    dialogRef.afterClosed().subscribe((results) => {\n      if (typeof results !== 'undefined') {\n        // Setting this updates the field, clears the chip if nothing, and recaclculates filters\n        this.brandFiltersService.setAccountGroupIds(results.selectedAccountGroupIds);\n      }\n    });\n  }\n\n  openSourceDialog(): void {\n    const dialogRef = this.dialog.open(BrandSourceDialogComponent, {\n      data: {\n        selectedSourceIds: this.brandFiltersService.getSourceIds(),\n        filterSettings: this.filterSettings,\n      },\n      id: 'brand-source-filter-container',\n    });\n    dialogRef.afterClosed().subscribe((results) => {\n      if (typeof results !== 'undefined') {\n        // Setting this updates the field, clears the chip if nothing, and recaclculates filters\n        this.brandFiltersService.setSourceIds(results.selectedSourceIds);\n      }\n      this.calculateFilters();\n    });\n  }\n\n  private calculateGeographyFilters(): Filter {\n    if (\n      this.selectedCountries.length === 0 &&\n      this.selectedStateProvinces.length === 0 &&\n      this.selectedCities.length === 0\n    ) {\n      return null;\n    }\n    const filterObject = new Filter({\n      compositeFilter: {\n        op: CompositeFilterOperator.OR,\n        filters: [],\n      },\n    });\n    [...this.selectedCountries, ...this.selectedStateProvinces, ...this.selectedCities].forEach((location) => {\n      let dimension = 'country';\n      if (location.parent.length === 1) {\n        dimension = 'state';\n      } else if (location.parent.length === 2) {\n        dimension = 'city';\n      }\n      filterObject.compositeFilter.filters.push(\n        new Filter({\n          fieldFilter: {\n            operator: FieldFilterOperator.EQUAL,\n            dimension: `account_group__${dimension}`,\n            value: {\n              value: location.id,\n              valueType: PropertyType.PROPERTY_TYPE_STRING,\n            },\n          },\n        }),\n      );\n    });\n\n    return filterObject;\n  }\n\n  private calculateTaxonomyFilters(): Filter {\n    if (this.selectedTaxonomies.length === 0) {\n      return null;\n    }\n    return new Filter({\n      fieldFilter: {\n        operator: FieldFilterOperator.OVERLAP,\n        dimension: `account_group__tax_ids`,\n        value: {\n          value: this.selectedTaxonomies.map((taxOpt) => taxOpt.id),\n          valueType: PropertyType.PROPERTY_TYPE_STRING,\n        },\n      },\n    });\n  }\n\n  private calculateLocationFilters(): Filter {\n    if (this.brandFiltersService.getAccountGroupIds().length === 0) {\n      return null;\n    }\n    return new Filter({\n      fieldFilter: {\n        operator: FieldFilterOperator.EQUAL,\n        operatorFunction: FieldFilterOperatorFunction.ANY,\n        // TODO: Minor(?) opportunity here to not require the join for this if all metrics had same agid field\n        dimension: `account_group__account_group_id`,\n        value: {\n          value: this.brandFiltersService.getAccountGroupIds(),\n          valueType: PropertyType.PROPERTY_TYPE_STRING,\n        },\n      },\n    });\n  }\n\n  private calculateFilters(): void {\n    const geoFilter = this.calculateGeographyFilters();\n    const taxonomyFilter = this.calculateTaxonomyFilters();\n    const locationFilter = this.calculateLocationFilters();\n    this.filterService.setFilters([geoFilter, taxonomyFilter, locationFilter].filter((x) => !!x));\n  }\n\n  public clearAllFilters(): void {\n    this.removeFilterItem('location-filter');\n    this.removeFilterItem('source-filter');\n    this.removeFilterItem('geography-filter');\n    this.removeFilterItem('group-filter');\n    this.removeFilterItem('category-filter');\n  }\n}\n", "<div\n  class=\"brand-filter mat-elevation-z1 atlas\"\n  [ngClass]=\"{\n    closed: (sidenavOpened$ | async) === false,\n    'mat-elevation-z1': brandFiltersService.shouldHaveShadow$ | async,\n  }\"\n  [ngStyle]=\"{ right: filterBarOffset$ | async }\"\n  style=\"display: flex\"\n>\n  <button\n    class=\"icon-filter-button\"\n    mat-stroked-button\n    [matMenuTriggerFor]=\"filterSelection\"\n    [matBadge]=\"filterQuantity$ | async\"\n    [matBadgeHidden]=\"(filterQuantity$ | async) === 0\"\n    matBadgePosition=\"after\"\n    matBadgeColor=\"accent\"\n  >\n    <mat-icon class=\"icon\">filter_list</mat-icon>\n    <span class=\"label\">\n      {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.FILTERS' | translate }}\n    </span>\n  </button>\n  <mat-menu class=\"dropdown-menu\" [overlapTrigger]=\"false\" #filterSelection=\"matMenu\">\n    <button\n      mat-menu-item\n      (click)=\"openGeographyDialog()\"\n      data-action-group=\"clicked-brand-filter\"\n      data-action=\"clicked-brand-filter-open-geography\"\n    >\n      <span>\n        {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.TITLES.GEOGRAPHY' | translate }}...\n        @if (geographyFilter$ | async) {\n          <mat-icon class=\"filter-indicator\">brightness_1</mat-icon>\n        }\n      </span>\n    </button>\n    <button\n      mat-menu-item\n      (click)=\"openTaxonomyDialog()\"\n      data-action-group=\"clicked-brand-filter\"\n      data-action=\"clicked-brand-filter-open-taxonomy\"\n    >\n      <span>\n        {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.TITLES.CATEGORY' | translate }}...\n        @if (busCategoryFilter$ | async) {\n          <mat-icon class=\"filter-indicator\">brightness_1</mat-icon>\n        }\n      </span>\n    </button>\n    <button\n      mat-menu-item\n      (click)=\"openGroupDialog()\"\n      data-action-group=\"clicked-brand-filter\"\n      data-action=\"clicked-brand-filter-open-group\"\n    >\n      <span>\n        {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.TITLES.GROUP' | translate }}...\n        @if (groupFilter$ | async) {\n          <mat-icon class=\"filter-indicator\">brightness_1</mat-icon>\n        }\n      </span>\n    </button>\n    <button\n      mat-menu-item\n      (click)=\"openLocationDialog()\"\n      data-action-group=\"clicked-brand-filter\"\n      data-action=\"clicked-brand-filter-open-location\"\n    >\n      <span>\n        {{ 'COMMON.LOCATION' | translate }}...\n        @if (locationFilter$ | async) {\n          <mat-icon class=\"filter-indicator\">brightness_1</mat-icon>\n        }\n      </span>\n    </button>\n    @if (displaySourceFilter()) {\n      <button\n        mat-menu-item\n        (click)=\"openSourceDialog()\"\n        data-action-group=\"clicked-brand-filter\"\n        data-action=\"clicked-brand-filter-open-source\"\n      >\n        <span>\n          {{ 'COMMON.REVIEW_OR_LISTING_SOURCE' | translate }}...\n          @if (sourceFilter$ | async) {\n            <mat-icon class=\"filter-indicator\">brightness_1</mat-icon>\n          }\n        </span>\n      </button>\n    }\n    @if ((filterQuantity$ | async) > 0) {\n      <button\n        class=\"clearFilters\"\n        (click)=\"clearAllFilters()\"\n        color=\"primary\"\n        mat-menu-item\n        data-action-group=\"clicked-brand-filter\"\n        data-action=\"clicked-brand-filter-clear-all\"\n      >\n        {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.CLEAR_ALL_FILTERS' | translate }}\n      </button>\n    }\n  </mat-menu>\n</div>\n"],
  "mappings": "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",
  "names": ["init_reputation", "__esmMin", "init_reputation_service", "FilterService", "init_filter_service_service", "__esmMin", "init_esm", "init_vendasta_multi_location_analytics", "init_operators", "constructor", "filters$$", "BehaviorSubject", "Array", "enabledSources$$", "filteredSources$$", "subgroup$$", "filters$", "asObservable", "pipe", "map", "r", "enabledSources$", "filteredSources$", "subgroup$", "sourceFilter$", "combineLatest", "enabled", "filtered", "length", "sourceIds", "Filter", "fieldFilter", "operator", "FieldFilterOperator", "EQUAL", "operatorFunction", "FieldFilterOperatorFunction", "ANY", "dimension", "value", "valueType", "PropertyType", "PROPERTY_TYPE_STRING", "distinctUntilChanged", "filtersQuantity$", "filters", "filteredSources", "subgroup", "qty", "setFilters", "next", "setEnabledSources", "setFilteredSources", "setSubgroup", "groupId", "factory", "\u0275fac", "providedIn", "COUNTRIES_LABEL", "STATEPROV_LABEL", "CITIES_LABEL", "BrandFilterContainerService", "init_brand_filter_container_service", "__esmMin", "init_router", "init_esm", "init_operators", "init_account_group", "init_page_access", "init_time_range_service", "init_rxjs_interop", "constructor", "timeRangeService", "translate", "filterService", "router", "reputationService", "locationsService", "dateFilterUsed$$", "BehaviorSubject", "dateFilterUsed$", "asObservable", "selectedAccountGroupIds$$", "selectedAccountGroupIds$", "selectedSourceIds$$", "selectedSourceIds$", "sourceIdCounts$$", "sourceIdCounts$", "openDialog$", "Subject", "minimised$$", "minimised$", "dateFilterDisplay$", "selectedTimeRangeKey$", "pipe", "map", "timeRangeKey", "AvailableTimeRangeOptions", "find", "timeRangeOption", "key", "name", "locationFilterDisplay$", "combineLatest", "currentAccountGroups$", "filter", "ls", "stream", "brandLocations", "accountGroupIds", "locationsTranslated", "locs", "accountGroupId", "locsInside", "loc", "length", "setAccountGroupIds", "companyName", "getLocation", "join", "sourceFilterDisplay$", "brandSourcesFull$", "sourceMap", "brandSources", "selectedSourceIds", "sourceIdCounts", "sourcesTranslated", "sources", "sourceId", "get", "sourcesInside", "source", "setSourceIds", "sourceOptions$", "countMap", "Array", "from", "keys", "count", "value", "valueCount", "sort", "a", "b", "localeCompare", "brandSources$", "takeUntilDestroyed", "subscribe", "sourceIds", "setEnabledSources", "toString", "setFilteredSources", "shouldHaveShadow$", "events", "event", "ActivationEnd", "snapshot", "children", "data", "PageId", "multi_location_report", "startWith", "_this", "route", "routerState", "root", "firstChild", "shareReplay", "refCount", "bufferSize", "setMinimizedStatus", "status", "next", "openDialog", "dialog", "getAccountGroupIds", "getValue", "clearAccountGroupIds", "getSourceIds", "addSourceId", "includes", "removeSourceId", "newSources", "id", "clearSourceIds", "\u0275\u0275inject", "TimeRangeService", "TranslateService", "FilterService", "Router", "ReputationService", "LocationsService", "factory", "\u0275fac", "providedIn", "round", "value", "pipeOpts", "val", "rounderPipe", "transform", "replace", "rowify", "r", "metrics", "res", "map", "m", "parse", "Row", "rows", "forEach", "singleDayMeasureValues", "push", "values", "dimension", "results", "measures", "reduce", "acc", "concat", "QueryMetricsResponseDelta", "init_helpers", "__esmMin", "init_common", "init_operators", "DecimalPipe", "constructor", "currentPeriod$", "prevPeriod$", "currentPeriodRows$", "pipe", "metricResults", "previousPeriodRows$", "boolValue", "value", "TypedValue", "valueType", "PropertyType", "PROPERTY_TYPE_BOOL", "stringValue", "PROPERTY_TYPE_STRING", "buildListingCountMeasures", "measures", "map", "field", "fieldErrorFilter", "Filter", "fieldFilter", "FieldFilter", "dimension", "operator", "FieldFilterOperator", "EQUAL", "Measure", "aggregate", "MeasureAggregate", "measure", "aggOp", "MeasureAggregateOperator", "COUNT", "filter", "compositeFilter", "op", "CompositeFilterOperator", "AND", "filters", "isNotVerifiedFilter", "isInaccurateFilter", "alias", "concat", "isAccurateFilter", "isVerifiedFilter", "OR", "unaryFilter", "UnaryFilter", "UnaryFilterOperator", "IS_NULL", "isPotentialMissingFilter", "inclusiveExclusive", "start", "end", "DateRange", "endExclusive", "inclusiveInclusive", "import_dayjs", "import_utc", "import_moment", "StatByTime", "BrandContext", "isMissingFilter", "QueryService", "init_query_service", "__esmMin", "init_vendasta_multi_location_analytics", "init_esm", "init_operators", "init_globals", "init_locations", "init_time_range_shared", "init_time_range_service", "init_helpers", "dayjs", "extend", "utc", "constructor", "time", "stat", "localAlignedTime", "alignUTCDateToLocal", "resourceIds", "startDate", "endDate", "timeRange", "activeSources", "selectedSourceIds", "groupBy", "sourceIds", "length", "num", "sourceIdsSet", "Set", "previousPeriod", "prevRange", "previousPeriodMoment", "toDate", "dateRange", "forCurrentPeriod", "GMBDateRange", "format", "subtract", "ReviewDateRange", "onlyOffsetStartDate", "CUSTOM_TIME_RANGE_KEYS", "includes", "adIntelDateRange", "alignmentPeriod", "getAlignmentPeriodForRange", "buildFilter", "buildActiveSourcesFilter", "operatorFunction", "FieldFilterOperatorFunction", "ANY", "Array", "from", "PROPERTY_TYPE_INT64", "buildActualActiveSourcesFilter", "n", "NOT_EQUAL", "analyticsService", "timeRangeService", "filterService", "brandFiltersService", "reputationService", "locationsService", "brandsService", "resourceIds$", "currentLocation$", "pipe", "switchMap", "location", "isBrand", "path$", "path", "ResourceId", "groupId", "GroupResourceId", "groupPathNodes", "isAccountGroup", "of", "businessId", "BusinessResourceId", "accountGroupId", "brandsContext$", "combineLatest", "utcAlignedDateRange$", "filters$", "brandSources$", "selectedSourceIds$", "selectedTimeRangeKey$", "debounceTime", "activatedSources", "shareReplay", "refCount", "bufferSize", "insights$s", "Map", "fetchMetric", "buildBrandContext$", "buildGMBInsightsRequest", "insightsTotals$", "buildGMBInsightsTotalsRequest", "searchKeywords", "buildGMBSearchKeywordsRequest", "reviewContext$", "reviews$s", "buildReviewsRequest", "buildAlltimeReviewsRequest", "responseTimes$s", "buildResponseTimeRequest", "buildAllTimeResponseTimeRequest", "reviewCounts$", "brandsContext", "queryMetrics", "QueryMetricsRequest", "partnerId", "metricName", "GroupBy", "groupByOperator", "GroupByOperator", "OPERATOR_GROUP_BY", "accountGroupGeography$", "buildAccountGroupGeographyRequest", "startWith", "accountGroupTaxonomies$", "buildAccountGroupTaxonomyRequest", "accountGroup$", "buildAccountGroupRequest", "listingScore$", "buildListingScoreRequest", "latestListingScore$", "buildLatestListingScoreRequest", "listingQuality$", "buildListingQualityRequest", "listingMatchQuality$", "buildListingMatchQualityRequest", "GroupByDimension", "listingMatchQualityTotals$", "listingCounts$", "fetchUnboundedMetric", "buildListingCountRequest", "listingAccuracyCountsByLocation$", "buildBusinessDataListingCountRequest", "listingAccuracyCountsBySource$", "listingAccuracyTotals$", "adIntelStats$", "buildAdIntelStatsRequest", "gmbConnections$", "buildGMBLocationsRequest", "socialConnections$", "buildSocialRequest", "facebookConnections$", "reviewsRequestContext$", "reviewRequests", "buildReviewRequestsRequest", "repReviewRequest$", "buildRepReviewRequestsRequest", "requestBuilder", "limit", "current", "req", "prev", "QueryMetricsResponseDelta", "dim", "OPERATOR_CUBE", "alignment", "Alignment", "ALIGN_DELTA", "AlignmentPeriod", "calendar", "AlignmentPeriodCalendar", "CALENDAR_YEAR", "_", "AVG", "SUM", "excludeCombination", "GroupByExcludeCombination", "dimensions", "MAX", "limitDimension", "order", "Order", "ORDER_DESC", "moment", "date", "CALENDAR_MONTH", "brandContext", "OPERATOR_ROLLUP", "curPeriod", "ALIGN_EXACT", "Date", "groupByAccount", "fbPageOnly", "push", "CompositeFilter", "fieldMask", "fieldMaskObj", "reduce", "o", "f", "\u0275\u0275inject", "AnalyticsApiService", "TimeRangeService", "FilterService", "BrandFilterContainerService", "ReputationService", "LocationsService", "BrandsService", "factory", "\u0275fac", "providedIn", "capitalizeFirstLetters", "a", "split", "map", "c", "charAt", "toUpperCase", "slice", "toLowerCase", "join", "TaxonomyOptionWithCount", "GeoWithCount", "Country", "CountryDetails", "AccountGroupMetricService", "init_account_group_service", "__esmMin", "init_esm", "init_operators", "init_helpers", "constructor", "taxonomyOption", "numLocations", "countryCode", "country", "state", "stateCode", "city", "countryName", "stateCodeToName", "stateName", "val", "get", "countryCodeToCountry", "queryService", "httpClient", "locationsService", "taxonomyService", "filteredAccountGroupIdsForPath$", "getAccountGroupIds$", "filteredLocationsForPath$", "combineLatest", "currentAccountGroups$", "pipe", "locations", "filteredAgids", "filtered", "Object", "keys", "k", "forEach", "ag", "has", "accountGroupId", "shareReplay", "refCount", "bufferSize", "allTaxonomyOptions$", "getTaxonomyIds", "brandTaxonomyRows$", "accountGroupTaxonomies$", "r", "rowify", "metricResults", "brandTaxonomyOptions$", "allTax", "brandRows", "allTaxMap", "Map", "tax", "set", "id", "brandTaxMap", "row", "Array", "from", "Set", "values", "taxId", "existing", "measures", "accountGroup$", "filter", "s", "add", "getGeographicBreakdown$", "rows$", "accountGroupGeography$", "countyInfo$", "switchMap", "i", "of", "countries", "getCountryAndStateInformation", "rows", "countryInfo", "dataRow", "Number", "forkJoin", "subKeys", "String", "subNames", "states", "key", "m", "\u0275\u0275inject", "QueryService", "HttpClient", "LocationsService", "TaxonomyService", "factory", "\u0275fac", "providedIn", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275listener", "data_r3", "\u0275\u0275restoreView", "_r2", "$implicit", "ctx_r3", "\u0275\u0275nextContext", "\u0275\u0275resetView", "removeLocation", "id", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "name", "\u0275\u0275pipeBind2", "\u0275\u0275pureFunction1", "_c1", "locationCount", "\u0275\u0275repeaterCreate", "BrandGeographyDialogComponent_Conditional_8_For_6_Template", "\u0275\u0275repeaterTrackByIdentity", "\u0275\u0275pipeBind1", "\u0275\u0275repeater", "selectedCountries", "data_r6", "_r5", "BrandGeographyDialogComponent_Conditional_9_For_6_Template", "selectedStateProvinces", "data_r8", "_r7", "BrandGeographyDialogComponent_Conditional_10_For_6_Template", "selectedCities", "\u0275\u0275property", "option_r9", "BrandGeographyDialogComponent_For_18_For_3_Template", "group_r10", "options", "BrandGeographyDialogComponent", "init_brand_geography_dialog_component", "__esmMin", "init_forms", "init_dialog", "init_operators", "init_brand_filter_container_service", "constructor", "dialogRef", "data", "locationControl", "UntypedFormControl", "selectedOptions", "ngOnInit", "updateSelectedInformation", "filteredLocations$", "valueChanges", "pipe", "startWith", "map", "value", "filterLocationGroup", "availableLocations", "group", "filterLocations", "filter", "length", "locations", "filterValue", "toString", "toLowerCase", "location", "indexOf", "some", "r", "parent", "includes", "addLocationOpt", "event", "take", "groups", "option", "sameParents", "i", "subscribe", "addLocation", "locationType", "locationName", "locationValue", "trim", "setValue", "COUNTRIES_LABEL", "countryObject", "locationGroup", "country", "push", "STATEPROV_LABEL", "stateprovObject", "CITIES_LABEL", "cityObject", "statProv", "city", "stateProv", "close", "newData", "\u0275\u0275directiveInject", "MatDialogRef", "MAT_DIALOG_DATA", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275template", "BrandGeographyDialogComponent_Conditional_8_Template", "BrandGeographyDialogComponent_Conditional_9_Template", "BrandGeographyDialogComponent_Conditional_10_Template", "\u0275\u0275element", "$event", "i0", "_r1", "BrandGeographyDialogComponent_For_18_Template", "\u0275\u0275pureFunction2", "_c0", "filterSettings", "textColor", "backgroundColor", "\u0275\u0275conditional", "auto_r11", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275property", "option_r2", "name", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "GroupWithDisplayName", "BrandGroupDialogComponent", "init_brand_group_dialog_component", "__esmMin", "init_dialog", "init_forms", "init_esm", "init_operators", "constructor", "group", "dialogRef", "data", "brandsService", "groupControl", "UntypedFormControl", "selectedGroup", "options$", "allGroups$", "pipe", "map", "groups", "paths", "Map", "forEach", "g", "set", "pathNodes", "join", "buildGroupName", "sort", "a", "b", "localeCompare", "groupsByPath", "parent", "get", "slice", "ngOnInit", "filteredOptions$", "combineLatest", "valueChanges", "startWith", "value", "options", "_filter", "filterValue", "toLowerCase", "filter", "option", "includes", "close", "newData", "setGroupOpt", "event", "take", "subscribe", "setGroup", "id", "\u0275\u0275directiveInject", "MatDialogRef", "MAT_DIALOG_DATA", "BrandsService", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275element", "\u0275\u0275listener", "$event", "i0", "\u0275\u0275restoreView", "_r1", "\u0275\u0275resetView", "\u0275\u0275repeaterCreate", "BrandGroupDialogComponent_For_10_Template", "\u0275\u0275repeaterTrackByIdentity", "\u0275\u0275pureFunction2", "_c0", "filterSettings", "textColor", "backgroundColor", "\u0275\u0275pipeBind1", "auto_r3", "\u0275\u0275repeater", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "\u0275\u0275listener", "option_r2", "\u0275\u0275restoreView", "_r1", "$implicit", "optionEl_r3", "\u0275\u0275reference", "ctx_r3", "\u0275\u0275nextContext", "\u0275\u0275resetView", "selectFilterLocation", "accountGroupId", "\u0275\u0275textInterpolate", "name", "address", "\u0275\u0275template", "BrandLocationDialogComponent_Conditional_9_Conditional_0_Template", "BrandLocationDialogComponent_Conditional_9_div_1_Template", "\u0275\u0275conditional", "noResultsFound", "accountGroupFilterControl", "value", "trim", "\u0275\u0275property", "ctx", "\u0275\u0275textInterpolate2", "options_r5", "length", "item_r7", "_r6", "removeLocation", "BrandLocationDialogComponent_Conditional_12_Conditional_4_Template", "BrandLocationDialogComponent_Conditional_12_Conditional_6_Template", "\u0275\u0275repeaterCreate", "BrandLocationDialogComponent_Conditional_12_For_8_Template", "\u0275\u0275repeaterTrackByIdentity", "\u0275\u0275repeater", "BrandLocationDialogComponent", "init_brand_location_dialog_component", "__esmMin", "init_forms", "init_dialog", "init_esm", "init_operators", "init_account_group", "constructor", "dialogRef", "brandFiltersService", "data", "locationsService", "UntypedFormControl", "selectedOptions$$", "BehaviorSubject", "selectedOptions$", "asObservable", "ngOnInit", "next", "getAccountGroupIds", "options$", "currentAccountGroups$", "pipe", "map", "locationMap", "setValue", "Object", "keys", "accountGroup", "companyName", "getLocation", "sort", "a", "b", "localeCompare", "filteredOptions$", "combineLatest", "valueChanges", "debounceTime", "options", "selectedOptions", "_filter", "tap", "selectedOptionsDetails$", "selected", "filter", "o", "indexOf", "option", "filterValue", "toUpperCase", "includes", "remove", "currentSelected", "getValue", "push", "close", "newData", "selectedAccountGroupIds", "\u0275\u0275directiveInject", "MatDialogRef", "BrandFilterContainerService", "MAT_DIALOG_DATA", "LocationsService", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "\u0275\u0275element", "BrandLocationDialogComponent_Conditional_9_Template", "BrandLocationDialogComponent_Conditional_12_Template", "\u0275\u0275pureFunction2", "_c0", "filterSettings", "textColor", "backgroundColor", "\u0275\u0275propertyInterpolate", "tmp_4_0", "tmp_5_0", "BrandSourceDialogComponent", "init_brand_source_dialog_component", "__esmMin", "init_dialog", "init_forms", "constructor", "brandService", "dialogRef", "brandFiltersService", "data", "formControl", "UntypedFormControl", "ngOnInit", "setValue", "selectedSourceIds", "options$", "sourceOptions$", "close", "newData", "value", "\u0275\u0275directiveInject", "BrandsService", "MatDialogRef", "BrandFilterContainerService", "MAT_DIALOG_DATA", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275element", "\u0275\u0275listener", "\u0275\u0275property", "\u0275\u0275pureFunction2", "_c0", "filterSettings", "textColor", "backgroundColor", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "BrandTaxonomyDialogComponent", "init_brand_taxonomy_dialog_component", "__esmMin", "init_dialog", "init_forms", "init_esm", "init_operators", "constructor", "accountGroupService", "translateService", "dialogRef", "data", "taxonomyFormControl", "UntypedFormControl", "ngOnInit", "selectedTaxonomyIds", "selectedTaxonomies", "map", "taxOpts", "id", "setValue", "taxonomyOptions$", "combineLatest", "brandTaxonomyOptions$", "stream", "pipe", "brandTaxMap", "taxonomyTranslations", "locationsTemplate", "instant", "count", "Array", "from", "fullTaxId", "taxWithCount", "taxName", "split", "taxId", "Object", "prototype", "hasOwnProperty", "call", "join", "numLocations", "replace", "value", "name", "sort", "a", "b", "localeCompare", "close", "newData", "take", "taxOptions", "get", "taxonomyOption", "subscribe", "\u0275\u0275directiveInject", "AccountGroupMetricService", "TranslateService", "MatDialogRef", "MAT_DIALOG_DATA", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275element", "\u0275\u0275listener", "\u0275\u0275property", "\u0275\u0275pureFunction2", "_c0", "filterSettings", "textColor", "backgroundColor", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r2", "ctx_r2", "\u0275\u0275nextContext", "\u0275\u0275resetView", "openSourceDialog", "\u0275\u0275template", "BrandFilterContainerComponent_Conditional_38_Conditional_4_Template", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "\u0275\u0275conditional", "sourceFilter$", "_r4", "clearAllFilters", "BrandFilterContainerComponent", "init_brand_filter_container_component", "__esmMin", "init_core", "init_rxjs_interop", "init_vendasta_multi_location_analytics", "init_esm", "init_operators", "init_mobile", "init_sidepanel_service", "init_brand_filter_container_service", "init_brand_geography_dialog_component", "init_brand_group_dialog_component", "init_brand_location_dialog_component", "init_brand_source_dialog_component", "init_brand_taxonomy_dialog_component", "constructor", "dialog", "accountGroupMetricService", "filterService", "timeRangeService", "brandsService", "sidepanelService", "brandFiltersService", "languageService", "addressService", "destroyRef", "filterItems", "filterSettings", "textColor", "backgroundColor", "selectedCountries", "selectedStateProvinces", "selectedCities", "selectedTaxonomies", "sidenavOpened$", "visible$", "displaySourceFilter", "input", "ngOnInit", "openDialog$", "pipe", "takeUntilDestroyed", "subscribe", "next", "openLocationDialog", "addOrUpdateFilterItem", "locationFilterDisplay$", "selectedAccountGroupIds$", "calculateFilters", "sourceFilterDisplay$", "geographicBreakdown$", "getGeographicBreakdown$", "combineLatest", "currentLocale$", "switchMap", "currentLocale", "geographicBreakdown", "countryCodes", "reduce", "codes", "location", "countryCode", "indexOf", "push", "map", "code", "getCountryConfiguration", "countryConfigs", "options", "country", "withLatestFrom", "countryOptions", "clearAvailableLocations", "forEach", "state", "availableLocations", "id", "name", "parent", "locationCount", "numLocations", "city", "zones", "find", "zone", "stateCode", "sort", "sortName", "filterBarOffset$", "mode$", "size$", "observeOn", "asyncScheduler", "mode", "size", "visible", "Mode", "SIDE", "isMobile", "Size", "SMALL", "SizePixels", "REGULAR", "LARGE", "dateText$", "dateFilterDisplay$", "dateRange$", "type", "start", "end", "locale", "toLocaleDateString", "filterQuantity$", "filtersQuantity$", "groupFilter$", "subgroup$", "r", "locationFilter$", "length", "filteredSources$", "geographyFilter$", "concat", "busCategoryFilter$", "COUNTRIES_LABEL", "STATEPROV_LABEL", "CITIES_LABEL", "a", "b", "localeCompare", "filterId", "filterTypeTranslateKey", "value", "value$", "foundFilter", "filter", "item", "displayName", "findIndex", "el", "displayName$", "removeFilterItem", "clearAccountGroupIds", "clearSourceIds", "clearPath", "selectedGroup", "setSubgroup", "selectFilterItem", "openGeographyDialog", "openGroupDialog", "openTaxonomyDialog", "calculateGeographyFilter", "displayValue", "calculateGroupFilter", "calculateTaxonomyFilter", "taxOpt", "split", "pop", "join", "calculatePartnerColor", "theme", "primaryColor", "selectedColor", "open", "BrandGeographyDialogComponent", "data", "afterClosed", "results", "BrandGroupDialogComponent", "group", "pathNodes", "setPath", "BrandTaxonomyDialogComponent", "BrandLocationDialogComponent", "panelClass", "setAccountGroupIds", "selectedAccountGroupIds", "BrandSourceDialogComponent", "selectedSourceIds", "getSourceIds", "setSourceIds", "calculateGeographyFilters", "filterObject", "Filter", "compositeFilter", "op", "CompositeFilterOperator", "OR", "filters", "dimension", "fieldFilter", "operator", "FieldFilterOperator", "EQUAL", "valueType", "PropertyType", "PROPERTY_TYPE_STRING", "calculateTaxonomyFilters", "OVERLAP", "calculateLocationFilters", "getAccountGroupIds", "operatorFunction", "FieldFilterOperatorFunction", "ANY", "geoFilter", "taxonomyFilter", "locationFilter", "setFilters", "x", "\u0275\u0275directiveInject", "MatDialog", "AccountGroupMetricService", "FilterService", "TimeRangeService", "BrandsService", "SidepanelService", "BrandFilterContainerService", "LanguageService", "AddressAPIService", "DestroyRef", "selectors", "inputs", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "i0", "_r1", "BrandFilterContainerComponent_Conditional_18_Template", "BrandFilterContainerComponent_Conditional_24_Template", "BrandFilterContainerComponent_Conditional_30_Template", "BrandFilterContainerComponent_Conditional_36_Template", "BrandFilterContainerComponent_Conditional_38_Template", "BrandFilterContainerComponent_Conditional_39_Template", "\u0275\u0275property", "\u0275\u0275pureFunction2", "_c0", "shouldHaveShadow$", "\u0275\u0275pureFunction1", "_c1", "filterSelection_r5"]
}