UNPKG

@versatiledatakit/data-pipelines

Version:

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

460 lines 84.8 kB
/* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Output } from '@angular/core'; import { ClrDatagridSortOrder } from '@clr/angular'; import { AndCriteria, CollectionsUtil } from '@versatiledatakit/shared'; import { FILTER_DURATION_KEY, FILTER_END_TIME_KEY, FILTER_ID_KEY, FILTER_START_TIME_KEY, FILTER_STATUS_KEY, FILTER_TYPE_KEY, FILTER_VERSION_KEY, SORT_DURATION_KEY, SORT_END_TIME_KEY, SORT_ID_KEY, SORT_START_TIME_KEY, SORT_STATUS_KEY, SORT_TYPE_KEY, SORT_VERSION_KEY } from '../model'; import { ExecutionsStatusCriteria, ExecutionsStringCriteria, ExecutionsTypeCriteria } from './criteria'; import { ExecutionDateComparator, ExecutionDefaultComparator, ExecutionDurationComparator } from './comparators'; import * as i0 from "@angular/core"; import * as i1 from "@clr/angular"; import * as i2 from "../data-job-execution-status-filter/data-job-execution-status-filter.component"; import * as i3 from "../data-job-execution-type-filter/data-job-execution-type-filter.component"; import * as i4 from "@angular/common"; import * as i5 from "../data-job-execution-status/data-job-execution-status.component"; import * as i6 from "../data-job-execution-type/data-job-execution-type.component"; import * as i7 from "../data-job-deployment-details-modal/data-job-deployment-details-modal.component"; function DataJobExecutionsGridComponent_clr_dg_row_25_a_17_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "a", 30); i0.ɵɵelement(1, "clr-icon", 31); i0.ɵɵelementEnd(); } if (rf & 2) { const jobExecution_r5 = i0.ɵɵnextContext().$implicit; i0.ɵɵattribute("href", jobExecution_r5.logsUrl, i0.ɵɵsanitizeUrl); i0.ɵɵadvance(1); i0.ɵɵpropertyInterpolate("title", jobExecution_r5.logsUrl); } } const _c0 = function (a0) { return { "data-pipelines-job__execution--highlighted": a0 }; }; function DataJobExecutionsGridComponent_clr_dg_row_25_Template(rf, ctx) { if (rf & 1) { const _r9 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "clr-dg-row", 18)(1, "clr-dg-cell"); i0.ɵɵelement(2, "lib-data-job-execution-status", 19); i0.ɵɵelementEnd(); i0.ɵɵelementStart(3, "clr-dg-cell", 20); i0.ɵɵelement(4, "lib-data-job-execution-type", 21); i0.ɵɵelementEnd(); i0.ɵɵelementStart(5, "clr-dg-cell", 22); i0.ɵɵtext(6); i0.ɵɵelementEnd(); i0.ɵɵelementStart(7, "clr-dg-cell", 23); i0.ɵɵtext(8); i0.ɵɵelementEnd(); i0.ɵɵelementStart(9, "clr-dg-cell", 24); i0.ɵɵtext(10); i0.ɵɵelementEnd(); i0.ɵɵelementStart(11, "clr-dg-cell", 25); i0.ɵɵtext(12); i0.ɵɵelementEnd(); i0.ɵɵelementStart(13, "clr-dg-cell", 26); i0.ɵɵtext(14); i0.ɵɵpipe(15, "slice"); i0.ɵɵelementEnd(); i0.ɵɵelementStart(16, "clr-dg-cell", 27); i0.ɵɵtemplate(17, DataJobExecutionsGridComponent_clr_dg_row_25_a_17_Template, 2, 2, "a", 28); i0.ɵɵelementEnd(); i0.ɵɵelementStart(18, "clr-dg-action-overflow")(19, "button", 29); i0.ɵɵlistener("click", function DataJobExecutionsGridComponent_clr_dg_row_25_Template_button_click_19_listener() { const restoredCtx = i0.ɵɵrestoreView(_r9); const jobExecution_r5 = restoredCtx.$implicit; const ctx_r8 = i0.ɵɵnextContext(); return ctx_r8.showDeploymentDetails(jobExecution_r5); }); i0.ɵɵtext(20, " Deployment Details "); i0.ɵɵelementEnd()()(); } if (rf & 2) { const jobExecution_r5 = ctx.$implicit; const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(15, _c0, ctx_r2.highlightedExecutionId === jobExecution_r5.id)); i0.ɵɵadvance(2); i0.ɵɵproperty("jobStatus", jobExecution_r5.status)("jobMessage", jobExecution_r5 == null ? null : jobExecution_r5.message)("showErrorMessage", true); i0.ɵɵadvance(2); i0.ɵɵproperty("jobExecution", jobExecution_r5); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(jobExecution_r5.duration); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(jobExecution_r5.startTimeFormatted); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(jobExecution_r5.endTimeFormatted); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(jobExecution_r5.id); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(i0.ɵɵpipeBind3(15, 11, jobExecution_r5.jobVersion, 0, 8)); i0.ɵɵadvance(3); i0.ɵɵproperty("ngIf", jobExecution_r5 == null ? null : jobExecution_r5.logsUrl); } } function DataJobExecutionsGridComponent_lib_data_job_deployment_details_modal_32_Template(rf, ctx) { if (rf & 1) { const _r11 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "lib-data-job-deployment-details-modal", 32); i0.ɵɵlistener("openModalChange", function DataJobExecutionsGridComponent_lib_data_job_deployment_details_modal_32_Template_lib_data_job_deployment_details_modal_openModalChange_0_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r10 = i0.ɵɵnextContext(); return ctx_r10.openDeploymentDetailsModal = $event; }); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r4 = i0.ɵɵnextContext(); i0.ɵɵproperty("dataJobDeployment", ctx_r4.jobDeploymentModalData)("openModal", ctx_r4.openDeploymentDetailsModal); } } const _c1 = function () { return [10, 20, 50, 100]; }; /** * ** Supported filter criteria from Executions grid. */ const GRID_SUPPORTED_EXECUTIONS_FILTER_KEY = [ FILTER_STATUS_KEY, FILTER_TYPE_KEY, FILTER_DURATION_KEY, FILTER_START_TIME_KEY, FILTER_END_TIME_KEY, FILTER_ID_KEY, FILTER_VERSION_KEY ]; /** * ** Supported sort criteria from Executions grid. */ const GRID_SUPPORTED_EXECUTIONS_SORT_KEY = [ SORT_STATUS_KEY, SORT_TYPE_KEY, SORT_DURATION_KEY, SORT_START_TIME_KEY, SORT_END_TIME_KEY, SORT_ID_KEY, SORT_VERSION_KEY ]; export class DataJobExecutionsGridComponent { /** * ** Constructor. */ constructor(changeDetectorRef) { this.changeDetectorRef = changeDetectorRef; this.loading = false; /** * ** Event Emitter that emits events on every user action on grid filters or sort. */ this.gridCriteriaAndComparatorChanged = new EventEmitter(); this.attributeDataCy = 'data-pipelines-data-job-executions'; this.openDeploymentDetailsModal = false; this.paginatedJobExecutions = []; this.isInitialCriteriasEmit = true; this._appliedGridState = { filter: [], sort: undefined }; this._previousAppliedGridState = { filter: [], sort: undefined }; } /** * ** NgFor elements tracking function. */ trackByFn(index, execution) { return `${index}|${execution?.id}`; } showDeploymentDetails(jobExecution) { this.openDeploymentDetailsModal = true; this.jobDeploymentModalData = jobExecution.deployment; this.changeDetectorRef.detectChanges(); } /** * ** Main callback (listener) for ClrGrid state mutation, like filters, sort. */ gridRefresh(state) { if (!state) { return; } let skipCriteriaAndComparatorEmitterDebouncing = false; this.gridState = state; if (this.isInitialCriteriasEmit) { this.isInitialCriteriasEmit = false; skipCriteriaAndComparatorEmitterDebouncing = true; } this._populateManagerFilters(state); this._populateManagerSort(state); this._evaluateGridStateMutation(skipCriteriaAndComparatorEmitterDebouncing); this._paginateExecutions(state); // update Browser URL once only, for every Grid event this.filtersSortManager.updateBrowserUrl(); } /** * @inheritDoc */ ngOnChanges(changes) { if (changes['jobExecutions'] && !CollectionsUtil.isEqual(changes['jobExecutions'].previousValue, changes['jobExecutions'].currentValue)) { this.paginationTotalItems = this.jobExecutions.length; this._paginateExecutions(this.gridState); } } /** * @inheritDoc */ ngOnInit() { this._filterMutationObserver = (changes) => { if (changes.some(([key]) => [...GRID_SUPPORTED_EXECUTIONS_FILTER_KEY, ...GRID_SUPPORTED_EXECUTIONS_SORT_KEY].includes(key))) { this.changeDetectorRef.markForCheck(); } }; // register callback that would listen for mutation of supported filter and sort criteria this.filtersSortManager.registerMutationObserver(this._filterMutationObserver); } /** * @inheritDoc */ ngOnDestroy() { if (CollectionsUtil.isNumber(this._gridCriteriaAndComparatorEmitterTimeoutRef)) { clearTimeout(this._gridCriteriaAndComparatorEmitterTimeoutRef); } this.filtersSortManager.deleteMutationObserver(this._filterMutationObserver); } /** * ** Extract filters from grid state. * - use bulk operation to update manager * @private */ _populateManagerFilters(state) { // on every grid emitted event save currently applied filters for comparison this._previousAppliedGridState.filter = [...this._appliedGridState.filter]; // when grid has user applied filters if (CollectionsUtil.isArray(state.filters)) { if (state.filters.length > 0) { const newFilterPairs = state.filters.map((filter) => [filter.property, filter.value]); // remove known filters if they are already set in the manager but are missing from grid state const filtersForDeletion = GRID_SUPPORTED_EXECUTIONS_FILTER_KEY.filter((supportedCriteria) => this.filtersSortManager.hasFilter(supportedCriteria) && newFilterPairs.findIndex(([criteria]) => supportedCriteria === criteria) === -1).map((supportedCriteria) => [supportedCriteria, null]); newFilterPairs.push(...filtersForDeletion); this.filtersSortManager.bulkUpdate(newFilterPairs.map(([criteria, value]) => [criteria, value, 'filter'])); // set new filters to applied grid filters state this._appliedGridState.filter = [...newFilterPairs]; return; } } else { // clear applied grid filters state this._appliedGridState.filter = []; } // when grid doesn't have user applied filters but manager has from previous actions if (this.filtersSortManager.hasAnyFilter()) { // remove known filters if they are already set in the manager const filtersForDeletion = GRID_SUPPORTED_EXECUTIONS_FILTER_KEY.filter((criteria) => this.filtersSortManager.hasFilter(criteria)).map((criteria) => [criteria, null]); if (filtersForDeletion.length > 0) { this.filtersSortManager.bulkUpdate(filtersForDeletion.map(([criteria, value]) => [criteria, value, 'filter'])); } } } /** * ** Extract sort criteria and direction from grid state and update the manager * @private */ _populateManagerSort(state) { // on every grid emitted event save currently applied sort pair this._previousAppliedGridState.sort = this._appliedGridState.sort; // when grid has user applied sort if (CollectionsUtil.isDefined(state.sort)) { const property = CollectionsUtil.isStringWithContent(state.sort.by) ? state.sort.by : state.sort.by?.property; const direction = state.sort.reverse ? ClrDatagridSortOrder.DESC : ClrDatagridSortOrder.ASC; const newSortPairs = [[property, direction]]; // always remove known previous stored sort criteria and direction // manager supports multi sort, but grid support single sort only // remove known sorts if they are already set in the manager but are missing from grid state const sortsForDeletion = GRID_SUPPORTED_EXECUTIONS_SORT_KEY.filter((supportedCriteria) => this.filtersSortManager.hasSort(supportedCriteria) && newSortPairs.findIndex(([criteria]) => supportedCriteria === criteria) === -1).map((supportedCriteria) => [supportedCriteria, null]); newSortPairs.push(...sortsForDeletion); this.filtersSortManager.bulkUpdate(newSortPairs.map(([criteria, value]) => [criteria, value, 'sort'])); // set new sort to applied grid sort state this._appliedGridState.sort = newSortPairs[0]; return; } else { // clear applied grid sort state this._appliedGridState.sort = undefined; } // when grid doesn't have user applied sort but manager has from previous actions if (this.filtersSortManager.hasAnySort()) { // remove known sort if they are already set in the manager const sortsForDeletion = GRID_SUPPORTED_EXECUTIONS_SORT_KEY.filter((criteria) => this.filtersSortManager.hasSort(criteria)).map((criteria) => [criteria, null]); if (sortsForDeletion.length > 0) { this.filtersSortManager.bulkUpdate(sortsForDeletion.map(([criteria, value]) => [criteria, value, 'sort'])); } } } _paginateExecutions(state) { this.paginationPageNumber = state?.page?.current ?? 1; this.paginationPageSize = state?.page?.size ?? 10; const pageSize = CollectionsUtil.isDefined(this.paginationPageSize) ? this.paginationPageSize : 10; const pageNumber = CollectionsUtil.isDefined(this.paginationPageNumber) ? this.paginationPageNumber - 1 : 0; const from = pageNumber * pageSize; const to = (pageNumber + 1) * pageSize; this.paginatedJobExecutions = this.jobExecutions.slice(from, to); } _evaluateGridStateMutation(skipDebouncing = false) { if (this._previousAppliedGridState.filter.length !== this._appliedGridState.filter.length || this._previousAppliedGridState.sort !== this._appliedGridState.sort) { this._emitGridCriteriaAndComparator(skipDebouncing); return; } if (this._previousAppliedGridState.filter.length === this._appliedGridState.filter.length) { if (!CollectionsUtil.isEqual(this._previousAppliedGridState.filter, this._appliedGridState.filter)) { this._emitGridCriteriaAndComparator(skipDebouncing); return; } } if (!CollectionsUtil.isEqual(this._previousAppliedGridState.sort, this._appliedGridState.sort)) { this._emitGridCriteriaAndComparator(skipDebouncing); return; } } _emitGridCriteriaAndComparator(skipDebouncing = false) { if (CollectionsUtil.isNumber(this._gridCriteriaAndComparatorEmitterTimeoutRef)) { clearTimeout(this._gridCriteriaAndComparatorEmitterTimeoutRef); this._gridCriteriaAndComparatorEmitterTimeoutRef = null; } if (skipDebouncing) { this.gridCriteriaAndComparatorChanged.emit({ filter: this._createFilterCriteria(), sort: this._createSortComparator() }); return; } this._gridCriteriaAndComparatorEmitterTimeoutRef = setTimeout(() => { this.gridCriteriaAndComparatorChanged.emit({ filter: this._createFilterCriteria(), sort: this._createSortComparator() }); this._gridCriteriaAndComparatorEmitterTimeoutRef = null; }, 200); } _createFilterCriteria() { const criteria = []; for (const filterPair of this._appliedGridState.filter) { if (filterPair[0] === 'status') { criteria.push(new ExecutionsStatusCriteria(filterPair[1])); continue; } if (filterPair[0] === 'type') { criteria.push(new ExecutionsTypeCriteria(filterPair[1])); continue; } if (filterPair[0] === 'startTime') { criteria.push(new ExecutionsStringCriteria('startTimeFormatted', filterPair[1])); continue; } if (filterPair[0] === 'endTime') { criteria.push(new ExecutionsStringCriteria('endTimeFormatted', filterPair[1])); continue; } criteria.push(new ExecutionsStringCriteria(filterPair[0], filterPair[1])); } return criteria.length > 0 ? new AndCriteria(...criteria) : null; } _createSortComparator() { if (CollectionsUtil.isDefined(this._appliedGridState.sort)) { const [sortCriteria, sortValue] = this._appliedGridState.sort; if (sortCriteria === 'duration') { return new ExecutionDurationComparator(sortValue === ClrDatagridSortOrder.ASC ? 'ASC' : 'DESC'); } if (sortCriteria === 'startTime' || sortCriteria === 'endTime') { return new ExecutionDateComparator(sortCriteria, sortValue === ClrDatagridSortOrder.ASC ? 'ASC' : 'DESC'); } return new ExecutionDefaultComparator(sortCriteria, sortValue === ClrDatagridSortOrder.ASC ? 'ASC' : 'DESC'); } return null; } } DataJobExecutionsGridComponent.ɵfac = function DataJobExecutionsGridComponent_Factory(t) { return new (t || DataJobExecutionsGridComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; DataJobExecutionsGridComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DataJobExecutionsGridComponent, selectors: [["lib-data-job-executions-grid"]], hostVars: 1, hostBindings: function DataJobExecutionsGridComponent_HostBindings(rf, ctx) { if (rf & 2) { i0.ɵɵattribute("data-cy", ctx.attributeDataCy); } }, inputs: { jobExecutions: "jobExecutions", loading: "loading", filtersSortManager: "filtersSortManager", highlightedExecutionId: "highlightedExecutionId" }, outputs: { gridCriteriaAndComparatorChanged: "gridCriteriaAndComparatorChanged" }, features: [i0.ɵɵNgOnChangesFeature], decls: 33, vars: 47, consts: [["data-cy", "data-pipelines-job-executions-datagrid", 1, "data-pipelines-job-executions-datagrid", 3, "clrDgLoading", "clrDgRefresh"], ["data-cy", "data-pipelines-job-executions-status-header", 3, "clrDgField", "clrFilterValue", "clrDgSortBy", "clrDgSortOrder"], [3, "clrDgFilter"], [3, "property", "value"], ["statusFilter", ""], ["data-cy", "data-pipelines-job-executions-type-header", 1, "grid-column__min-width--s", "grid-column__max-width--s", 3, "clrDgField", "clrFilterValue", "clrDgSortBy", "clrDgSortOrder"], ["typeFilter", ""], ["data-cy", "data-pipelines-job-executions-duration-header", 3, "clrDgField", "clrFilterValue", "clrDgSortBy", "clrDgSortOrder"], ["data-cy", "data-pipelines-job-executions-start-header", 3, "clrDgField", "clrFilterValue", "clrDgSortBy", "clrDgSortOrder"], ["data-cy", "data-pipelines-job-executions-end-header", 3, "clrDgField", "clrFilterValue", "clrDgSortBy", "clrDgSortOrder"], ["data-cy", "data-pipelines-job-executions-id-header", 3, "clrDgField", "clrFilterValue", "clrDgSortBy", "clrDgSortOrder"], ["data-cy", "data-pipelines-job-executions-version-header", 3, "clrDgField", "clrFilterValue", "clrDgSortBy", "clrDgSortOrder"], [1, "grid-column__min-width--s", "grid-column__max-width--s"], [3, "ngClass", 4, "ngFor", "ngForOf", "ngForTrackBy"], ["data-cy", "data-pipelines-job-executions-datagrid-pagination", 3, "clrDgTotalItems", "clrDgPageSize", "clrDgPage", "clrDgPageChange"], ["pagination", ""], [3, "clrPageSizeOptions"], [3, "dataJobDeployment", "openModal", "openModalChange", 4, "ngIf"], [3, "ngClass"], ["data-cy", "data-pipelines-job-execution-status", 3, "jobStatus", "jobMessage", "showErrorMessage"], ["data-cy", "data-pipelines-job-executions-type-cell", 1, "execution-type-cell", "grid-column__min-width--s", "grid-column__max-width--s"], [3, "jobExecution"], ["data-cy", "data-pipelines-job-executions-duration-cell"], ["data-cy", "data-pipelines-job-executions-start-cell"], ["data-cy", "data-pipelines-job-executions-end-cell"], ["data-cy", "data-pipelines-job-executions-id-cell"], ["data-cy", "data-pipelines-job-executions-job-version-cell"], [1, "text-center", "grid-column__min-width--s", "grid-column__max-width--s"], ["class", "label-link", "target", "_blank", "rel", "noopener", 4, "ngIf"], [1, "action-item", 3, "click"], ["target", "_blank", "rel", "noopener", 1, "label-link"], ["shape", "pop-out", "size", "15", 3, "title"], [3, "dataJobDeployment", "openModal", "openModalChange"]], template: function DataJobExecutionsGridComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "clr-datagrid", 0); i0.ɵɵlistener("clrDgRefresh", function DataJobExecutionsGridComponent_Template_clr_datagrid_clrDgRefresh_0_listener($event) { return ctx.gridRefresh($event); }); i0.ɵɵelementStart(1, "clr-dg-placeholder"); i0.ɵɵtext(2, "We couldn't find any executions!"); i0.ɵɵelementEnd(); i0.ɵɵelementStart(3, "clr-dg-column", 1); i0.ɵɵtext(4, "Status "); i0.ɵɵelementStart(5, "clr-dg-filter", 2); i0.ɵɵelement(6, "lib-data-job-execution-status-filter", 3, 4); i0.ɵɵelementEnd()(); i0.ɵɵelementStart(8, "clr-dg-column", 5); i0.ɵɵtext(9, "Type "); i0.ɵɵelementStart(10, "clr-dg-filter", 2); i0.ɵɵelement(11, "lib-data-job-execution-type-filter", 3, 6); i0.ɵɵelementEnd()(); i0.ɵɵelementStart(13, "clr-dg-column", 7); i0.ɵɵtext(14, "Duration "); i0.ɵɵelementEnd(); i0.ɵɵelementStart(15, "clr-dg-column", 8); i0.ɵɵtext(16, "Start (UTC) "); i0.ɵɵelementEnd(); i0.ɵɵelementStart(17, "clr-dg-column", 9); i0.ɵɵtext(18, "End (UTC) "); i0.ɵɵelementEnd(); i0.ɵɵelementStart(19, "clr-dg-column", 10); i0.ɵɵtext(20, "ID "); i0.ɵɵelementEnd(); i0.ɵɵelementStart(21, "clr-dg-column", 11); i0.ɵɵtext(22, "Version "); i0.ɵɵelementEnd(); i0.ɵɵelementStart(23, "clr-dg-column", 12); i0.ɵɵtext(24, "Logs"); i0.ɵɵelementEnd(); i0.ɵɵtemplate(25, DataJobExecutionsGridComponent_clr_dg_row_25_Template, 21, 17, "clr-dg-row", 13); i0.ɵɵelementStart(26, "clr-dg-footer")(27, "clr-dg-pagination", 14, 15); i0.ɵɵlistener("clrDgPageChange", function DataJobExecutionsGridComponent_Template_clr_dg_pagination_clrDgPageChange_27_listener($event) { return ctx.paginationPageNumber = $event; }); i0.ɵɵelementStart(29, "clr-dg-page-size", 16); i0.ɵɵtext(30, "Executions per page"); i0.ɵɵelementEnd(); i0.ɵɵtext(31); i0.ɵɵelementEnd()()(); i0.ɵɵtemplate(32, DataJobExecutionsGridComponent_lib_data_job_deployment_details_modal_32_Template, 1, 2, "lib-data-job-deployment-details-modal", 17); } if (rf & 2) { const _r0 = i0.ɵɵreference(7); const _r1 = i0.ɵɵreference(12); const _r3 = i0.ɵɵreference(28); i0.ɵɵproperty("clrDgLoading", ctx.loading); i0.ɵɵattribute("data-automation", ctx.loading ? null : "clr-grid-loaded"); i0.ɵɵadvance(3); i0.ɵɵproperty("clrDgField", "status")("clrFilterValue", ctx.filtersSortManager.filterCriteria["status"])("clrDgSortBy", "status")("clrDgSortOrder", ctx.filtersSortManager.sortCriteria["status"]); i0.ɵɵadvance(2); i0.ɵɵproperty("clrDgFilter", _r0); i0.ɵɵadvance(1); i0.ɵɵproperty("property", "status")("value", ctx.filtersSortManager.filterCriteria["status"]); i0.ɵɵadvance(2); i0.ɵɵproperty("clrDgField", "type")("clrFilterValue", ctx.filtersSortManager.filterCriteria["type"])("clrDgSortBy", "type")("clrDgSortOrder", ctx.filtersSortManager.sortCriteria["type"]); i0.ɵɵadvance(2); i0.ɵɵproperty("clrDgFilter", _r1); i0.ɵɵadvance(1); i0.ɵɵproperty("property", "type")("value", ctx.filtersSortManager.filterCriteria["type"]); i0.ɵɵadvance(2); i0.ɵɵproperty("clrDgField", "duration")("clrFilterValue", ctx.filtersSortManager.filterCriteria["duration"])("clrDgSortBy", "duration")("clrDgSortOrder", ctx.filtersSortManager.sortCriteria["duration"]); i0.ɵɵadvance(2); i0.ɵɵproperty("clrDgField", "startTime")("clrFilterValue", ctx.filtersSortManager.filterCriteria["startTime"])("clrDgSortBy", "startTime")("clrDgSortOrder", ctx.filtersSortManager.sortCriteria["startTime"]); i0.ɵɵadvance(2); i0.ɵɵproperty("clrDgField", "endTime")("clrFilterValue", ctx.filtersSortManager.filterCriteria["endTime"])("clrDgSortBy", "endTime")("clrDgSortOrder", ctx.filtersSortManager.sortCriteria["endTime"]); i0.ɵɵadvance(2); i0.ɵɵproperty("clrDgField", "id")("clrFilterValue", ctx.filtersSortManager.filterCriteria["id"])("clrDgSortBy", "id")("clrDgSortOrder", ctx.filtersSortManager.sortCriteria["id"]); i0.ɵɵadvance(2); i0.ɵɵproperty("clrDgField", "jobVersion")("clrFilterValue", ctx.filtersSortManager.filterCriteria["jobVersion"])("clrDgSortBy", "jobVersion")("clrDgSortOrder", ctx.filtersSortManager.sortCriteria["jobVersion"]); i0.ɵɵadvance(4); i0.ɵɵproperty("ngForOf", ctx.paginatedJobExecutions)("ngForTrackBy", ctx.trackByFn); i0.ɵɵadvance(2); i0.ɵɵproperty("clrDgTotalItems", ctx.paginationTotalItems)("clrDgPageSize", ctx.paginationPageSize)("clrDgPage", ctx.paginationPageNumber); i0.ɵɵadvance(2); i0.ɵɵproperty("clrPageSizeOptions", i0.ɵɵpureFunction0(46, _c1)); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate3(" ", _r3.firstItem + 1, " - ", _r3.lastItem + 1, " of ", _r3.totalItems, " executions "); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.jobDeploymentModalData); } }, directives: [i1.ClrDatagrid, i1.ÇlrDatagridMainRenderer, i1.ÇlrDatagridWillyWonka, i1.ÇlrActionableOompaLoompa, i1.ÇlrExpandableOompaLoompa, i1.ClrDatagridPlaceholder, i1.ClrDatagridColumn, i1.ÇlrDatagridHeaderRenderer, i1.ClrDatagridFilter, i2.DataJobExecutionStatusFilterComponent, i3.DataJobExecutionTypeFilterComponent, i4.NgForOf, i1.ClrDatagridItemsTrackBy, i1.ClrDatagridRow, i1.ÇlrDatagridRowRenderer, i4.NgClass, i1.ClrDatagridCell, i1.ÇlrDatagridCellRenderer, i5.DataJobExecutionStatusComponent, i6.DataJobExecutionTypeComponent, i4.NgIf, i1.ClrIconCustomTag, i1.ClrDatagridActionOverflow, i1.ClrDatagridFooter, i1.ClrDatagridPagination, i1.ClrDatagridPageSize, i7.DataJobDeploymentDetailsModalComponent], pipes: [i4.SlicePipe], styles: [".execution-type-cell[_ngcontent-%COMP%]{text-align:center}.grid-column__min-width--s[_ngcontent-%COMP%]{min-width:3.5rem}.grid-column__max-width--s[_ngcontent-%COMP%]{max-width:4rem}clr-datagrid.data-pipelines-job-executions-datagrid[_ngcontent-%COMP%] clr-dg-row.data-pipelines-job__execution--highlighted[_ngcontent-%COMP%]{--execution-row-highlighted: var(--clr-datagrid-row-hover, #e8e8e8);background-color:var(--execution-row-highlighted)}clr-datagrid.data-pipelines-job-executions-datagrid[_ngcontent-%COMP%] clr-dg-row.data-pipelines-job__execution--highlighted[_ngcontent-%COMP%] .datagrid-row-sticky{background-color:var(--execution-row-highlighted)} .fade-to-dark.dark clr-datagrid.data-pipelines-job-executions-datagrid clr-dg-row.data-pipelines-job__execution--highlighted{--execution-row-highlighted: #28404d}"], changeDetection: 0 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DataJobExecutionsGridComponent, [{ type: Component, args: [{ selector: 'lib-data-job-executions-grid', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2023-2025 Broadcom\n ~ SPDX-License-Identifier: Apache-2.0\n -->\n\n<clr-datagrid\n data-cy=\"data-pipelines-job-executions-datagrid\"\n class=\"data-pipelines-job-executions-datagrid\"\n [attr.data-automation]=\"loading ? null : 'clr-grid-loaded'\"\n [clrDgLoading]=\"loading\"\n (clrDgRefresh)=\"gridRefresh($event)\"\n>\n <clr-dg-placeholder>We couldn't find any executions!</clr-dg-placeholder>\n\n <clr-dg-column\n data-cy=\"data-pipelines-job-executions-status-header\"\n [clrDgField]=\"'status'\"\n [clrFilterValue]=\"filtersSortManager.filterCriteria['status']\"\n [clrDgSortBy]=\"'status'\"\n [clrDgSortOrder]=\"filtersSortManager.sortCriteria['status']\"\n >Status\n <clr-dg-filter [clrDgFilter]=\"statusFilter\">\n <lib-data-job-execution-status-filter\n #statusFilter\n [property]=\"'status'\"\n [value]=\"filtersSortManager.filterCriteria['status']\"\n ></lib-data-job-execution-status-filter>\n </clr-dg-filter>\n </clr-dg-column>\n <clr-dg-column\n class=\"grid-column__min-width--s grid-column__max-width--s\"\n data-cy=\"data-pipelines-job-executions-type-header\"\n [clrDgField]=\"'type'\"\n [clrFilterValue]=\"filtersSortManager.filterCriteria['type']\"\n [clrDgSortBy]=\"'type'\"\n [clrDgSortOrder]=\"filtersSortManager.sortCriteria['type']\"\n >Type\n <clr-dg-filter [clrDgFilter]=\"typeFilter\">\n <lib-data-job-execution-type-filter\n #typeFilter\n [property]=\"'type'\"\n [value]=\"filtersSortManager.filterCriteria['type']\"\n ></lib-data-job-execution-type-filter>\n </clr-dg-filter>\n </clr-dg-column>\n <clr-dg-column\n data-cy=\"data-pipelines-job-executions-duration-header\"\n [clrDgField]=\"'duration'\"\n [clrFilterValue]=\"filtersSortManager.filterCriteria['duration']\"\n [clrDgSortBy]=\"'duration'\"\n [clrDgSortOrder]=\"filtersSortManager.sortCriteria['duration']\"\n >Duration\n </clr-dg-column>\n <clr-dg-column\n data-cy=\"data-pipelines-job-executions-start-header\"\n [clrDgField]=\"'startTime'\"\n [clrFilterValue]=\"filtersSortManager.filterCriteria['startTime']\"\n [clrDgSortBy]=\"'startTime'\"\n [clrDgSortOrder]=\"filtersSortManager.sortCriteria['startTime']\"\n >Start (UTC)\n </clr-dg-column>\n <clr-dg-column\n data-cy=\"data-pipelines-job-executions-end-header\"\n [clrDgField]=\"'endTime'\"\n [clrFilterValue]=\"filtersSortManager.filterCriteria['endTime']\"\n [clrDgSortBy]=\"'endTime'\"\n [clrDgSortOrder]=\"filtersSortManager.sortCriteria['endTime']\"\n >End (UTC)\n </clr-dg-column>\n <clr-dg-column\n data-cy=\"data-pipelines-job-executions-id-header\"\n [clrDgField]=\"'id'\"\n [clrFilterValue]=\"filtersSortManager.filterCriteria['id']\"\n [clrDgSortBy]=\"'id'\"\n [clrDgSortOrder]=\"filtersSortManager.sortCriteria['id']\"\n >ID\n </clr-dg-column>\n <clr-dg-column\n data-cy=\"data-pipelines-job-executions-version-header\"\n [clrDgField]=\"'jobVersion'\"\n [clrFilterValue]=\"filtersSortManager.filterCriteria['jobVersion']\"\n [clrDgSortBy]=\"'jobVersion'\"\n [clrDgSortOrder]=\"filtersSortManager.sortCriteria['jobVersion']\"\n >Version\n </clr-dg-column>\n <clr-dg-column class=\"grid-column__min-width--s grid-column__max-width--s\"\n >Logs</clr-dg-column\n >\n\n <clr-dg-row\n *ngFor=\"let jobExecution of paginatedJobExecutions; trackBy: trackByFn\"\n [ngClass]=\"{'data-pipelines-job__execution--highlighted': highlightedExecutionId === jobExecution.id}\"\n >\n <clr-dg-cell>\n <lib-data-job-execution-status\n [jobStatus]=\"jobExecution.status\"\n [jobMessage]=\"jobExecution?.message\"\n [showErrorMessage]=\"true\"\n data-cy=\"data-pipelines-job-execution-status\"\n ></lib-data-job-execution-status>\n </clr-dg-cell>\n <clr-dg-cell\n class=\"execution-type-cell grid-column__min-width--s grid-column__max-width--s\"\n data-cy=\"data-pipelines-job-executions-type-cell\"\n >\n <lib-data-job-execution-type\n [jobExecution]=\"jobExecution\"\n ></lib-data-job-execution-type>\n </clr-dg-cell>\n <clr-dg-cell data-cy=\"data-pipelines-job-executions-duration-cell\"\n >{{ jobExecution.duration }}</clr-dg-cell\n >\n <clr-dg-cell data-cy=\"data-pipelines-job-executions-start-cell\"\n >{{ jobExecution.startTimeFormatted }}</clr-dg-cell\n >\n <clr-dg-cell data-cy=\"data-pipelines-job-executions-end-cell\"\n >{{ jobExecution.endTimeFormatted }}</clr-dg-cell\n >\n <clr-dg-cell data-cy=\"data-pipelines-job-executions-id-cell\"\n >{{ jobExecution.id }}</clr-dg-cell\n >\n <clr-dg-cell data-cy=\"data-pipelines-job-executions-job-version-cell\"\n >{{ jobExecution.jobVersion | slice : 0 : 8 }}</clr-dg-cell\n >\n <clr-dg-cell\n class=\"text-center grid-column__min-width--s grid-column__max-width--s\"\n >\n <a\n *ngIf=\"jobExecution?.logsUrl\"\n class=\"label-link\"\n [attr.href]=\"jobExecution.logsUrl\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n <clr-icon\n shape=\"pop-out\"\n size=\"15\"\n title=\"{{ jobExecution.logsUrl }}\"\n ></clr-icon>\n </a>\n </clr-dg-cell>\n <clr-dg-action-overflow>\n <button\n class=\"action-item\"\n (click)=\"showDeploymentDetails(jobExecution)\"\n >\n Deployment Details\n </button>\n </clr-dg-action-overflow>\n </clr-dg-row>\n\n <clr-dg-footer>\n <clr-dg-pagination\n #pagination\n data-cy=\"data-pipelines-job-executions-datagrid-pagination\"\n [clrDgTotalItems]=\"paginationTotalItems\"\n [clrDgPageSize]=\"paginationPageSize\"\n [(clrDgPage)]=\"paginationPageNumber\"\n >\n <clr-dg-page-size [clrPageSizeOptions]=\"[10, 20, 50, 100]\"\n >Executions per page</clr-dg-page-size\n >\n {{ pagination.firstItem + 1 }} - {{ pagination.lastItem + 1 }} of {{\n pagination.totalItems }} executions\n </clr-dg-pagination>\n </clr-dg-footer>\n</clr-datagrid>\n\n<lib-data-job-deployment-details-modal\n *ngIf=\"jobDeploymentModalData\"\n [dataJobDeployment]=\"jobDeploymentModalData\"\n [(openModal)]=\"openDeploymentDetailsModal\"\n></lib-data-job-deployment-details-modal>\n", styles: ["/*!\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */.execution-type-cell{text-align:center}.grid-column__min-width--s{min-width:3.5rem}.grid-column__max-width--s{max-width:4rem}clr-datagrid.data-pipelines-job-executions-datagrid clr-dg-row.data-pipelines-job__execution--highlighted{--execution-row-highlighted: var(--clr-datagrid-row-hover, #e8e8e8);background-color:var(--execution-row-highlighted)}clr-datagrid.data-pipelines-job-executions-datagrid clr-dg-row.data-pipelines-job__execution--highlighted ::ng-deep .datagrid-row-sticky{background-color:var(--execution-row-highlighted)}::ng-deep .fade-to-dark.dark clr-datagrid.data-pipelines-job-executions-datagrid clr-dg-row.data-pipelines-job__execution--highlighted{--execution-row-highlighted: #28404d}\n"] }] }], function () { return [{ type: i0.ChangeDetectorRef }]; }, { jobExecutions: [{ type: Input }], loading: [{ type: Input }], filtersSortManager: [{ type: Input }], highlightedExecutionId: [{ type: Input }], gridCriteriaAndComparatorChanged: [{ type: Output }], attributeDataCy: [{ type: HostBinding, args: ['attr.data-cy'] }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1qb2ItZXhlY3V0aW9ucy1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGEtcGlwZWxpbmVzL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWpvYi9wYWdlcy9leGVjdXRpb25zL2RhdGEtam9iLWV4ZWN1dGlvbnMtZ3JpZC9kYXRhLWpvYi1leGVjdXRpb25zLWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS1waXBlbGluZXMvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtam9iL3BhZ2VzL2V4ZWN1dGlvbnMvZGF0YS1qb2ItZXhlY3V0aW9ucy1ncmlkL2RhdGEtam9iLWV4ZWN1dGlvbnMtZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQ0gsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFJTCxNQUFNLEVBRVQsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLG9CQUFvQixFQUE2QixNQUFNLGNBQWMsQ0FBQztBQUUvRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBd0IsTUFBTSwwQkFBMEIsQ0FBQztBQU05RixPQUFPLEVBTUgsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixlQUFlLEVBQ2Ysa0JBQWtCLEVBRWxCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YsYUFBYSxFQUNiLGdCQUFnQixFQUNuQixNQUFNLFVBQVUsQ0FBQztBQUVsQixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsd0JBQXdCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENB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