UNPKG

@versatiledatakit/data-pipelines

Version:

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

1,116 lines (1,085 loc) 841 kB
import * as i0 from '@angular/core'; import { Directive, Input, Pipe, LOCALE_ID, Inject, InjectionToken, EventEmitter, Output, Component, ChangeDetectionStrategy, ViewEncapsulation, Injectable, HostBinding, ViewChild, HostListener, NgModule } from '@angular/core'; import * as i4 from '@angular/common'; import { PercentPipe, DOCUMENT, DatePipe, CommonModule } from '@angular/common'; import * as i2$2 from '@angular/router'; import { RouterModule } from '@angular/router'; import * as i4$1 from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import * as i10 from '@yellowspot/ng-truncate'; import { TruncateModule } from '@yellowspot/ng-truncate'; import * as i3$2 from '@swimlane/ngx-charts'; import { NgxChartsModule } from '@swimlane/ngx-charts'; import * as i3 from 'ngx-timeago'; import { TimeagoModule } from 'ngx-timeago'; import * as i3$1 from 'ngx-lottie'; import { LottieModule } from 'ngx-lottie'; import * as i4$2 from 'ng2-date-picker'; import { DpDatePickerModule } from 'ng2-date-picker'; import * as i6 from '@clr/angular'; import { ClrLoadingState, ClrDatagridSortOrder, ClarityModule } from '@clr/angular'; import * as i1 from '@versatiledatakit/shared'; import { TaurusObject, CollectionsUtil, VmwToastType, TaurusBaseApiService, TaurusBaseEffects, getModel, getModelAndTask, ComponentLoaded, ComponentFailed, processServiceRequestError, LOADED, ComponentUpdate, extractTaskFromIdentifier, generateErrorCode, TaurusBaseComponent, URLStateManager, DESC, ASC, VdkFormState, FORM_STATE, AndCriteria, VdkSharedComponentsModule, VdkSharedFeaturesModule, VdkSharedNgRxModule } from '@versatiledatakit/shared'; import cronstrue from 'cronstrue'; import * as parser from 'cron-parser'; import { Subject, expand, EMPTY, throwError, BehaviorSubject, merge, of, interval, timer, concatMap } from 'rxjs'; import { gql, InMemoryCache, ApolloError } from '@apollo/client/core'; import * as i1$1 from 'apollo-angular'; import * as i2 from 'apollo-angular/http'; import { map, catchError, switchMap, tap, take, distinctUntilChanged, debounceTime, finalize, takeUntil, filter, takeWhile, delay } from 'rxjs/operators'; import * as i2$1 from '@angular/common/http'; import { HttpHeaders, HttpErrorResponse } from '@angular/common/http'; import * as i1$2 from '@ngrx/effects'; import { createEffect, ofType } from '@ngrx/effects'; import * as fileSaver from 'file-saver'; import { get } from 'lodash'; import moment from 'moment'; import { Chart, registerables } from 'chart.js'; import ChartDataLabels from 'chartjs-plugin-datalabels'; import zoomPlugin from 'chartjs-plugin-zoom'; import 'chartjs-adapter-date-fns'; /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /** * ** Directive that set provided object as Element attributes. * * @author gorankokin */ class AttributesDirective extends TaurusObject { /** * ** Constructor. */ constructor(el, renderer) { super(); this.el = el; this.renderer = renderer; } /** * @inheritDoc */ ngOnChanges(_changes) { this._transformAttributes(); } /** * @inheritDoc */ ngOnInit() { this._transformAttributes(); } _transformAttributes() { if (CollectionsUtil.isEqual(this.attributes, this._attributesCopy)) { return; } if (CollectionsUtil.isNil(this.attributes)) { if (CollectionsUtil.isNil(this._attributesCopy)) { return; } CollectionsUtil.iterateObject(this._attributesCopy, (_attributeValue, attributeName) => { this._removeAttribute(attributeName); }); return; } if (!CollectionsUtil.isLiteralObject(this.attributes)) { return; } this._attributesCopy = CollectionsUtil.cloneDeep(this.attributes); CollectionsUtil.iterateObject(this._attributesCopy, (attributeValue, attributeName) => { this._setOrRemoveAttribute(attributeName, attributeValue); }); } _setOrRemoveAttribute(attributeName, attributeValue) { if (AttributesDirective._isTruthy(attributeValue)) { this._setAttribute(attributeName, attributeValue); } else { this._removeAttribute(attributeName); } } _setAttribute(attributeName, attributeValue) { this.renderer.setAttribute(this.el.nativeElement, attributeName, attributeValue); } _removeAttribute(attributeName) { this.renderer.removeAttribute(this.el.nativeElement, attributeName); } // eslint-disable-next-line @typescript-eslint/member-ordering,@typescript-eslint/no-explicit-any static _isTruthy(value) { return AttributesDirective._valueNotIn(value, [undefined, false, null, 'delete', 'false', '']); } // eslint-disable-next-line @typescript-eslint/member-ordering,@typescript-eslint/no-explicit-any static _valueNotIn(value, forbiddenValues) { return forbiddenValues.every((prop) => value !== prop); } } AttributesDirective.ɵfac = function AttributesDirective_Factory(t) { return new (t || AttributesDirective)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.Renderer2)); }; AttributesDirective.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: AttributesDirective, selectors: [["", "libSetAttributes", ""]], inputs: { attributes: "attributes" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature] }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AttributesDirective, [{ type: Directive, args: [{ selector: '[libSetAttributes]' }] }], function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, { attributes: [{ type: Input }] }); })(); /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ class ContactsPresentPipe { /** * @inheritDoc */ transform(contacts) { return (CollectionsUtil.isDefined(contacts) && (ContactsPresentPipe.contactIsPresent(contacts.notifiedOnJobSuccess) || ContactsPresentPipe.contactIsPresent(contacts.notifiedOnJobDeploy) || ContactsPresentPipe.contactIsPresent(contacts.notifiedOnJobFailureUserError) || ContactsPresentPipe.contactIsPresent(contacts.notifiedOnJobFailurePlatformError))); } // eslint-disable-next-line @typescript-eslint/member-ordering static contactIsPresent(contacts) { return CollectionsUtil.isArray(contacts) && contacts.length > 0; } } ContactsPresentPipe.ɵfac = function ContactsPresentPipe_Factory(t) { return new (t || ContactsPresentPipe)(); }; ContactsPresentPipe.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "contactsPresent", type: ContactsPresentPipe, pure: true }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ContactsPresentPipe, [{ type: Pipe, args: [{ name: 'contactsPresent' }] }], null, null); })(); /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ class ExecutionSuccessRatePipe { /** * ** Constructor. */ constructor(localeId) { this.localeId = localeId; this._percentPipe = new PercentPipe(localeId); } /** * @inheritDoc */ transform(deployments) { let result = ''; if (CollectionsUtil.isArrayEmpty(deployments)) { return result; } const firstDeployment = deployments[0]; const allExecutions = firstDeployment.successfulExecutions + firstDeployment.failedExecutions; if (allExecutions === 0) { return result; } result += this._percentPipe.transform(firstDeployment.successfulExecutions / allExecutions, '1.2-2'); if (firstDeployment.failedExecutions > 0) { result += ` (${firstDeployment.failedExecutions} failed)`; } return result; } } ExecutionSuccessRatePipe.ɵfac = function ExecutionSuccessRatePipe_Factory(t) { return new (t || ExecutionSuccessRatePipe)(i0.ɵɵdirectiveInject(LOCALE_ID, 16)); }; ExecutionSuccessRatePipe.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "executionSuccessRate", type: ExecutionSuccessRatePipe, pure: true }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ExecutionSuccessRatePipe, [{ type: Pipe, args: [{ name: 'executionSuccessRate' }] }], function () { return [{ type: undefined, decorators: [{ type: Inject, args: [LOCALE_ID] }] }]; }, null); })(); /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ const MISSING_DEFAULT_TEAM_MESSAGE = 'The defaultOwnerTeamName property need to be set for the DATA_PIPELINES_CONFIGS'; const RESERVED_DEFAULT_TEAM_NAME_MESSAGE = `The 'default' value is reserved, and can not be used for defaultOwnerTeamName property`; /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /** * ** Injection Token for Data pipelines config. */ const DATA_PIPELINES_CONFIGS = new InjectionToken('DataPipelinesConfig'); /** * ** DateTime format pattern provided to Angular DateTime directives/pipes, etc... */ const DATA_PIPELINES_DATE_TIME_FORMAT = 'MMM d, y, hh:mm:ss a'; /** * ** Team name constant used as key identifier in {@link ComponentState.requestParams}. */ const TEAM_NAME_REQ_PARAM = 'team-name-req-param'; /** * ** Data Job name constant used as key identifier in {@link ComponentState.requestParams}. */ const JOB_NAME_REQ_PARAM = 'job-name-req-param'; /** * ** Data Job deployment ID constant used as key identifier in {@link ComponentState.requestParams}. */ const JOB_DEPLOYMENT_ID_REQ_PARAM = 'job-deployment-id-req-param'; /** * ** Data Job status constant used as key identifier in {@link ComponentState.requestParams}. */ const JOB_STATUS_REQ_PARAM = 'job-status-req-param'; /** * ** Filter constant used as key identifier in {@link ComponentState.requestParams}. */ const FILTER_REQ_PARAM = 'filter-req-param'; /** * ** Order constant used as key identifier in {@link ComponentState.requestParams}. */ const ORDER_REQ_PARAM = 'order-req-param'; /** * ** Data Job details constant used as key identifier in {@link ComponentState.requestParams}. */ const JOB_DETAILS_REQ_PARAM = 'job-details-req-param'; /** * ** Data Job state constant used as key identifier in {@link ComponentState.requestParams}. */ const JOB_STATE_REQ_PARAM = 'job-state-req-param'; /** * ** Data Job state constant used as key identifier in {@link ComponentState.data} */ const JOB_STATE_DATA_KEY = 'job-state-data-key'; /** * ** Data Jobs states constant used as key identifier in {@link ComponentState.data} */ const JOBS_DATA_KEY = 'jobs-data-key'; /** * ** Data Job details constant used as key identifier in {@link ComponentState.data} */ const JOB_DETAILS_DATA_KEY = 'job-details-data-key'; /** * ** Data Job Executions constant used as key identifier in {@link ComponentState.data} */ const JOB_EXECUTIONS_DATA_KEY = 'job-executions-data-key'; /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ var DataJobDeploymentStatus; (function (DataJobDeploymentStatus) { DataJobDeploymentStatus["NONE"] = "NONE"; DataJobDeploymentStatus["SUCCESS"] = "SUCCESS"; DataJobDeploymentStatus["PLATFORM_ERROR"] = "PLATFORM_ERROR"; DataJobDeploymentStatus["USER_ERROR"] = "USER_ERROR"; })(DataJobDeploymentStatus || (DataJobDeploymentStatus = {})); var DataJobExecutionType; (function (DataJobExecutionType) { DataJobExecutionType["MANUAL"] = "MANUAL"; DataJobExecutionType["SCHEDULED"] = "SCHEDULED"; })(DataJobExecutionType || (DataJobExecutionType = {})); /** * ** Execution Status. */ var DataJobExecutionStatus; (function (DataJobExecutionStatus) { DataJobExecutionStatus["SUBMITTED"] = "SUBMITTED"; DataJobExecutionStatus["RUNNING"] = "RUNNING"; DataJobExecutionStatus["FINISHED"] = "FINISHED"; DataJobExecutionStatus["SUCCEEDED"] = "SUCCEEDED"; DataJobExecutionStatus["CANCELLED"] = "CANCELLED"; DataJobExecutionStatus["SKIPPED"] = "SKIPPED"; DataJobExecutionStatus["FAILED"] = "FAILED"; DataJobExecutionStatus["USER_ERROR"] = "USER_ERROR"; DataJobExecutionStatus["PLATFORM_ERROR"] = "PLATFORM_ERROR"; })(DataJobExecutionStatus || (DataJobExecutionStatus = {})); /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ var DataJobStatus; (function (DataJobStatus) { DataJobStatus["ENABLED"] = "Enabled"; DataJobStatus["DISABLED"] = "Disabled"; DataJobStatus["NOT_DEPLOYED"] = "Not Deployed"; })(DataJobStatus || (DataJobStatus = {})); /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /** * ** Execution status. * * @deprecated */ // eslint-disable-next-line no-shadow var DataJobExecutionStatusDeprecated; (function (DataJobExecutionStatusDeprecated) { DataJobExecutionStatusDeprecated["SUBMITTED"] = "submitted"; DataJobExecutionStatusDeprecated["RUNNING"] = "running"; DataJobExecutionStatusDeprecated["FINISHED"] = "finished"; DataJobExecutionStatusDeprecated["SUCCEEDED"] = "succeeded"; DataJobExecutionStatusDeprecated["CANCELLED"] = "cancelled"; DataJobExecutionStatusDeprecated["SKIPPED"] = "skipped"; DataJobExecutionStatusDeprecated["FAILED"] = "failed"; DataJobExecutionStatusDeprecated["USER_ERROR"] = "user_error"; DataJobExecutionStatusDeprecated["PLATFORM_ERROR"] = "platform_error"; })(DataJobExecutionStatusDeprecated || (DataJobExecutionStatusDeprecated = {})); /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ var DisplayMode; (function (DisplayMode) { /* eslint-disable-next-line @typescript-eslint/naming-convention */ DisplayMode["COMPACT"] = "compact"; /* eslint-disable-next-line @typescript-eslint/naming-convention */ DisplayMode["STANDARD"] = "standard"; })(DisplayMode || (DisplayMode = {})); /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ class ToastDefinitions { static successfullyRanJob(jobName) { return { type: VmwToastType.INFO, title: `Data job Queued for execution`, description: `Data job "${jobName}" successfully queued for execution.` }; } } /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ class ExtractJobStatusPipe { /** * ** Extract Job Status from Details. * * - This method should be equal to instance method. * - Methods: {@link ExtractJobStatusPipe.transform} */ static transform(jobDeployments) { if (!jobDeployments?.length) { return DataJobStatus.NOT_DEPLOYED; } if (jobDeployments[jobDeployments.length - 1].enabled) { return DataJobStatus.ENABLED; } return DataJobStatus.DISABLED; } /** * @inheritDoc * * - This method should be equal to instance method. * - Methods: {@link ExtractJobStatusPipe.transform} */ transform(jobDeployments) { return ExtractJobStatusPipe.transform(jobDeployments); } } ExtractJobStatusPipe.ɵfac = function ExtractJobStatusPipe_Factory(t) { return new (t || ExtractJobStatusPipe)(); }; ExtractJobStatusPipe.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "extractJobStatus", type: ExtractJobStatusPipe, pure: false }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ExtractJobStatusPipe, [{ type: Pipe, args: [{ name: 'extractJobStatus', pure: false }] }], null, null); })(); /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /** * Format Delta Pipe formats the delta of the execution start and end Time. * The format is dynamic and contains generaly the last two leading fragment of the duration. * * For example: * * 1: If the duration is less than 1 min, the format is `${seconds}s` * * 2: If the duration is between 1 min and 59 mins, the format is `${minutes}m ${seconds}s` * * 3: If the duration is between 1 hour and 1 day, the format is `${hours}h ${minutes}m` * * 4: If the duration is more than 1 day, the format is `${days}d ${hours}h` */ class FormatDeltaPipe { static formatDelta(delta) { if (delta < 0) { return 'N/A'; } else if (delta < 60) { return `${Math.ceil(delta)}s`; } else if (delta < 3600) { const minute = Math.floor((delta / 60) % 60); const seconds = Math.floor(delta % 60); return `${minute}m ${seconds}s`; } else if (delta < 86400) { const hours = Math.floor((delta / (60 * 60)) % 24); const minutes = Math.floor((delta / 60) % 60); return `${hours}h ${minutes}m`; } else { const days = Math.floor(delta / (60 * 60 * 24)); const hours = Math.floor((delta / (60 * 60)) % 24); return `${days}d ${hours}h`; } } /** * @inheritDoc */ transform(execution) { if (CollectionsUtil.isNil(execution.startTime)) { return ''; } const delta = (FormatDeltaPipe._getEndTime(execution) - FormatDeltaPipe._getStartTime(execution)) / 1000; return FormatDeltaPipe.formatDelta(delta); } // eslint-disable-next-line @typescript-eslint/member-ordering static _getStartTime(execution) { if (CollectionsUtil.isDefined(execution.startTime)) { return new Date(execution.startTime).getTime(); } return Date.now(); } // eslint-disable-next-line @typescript-eslint/member-ordering static _getEndTime(execution) { if (CollectionsUtil.isDefined(execution.endTime)) { return new Date(execution.endTime).getTime(); } return Date.now(); } } FormatDeltaPipe.ɵfac = function FormatDeltaPipe_Factory(t) { return new (t || FormatDeltaPipe)(); }; FormatDeltaPipe.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "formatDelta", type: FormatDeltaPipe, pure: true }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FormatDeltaPipe, [{ type: Pipe, args: [{ name: 'formatDelta' }] }], null, null); })(); /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ class FormatSchedulePipe { static _fallbackTransformNonStandardCron(cron) { const match = `${cron}`.trim().match(/^@hourly|@daily|@midnight|@weekly|@monthly|@yearly|@annually$/); if (CollectionsUtil.isNil(match)) { throw new Error('Cron expression cannot be null or undefined.'); } switch (match.input) { case '@hourly': return 'Run once an hour at the beginning of the hour'; case '@daily': case '@midnight': return 'Run once a day at midnight'; case '@weekly': return 'Run once a week at midnight on Sunday morning'; case '@monthly': return 'Run once a month at midnight of the first day of the month'; case '@yearly': case '@annually': return 'Run once a year at midnight of 1 January'; default: throw new Error('Cron expression is NOT nonstandard predefined scheduling definition.'); } } /** * @inheritDoc * * - Cron schedule default format from kubernetes https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/ * - Time in UTC */ transform(cronSchedule, defaultResult) { try { const defaultValue = defaultResult ?? ''; if (!cronSchedule) { return defaultValue; } //TODO : https://github.com/bradymholt/cRonstrue/issues/94 // cronstrue doesn't support timezones. Need to use another library return cronstrue.toString(cronSchedule, { monthStartIndexZero: false, dayOfWeekStartIndexZero: true }); } catch (e) { try { return FormatSchedulePipe._fallbackTransformNonStandardCron(cronSchedule); } catch (_e) { console.error(`Parsing error. Cron expression "${cronSchedule}"`); return `Invalid Cron expression "${cronSchedule}"`; } } } } FormatSchedulePipe.ɵfac = function FormatSchedulePipe_Factory(t) { return new (t || FormatSchedulePipe)(); }; FormatSchedulePipe.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "formatSchedule", type: FormatSchedulePipe, pure: true }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FormatSchedulePipe, [{ type: Pipe, args: [{ name: 'formatSchedule' }] }], null, null); })(); /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ class ParseEpochPipe { /** * ** Transform to Epoch time. * * - This method should be equal to instance method. * - Methods: {@link ParseEpochPipe.transform} */ static transform(nextRunEpochSeconds) { if (nextRunEpochSeconds < 0) { return null; } return new Date(nextRunEpochSeconds * 1000); } /** * @inheritDoc * * - This method should be equal to instance method. * - Methods: {@link ParseEpochPipe.transform} */ transform(nextRunEpochSeconds) { return ParseEpochPipe.transform(nextRunEpochSeconds); } } ParseEpochPipe.ɵfac = function ParseEpochPipe_Factory(t) { return new (t || ParseEpochPipe)(); }; ParseEpochPipe.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "parseEpoch", type: ParseEpochPipe, pure: true }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ParseEpochPipe, [{ type: Pipe, args: [{ name: 'parseEpoch' }] }], null, null); })(); /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ class ParseNextRunPipe { /** * @inheritDoc */ transform(cron, nextExecution) { if (!cron) { return null; } if (!nextExecution) { nextExecution = 1; } let result; try { const parsedDate = parser.parseExpression(cron, { utc: true }); for (let i = 0; i < nextExecution; i++) { result = parsedDate.next().toDate(); } } catch (e) { result = null; console.error('Error parsing next run', e); } return result; } } ParseNextRunPipe.ɵfac = function ParseNextRunPipe_Factory(t) { return new (t || ParseNextRunPipe)(); }; ParseNextRunPipe.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "parseNextRun", type: ParseNextRunPipe, pure: true }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ParseNextRunPipe, [{ type: Pipe, args: [{ name: 'parseNextRun' }] }], null, null); })(); /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ class ExtractContactsPipe { static transform(contacts) { if (Array.isArray(contacts) && contacts.length) { return contacts; } else { return []; } } transform(contacts) { return ExtractContactsPipe.transform(contacts); } } ExtractContactsPipe.ɵfac = function ExtractContactsPipe_Factory(t) { return new (t || ExtractContactsPipe)(); }; ExtractContactsPipe.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "extractContacts", type: ExtractContactsPipe, pure: true }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ExtractContactsPipe, [{ type: Pipe, args: [{ name: 'extractContacts' }] }], null, null); })(); /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ class DeleteModalOptions { constructor() { this.opened = false; this.title = 'Delete'; this.message = 'Are you sure you want to permanently delete this item?'; this.cancelBtn = 'Cancel'; this.showCancelBtn = true; this.okBtn = 'Delete'; this.showOkBtn = true; this.showCloseX = true; } } class EditModalOptions { constructor() { this.opened = false; this.title = 'Edit'; this.message = ''; this.cancelBtn = 'Cancel'; this.showCancelBtn = true; this.okBtn = 'Edit'; this.showOkBtn = true; this.showCloseX = true; } } class ConfirmationModalOptions { constructor() { this.opened = false; this.title = 'Confirm'; this.message = 'Are you sure?'; this.cancelBtn = 'Cancel'; this.showCancelBtn = true; this.okBtn = 'Confirm'; this.showOkBtn = true; this.showCloseX = true; } } /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ class ModalComponentDirective extends TaurusObject { constructor() { super(); this.optionsChange = new EventEmitter(); this.cancelAction = new EventEmitter(); } confirm() { this.close(); } /** * close the modal */ close() { if (!this._isNull(this.options)) { this.options.opened = false; this.optionsChange.emit(this.options); } } cancel() { this.cancelAction.emit(); this.close(); } _isNull(value) { return value === null || value === undefined; } } ModalComponentDirective.ɵfac = function ModalComponentDirective_Factory(t) { return new (t || ModalComponentDirective)(); }; ModalComponentDirective.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: ModalComponentDirective, inputs: { options: "options" }, outputs: { optionsChange: "optionsChange", cancelAction: "cancelAction" }, features: [i0.ɵɵInheritDefinitionFeature] }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ModalComponentDirective, [{ type: Directive }], function () { return []; }, { options: [{ type: Input }], optionsChange: [{ type: Output }], cancelAction: [{ type: Output }] }); })(); /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ function ConfirmationDialogModalComponent_clr_modal_0_clr_alert_5_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "clr-alert", 9)(1, "clr-alert-item"); i0.ɵɵelement(2, "span", 10); i0.ɵɵelementEnd()(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵproperty("clrAlertType", "info")("clrAlertClosable", false); i0.ɵɵadvance(2); i0.ɵɵproperty("innerHTML", ctx_r1.options.infoText, i0.ɵɵsanitizeHtml); } } function ConfirmationDialogModalComponent_clr_modal_0_button_7_Template(rf, ctx) { if (rf & 1) { const _r5 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "button", 11); i0.ɵɵlistener("click", function ConfirmationDialogModalComponent_clr_modal_0_button_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r4 = i0.ɵɵnextContext(2); return ctx_r4.cancel(); }); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate1(" ", ctx_r2.options.cancelBtn, " "); } } function ConfirmationDialogModalComponent_clr_modal_0_button_8_Template(rf, ctx) { if (rf & 1) { const _r7 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "button", 12); i0.ɵɵlistener("click", function ConfirmationDialogModalComponent_clr_modal_0_button_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r6 = i0.ɵɵnextContext(2); return ctx_r6.confirm(); }); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r3 = i0.ɵɵnextContext(2); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate1(" ", ctx_r3.options.okBtn, " "); } } function ConfirmationDialogModalComponent_clr_modal_0_Template(rf, ctx) { if (rf & 1) { const _r9 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "clr-modal", 1); i0.ɵɵlistener("clrModalOpenChange", function ConfirmationDialogModalComponent_clr_modal_0_Template_clr_modal_clrModalOpenChange_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r8 = i0.ɵɵnextContext(); return ctx_r8.options.opened = $event; })("keyup.enter", function ConfirmationDialogModalComponent_clr_modal_0_Template_clr_modal_keyup_enter_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r10 = i0.ɵɵnextContext(); return ctx_r10.confirm(); }); i0.ɵɵelementStart(1, "h3", 2); i0.ɵɵtext(2); i0.ɵɵelementEnd(); i0.ɵɵelementStart(3, "div", 3); i0.ɵɵelement(4, "p", 4); i0.ɵɵtemplate(5, ConfirmationDialogModalComponent_clr_modal_0_clr_alert_5_Template, 3, 3, "clr-alert", 5); i0.ɵɵelementEnd(); i0.ɵɵelementStart(6, "div", 6); i0.ɵɵtemplate(7, ConfirmationDialogModalComponent_clr_modal_0_button_7_Template, 2, 1, "button", 7); i0.ɵɵtemplate(8, ConfirmationDialogModalComponent_clr_modal_0_button_8_Template, 2, 1, "button", 8); i0.ɵɵelementEnd()(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵproperty("clrModalOpen", ctx_r0.options.opened)("clrModalClosable", ctx_r0.options.showCloseX); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(ctx_r0.options.title); i0.ɵɵadvance(2); i0.ɵɵproperty("innerHTML", ctx_r0.options.message, i0.ɵɵsanitizeHtml); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r0.options.infoText); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", ctx_r0.options.showCancelBtn); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r0.options.showOkBtn); } } class ConfirmationDialogModalComponent extends ModalComponentDirective { constructor() { super(); this.changeStatus = new EventEmitter(); this.options = new ConfirmationModalOptions(); } confirm() { super.confirm(); this.changeStatus.emit(); } } ConfirmationDialogModalComponent.ɵfac = function ConfirmationDialogModalComponent_Factory(t) { return new (t || ConfirmationDialogModalComponent)(); }; ConfirmationDialogModalComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ConfirmationDialogModalComponent, selectors: [["lib-confirmation-dialog-modal"]], inputs: { confirmationInput: "confirmationInput" }, outputs: { changeStatus: "changeStatus" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [["class", "schema-confirm-to-prod", 3, "clrModalOpen", "clrModalClosable", "clrModalOpenChange", "keyup.enter", 4, "ngIf"], [1, "schema-confirm-to-prod", 3, "clrModalOpen", "clrModalClosable", "clrModalOpenChange", "keyup.enter"], [1, "modal-title"], [1, "modal-body"], [3, "innerHTML"], [3, "clrAlertType", "clrAlertClosable", 4, "ngIf"], [1, "modal-footer"], ["data-cy", "confirmation-dialog-cancel", "type", "button", "class", "btn btn-outline", 3, "click", 4, "ngIf"], ["data-cy", "confirmation-dialog-ok-btn", "type", "button", "class", "btn btn-primary", 3, "click", 4, "ngIf"], [3, "clrAlertType", "clrAlertClosable"], [1, "alert-text", 3, "innerHTML"], ["data-cy", "confirmation-dialog-cancel", "type", "button", 1, "btn", "btn-outline", 3, "click"], ["data-cy", "confirmation-dialog-ok-btn", "type", "button", 1, "btn", "btn-primary", 3, "click"]], template: function ConfirmationDialogModalComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, ConfirmationDialogModalComponent_clr_modal_0_Template, 9, 7, "clr-modal", 0); } if (rf & 2) { i0.ɵɵproperty("ngIf", ctx.options.opened); } }, directives: [i4.NgIf, i6.ClrModal, i6.ClrModalBody, i6.ClrAlert, i6.ClrAlertItem, i6.ClrAlertText], styles: [".schema-confirm-to-prod[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%]{margin-bottom:.5rem}.schema-confirm-to-prod[_ngcontent-%COMP%] .signpostBtn[_ngcontent-%COMP%]{height:0rem}.schema-confirm-to-prod[_ngcontent-%COMP%] .signpostBtn[_ngcontent-%COMP%] .btn-info[_ngcontent-%COMP%]{margin-top:-.65rem;border:0;height:1.2rem}"] }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConfirmationDialogModalComponent, [{ type: Component, args: [{ selector: 'lib-confirmation-dialog-modal', template: "<!--\n ~ Copyright 2023-2025 Broadcom\n ~ SPDX-License-Identifier: Apache-2.0\n -->\n\n<clr-modal\n *ngIf=\"options.opened\"\n class=\"schema-confirm-to-prod\"\n [(clrModalOpen)]=\"options.opened\"\n [clrModalClosable]=\"options.showCloseX\"\n (keyup.enter)=\"confirm()\"\n>\n <h3 class=\"modal-title\">{{ options.title }}</h3>\n <div class=\"modal-body\">\n <p [innerHTML]=\"options.message\"></p>\n <clr-alert\n *ngIf=\"options.infoText\"\n [clrAlertType]=\"'info'\"\n [clrAlertClosable]=\"false\"\n >\n <clr-alert-item>\n <span class=\"alert-text\" [innerHTML]=\"options.infoText\"> </span>\n </clr-alert-item>\n </clr-alert>\n </div>\n <div class=\"modal-footer\">\n <button\n data-cy=\"confirmation-dialog-cancel\"\n *ngIf=\"options.showCancelBtn\"\n type=\"button\"\n class=\"btn btn-outline\"\n (click)=\"cancel()\"\n >\n {{ options.cancelBtn }}\n </button>\n <button\n data-cy=\"confirmation-dialog-ok-btn\"\n *ngIf=\"options.showOkBtn\"\n type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"confirm()\"\n >\n {{ options.okBtn }}\n </button>\n </div>\n</clr-modal>\n", styles: ["/*!\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */.schema-confirm-to-prod .modal-title{margin-bottom:.5rem}.schema-confirm-to-prod .signpostBtn{height:0rem}.schema-confirm-to-prod .signpostBtn .btn-info{margin-top:-.65rem;border:0;height:1.2rem}\n"] }] }], function () { return []; }, { confirmationInput: [{ type: Input }], changeStatus: [{ type: Output }] }); })(); /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ function DeleteModalComponent_clr_modal_0_clr_alert_5_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "clr-alert", 9)(1, "clr-alert-item"); i0.ɵɵelement(2, "span", 10); i0.ɵɵelementEnd()(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵproperty("clrAlertType", "warning")("clrAlertClosable", false); i0.ɵɵadvance(2); i0.ɵɵproperty("innerHTML", ctx_r1.options.infoText, i0.ɵɵsanitizeHtml); } } function DeleteModalComponent_clr_modal_0_button_7_Template(rf, ctx) { if (rf & 1) { const _r5 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "button", 11); i0.ɵɵlistener("click", function DeleteModalComponent_clr_modal_0_button_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r4 = i0.ɵɵnextContext(2); return ctx_r4.close(); }); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate1(" ", ctx_r2.options.cancelBtn, " "); } } function DeleteModalComponent_clr_modal_0_button_8_Template(rf, ctx) { if (rf & 1) { const _r7 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "button", 12); i0.ɵɵlistener("click", function DeleteModalComponent_clr_modal_0_button_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r6 = i0.ɵɵnextContext(2); return ctx_r6.confirm(); }); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r3 = i0.ɵɵnextContext(2); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate1(" ", ctx_r3.options.okBtn, " "); } } function DeleteModalComponent_clr_modal_0_Template(rf, ctx) { if (rf & 1) { const _r9 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "clr-modal", 1); i0.ɵɵlistener("clrModalOpenChange", function DeleteModalComponent_clr_modal_0_Template_clr_modal_clrModalOpenChange_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r8 = i0.ɵɵnextContext(); return ctx_r8.options.opened = $event; }); i0.ɵɵelementStart(1, "h3", 2); i0.ɵɵtext(2); i0.ɵɵelementEnd(); i0.ɵɵelementStart(3, "div", 3); i0.ɵɵelement(4, "p", 4); i0.ɵɵtemplate(5, DeleteModalComponent_clr_modal_0_clr_alert_5_Template, 3, 3, "clr-alert", 5); i0.ɵɵelementEnd(); i0.ɵɵelementStart(6, "div", 6); i0.ɵɵtemplate(7, DeleteModalComponent_clr_modal_0_button_7_Template, 2, 1, "button", 7); i0.ɵɵtemplate(8, DeleteModalComponent_clr_modal_0_button_8_Template, 2, 1, "button", 8); i0.ɵɵelementEnd()(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵproperty("clrModalOpen", ctx_r0.options.opened)("clrModalClosable", ctx_r0.options.showCloseX); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(ctx_r0.options.title); i0.ɵɵadvance(2); i0.ɵɵproperty("innerHTML", ctx_r0.options.message, i0.ɵɵsanitizeHtml); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r0.options.infoText); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", ctx_r0.options.showCancelBtn); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r0.options.showOkBtn); } } class DeleteModalComponent extends ModalComponentDirective { constructor() { super(); this.delete = new EventEmitter(); this.options = new DeleteModalOptions(); } /** * emit that the user confirmed that it want to delete the item * and close the modal */ confirm() { super.confirm(); this.delete.emit(); } } DeleteModalComponent.ɵfac = function DeleteModalComponent_Factory(t) { return new (t || DeleteModalComponent)(); }; DeleteModalComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DeleteModalComponent, selectors: [["lib-delete-modal"]], outputs: { delete: "delete" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [["id", "delete-modal", 3, "clrModalOpen", "clrModalClosable", "clrModalOpenChange", 4, "ngIf"], ["id", "delete-modal", 3, "clrModalOpen", "clrModalClosable", "clrModalOpenChange"], ["id", "delete-modal-title", 1, "modal-title"], [1, "modal-body"], [3, "innerHTML"], [3, "clrAlertType", "clrAlertClosable", 4, "ngIf"], [1, "modal-footer"], ["id", "cancelBtn", "type", "button", "class", "btn btn-outline", 3, "click", 4, "ngIf"], ["id", "removeBtn", "type", "button", "class", "btn btn-danger", 3, "click", 4, "ngIf"], [3, "clrAlertType", "clrAlertClosable"], [1, "alert-text", 3, "innerHTML"], ["id", "cancelBtn", "type", "button", 1, "btn", "btn-outline", 3, "click"], ["id", "removeBtn", "type", "button", 1, "btn", "btn-danger", 3, "click"]], template: function DeleteModalComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, DeleteModalComponent_clr_modal_0_Template, 9, 7, "clr-modal", 0); } if (rf & 2) { i0.ɵɵproperty("ngIf", ctx.options.opened); } }, directives: [i4.NgIf, i6.ClrModal, i6.ClrModalBody, i6.ClrAlert, i6.ClrAlertItem, i6.ClrAlertText], styles: [""] }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DeleteModalComponent, [{ type: Component, args: [{ selector: 'lib-delete-modal', template: "<!--\n ~ Copyright 2023-2025 Broadcom\n ~ SPDX-License-Identifier: Apache-2.0\n -->\n\n<clr-modal\n *ngIf=\"options.opened\"\n id=\"delete-modal\"\n [(clrModalOpen)]=\"options.opened\"\n [clrModalClosable]=\"options.showCloseX\"\n>\n <h3 id=\"delete-modal-title\" class=\"modal-title\">{{ options.title }}</h3>\n\n <div class=\"modal-body\">\n <p [innerHTML]=\"options.message\"></p>\n\n <clr-alert\n *ngIf=\"options.infoText\"\n [clrAlertType]=\"'warning'\"\n [clrAlertClosable]=\"false\"\n >\n <clr-alert-item>\n <span class=\"alert-text\" [innerHTML]=\"options.infoText\"> </span>\n </clr-alert-item>\n </clr-alert>\n </div>\n\n <div class=\"modal-footer\">\n <button\n id=\"cancelBtn\"\n *ngIf=\"options.showCancelBtn\"\n type=\"button\"\n class=\"btn btn-outline\"\n (click)=\"close()\"\n >\n {{ options.cancelBtn }}\n </button>\n <button\n id=\"removeBtn\"\n *ngIf=\"options.showOkBtn\"\n type=\"button\"\n class=\"btn btn-danger\"\n (click)=\"confirm()\"\n >\n {{ options.okBtn }}\n </button>\n </div>\n</clr-modal>\n", styles: [""] }] }], function () { return []; }, { delete: [{ type: Output }] }); })(); /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ function ExecutionsTimelineComponent_li_1_div_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "div", 21); i0.ɵɵpipe(1, "date"); } if (rf & 2) { const execution_r2 = i0.ɵɵnextContext().$implicit; i0.ɵɵproperty("date", execution_r2.startTime)("live", true); i0.ɵɵattribute("title", "Started " + i0.ɵɵpipeBind3(1, 3, execution_r2.startTime, "MMM d, y, hh:mm a", "UTC") + " UTC"); } } function ExecutionsTimelineComponent_li_1_clr_icon_2_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "clr-icon", 22); } } function ExecutionsTimelineComponent_li_1_clr_spinner_3_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "clr-spinner", 23); i0.ɵɵtext(1, "Executing... "); i0.ɵɵelementEnd(); } } function ExecutionsTimelineComponent_li_1_clr_icon_4_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "clr-icon", 24); } } function ExecutionsTimelineComponent_li_1_clr_icon_5_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "clr-icon", 25); } } function ExecutionsTimelineComponent_li_1_clr_icon_6_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "clr-icon", 26); } } function ExecutionsTimelineComponent_li_1_clr_icon_7_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "clr-icon", 27); } } function ExecutionsTimelineComponent_li_1_clr_icon_8_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "clr-icon", 28); } } function ExecutionsTimelineComponent_li_1_clr_icon_9_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "clr-icon", 29); } } function ExecutionsTimelineComponent_li_1_span_16_span_1_Template(rf, ctx) { if (rf & 1) { const _r20 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "span"); i0.ɵɵtext(1); i0.ɵɵelementStart(2, "button", 30); i0.ɵɵlistener("click", function ExecutionsTimelineComponent_li_1_span_16_span_1_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r20); const i_r3 = i0.ɵɵnextContext(2).index; const ctx_r19 = i0.ɵɵnextContext(); return (ctx_r19.showExecutionFullMessage[i_r3] = false); }); i0.ɵɵtext(3, " show less "); i0.ɵɵelementEnd()(); } if (rf & 2) { const execution_r2 = i0.ɵɵnextContext(2).$implicit; i0.ɵɵadvance(1); i0.ɵɵtextInterpolate1("", execution_r2.message, " "); } } function ExecutionsTimelineComponent_li_1_span_16_span_2_button_3_Template(rf, ctx) { if (rf & 1) { const _r25 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "button", 30); i0.ɵɵlistener("click", function ExecutionsTimelineComponent_li_1_span_16_span_2_button_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r25); const i_r3 = i0.ɵɵnextContext(3).index; const ctx_r24 = i0.ɵɵnextContext(); return (ctx_r24.showExecutionFullMessage[i_r3] = true); }); i0.ɵɵtext(1, " show more "); i0.ɵɵelementEnd(); } } function ExecutionsTimelineComponent_li_1_span_16_span_2_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "span"); i0.ɵɵtext(1); i0.ɵɵpipe(2, "words"); i0.ɵɵtemplate(3, ExecutionsTimelineComponent_li_1_span_16_span_2_button_3_Template, 2, 0, "button", 31); i0.ɵɵelementEnd(); } if (rf & 2) { const execution_r2 = i0.ɵɵnextContext(2).$implicit; const ctx_r18 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(2, 2, execution_r2.message, ctx_r18.messageWordsBeforeTruncate), " "); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", (execution_r2.message == null ? null : execution_r2.message.split(" ").length) > ctx_r18.messageWordsBeforeTruncate); } } function ExecutionsTimelineComponent_li_1_span_16_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "span"); i0.ɵɵtemplate(1, ExecutionsTimelineComponent_li_1_span_16_span_1_Template, 4, 1, "span", 17); i0.ɵɵtemplate(2, ExecutionsTimelineComponent_li_1_span_16_span_2_Template, 4, 5, "span", 17); i0.ɵɵelement(3, "br"); i0.ɵɵelementEnd(); } if (rf & 2) { const i_r3 = i0.ɵɵnextContext().index; const ctx_r13 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r13.showExecutionFullMessage[i_r3]); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", !ctx_r13.showExecutionFullMessage[i_r3]); } } function ExecutionsTimelineComponent_li_1_div_23_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 16)(1, "a", 32); i0.ɵɵelement(2, "clr-icon", 33); i0.ɵɵelementStart(3, "span"); i0.ɵɵtext(4, " Logs"); i0.ɵɵelementEnd()()(); } if (rf & 2) { const execution_r2 = i0.ɵɵnextContext().$implicit; i0.ɵɵadvance(1); i0.ɵɵattribute("href", execution_r2.logsUrl, i0.ɵɵsanitizeUrl); } } function ExecutionsTimelineComponent_li_1_span_24_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "span", 34); i0.ɵɵtext(1, "Manual"); i0.ɵɵelementEnd(); } if (rf & 2) { const execution_r2 = i0.ɵɵnextContext().$implicit; const ctx_r15 = i0.ɵɵnextContext(); i0.ɵɵpropertyInterpolate1("title", "'", ctx_r15.getManualExecutedByTitle(execution_r2), "'"); } } function ExecutionsTimelineComponent_li_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "li", 3); i0.ɵɵtemplate(1, ExecutionsTimelineComponent_li_1_div_1_Template, 2, 7, "div", 4); i0.ɵɵtemplate(2, ExecutionsTimelineComponent_li_1_clr_icon_2_Template, 1, 0, "clr-icon", 5); i0.ɵɵtemplate(3, ExecutionsTimelineComponent_li_1_clr_spinner_3_Template, 2, 0, "clr-spinner", 6); i0.ɵɵtemplate(4, ExecutionsTimelineComponent_li_1_clr_icon_4_Template, 1, 0, "clr-icon", 7); i0.ɵɵtemplate(5, ExecutionsTimelineComponent_li_1_clr_icon_5_Template, 1, 0, "clr-icon", 8); i0.ɵɵtemplate(6, ExecutionsTimelineComponent_li_1_clr_icon_6_Template, 1, 0, "clr-icon", 9); i0.ɵɵtemplate(7, ExecutionsTimelineComponent_li_1_clr_icon_7_Template, 1, 0, "clr-icon", 10); i0.ɵɵtemplate(8, ExecutionsTimelineComponent_li_1_clr_icon_8_Template, 1, 0, "clr-icon", 11); i0.ɵɵtemplate(9, ExecutionsTimelineComponent_li_1_clr_icon_9_Template, 1, 0, "clr-icon", 12); i0.ɵɵelementStart(10, "div", 13)(11, "span", 14); i0.ɵɵtext(12); i0.ɵɵpipe(13, "titlecase"); i0.ɵɵelementEnd(); i0.ɵɵelementStart(14, "div", 15)(15, "div", 16); i0.ɵɵtemplate(16, ExecutionsTimelineComponent_li_1_span_16_Template, 4, 2, "span", 17); i0.ɵɵelementStart(17, "span"); i0.ɵɵtext(18, "Duration: "); i0.ɵɵelementEnd(); i0.ɵɵelementStart(19, "span", 18); i0.ɵɵpipe(20, "date"); i0.ɵɵtext(21); i0.ɵɵpipe(22, "formatDelta"); i0.ɵɵelementEnd()(); i0.ɵɵtemplate(23, ExecutionsTimelineComponent_li_1_div_23_Template, 5, 1, "div", 19); i0.ɵɵtemplate(24, ExecutionsTimelineComponent_li_1_span_24_Template, 2, 1, "span", 20); i0.ɵɵelementEnd()()(); } if (rf & 2) { const execution_r2 = ctx.$implicit; const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵattribute("data-cy", execution_r2.id); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", execution_r2.startTime); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", execution_r2.status === ctx_r0.dataJobExecutionStatus.SUBMITTED); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", execution_r2.status === ctx_r0.dataJobExecutionStatus.RUNNING); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", execution_r2.status === ctx_r0.dataJobExecutionStatus.FINISHED || execution_r2.status === ctx_r0.dataJobExecutionStatus.SUCCEEDED); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", execution_r2.status === ctx_r0.dataJobExecutionStatus.CANCELLED); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", execution_r2.status === ctx_r0.dataJobExecutionStatus.SKIPPED); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", execution_r2.status === ctx_r0.dataJobExecutionStatus.FAILED); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", execution_r2.status === ctx_r0.dataJobExecutionStatus.USER_ERROR); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", execution_r2.status === ctx_r0.dataJobExecutionStatus.PLATFORM_ERROR); i0.ɵɵadvance(3); i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(13, 16, execution_