{ "version": 3, "sources": ["libs/integrated-search/filters/shared/utils/src/consts/is-filters-token.const.ts", "libs/integrated-search/universe/shared/utils/src/enums/is-universe.enum.ts", "libs/integrated-search/universe/shared/utils/src/enums/is-universe-entity-source.enum.ts", "libs/integrated-search/universe/shared/utils/src/enums/is-universe-entity-category-option.enum.ts", "libs/integrated-search/universe/shared/utils/src/enums/is-universe-add-category-action.enum.ts", "libs/integrated-search/universe/shared/utils/src/helpers/is-search-terms-sources.helper.ts", "libs/integrated-search/universe/shared/utils/src/helpers/is-search-terms-rows.helper.ts", "libs/integrated-search/universe/shared/utils/src/consts/is-universe-resource-path.const.ts", "libs/integrated-search/universe/shared/utils/src/consts/is-entity-source-labels.const.ts", "libs/integrated-search/universe/shared/utils/src/consts/is-universe-keys.const.ts", "libs/integrated-search/universe/shared/utils/src/consts/is-universe-tooltip-dictionary.const.ts", "libs/integrated-search/universe/shared/utils/src/helpers/is-search-terms-export.helper.ts", "libs/integrated-search/universe/shared/utils/src/helpers/is-universe-settings-categories.helper.ts", "libs/integrated-search/universe/shared/utils/src/helpers/is-universe-search-term-import-workbook-parser.helper.ts", "libs/integrated-search/universe/shared/utils/src/helpers/is-universe-search-term-import-validator.helper.ts", "libs/integrated-search/universe/shared/utils/src/helpers/is-universe-delete-search-terms-confirmation-text.helper.ts", "libs/integrated-search/universe/shared/utils/src/helpers/is-universe-search-term-import.helper.ts", "libs/integrated-search/filters/shared/utils/src/consts/is-filters-provider.const.ts", "libs/integrated-search/filters/shared/utils/src/helpers/is-filters.helper.abstract.ts", "libs/integrated-search/filters/shared/utils/src/enums/is-predefined-filters.enum.ts", "libs/integrated-search/filters/shared/utils/src/enums/is-filters-section.enum.ts", "libs/integrated-search/filters/shared/utils/src/helpers/is-filters-options.helper.ts", "libs/integrated-search/filters/shared/utils/src/consts/is-predefined-filters-keys.const.ts", "libs/integrated-search/filters/shared/utils/src/helpers/is-filters.helper.ts", "libs/integrated-search/filters/shared/utils/src/helpers/is-numeric-filters.helper.ts", "libs/integrated-search/filters/shared/utils/src/helpers/is-filters-initial-state.helper.ts", "libs/integrated-search/filters/shared/utils/src/helpers/is-applied-filters.helper.ts", "libs/integrated-search/filters/shared/utils/src/helpers/is-dynamic-filters.helper.ts", "libs/integrated-search/filters/shared/utils/src/helpers/is-filters-order.helper.ts"], "sourcesContent": ["import { InjectionToken } from '@angular/core';\n\nimport { ISFiltersKey, ISFiltersPath } from '../models';\n\nexport const IS_FILTERS_PATH: InjectionToken = new InjectionToken('ISFiltersPath');\nexport const IS_FILTERS_KEY: InjectionToken = new InjectionToken('ISFiltersKey');\n", "export enum ISUniverseEnum {\n SEARCH_TERMS = 'st-kw',\n URLS = 'lpu',\n}\n", "export enum ISUniverseEntitySourceEnum {\n GOOGLE_ADS = 'ga',\n GOOGLE_SEARCH_CONSOLE = 'gsc',\n ADDED_MANUALLY = 'ma',\n}\n\nexport enum ISUniverseEntitySourceLabelEnum {\n GOOGLE_ADS = 'Google Ads',\n GOOGLE_SEARCH_CONSOLE = 'Google Search Console',\n ADDED_MANUALLY = 'Manually added',\n}\n", "export enum ISUniverseEntityCategoryOptionEnum {\n NOT_ASSIGNED = 'Not assigned',\n KEEP_CURRENT = 'Keep current',\n}\n", "export enum ISUniverseAddCategoryActionEnum {\n CREATE = 'Create',\n MERGE = 'Merge',\n USE_EXISTING = 'Use existing',\n DISCARD = 'Discard',\n}\n", "import { ISUniverseEntitySourceEnum } from '../enums';\nimport { ISSearchTermWithKeywords } from '../models';\n\nexport class ISUniverseSearchTermSourcesHelper {\n static getSources(searchTerm: ISSearchTermWithKeywords): string[] {\n return searchTerm.keywords?.map((keyword) => keyword.source);\n }\n\n static isManuallyAdded(searchTerm: ISSearchTermWithKeywords): boolean {\n return this.getSources(searchTerm)?.includes(ISUniverseEntitySourceEnum.ADDED_MANUALLY);\n }\n}\n", "import { ISFlatSearchTerm, ISSearchTermRow, ISSearchTermWithKeywords } from '../models';\n\nexport class ISSearchTermsRowsHelper {\n static flattenSearchTerm(searchTerm: ISSearchTermWithKeywords): ISFlatSearchTerm[] {\n return searchTerm.keywords.map((keyword) => ({\n search_term: searchTerm.search_term,\n keyword: keyword.keyword,\n match_type: keyword.match_type,\n campaign: keyword.campaign,\n ad_group: keyword.ad_group,\n countries: keyword.countries ?? [],\n source: [keyword.source],\n categories: searchTerm.categories,\n is_active: keyword.is_active,\n }));\n }\n\n static mapSearchTermRows(searchTerms: ISSearchTermWithKeywords[]): ISSearchTermRow[] {\n return searchTerms\n .flatMap((searchTerm: ISSearchTermWithKeywords) => {\n const rows: ISFlatSearchTerm[] = this.flattenSearchTerm(searchTerm);\n return [\n {\n ...searchTerm,\n isMaster: true,\n },\n ...rows.filter((row) => row.keyword),\n ];\n })\n .map((row, index) => ({ ...row, rowId: index }));\n }\n}\n", "import { InjectionToken } from '@angular/core';\n\nimport { ISUniverseEnum } from '../enums';\n\nexport const IS_UNIVERSE_RESOURCE_PATH = new InjectionToken('UniverseResourcePath');\n", "import { ISUniverseEntitySourceEnum, ISUniverseEntitySourceLabelEnum } from '../enums';\n\nexport const IS_ENTITY_SOURCE_LABELS: { [key: string]: string } = {\n [ISUniverseEntitySourceEnum.GOOGLE_ADS]: ISUniverseEntitySourceLabelEnum.GOOGLE_ADS,\n [ISUniverseEntitySourceEnum.GOOGLE_SEARCH_CONSOLE]: ISUniverseEntitySourceLabelEnum.GOOGLE_SEARCH_CONSOLE,\n [ISUniverseEntitySourceEnum.ADDED_MANUALLY]: ISUniverseEntitySourceLabelEnum.ADDED_MANUALLY,\n};\n", "import { ISUniverseEnum } from '../enums';\nimport { ISUniverseEntityKey, ISUniverseFiltersKey, ISUniverseListKey } from '../models/is-universe-entity-key.model';\n\nexport const IS_UNIVERSE_ENTITY_KEY: { [key in ISUniverseEnum]: ISUniverseEntityKey[key] } = {\n [ISUniverseEnum.SEARCH_TERMS]: 'search_term',\n [ISUniverseEnum.URLS]: 'url',\n};\n\nexport const IS_UNIVERSE_LIST_KEY: { [key in ISUniverseEnum]: ISUniverseListKey[key] } = {\n [ISUniverseEnum.SEARCH_TERMS]: 'search_terms',\n [ISUniverseEnum.URLS]: 'urls',\n};\n\nexport const IS_UNIVERSE_FILTERS_KEY: { [key in ISUniverseEnum]: ISUniverseFiltersKey } = {\n [ISUniverseEnum.SEARCH_TERMS]: 'searchTerms',\n [ISUniverseEnum.URLS]: 'landingPages',\n};\n", "import { ISUniverseEnum } from '../enums';\nimport { ISUniverseTooltipDictionary } from '../models';\n\nexport const IS_TACTICS_TOOLTIP_DICTIONARY: ISUniverseTooltipDictionary = {\n [ISUniverseEnum.SEARCH_TERMS]: {\n timeFilter:\n 'By applying time filter, you’ll see only those search terms that existed in selected time range. This affects results in table.',\n },\n [ISUniverseEnum.URLS]: {\n timeFilter:\n 'By applying time filter, you’ll see only those landing pages that existed in selected time range. This affects results in table.',\n },\n};\n", "import { IS_KEYWORD_STATUS_LABELS, ISAssignedCategory, ISKeywordStatusEnum } from '@ess/integrated-search/shared/utils';\nimport { essSortObjectsByProp } from '@ess/shared/utils/helpers';\n\nimport { ISSearchTermsRowsHelper } from './is-search-terms-rows.helper';\n\nimport { IS_ENTITY_SOURCE_LABELS } from '../consts';\nimport { ISFlatSearchTerm, ISSearchTermWithKeywords } from '../models';\n\nexport class ISSearchTermsExportHelper {\n static reduceSearchTermsToRowArray(\n selected: ISSearchTermWithKeywords[],\n headers: string[],\n ): (string | number | undefined)[][] {\n return essSortObjectsByProp(selected, 'search_term')\n .flatMap((entity: ISSearchTermWithKeywords) =>\n ISSearchTermsRowsHelper.flattenSearchTerm(entity),\n )\n .reduce((acc: (string | number | undefined)[][], entity: ISFlatSearchTerm) => {\n const entityArray: (string | number | undefined)[] = [];\n // TODO refactor once data model is defined on backend\n headers.forEach((header) => {\n switch (header) {\n case 'Search Term':\n entityArray.push(entity.search_term);\n break;\n case 'Keyword':\n entityArray.push(entity.keyword);\n break;\n case 'Match Type':\n entityArray.push(entity.match_type);\n break;\n case 'Keyword status':\n entityArray.push(\n entity.is_active\n ? IS_KEYWORD_STATUS_LABELS[ISKeywordStatusEnum.ACTIVE]\n : entity.is_active === false\n ? IS_KEYWORD_STATUS_LABELS[ISKeywordStatusEnum.PAUSED]\n : '',\n );\n break;\n case 'Campaign':\n entityArray.push(entity.campaign?.campaign_name);\n break;\n case 'Campaign ID':\n entityArray.push(entity.campaign?.campaign_id);\n break;\n case 'Ad Group':\n entityArray.push(entity.ad_group?.ad_group_name);\n break;\n case 'Ad Group ID':\n entityArray.push(entity.ad_group?.ad_group_id);\n break;\n case 'Country':\n entityArray.push(entity.countries?.join(', ').toUpperCase());\n break;\n case 'Source':\n entityArray.push(entity.source.map((source) => IS_ENTITY_SOURCE_LABELS[source]).join(', '));\n break;\n default:\n entityArray.push(\n entity.categories.find(\n (category: ISAssignedCategory) => category.title.toLowerCase() === header.toLowerCase(),\n )?.values[0].value || '',\n );\n }\n });\n\n acc.push(entityArray);\n\n return acc;\n }, []);\n }\n}\n", "import { FormControl } from '@angular/forms';\n\nimport { ISCategoryDetails, ISCategoryValue } from '@ess/integrated-search/shared/utils';\nimport { SharedFormOption } from '@ess/shared/utils/models';\n\nimport { ISUniverseEntityCategoryOptionEnum } from '../enums';\nimport {\n ISUniverseEntitySettingsCategories,\n ISUniverseSettingsCategoriesForm,\n ISUniverseSettingsCategoriesFormData,\n ISUniverseSettingsCategoryControl,\n ISUniverseSettingsCategoryValue,\n} from '../models';\n\nexport class ISUniverseSettingsCategoriesHelper {\n private static readonly __keepCurrentOption: SharedFormOption = {\n name: ISUniverseEntityCategoryOptionEnum.KEEP_CURRENT,\n value: ISUniverseEntityCategoryOptionEnum.KEEP_CURRENT,\n };\n\n static getCategoryOptions(category: ISCategoryDetails): SharedFormOption[] {\n return category.values.map((value: ISCategoryValue) => ({ name: value.value, value: value.category_value_id! }));\n }\n\n static updateCategoryOptions(\n controls: ISUniverseSettingsCategoryControl[],\n formData: ISUniverseSettingsCategoriesFormData,\n ): void {\n controls.forEach((control: ISUniverseSettingsCategoryControl) => {\n const hasKeepCurrent = control.options.some((o) => o.value === ISUniverseEntityCategoryOptionEnum.KEEP_CURRENT);\n const isValueMixed = formData[control.category_id] === ISUniverseEntityCategoryOptionEnum.KEEP_CURRENT;\n if (isValueMixed) {\n !hasKeepCurrent && control.options.unshift({ ...this.__keepCurrentOption });\n } else {\n hasKeepCurrent && control.options.shift();\n }\n });\n }\n\n static getCategoriesControls(categories: ISCategoryDetails[]): ISUniverseSettingsCategoriesForm {\n return categories.reduce(\n (obj, item) => ({ ...obj, [item.category_id]: new FormControl(null) }),\n {},\n );\n }\n\n static getCategoriesValuesIds(\n formData: ISUniverseSettingsCategoriesFormData,\n entity: ISUniverseEntitySettingsCategories,\n ): number[] {\n return Object.entries(formData).reduce((arr: number[], [key, value]) => {\n return [\n ...arr,\n ...(value === null\n ? []\n : value === ISUniverseEntityCategoryOptionEnum.KEEP_CURRENT\n ? this.__getCurrentCategoryValue(entity, +key)\n : [value]),\n ];\n }, []);\n }\n\n static getCategoryFormValue(entities: ISUniverseEntitySettingsCategories[]): ISUniverseSettingsCategoriesFormData {\n return entities.length > 1\n ? this.__getMultipleEntitiesCategoriesValue(entities)\n : this.__getSingleEntityCategoriesValue(entities[0]);\n }\n\n private static __getCurrentCategoryValue(entity: ISUniverseEntitySettingsCategories, category_id: number): number[] {\n const value: number | null =\n entity.categories.find((c) => c.category_id === category_id)?.values[0].category_value_id ?? null;\n return value ? [value] : [];\n }\n\n private static __getSingleEntityCategoriesValue(\n entity: ISUniverseEntitySettingsCategories,\n ): ISUniverseSettingsCategoriesFormData {\n return entity.categories.reduce(\n (obj, item) => ({ ...obj, [item.category_id]: item.values[0].category_value_id ?? null }),\n {},\n );\n }\n\n private static __getMultipleEntitiesCategoriesValue(\n entities: ISUniverseEntitySettingsCategories[],\n ): ISUniverseSettingsCategoriesFormData {\n const entitiesToReduce: ISUniverseEntitySettingsCategories[] = [...entities];\n const startEntity: ISUniverseEntitySettingsCategories = entitiesToReduce.shift()!;\n return entitiesToReduce.reduce((obj: ISUniverseSettingsCategoriesFormData, item) => {\n const currentValues: ISUniverseSettingsCategoriesFormData = this.__getSingleEntityCategoriesValue(item);\n const valueKeys: string[] = Array.from(new Set([...Object.keys(obj), ...Object.keys(currentValues)]));\n\n return {\n ...valueKeys.reduce(\n (out, key) => ({\n ...out,\n [+key]: currentValues[+key] === obj[+key] ? obj[+key] : ISUniverseEntityCategoryOptionEnum.KEEP_CURRENT,\n }),\n {},\n ),\n };\n }, this.__getSingleEntityCategoriesValue(startEntity));\n }\n}\n", "import { read, utils, writeFile } from 'xlsx';\n\nexport class ISUniverseSearchTermImportWorkbookHelper {\n static parseWorkbookToArray = async (file: File, onlyHeaders = false): Promise => {\n const workbook = read(await file.arrayBuffer(), { ...(onlyHeaders && { sheetRows: 1 }) });\n const sheet = workbook.Sheets[workbook.SheetNames[0]];\n const data = utils.sheet_to_json(sheet, { header: 1 });\n\n return data;\n };\n\n static parseJsonToCsv(data: { [key: string]: string }[]): void {\n const headers = ['Search term', 'Error (remove this column before uploading again)'];\n const worksheet = utils.json_to_sheet(data);\n utils.sheet_add_aoa(worksheet, [headers], { origin: 'A1' });\n\n const workbook = utils.book_new();\n utils.book_append_sheet(workbook, worksheet, `Errors`);\n\n writeFile(workbook, `search_terms_errors.csv`);\n }\n}\n", "import { AbstractControl, AsyncValidatorFn, ValidationErrors } from '@angular/forms';\n\nimport { ISUniverseSearchTermImportWorkbookHelper } from './is-universe-search-term-import-workbook-parser.helper';\n\ntype CategoryColumn = { title: string; index: number };\n\nexport class ISUniverseSearchTermImportValidatorHelper {\n private static __searchTermColumnNames = ['search term', 'search terms', 'search term name'];\n\n static fileFormatValidator(\n parseCategoriesToForm: (categoriesMap: Map) => void,\n setEntitiesCount: (number: number) => void,\n ): AsyncValidatorFn {\n return async (control: AbstractControl): Promise =>\n Promise.resolve(control.value).then(async (value) => {\n if (!value) {\n return null;\n }\n\n const [headers, ...entities] = await ISUniverseSearchTermImportWorkbookHelper.parseWorkbookToArray(value);\n const errors: ValidationErrors = {};\n\n const entityColumns: string[] = [];\n const categoriesColumns: CategoryColumn[] = [];\n [...headers].forEach((title, index) => {\n const lowercaseTitle = title?.toLowerCase().trim();\n\n this.__searchTermColumnNames.includes(lowercaseTitle)\n ? entityColumns.push(lowercaseTitle)\n : categoriesColumns.push({ title: lowercaseTitle || '', index: +index });\n });\n\n this.__checkRequiredColumns([entityColumns], errors);\n this.__checkDuplicatedEntityColumn(entityColumns, errors);\n this.__checkCategoriesLength(categoriesColumns, errors);\n this.__checkCategoriesTitles(categoriesColumns, errors);\n const categoriesMap: Map = this.__checkCategoriesValues(entities, categoriesColumns, errors);\n\n const valid = Object.keys(errors).length === 0;\n if (valid) {\n parseCategoriesToForm(categoriesMap);\n setEntitiesCount(entities.length);\n }\n\n return valid ? null : errors;\n });\n }\n\n private static __checkRequiredColumns(requiredColumns: string[][], errors: ValidationErrors): void {\n if (requiredColumns.some((subset) => subset.length < 1)) {\n errors['missingRequiredColumns'] =\n 'Required column(s) is missing in uploaded file.\\nSee example file or the rules below.';\n }\n }\n\n private static __checkDuplicatedEntityColumn(entityColumns: string[], errors: ValidationErrors): void {\n if (entityColumns.length > 1) {\n errors['duplicatedEntityColumn'] =\n `Search term column appears more than once with different names (${this.__searchTermColumnNames\n .map((n) => '\"' + n + '\"')\n .join(', ')}).\\nWe support only 1 search term column.`;\n }\n }\n\n private static __checkCategoriesLength(categories: CategoryColumn[], errors: ValidationErrors): void {\n if (categories.length > 25) {\n errors['categoriesMaxLength'] = 'Too many category columns. We support up to 25 categories per project.';\n }\n }\n\n private static __checkCategoriesTitles(categories: CategoryColumn[], errors: ValidationErrors): void {\n let invalidTitle = false;\n let duplicated = false;\n const categoriesSet: Set = new Set();\n for (let i = 0; i < categories.length && !(invalidTitle && duplicated); i++) {\n invalidTitle = invalidTitle || categories[i].title.length < 2 || categories[i].title.length > 50;\n categoriesSet.add(categories[i].title);\n duplicated = duplicated || categoriesSet.size < i + 1;\n }\n\n if (invalidTitle) {\n errors['invalidCategoryTitle'] = 'Some category names do not fit within the range of 2-50 characters.';\n }\n if (duplicated) {\n errors['duplicatedCategory'] = 'Some category names are repeated. Change them or keep only one.';\n }\n }\n\n private static __checkCategoriesValues(\n entities: string[][],\n categories: CategoryColumn[],\n errors: ValidationErrors,\n ): Map {\n const categoriesIndexMap: { [index: number]: string } = categories.reduce(\n (map, item) => ({ ...map, [item.index]: item.title }),\n {},\n );\n const valuesMap: { [index: number]: Set } = categories.reduce(\n (map, item) => ({ ...map, [item.index]: new Set() }),\n {},\n );\n let valueLengthError = false;\n let valuesListLengthError = false;\n\n entities.forEach((row) =>\n row.forEach((value, columnIndex) => {\n const category: string | null = categoriesIndexMap[columnIndex] ?? null;\n if (category !== null) {\n valuesMap[columnIndex].add(`${value}`.toLowerCase().trim());\n valueLengthError = valueLengthError || value.length > 60;\n valuesListLengthError = valuesMap[columnIndex].size > 50;\n }\n }),\n );\n\n if (valueLengthError) {\n errors['valueMaxLength'] = 'Names of some values do not fit within the range of 1 to 60 characters.';\n }\n\n if (valuesListLengthError) {\n errors['valuesListMaxLength'] =\n 'Too many values in some categories. We support up to 50 values per one category.';\n }\n\n return new Map(\n Object.keys(valuesMap).map((key) => [categoriesIndexMap[+key], Array.from(valuesMap[+key]).sort()]),\n );\n }\n}\n", "import { ISUniverseSearchTermSourcesHelper } from './is-search-terms-sources.helper';\n\nimport { ISSearchTermWithKeywords } from '../models';\n\nexport interface EntitySourceStats {\n manual: number;\n multiSource: number;\n other: number;\n}\n\nexport class ISUniverseDeleteSearchTermsConfirmationTextHelper {\n static readonly getSingleEntityConfirmation = (entity: ISSearchTermWithKeywords): string => {\n const sources = ISUniverseSearchTermSourcesHelper.getSources(entity);\n if (!ISUniverseSearchTermSourcesHelper.isManuallyAdded(entity)) {\n return '';\n }\n\n return sources.length === 1\n ? // eslint-disable-next-line max-len\n `Because this search term does not occur neither in Google Ads nor in Google Search Console, it will no longer be visible neither in search term universe nor in tactics of this project.\\n\\nYou can manually add this search term again later, but currently available performance data and the recommendations for this search term will be lost.`\n : // eslint-disable-next-line max-len\n `Manually added source will be removed.\\nAs this search term occurs in Google Ads and Google Search Console, it will be still visible in search term universe of this project and will be taken into consideration by the tactics if their conditions are met.`;\n };\n\n static readonly getMultipleEntitiesConfirmation = (multiple: boolean): string => {\n return `\n
\n

\"Manually added\" source will be removed from ${multiple ? 'selected search terms' : 'this search term'}.

\n
\n

Search terms that have never been added neither to Google Ads nor Google Search Control,\n will be removed from Integrated Search permanently. Their performance data and the recommendations will be lost.

\n
\n

Search terms that have ever been added either to Google Ads or Google Search Control, will be still visible\n in Integrated search universe of this project and will be taken into consideration by the tactics (depending on selected period in “Time” filter).

\n
\n `;\n };\n\n static readonly getEntitySourcesStats = (entities: ISSearchTermWithKeywords[]): EntitySourceStats => {\n return entities.reduce(\n (stats, entity) => {\n const sources = ISUniverseSearchTermSourcesHelper.getSources(entity);\n const hasAddedManually = ISUniverseSearchTermSourcesHelper.isManuallyAdded(entity);\n\n return !hasAddedManually\n ? {\n ...stats,\n other: stats.other + 1,\n }\n : sources.length === 1\n ? { ...stats, manual: stats.manual + 1 }\n : {\n ...stats,\n multiSource: stats.multiSource + 1,\n };\n },\n {\n manual: 0,\n multiSource: 0,\n other: 0,\n },\n );\n };\n}\n", "import { AbstractControl, FormArray, FormControl, FormGroup, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nimport { ISCategoryDetails, ISCategoryMatch, ISCategorySearchMatchResponse } from '@ess/integrated-search/shared/utils';\nimport { SharedFormOption } from '@ess/shared/utils/models';\n\nimport { ISUniverseAddCategoryActionEnum } from '../enums';\nimport {\n ISUniverseAddCategoriesArrayItem,\n ISUniverseAddCategoriesForm,\n ISUniverseAddCategory,\n ISUniverseAddCategoryExisting,\n ISUniverseAddCategoryForm,\n ISUniverseAddCategoryFormData,\n ISUniverseAddSearchTerm,\n ISUniverseAddSearchTermError,\n} from '../models';\n\nexport class ISUniverseSearchTermImportHelper {\n static parseCategoriesToForm(\n categoriesMap: Map,\n categoriesForm: FormGroup,\n ): void {\n const categoriesArray: FormArray = categoriesForm.controls.categories;\n categoriesArray.clear({ emitEvent: false });\n const controls: FormGroup[] = [];\n categoriesMap.forEach((values: string[], title: string) => controls.push(this.__getCategoryForm(title, values)));\n controls.sort((a, b) => (a.value!.title! >= b.value!.title! ? 1 : -1));\n controls.forEach((control) => categoriesArray.push(control, { emitEvent: false }));\n }\n\n static patchMatchesToForm(\n response: ISCategorySearchMatchResponse,\n categoriesArray: FormArray,\n projectId: number,\n ): void {\n response.categories.map((match: ISCategoryMatch) => {\n const control = categoriesArray.controls.find((c) => c.value.title === match.title);\n control && this.__patchCategoryControl(control, match, projectId);\n });\n }\n\n static getCategoriesForProjectCount(\n categoriesFormData: ISUniverseAddCategoryFormData[],\n categories: ISCategoryDetails[],\n ): [number, ISUniverseAddCategory[]] {\n const toAdd: ISUniverseAddCategory[] = [];\n let limit = categories.length;\n categoriesFormData.forEach((category) => {\n if (category.action && category.action !== ISUniverseAddCategoryActionEnum.DISCARD) {\n if (category.categoryId && category.action !== ISUniverseAddCategoryActionEnum.CREATE) {\n const existingInProject = categories.find((c) => c.category_id === category.categoryId) ?? null;\n const selectedExisting = category.existingCategories.find((c) => c.category_id === category.categoryId)!;\n if (existingInProject === null) {\n limit++;\n }\n const addCategoryPayload: ISUniverseAddCategory = {\n category_id: category.categoryId,\n title: category.title,\n new_values: category.action === ISUniverseAddCategoryActionEnum.MERGE ? selectedExisting.newValues : [],\n };\n toAdd.push(addCategoryPayload);\n } else {\n limit++;\n toAdd.push({\n category_id: null,\n title: category.title,\n new_values: category.values,\n });\n }\n }\n });\n return [limit, toAdd];\n }\n\n static parseArrayToEntities(data: string[][], categories: ISCategoryDetails[]): ISUniverseAddSearchTerm[] {\n const [headerRow, ...entityData] = data;\n const headers = headerRow.map((header) => header.toLowerCase().trim());\n\n const entityColumnIndex: number = headers.findIndex((h) =>\n ['search term', 'search terms', 'search term name'].includes(h),\n );\n const categoriesIndexMap: Map = headers.reduce>((map, header, index) => {\n if (index !== entityColumnIndex) {\n map.set(header, index);\n }\n return map;\n }, new Map());\n\n const categoriesValuesMap: Map> = categories.reduce((map, category) => {\n const index = categoriesIndexMap.get(category.title) ?? null;\n if (index !== null) {\n const valuesMap: Map = category.values.reduce((valueMap, value) => {\n valueMap.set(value.value, value.category_value_id!);\n return valueMap;\n }, new Map());\n map.set(index, valuesMap);\n }\n return map;\n }, new Map>());\n\n return entityData.reduce(\n (entities, row) => [\n ...entities,\n {\n search_term: row[entityColumnIndex] ?? '',\n category_value_ids: row.reduce((ids, value, index) => {\n const id: number | null = categoriesValuesMap.get(index)?.get(value?.toLowerCase().trim()) ?? null;\n id && ids.push(id);\n return ids;\n }, []),\n },\n ],\n [],\n );\n }\n\n static parseErrors(\n errors: ISUniverseAddSearchTermError[],\n categories: ISCategoryDetails[],\n ): {\n [key: string]: string;\n }[] {\n const categoriesValues = categories.map((category) => ({\n title: category.title,\n values: category.values.reduce((valueMap, value) => {\n valueMap.set(value.category_value_id!, value.value);\n return valueMap;\n }, new Map()),\n }));\n\n const data = errors.map(({ category_value_ids, ...error }) =>\n category_value_ids.reduce(\n (row, id) => {\n const category = categoriesValues.find((c) => c.values.has(id));\n return category\n ? {\n ...row,\n [category.title]: category.values.get(id),\n }\n : row;\n },\n { ...error },\n ),\n );\n\n return data;\n }\n\n private static __getCategoryForm(title: string, values: string[]): FormGroup {\n return new FormGroup(\n {\n categoryId: new FormControl(null),\n title: new FormControl(title, { nonNullable: true }),\n values: new FormControl(values, { nonNullable: true }),\n existingCategories: new FormControl([], { nonNullable: true }),\n options: new FormControl[]>([], { nonNullable: true }),\n action: new FormControl(null),\n info: new FormControl(null),\n },\n [this.__categoryFormValidator()],\n );\n }\n\n private static __categoryFormValidator = (): ValidatorFn => {\n return (control: AbstractControl): ValidationErrors | null => {\n const category = control.value;\n if (category && category.action === ISUniverseAddCategoryActionEnum.MERGE) {\n const existing = category.existingCategories.find((c: any) => c.category_id === category.categoryId);\n const sum = existing?.values?.concat(existing?.newValues ?? []) ?? [];\n if (sum.length > 50) {\n return {\n valuesLimit:\n 'This category cannot be merged with new values – it would exceed values limit for one category. Choose another category:',\n };\n }\n }\n return null;\n };\n };\n\n private static __patchCategoryControl(\n control: ISUniverseAddCategoriesArrayItem,\n match: ISCategoryMatch,\n projectId: number,\n ): void {\n const newValues: string[] = control.getRawValue().values;\n const existingCategories: ISUniverseAddCategoryExisting[] = match.existing_categories.map(\n ({ category_id, title, last_updated, description, values, assigned_projects, active }) => ({\n category_id,\n title,\n last_updated,\n description,\n active,\n values: values.map((v) => v.value),\n assigned_project_names: assigned_projects.map((p) => p.project_name),\n newValues: newValues.filter((newValue) => !values.some((v) => v.value === newValue)),\n }),\n );\n\n let actions: ISUniverseAddCategoryActionEnum[] = [ISUniverseAddCategoryActionEnum.DISCARD];\n let info: string | null = null;\n\n if (existingCategories.length > 0) {\n actions.unshift(ISUniverseAddCategoryActionEnum.USE_EXISTING);\n if (match.existing_categories[0].assigned_projects.some((p) => p.project_id === projectId)) {\n if (existingCategories[0].newValues.length) {\n info = 'Category with this name already exists in this client and this project.';\n if (existingCategories[0].newValues.length + existingCategories[0].values.length <= 50) {\n actions.unshift(ISUniverseAddCategoryActionEnum.MERGE);\n }\n } else {\n actions = [];\n info =\n 'This category with these values already exists in this client and this project. It will be updated with uploaded search terms.';\n }\n } else {\n actions.unshift(ISUniverseAddCategoryActionEnum.CREATE);\n info = 'Category with this name already exists in this client.';\n if (existingCategories.some((c) => c.newValues.length && c.newValues.length + c.values.length <= 50)) {\n actions.unshift(ISUniverseAddCategoryActionEnum.MERGE);\n }\n }\n } else {\n actions.unshift(ISUniverseAddCategoryActionEnum.CREATE);\n }\n\n const action: ISUniverseAddCategoryActionEnum | null = control.value.action ?? actions[0] ?? null;\n const categoryId: number | null = existingCategories[0]?.category_id ?? null;\n\n control.patchValue({\n categoryId,\n existingCategories,\n options: actions.map((a) => ({ name: a, value: a })),\n action,\n info,\n });\n }\n}\n", "import { ISTacticKey } from '@ess/integrated-search/shared/utils';\nimport { IS_TACTICS_KEYS, IS_TACTICS_RESOURCE_PATH, ISTacticsEnum } from '@ess/integrated-search/tactics/shared/utils';\nimport {\n IS_UNIVERSE_FILTERS_KEY,\n IS_UNIVERSE_RESOURCE_PATH,\n ISUniverseEnum,\n ISUniverseFiltersKey,\n} from '@ess/integrated-search/universe/shared/utils';\n\nimport { IS_FILTERS_KEY } from './is-filters-token.const';\n\nconst IS_TACTIC_FILTERS_PROPERTY_FACTORY = (resource: ISTacticsEnum): ISTacticKey => IS_TACTICS_KEYS[resource];\nconst IS_UNIVERSE_FILTERS_PROPERTY_FACTORY = (resource: ISUniverseEnum): ISUniverseFiltersKey =>\n IS_UNIVERSE_FILTERS_KEY[resource];\n\nexport const IS_UNIVERSE_FILTERS_PROVIDER = {\n provide: IS_FILTERS_KEY,\n useFactory: IS_UNIVERSE_FILTERS_PROPERTY_FACTORY,\n deps: [IS_UNIVERSE_RESOURCE_PATH],\n};\n\nexport const IS_TACTICS_FILTERS_PROVIDER = {\n provide: IS_FILTERS_KEY,\n useFactory: IS_TACTIC_FILTERS_PROPERTY_FACTORY,\n deps: [IS_TACTICS_RESOURCE_PATH],\n};\n", "export abstract class IsFiltersHelperAbstract {\n protected static NOT_ASSIGNED_SUFFIX = '_not_assigned';\n\n protected static getNotAssignedValueName(valueId: string | number): string {\n return `${valueId}${this.NOT_ASSIGNED_SUFFIX}`;\n }\n}\n", "export enum ISPredefinedFiltersEnum {\n TIME = 'Time',\n COUNTRY = 'Country',\n COUNTRIES = 'Country ',\n SOURCE = 'Source',\n AD_GROUP = 'Ad Group',\n CAMPAIGN = 'Campaign',\n RECOMMENDATIONS = 'Recommendations',\n URLS = 'Final URLs',\n KEYWORD_STATUS = 'Keyword status',\n MATCH_TYPE = 'Match type',\n CATEGORIES = 'Categories',\n VALUES = 'Values',\n AVG_LP_EXPERIENCE = 'Avg. LP Experience',\n COMPETITION = 'Competition',\n SEARCH_TERM_DIFFICULTY = 'Search term difficulty',\n}\n", "export enum ISFiltersSectionEnum {\n METRICS = 'Metrics',\n}\n", "import {\n IS_KEYWORD_MATCH_TYPE_LABELS,\n IS_KEYWORD_STATUS_LABELS,\n IS_LANDING_PAGE_QUALITY_SCORE_LABELS,\n IS_METRICS_LABELS,\n ISCategoryDetails,\n ISCompetitionTypesEnum,\n ISKeywordMatchTypeEnum,\n ISKeywordStatusEnum,\n ISLandingPageQualityScoreEnum,\n ISNumericMetricKey,\n ISSearchTermDifficultyTypesEnum,\n} from '@ess/integrated-search/shared/utils';\nimport {\n IS_COMPETITION_TYPES_LABELS,\n IS_SEARCH_TERM_DIFFICULTY_LABELS,\n IS_TACTICS_RECOMMENDATION_LABELS,\n IS_TACTICS_RECOMMENDATIONS,\n ISTacticsEnum,\n} from '@ess/integrated-search/tactics/shared/utils';\nimport { IS_ENTITY_SOURCE_LABELS, ISUniverseEntitySourceEnum } from '@ess/integrated-search/universe/shared/utils';\nimport { SharedCalendarConfig } from '@ess/shared/utils/classes';\nimport { SharedFilterTypeEnum } from '@ess/shared/utils/enums';\nimport { EssCountryOptionsHelper, SharedTimespanHelper } from '@ess/shared/utils/helpers';\nimport { SharedFilterOption, SharedFilterValue, SharedTimespan } from '@ess/shared/utils/models';\n\nimport { IsFiltersHelperAbstract } from './is-filters.helper.abstract';\n\nimport { ISFiltersSectionEnum, ISPredefinedFiltersEnum } from '../enums';\nimport { ISCampaignsAdGroupsFilter } from '../models';\n\nexport class ISFiltersOptionsHelper extends IsFiltersHelperAbstract {\n static getTimeFilterOption(tooltip = '', removable = false): SharedFilterOption {\n const values = SharedTimespanHelper.getPresetOptions();\n const lastAvailable: SharedTimespan = values.at(-1)!.value;\n\n const config: Partial = {\n minDate: new Date(lastAvailable.start_date),\n maxDate: new Date(lastAvailable.end_date),\n };\n\n return {\n property: ISPredefinedFiltersEnum.TIME,\n type: SharedFilterTypeEnum.TIMESPAN,\n values,\n removable,\n tooltip,\n config,\n };\n }\n\n static getCountryFilterOptions(): SharedFilterOption {\n return {\n property: ISPredefinedFiltersEnum.COUNTRY,\n type: SharedFilterTypeEnum.DEFAULT,\n values: EssCountryOptionsHelper.getCountryOptionList().map((country) => ({\n value: country.value!,\n label: country.value!,\n extraLabel: `(${country.name})`,\n })),\n multiple: false,\n removable: false,\n };\n }\n\n static getCountriesFilterOptions(): SharedFilterOption {\n return {\n property: ISPredefinedFiltersEnum.COUNTRIES,\n type: SharedFilterTypeEnum.DEFAULT,\n values: EssCountryOptionsHelper.getCountryOptionList().map((country) => ({\n value: country.value!,\n label: country.value!,\n extraLabel: `(${country.name})`,\n })),\n multiple: true,\n removable: true,\n };\n }\n\n static getKeywordStatusFilterOptions(): SharedFilterOption {\n return {\n property: ISPredefinedFiltersEnum.KEYWORD_STATUS,\n type: SharedFilterTypeEnum.DEFAULT,\n values: Object.values(ISKeywordStatusEnum).map((status) => ({\n value: status,\n label: IS_KEYWORD_STATUS_LABELS[status],\n })),\n multiple: true,\n removable: true,\n };\n }\n\n static getMatchTypeFilterOptions(): SharedFilterOption {\n return {\n property: ISPredefinedFiltersEnum.MATCH_TYPE,\n type: SharedFilterTypeEnum.DEFAULT,\n values: Object.values(ISKeywordMatchTypeEnum).map((matchType) => ({\n value: matchType,\n label: IS_KEYWORD_MATCH_TYPE_LABELS[matchType],\n })),\n multiple: true,\n removable: true,\n };\n }\n\n static getCategoriesFilterOptions(categories: ISCategoryDetails[]): SharedFilterOption {\n const values = categories.map((category) => ({\n value: category.category_id,\n label: category.title,\n valueId: category.category_id,\n nestedValues: [\n {\n value: this.getNotAssignedValueName(category.category_id),\n label: 'Not Assigned',\n tooltip: `Category: ${category.title}`,\n parent: category.category_id,\n section: category.title,\n },\n ...category.values.map((value) => ({\n value: value.category_value_id!,\n label: value.value,\n tooltip: `Category: ${category.title}`,\n parent: category.category_id,\n section: category.title,\n })),\n ],\n }));\n\n return {\n property: ISPredefinedFiltersEnum.CATEGORIES,\n secondaryProperty: ISPredefinedFiltersEnum.VALUES,\n type: SharedFilterTypeEnum.NESTED,\n values,\n multiple: true,\n removable: true,\n label: 'Categories',\n ...(!values.length && {\n disabled: true,\n disabledMessage: 'There are no categories for this project.',\n }),\n };\n }\n\n static getCampaignFilterOptions(campaigns: ISCampaignsAdGroupsFilter[]): SharedFilterOption {\n const values: SharedFilterValue[] = campaigns.map((campaign) => ({\n value: campaign.campaign_id,\n label: campaign.campaign_name,\n extraLabel: `ID: ${campaign.campaign_id}`,\n valueId: campaign.campaign_id,\n nestedValues: campaign.ad_groups.map((adGroup) => ({\n value: adGroup.ad_group_id,\n label: adGroup.ad_group_name,\n extraLabel: `ID: ${adGroup.ad_group_id}`,\n tooltip: `Campaign: ${campaign.campaign_name}`,\n parent: campaign.campaign_id,\n section: campaign.campaign_name,\n })),\n }));\n\n return {\n property: ISPredefinedFiltersEnum.CAMPAIGN,\n secondaryProperty: ISPredefinedFiltersEnum.AD_GROUP,\n type: SharedFilterTypeEnum.NESTED,\n values,\n multiple: true,\n removable: true,\n description: 'This list varies depending on selected time frame and country.',\n label: 'Campaign & Ad Group',\n ...(!values.length && {\n disabled: true,\n disabledMessage: 'There are no campaigns for selected time frame and/or country.',\n }),\n };\n }\n\n static getUrlFilterOptions(urls: string[]): SharedFilterOption {\n const values = urls.map((url) => ({ value: url, label: url }));\n return {\n property: ISPredefinedFiltersEnum.URLS,\n type: SharedFilterTypeEnum.DEFAULT,\n values,\n multiple: true,\n removable: true,\n description: 'This list varies depending on selected time frame and country.',\n valueClass: 'lowercase',\n ...(!values.length && {\n disabled: true,\n disabledMessage: 'There are no URLs for selected time frame and/or country.',\n }),\n };\n }\n\n static getRecommendationsFilterOptions(tactic: ISTacticsEnum): SharedFilterOption {\n const recommendations: SharedFilterValue[] = IS_TACTICS_RECOMMENDATIONS[tactic].map((recommendation) => ({\n value: recommendation,\n label: IS_TACTICS_RECOMMENDATION_LABELS[recommendation] || 'No recommendation',\n }));\n\n return {\n property: ISPredefinedFiltersEnum.RECOMMENDATIONS,\n type: SharedFilterTypeEnum.DEFAULT,\n values: recommendations,\n multiple: true,\n removable: true,\n };\n }\n\n static getSourcesFilterOptions(withManual = false): SharedFilterOption {\n return {\n property: ISPredefinedFiltersEnum.SOURCE,\n type: SharedFilterTypeEnum.DEFAULT,\n values: Object.values(ISUniverseEntitySourceEnum)\n .filter((s) => s !== ISUniverseEntitySourceEnum.ADDED_MANUALLY || withManual)\n .map((source) => ({\n value: source,\n label: IS_ENTITY_SOURCE_LABELS[source],\n })),\n multiple: true,\n removable: true,\n };\n }\n\n static getAvgLPExperienceFilterOptions(): SharedFilterOption {\n return {\n property: ISPredefinedFiltersEnum.AVG_LP_EXPERIENCE,\n type: SharedFilterTypeEnum.DEFAULT,\n values: Object.values(ISLandingPageQualityScoreEnum).map((score) => ({\n value: score,\n label: IS_LANDING_PAGE_QUALITY_SCORE_LABELS[score],\n })),\n multiple: true,\n removable: true,\n section: ISFiltersSectionEnum.METRICS,\n };\n }\n\n static getCompetitionFilterOptions(): SharedFilterOption {\n return {\n property: ISPredefinedFiltersEnum.COMPETITION,\n type: SharedFilterTypeEnum.DEFAULT,\n values: Object.values(ISCompetitionTypesEnum).map((competition) => ({\n value: competition,\n label: IS_COMPETITION_TYPES_LABELS[competition],\n })),\n multiple: true,\n removable: true,\n section: ISFiltersSectionEnum.METRICS,\n };\n }\n\n static getSearchTermDifficultyFilterOptions(): SharedFilterOption {\n return {\n property: ISPredefinedFiltersEnum.SEARCH_TERM_DIFFICULTY,\n type: SharedFilterTypeEnum.DEFAULT,\n values: Object.values(ISSearchTermDifficultyTypesEnum).map((difficulty) => ({\n value: difficulty,\n label: IS_SEARCH_TERM_DIFFICULTY_LABELS[difficulty],\n })),\n multiple: true,\n removable: true,\n section: ISFiltersSectionEnum.METRICS,\n };\n }\n\n static getNumericMetricFilterOption(\n metric: ISNumericMetricKey,\n unit?: string | null,\n allowAnyRange = false,\n ): SharedFilterOption {\n return {\n property: IS_METRICS_LABELS[metric],\n type: SharedFilterTypeEnum.RANGE,\n values: [],\n removable: true,\n section: ISFiltersSectionEnum.METRICS,\n unit,\n config: { allowAnyRange },\n };\n }\n}\n", "import { ISPredefinedFiltersEnum } from '../enums';\nimport { ISPredefinedFiltersKeys } from '../models';\n\nexport const IS_PREDEFINED_FILTERS_KEYS: {\n [key in ISPredefinedFiltersKeys]: ISPredefinedFiltersEnum;\n} = {\n timespan: ISPredefinedFiltersEnum.TIME,\n country: ISPredefinedFiltersEnum.COUNTRY,\n countries: ISPredefinedFiltersEnum.COUNTRIES,\n sources: ISPredefinedFiltersEnum.SOURCE,\n ad_group_ids: ISPredefinedFiltersEnum.AD_GROUP,\n campaign_ids: ISPredefinedFiltersEnum.CAMPAIGN,\n recommendations: ISPredefinedFiltersEnum.RECOMMENDATIONS,\n urls: ISPredefinedFiltersEnum.URLS,\n keyword_status: ISPredefinedFiltersEnum.KEYWORD_STATUS,\n match_type: ISPredefinedFiltersEnum.MATCH_TYPE,\n not_assigned_category_ids: ISPredefinedFiltersEnum.CATEGORIES,\n assigned_category_value_ids: ISPredefinedFiltersEnum.VALUES,\n ppc_landing_page_quality_scores: ISPredefinedFiltersEnum.AVG_LP_EXPERIENCE,\n competitions: ISPredefinedFiltersEnum.COMPETITION,\n search_term_difficulties: ISPredefinedFiltersEnum.SEARCH_TERM_DIFFICULTY,\n};\n\nexport const IS_PREDEFINED_FILTERS_BASE_KEYS: { [key in ISPredefinedFiltersEnum]?: ISPredefinedFiltersKeys } = {\n [ISPredefinedFiltersEnum.RECOMMENDATIONS]: 'recommendations',\n [ISPredefinedFiltersEnum.URLS]: 'urls',\n [ISPredefinedFiltersEnum.SOURCE]: 'sources',\n [ISPredefinedFiltersEnum.COUNTRIES]: 'countries',\n [ISPredefinedFiltersEnum.MATCH_TYPE]: 'match_type',\n [ISPredefinedFiltersEnum.KEYWORD_STATUS]: 'keyword_status',\n [ISPredefinedFiltersEnum.AVG_LP_EXPERIENCE]: 'ppc_landing_page_quality_scores',\n [ISPredefinedFiltersEnum.COMPETITION]: 'competitions',\n [ISPredefinedFiltersEnum.SEARCH_TERM_DIFFICULTY]: 'search_term_difficulties',\n};\n", "import { IS_METRICS_LABELS } from '@ess/integrated-search/shared/utils';\nimport { SharedFilterTypeEnum } from '@ess/shared/utils/enums';\nimport { EssRangeHelper } from '@ess/shared/utils/helpers';\nimport {\n SharedFilterOption,\n SharedFilters,\n SharedFilterValue,\n SharedRange,\n SharedTimespan,\n} from '@ess/shared/utils/models';\n\nimport { ISFiltersOptionsHelper } from './is-filters-options.helper';\n\nimport { IS_PREDEFINED_FILTERS_BASE_KEYS } from '../consts';\nimport { ISPredefinedFiltersEnum } from '../enums';\nimport {\n ISCampaignsFilterValue,\n ISCategoriesFilterValue,\n ISPredefinedFilters,\n ISPredefinedFiltersKeys,\n} from '../models';\n\nexport class ISFiltersHelper extends ISFiltersOptionsHelper {\n static mapFilterValues(appliedFilters: SharedFilters): F {\n let value: ISPredefinedFilters = {};\n const categoriesFilters: SharedFilterOption[] = [];\n const campaignsFilters: SharedFilterOption[] = [];\n\n for (const appliedFilter of appliedFilters) {\n if (appliedFilter.type === SharedFilterTypeEnum.TIMESPAN) {\n const timespan: SharedFilterValue | null =\n (appliedFilter as SharedFilterOption).values.at(0) ?? null;\n value = {\n ...value,\n ...(timespan && { timespan: timespan.value }),\n };\n } else if (appliedFilter.type === SharedFilterTypeEnum.RANGE) {\n const range: SharedFilterValue | null =\n (appliedFilter as SharedFilterOption).values.at(0) ?? null;\n const key: string | null =\n Object.entries(IS_METRICS_LABELS)\n .find(([_, value]) => value === appliedFilter.property)\n ?.at(0) ?? null;\n value = {\n ...value,\n ...(range && key && { [key]: EssRangeHelper.getRangeData(range.value, appliedFilter.unit) }),\n };\n } else {\n const filter: SharedFilterOption = appliedFilter as SharedFilterOption;\n switch (filter.property) {\n case ISPredefinedFiltersEnum.VALUES:\n categoriesFilters.push(filter);\n break;\n\n case ISPredefinedFiltersEnum.AD_GROUP:\n filter.filterId && campaignsFilters.push(filter);\n break;\n\n case ISPredefinedFiltersEnum.COUNTRY:\n value.country = this.__getFilterValue(filter)[0];\n break;\n\n case ISPredefinedFiltersEnum.RECOMMENDATIONS:\n case ISPredefinedFiltersEnum.URLS:\n case ISPredefinedFiltersEnum.SOURCE:\n case ISPredefinedFiltersEnum.COUNTRIES:\n case ISPredefinedFiltersEnum.MATCH_TYPE:\n case ISPredefinedFiltersEnum.KEYWORD_STATUS:\n case ISPredefinedFiltersEnum.AVG_LP_EXPERIENCE:\n case ISPredefinedFiltersEnum.COMPETITION:\n case ISPredefinedFiltersEnum.SEARCH_TERM_DIFFICULTY:\n value = this.__getFilterBaseValue(filter, value);\n break;\n }\n }\n }\n\n const { campaign_ids, ad_group_ids } = ISFiltersHelper.__getCampaignsFilterValue(campaignsFilters);\n const { not_assigned_category_ids, assigned_category_value_ids } =\n ISFiltersHelper.__getCategoriesFilterValue(categoriesFilters);\n\n value = { ...value, campaign_ids, ad_group_ids, not_assigned_category_ids, assigned_category_value_ids };\n\n return value as F;\n }\n\n private static __getFilterValue(filter: SharedFilterOption): T[] {\n return [...new Set(filter.values.filter((value) => !!value).map((value) => value!.value as T) || [])];\n }\n\n private static __getFilterBaseValue(filter: SharedFilterOption, output: ISPredefinedFilters): ISPredefinedFilters {\n const key: ISPredefinedFiltersKeys | undefined =\n IS_PREDEFINED_FILTERS_BASE_KEYS[filter.property as ISPredefinedFiltersEnum];\n if (key) {\n output = { ...output, [key]: this.__getFilterValue(filter) };\n }\n return output;\n }\n\n private static __getCategoriesFilterValue(categoryFilters: SharedFilterOption[]): ISCategoriesFilterValue {\n return {\n not_assigned_category_ids: categoryFilters\n .filter(\n (filter) =>\n filter.filterId &&\n filter.values.find((value) => value?.value.toString().includes(this.NOT_ASSIGNED_SUFFIX)),\n )\n .map((filter) => filter.filterId as number),\n assigned_category_value_ids: categoryFilters.flatMap((filter) =>\n filter.values\n .filter((value) => !value?.value.toString().includes(this.NOT_ASSIGNED_SUFFIX))\n .map((value) => value?.value as number),\n ),\n };\n }\n\n private static __getCampaignsFilterValue(campaignAndAdGroupFilters: SharedFilterOption[]): ISCampaignsFilterValue {\n return {\n campaign_ids: campaignAndAdGroupFilters.length ? campaignAndAdGroupFilters.map((filter) => filter.filterId!) : [],\n ad_group_ids: campaignAndAdGroupFilters.length\n ? [\n ...new Set(\n campaignAndAdGroupFilters.flatMap((filter) =>\n (filter.values as SharedFilterValue[]).map((value) => value.value),\n ),\n ),\n ]\n : [],\n };\n }\n}\n", "import { getCurrencySymbol } from '@angular/common';\n\nimport {\n IS_METRICS_LABELS,\n IS_METRICS_UNITS,\n ISMetricEnum,\n ISMetricUnitEnum,\n ISNumericMetricKey,\n} from '@ess/integrated-search/shared/utils';\nimport { ISTacticsEnum } from '@ess/integrated-search/tactics/shared/utils';\nimport { SharedFilters } from '@ess/shared/utils/models';\n\nimport { ISFiltersHelper } from './is-filters.helper';\n\nexport class ISNumericFiltersHelper {\n private static readonly __numericFilters: { [key in ISTacticsEnum]: ISNumericMetricKey[] } = {\n [ISTacticsEnum.CHANNEL_OVERLAP]: [\n ISMetricEnum.PPC_SPEND,\n ISMetricEnum.SEO_POSITION,\n ISMetricEnum.SEO_CLICKS,\n ISMetricEnum.SEO_CTR,\n ISMetricEnum.PPC_CLICKS,\n ISMetricEnum.PPC_CTR,\n ISMetricEnum.PPC_CONVERSIONS,\n ISMetricEnum.CONVERSIONS_VALUE,\n ISMetricEnum.COMBINED_IMPRESSIONS,\n ISMetricEnum.PAID_IMPRESSIONS_SHARE,\n ISMetricEnum.MAX_IMPRESSIONS,\n ISMetricEnum.MAX_PAID_IMPRESSIONS_SHARE,\n ISMetricEnum.SEO_IMPRESSIONS,\n ISMetricEnum.PPC_IMPRESSIONS,\n ISMetricEnum.PPC_CONVERSION_RATE,\n ISMetricEnum.PPC_ROAS,\n ISMetricEnum.PPC_CPC,\n ISMetricEnum.PPC_CPA,\n ],\n [ISTacticsEnum.SEARCH_GAPS]: [\n ISMetricEnum.COMBINED_IMPRESSIONS,\n ISMetricEnum.PAID_IMPRESSIONS_SHARE,\n ISMetricEnum.MAX_IMPRESSIONS,\n ISMetricEnum.MAX_PAID_IMPRESSIONS_SHARE,\n ISMetricEnum.MONTHLY_SEARCHES,\n ISMetricEnum.SEO_IMPRESSIONS,\n ISMetricEnum.PPC_IMPRESSIONS,\n ISMetricEnum.CONVERSIONS_VALUE,\n ISMetricEnum.SEO_POSITION,\n // TODO - add when available\n // ISMetricEnum.CLICKS_COVERAGE,\n ],\n [ISTacticsEnum.LANDING_PAGE_OPTIMISATION]: [\n ISMetricEnum.PPC_COST_SHARE,\n ISMetricEnum.PPC_CLICKS,\n ISMetricEnum.SEO_CLICKS,\n ISMetricEnum.PPC_CTR,\n ISMetricEnum.PPC_SPEND,\n ISMetricEnum.PPC_CONVERSIONS,\n ISMetricEnum.CONVERSIONS_VALUE,\n ISMetricEnum.COMBINED_IMPRESSIONS,\n ISMetricEnum.PAID_IMPRESSIONS_SHARE,\n ISMetricEnum.MAX_IMPRESSIONS,\n ISMetricEnum.MAX_PAID_IMPRESSIONS_SHARE,\n ISMetricEnum.SEO_IMPRESSIONS,\n ISMetricEnum.PPC_IMPRESSIONS,\n ISMetricEnum.PPC_ROAS,\n ISMetricEnum.PPC_CPC,\n ],\n };\n\n private static readonly __unlimitedPercentageRangeMetrics: ISNumericMetricKey[] = [\n ISMetricEnum.CLICKS_COVERAGE,\n ISMetricEnum.PPC_ROAS,\n ISMetricEnum.PPC_CONVERSION_RATE,\n ];\n\n static getNumericFiltersLabels(source: ISTacticsEnum): string[] {\n return this.__numericFilters[source].map((metric) => IS_METRICS_LABELS[metric]);\n }\n\n static getNumericFilters(source: ISTacticsEnum, currency: string | null | undefined): SharedFilters {\n return this.__numericFilters[source].reduce((filters: SharedFilters, metric: ISNumericMetricKey) => {\n const unit: ISMetricUnitEnum = IS_METRICS_UNITS[metric];\n switch (unit) {\n case ISMetricUnitEnum.CURRENCY:\n currency !== null &&\n currency !== undefined &&\n filters.push(ISFiltersHelper.getNumericMetricFilterOption(metric, getCurrencySymbol(currency, 'narrow')));\n break;\n case ISMetricUnitEnum.PERCENTAGE:\n filters.push(\n ISFiltersHelper.getNumericMetricFilterOption(\n metric,\n '%',\n this.__unlimitedPercentageRangeMetrics.includes(metric),\n ),\n );\n break;\n case ISMetricUnitEnum.INTEGER:\n default:\n filters.push(ISFiltersHelper.getNumericMetricFilterOption(metric));\n }\n return filters;\n }, []);\n }\n}\n", "import { ISNumericMetricEnum } from '@ess/integrated-search/shared/utils';\nimport { SharedTimespanEnum } from '@ess/shared/utils/enums';\nimport { SharedTimespanHelper } from '@ess/shared/utils/helpers';\n\nimport {\n ISFilters,\n ISFiltersUpdate,\n ISTacticFilterRange,\n ISTacticsFiltersState,\n ISUniverseFilters,\n ISUniverseFiltersState,\n} from '../models';\n\nexport class ISFiltersInitialStateHelper {\n static getInitialState(projectId: number, defaultCountry?: string): ISFilters {\n return {\n projectId,\n tactics: this.__getTacticsInitialState(defaultCountry),\n universe: this.__getUniverseInitialState(),\n };\n }\n\n static getOptionalEmptyValues(): ISFiltersUpdate {\n return {\n tactics: {\n channelOverlap: {\n recommendations: [],\n campaign_ids: [],\n ad_group_ids: [],\n assigned_category_value_ids: [],\n not_assigned_category_ids: [],\n search_term_difficulties: [],\n competitions: [],\n ...this.__initialRanges(),\n },\n searchGaps: {\n recommendations: [],\n assigned_category_value_ids: [],\n not_assigned_category_ids: [],\n search_term_difficulties: [],\n competitions: [],\n ...this.__initialRanges(),\n },\n landingPageOptimisation: {\n recommendations: [],\n urls: [],\n ppc_landing_page_quality_scores: [],\n ...this.__initialRanges(),\n },\n },\n universe: {\n searchTerms: {\n countries: [],\n sources: [],\n not_assigned_category_ids: [],\n assigned_category_value_ids: [],\n match_type: [],\n keyword_status: [],\n campaign_ids: [],\n ad_group_ids: [],\n timespan: undefined,\n },\n landingPages: {\n countries: [],\n sources: [],\n not_assigned_category_ids: [],\n assigned_category_value_ids: [],\n match_type: [],\n keyword_status: [],\n campaign_ids: [],\n ad_group_ids: [],\n timespan: undefined,\n },\n },\n };\n }\n\n private static __getTacticsInitialState(defaultCountry?: string): ISTacticsFiltersState {\n return {\n channelOverlap: {\n timespan: SharedTimespanHelper.getPresetTimespan(SharedTimespanEnum.DAYS_7),\n country: defaultCountry ?? 'GBR',\n recommendations: [],\n search_term__like: '',\n campaign_ids: [],\n ad_group_ids: [],\n assigned_category_value_ids: [],\n not_assigned_category_ids: [],\n ...this.__initialRanges(),\n },\n searchGaps: {\n timespan: SharedTimespanHelper.getPresetTimespan(SharedTimespanEnum.DAYS_30),\n country: defaultCountry ?? 'GBR',\n recommendations: [],\n search_term__like: '',\n assigned_category_value_ids: [],\n not_assigned_category_ids: [],\n search_term_difficulties: [],\n competitions: [],\n ...this.__initialRanges(),\n },\n landingPageOptimisation: {\n timespan: SharedTimespanHelper.getPresetTimespan(SharedTimespanEnum.DAYS_7),\n country: defaultCountry ?? 'GBR',\n recommendations: [],\n keyword__like: '',\n urls: [],\n ppc_landing_page_quality_scores: [],\n ...this.__initialRanges(),\n },\n };\n }\n\n private static __getUniverseInitialState(): ISUniverseFiltersState {\n const universeFilters: ISUniverseFilters = {\n countries: [],\n sources: [],\n not_assigned_category_ids: [],\n assigned_category_value_ids: [],\n match_type: [],\n keyword_status: [],\n includes: null,\n timespan: undefined,\n campaign_ids: [],\n ad_group_ids: [],\n };\n return {\n searchTerms: { ...universeFilters },\n landingPages: { ...universeFilters, timespan: SharedTimespanHelper.getPresetTimespan(SharedTimespanEnum.DAYS_7) },\n };\n }\n\n private static __initialRanges(): Required {\n return Object.values(ISNumericMetricEnum).reduce((state, metric) => {\n state[metric] = { from_: null, to: null };\n return state;\n }, {}) as Required;\n }\n}\n", "import { IS_METRICS_LABELS, ISNumericMetricEnum, ISNumericMetricKey } from '@ess/integrated-search/shared/utils';\nimport { EssFiltersHelper, EssRangeHelper } from '@ess/shared/utils/helpers';\nimport {\n SharedFilter,\n SharedFilterBaseValue,\n SharedFilterOption,\n SharedFilters,\n SharedRange,\n SharedRangeData,\n SharedSelectedFilterValue,\n SharedSelectedSecondaryValue,\n SharedTimespan,\n} from '@ess/shared/utils/models';\n\nimport { IsFiltersHelperAbstract } from './is-filters.helper.abstract';\n\nimport { IS_PREDEFINED_FILTERS_KEYS } from '../consts';\nimport { ISPredefinedFiltersEnum } from '../enums';\nimport { ISPredefinedFilters, ISPredefinedFiltersKeys } from '../models';\n\nexport class ISAppliedFiltersHelper extends IsFiltersHelperAbstract {\n static mapAppliedFiltersValues(options: SharedFilters, filters: ISPredefinedFilters): SharedFilters {\n const applied: SharedFilters = [];\n const predefinedKeys: ISPredefinedFiltersKeys[] = [];\n let categoriesFilter = false;\n let campaignsFilter = false;\n let timespanFilter = false;\n\n const rangeFilters: Map = new Map();\n const rangeFiltersKeys: string[] = Object.values(ISNumericMetricEnum);\n\n Object.entries(filters).forEach(([key, filter]) => {\n if (rangeFiltersKeys.includes(key)) {\n rangeFilters.set(key as ISNumericMetricKey, filter as unknown as SharedRangeData);\n } else {\n predefinedKeys.push(key as ISPredefinedFiltersKeys);\n }\n });\n\n for (const key of predefinedKeys) {\n const property = IS_PREDEFINED_FILTERS_KEYS[key];\n switch (property) {\n case ISPredefinedFiltersEnum.CATEGORIES:\n case ISPredefinedFiltersEnum.VALUES:\n categoriesFilter = true;\n break;\n\n case ISPredefinedFiltersEnum.AD_GROUP:\n case ISPredefinedFiltersEnum.CAMPAIGN:\n campaignsFilter = true;\n break;\n\n case ISPredefinedFiltersEnum.TIME:\n timespanFilter = true;\n break;\n\n case ISPredefinedFiltersEnum.COUNTRY:\n applied.push(\n ...this.__mapPrimaryFilter(ISPredefinedFiltersEnum.COUNTRY, options, [filters[key]] as string[]),\n );\n break;\n\n default:\n applied.push(...this.__mapPrimaryFilter(property, options, filters[key] as SharedFilterBaseValue[]));\n break;\n }\n }\n\n campaignsFilter &&\n applied.push(...this.__mapSecondaryFilter(ISPredefinedFiltersEnum.CAMPAIGN, options, filters.ad_group_ids));\n\n categoriesFilter &&\n applied.push(\n ...this.__mapSecondaryFilter(ISPredefinedFiltersEnum.CATEGORIES, options, [\n ...(filters.assigned_category_value_ids ?? []),\n ...(filters.not_assigned_category_ids?.map(this.getNotAssignedValueName.bind(this)) ?? []),\n ]),\n );\n timespanFilter && applied.push(...this.__mapTimespanFilter(options, filters.timespan));\n\n applied.push(\n ...Array.from(rangeFilters.entries()).flatMap(([key, range]) => this.__mapRangeFilter(options, key, range)),\n );\n return applied;\n }\n\n private static __mapPrimaryFilter(\n property: ISPredefinedFiltersEnum,\n options: SharedFilters,\n filterValue: SharedFilterBaseValue[],\n ): SharedFilterOption[] {\n const option: SharedFilter | null = options.find((o) => o.property === property) ?? null;\n\n const value =\n option && filterValue\n ? {\n ...option,\n values: (option as SharedFilterOption).values.filter(\n (value) => value?.value && filterValue.includes(value?.value),\n ),\n }\n : null;\n\n return value && value.values.length ? [value] : [];\n }\n\n private static __mapSecondaryFilter(\n property: ISPredefinedFiltersEnum,\n options: SharedFilters,\n values?: SharedSelectedFilterValue[],\n ): SharedFilters {\n const option: SharedFilter | null = options.find((o) => o.property === property) ?? null;\n\n if (option && values?.length) {\n const optionValues: SharedSelectedSecondaryValue[] = (option as SharedFilterOption).values\n .map(\n (value): SharedSelectedSecondaryValue => ({\n parent: value?.value,\n value:\n value?.nestedValues?.filter((nested) => values.includes(nested.value)).map((nested) => nested.value) ??\n [],\n }),\n )\n .filter((value) => value && value.value?.length);\n return EssFiltersHelper.applySecondaryFilters([], optionValues, option as SharedFilterOption);\n }\n\n return [];\n }\n\n private static __mapTimespanFilter(\n options: SharedFilters,\n timespan?: SharedTimespan,\n ): SharedFilterOption[] {\n const option: SharedFilter | null = options.find((o) => o.property === ISPredefinedFiltersEnum.TIME) ?? null;\n const value =\n option && timespan\n ? {\n ...option,\n values: EssFiltersHelper.getTimespanFilterValue(timespan),\n }\n : null;\n\n return value && value.values.length ? [value] : [];\n }\n\n private static __mapRangeFilter(\n options: SharedFilters,\n key?: ISNumericMetricKey,\n range?: SharedRangeData,\n ): SharedFilterOption[] {\n if (!range || (!EssRangeHelper.isDefined(range.from_) && !EssRangeHelper.isDefined(range.to))) {\n return [];\n }\n\n const property: string | null =\n Object.entries(IS_METRICS_LABELS)\n .find(([k, _]) => k === key)\n ?.at(1) ?? null;\n const option: SharedFilter | null = options.find((o) => o.property === property) ?? null;\n\n const value = option\n ? {\n ...option,\n values: EssFiltersHelper.getRangeFilterValue(EssRangeHelper.getRange(range, option.unit), option.unit),\n }\n : null;\n\n return value && value.values.length ? [value] : [];\n }\n}\n", "import { ISCampaignsAdGroupsFilter, ISCampaignsFilterValue, ISUrlsFilterValue } from '../models';\n\nexport class ISDynamicFiltersHelper {\n /**\n * Responsible for adjusting current filters state to updated set of Campaigns and Ad Groups filters options.\n *\n * @param filters current state of filters\n * @param campaigns new set of campaigns\n * @returns updated state of Campaigns and Ad Groups filters adjusted to updated campaigns set\n */\n static getUpdatedCampaignsFilters(\n filters: Partial,\n campaigns: ISCampaignsAdGroupsFilter[],\n ): ISCampaignsFilterValue {\n const campaign_ids = campaigns.map((campaign) => campaign.campaign_id);\n const ad_group_ids = campaigns.flatMap((campaign) => campaign.ad_groups.map((adGroup) => adGroup.ad_group_id));\n\n return {\n campaign_ids: filters.campaign_ids?.filter((id) => campaign_ids.includes(id)),\n ad_group_ids: filters.ad_group_ids?.filter((id) => ad_group_ids.includes(id)),\n };\n }\n\n /**\n * Responsible for adjusting current filters state to updated set of Urls filters options.\n *\n * @param filters current state of filters\n * @param urls new set of urls\n * @returns updated state of Urls filters adjusted to updated urls set\n */\n static getUpdatedUrlsFilters(filters: ISUrlsFilterValue, urls: string[]): ISUrlsFilterValue {\n return {\n urls: filters.urls?.filter((url) => urls.includes(url)),\n };\n }\n}\n", "import { ISTacticsEnum } from '@ess/integrated-search/tactics/shared/utils';\nimport { SharedFilter } from '@ess/shared/utils/models';\n\nimport { ISNumericFiltersHelper } from './is-numeric-filters.helper';\n\nimport { ISPredefinedFiltersEnum } from '../enums';\nimport { ISFilters, ISFiltersPath } from '../models';\n\ntype ISFiltersSortFn = (a: SharedFilter, b: SharedFilter) => number;\n\nexport class ISFiltersOrderHelper {\n private static readonly COMMON_APPLIED_FILTERS_ORDER: string[] = [\n ISPredefinedFiltersEnum.TIME,\n ISPredefinedFiltersEnum.COUNTRY,\n ISPredefinedFiltersEnum.RECOMMENDATIONS,\n ISPredefinedFiltersEnum.CAMPAIGN,\n ISPredefinedFiltersEnum.AD_GROUP,\n ISPredefinedFiltersEnum.CATEGORIES,\n ISPredefinedFiltersEnum.VALUES,\n ISPredefinedFiltersEnum.URLS,\n ISPredefinedFiltersEnum.KEYWORD_STATUS,\n ISPredefinedFiltersEnum.MATCH_TYPE,\n ISPredefinedFiltersEnum.COUNTRIES,\n ISPredefinedFiltersEnum.SOURCE,\n ];\n private static readonly APPLIED_FILTERS_ORDER: {\n [path in ISFiltersPath]: { [key in keyof ISFilters[path]]: string[] };\n } = {\n tactics: {\n channelOverlap: [\n ...this.COMMON_APPLIED_FILTERS_ORDER,\n ...ISNumericFiltersHelper.getNumericFiltersLabels(ISTacticsEnum.CHANNEL_OVERLAP),\n ],\n searchGaps: [\n ...this.COMMON_APPLIED_FILTERS_ORDER,\n ...ISNumericFiltersHelper.getNumericFiltersLabels(ISTacticsEnum.SEARCH_GAPS),\n ISPredefinedFiltersEnum.COMPETITION,\n ISPredefinedFiltersEnum.SEARCH_TERM_DIFFICULTY,\n ],\n landingPageOptimisation: [\n ...this.COMMON_APPLIED_FILTERS_ORDER,\n ISPredefinedFiltersEnum.AVG_LP_EXPERIENCE,\n ...ISNumericFiltersHelper.getNumericFiltersLabels(ISTacticsEnum.LANDING_PAGE_OPTIMISATION),\n ],\n },\n universe: {\n searchTerms: [...this.COMMON_APPLIED_FILTERS_ORDER],\n landingPages: [...this.COMMON_APPLIED_FILTERS_ORDER],\n },\n };\n\n static appliedFiltersSort(path: K, key: keyof ISFilters[K]): ISFiltersSortFn {\n return (a: SharedFilter, b: SharedFilter) =>\n this.APPLIED_FILTERS_ORDER[path][key].indexOf(a.property) -\n this.APPLIED_FILTERS_ORDER[path][key].indexOf(b.property);\n }\n}\n"], "mappings": "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", "names": ["IS_FILTERS_PATH", "InjectionToken", "IS_FILTERS_KEY", "ISUniverseEnum", "ISUniverseEntitySourceEnum", "ISUniverseEntitySourceLabelEnum", "ISUniverseEntityCategoryOptionEnum", "ISUniverseAddCategoryActionEnum", "ISUniverseSearchTermSourcesHelper", "getSources", "searchTerm", "keywords", "map", "keyword", "source", "isManuallyAdded", "includes", "ISUniverseEntitySourceEnum", "ADDED_MANUALLY", "ISSearchTermsRowsHelper", "flattenSearchTerm", "searchTerm", "keywords", "map", "keyword", "search_term", "match_type", "campaign", "ad_group", "countries", "source", "categories", "is_active", "mapSearchTermRows", "searchTerms", "flatMap", "rows", "__spreadProps", "__spreadValues", "isMaster", "filter", "row", "index", "rowId", "IS_UNIVERSE_RESOURCE_PATH", "InjectionToken", "IS_ENTITY_SOURCE_LABELS", "ISUniverseEntitySourceEnum", "GOOGLE_ADS", "ISUniverseEntitySourceLabelEnum", "GOOGLE_SEARCH_CONSOLE", "ADDED_MANUALLY", "IS_UNIVERSE_ENTITY_KEY", "ISUniverseEnum", "SEARCH_TERMS", "URLS", "IS_UNIVERSE_LIST_KEY", "IS_UNIVERSE_FILTERS_KEY", "IS_TACTICS_TOOLTIP_DICTIONARY", "ISUniverseEnum", "SEARCH_TERMS", "timeFilter", "URLS", "ISSearchTermsExportHelper", "reduceSearchTermsToRowArray", "selected", "headers", "essSortObjectsByProp", "flatMap", "entity", "ISSearchTermsRowsHelper", "flattenSearchTerm", "reduce", "acc", "entityArray", "forEach", "header", "push", "search_term", "keyword", "match_type", "is_active", "IS_KEYWORD_STATUS_LABELS", "ISKeywordStatusEnum", "ACTIVE", "PAUSED", "campaign", "campaign_name", "campaign_id", "ad_group", "ad_group_name", "ad_group_id", "countries", "join", "toUpperCase", "source", "map", "IS_ENTITY_SOURCE_LABELS", "categories", "find", "category", "title", "toLowerCase", "values", "value", "ISUniverseSettingsCategoriesHelper", "getCategoryOptions", "category", "values", "map", "value", "name", "category_value_id", "updateCategoryOptions", "controls", "formData", "forEach", "control", "hasKeepCurrent", "options", "some", "o", "ISUniverseEntityCategoryOptionEnum", "KEEP_CURRENT", "category_id", "unshift", "__spreadValues", "__keepCurrentOption", "shift", "getCategoriesControls", "categories", "reduce", "obj", "item", "__spreadProps", "FormControl", "getCategoriesValuesIds", "entity", "Object", "entries", "arr", "key", "__getCurrentCategoryValue", "getCategoryFormValue", "entities", "length", "__getMultipleEntitiesCategoriesValue", "__getSingleEntityCategoriesValue", "find", "c", "entitiesToReduce", "startEntity", "currentValues", "valueKeys", "Array", "from", "Set", "keys", "out", "_ISUniverseSettingsCategoriesHelper", "ISUniverseSearchTermImportWorkbookHelper", "parseJsonToCsv", "data", "headers", "worksheet", "utils", "json_to_sheet", "sheet_add_aoa", "origin", "workbook", "book_new", "book_append_sheet", "writeFile", "_ISUniverseSearchTermImportWorkbookHelper", "parseWorkbookToArray", "file", "onlyHeaders", "__async", "read", "arrayBuffer", "__spreadValues", "sheetRows", "sheet", "Sheets", "SheetNames", "sheet_to_json", "header", "ISUniverseSearchTermImportValidatorHelper", "fileFormatValidator", "parseCategoriesToForm", "setEntitiesCount", "control", "__async", "Promise", "resolve", "value", "then", "headers", "entities", "ISUniverseSearchTermImportWorkbookHelper", "parseWorkbookToArray", "errors", "entityColumns", "categoriesColumns", "forEach", "title", "index", "lowercaseTitle", "toLowerCase", "trim", "__searchTermColumnNames", "includes", "push", "__checkRequiredColumns", "__checkDuplicatedEntityColumn", "__checkCategoriesLength", "__checkCategoriesTitles", "categoriesMap", "__checkCategoriesValues", "valid", "Object", "keys", "length", "requiredColumns", "some", "subset", "map", "n", "join", "categories", "invalidTitle", "duplicated", "categoriesSet", "Set", "i", "add", "size", "categoriesIndexMap", "reduce", "item", "__spreadProps", "__spreadValues", "valuesMap", "valueLengthError", "valuesListLengthError", "row", "columnIndex", "Map", "key", "Array", "from", "sort", "_ISUniverseSearchTermImportValidatorHelper", "ISUniverseDeleteSearchTermsConfirmationTextHelper", "_ISUniverseDeleteSearchTermsConfirmationTextHelper", "getSingleEntityConfirmation", "entity", "sources", "ISUniverseSearchTermSourcesHelper", "getSources", "isManuallyAdded", "length", "getMultipleEntitiesConfirmation", "multiple", "getEntitySourcesStats", "entities", "reduce", "stats", "__spreadProps", "__spreadValues", "manual", "multiSource", "other", "ISUniverseSearchTermImportHelper", "parseCategoriesToForm", "categoriesMap", "categoriesForm", "categoriesArray", "controls", "categories", "clear", "emitEvent", "forEach", "values", "title", "push", "__getCategoryForm", "sort", "a", "b", "value", "control", "patchMatchesToForm", "response", "projectId", "map", "match", "find", "c", "__patchCategoryControl", "getCategoriesForProjectCount", "categoriesFormData", "toAdd", "limit", "length", "category", "action", "ISUniverseAddCategoryActionEnum", "DISCARD", "categoryId", "CREATE", "existingInProject", "category_id", "selectedExisting", "existingCategories", "addCategoryPayload", "new_values", "MERGE", "newValues", "parseArrayToEntities", "data", "headerRow", "entityData", "headers", "header", "toLowerCase", "trim", "entityColumnIndex", "findIndex", "h", "includes", "categoriesIndexMap", "reduce", "index", "set", "Map", "categoriesValuesMap", "get", "valuesMap", "valueMap", "category_value_id", "entities", "row", "search_term", "category_value_ids", "ids", "id", "parseErrors", "errors", "categoriesValues", "_a", "_b", "error", "has", "__spreadProps", "__spreadValues", "FormGroup", "FormControl", "nonNullable", "options", "info", "__categoryFormValidator", "getRawValue", "existing_categories", "last_updated", "description", "assigned_projects", "active", "v", "assigned_project_names", "p", "project_name", "filter", "newValue", "some", "actions", "unshift", "USE_EXISTING", "project_id", "patchValue", "name", "_ISUniverseSearchTermImportHelper", "existing", "concat", "valuesLimit", "IS_TACTIC_FILTERS_PROPERTY_FACTORY", "resource", "IS_TACTICS_KEYS", "IS_UNIVERSE_FILTERS_PROPERTY_FACTORY", "IS_UNIVERSE_FILTERS_KEY", "IS_UNIVERSE_FILTERS_PROVIDER", "provide", "IS_FILTERS_KEY", "useFactory", "deps", "IS_UNIVERSE_RESOURCE_PATH", "IS_TACTICS_FILTERS_PROVIDER", "IS_TACTICS_RESOURCE_PATH", "IsFiltersHelperAbstract", "getNotAssignedValueName", "valueId", "NOT_ASSIGNED_SUFFIX", "_IsFiltersHelperAbstract", "ISPredefinedFiltersEnum", "ISFiltersSectionEnum", "ISFiltersOptionsHelper", "IsFiltersHelperAbstract", "getTimeFilterOption", "tooltip", "removable", "values", "SharedTimespanHelper", "getPresetOptions", "lastAvailable", "at", "value", "config", "minDate", "Date", "start_date", "maxDate", "end_date", "property", "ISPredefinedFiltersEnum", "TIME", "type", "SharedFilterTypeEnum", "TIMESPAN", "getCountryFilterOptions", "COUNTRY", "DEFAULT", "EssCountryOptionsHelper", "getCountryOptionList", "map", "country", "label", "extraLabel", "name", "multiple", "getCountriesFilterOptions", "COUNTRIES", "getKeywordStatusFilterOptions", "KEYWORD_STATUS", "Object", "ISKeywordStatusEnum", "status", "IS_KEYWORD_STATUS_LABELS", "getMatchTypeFilterOptions", "MATCH_TYPE", "ISKeywordMatchTypeEnum", "matchType", "IS_KEYWORD_MATCH_TYPE_LABELS", "getCategoriesFilterOptions", "categories", "category", "category_id", "title", "valueId", "nestedValues", "getNotAssignedValueName", "parent", "section", "category_value_id", "__spreadValues", "CATEGORIES", "secondaryProperty", "VALUES", "NESTED", "length", "disabled", "disabledMessage", "getCampaignFilterOptions", "campaigns", "campaign", "campaign_id", "campaign_name", "ad_groups", "adGroup", "ad_group_id", "ad_group_name", "CAMPAIGN", "AD_GROUP", "description", "getUrlFilterOptions", "urls", "url", "URLS", "valueClass", "getRecommendationsFilterOptions", "tactic", "recommendations", "IS_TACTICS_RECOMMENDATIONS", "recommendation", "IS_TACTICS_RECOMMENDATION_LABELS", "RECOMMENDATIONS", "getSourcesFilterOptions", "withManual", "SOURCE", "ISUniverseEntitySourceEnum", "filter", "s", "ADDED_MANUALLY", "source", "IS_ENTITY_SOURCE_LABELS", "getAvgLPExperienceFilterOptions", "AVG_LP_EXPERIENCE", "ISLandingPageQualityScoreEnum", "score", "IS_LANDING_PAGE_QUALITY_SCORE_LABELS", "ISFiltersSectionEnum", "METRICS", "getCompetitionFilterOptions", "COMPETITION", "ISCompetitionTypesEnum", "competition", "IS_COMPETITION_TYPES_LABELS", "getSearchTermDifficultyFilterOptions", "SEARCH_TERM_DIFFICULTY", "ISSearchTermDifficultyTypesEnum", "difficulty", "IS_SEARCH_TERM_DIFFICULTY_LABELS", "getNumericMetricFilterOption", "metric", "unit", "allowAnyRange", "IS_METRICS_LABELS", "RANGE", "IS_PREDEFINED_FILTERS_KEYS", "timespan", "ISPredefinedFiltersEnum", "TIME", "country", "COUNTRY", "countries", "COUNTRIES", "sources", "SOURCE", "ad_group_ids", "AD_GROUP", "campaign_ids", "CAMPAIGN", "recommendations", "RECOMMENDATIONS", "urls", "URLS", "keyword_status", "KEYWORD_STATUS", "match_type", "MATCH_TYPE", "not_assigned_category_ids", "CATEGORIES", "assigned_category_value_ids", "VALUES", "ppc_landing_page_quality_scores", "AVG_LP_EXPERIENCE", "competitions", "COMPETITION", "search_term_difficulties", "SEARCH_TERM_DIFFICULTY", "IS_PREDEFINED_FILTERS_BASE_KEYS", "ISFiltersHelper", "ISFiltersOptionsHelper", "mapFilterValues", "appliedFilters", "value", "categoriesFilters", "campaignsFilters", "appliedFilter", "type", "SharedFilterTypeEnum", "TIMESPAN", "timespan", "values", "at", "__spreadValues", "RANGE", "range", "key", "Object", "entries", "IS_METRICS_LABELS", "find", "_", "property", "EssRangeHelper", "getRangeData", "unit", "filter", "ISPredefinedFiltersEnum", "VALUES", "push", "AD_GROUP", "filterId", "COUNTRY", "country", "__getFilterValue", "RECOMMENDATIONS", "URLS", "SOURCE", "COUNTRIES", "MATCH_TYPE", "KEYWORD_STATUS", "AVG_LP_EXPERIENCE", "COMPETITION", "SEARCH_TERM_DIFFICULTY", "__getFilterBaseValue", "campaign_ids", "ad_group_ids", "__getCampaignsFilterValue", "not_assigned_category_ids", "assigned_category_value_ids", "__getCategoriesFilterValue", "__spreadProps", "Set", "map", "output", "IS_PREDEFINED_FILTERS_BASE_KEYS", "categoryFilters", "toString", "includes", "NOT_ASSIGNED_SUFFIX", "flatMap", "campaignAndAdGroupFilters", "length", "ISNumericFiltersHelper", "getNumericFiltersLabels", "source", "__numericFilters", "map", "metric", "IS_METRICS_LABELS", "getNumericFilters", "currency", "reduce", "filters", "IS_METRICS_UNITS", "ISMetricUnitEnum", "CURRENCY", "push", "ISFiltersHelper", "getNumericMetricFilterOption", "getCurrencySymbol", "PERCENTAGE", "__unlimitedPercentageRangeMetrics", "includes", "INTEGER", "_ISNumericFiltersHelper", "ISTacticsEnum", "CHANNEL_OVERLAP", "ISMetricEnum", "PPC_SPEND", "SEO_POSITION", "SEO_CLICKS", "SEO_CTR", "PPC_CLICKS", "PPC_CTR", "PPC_CONVERSIONS", "CONVERSIONS_VALUE", "COMBINED_IMPRESSIONS", "PAID_IMPRESSIONS_SHARE", "MAX_IMPRESSIONS", "MAX_PAID_IMPRESSIONS_SHARE", "SEO_IMPRESSIONS", "PPC_IMPRESSIONS", "PPC_CONVERSION_RATE", "PPC_ROAS", "PPC_CPC", "PPC_CPA", "SEARCH_GAPS", "MONTHLY_SEARCHES", "LANDING_PAGE_OPTIMISATION", "PPC_COST_SHARE", "CLICKS_COVERAGE", "ISFiltersInitialStateHelper", "getInitialState", "projectId", "defaultCountry", "tactics", "__getTacticsInitialState", "universe", "__getUniverseInitialState", "getOptionalEmptyValues", "channelOverlap", "__spreadValues", "recommendations", "campaign_ids", "ad_group_ids", "assigned_category_value_ids", "not_assigned_category_ids", "search_term_difficulties", "competitions", "__initialRanges", "searchGaps", "landingPageOptimisation", "urls", "ppc_landing_page_quality_scores", "searchTerms", "countries", "sources", "match_type", "keyword_status", "timespan", "undefined", "landingPages", "SharedTimespanHelper", "getPresetTimespan", "SharedTimespanEnum", "DAYS_7", "country", "search_term__like", "DAYS_30", "keyword__like", "universeFilters", "includes", "__spreadProps", "Object", "values", "ISNumericMetricEnum", "reduce", "state", "metric", "from_", "to", "ISAppliedFiltersHelper", "IsFiltersHelperAbstract", "mapAppliedFiltersValues", "options", "filters", "applied", "predefinedKeys", "categoriesFilter", "campaignsFilter", "timespanFilter", "rangeFilters", "Map", "rangeFiltersKeys", "Object", "values", "ISNumericMetricEnum", "entries", "forEach", "key", "filter", "includes", "set", "push", "property", "IS_PREDEFINED_FILTERS_KEYS", "ISPredefinedFiltersEnum", "CATEGORIES", "VALUES", "AD_GROUP", "CAMPAIGN", "TIME", "COUNTRY", "__mapPrimaryFilter", "__mapSecondaryFilter", "ad_group_ids", "assigned_category_value_ids", "not_assigned_category_ids", "map", "getNotAssignedValueName", "bind", "__mapTimespanFilter", "timespan", "Array", "from", "flatMap", "range", "__mapRangeFilter", "filterValue", "option", "find", "o", "value", "__spreadProps", "__spreadValues", "length", "optionValues", "parent", "nestedValues", "nested", "EssFiltersHelper", "applySecondaryFilters", "getTimespanFilterValue", "EssRangeHelper", "isDefined", "from_", "to", "IS_METRICS_LABELS", "k", "_", "at", "getRangeFilterValue", "getRange", "unit", "ISDynamicFiltersHelper", "getUpdatedCampaignsFilters", "filters", "campaigns", "campaign_ids", "map", "campaign", "campaign_id", "ad_group_ids", "flatMap", "ad_groups", "adGroup", "ad_group_id", "filter", "id", "includes", "getUpdatedUrlsFilters", "urls", "url", "ISFiltersOrderHelper", "appliedFiltersSort", "path", "key", "a", "b", "APPLIED_FILTERS_ORDER", "indexOf", "property", "_ISFiltersOrderHelper", "COMMON_APPLIED_FILTERS_ORDER", "ISPredefinedFiltersEnum", "TIME", "COUNTRY", "RECOMMENDATIONS", "CAMPAIGN", "AD_GROUP", "CATEGORIES", "VALUES", "URLS", "KEYWORD_STATUS", "MATCH_TYPE", "COUNTRIES", "SOURCE", "tactics", "channelOverlap", "ISNumericFiltersHelper", "getNumericFiltersLabels", "ISTacticsEnum", "CHANNEL_OVERLAP", "searchGaps", "SEARCH_GAPS", "COMPETITION", "SEARCH_TERM_DIFFICULTY", "landingPageOptimisation", "AVG_LP_EXPERIENCE", "LANDING_PAGE_OPTIMISATION", "universe", "searchTerms", "landingPages"] }