{"version":3,"sources":["src/@omnial/_models/catalog/pageState.model.ts","src/@omnial/_models/catalog/product-filter.model.ts","src/@omnial/_services/catalog/products-paged.service.ts","src/app/shared/_client/elfa-product-filters/elfa-product-filters.component.ts","src/app/shared/_client/elfa-product-filters/elfa-product-filters.component.html","node_modules/@angular/cdk/fesm2022/table.mjs","node_modules/@angular/material/fesm2022/table.mjs","src/@omnial/material.table.module.ts","src/app/shared/_client/faqs/faqs.component.ts","src/app/shared/_client/faqs/faqs.component.html","src/app/_services/artist.service.ts","src/app/shared/_client/artist-carousel/artist-item/artist-item.component.ts","src/app/shared/_client/artist-carousel/artist-item/artist-item.component.html","src/app/shared/_client/artist-carousel/artist-carousel.component.ts","src/app/shared/_client/artist-carousel/artist-carousel.component.html","src/app/shared/_client/shop-by-elfa-brand/shop-by-elfa-brand.component.ts","src/app/shared/_client/shop-by-elfa-brand/shop-by-elfa-brand.component.html","src/app/shared/_client/elfa-brand-carousel/elfa-brand-carousel.component.ts","src/app/shared/_client/elfa-brand-carousel/elfa-brand-carousel.component.html","src/app/shared/_client/client.shared.module.ts"],"sourcesContent":["import { CatalogSortOption } from \"../settings.model\";\r\nimport { ProductFilterOption } from \"./product-filter.model\";\r\n\r\n\r\nexport class PageState {\r\n constructor(\r\n public pageNumber: number,\r\n public position: number,\r\n public scrollY: number,\r\n public sort: CatalogSortOption,\r\n public selectedFilters: ProductFilterOption[]) { }\r\n}\r\n","export class ProductFilterGroup {\r\n name: string;\r\n displayOrder: number;\r\n filters: ProductFilter[]\r\n}\r\n\r\nexport class ProductFilter {\r\n noSelected: number;\r\n name: string;\r\n displayOrder: number;\r\n options: ProductFilterOption[];\r\n}\r\n\r\nexport class ProductFilterOption {\r\n checked: boolean;\r\n specificationAttributeId: number;\r\n specificationAttributeName: string;\r\n name: string;\r\n colorSquaresRgb: string;\r\n imageUrl: string;\r\n displayOrder: number;\r\n attributeTypeId: number;\r\n disabled: boolean;\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\nimport { ProductsPaged } from \"src/@omnial/_models/catalog/products.paged.model\";\r\nimport { CatalogService } from \"./catalog.service\";\r\n\r\n@Injectable()\r\nexport class ProductsPagedService {\r\n public pages: BehaviorSubject = new BehaviorSubject(null);\r\n private $pages: ProductsPaged[] = null;\r\n\r\n constructor(public catalogService: CatalogService) { }\r\n\r\n public replace(pages: ProductsPaged[]): void {\r\n this.$pages = pages;\r\n this.pages.next(this.$pages);\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnDestroy, Output } from '@angular/core';\r\nimport { NgxSpinnerService } from 'ngx-spinner';\r\nimport { Product } from 'src/@omnial/_models/catalog/product.model';\r\nimport { MenuService } from 'src/@omnial/_services/navigation/menu.service';\r\nimport { AppSettings } from 'src/app/app.settings';\r\nimport { environment } from 'src/environments/environment';\r\nimport { ProductsPaged } from 'src/@omnial/_models/catalog/products.paged.model';\r\nimport { PageState } from 'src/@omnial/_models/catalog/pageState.model';\r\nimport { CatalogSortOption } from 'src/@omnial/_models/settings.model';\r\nimport { ProductFilterGroup, ProductFilter, ProductFilterOption } from 'src/@omnial/_models/catalog/product-filter.model';\r\nimport { ProductsPagedService } from 'src/@omnial/_services/catalog/products-paged.service';\r\nimport { Menu } from 'src/@omnial/_models/navigation/menu.model';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Component({\n selector: 'app-elfa-product-filters',\n templateUrl: './elfa-product-filters.component.html',\n styleUrls: ['./elfa-product-filters.component.scss'],\n standalone: false\n})\r\nexport class ElfaProductFiltersComponent implements OnDestroy {\r\n @Input() elfaFilterType: string;\r\n @Output() searchFilters = new EventEmitter();\r\n public seName: string;\r\n public unFilteredProducts: Product[];\r\n public filterGroups: ProductFilterGroup[];\r\n public filterType = 'filter';\r\n public filterTab: number;\r\n public hasFilters: boolean;\r\n public noFilters: number;\r\n public noFiltered: number;\r\n public filterInfoTimer: NodeJS.Timeout;\r\n public filtering = false;\r\n public filtered = false;\r\n public filtersClosed: boolean;\r\n public selectedSort: CatalogSortOption;\r\n public sortOptions: CatalogSortOption[];\r\n public menu: Menu;\r\n public subscriptions: Subscription[] = [];\r\n\r\n constructor(\r\n public productsPagedService: ProductsPagedService,\r\n public menuService: MenuService,\r\n public settings: AppSettings,\r\n public spinner: NgxSpinnerService) {\r\n this.subscriptions.push(this.menuService.megaMenu.subscribe(res => { this.menu = res as Menu; }));\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.subscriptions && this.subscriptions.length > 0) {\r\n this.subscriptions.forEach((sub) => { sub.unsubscribe(); });\r\n }\r\n }\r\n\r\n public setFilters(seName: string, products: Product[], filterGroups: ProductFilterGroup[], pageState?: PageState) {\r\n this.seName = seName;\r\n this.unFilteredProducts = products;\r\n this.filterGroups = filterGroups;\r\n this.filterTab = 0;\r\n this.hasFilters = false;\r\n this.noFilters = 0;\r\n this.noFiltered = 0;\r\n this.filtersClosed = true;\r\n\r\n // We have the initial products and Product Spec Filters ... but we only want to show the applicable filters\r\n let validFilters: ProductFilterGroup[] = [];\r\n let filterUpFront = false;\r\n if (this.settings.maintainSort && pageState?.sort) {\r\n this.selectedSort = pageState?.sort;\r\n } else if (this.sortOptions?.length > 0) {\r\n this.selectedSort = this.sortOptions[0];\r\n }\r\n filterGroups?.forEach((group) => {\r\n let validFilterGroup: ProductFilterGroup = null;\r\n group.filters.forEach((filter) => {\r\n let validFilter: ProductFilter = null;\r\n filter.options.forEach((option) => {\r\n if (option.specificationAttributeName === 'SubCategory') {\r\n option.disabled = true;\r\n }\r\n if (option.specificationAttributeName === 'Brand') {\r\n if (!option.imageUrl) {\r\n option.imageUrl = this.BrandImage(option.name);\r\n }\r\n }\r\n if (this.settings.maintainFilters && pageState?.selectedFilters?.length > 0) {\r\n option.checked = pageState.selectedFilters.some(o => o.specificationAttributeId === option.specificationAttributeId && o.name === option.name);\r\n filterUpFront = true;\r\n }\r\n if (this.unFilteredProducts?.some(p => p.specifications?.some(spec => spec.specificationAttributeId === option.specificationAttributeId && spec.valueRaw === option.name))) {\r\n this.hasFilters = true;\r\n if (!validFilterGroup) {\r\n validFilterGroup = new ProductFilterGroup();\r\n validFilterGroup.name = group.name;\r\n validFilterGroup.displayOrder = group.displayOrder;\r\n validFilterGroup.filters = [];\r\n validFilter = new ProductFilter();\r\n validFilter.name = filter.name;\r\n validFilter.displayOrder = filter.displayOrder;\r\n validFilter.options = [option];\r\n validFilterGroup.filters = [validFilter];\r\n validFilters.push(validFilterGroup);\r\n } else if (!validFilter) {\r\n validFilter = new ProductFilter();\r\n validFilter.name = filter.name;\r\n validFilter.displayOrder = filter.displayOrder;\r\n validFilterGroup.filters.push(validFilter);\r\n validFilter.options = [option];\r\n } else {\r\n validFilter.options.push(option);\r\n }\r\n }\r\n });\r\n });\r\n });\r\n filterGroups = validFilters;\r\n if (filterUpFront) {\r\n let filterCount = -1;\r\n let filterActiveTab = false;\r\n filterGroups.forEach((group) => {\r\n group.filters.forEach((filter) => {\r\n if (!filterActiveTab && filter.options.some(o => o.checked)) {\r\n this.filterTab = filterCount;\r\n filterActiveTab = true;\r\n }\r\n filterCount++;\r\n });\r\n });\r\n if (this.elfaFilterType !== 'search') {\r\n this.filterProducts();\r\n } else {\r\n this.setSearchFilters();\r\n }\r\n this.spinner.hide();\r\n } else {\r\n clearTimeout(this.filterInfoTimer);\r\n this.noFiltered = this.unFilteredProducts.length;\r\n this.filtering = true;\r\n this.filterInfoTimer = setTimeout(() => { this.filtering = false }, environment.filterTimer);\r\n this.spinner.hide();\r\n }\r\n }\r\n\r\n private BrandImage(brandName: string): string {\r\n if (this.menu) {\r\n const brandsNode = this.menu?.items?.find(s => s.id == 'man-0');\r\n if (brandsNode) {\r\n const brandNode = brandsNode.children.find(n => n.name == brandName);\r\n if (brandNode) {\r\n return brandNode.imageUrl;\r\n }\r\n }\r\n }\r\n return '';\r\n }\r\n\r\n public changeSort(option: CatalogSortOption): void {\r\n this.filtersClosed = true;\r\n this.selectedSort = option;\r\n this.filterProducts();\r\n }\r\n\r\n public showFilters(filterType: string): void {\r\n if (!this.filtersClosed && this.filterType !== filterType) {\r\n this.filterType = filterType;\r\n return;\r\n }\r\n // Show/Hide the filter Pane\r\n this.filterType = filterType;\r\n this.filtersClosed = !this.filtersClosed;\r\n }\r\n\r\n public filterName(filter: ProductFilter): string {\r\n if (!filter?.options || filter?.options?.length < 1) {\r\n return 'No Filters Available';\r\n }\r\n if (filter.noSelected) {\r\n return `${filter.name} (${filter.noSelected})`;\r\n }\r\n return filter.name;\r\n }\r\n\r\n public filterAny(group: ProductFilterGroup): boolean {\r\n return group.filters.some(f => f.options.some(o => o.checked));\r\n }\r\n\r\n public filtersAvailable(): boolean {\r\n var available = false;\r\n this.filterGroups.forEach((group) => {\r\n group.filters.forEach((filter) => {\r\n if (filter?.options?.length > 1) {\r\n available = true;\r\n }\r\n })\r\n });\r\n return available;\r\n }\r\n\r\n public filterRemoveAll(): void {\r\n this.filtersClosed = true;\r\n this.filterTab = 0;\r\n this.filterGroups.forEach((group) => {\r\n group.filters.forEach((filter) => {\r\n filter.options.forEach((option) => {\r\n option.checked = false;\r\n })\r\n })\r\n });\r\n if (this.elfaFilterType !== 'search') {\r\n this.filterProducts();\r\n } else {\r\n this.setSearchFilters();\r\n this.searchFilters.emit(this.selectedOptions());\r\n }\r\n }\r\n\r\n public filterAllComplete(filter: ProductFilter): boolean {\r\n return !(filter.options.some(o => !o.checked));\r\n }\r\n\r\n public filterSomeComplete(filter: ProductFilter): boolean {\r\n return filter.options.some(o => o.checked) && filter.options.some(o => !o.checked);\r\n }\r\n\r\n public filterSetAll(checked: boolean, filter: ProductFilter): void {\r\n filter.options.forEach((option) => {\r\n option.checked = checked;\r\n });\r\n if (this.elfaFilterType !== 'search') {\r\n this.filterProducts();\r\n } else {\r\n this.setSearchFilters();\r\n this.searchFilters.emit(this.selectedOptions());\r\n }\r\n }\r\n\r\n public filterUpdateOption(option: ProductFilterOption): void {\r\n this.spinner.show();\r\n option.checked = !option.checked;\r\n // If we are changing a Brand or Category remove all series selections ... all to do with specific ELFA UX\r\n if (option.specificationAttributeName.toLowerCase() !== 'series') {\r\n this.filterGroups.forEach((group) => {\r\n group.filters.forEach(filter => {\r\n if (filter.name.toLowerCase() === 'series') {\r\n filter.options.forEach(option => {\r\n option.checked = false;\r\n });\r\n }\r\n });\r\n });\r\n }\r\n // According to the Type we need to clear other selections (Cats-> Sub or Brand -> SubCats)\r\n if (option.specificationAttributeName.toLowerCase() === this.elfaFilterType) {\r\n let checkedSubCats: ProductFilterOption[] = [];\r\n this.filterGroups.forEach((group) => {\r\n group.filters.forEach((filter) => {\r\n if (filter.name.toLowerCase() === 'subcategory' && filter.options?.some(o => o.checked)) {\r\n checkedSubCats = filter.options.filter(o => o.checked);\r\n }\r\n });\r\n });\r\n if (checkedSubCats?.length > 0) {\r\n let hasProducts = true;\r\n let checkedFilterType: ProductFilterOption[] = [];\r\n this.filterGroups.forEach((group) => {\r\n group.filters.forEach((filter) => {\r\n if (filter.name.toLowerCase() === this.elfaFilterType && filter.options?.some(o => o.checked)) {\r\n checkedFilterType = filter.options.filter(o => o.checked);\r\n }\r\n });\r\n });\r\n if (checkedFilterType?.length > 0) {\r\n // We have the checked Brands and SubCats ... do we have a combination with no products?\r\n hasProducts = false;\r\n this.unFilteredProducts.forEach((product) => {\r\n if (this.isIncluded(product, false)) {\r\n hasProducts = true;\r\n }\r\n });\r\n }\r\n if (!hasProducts) {\r\n this.filterGroups.forEach((group) => {\r\n group.filters.forEach((filter) => {\r\n if (filter.name.toLowerCase() === 'subcategory') {\r\n filter.options.forEach((option) => {\r\n option.checked = false;\r\n });\r\n }\r\n });\r\n });\r\n }\r\n }\r\n }\r\n // if we have checked a SubCategory then ensure the Brand is checked to match\r\n if (option.checked && option.specificationAttributeName.toLowerCase() === 'subcategory') {\r\n this.filterGroups.forEach((group) => {\r\n group.filters.forEach((filter) => {\r\n if (filter.name.toLowerCase() === this.elfaFilterType && filter.options?.some(o => o.checked)) {\r\n let filterTypesToCheck: string[] = [];\r\n this.unFilteredProducts.forEach((product) => {\r\n const subCatSpec = product.specifications?.find(s => s.specificationAttributeName.toLowerCase() === 'subcategory');\r\n if (subCatSpec && subCatSpec.valueRaw === option.name) {\r\n product.specifications.filter(s => s.specificationAttributeName.toLowerCase() === this.elfaFilterType).forEach((brand) => {\r\n filterTypesToCheck.push(brand.valueRaw);\r\n });\r\n }\r\n });\r\n filter.options.forEach((option) => {\r\n if (!option.checked && filterTypesToCheck.some(b => b === option.name)) {\r\n option.checked = true;\r\n }\r\n });\r\n }\r\n });\r\n });\r\n }\r\n if (this.elfaFilterType !== 'search') {\r\n this.filterProducts();\r\n } else {\r\n this.setSearchFilters();\r\n this.searchFilters.emit(this.selectedOptions());\r\n }\r\n this.spinner.hide();\r\n }\r\n\r\n public setSearchFilters() {\r\n this.filtered = false;\r\n this.filtering = true;\r\n clearTimeout(this.filterInfoTimer);\r\n this.filterInfoTimer = setTimeout(() => { this.filtering = false }, environment.filterTimer);\r\n this.noFilters = 0;\r\n this.noFiltered = 0;\r\n this.filterGroups.forEach((group) => {\r\n group.filters.forEach((filter) => {\r\n filter.noSelected = 0;\r\n const selectedOptions = filter.options.filter(o => o.checked);\r\n if (selectedOptions && selectedOptions.length > 0) {\r\n filter.noSelected = selectedOptions.length;\r\n this.noFilters += selectedOptions.length;\r\n }\r\n });\r\n });\r\n this.seName = 'search';\r\n this.setPageSateFiltered(0, 0, 0);\r\n }\r\n\r\n public filterProducts() {\r\n if (this.unFilteredProducts.length > environment.pageSize) {\r\n this.spinner.show();\r\n }\r\n this.filtered = false;\r\n this.filtering = true;\r\n clearTimeout(this.filterInfoTimer);\r\n this.filterInfoTimer = setTimeout(() => { this.filtering = false }, environment.filterTimer);\r\n const filteredPages: ProductsPaged[] = [];\r\n let filteredProducts: Product[] = [];\r\n this.unFilteredProducts.forEach((product) => {\r\n filteredProducts.push(product);\r\n });\r\n switch (this.selectedSort?.field) {\r\n case \"name\":\r\n filteredProducts = filteredProducts.sort((a, b) => (a.name > b.name) ? 1 : ((b.name > a.name) ? -1 : 0));\r\n if (this.selectedSort.reverse) {\r\n filteredProducts = filteredProducts.reverse();\r\n }\r\n break;\r\n case \"newPrice\":\r\n filteredProducts = filteredProducts.sort((a, b) => (a.newPrice > b.newPrice) ? 1 : ((b.newPrice > a.newPrice) ? -1 : 0));\r\n if (this.selectedSort.reverse) {\r\n filteredProducts = filteredProducts.reverse();\r\n }\r\n break;\r\n case \"createdOn\":\r\n filteredProducts = filteredProducts.sort((a, b) => (a.createdOn > b.createdOn) ? 1 : ((b.createdOn > a.createdOn) ? -1 : 0));\r\n break;\r\n case \"position\":\r\n default:\r\n filteredProducts = filteredProducts.sort((a, b) => (a.position > b.position) ? 1 : ((b.position > a.position) ? -1 : 0));\r\n break;\r\n }\r\n let pageOfProducts: Product[] = [];\r\n let index = 0;\r\n this.noFilters = 0;\r\n this.filterGroups.forEach((group) => {\r\n group.filters.forEach((filter) => {\r\n filter.noSelected = 0;\r\n const selectedOptions = filter.options.filter(o => o.checked);\r\n if (selectedOptions && selectedOptions.length > 0) {\r\n filter.noSelected = selectedOptions.length;\r\n this.noFilters += selectedOptions.length;\r\n }\r\n });\r\n });\r\n this.noFiltered = 0;\r\n let filteredProductsNoSeries: Product[] = [];\r\n filteredProducts.forEach((product) => {\r\n if (this.isIncluded(product, true)) {\r\n this.noFiltered++;\r\n if (pageOfProducts.length < environment.pageSize) {\r\n pageOfProducts.push(product);\r\n } else {\r\n const page = new ProductsPaged();\r\n page.pageSize = environment.pageSize;\r\n page.pageIndex = index;\r\n page.lastPage = false;\r\n page.products = [];\r\n pageOfProducts.forEach((productToAdd) => {\r\n page.products.push(productToAdd);\r\n })\r\n filteredPages.push(page)\r\n index++;\r\n pageOfProducts = [];\r\n pageOfProducts.push(product);\r\n }\r\n }\r\n if (this.isIncluded(product, false)) {\r\n filteredProductsNoSeries.push(product);\r\n };\r\n });\r\n const page = new ProductsPaged();\r\n page.pageSize = environment.pageSize;\r\n page.pageIndex = index;\r\n page.lastPage = true;\r\n page.products = [];\r\n pageOfProducts.forEach((productToAdd) => {\r\n page.products.push(productToAdd);\r\n })\r\n filteredPages.push(page);\r\n if (filteredPages?.length > 0) {\r\n filteredPages[0].visible = true;\r\n }\r\n filteredProducts = []; // Gives us back the Filtered Products to use if we want to\r\n filteredPages.forEach(page => {\r\n page.products.forEach(product => {\r\n filteredProducts.push(product);\r\n });\r\n });\r\n this.productsPagedService.replace(filteredPages);\r\n this.setPageSateFiltered(0, 0, 0);\r\n if (this.unFilteredProducts.length > environment.pageSize) {\r\n this.spinner.hide();\r\n }\r\n // Finally set the filter status, disabling those which do not now have any products (Series Only)\r\n this.filterGroups.forEach((group) => {\r\n let catFilters = false;\r\n group.filters.forEach(filter => {\r\n if (!catFilters && filter.name.toLowerCase() !== 'series') {\r\n catFilters = filter.noSelected > 0;\r\n }\r\n if (filter.name.toLowerCase() === 'series') { // Series filter - Only show relevant Series values\r\n filter.options.forEach(option => {\r\n if (catFilters) {\r\n option.disabled = !filteredProductsNoSeries.some(p => p.specifications?.find(s => s.specificationAttributeName.toLowerCase() === 'series')?.valueRaw === option.name);\r\n } else {\r\n option.disabled = false;\r\n }\r\n });\r\n }\r\n });\r\n });\r\n }\r\n\r\n public setPageSateFiltered(pageNumber: number, position: number, scrollY: number): void {\r\n let selectedOptions: ProductFilterOption[] = [];\r\n this.filterGroups?.forEach((group) => {\r\n group.filters.forEach((filter) => {\r\n filter.options.forEach((option) => {\r\n if (option.checked) {\r\n selectedOptions.push(option);\r\n }\r\n })\r\n })\r\n });\r\n localStorage.setItem(this.seName, JSON.stringify(new PageState(pageNumber, position, scrollY, this.selectedSort, selectedOptions)));\r\n }\r\n\r\n public selectedOptions(): ProductFilterOption[] {\r\n let selectedOptions: ProductFilterOption[] = [];\r\n this.filterGroups?.forEach((group) => {\r\n group.filters.forEach((filter) => {\r\n filter.options.forEach((option) => {\r\n if (option.checked) {\r\n selectedOptions.push(option);\r\n }\r\n })\r\n })\r\n });\r\n return selectedOptions;\r\n }\r\n\r\n public isIncluded(product: Product, withSeries: boolean): boolean {\r\n let included = true;\r\n this.filterGroups.forEach((group) => {\r\n group.filters.forEach((filter) => {\r\n const selectedOptions = filter.options.filter(o => o.checked);\r\n if (selectedOptions && selectedOptions.length > 0) {\r\n this.filtered = true;\r\n if (product.specifications && included) {\r\n let matches: ProductFilterOption[] = [];\r\n product.specifications.forEach((spec) => {\r\n matches = matches.concat(selectedOptions.filter(o => o.specificationAttributeId === spec.specificationAttributeId && o.name === spec.valueRaw));\r\n });\r\n if (!withSeries) {\r\n product.specifications.forEach((spec) => {\r\n matches = matches.concat(selectedOptions.filter(o => spec.specificationAttributeName.toLowerCase() === 'series' && o.specificationAttributeId === spec.specificationAttributeId));\r\n });\r\n }\r\n if (matches.length === 0) {\r\n included = false;\r\n }\r\n }\r\n }\r\n })\r\n });\r\n return included;\r\n }\r\n\r\n public compareSortOptions(option1: CatalogSortOption, option2: CatalogSortOption): boolean {\r\n if (!option1 || !option2) {\r\n return false;\r\n }\r\n return option1.id === option2.id;\r\n }\r\n}\r\n","
\r\n Waiting for all products to load ...\r\n
\r\n
\r\n \r\n \r\n
\r\n 0\">Showing {{noFiltered | number:'':'en-AU' }} Product(s)\r\n Displaying Filtered Product\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n Sort By\r\n \r\n \r\n {{option.name}}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
No Product Filters Available
\r\n \r\n
\r\n 1\" [label]=\"filterName(filter)\">\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
    \r\n
  • \r\n \r\n \r\n \r\n
  • \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n","import { Directionality } from '@angular/cdk/bidi';\nimport { _VIEW_REPEATER_STRATEGY, _RecycleViewRepeaterStrategy, isDataSource, _ViewRepeaterOperation, _DisposeViewRepeaterStrategy } from '@angular/cdk/collections';\nconst _c0 = [[[\"caption\"]], [[\"colgroup\"], [\"col\"]], \"*\"];\nconst _c1 = [\"caption\", \"colgroup, col\", \"*\"];\nfunction CdkTable_Conditional_2_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵprojection(0, 2);\n }\n}\nfunction CdkTable_Conditional_3_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"thead\", 0);\n i0.ɵɵelementContainer(1, 1);\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(2, \"tbody\", 0);\n i0.ɵɵelementContainer(3, 2)(4, 3);\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(5, \"tfoot\", 0);\n i0.ɵɵelementContainer(6, 4);\n i0.ɵɵelementEnd();\n }\n}\nfunction CdkTable_Conditional_4_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementContainer(0, 1)(1, 2)(2, 3)(3, 4);\n }\n}\nfunction CdkTextColumn_th_1_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"th\", 3);\n i0.ɵɵtext(1);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n const ctx_r0 = i0.ɵɵnextContext();\n i0.ɵɵstyleProp(\"text-align\", ctx_r0.justify);\n i0.ɵɵadvance();\n i0.ɵɵtextInterpolate1(\" \", ctx_r0.headerText, \" \");\n }\n}\nfunction CdkTextColumn_td_2_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"td\", 4);\n i0.ɵɵtext(1);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n const data_r2 = ctx.$implicit;\n const ctx_r0 = i0.ɵɵnextContext();\n i0.ɵɵstyleProp(\"text-align\", ctx_r0.justify);\n i0.ɵɵadvance();\n i0.ɵɵtextInterpolate1(\" \", ctx_r0.dataAccessor(data_r2, ctx_r0.name), \" \");\n }\n}\nexport { DataSource } from '@angular/cdk/collections';\nimport { Platform } from '@angular/cdk/platform';\nimport { ViewportRuler, ScrollingModule } from '@angular/cdk/scrolling';\nimport { DOCUMENT } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, inject, TemplateRef, Directive, booleanAttribute, Input, ContentChild, ElementRef, NgZone, Injectable, IterableDiffers, ViewContainerRef, Component, ChangeDetectionStrategy, ViewEncapsulation, afterNextRender, EmbeddedViewRef, ChangeDetectorRef, EventEmitter, Injector, HostAttributeToken, Output, ContentChildren, ViewChild, NgModule } from '@angular/core';\nimport { Subject, BehaviorSubject, isObservable, of } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\n\n/**\n * Used to provide a table to some of the sub-components without causing a circular dependency.\n * @docs-private\n */\nconst CDK_TABLE = /*#__PURE__*/new InjectionToken('CDK_TABLE');\n/** Injection token that can be used to specify the text column options. */\nconst TEXT_COLUMN_OPTIONS = /*#__PURE__*/new InjectionToken('text-column-options');\n\n/**\n * Cell definition for a CDK table.\n * Captures the template of a column's data row cell as well as cell-specific properties.\n */\nlet CdkCellDef = /*#__PURE__*/(() => {\n class CdkCellDef {\n /** @docs-private */\n template = inject(TemplateRef);\n constructor() {}\n static ɵfac = function CdkCellDef_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkCellDef)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkCellDef,\n selectors: [[\"\", \"cdkCellDef\", \"\"]]\n });\n }\n return CdkCellDef;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Header cell definition for a CDK table.\n * Captures the template of a column's header cell and as well as cell-specific properties.\n */\nlet CdkHeaderCellDef = /*#__PURE__*/(() => {\n class CdkHeaderCellDef {\n /** @docs-private */\n template = inject(TemplateRef);\n constructor() {}\n static ɵfac = function CdkHeaderCellDef_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkHeaderCellDef)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkHeaderCellDef,\n selectors: [[\"\", \"cdkHeaderCellDef\", \"\"]]\n });\n }\n return CdkHeaderCellDef;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Footer cell definition for a CDK table.\n * Captures the template of a column's footer cell and as well as cell-specific properties.\n */\nlet CdkFooterCellDef = /*#__PURE__*/(() => {\n class CdkFooterCellDef {\n /** @docs-private */\n template = inject(TemplateRef);\n constructor() {}\n static ɵfac = function CdkFooterCellDef_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkFooterCellDef)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkFooterCellDef,\n selectors: [[\"\", \"cdkFooterCellDef\", \"\"]]\n });\n }\n return CdkFooterCellDef;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Column definition for the CDK table.\n * Defines a set of cells available for a table column.\n */\nlet CdkColumnDef = /*#__PURE__*/(() => {\n class CdkColumnDef {\n _table = inject(CDK_TABLE, {\n optional: true\n });\n _hasStickyChanged = false;\n /** Unique name for this column. */\n get name() {\n return this._name;\n }\n set name(name) {\n this._setNameInput(name);\n }\n _name;\n /** Whether the cell is sticky. */\n get sticky() {\n return this._sticky;\n }\n set sticky(value) {\n if (value !== this._sticky) {\n this._sticky = value;\n this._hasStickyChanged = true;\n }\n }\n _sticky = false;\n /**\n * Whether this column should be sticky positioned on the end of the row. Should make sure\n * that it mimics the `CanStick` mixin such that `_hasStickyChanged` is set to true if the value\n * has been changed.\n */\n get stickyEnd() {\n return this._stickyEnd;\n }\n set stickyEnd(value) {\n if (value !== this._stickyEnd) {\n this._stickyEnd = value;\n this._hasStickyChanged = true;\n }\n }\n _stickyEnd = false;\n /** @docs-private */\n cell;\n /** @docs-private */\n headerCell;\n /** @docs-private */\n footerCell;\n /**\n * Transformed version of the column name that can be used as part of a CSS classname. Excludes\n * all non-alphanumeric characters and the special characters '-' and '_'. Any characters that\n * do not match are replaced by the '-' character.\n */\n cssClassFriendlyName;\n /**\n * Class name for cells in this column.\n * @docs-private\n */\n _columnCssClassName;\n constructor() {}\n /** Whether the sticky state has changed. */\n hasStickyChanged() {\n const hasStickyChanged = this._hasStickyChanged;\n this.resetStickyChanged();\n return hasStickyChanged;\n }\n /** Resets the sticky changed state. */\n resetStickyChanged() {\n this._hasStickyChanged = false;\n }\n /**\n * Overridable method that sets the css classes that will be added to every cell in this\n * column.\n * In the future, columnCssClassName will change from type string[] to string and this\n * will set a single string value.\n * @docs-private\n */\n _updateColumnCssClassName() {\n this._columnCssClassName = [`cdk-column-${this.cssClassFriendlyName}`];\n }\n /**\n * This has been extracted to a util because of TS 4 and VE.\n * View Engine doesn't support property rename inheritance.\n * TS 4.0 doesn't allow properties to override accessors or vice-versa.\n * @docs-private\n */\n _setNameInput(value) {\n // If the directive is set without a name (updated programmatically), then this setter will\n // trigger with an empty string and should not overwrite the programmatically set value.\n if (value) {\n this._name = value;\n this.cssClassFriendlyName = value.replace(/[^a-z0-9_-]/gi, '-');\n this._updateColumnCssClassName();\n }\n }\n static ɵfac = function CdkColumnDef_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkColumnDef)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkColumnDef,\n selectors: [[\"\", \"cdkColumnDef\", \"\"]],\n contentQueries: function CdkColumnDef_ContentQueries(rf, ctx, dirIndex) {\n if (rf & 1) {\n i0.ɵɵcontentQuery(dirIndex, CdkCellDef, 5);\n i0.ɵɵcontentQuery(dirIndex, CdkHeaderCellDef, 5);\n i0.ɵɵcontentQuery(dirIndex, CdkFooterCellDef, 5);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.cell = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.headerCell = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.footerCell = _t.first);\n }\n },\n inputs: {\n name: [0, \"cdkColumnDef\", \"name\"],\n sticky: [2, \"sticky\", \"sticky\", booleanAttribute],\n stickyEnd: [2, \"stickyEnd\", \"stickyEnd\", booleanAttribute]\n },\n features: [i0.ɵɵProvidersFeature([{\n provide: 'MAT_SORT_HEADER_COLUMN_DEF',\n useExisting: CdkColumnDef\n }])]\n });\n }\n return CdkColumnDef;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Base class for the cells. Adds a CSS classname that identifies the column it renders in. */\nclass BaseCdkCell {\n constructor(columnDef, elementRef) {\n elementRef.nativeElement.classList.add(...columnDef._columnCssClassName);\n }\n}\n/** Header cell template container that adds the right classes and role. */\nlet CdkHeaderCell = /*#__PURE__*/(() => {\n class CdkHeaderCell extends BaseCdkCell {\n constructor() {\n super(inject(CdkColumnDef), inject(ElementRef));\n }\n static ɵfac = function CdkHeaderCell_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkHeaderCell)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkHeaderCell,\n selectors: [[\"cdk-header-cell\"], [\"th\", \"cdk-header-cell\", \"\"]],\n hostAttrs: [\"role\", \"columnheader\", 1, \"cdk-header-cell\"],\n features: [i0.ɵɵInheritDefinitionFeature]\n });\n }\n return CdkHeaderCell;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Footer cell template container that adds the right classes and role. */\nlet CdkFooterCell = /*#__PURE__*/(() => {\n class CdkFooterCell extends BaseCdkCell {\n constructor() {\n const columnDef = inject(CdkColumnDef);\n const elementRef = inject(ElementRef);\n super(columnDef, elementRef);\n const role = columnDef._table?._getCellRole();\n if (role) {\n elementRef.nativeElement.setAttribute('role', role);\n }\n }\n static ɵfac = function CdkFooterCell_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkFooterCell)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkFooterCell,\n selectors: [[\"cdk-footer-cell\"], [\"td\", \"cdk-footer-cell\", \"\"]],\n hostAttrs: [1, \"cdk-footer-cell\"],\n features: [i0.ɵɵInheritDefinitionFeature]\n });\n }\n return CdkFooterCell;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Cell template container that adds the right classes and role. */\nlet CdkCell = /*#__PURE__*/(() => {\n class CdkCell extends BaseCdkCell {\n constructor() {\n const columnDef = inject(CdkColumnDef);\n const elementRef = inject(ElementRef);\n super(columnDef, elementRef);\n const role = columnDef._table?._getCellRole();\n if (role) {\n elementRef.nativeElement.setAttribute('role', role);\n }\n }\n static ɵfac = function CdkCell_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkCell)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkCell,\n selectors: [[\"cdk-cell\"], [\"td\", \"cdk-cell\", \"\"]],\n hostAttrs: [1, \"cdk-cell\"],\n features: [i0.ɵɵInheritDefinitionFeature]\n });\n }\n return CdkCell;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * @docs-private\n */\nclass _Schedule {\n tasks = [];\n endTasks = [];\n}\n/** Injection token used to provide a coalesced style scheduler. */\nconst _COALESCED_STYLE_SCHEDULER = /*#__PURE__*/new InjectionToken('_COALESCED_STYLE_SCHEDULER');\n/**\n * Allows grouping up CSSDom mutations after the current execution context.\n * This can significantly improve performance when separate consecutive functions are\n * reading from the CSSDom and then mutating it.\n *\n * @docs-private\n */\nlet _CoalescedStyleScheduler = /*#__PURE__*/(() => {\n class _CoalescedStyleScheduler {\n _currentSchedule = null;\n _ngZone = inject(NgZone);\n constructor() {}\n /**\n * Schedules the specified task to run at the end of the current VM turn.\n */\n schedule(task) {\n this._createScheduleIfNeeded();\n this._currentSchedule.tasks.push(task);\n }\n /**\n * Schedules the specified task to run after other scheduled tasks at the end of the current\n * VM turn.\n */\n scheduleEnd(task) {\n this._createScheduleIfNeeded();\n this._currentSchedule.endTasks.push(task);\n }\n _createScheduleIfNeeded() {\n if (this._currentSchedule) {\n return;\n }\n this._currentSchedule = new _Schedule();\n this._ngZone.runOutsideAngular(() =>\n // TODO(mmalerba): Scheduling this using something that runs less frequently\n // (e.g. requestAnimationFrame, setTimeout, etc.) causes noticeable jank with the column\n // resizer. We should audit the usages of schedule / scheduleEnd in that component and see\n // if we can refactor it so that we don't need to flush the tasks quite so frequently.\n queueMicrotask(() => {\n while (this._currentSchedule.tasks.length || this._currentSchedule.endTasks.length) {\n const schedule = this._currentSchedule;\n // Capture new tasks scheduled by the current set of tasks.\n this._currentSchedule = new _Schedule();\n for (const task of schedule.tasks) {\n task();\n }\n for (const task of schedule.endTasks) {\n task();\n }\n }\n this._currentSchedule = null;\n }));\n }\n static ɵfac = function _CoalescedStyleScheduler_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || _CoalescedStyleScheduler)();\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: _CoalescedStyleScheduler,\n factory: _CoalescedStyleScheduler.ɵfac\n });\n }\n return _CoalescedStyleScheduler;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * The row template that can be used by the mat-table. Should not be used outside of the\n * material library.\n */\nconst CDK_ROW_TEMPLATE = ``;\n/**\n * Base class for the CdkHeaderRowDef and CdkRowDef that handles checking their columns inputs\n * for changes and notifying the table.\n */\nlet BaseRowDef = /*#__PURE__*/(() => {\n class BaseRowDef {\n template = inject(TemplateRef);\n _differs = inject(IterableDiffers);\n /** The columns to be displayed on this row. */\n columns;\n /** Differ used to check if any changes were made to the columns. */\n _columnsDiffer;\n constructor() {}\n ngOnChanges(changes) {\n // Create a new columns differ if one does not yet exist. Initialize it based on initial value\n // of the columns property or an empty array if none is provided.\n if (!this._columnsDiffer) {\n const columns = changes['columns'] && changes['columns'].currentValue || [];\n this._columnsDiffer = this._differs.find(columns).create();\n this._columnsDiffer.diff(columns);\n }\n }\n /**\n * Returns the difference between the current columns and the columns from the last diff, or null\n * if there is no difference.\n */\n getColumnsDiff() {\n return this._columnsDiffer.diff(this.columns);\n }\n /** Gets this row def's relevant cell template from the provided column def. */\n extractCellTemplate(column) {\n if (this instanceof CdkHeaderRowDef) {\n return column.headerCell.template;\n }\n if (this instanceof CdkFooterRowDef) {\n return column.footerCell.template;\n } else {\n return column.cell.template;\n }\n }\n static ɵfac = function BaseRowDef_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || BaseRowDef)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: BaseRowDef,\n features: [i0.ɵɵNgOnChangesFeature]\n });\n }\n return BaseRowDef;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Header row definition for the CDK table.\n * Captures the header row's template and other header properties such as the columns to display.\n */\nlet CdkHeaderRowDef = /*#__PURE__*/(() => {\n class CdkHeaderRowDef extends BaseRowDef {\n _table = inject(CDK_TABLE, {\n optional: true\n });\n _hasStickyChanged = false;\n /** Whether the row is sticky. */\n get sticky() {\n return this._sticky;\n }\n set sticky(value) {\n if (value !== this._sticky) {\n this._sticky = value;\n this._hasStickyChanged = true;\n }\n }\n _sticky = false;\n constructor() {\n super(inject(TemplateRef), inject(IterableDiffers));\n }\n // Prerender fails to recognize that ngOnChanges in a part of this class through inheritance.\n // Explicitly define it so that the method is called as part of the Angular lifecycle.\n ngOnChanges(changes) {\n super.ngOnChanges(changes);\n }\n /** Whether the sticky state has changed. */\n hasStickyChanged() {\n const hasStickyChanged = this._hasStickyChanged;\n this.resetStickyChanged();\n return hasStickyChanged;\n }\n /** Resets the sticky changed state. */\n resetStickyChanged() {\n this._hasStickyChanged = false;\n }\n static ɵfac = function CdkHeaderRowDef_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkHeaderRowDef)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkHeaderRowDef,\n selectors: [[\"\", \"cdkHeaderRowDef\", \"\"]],\n inputs: {\n columns: [0, \"cdkHeaderRowDef\", \"columns\"],\n sticky: [2, \"cdkHeaderRowDefSticky\", \"sticky\", booleanAttribute]\n },\n features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature]\n });\n }\n return CdkHeaderRowDef;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Footer row definition for the CDK table.\n * Captures the footer row's template and other footer properties such as the columns to display.\n */\nlet CdkFooterRowDef = /*#__PURE__*/(() => {\n class CdkFooterRowDef extends BaseRowDef {\n _table = inject(CDK_TABLE, {\n optional: true\n });\n _hasStickyChanged = false;\n /** Whether the row is sticky. */\n get sticky() {\n return this._sticky;\n }\n set sticky(value) {\n if (value !== this._sticky) {\n this._sticky = value;\n this._hasStickyChanged = true;\n }\n }\n _sticky = false;\n constructor() {\n super(inject(TemplateRef), inject(IterableDiffers));\n }\n // Prerender fails to recognize that ngOnChanges in a part of this class through inheritance.\n // Explicitly define it so that the method is called as part of the Angular lifecycle.\n ngOnChanges(changes) {\n super.ngOnChanges(changes);\n }\n /** Whether the sticky state has changed. */\n hasStickyChanged() {\n const hasStickyChanged = this._hasStickyChanged;\n this.resetStickyChanged();\n return hasStickyChanged;\n }\n /** Resets the sticky changed state. */\n resetStickyChanged() {\n this._hasStickyChanged = false;\n }\n static ɵfac = function CdkFooterRowDef_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkFooterRowDef)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkFooterRowDef,\n selectors: [[\"\", \"cdkFooterRowDef\", \"\"]],\n inputs: {\n columns: [0, \"cdkFooterRowDef\", \"columns\"],\n sticky: [2, \"cdkFooterRowDefSticky\", \"sticky\", booleanAttribute]\n },\n features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature]\n });\n }\n return CdkFooterRowDef;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Data row definition for the CDK table.\n * Captures the header row's template and other row properties such as the columns to display and\n * a when predicate that describes when this row should be used.\n */\nlet CdkRowDef = /*#__PURE__*/(() => {\n class CdkRowDef extends BaseRowDef {\n _table = inject(CDK_TABLE, {\n optional: true\n });\n /**\n * Function that should return true if this row template should be used for the provided index\n * and row data. If left undefined, this row will be considered the default row template to use\n * when no other when functions return true for the data.\n * For every row, there must be at least one when function that passes or an undefined to default.\n */\n when;\n constructor() {\n // TODO(andrewseguin): Add an input for providing a switch function to determine\n // if this template should be used.\n super(inject(TemplateRef), inject(IterableDiffers));\n }\n static ɵfac = function CdkRowDef_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkRowDef)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkRowDef,\n selectors: [[\"\", \"cdkRowDef\", \"\"]],\n inputs: {\n columns: [0, \"cdkRowDefColumns\", \"columns\"],\n when: [0, \"cdkRowDefWhen\", \"when\"]\n },\n features: [i0.ɵɵInheritDefinitionFeature]\n });\n }\n return CdkRowDef;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Outlet for rendering cells inside of a row or header row.\n * @docs-private\n */\nlet CdkCellOutlet = /*#__PURE__*/(() => {\n class CdkCellOutlet {\n _viewContainer = inject(ViewContainerRef);\n /** The ordered list of cells to render within this outlet's view container */\n cells;\n /** The data context to be provided to each cell */\n context;\n /**\n * Static property containing the latest constructed instance of this class.\n * Used by the CDK table when each CdkHeaderRow and CdkRow component is created using\n * createEmbeddedView. After one of these components are created, this property will provide\n * a handle to provide that component's cells and context. After init, the CdkCellOutlet will\n * construct the cells with the provided context.\n */\n static mostRecentCellOutlet = null;\n constructor() {\n CdkCellOutlet.mostRecentCellOutlet = this;\n }\n ngOnDestroy() {\n // If this was the last outlet being rendered in the view, remove the reference\n // from the static property after it has been destroyed to avoid leaking memory.\n if (CdkCellOutlet.mostRecentCellOutlet === this) {\n CdkCellOutlet.mostRecentCellOutlet = null;\n }\n }\n static ɵfac = function CdkCellOutlet_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkCellOutlet)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkCellOutlet,\n selectors: [[\"\", \"cdkCellOutlet\", \"\"]]\n });\n }\n return CdkCellOutlet;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Header template container that contains the cell outlet. Adds the right class and role. */\nlet CdkHeaderRow = /*#__PURE__*/(() => {\n class CdkHeaderRow {\n static ɵfac = function CdkHeaderRow_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkHeaderRow)();\n };\n static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: CdkHeaderRow,\n selectors: [[\"cdk-header-row\"], [\"tr\", \"cdk-header-row\", \"\"]],\n hostAttrs: [\"role\", \"row\", 1, \"cdk-header-row\"],\n decls: 1,\n vars: 0,\n consts: [[\"cdkCellOutlet\", \"\"]],\n template: function CdkHeaderRow_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementContainer(0, 0);\n }\n },\n dependencies: [CdkCellOutlet],\n encapsulation: 2\n });\n }\n return CdkHeaderRow;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Footer template container that contains the cell outlet. Adds the right class and role. */\nlet CdkFooterRow = /*#__PURE__*/(() => {\n class CdkFooterRow {\n static ɵfac = function CdkFooterRow_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkFooterRow)();\n };\n static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: CdkFooterRow,\n selectors: [[\"cdk-footer-row\"], [\"tr\", \"cdk-footer-row\", \"\"]],\n hostAttrs: [\"role\", \"row\", 1, \"cdk-footer-row\"],\n decls: 1,\n vars: 0,\n consts: [[\"cdkCellOutlet\", \"\"]],\n template: function CdkFooterRow_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementContainer(0, 0);\n }\n },\n dependencies: [CdkCellOutlet],\n encapsulation: 2\n });\n }\n return CdkFooterRow;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Data row template container that contains the cell outlet. Adds the right class and role. */\nlet CdkRow = /*#__PURE__*/(() => {\n class CdkRow {\n static ɵfac = function CdkRow_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkRow)();\n };\n static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: CdkRow,\n selectors: [[\"cdk-row\"], [\"tr\", \"cdk-row\", \"\"]],\n hostAttrs: [\"role\", \"row\", 1, \"cdk-row\"],\n decls: 1,\n vars: 0,\n consts: [[\"cdkCellOutlet\", \"\"]],\n template: function CdkRow_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementContainer(0, 0);\n }\n },\n dependencies: [CdkCellOutlet],\n encapsulation: 2\n });\n }\n return CdkRow;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Row that can be used to display a message when no data is shown in the table. */\nlet CdkNoDataRow = /*#__PURE__*/(() => {\n class CdkNoDataRow {\n templateRef = inject(TemplateRef);\n _contentClassName = 'cdk-no-data-row';\n constructor() {}\n static ɵfac = function CdkNoDataRow_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkNoDataRow)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkNoDataRow,\n selectors: [[\"ng-template\", \"cdkNoDataRow\", \"\"]]\n });\n }\n return CdkNoDataRow;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Directions that can be used when setting sticky positioning.\n * @docs-private\n */\n/**\n * List of all possible directions that can be used for sticky positioning.\n * @docs-private\n */\nconst STICKY_DIRECTIONS = ['top', 'bottom', 'left', 'right'];\n/**\n * Applies and removes sticky positioning styles to the `CdkTable` rows and columns cells.\n * @docs-private\n */\nclass StickyStyler {\n _isNativeHtmlTable;\n _stickCellCss;\n direction;\n _coalescedStyleScheduler;\n _isBrowser;\n _needsPositionStickyOnElement;\n _positionListener;\n _tableInjector;\n _elemSizeCache = /*#__PURE__*/new WeakMap();\n _resizeObserver = globalThis?.ResizeObserver ? /*#__PURE__*/new globalThis.ResizeObserver(entries => this._updateCachedSizes(entries)) : null;\n _updatedStickyColumnsParamsToReplay = [];\n _stickyColumnsReplayTimeout = null;\n _cachedCellWidths = [];\n _borderCellCss;\n _destroyed = false;\n /**\n * @param _isNativeHtmlTable Whether the sticky logic should be based on a table\n * that uses the native `` element.\n * @param _stickCellCss The CSS class that will be applied to every row/cell that has\n * sticky positioning applied.\n * @param direction The directionality context of the table (ltr/rtl); affects column positioning\n * by reversing left/right positions.\n * @param _isBrowser Whether the table is currently being rendered on the server or the client.\n * @param _needsPositionStickyOnElement Whether we need to specify position: sticky on cells\n * using inline styles. If false, it is assumed that position: sticky is included in\n * the component stylesheet for _stickCellCss.\n * @param _positionListener A listener that is notified of changes to sticky rows/columns\n * and their dimensions.\n * @param _tableInjector The table's Injector.\n */\n constructor(_isNativeHtmlTable, _stickCellCss, direction, _coalescedStyleScheduler, _isBrowser = true, _needsPositionStickyOnElement = true, _positionListener, _tableInjector) {\n this._isNativeHtmlTable = _isNativeHtmlTable;\n this._stickCellCss = _stickCellCss;\n this.direction = direction;\n this._coalescedStyleScheduler = _coalescedStyleScheduler;\n this._isBrowser = _isBrowser;\n this._needsPositionStickyOnElement = _needsPositionStickyOnElement;\n this._positionListener = _positionListener;\n this._tableInjector = _tableInjector;\n this._borderCellCss = {\n 'top': `${_stickCellCss}-border-elem-top`,\n 'bottom': `${_stickCellCss}-border-elem-bottom`,\n 'left': `${_stickCellCss}-border-elem-left`,\n 'right': `${_stickCellCss}-border-elem-right`\n };\n }\n /**\n * Clears the sticky positioning styles from the row and its cells by resetting the `position`\n * style, setting the zIndex to 0, and unsetting each provided sticky direction.\n * @param rows The list of rows that should be cleared from sticking in the provided directions\n * @param stickyDirections The directions that should no longer be set as sticky on the rows.\n */\n clearStickyPositioning(rows, stickyDirections) {\n if (stickyDirections.includes('left') || stickyDirections.includes('right')) {\n this._removeFromStickyColumnReplayQueue(rows);\n }\n const elementsToClear = [];\n for (const row of rows) {\n // If the row isn't an element (e.g. if it's an `ng-container`),\n // it won't have inline styles or `children` so we skip it.\n if (row.nodeType !== row.ELEMENT_NODE) {\n continue;\n }\n elementsToClear.push(row, ...Array.from(row.children));\n }\n // Coalesce with sticky row/column updates (and potentially other changes like column resize).\n this._afterNextRender({\n write: () => {\n for (const element of elementsToClear) {\n this._removeStickyStyle(element, stickyDirections);\n }\n }\n });\n }\n /**\n * Applies sticky left and right positions to the cells of each row according to the sticky\n * states of the rendered column definitions.\n * @param rows The rows that should have its set of cells stuck according to the sticky states.\n * @param stickyStartStates A list of boolean states where each state represents whether the cell\n * in this index position should be stuck to the start of the row.\n * @param stickyEndStates A list of boolean states where each state represents whether the cell\n * in this index position should be stuck to the end of the row.\n * @param recalculateCellWidths Whether the sticky styler should recalculate the width of each\n * column cell. If `false` cached widths will be used instead.\n * @param replay Whether to enqueue this call for replay after a ResizeObserver update.\n */\n updateStickyColumns(rows, stickyStartStates, stickyEndStates, recalculateCellWidths = true, replay = true) {\n // Don't cache any state if none of the columns are sticky.\n if (!rows.length || !this._isBrowser || !(stickyStartStates.some(state => state) || stickyEndStates.some(state => state))) {\n this._positionListener?.stickyColumnsUpdated({\n sizes: []\n });\n this._positionListener?.stickyEndColumnsUpdated({\n sizes: []\n });\n return;\n }\n // Coalesce with sticky row updates (and potentially other changes like column resize).\n const firstRow = rows[0];\n const numCells = firstRow.children.length;\n const isRtl = this.direction === 'rtl';\n const start = isRtl ? 'right' : 'left';\n const end = isRtl ? 'left' : 'right';\n const lastStickyStart = stickyStartStates.lastIndexOf(true);\n const firstStickyEnd = stickyEndStates.indexOf(true);\n let cellWidths;\n let startPositions;\n let endPositions;\n if (replay) {\n this._updateStickyColumnReplayQueue({\n rows: [...rows],\n stickyStartStates: [...stickyStartStates],\n stickyEndStates: [...stickyEndStates]\n });\n }\n this._afterNextRender({\n earlyRead: () => {\n cellWidths = this._getCellWidths(firstRow, recalculateCellWidths);\n startPositions = this._getStickyStartColumnPositions(cellWidths, stickyStartStates);\n endPositions = this._getStickyEndColumnPositions(cellWidths, stickyEndStates);\n },\n write: () => {\n for (const row of rows) {\n for (let i = 0; i < numCells; i++) {\n const cell = row.children[i];\n if (stickyStartStates[i]) {\n this._addStickyStyle(cell, start, startPositions[i], i === lastStickyStart);\n }\n if (stickyEndStates[i]) {\n this._addStickyStyle(cell, end, endPositions[i], i === firstStickyEnd);\n }\n }\n }\n if (this._positionListener && cellWidths.some(w => !!w)) {\n this._positionListener.stickyColumnsUpdated({\n sizes: lastStickyStart === -1 ? [] : cellWidths.slice(0, lastStickyStart + 1).map((width, index) => stickyStartStates[index] ? width : null)\n });\n this._positionListener.stickyEndColumnsUpdated({\n sizes: firstStickyEnd === -1 ? [] : cellWidths.slice(firstStickyEnd).map((width, index) => stickyEndStates[index + firstStickyEnd] ? width : null).reverse()\n });\n }\n }\n });\n }\n /**\n * Applies sticky positioning to the row's cells if using the native table layout, and to the\n * row itself otherwise.\n * @param rowsToStick The list of rows that should be stuck according to their corresponding\n * sticky state and to the provided top or bottom position.\n * @param stickyStates A list of boolean states where each state represents whether the row\n * should be stuck in the particular top or bottom position.\n * @param position The position direction in which the row should be stuck if that row should be\n * sticky.\n *\n */\n stickRows(rowsToStick, stickyStates, position) {\n // Since we can't measure the rows on the server, we can't stick the rows properly.\n if (!this._isBrowser) {\n return;\n }\n // If positioning the rows to the bottom, reverse their order when evaluating the sticky\n // position such that the last row stuck will be \"bottom: 0px\" and so on. Note that the\n // sticky states need to be reversed as well.\n const rows = position === 'bottom' ? rowsToStick.slice().reverse() : rowsToStick;\n const states = position === 'bottom' ? stickyStates.slice().reverse() : stickyStates;\n // Measure row heights all at once before adding sticky styles to reduce layout thrashing.\n const stickyOffsets = [];\n const stickyCellHeights = [];\n const elementsToStick = [];\n // Coalesce with other sticky row updates (top/bottom), sticky columns updates\n // (and potentially other changes like column resize).\n this._afterNextRender({\n earlyRead: () => {\n for (let rowIndex = 0, stickyOffset = 0; rowIndex < rows.length; rowIndex++) {\n if (!states[rowIndex]) {\n continue;\n }\n stickyOffsets[rowIndex] = stickyOffset;\n const row = rows[rowIndex];\n elementsToStick[rowIndex] = this._isNativeHtmlTable ? Array.from(row.children) : [row];\n const height = this._retrieveElementSize(row).height;\n stickyOffset += height;\n stickyCellHeights[rowIndex] = height;\n }\n },\n write: () => {\n const borderedRowIndex = states.lastIndexOf(true);\n for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n if (!states[rowIndex]) {\n continue;\n }\n const offset = stickyOffsets[rowIndex];\n const isBorderedRowIndex = rowIndex === borderedRowIndex;\n for (const element of elementsToStick[rowIndex]) {\n this._addStickyStyle(element, position, offset, isBorderedRowIndex);\n }\n }\n if (position === 'top') {\n this._positionListener?.stickyHeaderRowsUpdated({\n sizes: stickyCellHeights,\n offsets: stickyOffsets,\n elements: elementsToStick\n });\n } else {\n this._positionListener?.stickyFooterRowsUpdated({\n sizes: stickyCellHeights,\n offsets: stickyOffsets,\n elements: elementsToStick\n });\n }\n }\n });\n }\n /**\n * When using the native table in Safari, sticky footer cells do not stick. The only way to stick\n * footer rows is to apply sticky styling to the tfoot container. This should only be done if\n * all footer rows are sticky. If not all footer rows are sticky, remove sticky positioning from\n * the tfoot element.\n */\n updateStickyFooterContainer(tableElement, stickyStates) {\n if (!this._isNativeHtmlTable) {\n return;\n }\n // Coalesce with other sticky updates (and potentially other changes like column resize).\n this._afterNextRender({\n write: () => {\n const tfoot = tableElement.querySelector('tfoot');\n if (tfoot) {\n if (stickyStates.some(state => !state)) {\n this._removeStickyStyle(tfoot, ['bottom']);\n } else {\n this._addStickyStyle(tfoot, 'bottom', 0, false);\n }\n }\n }\n });\n }\n /** Triggered by the table's OnDestroy hook. */\n destroy() {\n if (this._stickyColumnsReplayTimeout) {\n clearTimeout(this._stickyColumnsReplayTimeout);\n }\n this._resizeObserver?.disconnect();\n this._destroyed = true;\n }\n /**\n * Removes the sticky style on the element by removing the sticky cell CSS class, re-evaluating\n * the zIndex, removing each of the provided sticky directions, and removing the\n * sticky position if there are no more directions.\n */\n _removeStickyStyle(element, stickyDirections) {\n if (!element.classList.contains(this._stickCellCss)) {\n return;\n }\n for (const dir of stickyDirections) {\n element.style[dir] = '';\n element.classList.remove(this._borderCellCss[dir]);\n }\n // If the element no longer has any more sticky directions, remove sticky positioning and\n // the sticky CSS class.\n // Short-circuit checking element.style[dir] for stickyDirections as they\n // were already removed above.\n const hasDirection = STICKY_DIRECTIONS.some(dir => stickyDirections.indexOf(dir) === -1 && element.style[dir]);\n if (hasDirection) {\n element.style.zIndex = this._getCalculatedZIndex(element);\n } else {\n // When not hasDirection, _getCalculatedZIndex will always return ''.\n element.style.zIndex = '';\n if (this._needsPositionStickyOnElement) {\n element.style.position = '';\n }\n element.classList.remove(this._stickCellCss);\n }\n }\n /**\n * Adds the sticky styling to the element by adding the sticky style class, changing position\n * to be sticky (and -webkit-sticky), setting the appropriate zIndex, and adding a sticky\n * direction and value.\n */\n _addStickyStyle(element, dir, dirValue, isBorderElement) {\n element.classList.add(this._stickCellCss);\n if (isBorderElement) {\n element.classList.add(this._borderCellCss[dir]);\n }\n element.style[dir] = `${dirValue}px`;\n element.style.zIndex = this._getCalculatedZIndex(element);\n if (this._needsPositionStickyOnElement) {\n element.style.cssText += 'position: -webkit-sticky; position: sticky; ';\n }\n }\n /**\n * Calculate what the z-index should be for the element, depending on what directions (top,\n * bottom, left, right) have been set. It should be true that elements with a top direction\n * should have the highest index since these are elements like a table header. If any of those\n * elements are also sticky in another direction, then they should appear above other elements\n * that are only sticky top (e.g. a sticky column on a sticky header). Bottom-sticky elements\n * (e.g. footer rows) should then be next in the ordering such that they are below the header\n * but above any non-sticky elements. Finally, left/right sticky elements (e.g. sticky columns)\n * should minimally increment so that they are above non-sticky elements but below top and bottom\n * elements.\n */\n _getCalculatedZIndex(element) {\n const zIndexIncrements = {\n top: 100,\n bottom: 10,\n left: 1,\n right: 1\n };\n let zIndex = 0;\n // Use `Iterable` instead of `Array` because TypeScript, as of 3.6.3,\n // loses the array generic type in the `for of`. But we *also* have to use `Array` because\n // typescript won't iterate over an `Iterable` unless you compile with `--downlevelIteration`\n for (const dir of STICKY_DIRECTIONS) {\n if (element.style[dir]) {\n zIndex += zIndexIncrements[dir];\n }\n }\n return zIndex ? `${zIndex}` : '';\n }\n /** Gets the widths for each cell in the provided row. */\n _getCellWidths(row, recalculateCellWidths = true) {\n if (!recalculateCellWidths && this._cachedCellWidths.length) {\n return this._cachedCellWidths;\n }\n const cellWidths = [];\n const firstRowCells = row.children;\n for (let i = 0; i < firstRowCells.length; i++) {\n const cell = firstRowCells[i];\n cellWidths.push(this._retrieveElementSize(cell).width);\n }\n this._cachedCellWidths = cellWidths;\n return cellWidths;\n }\n /**\n * Determines the left and right positions of each sticky column cell, which will be the\n * accumulation of all sticky column cell widths to the left and right, respectively.\n * Non-sticky cells do not need to have a value set since their positions will not be applied.\n */\n _getStickyStartColumnPositions(widths, stickyStates) {\n const positions = [];\n let nextPosition = 0;\n for (let i = 0; i < widths.length; i++) {\n if (stickyStates[i]) {\n positions[i] = nextPosition;\n nextPosition += widths[i];\n }\n }\n return positions;\n }\n /**\n * Determines the left and right positions of each sticky column cell, which will be the\n * accumulation of all sticky column cell widths to the left and right, respectively.\n * Non-sticky cells do not need to have a value set since their positions will not be applied.\n */\n _getStickyEndColumnPositions(widths, stickyStates) {\n const positions = [];\n let nextPosition = 0;\n for (let i = widths.length; i > 0; i--) {\n if (stickyStates[i]) {\n positions[i] = nextPosition;\n nextPosition += widths[i];\n }\n }\n return positions;\n }\n /**\n * Retreives the most recently observed size of the specified element from the cache, or\n * meaures it directly if not yet cached.\n */\n _retrieveElementSize(element) {\n const cachedSize = this._elemSizeCache.get(element);\n if (cachedSize) {\n return cachedSize;\n }\n const clientRect = element.getBoundingClientRect();\n const size = {\n width: clientRect.width,\n height: clientRect.height\n };\n if (!this._resizeObserver) {\n return size;\n }\n this._elemSizeCache.set(element, size);\n this._resizeObserver.observe(element, {\n box: 'border-box'\n });\n return size;\n }\n /**\n * Conditionally enqueue the requested sticky update and clear previously queued updates\n * for the same rows.\n */\n _updateStickyColumnReplayQueue(params) {\n this._removeFromStickyColumnReplayQueue(params.rows);\n // No need to replay if a flush is pending.\n if (!this._stickyColumnsReplayTimeout) {\n this._updatedStickyColumnsParamsToReplay.push(params);\n }\n }\n /** Remove updates for the specified rows from the queue. */\n _removeFromStickyColumnReplayQueue(rows) {\n const rowsSet = new Set(rows);\n for (const update of this._updatedStickyColumnsParamsToReplay) {\n update.rows = update.rows.filter(row => !rowsSet.has(row));\n }\n this._updatedStickyColumnsParamsToReplay = this._updatedStickyColumnsParamsToReplay.filter(update => !!update.rows.length);\n }\n /** Update _elemSizeCache with the observed sizes. */\n _updateCachedSizes(entries) {\n let needsColumnUpdate = false;\n for (const entry of entries) {\n const newEntry = entry.borderBoxSize?.length ? {\n width: entry.borderBoxSize[0].inlineSize,\n height: entry.borderBoxSize[0].blockSize\n } : {\n width: entry.contentRect.width,\n height: entry.contentRect.height\n };\n if (newEntry.width !== this._elemSizeCache.get(entry.target)?.width && isCell(entry.target)) {\n needsColumnUpdate = true;\n }\n this._elemSizeCache.set(entry.target, newEntry);\n }\n if (needsColumnUpdate && this._updatedStickyColumnsParamsToReplay.length) {\n if (this._stickyColumnsReplayTimeout) {\n clearTimeout(this._stickyColumnsReplayTimeout);\n }\n this._stickyColumnsReplayTimeout = setTimeout(() => {\n if (this._destroyed) {\n return;\n }\n for (const update of this._updatedStickyColumnsParamsToReplay) {\n this.updateStickyColumns(update.rows, update.stickyStartStates, update.stickyEndStates, true, false);\n }\n this._updatedStickyColumnsParamsToReplay = [];\n this._stickyColumnsReplayTimeout = null;\n }, 0);\n }\n }\n /**\n * Invoke afterNextRender with the table's injector, falling back to CoalescedStyleScheduler\n * if the injector was not provided.\n */\n _afterNextRender(spec) {\n if (this._tableInjector) {\n afterNextRender(spec, {\n injector: this._tableInjector\n });\n } else {\n this._coalescedStyleScheduler.schedule(() => {\n spec.earlyRead?.();\n spec.write();\n });\n }\n }\n}\nfunction isCell(element) {\n return ['cdk-cell', 'cdk-header-cell', 'cdk-footer-cell'].some(klass => element.classList.contains(klass));\n}\n\n/**\n * Returns an error to be thrown when attempting to find an nonexistent column.\n * @param id Id whose lookup failed.\n * @docs-private\n */\nfunction getTableUnknownColumnError(id) {\n return Error(`Could not find column with id \"${id}\".`);\n}\n/**\n * Returns an error to be thrown when two column definitions have the same name.\n * @docs-private\n */\nfunction getTableDuplicateColumnNameError(name) {\n return Error(`Duplicate column definition name provided: \"${name}\".`);\n}\n/**\n * Returns an error to be thrown when there are multiple rows that are missing a when function.\n * @docs-private\n */\nfunction getTableMultipleDefaultRowDefsError() {\n return Error(`There can only be one default row without a when predicate function.`);\n}\n/**\n * Returns an error to be thrown when there are no matching row defs for a particular set of data.\n * @docs-private\n */\nfunction getTableMissingMatchingRowDefError(data) {\n return Error(`Could not find a matching row definition for the` + `provided row data: ${JSON.stringify(data)}`);\n}\n/**\n * Returns an error to be thrown when there is no row definitions present in the content.\n * @docs-private\n */\nfunction getTableMissingRowDefsError() {\n return Error('Missing definitions for header, footer, and row; ' + 'cannot determine which columns should be rendered.');\n}\n/**\n * Returns an error to be thrown when the data source does not match the compatible types.\n * @docs-private\n */\nfunction getTableUnknownDataSourceError() {\n return Error(`Provided data source did not match an array, Observable, or DataSource`);\n}\n/**\n * Returns an error to be thrown when the text column cannot find a parent table to inject.\n * @docs-private\n */\nfunction getTableTextColumnMissingParentTableError() {\n return Error(`Text column could not find a parent table for registration.`);\n}\n/**\n * Returns an error to be thrown when a table text column doesn't have a name.\n * @docs-private\n */\nfunction getTableTextColumnMissingNameError() {\n return Error(`Table text column must have a name.`);\n}\n\n/** The injection token used to specify the StickyPositioningListener. */\nconst STICKY_POSITIONING_LISTENER = /*#__PURE__*/new InjectionToken('CDK_SPL');\n\n/**\n * Enables the recycle view repeater strategy, which reduces rendering latency. Not compatible with\n * tables that animate rows.\n */\nlet CdkRecycleRows = /*#__PURE__*/(() => {\n class CdkRecycleRows {\n static ɵfac = function CdkRecycleRows_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkRecycleRows)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkRecycleRows,\n selectors: [[\"cdk-table\", \"recycleRows\", \"\"], [\"table\", \"cdk-table\", \"\", \"recycleRows\", \"\"]],\n features: [i0.ɵɵProvidersFeature([{\n provide: _VIEW_REPEATER_STRATEGY,\n useClass: _RecycleViewRepeaterStrategy\n }])]\n });\n }\n return CdkRecycleRows;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Provides a handle for the table to grab the view container's ng-container to insert data rows.\n * @docs-private\n */\nlet DataRowOutlet = /*#__PURE__*/(() => {\n class DataRowOutlet {\n viewContainer = inject(ViewContainerRef);\n elementRef = inject(ElementRef);\n constructor() {\n const table = inject(CDK_TABLE);\n table._rowOutlet = this;\n table._outletAssigned();\n }\n static ɵfac = function DataRowOutlet_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || DataRowOutlet)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: DataRowOutlet,\n selectors: [[\"\", \"rowOutlet\", \"\"]]\n });\n }\n return DataRowOutlet;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Provides a handle for the table to grab the view container's ng-container to insert the header.\n * @docs-private\n */\nlet HeaderRowOutlet = /*#__PURE__*/(() => {\n class HeaderRowOutlet {\n viewContainer = inject(ViewContainerRef);\n elementRef = inject(ElementRef);\n constructor() {\n const table = inject(CDK_TABLE);\n table._headerRowOutlet = this;\n table._outletAssigned();\n }\n static ɵfac = function HeaderRowOutlet_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HeaderRowOutlet)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: HeaderRowOutlet,\n selectors: [[\"\", \"headerRowOutlet\", \"\"]]\n });\n }\n return HeaderRowOutlet;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Provides a handle for the table to grab the view container's ng-container to insert the footer.\n * @docs-private\n */\nlet FooterRowOutlet = /*#__PURE__*/(() => {\n class FooterRowOutlet {\n viewContainer = inject(ViewContainerRef);\n elementRef = inject(ElementRef);\n constructor() {\n const table = inject(CDK_TABLE);\n table._footerRowOutlet = this;\n table._outletAssigned();\n }\n static ɵfac = function FooterRowOutlet_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || FooterRowOutlet)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: FooterRowOutlet,\n selectors: [[\"\", \"footerRowOutlet\", \"\"]]\n });\n }\n return FooterRowOutlet;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Provides a handle for the table to grab the view\n * container's ng-container to insert the no data row.\n * @docs-private\n */\nlet NoDataRowOutlet = /*#__PURE__*/(() => {\n class NoDataRowOutlet {\n viewContainer = inject(ViewContainerRef);\n elementRef = inject(ElementRef);\n constructor() {\n const table = inject(CDK_TABLE);\n table._noDataRowOutlet = this;\n table._outletAssigned();\n }\n static ɵfac = function NoDataRowOutlet_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || NoDataRowOutlet)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: NoDataRowOutlet,\n selectors: [[\"\", \"noDataRowOutlet\", \"\"]]\n });\n }\n return NoDataRowOutlet;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * The table template that can be used by the mat-table. Should not be used outside of the\n * material library.\n * @docs-private\n */\nconst CDK_TABLE_TEMPLATE =\n// Note that according to MDN, the `caption` element has to be projected as the **first**\n// element in the table. See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/caption\n`\n \n \n\n \n @if (_isServer) {\n \n }\n\n @if (_isNativeHtmlTable) {\n \n \n \n \n \n \n \n \n \n \n } @else {\n \n \n \n \n }\n`;\n/**\n * Class used to conveniently type the embedded view ref for rows with a context.\n * @docs-private\n */\nclass RowViewRef extends EmbeddedViewRef {}\n/**\n * A data table that can render a header row, data rows, and a footer row.\n * Uses the dataSource input to determine the data to be rendered. The data can be provided either\n * as a data array, an Observable stream that emits the data array to render, or a DataSource with a\n * connect function that will return an Observable stream that emits the data array to render.\n */\nlet CdkTable = /*#__PURE__*/(() => {\n class CdkTable {\n _differs = inject(IterableDiffers);\n _changeDetectorRef = inject(ChangeDetectorRef);\n _elementRef = inject(ElementRef);\n _dir = inject(Directionality, {\n optional: true\n });\n _platform = inject(Platform);\n _viewRepeater = inject(_VIEW_REPEATER_STRATEGY);\n _coalescedStyleScheduler = inject(_COALESCED_STYLE_SCHEDULER);\n _viewportRuler = inject(ViewportRuler);\n _stickyPositioningListener = inject(STICKY_POSITIONING_LISTENER, {\n optional: true,\n skipSelf: true\n });\n _document = inject(DOCUMENT);\n /** Latest data provided by the data source. */\n _data;\n /** Subject that emits when the component has been destroyed. */\n _onDestroy = new Subject();\n /** List of the rendered rows as identified by their `RenderRow` object. */\n _renderRows;\n /** Subscription that listens for the data provided by the data source. */\n _renderChangeSubscription;\n /**\n * Map of all the user's defined columns (header, data, and footer cell template) identified by\n * name. Collection populated by the column definitions gathered by `ContentChildren` as well as\n * any custom column definitions added to `_customColumnDefs`.\n */\n _columnDefsByName = new Map();\n /**\n * Set of all row definitions that can be used by this table. Populated by the rows gathered by\n * using `ContentChildren` as well as any custom row definitions added to `_customRowDefs`.\n */\n _rowDefs;\n /**\n * Set of all header row definitions that can be used by this table. Populated by the rows\n * gathered by using `ContentChildren` as well as any custom row definitions added to\n * `_customHeaderRowDefs`.\n */\n _headerRowDefs;\n /**\n * Set of all row definitions that can be used by this table. Populated by the rows gathered by\n * using `ContentChildren` as well as any custom row definitions added to\n * `_customFooterRowDefs`.\n */\n _footerRowDefs;\n /** Differ used to find the changes in the data provided by the data source. */\n _dataDiffer;\n /** Stores the row definition that does not have a when predicate. */\n _defaultRowDef;\n /**\n * Column definitions that were defined outside of the direct content children of the table.\n * These will be defined when, e.g., creating a wrapper around the cdkTable that has\n * column definitions as *its* content child.\n */\n _customColumnDefs = new Set();\n /**\n * Data row definitions that were defined outside of the direct content children of the table.\n * These will be defined when, e.g., creating a wrapper around the cdkTable that has\n * built-in data rows as *its* content child.\n */\n _customRowDefs = new Set();\n /**\n * Header row definitions that were defined outside of the direct content children of the table.\n * These will be defined when, e.g., creating a wrapper around the cdkTable that has\n * built-in header rows as *its* content child.\n */\n _customHeaderRowDefs = new Set();\n /**\n * Footer row definitions that were defined outside of the direct content children of the table.\n * These will be defined when, e.g., creating a wrapper around the cdkTable that has a\n * built-in footer row as *its* content child.\n */\n _customFooterRowDefs = new Set();\n /** No data row that was defined outside of the direct content children of the table. */\n _customNoDataRow;\n /**\n * Whether the header row definition has been changed. Triggers an update to the header row after\n * content is checked. Initialized as true so that the table renders the initial set of rows.\n */\n _headerRowDefChanged = true;\n /**\n * Whether the footer row definition has been changed. Triggers an update to the footer row after\n * content is checked. Initialized as true so that the table renders the initial set of rows.\n */\n _footerRowDefChanged = true;\n /**\n * Whether the sticky column styles need to be updated. Set to `true` when the visible columns\n * change.\n */\n _stickyColumnStylesNeedReset = true;\n /**\n * Whether the sticky styler should recalculate cell widths when applying sticky styles. If\n * `false`, cached values will be used instead. This is only applicable to tables with\n * {@link fixedLayout} enabled. For other tables, cell widths will always be recalculated.\n */\n _forceRecalculateCellWidths = true;\n /**\n * Cache of the latest rendered `RenderRow` objects as a map for easy retrieval when constructing\n * a new list of `RenderRow` objects for rendering rows. Since the new list is constructed with\n * the cached `RenderRow` objects when possible, the row identity is preserved when the data\n * and row template matches, which allows the `IterableDiffer` to check rows by reference\n * and understand which rows are added/moved/removed.\n *\n * Implemented as a map of maps where the first key is the `data: T` object and the second is the\n * `CdkRowDef` object. With the two keys, the cache points to a `RenderRow` object that\n * contains an array of created pairs. The array is necessary to handle cases where the data\n * array contains multiple duplicate data objects and each instantiated `RenderRow` must be\n * stored.\n */\n _cachedRenderRowsMap = new Map();\n /** Whether the table is applied to a native `
`. */\n _isNativeHtmlTable;\n /**\n * Utility class that is responsible for applying the appropriate sticky positioning styles to\n * the table's rows and cells.\n */\n _stickyStyler;\n /**\n * CSS class added to any row or cell that has sticky positioning applied. May be overridden by\n * table subclasses.\n */\n stickyCssClass = 'cdk-table-sticky';\n /**\n * Whether to manually add position: sticky to all sticky cell elements. Not needed if\n * the position is set in a selector associated with the value of stickyCssClass. May be\n * overridden by table subclasses\n */\n needsPositionStickyOnElement = true;\n /** Whether the component is being rendered on the server. */\n _isServer;\n /** Whether the no data row is currently showing anything. */\n _isShowingNoDataRow = false;\n /** Whether the table has rendered out all the outlets for the first time. */\n _hasAllOutlets = false;\n /** Whether the table is done initializing. */\n _hasInitialized = false;\n /** Aria role to apply to the table's cells based on the table's own role. */\n _getCellRole() {\n // Perform this lazily in case the table's role was updated by a directive after construction.\n if (this._cellRoleInternal === undefined) {\n // Note that we set `role=\"cell\"` even on native `td` elements,\n // because some browsers seem to require it. See #29784.\n const tableRole = this._elementRef.nativeElement.getAttribute('role');\n return tableRole === 'grid' || tableRole === 'treegrid' ? 'gridcell' : 'cell';\n }\n return this._cellRoleInternal;\n }\n _cellRoleInternal = undefined;\n /**\n * Tracking function that will be used to check the differences in data changes. Used similarly\n * to `ngFor` `trackBy` function. Optimize row operations by identifying a row based on its data\n * relative to the function to know if a row should be added/removed/moved.\n * Accepts a function that takes two parameters, `index` and `item`.\n */\n get trackBy() {\n return this._trackByFn;\n }\n set trackBy(fn) {\n if ((typeof ngDevMode === 'undefined' || ngDevMode) && fn != null && typeof fn !== 'function') {\n console.warn(`trackBy must be a function, but received ${JSON.stringify(fn)}.`);\n }\n this._trackByFn = fn;\n }\n _trackByFn;\n /**\n * The table's source of data, which can be provided in three ways (in order of complexity):\n * - Simple data array (each object represents one table row)\n * - Stream that emits a data array each time the array changes\n * - `DataSource` object that implements the connect/disconnect interface.\n *\n * If a data array is provided, the table must be notified when the array's objects are\n * added, removed, or moved. This can be done by calling the `renderRows()` function which will\n * render the diff since the last table render. If the data array reference is changed, the table\n * will automatically trigger an update to the rows.\n *\n * When providing an Observable stream, the table will trigger an update automatically when the\n * stream emits a new array of data.\n *\n * Finally, when providing a `DataSource` object, the table will use the Observable stream\n * provided by the connect function and trigger updates when that stream emits new data array\n * values. During the table's ngOnDestroy or when the data source is removed from the table, the\n * table will call the DataSource's `disconnect` function (may be useful for cleaning up any\n * subscriptions registered during the connect process).\n */\n get dataSource() {\n return this._dataSource;\n }\n set dataSource(dataSource) {\n if (this._dataSource !== dataSource) {\n this._switchDataSource(dataSource);\n }\n }\n _dataSource;\n /**\n * Whether to allow multiple rows per data object by evaluating which rows evaluate their 'when'\n * predicate to true. If `multiTemplateDataRows` is false, which is the default value, then each\n * dataobject will render the first row that evaluates its when predicate to true, in the order\n * defined in the table, or otherwise the default row which does not have a when predicate.\n */\n get multiTemplateDataRows() {\n return this._multiTemplateDataRows;\n }\n set multiTemplateDataRows(value) {\n this._multiTemplateDataRows = value;\n // In Ivy if this value is set via a static attribute (e.g.
),\n // this setter will be invoked before the row outlet has been defined hence the null check.\n if (this._rowOutlet && this._rowOutlet.viewContainer.length) {\n this._forceRenderDataRows();\n this.updateStickyColumnStyles();\n }\n }\n _multiTemplateDataRows = false;\n /**\n * Whether to use a fixed table layout. Enabling this option will enforce consistent column widths\n * and optimize rendering sticky styles for native tables. No-op for flex tables.\n */\n get fixedLayout() {\n return this._fixedLayout;\n }\n set fixedLayout(value) {\n this._fixedLayout = value;\n // Toggling `fixedLayout` may change column widths. Sticky column styles should be recalculated.\n this._forceRecalculateCellWidths = true;\n this._stickyColumnStylesNeedReset = true;\n }\n _fixedLayout = false;\n /**\n * Emits when the table completes rendering a set of data rows based on the latest data from the\n * data source, even if the set of rows is empty.\n */\n contentChanged = new EventEmitter();\n // TODO(andrewseguin): Remove max value as the end index\n // and instead calculate the view on init and scroll.\n /**\n * Stream containing the latest information on what rows are being displayed on screen.\n * Can be used by the data source to as a heuristic of what data should be provided.\n *\n * @docs-private\n */\n viewChange = new BehaviorSubject({\n start: 0,\n end: Number.MAX_VALUE\n });\n // Outlets in the table's template where the header, data rows, and footer will be inserted.\n _rowOutlet;\n _headerRowOutlet;\n _footerRowOutlet;\n _noDataRowOutlet;\n /**\n * The column definitions provided by the user that contain what the header, data, and footer\n * cells should render for each column.\n */\n _contentColumnDefs;\n /** Set of data row definitions that were provided to the table as content children. */\n _contentRowDefs;\n /** Set of header row definitions that were provided to the table as content children. */\n _contentHeaderRowDefs;\n /** Set of footer row definitions that were provided to the table as content children. */\n _contentFooterRowDefs;\n /** Row definition that will only be rendered if there's no data in the table. */\n _noDataRow;\n _injector = inject(Injector);\n constructor() {\n const role = inject(new HostAttributeToken('role'), {\n optional: true\n });\n if (!role) {\n this._elementRef.nativeElement.setAttribute('role', 'table');\n }\n this._isServer = !this._platform.isBrowser;\n this._isNativeHtmlTable = this._elementRef.nativeElement.nodeName === 'TABLE';\n }\n ngOnInit() {\n this._setupStickyStyler();\n // Set up the trackBy function so that it uses the `RenderRow` as its identity by default. If\n // the user has provided a custom trackBy, return the result of that function as evaluated\n // with the values of the `RenderRow`'s data and index.\n this._dataDiffer = this._differs.find([]).create((_i, dataRow) => {\n return this.trackBy ? this.trackBy(dataRow.dataIndex, dataRow.data) : dataRow;\n });\n this._viewportRuler.change().pipe(takeUntil(this._onDestroy)).subscribe(() => {\n this._forceRecalculateCellWidths = true;\n });\n }\n ngAfterContentInit() {\n this._hasInitialized = true;\n }\n ngAfterContentChecked() {\n // Only start re-rendering in `ngAfterContentChecked` after the first render.\n if (this._canRender()) {\n this._render();\n }\n }\n ngOnDestroy() {\n this._stickyStyler?.destroy();\n [this._rowOutlet?.viewContainer, this._headerRowOutlet?.viewContainer, this._footerRowOutlet?.viewContainer, this._cachedRenderRowsMap, this._customColumnDefs, this._customRowDefs, this._customHeaderRowDefs, this._customFooterRowDefs, this._columnDefsByName].forEach(def => {\n def?.clear();\n });\n this._headerRowDefs = [];\n this._footerRowDefs = [];\n this._defaultRowDef = null;\n this._onDestroy.next();\n this._onDestroy.complete();\n if (isDataSource(this.dataSource)) {\n this.dataSource.disconnect(this);\n }\n }\n /**\n * Renders rows based on the table's latest set of data, which was either provided directly as an\n * input or retrieved through an Observable stream (directly or from a DataSource).\n * Checks for differences in the data since the last diff to perform only the necessary\n * changes (add/remove/move rows).\n *\n * If the table's data source is a DataSource or Observable, this will be invoked automatically\n * each time the provided Observable stream emits a new data array. Otherwise if your data is\n * an array, this function will need to be called to render any changes.\n */\n renderRows() {\n this._renderRows = this._getAllRenderRows();\n const changes = this._dataDiffer.diff(this._renderRows);\n if (!changes) {\n this._updateNoDataRow();\n this.contentChanged.next();\n return;\n }\n const viewContainer = this._rowOutlet.viewContainer;\n this._viewRepeater.applyChanges(changes, viewContainer, (record, _adjustedPreviousIndex, currentIndex) => this._getEmbeddedViewArgs(record.item, currentIndex), record => record.item.data, change => {\n if (change.operation === _ViewRepeaterOperation.INSERTED && change.context) {\n this._renderCellTemplateForItem(change.record.item.rowDef, change.context);\n }\n });\n // Update the meta context of a row's context data (index, count, first, last, ...)\n this._updateRowIndexContext();\n // Update rows that did not get added/removed/moved but may have had their identity changed,\n // e.g. if trackBy matched data on some property but the actual data reference changed.\n changes.forEachIdentityChange(record => {\n const rowView = viewContainer.get(record.currentIndex);\n rowView.context.$implicit = record.item.data;\n });\n this._updateNoDataRow();\n this.contentChanged.next();\n this.updateStickyColumnStyles();\n }\n /** Adds a column definition that was not included as part of the content children. */\n addColumnDef(columnDef) {\n this._customColumnDefs.add(columnDef);\n }\n /** Removes a column definition that was not included as part of the content children. */\n removeColumnDef(columnDef) {\n this._customColumnDefs.delete(columnDef);\n }\n /** Adds a row definition that was not included as part of the content children. */\n addRowDef(rowDef) {\n this._customRowDefs.add(rowDef);\n }\n /** Removes a row definition that was not included as part of the content children. */\n removeRowDef(rowDef) {\n this._customRowDefs.delete(rowDef);\n }\n /** Adds a header row definition that was not included as part of the content children. */\n addHeaderRowDef(headerRowDef) {\n this._customHeaderRowDefs.add(headerRowDef);\n this._headerRowDefChanged = true;\n }\n /** Removes a header row definition that was not included as part of the content children. */\n removeHeaderRowDef(headerRowDef) {\n this._customHeaderRowDefs.delete(headerRowDef);\n this._headerRowDefChanged = true;\n }\n /** Adds a footer row definition that was not included as part of the content children. */\n addFooterRowDef(footerRowDef) {\n this._customFooterRowDefs.add(footerRowDef);\n this._footerRowDefChanged = true;\n }\n /** Removes a footer row definition that was not included as part of the content children. */\n removeFooterRowDef(footerRowDef) {\n this._customFooterRowDefs.delete(footerRowDef);\n this._footerRowDefChanged = true;\n }\n /** Sets a no data row definition that was not included as a part of the content children. */\n setNoDataRow(noDataRow) {\n this._customNoDataRow = noDataRow;\n }\n /**\n * Updates the header sticky styles. First resets all applied styles with respect to the cells\n * sticking to the top. Then, evaluating which cells need to be stuck to the top. This is\n * automatically called when the header row changes its displayed set of columns, or if its\n * sticky input changes. May be called manually for cases where the cell content changes outside\n * of these events.\n */\n updateStickyHeaderRowStyles() {\n const headerRows = this._getRenderedRows(this._headerRowOutlet);\n // Hide the thead element if there are no header rows. This is necessary to satisfy\n // overzealous a11y checkers that fail because the `rowgroup` element does not contain\n // required child `row`.\n if (this._isNativeHtmlTable) {\n const thead = closestTableSection(this._headerRowOutlet, 'thead');\n if (thead) {\n thead.style.display = headerRows.length ? '' : 'none';\n }\n }\n const stickyStates = this._headerRowDefs.map(def => def.sticky);\n this._stickyStyler.clearStickyPositioning(headerRows, ['top']);\n this._stickyStyler.stickRows(headerRows, stickyStates, 'top');\n // Reset the dirty state of the sticky input change since it has been used.\n this._headerRowDefs.forEach(def => def.resetStickyChanged());\n }\n /**\n * Updates the footer sticky styles. First resets all applied styles with respect to the cells\n * sticking to the bottom. Then, evaluating which cells need to be stuck to the bottom. This is\n * automatically called when the footer row changes its displayed set of columns, or if its\n * sticky input changes. May be called manually for cases where the cell content changes outside\n * of these events.\n */\n updateStickyFooterRowStyles() {\n const footerRows = this._getRenderedRows(this._footerRowOutlet);\n // Hide the tfoot element if there are no footer rows. This is necessary to satisfy\n // overzealous a11y checkers that fail because the `rowgroup` element does not contain\n // required child `row`.\n if (this._isNativeHtmlTable) {\n const tfoot = closestTableSection(this._footerRowOutlet, 'tfoot');\n if (tfoot) {\n tfoot.style.display = footerRows.length ? '' : 'none';\n }\n }\n const stickyStates = this._footerRowDefs.map(def => def.sticky);\n this._stickyStyler.clearStickyPositioning(footerRows, ['bottom']);\n this._stickyStyler.stickRows(footerRows, stickyStates, 'bottom');\n this._stickyStyler.updateStickyFooterContainer(this._elementRef.nativeElement, stickyStates);\n // Reset the dirty state of the sticky input change since it has been used.\n this._footerRowDefs.forEach(def => def.resetStickyChanged());\n }\n /**\n * Updates the column sticky styles. First resets all applied styles with respect to the cells\n * sticking to the left and right. Then sticky styles are added for the left and right according\n * to the column definitions for each cell in each row. This is automatically called when\n * the data source provides a new set of data or when a column definition changes its sticky\n * input. May be called manually for cases where the cell content changes outside of these events.\n */\n updateStickyColumnStyles() {\n const headerRows = this._getRenderedRows(this._headerRowOutlet);\n const dataRows = this._getRenderedRows(this._rowOutlet);\n const footerRows = this._getRenderedRows(this._footerRowOutlet);\n // For tables not using a fixed layout, the column widths may change when new rows are rendered.\n // In a table using a fixed layout, row content won't affect column width, so sticky styles\n // don't need to be cleared unless either the sticky column config changes or one of the row\n // defs change.\n if (this._isNativeHtmlTable && !this._fixedLayout || this._stickyColumnStylesNeedReset) {\n // Clear the left and right positioning from all columns in the table across all rows since\n // sticky columns span across all table sections (header, data, footer)\n this._stickyStyler.clearStickyPositioning([...headerRows, ...dataRows, ...footerRows], ['left', 'right']);\n this._stickyColumnStylesNeedReset = false;\n }\n // Update the sticky styles for each header row depending on the def's sticky state\n headerRows.forEach((headerRow, i) => {\n this._addStickyColumnStyles([headerRow], this._headerRowDefs[i]);\n });\n // Update the sticky styles for each data row depending on its def's sticky state\n this._rowDefs.forEach(rowDef => {\n // Collect all the rows rendered with this row definition.\n const rows = [];\n for (let i = 0; i < dataRows.length; i++) {\n if (this._renderRows[i].rowDef === rowDef) {\n rows.push(dataRows[i]);\n }\n }\n this._addStickyColumnStyles(rows, rowDef);\n });\n // Update the sticky styles for each footer row depending on the def's sticky state\n footerRows.forEach((footerRow, i) => {\n this._addStickyColumnStyles([footerRow], this._footerRowDefs[i]);\n });\n // Reset the dirty state of the sticky input change since it has been used.\n Array.from(this._columnDefsByName.values()).forEach(def => def.resetStickyChanged());\n }\n /** Invoked whenever an outlet is created and has been assigned to the table. */\n _outletAssigned() {\n // Trigger the first render once all outlets have been assigned. We do it this way, as\n // opposed to waiting for the next `ngAfterContentChecked`, because we don't know when\n // the next change detection will happen.\n // Also we can't use queries to resolve the outlets, because they're wrapped in a\n // conditional, so we have to rely on them being assigned via DI.\n if (!this._hasAllOutlets && this._rowOutlet && this._headerRowOutlet && this._footerRowOutlet && this._noDataRowOutlet) {\n this._hasAllOutlets = true;\n // In some setups this may fire before `ngAfterContentInit`\n // so we need a check here. See #28538.\n if (this._canRender()) {\n this._render();\n }\n }\n }\n /** Whether the table has all the information to start rendering. */\n _canRender() {\n return this._hasAllOutlets && this._hasInitialized;\n }\n /** Renders the table if its state has changed. */\n _render() {\n // Cache the row and column definitions gathered by ContentChildren and programmatic injection.\n this._cacheRowDefs();\n this._cacheColumnDefs();\n // Make sure that the user has at least added header, footer, or data row def.\n if (!this._headerRowDefs.length && !this._footerRowDefs.length && !this._rowDefs.length && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getTableMissingRowDefsError();\n }\n // Render updates if the list of columns have been changed for the header, row, or footer defs.\n const columnsChanged = this._renderUpdatedColumns();\n const rowDefsChanged = columnsChanged || this._headerRowDefChanged || this._footerRowDefChanged;\n // Ensure sticky column styles are reset if set to `true` elsewhere.\n this._stickyColumnStylesNeedReset = this._stickyColumnStylesNeedReset || rowDefsChanged;\n this._forceRecalculateCellWidths = rowDefsChanged;\n // If the header row definition has been changed, trigger a render to the header row.\n if (this._headerRowDefChanged) {\n this._forceRenderHeaderRows();\n this._headerRowDefChanged = false;\n }\n // If the footer row definition has been changed, trigger a render to the footer row.\n if (this._footerRowDefChanged) {\n this._forceRenderFooterRows();\n this._footerRowDefChanged = false;\n }\n // If there is a data source and row definitions, connect to the data source unless a\n // connection has already been made.\n if (this.dataSource && this._rowDefs.length > 0 && !this._renderChangeSubscription) {\n this._observeRenderChanges();\n } else if (this._stickyColumnStylesNeedReset) {\n // In the above case, _observeRenderChanges will result in updateStickyColumnStyles being\n // called when it row data arrives. Otherwise, we need to call it proactively.\n this.updateStickyColumnStyles();\n }\n this._checkStickyStates();\n }\n /**\n * Get the list of RenderRow objects to render according to the current list of data and defined\n * row definitions. If the previous list already contained a particular pair, it should be reused\n * so that the differ equates their references.\n */\n _getAllRenderRows() {\n const renderRows = [];\n // Store the cache and create a new one. Any re-used RenderRow objects will be moved into the\n // new cache while unused ones can be picked up by garbage collection.\n const prevCachedRenderRows = this._cachedRenderRowsMap;\n this._cachedRenderRowsMap = new Map();\n // For each data object, get the list of rows that should be rendered, represented by the\n // respective `RenderRow` object which is the pair of `data` and `CdkRowDef`.\n for (let i = 0; i < this._data.length; i++) {\n let data = this._data[i];\n const renderRowsForData = this._getRenderRowsForData(data, i, prevCachedRenderRows.get(data));\n if (!this._cachedRenderRowsMap.has(data)) {\n this._cachedRenderRowsMap.set(data, new WeakMap());\n }\n for (let j = 0; j < renderRowsForData.length; j++) {\n let renderRow = renderRowsForData[j];\n const cache = this._cachedRenderRowsMap.get(renderRow.data);\n if (cache.has(renderRow.rowDef)) {\n cache.get(renderRow.rowDef).push(renderRow);\n } else {\n cache.set(renderRow.rowDef, [renderRow]);\n }\n renderRows.push(renderRow);\n }\n }\n return renderRows;\n }\n /**\n * Gets a list of `RenderRow` for the provided data object and any `CdkRowDef` objects that\n * should be rendered for this data. Reuses the cached RenderRow objects if they match the same\n * `(T, CdkRowDef)` pair.\n */\n _getRenderRowsForData(data, dataIndex, cache) {\n const rowDefs = this._getRowDefs(data, dataIndex);\n return rowDefs.map(rowDef => {\n const cachedRenderRows = cache && cache.has(rowDef) ? cache.get(rowDef) : [];\n if (cachedRenderRows.length) {\n const dataRow = cachedRenderRows.shift();\n dataRow.dataIndex = dataIndex;\n return dataRow;\n } else {\n return {\n data,\n rowDef,\n dataIndex\n };\n }\n });\n }\n /** Update the map containing the content's column definitions. */\n _cacheColumnDefs() {\n this._columnDefsByName.clear();\n const columnDefs = mergeArrayAndSet(this._getOwnDefs(this._contentColumnDefs), this._customColumnDefs);\n columnDefs.forEach(columnDef => {\n if (this._columnDefsByName.has(columnDef.name) && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getTableDuplicateColumnNameError(columnDef.name);\n }\n this._columnDefsByName.set(columnDef.name, columnDef);\n });\n }\n /** Update the list of all available row definitions that can be used. */\n _cacheRowDefs() {\n this._headerRowDefs = mergeArrayAndSet(this._getOwnDefs(this._contentHeaderRowDefs), this._customHeaderRowDefs);\n this._footerRowDefs = mergeArrayAndSet(this._getOwnDefs(this._contentFooterRowDefs), this._customFooterRowDefs);\n this._rowDefs = mergeArrayAndSet(this._getOwnDefs(this._contentRowDefs), this._customRowDefs);\n // After all row definitions are determined, find the row definition to be considered default.\n const defaultRowDefs = this._rowDefs.filter(def => !def.when);\n if (!this.multiTemplateDataRows && defaultRowDefs.length > 1 && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getTableMultipleDefaultRowDefsError();\n }\n this._defaultRowDef = defaultRowDefs[0];\n }\n /**\n * Check if the header, data, or footer rows have changed what columns they want to display or\n * whether the sticky states have changed for the header or footer. If there is a diff, then\n * re-render that section.\n */\n _renderUpdatedColumns() {\n const columnsDiffReducer = (acc, def) => {\n // The differ should be run for every column, even if `acc` is already\n // true (see #29922)\n const diff = !!def.getColumnsDiff();\n return acc || diff;\n };\n // Force re-render data rows if the list of column definitions have changed.\n const dataColumnsChanged = this._rowDefs.reduce(columnsDiffReducer, false);\n if (dataColumnsChanged) {\n this._forceRenderDataRows();\n }\n // Force re-render header/footer rows if the list of column definitions have changed.\n const headerColumnsChanged = this._headerRowDefs.reduce(columnsDiffReducer, false);\n if (headerColumnsChanged) {\n this._forceRenderHeaderRows();\n }\n const footerColumnsChanged = this._footerRowDefs.reduce(columnsDiffReducer, false);\n if (footerColumnsChanged) {\n this._forceRenderFooterRows();\n }\n return dataColumnsChanged || headerColumnsChanged || footerColumnsChanged;\n }\n /**\n * Switch to the provided data source by resetting the data and unsubscribing from the current\n * render change subscription if one exists. If the data source is null, interpret this by\n * clearing the row outlet. Otherwise start listening for new data.\n */\n _switchDataSource(dataSource) {\n this._data = [];\n if (isDataSource(this.dataSource)) {\n this.dataSource.disconnect(this);\n }\n // Stop listening for data from the previous data source.\n if (this._renderChangeSubscription) {\n this._renderChangeSubscription.unsubscribe();\n this._renderChangeSubscription = null;\n }\n if (!dataSource) {\n if (this._dataDiffer) {\n this._dataDiffer.diff([]);\n }\n if (this._rowOutlet) {\n this._rowOutlet.viewContainer.clear();\n }\n }\n this._dataSource = dataSource;\n }\n /** Set up a subscription for the data provided by the data source. */\n _observeRenderChanges() {\n // If no data source has been set, there is nothing to observe for changes.\n if (!this.dataSource) {\n return;\n }\n let dataStream;\n if (isDataSource(this.dataSource)) {\n dataStream = this.dataSource.connect(this);\n } else if (isObservable(this.dataSource)) {\n dataStream = this.dataSource;\n } else if (Array.isArray(this.dataSource)) {\n dataStream = of(this.dataSource);\n }\n if (dataStream === undefined && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getTableUnknownDataSourceError();\n }\n this._renderChangeSubscription = dataStream.pipe(takeUntil(this._onDestroy)).subscribe(data => {\n this._data = data || [];\n this.renderRows();\n });\n }\n /**\n * Clears any existing content in the header row outlet and creates a new embedded view\n * in the outlet using the header row definition.\n */\n _forceRenderHeaderRows() {\n // Clear the header row outlet if any content exists.\n if (this._headerRowOutlet.viewContainer.length > 0) {\n this._headerRowOutlet.viewContainer.clear();\n }\n this._headerRowDefs.forEach((def, i) => this._renderRow(this._headerRowOutlet, def, i));\n this.updateStickyHeaderRowStyles();\n }\n /**\n * Clears any existing content in the footer row outlet and creates a new embedded view\n * in the outlet using the footer row definition.\n */\n _forceRenderFooterRows() {\n // Clear the footer row outlet if any content exists.\n if (this._footerRowOutlet.viewContainer.length > 0) {\n this._footerRowOutlet.viewContainer.clear();\n }\n this._footerRowDefs.forEach((def, i) => this._renderRow(this._footerRowOutlet, def, i));\n this.updateStickyFooterRowStyles();\n }\n /** Adds the sticky column styles for the rows according to the columns' stick states. */\n _addStickyColumnStyles(rows, rowDef) {\n const columnDefs = Array.from(rowDef?.columns || []).map(columnName => {\n const columnDef = this._columnDefsByName.get(columnName);\n if (!columnDef && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getTableUnknownColumnError(columnName);\n }\n return columnDef;\n });\n const stickyStartStates = columnDefs.map(columnDef => columnDef.sticky);\n const stickyEndStates = columnDefs.map(columnDef => columnDef.stickyEnd);\n this._stickyStyler.updateStickyColumns(rows, stickyStartStates, stickyEndStates, !this._fixedLayout || this._forceRecalculateCellWidths);\n }\n /** Gets the list of rows that have been rendered in the row outlet. */\n _getRenderedRows(rowOutlet) {\n const renderedRows = [];\n for (let i = 0; i < rowOutlet.viewContainer.length; i++) {\n const viewRef = rowOutlet.viewContainer.get(i);\n renderedRows.push(viewRef.rootNodes[0]);\n }\n return renderedRows;\n }\n /**\n * Get the matching row definitions that should be used for this row data. If there is only\n * one row definition, it is returned. Otherwise, find the row definitions that has a when\n * predicate that returns true with the data. If none return true, return the default row\n * definition.\n */\n _getRowDefs(data, dataIndex) {\n if (this._rowDefs.length == 1) {\n return [this._rowDefs[0]];\n }\n let rowDefs = [];\n if (this.multiTemplateDataRows) {\n rowDefs = this._rowDefs.filter(def => !def.when || def.when(dataIndex, data));\n } else {\n let rowDef = this._rowDefs.find(def => def.when && def.when(dataIndex, data)) || this._defaultRowDef;\n if (rowDef) {\n rowDefs.push(rowDef);\n }\n }\n if (!rowDefs.length && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getTableMissingMatchingRowDefError(data);\n }\n return rowDefs;\n }\n _getEmbeddedViewArgs(renderRow, index) {\n const rowDef = renderRow.rowDef;\n const context = {\n $implicit: renderRow.data\n };\n return {\n templateRef: rowDef.template,\n context,\n index\n };\n }\n /**\n * Creates a new row template in the outlet and fills it with the set of cell templates.\n * Optionally takes a context to provide to the row and cells, as well as an optional index\n * of where to place the new row template in the outlet.\n */\n _renderRow(outlet, rowDef, index, context = {}) {\n // TODO(andrewseguin): enforce that one outlet was instantiated from createEmbeddedView\n const view = outlet.viewContainer.createEmbeddedView(rowDef.template, context, index);\n this._renderCellTemplateForItem(rowDef, context);\n return view;\n }\n _renderCellTemplateForItem(rowDef, context) {\n for (let cellTemplate of this._getCellTemplates(rowDef)) {\n if (CdkCellOutlet.mostRecentCellOutlet) {\n CdkCellOutlet.mostRecentCellOutlet._viewContainer.createEmbeddedView(cellTemplate, context);\n }\n }\n this._changeDetectorRef.markForCheck();\n }\n /**\n * Updates the index-related context for each row to reflect any changes in the index of the rows,\n * e.g. first/last/even/odd.\n */\n _updateRowIndexContext() {\n const viewContainer = this._rowOutlet.viewContainer;\n for (let renderIndex = 0, count = viewContainer.length; renderIndex < count; renderIndex++) {\n const viewRef = viewContainer.get(renderIndex);\n const context = viewRef.context;\n context.count = count;\n context.first = renderIndex === 0;\n context.last = renderIndex === count - 1;\n context.even = renderIndex % 2 === 0;\n context.odd = !context.even;\n if (this.multiTemplateDataRows) {\n context.dataIndex = this._renderRows[renderIndex].dataIndex;\n context.renderIndex = renderIndex;\n } else {\n context.index = this._renderRows[renderIndex].dataIndex;\n }\n }\n }\n /** Gets the column definitions for the provided row def. */\n _getCellTemplates(rowDef) {\n if (!rowDef || !rowDef.columns) {\n return [];\n }\n return Array.from(rowDef.columns, columnId => {\n const column = this._columnDefsByName.get(columnId);\n if (!column && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getTableUnknownColumnError(columnId);\n }\n return rowDef.extractCellTemplate(column);\n });\n }\n /**\n * Forces a re-render of the data rows. Should be called in cases where there has been an input\n * change that affects the evaluation of which rows should be rendered, e.g. toggling\n * `multiTemplateDataRows` or adding/removing row definitions.\n */\n _forceRenderDataRows() {\n this._dataDiffer.diff([]);\n this._rowOutlet.viewContainer.clear();\n this.renderRows();\n }\n /**\n * Checks if there has been a change in sticky states since last check and applies the correct\n * sticky styles. Since checking resets the \"dirty\" state, this should only be performed once\n * during a change detection and after the inputs are settled (after content check).\n */\n _checkStickyStates() {\n const stickyCheckReducer = (acc, d) => {\n return acc || d.hasStickyChanged();\n };\n // Note that the check needs to occur for every definition since it notifies the definition\n // that it can reset its dirty state. Using another operator like `some` may short-circuit\n // remaining definitions and leave them in an unchecked state.\n if (this._headerRowDefs.reduce(stickyCheckReducer, false)) {\n this.updateStickyHeaderRowStyles();\n }\n if (this._footerRowDefs.reduce(stickyCheckReducer, false)) {\n this.updateStickyFooterRowStyles();\n }\n if (Array.from(this._columnDefsByName.values()).reduce(stickyCheckReducer, false)) {\n this._stickyColumnStylesNeedReset = true;\n this.updateStickyColumnStyles();\n }\n }\n /**\n * Creates the sticky styler that will be used for sticky rows and columns. Listens\n * for directionality changes and provides the latest direction to the styler. Re-applies column\n * stickiness when directionality changes.\n */\n _setupStickyStyler() {\n const direction = this._dir ? this._dir.value : 'ltr';\n this._stickyStyler = new StickyStyler(this._isNativeHtmlTable, this.stickyCssClass, direction, this._coalescedStyleScheduler, this._platform.isBrowser, this.needsPositionStickyOnElement, this._stickyPositioningListener, this._injector);\n (this._dir ? this._dir.change : of()).pipe(takeUntil(this._onDestroy)).subscribe(value => {\n this._stickyStyler.direction = value;\n this.updateStickyColumnStyles();\n });\n }\n /** Filters definitions that belong to this table from a QueryList. */\n _getOwnDefs(items) {\n return items.filter(item => !item._table || item._table === this);\n }\n /** Creates or removes the no data row, depending on whether any data is being shown. */\n _updateNoDataRow() {\n const noDataRow = this._customNoDataRow || this._noDataRow;\n if (!noDataRow) {\n return;\n }\n const shouldShow = this._rowOutlet.viewContainer.length === 0;\n if (shouldShow === this._isShowingNoDataRow) {\n return;\n }\n const container = this._noDataRowOutlet.viewContainer;\n if (shouldShow) {\n const view = container.createEmbeddedView(noDataRow.templateRef);\n const rootNode = view.rootNodes[0];\n // Only add the attributes if we have a single root node since it's hard\n // to figure out which one to add it to when there are multiple.\n if (view.rootNodes.length === 1 && rootNode?.nodeType === this._document.ELEMENT_NODE) {\n rootNode.setAttribute('role', 'row');\n rootNode.classList.add(noDataRow._contentClassName);\n }\n } else {\n container.clear();\n }\n this._isShowingNoDataRow = shouldShow;\n this._changeDetectorRef.markForCheck();\n }\n static ɵfac = function CdkTable_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkTable)();\n };\n static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: CdkTable,\n selectors: [[\"cdk-table\"], [\"table\", \"cdk-table\", \"\"]],\n contentQueries: function CdkTable_ContentQueries(rf, ctx, dirIndex) {\n if (rf & 1) {\n i0.ɵɵcontentQuery(dirIndex, CdkNoDataRow, 5);\n i0.ɵɵcontentQuery(dirIndex, CdkColumnDef, 5);\n i0.ɵɵcontentQuery(dirIndex, CdkRowDef, 5);\n i0.ɵɵcontentQuery(dirIndex, CdkHeaderRowDef, 5);\n i0.ɵɵcontentQuery(dirIndex, CdkFooterRowDef, 5);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._noDataRow = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._contentColumnDefs = _t);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._contentRowDefs = _t);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._contentHeaderRowDefs = _t);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._contentFooterRowDefs = _t);\n }\n },\n hostAttrs: [1, \"cdk-table\"],\n hostVars: 2,\n hostBindings: function CdkTable_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵclassProp(\"cdk-table-fixed-layout\", ctx.fixedLayout);\n }\n },\n inputs: {\n trackBy: \"trackBy\",\n dataSource: \"dataSource\",\n multiTemplateDataRows: [2, \"multiTemplateDataRows\", \"multiTemplateDataRows\", booleanAttribute],\n fixedLayout: [2, \"fixedLayout\", \"fixedLayout\", booleanAttribute]\n },\n outputs: {\n contentChanged: \"contentChanged\"\n },\n exportAs: [\"cdkTable\"],\n features: [i0.ɵɵProvidersFeature([{\n provide: CDK_TABLE,\n useExisting: CdkTable\n }, {\n provide: _VIEW_REPEATER_STRATEGY,\n useClass: _DisposeViewRepeaterStrategy\n }, {\n provide: _COALESCED_STYLE_SCHEDULER,\n useClass: _CoalescedStyleScheduler\n },\n // Prevent nested tables from seeing this table's StickyPositioningListener.\n {\n provide: STICKY_POSITIONING_LISTENER,\n useValue: null\n }])],\n ngContentSelectors: _c1,\n decls: 5,\n vars: 2,\n consts: [[\"role\", \"rowgroup\"], [\"headerRowOutlet\", \"\"], [\"rowOutlet\", \"\"], [\"noDataRowOutlet\", \"\"], [\"footerRowOutlet\", \"\"]],\n template: function CdkTable_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵprojectionDef(_c0);\n i0.ɵɵprojection(0);\n i0.ɵɵprojection(1, 1);\n i0.ɵɵtemplate(2, CdkTable_Conditional_2_Template, 1, 0)(3, CdkTable_Conditional_3_Template, 7, 0)(4, CdkTable_Conditional_4_Template, 4, 0);\n }\n if (rf & 2) {\n i0.ɵɵadvance(2);\n i0.ɵɵconditional(ctx._isServer ? 2 : -1);\n i0.ɵɵadvance();\n i0.ɵɵconditional(ctx._isNativeHtmlTable ? 3 : 4);\n }\n },\n dependencies: [HeaderRowOutlet, DataRowOutlet, NoDataRowOutlet, FooterRowOutlet],\n styles: [\".cdk-table-fixed-layout{table-layout:fixed}\"],\n encapsulation: 2\n });\n }\n return CdkTable;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Utility function that gets a merged list of the entries in an array and values of a Set. */\nfunction mergeArrayAndSet(array, set) {\n return array.concat(Array.from(set));\n}\n/**\n * Finds the closest table section to an outlet. We can't use `HTMLElement.closest` for this,\n * because the node representing the outlet is a comment.\n */\nfunction closestTableSection(outlet, section) {\n const uppercaseSection = section.toUpperCase();\n let current = outlet.viewContainer.element.nativeElement;\n while (current) {\n // 1 is an element node.\n const nodeName = current.nodeType === 1 ? current.nodeName : null;\n if (nodeName === uppercaseSection) {\n return current;\n } else if (nodeName === 'TABLE') {\n // Stop traversing past the `table` node.\n break;\n }\n current = current.parentNode;\n }\n return null;\n}\n\n/**\n * Column that simply shows text content for the header and row cells. Assumes that the table\n * is using the native table implementation (`
`).\n *\n * By default, the name of this column will be the header text and data property accessor.\n * The header text can be overridden with the `headerText` input. Cell values can be overridden with\n * the `dataAccessor` input. Change the text justification to the start or end using the `justify`\n * input.\n */\nlet CdkTextColumn = /*#__PURE__*/(() => {\n class CdkTextColumn {\n _table = inject(CdkTable, {\n optional: true\n });\n _options = inject(TEXT_COLUMN_OPTIONS, {\n optional: true\n });\n /** Column name that should be used to reference this column. */\n get name() {\n return this._name;\n }\n set name(name) {\n this._name = name;\n // With Ivy, inputs can be initialized before static query results are\n // available. In that case, we defer the synchronization until \"ngOnInit\" fires.\n this._syncColumnDefName();\n }\n _name;\n /**\n * Text label that should be used for the column header. If this property is not\n * set, the header text will default to the column name with its first letter capitalized.\n */\n headerText;\n /**\n * Accessor function to retrieve the data rendered for each cell. If this\n * property is not set, the data cells will render the value found in the data's property matching\n * the column's name. For example, if the column is named `id`, then the rendered value will be\n * value defined by the data's `id` property.\n */\n dataAccessor;\n /** Alignment of the cell values. */\n justify = 'start';\n /** @docs-private */\n columnDef;\n /**\n * The column cell is provided to the column during `ngOnInit` with a static query.\n * Normally, this will be retrieved by the column using `ContentChild`, but that assumes the\n * column definition was provided in the same view as the table, which is not the case with this\n * component.\n * @docs-private\n */\n cell;\n /**\n * The column headerCell is provided to the column during `ngOnInit` with a static query.\n * Normally, this will be retrieved by the column using `ContentChild`, but that assumes the\n * column definition was provided in the same view as the table, which is not the case with this\n * component.\n * @docs-private\n */\n headerCell;\n constructor() {\n this._options = this._options || {};\n }\n ngOnInit() {\n this._syncColumnDefName();\n if (this.headerText === undefined) {\n this.headerText = this._createDefaultHeaderText();\n }\n if (!this.dataAccessor) {\n this.dataAccessor = this._options.defaultDataAccessor || ((data, name) => data[name]);\n }\n if (this._table) {\n // Provide the cell and headerCell directly to the table with the static `ViewChild` query,\n // since the columnDef will not pick up its content by the time the table finishes checking\n // its content and initializing the rows.\n this.columnDef.cell = this.cell;\n this.columnDef.headerCell = this.headerCell;\n this._table.addColumnDef(this.columnDef);\n } else if (typeof ngDevMode === 'undefined' || ngDevMode) {\n throw getTableTextColumnMissingParentTableError();\n }\n }\n ngOnDestroy() {\n if (this._table) {\n this._table.removeColumnDef(this.columnDef);\n }\n }\n /**\n * Creates a default header text. Use the options' header text transformation function if one\n * has been provided. Otherwise simply capitalize the column name.\n */\n _createDefaultHeaderText() {\n const name = this.name;\n if (!name && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getTableTextColumnMissingNameError();\n }\n if (this._options && this._options.defaultHeaderTextTransform) {\n return this._options.defaultHeaderTextTransform(name);\n }\n return name[0].toUpperCase() + name.slice(1);\n }\n /** Synchronizes the column definition name with the text column name. */\n _syncColumnDefName() {\n if (this.columnDef) {\n this.columnDef.name = this.name;\n }\n }\n static ɵfac = function CdkTextColumn_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkTextColumn)();\n };\n static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: CdkTextColumn,\n selectors: [[\"cdk-text-column\"]],\n viewQuery: function CdkTextColumn_Query(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵviewQuery(CdkColumnDef, 7);\n i0.ɵɵviewQuery(CdkCellDef, 7);\n i0.ɵɵviewQuery(CdkHeaderCellDef, 7);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.columnDef = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.cell = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.headerCell = _t.first);\n }\n },\n inputs: {\n name: \"name\",\n headerText: \"headerText\",\n dataAccessor: \"dataAccessor\",\n justify: \"justify\"\n },\n decls: 3,\n vars: 0,\n consts: [[\"cdkColumnDef\", \"\"], [\"cdk-header-cell\", \"\", 3, \"text-align\", 4, \"cdkHeaderCellDef\"], [\"cdk-cell\", \"\", 3, \"text-align\", 4, \"cdkCellDef\"], [\"cdk-header-cell\", \"\"], [\"cdk-cell\", \"\"]],\n template: function CdkTextColumn_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementContainerStart(0, 0);\n i0.ɵɵtemplate(1, CdkTextColumn_th_1_Template, 2, 3, \"th\", 1)(2, CdkTextColumn_td_2_Template, 2, 3, \"td\", 2);\n i0.ɵɵelementContainerEnd();\n }\n },\n dependencies: [CdkColumnDef, CdkHeaderCellDef, CdkHeaderCell, CdkCellDef, CdkCell],\n encapsulation: 2\n });\n }\n return CdkTextColumn;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst EXPORTED_DECLARATIONS = [CdkTable, CdkRowDef, CdkCellDef, CdkCellOutlet, CdkHeaderCellDef, CdkFooterCellDef, CdkColumnDef, CdkCell, CdkRow, CdkHeaderCell, CdkFooterCell, CdkHeaderRow, CdkHeaderRowDef, CdkFooterRow, CdkFooterRowDef, DataRowOutlet, HeaderRowOutlet, FooterRowOutlet, CdkTextColumn, CdkNoDataRow, CdkRecycleRows, NoDataRowOutlet];\nlet CdkTableModule = /*#__PURE__*/(() => {\n class CdkTableModule {\n static ɵfac = function CdkTableModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || CdkTableModule)();\n };\n static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: CdkTableModule\n });\n static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n imports: [ScrollingModule]\n });\n }\n return CdkTableModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Mixin to provide a directive with a function that checks if the sticky input has been\n * changed since the last time the function was called. Essentially adds a dirty-check to the\n * sticky value.\n * @docs-private\n * @deprecated Implement the `CanStick` interface instead.\n * @breaking-change 19.0.0\n */\nfunction mixinHasStickyInput(base) {\n return class extends base {\n /** Whether sticky positioning should be applied. */\n get sticky() {\n return this._sticky;\n }\n set sticky(v) {\n const prevValue = this._sticky;\n this._sticky = coerceBooleanProperty(v);\n this._hasStickyChanged = prevValue !== this._sticky;\n }\n _sticky = false;\n /** Whether the sticky input has changed since it was last checked. */\n _hasStickyChanged = false;\n /** Whether the sticky value has changed since this was last called. */\n hasStickyChanged() {\n const hasStickyChanged = this._hasStickyChanged;\n this._hasStickyChanged = false;\n return hasStickyChanged;\n }\n /** Resets the dirty check for cases where the sticky state has been used without checking. */\n resetStickyChanged() {\n this._hasStickyChanged = false;\n }\n constructor(...args) {\n super(...args);\n }\n };\n}\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { BaseCdkCell, BaseRowDef, CDK_ROW_TEMPLATE, CDK_TABLE, CDK_TABLE_TEMPLATE, CdkCell, CdkCellDef, CdkCellOutlet, CdkColumnDef, CdkFooterCell, CdkFooterCellDef, CdkFooterRow, CdkFooterRowDef, CdkHeaderCell, CdkHeaderCellDef, CdkHeaderRow, CdkHeaderRowDef, CdkNoDataRow, CdkRecycleRows, CdkRow, CdkRowDef, CdkTable, CdkTableModule, CdkTextColumn, DataRowOutlet, FooterRowOutlet, HeaderRowOutlet, NoDataRowOutlet, STICKY_DIRECTIONS, STICKY_POSITIONING_LISTENER, StickyStyler, TEXT_COLUMN_OPTIONS, _COALESCED_STYLE_SCHEDULER, _CoalescedStyleScheduler, _Schedule, mixinHasStickyInput };\n","import * as i0 from '@angular/core';\nimport { Directive, Component, ViewEncapsulation, ChangeDetectionStrategy, Input, booleanAttribute, NgModule } from '@angular/core';\nimport { CdkTable, CDK_TABLE, _COALESCED_STYLE_SCHEDULER, _CoalescedStyleScheduler, STICKY_POSITIONING_LISTENER, HeaderRowOutlet, DataRowOutlet, NoDataRowOutlet, FooterRowOutlet, CdkCellDef, CdkHeaderCellDef, CdkFooterCellDef, CdkColumnDef, CdkHeaderCell, CdkFooterCell, CdkCell, CdkHeaderRowDef, CdkFooterRowDef, CdkRowDef, CdkHeaderRow, CdkCellOutlet, CdkFooterRow, CdkRow, CdkNoDataRow, CdkTextColumn, CdkTableModule } from '@angular/cdk/table';\nimport { _VIEW_REPEATER_STRATEGY, _RecycleViewRepeaterStrategy, _DisposeViewRepeaterStrategy, DataSource } from '@angular/cdk/collections';\nimport { MatCommonModule } from '@angular/material/core';\nimport { BehaviorSubject, Subject, merge, of, combineLatest } from 'rxjs';\nimport { _isNumberValue } from '@angular/cdk/coercion';\nimport { map } from 'rxjs/operators';\n\n/**\n * Enables the recycle view repeater strategy, which reduces rendering latency. Not compatible with\n * tables that animate rows.\n */\nconst _c0 = [[[\"caption\"]], [[\"colgroup\"], [\"col\"]], \"*\"];\nconst _c1 = [\"caption\", \"colgroup, col\", \"*\"];\nfunction MatTable_Conditional_2_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵprojection(0, 2);\n }\n}\nfunction MatTable_Conditional_3_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"thead\", 0);\n i0.ɵɵelementContainer(1, 1);\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(2, \"tbody\", 2);\n i0.ɵɵelementContainer(3, 3)(4, 4);\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(5, \"tfoot\", 0);\n i0.ɵɵelementContainer(6, 5);\n i0.ɵɵelementEnd();\n }\n}\nfunction MatTable_Conditional_4_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementContainer(0, 1)(1, 3)(2, 4)(3, 5);\n }\n}\nfunction MatTextColumn_th_1_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"th\", 3);\n i0.ɵɵtext(1);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n const ctx_r0 = i0.ɵɵnextContext();\n i0.ɵɵstyleProp(\"text-align\", ctx_r0.justify);\n i0.ɵɵadvance();\n i0.ɵɵtextInterpolate1(\" \", ctx_r0.headerText, \" \");\n }\n}\nfunction MatTextColumn_td_2_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"td\", 4);\n i0.ɵɵtext(1);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n const data_r2 = ctx.$implicit;\n const ctx_r0 = i0.ɵɵnextContext();\n i0.ɵɵstyleProp(\"text-align\", ctx_r0.justify);\n i0.ɵɵadvance();\n i0.ɵɵtextInterpolate1(\" \", ctx_r0.dataAccessor(data_r2, ctx_r0.name), \" \");\n }\n}\nlet MatRecycleRows = /*#__PURE__*/(() => {\n class MatRecycleRows {\n static ɵfac = function MatRecycleRows_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || MatRecycleRows)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatRecycleRows,\n selectors: [[\"mat-table\", \"recycleRows\", \"\"], [\"table\", \"mat-table\", \"\", \"recycleRows\", \"\"]],\n features: [i0.ɵɵProvidersFeature([{\n provide: _VIEW_REPEATER_STRATEGY,\n useClass: _RecycleViewRepeaterStrategy\n }])]\n });\n }\n return MatRecycleRows;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet MatTable = /*#__PURE__*/(() => {\n class MatTable extends CdkTable {\n /** Overrides the sticky CSS class set by the `CdkTable`. */\n stickyCssClass = 'mat-mdc-table-sticky';\n /** Overrides the need to add position: sticky on every sticky cell element in `CdkTable`. */\n needsPositionStickyOnElement = false;\n static ɵfac = /* @__PURE__ */(() => {\n let ɵMatTable_BaseFactory;\n return function MatTable_Factory(__ngFactoryType__) {\n return (ɵMatTable_BaseFactory || (ɵMatTable_BaseFactory = i0.ɵɵgetInheritedFactory(MatTable)))(__ngFactoryType__ || MatTable);\n };\n })();\n static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatTable,\n selectors: [[\"mat-table\"], [\"table\", \"mat-table\", \"\"]],\n hostAttrs: [1, \"mat-mdc-table\", \"mdc-data-table__table\"],\n hostVars: 2,\n hostBindings: function MatTable_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵclassProp(\"mdc-table-fixed-layout\", ctx.fixedLayout);\n }\n },\n exportAs: [\"matTable\"],\n features: [i0.ɵɵProvidersFeature([{\n provide: CdkTable,\n useExisting: MatTable\n }, {\n provide: CDK_TABLE,\n useExisting: MatTable\n }, {\n provide: _COALESCED_STYLE_SCHEDULER,\n useClass: _CoalescedStyleScheduler\n },\n // TODO(michaeljamesparsons) Abstract the view repeater strategy to a directive API so this code\n // is only included in the build if used.\n {\n provide: _VIEW_REPEATER_STRATEGY,\n useClass: _DisposeViewRepeaterStrategy\n },\n // Prevent nested tables from seeing this table's StickyPositioningListener.\n {\n provide: STICKY_POSITIONING_LISTENER,\n useValue: null\n }]), i0.ɵɵInheritDefinitionFeature],\n ngContentSelectors: _c1,\n decls: 5,\n vars: 2,\n consts: [[\"role\", \"rowgroup\"], [\"headerRowOutlet\", \"\"], [\"role\", \"rowgroup\", 1, \"mdc-data-table__content\"], [\"rowOutlet\", \"\"], [\"noDataRowOutlet\", \"\"], [\"footerRowOutlet\", \"\"]],\n template: function MatTable_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵprojectionDef(_c0);\n i0.ɵɵprojection(0);\n i0.ɵɵprojection(1, 1);\n i0.ɵɵtemplate(2, MatTable_Conditional_2_Template, 1, 0)(3, MatTable_Conditional_3_Template, 7, 0)(4, MatTable_Conditional_4_Template, 4, 0);\n }\n if (rf & 2) {\n i0.ɵɵadvance(2);\n i0.ɵɵconditional(ctx._isServer ? 2 : -1);\n i0.ɵɵadvance();\n i0.ɵɵconditional(ctx._isNativeHtmlTable ? 3 : 4);\n }\n },\n dependencies: [HeaderRowOutlet, DataRowOutlet, NoDataRowOutlet, FooterRowOutlet],\n styles: [\".mat-mdc-table-sticky{position:sticky !important}mat-table{display:block}mat-header-row{min-height:56px}mat-row,mat-footer-row{min-height:48px}mat-row,mat-header-row,mat-footer-row{display:flex;border-width:0;border-bottom-width:1px;border-style:solid;align-items:center;box-sizing:border-box}mat-cell:first-of-type,mat-header-cell:first-of-type,mat-footer-cell:first-of-type{padding-left:24px}[dir=rtl] mat-cell:first-of-type:not(:only-of-type),[dir=rtl] mat-header-cell:first-of-type:not(:only-of-type),[dir=rtl] mat-footer-cell:first-of-type:not(:only-of-type){padding-left:0;padding-right:24px}mat-cell:last-of-type,mat-header-cell:last-of-type,mat-footer-cell:last-of-type{padding-right:24px}[dir=rtl] mat-cell:last-of-type:not(:only-of-type),[dir=rtl] mat-header-cell:last-of-type:not(:only-of-type),[dir=rtl] mat-footer-cell:last-of-type:not(:only-of-type){padding-right:0;padding-left:24px}mat-cell,mat-header-cell,mat-footer-cell{flex:1;display:flex;align-items:center;overflow:hidden;word-wrap:break-word;min-height:inherit}.mat-mdc-table{min-width:100%;border:0;border-spacing:0;table-layout:auto;white-space:normal;background-color:var(--mat-table-background-color, var(--mat-sys-surface))}.mdc-data-table__cell{box-sizing:border-box;overflow:hidden;text-align:left;text-overflow:ellipsis}[dir=rtl] .mdc-data-table__cell{text-align:right}.mdc-data-table__cell,.mdc-data-table__header-cell{padding:0 16px}.mat-mdc-header-row{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:var(--mat-table-header-container-height, 56px);color:var(--mat-table-header-headline-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-table-header-headline-font, var(--mat-sys-title-small-font, Roboto, sans-serif));line-height:var(--mat-table-header-headline-line-height, var(--mat-sys-title-small-line-height));font-size:var(--mat-table-header-headline-size, var(--mat-sys-title-small-size, 14px));font-weight:var(--mat-table-header-headline-weight, var(--mat-sys-title-small-weight, 500))}.mat-mdc-row{height:var(--mat-table-row-item-container-height, 52px);color:var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)))}.mat-mdc-row,.mdc-data-table__content{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-table-row-item-label-text-font, var(--mat-sys-body-medium-font, Roboto, sans-serif));line-height:var(--mat-table-row-item-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-table-row-item-label-text-size, var(--mat-sys-body-medium-size, 14px));font-weight:var(--mat-table-row-item-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-footer-row{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:var(--mat-table-footer-container-height, 52px);color:var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-table-footer-supporting-text-font, var(--mat-sys-body-medium-font, Roboto, sans-serif));line-height:var(--mat-table-footer-supporting-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-table-footer-supporting-text-size, var(--mat-sys-body-medium-size, 14px));font-weight:var(--mat-table-footer-supporting-text-weight, var(--mat-sys-body-medium-weight));letter-spacing:var(--mat-table-footer-supporting-text-tracking, var(--mat-sys-body-medium-tracking))}.mat-mdc-header-cell{border-bottom-color:var(--mat-table-row-item-outline-color, var(--mat-sys-outline, rgba(0, 0, 0, 0.12)));border-bottom-width:var(--mat-table-row-item-outline-width, 1px);border-bottom-style:solid;letter-spacing:var(--mat-table-header-headline-tracking, var(--mat-sys-title-small-tracking));font-weight:inherit;line-height:inherit;box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;outline:none;text-align:left}[dir=rtl] .mat-mdc-header-cell{text-align:right}.mdc-data-table__row:last-child>.mat-mdc-header-cell{border-bottom:none}.mat-mdc-cell{border-bottom-color:var(--mat-table-row-item-outline-color, var(--mat-sys-outline, rgba(0, 0, 0, 0.12)));border-bottom-width:var(--mat-table-row-item-outline-width, 1px);border-bottom-style:solid;letter-spacing:var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking));line-height:inherit}.mdc-data-table__row:last-child>.mat-mdc-cell{border-bottom:none}.mat-mdc-footer-cell{letter-spacing:var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking))}mat-row.mat-mdc-row,mat-header-row.mat-mdc-header-row,mat-footer-row.mat-mdc-footer-row{border-bottom:none}.mat-mdc-table tbody,.mat-mdc-table tfoot,.mat-mdc-table thead,.mat-mdc-cell,.mat-mdc-footer-cell,.mat-mdc-header-row,.mat-mdc-row,.mat-mdc-footer-row,.mat-mdc-table .mat-mdc-header-cell{background:inherit}.mat-mdc-table mat-header-row.mat-mdc-header-row,.mat-mdc-table mat-row.mat-mdc-row,.mat-mdc-table mat-footer-row.mat-mdc-footer-cell{height:unset}mat-header-cell.mat-mdc-header-cell,mat-cell.mat-mdc-cell,mat-footer-cell.mat-mdc-footer-cell{align-self:stretch}\"],\n encapsulation: 2\n });\n }\n return MatTable;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Cell definition for the mat-table.\n * Captures the template of a column's data row cell as well as cell-specific properties.\n */\nlet MatCellDef = /*#__PURE__*/(() => {\n class MatCellDef extends CdkCellDef {\n static ɵfac = /* @__PURE__ */(() => {\n let ɵMatCellDef_BaseFactory;\n return function MatCellDef_Factory(__ngFactoryType__) {\n return (ɵMatCellDef_BaseFactory || (ɵMatCellDef_BaseFactory = i0.ɵɵgetInheritedFactory(MatCellDef)))(__ngFactoryType__ || MatCellDef);\n };\n })();\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatCellDef,\n selectors: [[\"\", \"matCellDef\", \"\"]],\n features: [i0.ɵɵProvidersFeature([{\n provide: CdkCellDef,\n useExisting: MatCellDef\n }]), i0.ɵɵInheritDefinitionFeature]\n });\n }\n return MatCellDef;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Header cell definition for the mat-table.\n * Captures the template of a column's header cell and as well as cell-specific properties.\n */\nlet MatHeaderCellDef = /*#__PURE__*/(() => {\n class MatHeaderCellDef extends CdkHeaderCellDef {\n static ɵfac = /* @__PURE__ */(() => {\n let ɵMatHeaderCellDef_BaseFactory;\n return function MatHeaderCellDef_Factory(__ngFactoryType__) {\n return (ɵMatHeaderCellDef_BaseFactory || (ɵMatHeaderCellDef_BaseFactory = i0.ɵɵgetInheritedFactory(MatHeaderCellDef)))(__ngFactoryType__ || MatHeaderCellDef);\n };\n })();\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatHeaderCellDef,\n selectors: [[\"\", \"matHeaderCellDef\", \"\"]],\n features: [i0.ɵɵProvidersFeature([{\n provide: CdkHeaderCellDef,\n useExisting: MatHeaderCellDef\n }]), i0.ɵɵInheritDefinitionFeature]\n });\n }\n return MatHeaderCellDef;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Footer cell definition for the mat-table.\n * Captures the template of a column's footer cell and as well as cell-specific properties.\n */\nlet MatFooterCellDef = /*#__PURE__*/(() => {\n class MatFooterCellDef extends CdkFooterCellDef {\n static ɵfac = /* @__PURE__ */(() => {\n let ɵMatFooterCellDef_BaseFactory;\n return function MatFooterCellDef_Factory(__ngFactoryType__) {\n return (ɵMatFooterCellDef_BaseFactory || (ɵMatFooterCellDef_BaseFactory = i0.ɵɵgetInheritedFactory(MatFooterCellDef)))(__ngFactoryType__ || MatFooterCellDef);\n };\n })();\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatFooterCellDef,\n selectors: [[\"\", \"matFooterCellDef\", \"\"]],\n features: [i0.ɵɵProvidersFeature([{\n provide: CdkFooterCellDef,\n useExisting: MatFooterCellDef\n }]), i0.ɵɵInheritDefinitionFeature]\n });\n }\n return MatFooterCellDef;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Column definition for the mat-table.\n * Defines a set of cells available for a table column.\n */\nlet MatColumnDef = /*#__PURE__*/(() => {\n class MatColumnDef extends CdkColumnDef {\n /** Unique name for this column. */\n get name() {\n return this._name;\n }\n set name(name) {\n this._setNameInput(name);\n }\n /**\n * Add \"mat-column-\" prefix in addition to \"cdk-column-\" prefix.\n * In the future, this will only add \"mat-column-\" and columnCssClassName\n * will change from type string[] to string.\n * @docs-private\n */\n _updateColumnCssClassName() {\n super._updateColumnCssClassName();\n this._columnCssClassName.push(`mat-column-${this.cssClassFriendlyName}`);\n }\n static ɵfac = /* @__PURE__ */(() => {\n let ɵMatColumnDef_BaseFactory;\n return function MatColumnDef_Factory(__ngFactoryType__) {\n return (ɵMatColumnDef_BaseFactory || (ɵMatColumnDef_BaseFactory = i0.ɵɵgetInheritedFactory(MatColumnDef)))(__ngFactoryType__ || MatColumnDef);\n };\n })();\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatColumnDef,\n selectors: [[\"\", \"matColumnDef\", \"\"]],\n inputs: {\n name: [0, \"matColumnDef\", \"name\"]\n },\n features: [i0.ɵɵProvidersFeature([{\n provide: CdkColumnDef,\n useExisting: MatColumnDef\n }, {\n provide: 'MAT_SORT_HEADER_COLUMN_DEF',\n useExisting: MatColumnDef\n }]), i0.ɵɵInheritDefinitionFeature]\n });\n }\n return MatColumnDef;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Header cell template container that adds the right classes and role. */\nlet MatHeaderCell = /*#__PURE__*/(() => {\n class MatHeaderCell extends CdkHeaderCell {\n static ɵfac = /* @__PURE__ */(() => {\n let ɵMatHeaderCell_BaseFactory;\n return function MatHeaderCell_Factory(__ngFactoryType__) {\n return (ɵMatHeaderCell_BaseFactory || (ɵMatHeaderCell_BaseFactory = i0.ɵɵgetInheritedFactory(MatHeaderCell)))(__ngFactoryType__ || MatHeaderCell);\n };\n })();\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatHeaderCell,\n selectors: [[\"mat-header-cell\"], [\"th\", \"mat-header-cell\", \"\"]],\n hostAttrs: [\"role\", \"columnheader\", 1, \"mat-mdc-header-cell\", \"mdc-data-table__header-cell\"],\n features: [i0.ɵɵInheritDefinitionFeature]\n });\n }\n return MatHeaderCell;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Footer cell template container that adds the right classes and role. */\nlet MatFooterCell = /*#__PURE__*/(() => {\n class MatFooterCell extends CdkFooterCell {\n static ɵfac = /* @__PURE__ */(() => {\n let ɵMatFooterCell_BaseFactory;\n return function MatFooterCell_Factory(__ngFactoryType__) {\n return (ɵMatFooterCell_BaseFactory || (ɵMatFooterCell_BaseFactory = i0.ɵɵgetInheritedFactory(MatFooterCell)))(__ngFactoryType__ || MatFooterCell);\n };\n })();\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatFooterCell,\n selectors: [[\"mat-footer-cell\"], [\"td\", \"mat-footer-cell\", \"\"]],\n hostAttrs: [1, \"mat-mdc-footer-cell\", \"mdc-data-table__cell\"],\n features: [i0.ɵɵInheritDefinitionFeature]\n });\n }\n return MatFooterCell;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Cell template container that adds the right classes and role. */\nlet MatCell = /*#__PURE__*/(() => {\n class MatCell extends CdkCell {\n static ɵfac = /* @__PURE__ */(() => {\n let ɵMatCell_BaseFactory;\n return function MatCell_Factory(__ngFactoryType__) {\n return (ɵMatCell_BaseFactory || (ɵMatCell_BaseFactory = i0.ɵɵgetInheritedFactory(MatCell)))(__ngFactoryType__ || MatCell);\n };\n })();\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatCell,\n selectors: [[\"mat-cell\"], [\"td\", \"mat-cell\", \"\"]],\n hostAttrs: [1, \"mat-mdc-cell\", \"mdc-data-table__cell\"],\n features: [i0.ɵɵInheritDefinitionFeature]\n });\n }\n return MatCell;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n// We can't reuse `CDK_ROW_TEMPLATE` because it's incompatible with local compilation mode.\nconst ROW_TEMPLATE = ``;\n/**\n * Header row definition for the mat-table.\n * Captures the header row's template and other header properties such as the columns to display.\n */\nlet MatHeaderRowDef = /*#__PURE__*/(() => {\n class MatHeaderRowDef extends CdkHeaderRowDef {\n static ɵfac = /* @__PURE__ */(() => {\n let ɵMatHeaderRowDef_BaseFactory;\n return function MatHeaderRowDef_Factory(__ngFactoryType__) {\n return (ɵMatHeaderRowDef_BaseFactory || (ɵMatHeaderRowDef_BaseFactory = i0.ɵɵgetInheritedFactory(MatHeaderRowDef)))(__ngFactoryType__ || MatHeaderRowDef);\n };\n })();\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatHeaderRowDef,\n selectors: [[\"\", \"matHeaderRowDef\", \"\"]],\n inputs: {\n columns: [0, \"matHeaderRowDef\", \"columns\"],\n sticky: [2, \"matHeaderRowDefSticky\", \"sticky\", booleanAttribute]\n },\n features: [i0.ɵɵProvidersFeature([{\n provide: CdkHeaderRowDef,\n useExisting: MatHeaderRowDef\n }]), i0.ɵɵInheritDefinitionFeature]\n });\n }\n return MatHeaderRowDef;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Footer row definition for the mat-table.\n * Captures the footer row's template and other footer properties such as the columns to display.\n */\nlet MatFooterRowDef = /*#__PURE__*/(() => {\n class MatFooterRowDef extends CdkFooterRowDef {\n static ɵfac = /* @__PURE__ */(() => {\n let ɵMatFooterRowDef_BaseFactory;\n return function MatFooterRowDef_Factory(__ngFactoryType__) {\n return (ɵMatFooterRowDef_BaseFactory || (ɵMatFooterRowDef_BaseFactory = i0.ɵɵgetInheritedFactory(MatFooterRowDef)))(__ngFactoryType__ || MatFooterRowDef);\n };\n })();\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatFooterRowDef,\n selectors: [[\"\", \"matFooterRowDef\", \"\"]],\n inputs: {\n columns: [0, \"matFooterRowDef\", \"columns\"],\n sticky: [2, \"matFooterRowDefSticky\", \"sticky\", booleanAttribute]\n },\n features: [i0.ɵɵProvidersFeature([{\n provide: CdkFooterRowDef,\n useExisting: MatFooterRowDef\n }]), i0.ɵɵInheritDefinitionFeature]\n });\n }\n return MatFooterRowDef;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Data row definition for the mat-table.\n * Captures the data row's template and other properties such as the columns to display and\n * a when predicate that describes when this row should be used.\n */\nlet MatRowDef = /*#__PURE__*/(() => {\n class MatRowDef extends CdkRowDef {\n static ɵfac = /* @__PURE__ */(() => {\n let ɵMatRowDef_BaseFactory;\n return function MatRowDef_Factory(__ngFactoryType__) {\n return (ɵMatRowDef_BaseFactory || (ɵMatRowDef_BaseFactory = i0.ɵɵgetInheritedFactory(MatRowDef)))(__ngFactoryType__ || MatRowDef);\n };\n })();\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatRowDef,\n selectors: [[\"\", \"matRowDef\", \"\"]],\n inputs: {\n columns: [0, \"matRowDefColumns\", \"columns\"],\n when: [0, \"matRowDefWhen\", \"when\"]\n },\n features: [i0.ɵɵProvidersFeature([{\n provide: CdkRowDef,\n useExisting: MatRowDef\n }]), i0.ɵɵInheritDefinitionFeature]\n });\n }\n return MatRowDef;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Header template container that contains the cell outlet. Adds the right class and role. */\nlet MatHeaderRow = /*#__PURE__*/(() => {\n class MatHeaderRow extends CdkHeaderRow {\n static ɵfac = /* @__PURE__ */(() => {\n let ɵMatHeaderRow_BaseFactory;\n return function MatHeaderRow_Factory(__ngFactoryType__) {\n return (ɵMatHeaderRow_BaseFactory || (ɵMatHeaderRow_BaseFactory = i0.ɵɵgetInheritedFactory(MatHeaderRow)))(__ngFactoryType__ || MatHeaderRow);\n };\n })();\n static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatHeaderRow,\n selectors: [[\"mat-header-row\"], [\"tr\", \"mat-header-row\", \"\"]],\n hostAttrs: [\"role\", \"row\", 1, \"mat-mdc-header-row\", \"mdc-data-table__header-row\"],\n exportAs: [\"matHeaderRow\"],\n features: [i0.ɵɵProvidersFeature([{\n provide: CdkHeaderRow,\n useExisting: MatHeaderRow\n }]), i0.ɵɵInheritDefinitionFeature],\n decls: 1,\n vars: 0,\n consts: [[\"cdkCellOutlet\", \"\"]],\n template: function MatHeaderRow_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementContainer(0, 0);\n }\n },\n dependencies: [CdkCellOutlet],\n encapsulation: 2\n });\n }\n return MatHeaderRow;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Footer template container that contains the cell outlet. Adds the right class and role. */\nlet MatFooterRow = /*#__PURE__*/(() => {\n class MatFooterRow extends CdkFooterRow {\n static ɵfac = /* @__PURE__ */(() => {\n let ɵMatFooterRow_BaseFactory;\n return function MatFooterRow_Factory(__ngFactoryType__) {\n return (ɵMatFooterRow_BaseFactory || (ɵMatFooterRow_BaseFactory = i0.ɵɵgetInheritedFactory(MatFooterRow)))(__ngFactoryType__ || MatFooterRow);\n };\n })();\n static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatFooterRow,\n selectors: [[\"mat-footer-row\"], [\"tr\", \"mat-footer-row\", \"\"]],\n hostAttrs: [\"role\", \"row\", 1, \"mat-mdc-footer-row\", \"mdc-data-table__row\"],\n exportAs: [\"matFooterRow\"],\n features: [i0.ɵɵProvidersFeature([{\n provide: CdkFooterRow,\n useExisting: MatFooterRow\n }]), i0.ɵɵInheritDefinitionFeature],\n decls: 1,\n vars: 0,\n consts: [[\"cdkCellOutlet\", \"\"]],\n template: function MatFooterRow_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementContainer(0, 0);\n }\n },\n dependencies: [CdkCellOutlet],\n encapsulation: 2\n });\n }\n return MatFooterRow;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Data row template container that contains the cell outlet. Adds the right class and role. */\nlet MatRow = /*#__PURE__*/(() => {\n class MatRow extends CdkRow {\n static ɵfac = /* @__PURE__ */(() => {\n let ɵMatRow_BaseFactory;\n return function MatRow_Factory(__ngFactoryType__) {\n return (ɵMatRow_BaseFactory || (ɵMatRow_BaseFactory = i0.ɵɵgetInheritedFactory(MatRow)))(__ngFactoryType__ || MatRow);\n };\n })();\n static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatRow,\n selectors: [[\"mat-row\"], [\"tr\", \"mat-row\", \"\"]],\n hostAttrs: [\"role\", \"row\", 1, \"mat-mdc-row\", \"mdc-data-table__row\"],\n exportAs: [\"matRow\"],\n features: [i0.ɵɵProvidersFeature([{\n provide: CdkRow,\n useExisting: MatRow\n }]), i0.ɵɵInheritDefinitionFeature],\n decls: 1,\n vars: 0,\n consts: [[\"cdkCellOutlet\", \"\"]],\n template: function MatRow_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementContainer(0, 0);\n }\n },\n dependencies: [CdkCellOutlet],\n encapsulation: 2\n });\n }\n return MatRow;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Row that can be used to display a message when no data is shown in the table. */\nlet MatNoDataRow = /*#__PURE__*/(() => {\n class MatNoDataRow extends CdkNoDataRow {\n _contentClassName = 'mat-mdc-no-data-row';\n static ɵfac = /* @__PURE__ */(() => {\n let ɵMatNoDataRow_BaseFactory;\n return function MatNoDataRow_Factory(__ngFactoryType__) {\n return (ɵMatNoDataRow_BaseFactory || (ɵMatNoDataRow_BaseFactory = i0.ɵɵgetInheritedFactory(MatNoDataRow)))(__ngFactoryType__ || MatNoDataRow);\n };\n })();\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatNoDataRow,\n selectors: [[\"ng-template\", \"matNoDataRow\", \"\"]],\n features: [i0.ɵɵProvidersFeature([{\n provide: CdkNoDataRow,\n useExisting: MatNoDataRow\n }]), i0.ɵɵInheritDefinitionFeature]\n });\n }\n return MatNoDataRow;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Column that simply shows text content for the header and row cells. Assumes that the table\n * is using the native table implementation (`
`).\n *\n * By default, the name of this column will be the header text and data property accessor.\n * The header text can be overridden with the `headerText` input. Cell values can be overridden with\n * the `dataAccessor` input. Change the text justification to the start or end using the `justify`\n * input.\n */\nlet MatTextColumn = /*#__PURE__*/(() => {\n class MatTextColumn extends CdkTextColumn {\n static ɵfac = /* @__PURE__ */(() => {\n let ɵMatTextColumn_BaseFactory;\n return function MatTextColumn_Factory(__ngFactoryType__) {\n return (ɵMatTextColumn_BaseFactory || (ɵMatTextColumn_BaseFactory = i0.ɵɵgetInheritedFactory(MatTextColumn)))(__ngFactoryType__ || MatTextColumn);\n };\n })();\n static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatTextColumn,\n selectors: [[\"mat-text-column\"]],\n features: [i0.ɵɵInheritDefinitionFeature],\n decls: 3,\n vars: 0,\n consts: [[\"matColumnDef\", \"\"], [\"mat-header-cell\", \"\", 3, \"text-align\", 4, \"matHeaderCellDef\"], [\"mat-cell\", \"\", 3, \"text-align\", 4, \"matCellDef\"], [\"mat-header-cell\", \"\"], [\"mat-cell\", \"\"]],\n template: function MatTextColumn_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementContainerStart(0, 0);\n i0.ɵɵtemplate(1, MatTextColumn_th_1_Template, 2, 3, \"th\", 1)(2, MatTextColumn_td_2_Template, 2, 3, \"td\", 2);\n i0.ɵɵelementContainerEnd();\n }\n },\n dependencies: [MatColumnDef, MatHeaderCellDef, MatHeaderCell, MatCellDef, MatCell],\n encapsulation: 2\n });\n }\n return MatTextColumn;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst EXPORTED_DECLARATIONS = [\n// Table\nMatTable, MatRecycleRows,\n// Template defs\nMatHeaderCellDef, MatHeaderRowDef, MatColumnDef, MatCellDef, MatRowDef, MatFooterCellDef, MatFooterRowDef,\n// Cell directives\nMatHeaderCell, MatCell, MatFooterCell,\n// Row directives\nMatHeaderRow, MatRow, MatFooterRow, MatNoDataRow, MatTextColumn];\nlet MatTableModule = /*#__PURE__*/(() => {\n class MatTableModule {\n static ɵfac = function MatTableModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || MatTableModule)();\n };\n static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: MatTableModule\n });\n static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n imports: [MatCommonModule, CdkTableModule, MatCommonModule]\n });\n }\n return MatTableModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Corresponds to `Number.MAX_SAFE_INTEGER`. Moved out into a variable here due to\n * flaky browser support and the value not being defined in Closure's typings.\n */\nconst MAX_SAFE_INTEGER = 9007199254740991;\n/**\n * Data source that accepts a client-side data array and includes native support of filtering,\n * sorting (using MatSort), and pagination (using MatPaginator).\n *\n * Allows for sort customization by overriding sortingDataAccessor, which defines how data\n * properties are accessed. Also allows for filter customization by overriding filterPredicate,\n * which defines how row data is converted to a string for filter matching.\n *\n * **Note:** This class is meant to be a simple data source to help you get started. As such\n * it isn't equipped to handle some more advanced cases like robust i18n support or server-side\n * interactions. If your app needs to support more advanced use cases, consider implementing your\n * own `DataSource`.\n */\nclass MatTableDataSource extends DataSource {\n /** Stream that emits when a new data array is set on the data source. */\n _data;\n /** Stream emitting render data to the table (depends on ordered data changes). */\n _renderData = /*#__PURE__*/new BehaviorSubject([]);\n /** Stream that emits when a new filter string is set on the data source. */\n _filter = /*#__PURE__*/new BehaviorSubject('');\n /** Used to react to internal changes of the paginator that are made by the data source itself. */\n _internalPageChanges = /*#__PURE__*/new Subject();\n /**\n * Subscription to the changes that should trigger an update to the table's rendered rows, such\n * as filtering, sorting, pagination, or base data changes.\n */\n _renderChangesSubscription = null;\n /**\n * The filtered set of data that has been matched by the filter string, or all the data if there\n * is no filter. Useful for knowing the set of data the table represents.\n * For example, a 'selectAll()' function would likely want to select the set of filtered data\n * shown to the user rather than all the data.\n */\n filteredData;\n /** Array of data that should be rendered by the table, where each object represents one row. */\n get data() {\n return this._data.value;\n }\n set data(data) {\n data = Array.isArray(data) ? data : [];\n this._data.next(data);\n // Normally the `filteredData` is updated by the re-render\n // subscription, but that won't happen if it's inactive.\n if (!this._renderChangesSubscription) {\n this._filterData(data);\n }\n }\n /**\n * Filter term that should be used to filter out objects from the data array. To override how\n * data objects match to this filter string, provide a custom function for filterPredicate.\n */\n get filter() {\n return this._filter.value;\n }\n set filter(filter) {\n this._filter.next(filter);\n // Normally the `filteredData` is updated by the re-render\n // subscription, but that won't happen if it's inactive.\n if (!this._renderChangesSubscription) {\n this._filterData(this.data);\n }\n }\n /**\n * Instance of the MatSort directive used by the table to control its sorting. Sort changes\n * emitted by the MatSort will trigger an update to the table's rendered data.\n */\n get sort() {\n return this._sort;\n }\n set sort(sort) {\n this._sort = sort;\n this._updateChangeSubscription();\n }\n _sort;\n /**\n * Instance of the paginator component used by the table to control what page of the data is\n * displayed. Page changes emitted by the paginator will trigger an update to the\n * table's rendered data.\n *\n * Note that the data source uses the paginator's properties to calculate which page of data\n * should be displayed. If the paginator receives its properties as template inputs,\n * e.g. `[pageLength]=100` or `[pageIndex]=1`, then be sure that the paginator's view has been\n * initialized before assigning it to this data source.\n */\n get paginator() {\n return this._paginator;\n }\n set paginator(paginator) {\n this._paginator = paginator;\n this._updateChangeSubscription();\n }\n _paginator;\n /**\n * Data accessor function that is used for accessing data properties for sorting through\n * the default sortData function.\n * This default function assumes that the sort header IDs (which defaults to the column name)\n * matches the data's properties (e.g. column Xyz represents data['Xyz']).\n * May be set to a custom function for different behavior.\n * @param data Data object that is being accessed.\n * @param sortHeaderId The name of the column that represents the data.\n */\n sortingDataAccessor = (data, sortHeaderId) => {\n const value = data[sortHeaderId];\n if (_isNumberValue(value)) {\n const numberValue = Number(value);\n // Numbers beyond `MAX_SAFE_INTEGER` can't be compared reliably so we leave them as strings.\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER\n return numberValue < MAX_SAFE_INTEGER ? numberValue : value;\n }\n return value;\n };\n /**\n * Gets a sorted copy of the data array based on the state of the MatSort. Called\n * after changes are made to the filtered data or when sort changes are emitted from MatSort.\n * By default, the function retrieves the active sort and its direction and compares data\n * by retrieving data using the sortingDataAccessor. May be overridden for a custom implementation\n * of data ordering.\n * @param data The array of data that should be sorted.\n * @param sort The connected MatSort that holds the current sort state.\n */\n sortData = (data, sort) => {\n const active = sort.active;\n const direction = sort.direction;\n if (!active || direction == '') {\n return data;\n }\n return data.sort((a, b) => {\n let valueA = this.sortingDataAccessor(a, active);\n let valueB = this.sortingDataAccessor(b, active);\n // If there are data in the column that can be converted to a number,\n // it must be ensured that the rest of the data\n // is of the same type so as not to order incorrectly.\n const valueAType = typeof valueA;\n const valueBType = typeof valueB;\n if (valueAType !== valueBType) {\n if (valueAType === 'number') {\n valueA += '';\n }\n if (valueBType === 'number') {\n valueB += '';\n }\n }\n // If both valueA and valueB exist (truthy), then compare the two. Otherwise, check if\n // one value exists while the other doesn't. In this case, existing value should come last.\n // This avoids inconsistent results when comparing values to undefined/null.\n // If neither value exists, return 0 (equal).\n let comparatorResult = 0;\n if (valueA != null && valueB != null) {\n // Check if one value is greater than the other; if equal, comparatorResult should remain 0.\n if (valueA > valueB) {\n comparatorResult = 1;\n } else if (valueA < valueB) {\n comparatorResult = -1;\n }\n } else if (valueA != null) {\n comparatorResult = 1;\n } else if (valueB != null) {\n comparatorResult = -1;\n }\n return comparatorResult * (direction == 'asc' ? 1 : -1);\n });\n };\n /**\n * Checks if a data object matches the data source's filter string. By default, each data object\n * is converted to a string of its properties and returns true if the filter has\n * at least one occurrence in that string. By default, the filter string has its whitespace\n * trimmed and the match is case-insensitive. May be overridden for a custom implementation of\n * filter matching.\n * @param data Data object used to check against the filter.\n * @param filter Filter string that has been set on the data source.\n * @returns Whether the filter matches against the data\n */\n filterPredicate = (data, filter) => {\n // Transform the filter by converting it to lowercase and removing whitespace.\n const transformedFilter = filter.trim().toLowerCase();\n // Loops over the values in the array and returns true if any of them match the filter string\n return Object.values(data).some(value => `${value}`.toLowerCase().includes(transformedFilter));\n };\n constructor(initialData = []) {\n super();\n this._data = new BehaviorSubject(initialData);\n this._updateChangeSubscription();\n }\n /**\n * Subscribe to changes that should trigger an update to the table's rendered rows. When the\n * changes occur, process the current state of the filter, sort, and pagination along with\n * the provided base data and send it to the table for rendering.\n */\n _updateChangeSubscription() {\n // Sorting and/or pagination should be watched if sort and/or paginator are provided.\n // The events should emit whenever the component emits a change or initializes, or if no\n // component is provided, a stream with just a null event should be provided.\n // The `sortChange` and `pageChange` acts as a signal to the combineLatests below so that the\n // pipeline can progress to the next step. Note that the value from these streams are not used,\n // they purely act as a signal to progress in the pipeline.\n const sortChange = this._sort ? merge(this._sort.sortChange, this._sort.initialized) : of(null);\n const pageChange = this._paginator ? merge(this._paginator.page, this._internalPageChanges, this._paginator.initialized) : of(null);\n const dataStream = this._data;\n // Watch for base data or filter changes to provide a filtered set of data.\n const filteredData = combineLatest([dataStream, this._filter]).pipe(map(([data]) => this._filterData(data)));\n // Watch for filtered data or sort changes to provide an ordered set of data.\n const orderedData = combineLatest([filteredData, sortChange]).pipe(map(([data]) => this._orderData(data)));\n // Watch for ordered data or page changes to provide a paged set of data.\n const paginatedData = combineLatest([orderedData, pageChange]).pipe(map(([data]) => this._pageData(data)));\n // Watched for paged data changes and send the result to the table to render.\n this._renderChangesSubscription?.unsubscribe();\n this._renderChangesSubscription = paginatedData.subscribe(data => this._renderData.next(data));\n }\n /**\n * Returns a filtered data array where each filter object contains the filter string within\n * the result of the filterPredicate function. If no filter is set, returns the data array\n * as provided.\n */\n _filterData(data) {\n // If there is a filter string, filter out data that does not contain it.\n // Each data object is converted to a string using the function defined by filterPredicate.\n // May be overridden for customization.\n this.filteredData = this.filter == null || this.filter === '' ? data : data.filter(obj => this.filterPredicate(obj, this.filter));\n if (this.paginator) {\n this._updatePaginator(this.filteredData.length);\n }\n return this.filteredData;\n }\n /**\n * Returns a sorted copy of the data if MatSort has a sort applied, otherwise just returns the\n * data array as provided. Uses the default data accessor for data lookup, unless a\n * sortDataAccessor function is defined.\n */\n _orderData(data) {\n // If there is no active sort or direction, return the data without trying to sort.\n if (!this.sort) {\n return data;\n }\n return this.sortData(data.slice(), this.sort);\n }\n /**\n * Returns a paged slice of the provided data array according to the provided paginator's page\n * index and length. If there is no paginator provided, returns the data array as provided.\n */\n _pageData(data) {\n if (!this.paginator) {\n return data;\n }\n const startIndex = this.paginator.pageIndex * this.paginator.pageSize;\n return data.slice(startIndex, startIndex + this.paginator.pageSize);\n }\n /**\n * Updates the paginator to reflect the length of the filtered data, and makes sure that the page\n * index does not exceed the paginator's last page. Values are changed in a resolved promise to\n * guard against making property changes within a round of change detection.\n */\n _updatePaginator(filteredDataLength) {\n Promise.resolve().then(() => {\n const paginator = this.paginator;\n if (!paginator) {\n return;\n }\n paginator.length = filteredDataLength;\n // If the page index is set beyond the page, reduce it to the last page.\n if (paginator.pageIndex > 0) {\n const lastPageIndex = Math.ceil(paginator.length / paginator.pageSize) - 1 || 0;\n const newPageIndex = Math.min(paginator.pageIndex, lastPageIndex);\n if (newPageIndex !== paginator.pageIndex) {\n paginator.pageIndex = newPageIndex;\n // Since the paginator only emits after user-generated changes,\n // we need our own stream so we know to should re-render the data.\n this._internalPageChanges.next();\n }\n }\n });\n }\n /**\n * Used by the MatTable. Called when it connects to the data source.\n * @docs-private\n */\n connect() {\n if (!this._renderChangesSubscription) {\n this._updateChangeSubscription();\n }\n return this._renderData;\n }\n /**\n * Used by the MatTable. Called when it disconnects from the data source.\n * @docs-private\n */\n disconnect() {\n this._renderChangesSubscription?.unsubscribe();\n this._renderChangesSubscription = null;\n }\n}\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MatCell, MatCellDef, MatColumnDef, MatFooterCell, MatFooterCellDef, MatFooterRow, MatFooterRowDef, MatHeaderCell, MatHeaderCellDef, MatHeaderRow, MatHeaderRowDef, MatNoDataRow, MatRecycleRows, MatRow, MatRowDef, MatTable, MatTableDataSource, MatTableModule, MatTextColumn };\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { MatTableModule } from '@angular/material/table';\r\n\r\n\r\n@NgModule({\r\n providers: [],\r\n imports: [\r\n CommonModule,\r\n MatTableModule\r\n ],\r\n exports: [\r\n MatTableModule]\r\n})\r\nexport class MaterialTableModule {\r\n}\r\n","import { Component, OnInit } from '@angular/core';\nimport { Faqs } from 'src/app/_models/faqs.model';\n\n@Component({\n selector: 'app-faqs',\n templateUrl: './faqs.component.html',\n styleUrls: ['./faqs.component.scss'],\n standalone: false\n})\nexport class FaqsComponent implements OnInit {\n\n public faqs: Faqs;\n\n constructor() { }\n\n ngOnInit(): void {\n }\n\n}\n","
\n
\n \n \n \n {{section?.icon}}\n {{section?.title}}\n \n \n \n \n \n {{question?.question}}\n \n \n
\n
\n
\n
\n
\n
\n","import { Injectable, OnDestroy } from \"@angular/core\";\r\nimport { BehaviorSubject, Subscription } from \"rxjs\";\r\nimport { Artist } from \"src/app/_models/artist.model\";\r\nimport { ElfaService } from \"./elfa.service\";\r\n\r\n@Injectable()\r\nexport class ArtistService implements OnDestroy {\r\n public artists: BehaviorSubject = new BehaviorSubject(null);\r\n private $artists: Artist[] = null;\r\n private subscriptions: Subscription[] = [];\r\n\r\n constructor(public elfaService: ElfaService) { }\r\n\r\n public load(init?: Artist[]): void {\r\n if (init) {\r\n this.$artists = init;\r\n this.artists.next(this.$artists);\r\n return;\r\n }\r\n if (!this.$artists) {\r\n this.subscriptions.push(this.elfaService.getArtists().subscribe({\r\n next: (res: Artist[]) => {\r\n this.$artists = res;\r\n this.artists.next(this.$artists);\r\n },\r\n error: () => {\r\n this.$artists = null;\r\n this.artists.next(this.$artists);\r\n }\r\n }));\r\n } else{\r\n this.artists.next(this.$artists);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.subscriptions && this.subscriptions.length > 0) {\r\n this.subscriptions.forEach((sub) => { sub.unsubscribe() });\r\n }\r\n }\r\n}\r\n","import { AfterViewInit, Component, ElementRef, Input, OnInit, QueryList, ViewChildren } from '@angular/core';\r\nimport { Artist } from 'src/app/_models/artist.model';\r\nimport { AppSettings } from 'src/app/app.settings';\r\nimport { SwiperOptions } from 'swiper/types';\r\n\r\n@Component({\n selector: 'app-artist-carousel-item',\n templateUrl: './artist-item.component.html',\n styleUrls: ['./artist-item.component.scss'],\n standalone: false\n})\r\nexport class ArtistCarouselItemComponent implements AfterViewInit {\r\n @Input() index: number;\r\n @Input() artists: Artist[] = null;\r\n @Input() config: SwiperOptions = null;\r\n @ViewChildren('artistSwiper') artistSwiper: QueryList;\r\n public timer = false;\r\n\r\n constructor(public settings: AppSettings) { }\r\n\r\n ngAfterViewInit(): void {\r\n this.initSwiper();\r\n }\r\n\r\n public initSwiper(): void {\r\n this.artistSwiper?.forEach((swiper) => {\r\n this.config.initialSlide = this.index;\r\n Object.assign(swiper.nativeElement, this.config);\r\n swiper.nativeElement.initialize();\r\n });\r\n }\r\n\r\n public slideNext() {\r\n this.artistSwiper?.forEach((swiper => {\r\n setTimeout(() => {\r\n swiper?.nativeElement?.swiper?.slideNext(500);\r\n }, this.index * 100);\r\n }));\r\n }\r\n\r\n public slidePrev() {\r\n this.artistSwiper?.forEach((swiper => {\r\n setTimeout(() => {\r\n swiper?.nativeElement?.swiper?.slidePrev(500);\r\n }, this.index * 100);\r\n }));\r\n }\r\n}\r\n","\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {{artist.name}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n","import { Component, OnInit, QueryList, ViewChildren } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { Artist } from 'src/app/_models/artist.model';\r\nimport { ArtistService } from 'src/app/_services/artist.service';\r\nimport { SwiperOptions } from 'swiper/types';\r\nimport { ArtistCarouselItemComponent } from './artist-item/artist-item.component';\r\n\r\n\r\n@Component({\r\n selector: 'app-artist-carousel',\r\n templateUrl: './artist-carousel.component.html',\r\n styleUrls: ['./artist-carousel.component.scss'],\r\n standalone: false\r\n})\r\nexport class ArtistCarouselComponent implements OnInit {\r\n @ViewChildren('itemSwiper') itemSwiper: QueryList;\r\n public config: SwiperOptions = null;\r\n public subscriptions: Subscription[] = [];\r\n public artists: Artist[] = null;\r\n\r\n constructor(public artistService: ArtistService) { }\r\n\r\n ngOnInit(): void {\r\n this.subscriptions.push(this.artistService.artists.subscribe(\r\n artists => {\r\n if (artists) {\r\n this.artists = artists;\r\n this.config = {\r\n resizeObserver: true,\r\n slidesPerView: 1,\r\n spaceBetween: 0,\r\n navigation: false,\r\n pagination: false,\r\n loop: true,\r\n autoplay: false,\r\n effect: 'cube'\r\n };\r\n }\r\n }\r\n ));\r\n }\r\n\r\n public slideNext(){\r\n this.itemSwiper?.forEach((itemSwiper => {\r\n itemSwiper.slideNext();\r\n }));\r\n }\r\n public slidePrev(){\r\n this.itemSwiper?.forEach((itemSwiper => {\r\n itemSwiper.slidePrev();\r\n }));\r\n }\r\n}\r\n\r\n","
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { Manufacturer } from 'src/@omnial/_models/catalog/manufacturer.model';\r\nimport { AppSettings } from 'src/app/app.settings';\r\nimport { ElfaService } from 'src/app/_services/elfa.service';\r\n\r\n@Component({\n selector: 'app-shop-by-elfa-brand',\n templateUrl: './shop-by-elfa-brand.component.html',\n styleUrls: ['./shop-by-elfa-brand.component.scss'],\n standalone: false\n})\r\nexport class ShopByElfaBrandComponent implements OnInit, OnDestroy {\r\n public brands: Manufacturer[];\r\n private subscriptions: Subscription[] = [];\r\n\r\n constructor(private elfaService: ElfaService,\r\n public settings: AppSettings) { }\r\n\r\n ngOnInit(): void {\r\n\r\n this.subscriptions.push(this.elfaService.getBrands().subscribe(\r\n res => {\r\n this.brands = res;\r\n }));\r\n }\r\n\r\n\r\n ngOnDestroy(): void {\r\n if (this.subscriptions) {\r\n this.subscriptions.forEach((sub) => { sub.unsubscribe(); });\r\n }\r\n }\r\n}\r\n","
\r\n
\r\n \"Brands\r\n
\r\n \r\n
\r\n","import { Component, ElementRef, OnDestroy, OnInit, QueryList, ViewChildren } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { Manufacturer } from 'src/@omnial/_models/catalog/manufacturer.model';\r\nimport { AppSettings } from 'src/app/app.settings';\r\nimport { ElfaService } from 'src/app/_services/elfa.service';\r\nimport { SwiperOptions } from 'swiper/types';\r\n\r\n@Component({\n selector: 'app-elfa-brand-carousel',\n templateUrl: './elfa-brand-carousel.component.html',\n styleUrls: ['./elfa-brand-carousel.component.scss'],\n standalone: false\n})\r\nexport class ElfaBrandCarouselComponent implements OnInit, OnDestroy {\r\n @ViewChildren('swiper') swiper: QueryList;\r\n public brands: Manufacturer[];\r\n public config: SwiperOptions = null;\r\n private subscriptions: Subscription[] = [];\r\n\r\n constructor(private elfaService: ElfaService, public settings: AppSettings) { }\r\n\r\n ngOnInit(): void {\r\n this.subscriptions.push(this.elfaService.getBrands().subscribe(\r\n res => {\r\n this.brands = res;\r\n this.config = {\r\n resizeObserver: true,\r\n slidesPerView: 6,\r\n spaceBetween: 0,\r\n grabCursor: false,\r\n loop: true,\r\n speed: 500,\r\n autoplay: true,\r\n freeMode: {\r\n enabled: true,\r\n sticky: true,\r\n }\r\n }\r\n this.swiper?.forEach((swiper) => {\r\n Object.assign(swiper.nativeElement, this.config);\r\n swiper.nativeElement.initialize();\r\n });\r\n }));\r\n }\r\n\r\n\r\n ngOnDestroy(): void {\r\n if (this.subscriptions) {\r\n this.subscriptions.forEach((sub) => { sub.unsubscribe(); });\r\n }\r\n }\r\n}\r\n","
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n","import { CommonModule } from \"@angular/common\";\r\nimport { CUSTOM_ELEMENTS_SCHEMA, NgModule } from \"@angular/core\";\r\nimport { ReactiveFormsModule } from \"@angular/forms\";\r\nimport { RouterModule } from \"@angular/router\";\r\nimport { LazyLoadImageModule } from \"ng-lazyload-image\";\r\nimport { MaterialBaseModule } from \"src/@omnial/material.base.module\";\r\nimport { MaterialExtendModule } from \"src/@omnial/material.extend.module\";\r\nimport { MaterialTableModule } from \"src/@omnial/material.table.module\";\r\nimport { BannersModule } from \"src/@omnial/shared/banners/banners.module\";\r\nimport { PipesModule } from \"src/@omnial/_pipes/pipes.module\";\r\nimport { ProductReviewModule } from \"src/@omnial/shared/product-review/product-review.module\";\r\nimport { ProductsCarouselModule } from \"src/@omnial/shared/products-carousel/products-carousel.module\";\r\nimport { RatingModule } from \"src/@omnial/shared/rating/rating.module\";\r\nimport { TopicContentModule } from \"src/@omnial/shared/topic-content/topic-content.module\";\r\nimport { FaqsComponent } from \"./faqs/faqs.component\";\r\nimport { ArtistCarouselComponent } from \"./artist-carousel/artist-carousel.component\";\r\nimport { ArtistCarouselItemComponent } from \"./artist-carousel/artist-item/artist-item.component\";\r\nimport { ElfaProductFiltersComponent } from \"./elfa-product-filters/elfa-product-filters.component\";\r\nimport { ShopByElfaBrandComponent } from \"./shop-by-elfa-brand/shop-by-elfa-brand.component\";\r\nimport { ElfaBrandCarouselComponent } from \"./elfa-brand-carousel/elfa-brand-carousel.component\";\r\n\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n RatingModule,\r\n ProductsCarouselModule,\r\n ReactiveFormsModule,\r\n MaterialBaseModule,\r\n MaterialExtendModule,\r\n MaterialTableModule,\r\n LazyLoadImageModule,\r\n ProductReviewModule,\r\n PipesModule,\r\n LazyLoadImageModule,\r\n RatingModule,\r\n BannersModule,\r\n TopicContentModule\r\n ],\r\n declarations: [ElfaProductFiltersComponent, FaqsComponent, ArtistCarouselComponent, ArtistCarouselItemComponent, ShopByElfaBrandComponent, ElfaBrandCarouselComponent],\r\n exports: [ElfaProductFiltersComponent, FaqsComponent, ArtistCarouselComponent, ArtistCarouselItemComponent, ShopByElfaBrandComponent, ElfaBrandCarouselComponent],\r\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ]\r\n})\r\nexport class ClientSharedModule { }\r\n"],"mappings":"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","names":["PageState","constructor","pageNumber","position","scrollY","sort","selectedFilters","ProductFilterGroup","ProductFilter","ProductsPagedService","constructor","catalogService","pages","BehaviorSubject","$pages","replace","next","ɵɵinject","CatalogService","factory","ɵfac","ɵɵelementStart","ɵɵtext","ɵɵelementEnd","ɵɵadvance","ɵɵtextInterpolate","ctx_r1","noFilters","ɵɵtextInterpolate1","ɵɵpipeBind3","noFiltered","ɵɵlistener","ɵɵrestoreView","_r1","ɵɵnextContext","ɵɵresetView","showFilters","ɵɵtemplate","ElfaProductFiltersComponent_div_1_span_4_Template","ElfaProductFiltersComponent_div_1_span_9_Template","ElfaProductFiltersComponent_div_1_span_10_Template","ɵɵclassMap","filtersClosed","filterType","ɵɵproperty","filtering","option_r5","_r4","$implicit","changeSort","selectedSort","id","name","ElfaProductFiltersComponent_div_3_div_3_mat_radio_button_7_Template","sortOptions","_r6","filterRemoveAll","_r8","option_r9","filterUpdateOption","ɵɵelement","checked","ɵɵpipeBind1","ɵɵsanitizeHtml","_r10","imageUrl","ɵɵsanitizeUrl","ElfaProductFiltersComponent_div_3_div_4_div_1_mat_tab_group_6_div_1_mat_tab_1_div_1_div_1_button_1_Template","ElfaProductFiltersComponent_div_3_div_4_div_1_mat_tab_group_6_div_1_mat_tab_1_div_1_div_1_button_2_Template","ElfaProductFiltersComponent_div_3_div_4_div_1_mat_tab_group_6_div_1_mat_tab_1_div_1_div_1_Template","filter_r11","toLowerCase","options","option_r13","_r12","disabled","ElfaProductFiltersComponent_div_3_div_4_div_1_mat_tab_group_6_div_1_mat_tab_1_ul_2_li_1_Template","ElfaProductFiltersComponent_div_3_div_4_div_1_mat_tab_group_6_div_1_mat_tab_1_div_1_Template","ElfaProductFiltersComponent_div_3_div_4_div_1_mat_tab_group_6_div_1_mat_tab_1_ul_2_Template","filterName","ElfaProductFiltersComponent_div_3_div_4_div_1_mat_tab_group_6_div_1_mat_tab_1_Template","length","ɵɵtwoWayListener","$event","_r7","i0","ɵɵtwoWayBindingSet","filterTab","ElfaProductFiltersComponent_div_3_div_4_div_1_mat_tab_group_6_div_1_Template","ɵɵtwoWayProperty","group_r14","filters","ElfaProductFiltersComponent_div_3_div_4_div_1_button_4_Template","ElfaProductFiltersComponent_div_3_div_4_div_1_div_5_Template","ElfaProductFiltersComponent_div_3_div_4_div_1_mat_tab_group_6_Template","filterAny","filtersAvailable","ElfaProductFiltersComponent_div_3_div_4_div_1_Template","filterGroups","ElfaProductFiltersComponent_div_3_div_3_Template","ElfaProductFiltersComponent_div_3_div_4_Template","_r3","ElfaProductFiltersComponent","constructor","productsPagedService","menuService","settings","spinner","searchFilters","EventEmitter","filtered","subscriptions","push","megaMenu","subscribe","res","menu","ngOnDestroy","forEach","sub","unsubscribe","setFilters","seName","products","pageState","unFilteredProducts","hasFilters","validFilters","filterUpFront","maintainSort","sort","group","validFilterGroup","filter","validFilter","option","specificationAttributeName","BrandImage","maintainFilters","selectedFilters","some","o","specificationAttributeId","p","specifications","spec","valueRaw","ProductFilter","displayOrder","ProductFilterGroup","filterCount","filterActiveTab","elfaFilterType","filterProducts","setSearchFilters","hide","clearTimeout","filterInfoTimer","setTimeout","environment","filterTimer","brandName","brandsNode","items","find","s","brandNode","children","n","noSelected","f","available","emit","selectedOptions","filterAllComplete","filterSomeComplete","filterSetAll","show","checkedSubCats","hasProducts","checkedFilterType","product","isIncluded","filterTypesToCheck","subCatSpec","brand","b","setPageSateFiltered","pageSize","filteredPages","filteredProducts","field","a","reverse","newPrice","createdOn","position","pageOfProducts","index","filteredProductsNoSeries","page","ProductsPaged","pageIndex","lastPage","productToAdd","visible","replace","catFilters","pageNumber","scrollY","localStorage","setItem","JSON","stringify","PageState","withSeries","included","matches","concat","compareSortOptions","option1","option2","ɵɵdirectiveInject","ProductsPagedService","MenuService","AppSettings","NgxSpinnerService","selectors","inputs","outputs","standalone","decls","vars","consts","template","rf","ctx","ElfaProductFiltersComponent_div_0_Template","ElfaProductFiltersComponent_div_1_Template","ElfaProductFiltersComponent_div_3_Template","CdkTableModule","__ngFactoryType__","ɵɵdefineNgModule","ɵɵdefineInjector","ScrollingModule","MatTableModule","__ngFactoryType__","ɵɵdefineNgModule","ɵɵdefineInjector","MatCommonModule","CdkTableModule","MaterialTableModule","CommonModule","MatTableModule","ɵɵelementStart","ɵɵtext","ɵɵelementEnd","ɵɵadvance","ɵɵtextInterpolate","section_r1","icon","ɵɵtemplate","FaqsComponent_mat_tab_3_ng_template_1_mat_icon_0_Template","ɵɵproperty","title","ɵɵelement","ɵɵtextInterpolate1","question_r2","question","ɵɵpipeBind1","answer","ɵɵsanitizeHtml","FaqsComponent_mat_tab_3_ng_template_1_Template","FaqsComponent_mat_tab_3_mat_expansion_panel_3_Template","questions","FaqsComponent","constructor","ngOnInit","selectors","standalone","decls","vars","consts","template","rf","ctx","FaqsComponent_mat_tab_3_Template","faqs","sections","ArtistService","constructor","elfaService","artists","BehaviorSubject","$artists","subscriptions","load","init","next","push","getArtists","subscribe","res","error","ngOnDestroy","length","forEach","sub","unsubscribe","ɵɵinject","ElfaService","factory","ɵfac","ɵɵelementStart","ɵɵelement","ɵɵelementEnd","ɵɵadvance","ɵɵproperty","manufacturer_r1","pictureUrl","ɵɵsanitizeUrl","name","ɵɵtemplate","ArtistCarouselItemComponent_swiper_slide_2_div_8_Template","ɵɵtext","ɵɵpureFunction1","_c1","artist_r2","seName","ctx_r2","settings","holdingImage","medium","pictures","full","manufacturers","ɵɵtextInterpolate1","ArtistCarouselItemComponent","constructor","artists","config","timer","ngAfterViewInit","initSwiper","artistSwiper","forEach","swiper","initialSlide","index","Object","assign","nativeElement","initialize","slideNext","setTimeout","slidePrev","ɵɵdirectiveInject","AppSettings","selectors","viewQuery","rf","ctx","ArtistCarouselItemComponent_swiper_slide_2_Template","ɵɵelementStart","ɵɵelement","ɵɵelementEnd","ɵɵadvance","ɵɵproperty","ctx_r0","artists","config","ArtistCarouselComponent","constructor","artistService","subscriptions","ngOnInit","push","subscribe","resizeObserver","slidesPerView","spaceBetween","navigation","pagination","loop","autoplay","effect","slideNext","itemSwiper","forEach","slidePrev","ɵɵdirectiveInject","ArtistService","selectors","viewQuery","rf","ctx","ɵɵtemplate","ArtistCarouselComponent_div_1_Template","ɵɵlistener","ɵɵtext","ɵɵelementStart","ɵɵelement","ɵɵelementEnd","ɵɵadvance","ɵɵproperty","ctx_r0","settings","holdingImage","medium","ɵɵsanitizeUrl","ɵɵtext","ɵɵpureFunction1","_c0","brand_r2","seName","pictureUrl","name","ɵɵtextInterpolate","ɵɵtemplate","ShopByElfaBrandComponent_div_2_a_1_Template","ShopByElfaBrandComponent","constructor","elfaService","subscriptions","ngOnInit","push","getBrands","subscribe","res","brands","ngOnDestroy","forEach","sub","unsubscribe","ɵɵdirectiveInject","ElfaService","AppSettings","selectors","standalone","decls","vars","consts","template","rf","ctx","ShopByElfaBrandComponent_div_1_Template","ShopByElfaBrandComponent_div_2_Template","ɵɵelementStart","ɵɵelement","ɵɵelementEnd","ɵɵproperty","ɵɵpureFunction1","_c1","brand_r1","seName","ɵɵadvance","pictureUrl","ɵɵsanitizeUrl","name","ɵɵtemplate","ElfaBrandCarouselComponent_swiper_slide_3_a_1_Template","ElfaBrandCarouselComponent","constructor","elfaService","settings","config","subscriptions","ngOnInit","push","getBrands","subscribe","res","brands","resizeObserver","slidesPerView","spaceBetween","grabCursor","loop","speed","autoplay","freeMode","enabled","sticky","swiper","forEach","Object","assign","nativeElement","initialize","ngOnDestroy","sub","unsubscribe","ɵɵdirectiveInject","ElfaService","AppSettings","selectors","viewQuery","rf","ctx","ElfaBrandCarouselComponent_swiper_slide_3_Template","ClientSharedModule","CommonModule","RouterModule","RatingModule","ProductsCarouselModule","ReactiveFormsModule","MaterialBaseModule","MaterialExtendModule","MaterialTableModule","LazyLoadImageModule","ProductReviewModule","PipesModule","BannersModule","TopicContentModule"],"x_google_ignoreList":[5,6]}