UNPKG

@versatiledatakit/data-pipelines

Version:

Data Pipelines help Data Engineers develop, deploy, run, and manage data processing workloads (called 'Data Job')

698 lines 104 kB
/* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /* eslint-disable @typescript-eslint/naming-convention,@angular-eslint/directive-class-suffix */ import { Directive, Input } from '@angular/core'; import { Subject } from 'rxjs'; import { debounceTime, distinctUntilChanged, take } from 'rxjs/operators'; import { ASC, CollectionsUtil, DESC, TaurusBaseComponent, URLStateManager } from '@versatiledatakit/shared'; import { ErrorUtil } from '../../shared/utils'; import { DataJobExecutionStatus, DataJobStatus, DisplayMode, JOBS_DATA_KEY } from '../../model'; import { TASK_LOAD_JOBS_STATE } from '../../state/tasks'; import { LOAD_JOBS_ERROR_CODES } from '../../state/error-codes'; import * as i0 from "@angular/core"; import * as i1 from "@versatiledatakit/shared"; import * as i2 from "@angular/router"; import * as i3 from "../../services"; import * as i4 from "@angular/common"; export const QUERY_PARAM_SEARCH = 'search'; export class DataJobsBaseGridComponent extends TaurusBaseComponent { constructor(componentService, navigationService, activatedRoute, routerService, dataJobsService, dataJobsApiService, errorHandlerService, location, router, elementRef, document, dataPipelinesModuleConfig, localStorageConfigKey, localStorageUserConfig, className = null) { super(componentService, navigationService, activatedRoute, className ?? DataJobsBaseGridComponent.CLASS_NAME); this.routerService = routerService; this.dataJobsService = dataJobsService; this.dataJobsApiService = dataJobsApiService; this.errorHandlerService = errorHandlerService; this.location = location; this.router = router; this.elementRef = elementRef; this.document = document; this.dataPipelinesModuleConfig = dataPipelinesModuleConfig; this.localStorageConfigKey = localStorageConfigKey; this.localStorageUserConfig = localStorageUserConfig; /** * ** Update strategy that will be used to update Browser URL. * * - 'updateLocation' will update softly update the URL using Location service, and it's default one * - 'updateRouter' will trigger Angular router resolve mechanism with all guards and resolvers through Router service */ this.urlUpdateStrategy = 'updateLocation'; /** * ** Query param key for search value. */ this.searchParam = QUERY_PARAM_SEARCH; /** * ** Position for search query param. */ this.searchParamPosition = 0; /** * ** Base position index for Data Jobs filters query param. * * - Every filter has its own defined +x from the base. */ this.filtersQueryParamPositionBase = 0; this.displayMode = DisplayMode.STANDARD; this.filterByTeamName = false; this.loading = false; this.dataJobs = []; this.totalJobs = 0; this.loadDataDebouncer = new Subject(); this.deploymentStatuses = [DataJobStatus.ENABLED, DataJobStatus.DISABLED, DataJobStatus.NOT_DEPLOYED]; this.executionStatuses = [ DataJobExecutionStatus.SUCCEEDED, DataJobExecutionStatus.PLATFORM_ERROR, DataJobExecutionStatus.USER_ERROR, DataJobExecutionStatus.SKIPPED, DataJobExecutionStatus.CANCELLED ]; this.clrGridCurrentPage = 1; this.dataJobStatus = DataJobStatus; this.initializingComponent = true; /** * ** Array of error code patterns that component should listen for in errors store. */ this.listenForErrorPatterns = [LOAD_JOBS_ERROR_CODES[TASK_LOAD_JOBS_STATE].All]; /** * ** Flag that indicates actionable elements should be disabled. */ this.disableActionableElements = false; this.restoreUIStateInProgress = false; this.navigationInProgress = false; this._isUrlStateManagerExternalDependency = false; this._urlStateManager = new URLStateManager(router.url.split('?')[0], location); } /** * ** URLStateManager external dependency injection to act in synchronous way external pages and the Data Jobs. */ set urlStateManager(value) { if (value) { this._urlStateManager = value; this._isUrlStateManagerExternalDependency = true; } } get urlStateManager() { return this._urlStateManager; } /** * ** NgFor elements tracking function. */ trackByFn(index, dataJob) { return `${index}|${dataJob?.config?.team}|${dataJob?.jobName}`; } resolveLogsUrl(job) { if (CollectionsUtil.isNil(job) || CollectionsUtil.isArrayEmpty(job.deployments)) { return null; } if (CollectionsUtil.isArrayEmpty(job.deployments[0].executions)) { return null; } return job.deployments[0].executions[0].logsUrl; } showOrHideColumnChange(columnName, hidden) { this.localStorageUserConfig.hiddenColumns[columnName] = hidden; localStorage.setItem(this.localStorageConfigKey, JSON.stringify(this.localStorageUserConfig)); } getJobStatus(job) { if (job.deployments && job.deployments[0]?.lastExecutionStatus) { return job.deployments[0]?.lastExecutionStatus; } return null; } getJobSuccessRateTitle(job) { if (job.deployments) { return `${job.deployments[0]?.successfulExecutions} successful / ${job.deployments[0]?.failedExecutions + job.deployments[0]?.successfulExecutions} total`; } return null; } /** * ** Callback (listener) for User search. */ search(value) { this.clrGridUIState.search = value; this._updateUrlStateManager(); this.refresh(); } refresh() { this.loadDataWithState(null); } /** * ** Main callback (listener) for ClrGrid state mutation, like filters, sort. */ loadDataWithState(state) { if (state != null) { this.gridState = state; } if (!this.model || this.restoreUIStateInProgress) { return; } if (this.filterByTeamName && !this.teamNameFilter) { // While the teamNameFilter is empty, no refresh requests will be executed. console.warn('Refresh operation will be skipped. teamNameFilter is empty.'); return; } this.loadDataDebouncer.next('normal'); } isStandardDisplayMode() { return this.displayMode === DisplayMode.STANDARD; } selectionChanged(dataJob) { this.selectedJob = dataJob; } /** * ** Navigate to Data Job details page, while at first save Ui State of the Page. */ navigateToJobDetails(job) { if (job) { this.saveUIState(); this.selectionChanged(job); this.dataJobsService.notifyForTeamImplicitly(job.config?.team); this.navigationInProgress = true; this.navigateTo({ '$.team': job.config?.team, '$.job': job.jobName }).finally(() => { this.navigationInProgress = false; }); } } /** * @inheritDoc */ onModelInit() { let initializationFinished = false; let previousState; this.subscriptions.push(this.routerService .get() .pipe(distinctUntilChanged((a, b) => (a.state.absoluteConfigPath !== b.state.absoluteConfigPath || a.state.absoluteRoutePath === b.state.absoluteRoutePath) && this._areQueryParamsPristine(b.state))) .subscribe((routerState) => { if (initializationFinished) { // check if route state comes from Browser popped state (Browser stack) if ((!previousState || previousState.absoluteRoutePath === routerState.state.absoluteRoutePath) && !this._areQueryParamsPristine(routerState.state)) { this._extractQueryParams(routerState.state); this._updateUrlStateManager(); // set query params mutation to false, because it's Browser popped state // no need to update the Browser URL, just URLStateManager need to be updated this.urlStateManager.isQueryParamsStateMutated = false; } else { this._updateUrlStateManager(routerState.state); } previousState = routerState.state; return; } initializationFinished = true; previousState = routerState.state; this._initUrlStateManager(routerState.state); this._extractQueryParams(routerState.state); if (this._doesRestoreUIStateExist()) { if (this._shouldRestoreUIState(routerState)) { this.restoreUIStateInProgress = true; const clrGridUIState = this.model.getUiState(DataJobsBaseGridComponent.UI_KEY_GRID_UI_STATE); if (clrGridUIState) { this.clrGridUIState = clrGridUIState; } this.loadDataDebouncer.next('forced'); return; } else { this._clearUiPageState(); } } if (this.gridState) { this.refresh(); } })); } /** * @inheritDoc */ onModelInitialLoad() { this.routerService .get() .pipe(take(1)) .subscribe((routerState) => { if (this._shouldRestoreUIState(routerState)) { this.restoreUIState(); this.restoreUIStateInProgress = false; } }); } /** * @inheritDoc */ onModelLoad() { this.loading = false; if (this.initializingComponent) { this.initializingComponent = false; } } /** * @inheritDoc */ onModelChange(model) { this._extractData(model); } /** * @inheritDoc */ onModelError(model, _task, newErrorRecords) { this._extractData(model); newErrorRecords.forEach((errorRecord) => { const error = ErrorUtil.extractError(errorRecord.error); this.errorHandlerService.processError(error); }); } /** * @inheritDoc */ ngOnInit() { this._initializeClrGridUIState(); // attach listener to ErrorStore and listen for Errors change this.errors.onChange((store) => { // if there is record for listened error code patterns disable actionable elements this.disableActionableElements = store.hasCodePattern(...this.listenForErrorPatterns); }); this.subscriptions.push(this.loadDataDebouncer.pipe(debounceTime(300)).subscribe((handling) => { if (this.isLoadDataAllowed() || handling === 'forced') { this._doLoadData(); this._initializeQuickFilters(); this._updateUrlStateManager(); if (this.restoreUIStateInProgress) { this._doUrlUpdate('replaceLocation'); } } if (this.isUrlUpdateAllowed() || handling === 'forced') { this._doUrlUpdate(); } })); super.ngOnInit(); this.loading = true; try { this._loadLocalStorageUserConfig(); } catch (e1) { console.error('Failed to read config from localStorage', e1, 'Will attempt to re-create it.'); try { localStorage.removeItem(this.localStorageConfigKey); this._loadLocalStorageUserConfig(); } catch (e2) { console.error('Was unable to re-initialize localStorage user config', e2); } } } isLoadDataAllowed() { if (!this.gridState) { //While the gridState is empty, no refresh requests will be executed. console.log('Load data will be skipped. gridState is empty. operation not allowed.'); return false; } return !this.navigationInProgress; } isUrlUpdateAllowed() { return !this.navigationInProgress && this.urlStateManager.isQueryParamsStateMutated; } saveUIState() { const dataGrid = this.elementRef.nativeElement.querySelector(DataJobsBaseGridComponent.DATA_GRID_SELECTOR); if (dataGrid) { this.model.withUiState(DataJobsBaseGridComponent.UI_KEY_GRID_OFFSET, { x: dataGrid.scrollLeft, y: dataGrid.scrollTop }); } const contentArea = this.document.querySelector(DataJobsBaseGridComponent.CONTENT_AREA_SELECTOR); if (contentArea) { this.model.withUiState(DataJobsBaseGridComponent.UI_KEY_PAGE_OFFSET, { x: contentArea.scrollLeft, y: contentArea.scrollTop }); } const clrGridUIStateDeepCloned = CollectionsUtil.cloneDeep(this.clrGridUIState); clrGridUIStateDeepCloned.pageSize = this.model.getComponentState()?.page?.size; clrGridUIStateDeepCloned.lastPage = this.clrGridCurrentPage; this.model.withUiState(DataJobsBaseGridComponent.UI_KEY_GRID_UI_STATE, clrGridUIStateDeepCloned); this.componentService.update(this.model.getComponentState()); } restoreUIState() { if (!this._doesRestoreUIStateExist()) { return; } setTimeout(() => { const gridOffset = this.model.getUiState(DataJobsBaseGridComponent.UI_KEY_GRID_OFFSET); const dataGrid = this.elementRef.nativeElement.querySelector(DataJobsBaseGridComponent.DATA_GRID_SELECTOR); if (dataGrid) { dataGrid.scrollTo(gridOffset.x, gridOffset.y); } const pageOffset = this.model.getUiState(DataJobsBaseGridComponent.UI_KEY_PAGE_OFFSET); const contentArea = this.document.querySelector(DataJobsBaseGridComponent.CONTENT_AREA_SELECTOR); if (contentArea) { contentArea.scrollTo(pageOffset.x, pageOffset.y); } this._clearUiPageState(); }, 25); } _shouldRestoreUIState(routerState) { const restoreUiWhen = routerState.state.getData('restoreUiWhen'); if (CollectionsUtil.isNil(restoreUiWhen)) { return true; } if (!CollectionsUtil.isString(restoreUiWhen.previousConfigPathLike)) { return true; } return routerState.getPrevious().state.absoluteConfigPath.includes(restoreUiWhen.previousConfigPathLike); } _doesRestoreUIStateExist() { return (CollectionsUtil.isDefined(this.model) && CollectionsUtil.isDefined(this.model.getUiState(DataJobsBaseGridComponent.UI_KEY_GRID_UI_STATE))); } _clearUiPageState() { this.model.getComponentState().uiState.delete(DataJobsBaseGridComponent.UI_KEY_GRID_OFFSET); this.model.getComponentState().uiState.delete(DataJobsBaseGridComponent.UI_KEY_PAGE_OFFSET); this.model.getComponentState().uiState.delete(DataJobsBaseGridComponent.UI_KEY_GRID_UI_STATE); this.componentService.update(this.model.getComponentState()); } _doLoadData() { this.selectedJob = null; this.loading = true; if (this._doesRestoreUIStateExist()) { this.clrGridCurrentPage = this.clrGridUIState.lastPage; } else { this.model .withFilter(this._buildRefreshFilters()) .withSearch(this.clrGridUIState.search) .withPage(this.gridState?.page?.current, this.gridState?.page?.size); } this.dataJobsService.loadJobs(this.model); } _extractData(model) { const componentState = model.getComponentState(); const dataJobsData = componentState.data.get(JOBS_DATA_KEY) ?? {}; this.dataJobs = CollectionsUtil.isArray(dataJobsData?.content) ? [...dataJobsData?.content] : []; this.clrGridUIState.totalItems = dataJobsData?.totalItems ?? 0; } _initUrlStateManager(routeState) { if (!this._isUrlStateManagerExternalDependency) { this._urlStateManager = new URLStateManager(routeState.absoluteRoutePath, this.location); } } _extractQueryParams(routeState) { if (!routeState.queryParams) { this.clrGridUIState.search = ''; this.clrGridUIState.filter = {}; return; } if (!this.initializingComponent) { this.clrGridUIState.filter.jobName = routeState.getQueryParam('jobName'); this.clrGridUIState.filter.teamName = routeState.getQueryParam('teamName'); this.clrGridUIState.filter.description = routeState.getQueryParam('description'); this.clrGridUIState.filter.deploymentStatus = this._decodeFilterFromQueryParam('deploymentStatus', routeState.getQueryParam('deploymentStatus')); this.clrGridUIState.filter.deploymentLastExecutionStatus = this._decodeFilterFromQueryParam('deploymentLastExecutionStatus', routeState.getQueryParam('deploymentLastExecutionStatus')); } else { this._checkMutatedFilterAndUpdate(routeState, 'jobName', false); this._checkMutatedFilterAndUpdate(routeState, 'teamName', false); this._checkMutatedFilterAndUpdate(routeState, 'description', false); this._checkMutatedFilterAndUpdate(routeState, 'deploymentStatus', true); this._checkMutatedFilterAndUpdate(routeState, 'deploymentLastExecutionStatus', true); } // search has different handling so because of that is last handled const searchQueryString = routeState.getQueryParam(this.searchParam); const normalizedSearchQueryString = searchQueryString ? searchQueryString : ''; if (this.clrGridUIState.search !== normalizedSearchQueryString) { this.search(normalizedSearchQueryString); } } _updateUrlStateManager(routeState) { if (CollectionsUtil.isDefined(routeState)) { this.urlStateManager.baseURL = routeState.absoluteRoutePath; } this.urlStateManager.setQueryParam('jobName', this.clrGridUIState.filter.jobName, this.filtersQueryParamPositionBase + 1); this.urlStateManager.setQueryParam('teamName', this.clrGridUIState.filter.teamName, this.filtersQueryParamPositionBase + 2); this.urlStateManager.setQueryParam('description', this.clrGridUIState.filter.description, this.filtersQueryParamPositionBase + 3); this.urlStateManager.setQueryParam('deploymentStatus', this._encodeFilterForQueryParam('deploymentStatus', this.clrGridUIState.filter.deploymentStatus), this.filtersQueryParamPositionBase + 4); this.urlStateManager.setQueryParam('deploymentLastExecutionStatus', this._encodeFilterForQueryParam('deploymentLastExecutionStatus', this.clrGridUIState.filter.deploymentLastExecutionStatus), this.filtersQueryParamPositionBase + 5); // search has different handling so because of that is last handled this.urlStateManager.setQueryParam(this.searchParam, this.clrGridUIState.search, this.searchParamPosition); } _areQueryParamsPristine(routeState) { if (this.clrGridUIState.search !== routeState.getQueryParam(this.searchParam)) { return false; } if (this.clrGridUIState.filter.jobName !== routeState.getQueryParam('jobName')) { return false; } if (this.clrGridUIState.filter.teamName !== routeState.getQueryParam('teamName')) { return false; } if (this.clrGridUIState.filter.description !== routeState.getQueryParam('description')) { return false; } if (this.clrGridUIState.filter.deploymentStatus !== this._decodeFilterFromQueryParam('deploymentStatus', routeState.getQueryParam('deploymentStatus'))) { return false; } return (this.clrGridUIState.filter.deploymentLastExecutionStatus === this._decodeFilterFromQueryParam('deploymentLastExecutionStatus', routeState.getQueryParam('deploymentLastExecutionStatus'))); } _checkMutatedFilterAndUpdate(routeState, key, decode) { if (!decode) { if (CollectionsUtil.isDefined(routeState.getQueryParam(key)) && this.clrGridUIState.filter[key] !== routeState.getQueryParam(key)) { this.clrGridUIState.filter[key] = routeState.getQueryParam(key); } } else { if (CollectionsUtil.isDefined(routeState.getQueryParam(key) && this.clrGridUIState.filter[key] !== this._decodeFilterFromQueryParam(key, routeState.getQueryParam(key)))) { this.clrGridUIState.filter[key] = this._decodeFilterFromQueryParam(key, routeState.getQueryParam(key)); } } } _doUrlUpdate(strategy = this.urlUpdateStrategy) { if (strategy === 'updateLocation') { this.urlStateManager.locationToURL(); } else if (strategy === 'updateRouter') { // eslint-disable-next-line @typescript-eslint/no-floating-promises this.urlStateManager.navigateToUrl().then(); } else { this.urlStateManager.replaceToUrl(); } } _loadLocalStorageUserConfig() { const userConfig = localStorage.getItem(this.localStorageConfigKey); if (userConfig) { let newColumnProvided = false; const parsedUserConfig = JSON.parse(userConfig); CollectionsUtil.iterateObject(this.localStorageUserConfig.hiddenColumns, (value, key) => { if (!parsedUserConfig.hiddenColumns.hasOwnProperty(key)) { newColumnProvided = true; parsedUserConfig.hiddenColumns[key] = value; } }); if (newColumnProvided) { localStorage.setItem(this.localStorageConfigKey, JSON.stringify(parsedUserConfig)); } this.localStorageUserConfig = parsedUserConfig; } else { localStorage.setItem(this.localStorageConfigKey, JSON.stringify(this.localStorageUserConfig)); } } /** * ** Builds refresh filters. * * - Convert filters from an array to map, because that's what backend-calling service is expecting */ _buildRefreshFilters() { const filters = []; if (this.teamNameFilter) { filters.push({ property: 'config.team', pattern: this.teamNameFilter, sort: null }); } if (this.gridState?.filters) { for (const _filter of this.gridState.filters) { const { property, value } = _filter; filters.push({ property, pattern: this._createApiFilterPattern(property, value), sort: null }); } } if (this.gridState?.sort) { const direction = this.gridState.sort.reverse ? DESC : ASC; filters.push({ property: this.gridState.sort.by, pattern: null, sort: direction }); } return filters; } _encodeFilterForQueryParam(propertyName, value) { switch (propertyName) { case 'deploymentStatus': if (CollectionsUtil.isNil(value)) { return 'all'; } return `${value}`.replace(' ', '_').toLowerCase(); case 'deploymentLastExecutionStatus': if (CollectionsUtil.isNil(value)) { return undefined; } return `${value}`.toLowerCase(); default: return `${value}`.toLowerCase(); } } _decodeFilterFromQueryParam(propertyName, value) { switch (propertyName) { case 'deploymentStatus': switch (value) { case 'enabled': return DataJobStatus.ENABLED; case 'disabled': return DataJobStatus.DISABLED; case 'not_deployed': return DataJobStatus.NOT_DEPLOYED; default: return undefined; } case 'deploymentLastExecutionStatus': if (CollectionsUtil.isNil(value)) { return undefined; } const normalizedExecStatus = `${value}`.toUpperCase(); return this.executionStatuses.includes(normalizedExecStatus) ? normalizedExecStatus : undefined; default: return `${value}`.toLowerCase(); } } _createApiFilterPattern(propertyName, value) { // TODO: Remove this, once the Backend support % filterting for all the properties // TODO: Once jobName get the same handling as config.team, add case proper case switch (propertyName) { case 'config.team': return `%${value}%`; case 'deployments.enabled': return `${value}`.toLowerCase().replace(' ', '_'); case 'deployments.lastExecutionStatus': return `${value}`.toLowerCase(); case 'jobName': return `*${value}*`; default: return `${value}`; } } _initializeQuickFilters() { const activateFilter = (status) => () => { this.clrGridUIState.filter.deploymentStatus = status; }; const deactivateFilter = () => { delete this.clrGridUIState.filter.deploymentStatus; }; const isActiveQuickFilter = (status) => { if (status === 'all') { return CollectionsUtil.isNil(this.clrGridUIState.filter.deploymentStatus); } return this.clrGridUIState.filter.deploymentStatus === status; }; const filters = [ { label: 'All', suppressCancel: true, active: isActiveQuickFilter('all'), onActivate: deactivateFilter }, { label: 'Enabled', active: isActiveQuickFilter(DataJobStatus.ENABLED), onActivate: activateFilter(DataJobStatus.ENABLED), onDeactivate: deactivateFilter, icon: { title: 'Enabled - This job is deployed and executed by schedule', class: 'is-solid status-icon-enabled', shape: 'check-circle', size: 20 } }, { label: 'Disabled', active: isActiveQuickFilter(DataJobStatus.DISABLED), onActivate: activateFilter(DataJobStatus.DISABLED), onDeactivate: deactivateFilter, icon: { title: 'Disabled - This job is deployed but not executing by schedule', class: 'is-solid status-icon-disabled', shape: 'times-circle', size: 15 } }, { label: 'Not Deployed', active: isActiveQuickFilter(DataJobStatus.NOT_DEPLOYED), onActivate: activateFilter(DataJobStatus.NOT_DEPLOYED), onDeactivate: deactivateFilter, icon: { title: 'Not Deployed - This job is created but still not deployed', shape: 'circle', size: 15 } } ]; this.quickFilters = filters; } _initializeClrGridUIState() { this.clrGridUIState = { totalItems: 0, lastPage: 1, pageSize: 25, filter: { ...(this.clrGridDefaultFilter ?? {}) }, sort: { ...(this.clrGridDefaultSort ?? {}) }, search: '' }; } } /** * @inheritDoc */ DataJobsBaseGridComponent.CLASS_NAME = 'DataJobsBaseGridComponent'; /** * @inheritDoc */ DataJobsBaseGridComponent.PUBLIC_NAME = 'DataJobs-BaseGrid-Component'; DataJobsBaseGridComponent.UI_KEY_PAGE_OFFSET = 'pageOffset'; DataJobsBaseGridComponent.UI_KEY_GRID_OFFSET = 'gridOffset'; DataJobsBaseGridComponent.UI_KEY_GRID_UI_STATE = 'gridUIState'; DataJobsBaseGridComponent.CONTENT_AREA_SELECTOR = '.content-area'; DataJobsBaseGridComponent.DATA_GRID_SELECTOR = '.datagrid'; DataJobsBaseGridComponent.ɵfac = function DataJobsBaseGridComponent_Factory(t) { i0.ɵɵinvalidFactory(); }; DataJobsBaseGridComponent.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: DataJobsBaseGridComponent, inputs: { urlUpdateStrategy: "urlUpdateStrategy", searchParam: "searchParam", searchParamPosition: "searchParamPosition", filtersQueryParamPositionBase: "filtersQueryParamPositionBase", urlStateManager: "urlStateManager" }, features: [i0.ɵɵInheritDefinitionFeature] }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DataJobsBaseGridComponent, [{ type: Directive }], function () { return [{ type: i1.ComponentService }, { type: i1.NavigationService }, { type: i2.ActivatedRoute }, { type: i1.RouterService }, { type: i3.DataJobsService }, { type: i3.DataJobsApiService }, { type: i1.ErrorHandlerService }, { type: i4.Location }, { type: i2.Router }, { type: i0.ElementRef }, { type: Document }, { type: undefined }, { type: undefined }, { type: undefined }, { type: undefined }]; }, { urlUpdateStrategy: [{ type: Input }], searchParam: [{ type: Input }], searchParamPosition: [{ type: Input }], filtersQueryParamPositionBase: [{ type: Input }], urlStateManager: [{ type: Input }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1qb2JzLWJhc2UtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhLXBpcGVsaW5lcy9zcmMvbGliL2NvbXBvbmVudHMvYmFzZS1ncmlkL2RhdGEtam9icy1iYXNlLWdyaWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILGdHQUFnRztBQUVoRyxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUlyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJMUUsT0FBTyxFQUVILEdBQUcsRUFDSCxlQUFlLEVBR2YsSUFBSSxFQVlKLG1CQUFtQixFQUNuQixlQUFlLEVBQ2xCLE1BQU0sMEJBQTBCLENBQUM7QUFFbEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSS9DLE9BQU8sRUFFSCxzQkFBc0IsRUFDdEIsYUFBYSxFQUdiLFdBQVcsRUFFWCxhQUFhLEVBQ2hCLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXpELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7Ozs7QUFJaEUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDO0FBa0IzQyxNQUFNLE9BQWdCLHlCQUNsQixTQUFRLG1CQUFtQjtJQTJHM0IsWUFDSSxnQkFBa0MsRUFDbEMsaUJBQW9DLEVBQ3BDLGNBQThCLEVBQ1gsYUFBNEIsRUFDNUIsZUFBZ0MsRUFDaEMsa0JBQXNDLEVBQ3RDLG1CQUF3QyxFQUN4QyxRQUFrQixFQUNsQixNQUFjLEVBQ2QsVUFBbUMs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