@versatiledatakit/data-pipelines
Version:
Data Pipelines help Data Engineers develop, deploy, run, and manage data processing workloads (called 'Data Job')
698 lines • 104 kB
JavaScript
/*
* 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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